Sure. This is my fav page (quick 'n dirty) :
/*
This is an example configuration file.
COPY OR RENAME THIS FILE TO config.js.
Make sure you use real IDs from your HA entities.
*/
var CONFIG = {
customTheme: null, // CUSTOM_THEMES.TRANSPARENT, CUSTOM_THEMES.MATERIAL, CUSTOM_THEMES.MOBILE, CUSTOM_THEMES.COMPACT, CUSTOM_THEMES.HOMEKIT, CUSTOM_THEMES.WINPHONE, CUSTOM_THEMES.WIN95
transition: TRANSITIONS.ANIMATED_GPU, //ANIMATED or SIMPLE (better perfomance)
entitySize: ENTITY_SIZES.NORMAL, //SMALL, BIG are available
tileSize: 150,
tileMargin: 6,
serverUrl: 'http://' + location.hostname + ':8123',
wsUrl: 'ws://' + location.hostname + ':8123/api/websocket',
authToken: null, // optional long-lived token (CAUTION: only if TileBoard is not exposed to the internet)
//googleApiKey: "XXXXXXXXXX", // Required if you are using Google Maps for device tracker
//mapboxToken: "XXXXXXXXXX", // Required if you are using Mapbox for device tracker
debug: false, // Prints entities and state change info to the console.
pingConnection: true, //ping connection to prevent silent disconnections
locale: 'el-gr', // locale for date and number formats - available locales: it, de, es, fr, pt, ru, nl, pl, en-gb, en-us (default). See readme on adding custom locales.
// next fields are optional
events: [],
timeFormat: 24,
menuPosition: MENU_POSITIONS.LEFT, // or BOTTOM
hideScrollbar: false, // horizontal scrollbar
groupsAlign: GROUP_ALIGNS.HORIZONTALLY, // HORIZONTALLY, VERTICALLY, GRID
onReady: function () {},
header: { // https://github.com/resoai/TileBoard/wiki/Header-configuration
styles: {
margin: '30px 130px 0',
fontSize: '22px',
color: 'rgba(68, 115, 158,.99)'
},
right: [
{
type: HEADER_ITEMS.CUSTOM_HTML,
html: 'Weather'
},
{
type: HEADER_ITEMS.WEATHER,
styles: {
margin: '0'
},
icon: '&weather.openweathermap.state',
state: '&weather.openweathermap.state',
icons: {
'clear-day': 'clear',
'clear-night': 'nt-clear',
'cloudy': 'cloudy',
'exceptional': 'unknown',
'fog': 'fog',
'hail': 'sleet',
'lightning': 'chancestorms',
'lightning-rainy': 'tstorms',
'partly-cloudy-day': 'partlycloudy',
'partly-cloudy-night': 'nt-partlycloudy',
'pouring': 'rain',
'snowy': 'snow',
'snowy-rainy': 'sleet',
'wind': 'unknown',
'windy': 'unknown',
'windy-variant': 'unknown'
},
states: {
'clear-night': 'Clear, night',
'cloudy': 'Cloudy',
'exceptional': 'Exceptional',
'fog': 'Fog',
'hail': 'Hail',
'lightning': 'Lightning',
'lightning-rainy': 'Lightning, rainy',
'partlycloudy': 'Partly cloudy',
'pouring': 'Pouring',
'rainy': 'Rainy',
'snowy': 'Snowy',
'snowy-rainy': 'Snowy, rainy',
'sunny': 'Sunny',
'windy': 'Windy',
'windy-variant': 'Windy'
},
fields: {
temperature: '&sensor.openweathermap_temperature.state',
temperatureUnit: '°C',
}
}
],
left: [
{
type: HEADER_ITEMS.DATETIME,
},
]
},
pages: [
{
title: 'Main page',
bg: 'images/bg111.jpg',
icon: 'mdi-heart', // home icon
groups: [
{
title: 'Sensors',
width: 2,
height: 3,
items: [
{
position: [0, 0],
//type: TYPES.SENSOR,
title: 'Home Average',
type: TYPES.GAUGE,
customStyles: {'background-color':'rgba(240, 240, 240, 0.3)', 'color':'rgba(68, 115, 158, 1)'},
id: 'sensor.average_home_temp',
unit: '°C', // override default entity unit
state: false, // hidding state
value: function(item, entity){
return entity.state;
},
settings: {
size: 120, // Defaults to 50% of either height or width, whichever is smaller
type: 'arch', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
min: 0, // Defaults to 0
max: 60, // Defaults to 100
cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
thick: 6, // Defaults to 6
label: '', // Defaults to undefined
append: '@attributes.unit_of_measurement', // Defaults to undefined
prepend: '', // Defaults to undefined
duration: 1000, // Defaults to 1500ms
thresholds: { 0: { color: 'blue'}, 17: { color: 'green' }, 24.0: { color: 'orange' }, 28.5: { color: '#df4c1e' } }, // Defaults to undefined
labelOnly: false, // Defaults to false
},
},
{
position: [1, 0],
title: 'Living Room',
type: TYPES.GAUGE,
customStyles: {'background-color':'rgba(240, 240, 240, 0.3)', 'color':'rgba(68, 115, 158, 1)'},
id: 'sensor.living_room_temp',
unit: '°C', // override default entity unit
state: false, // hidding state
value: function(item, entity){
return entity.state;
},
settings: {
size: 120, // Defaults to 50% of either height or width, whichever is smaller
type: 'arch', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
min: 0, // Defaults to 0
max: 60, // Defaults to 100
cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
thick: 6, // Defaults to 6
label: '', // Defaults to undefined
append: '@attributes.unit_of_measurement', // Defaults to undefined
prepend: '', // Defaults to undefined
duration: 1000, // Defaults to 1500ms
thresholds: { 0: { color: 'blue'}, 17: { color: 'green' }, 24.0: { color: 'orange' }, 28.5: { color: '#df4c1e' } }, // Defaults to undefined
labelOnly: false, // Defaults to false
},
},
{
position: [0, 1],
width: 1,
height: 1,
title: 'Fuel Tank',
//subtitle: 'Roof',
type: TYPES.GAUGE,
state: false, // hidding state
customStyles: {'background-color':'rgba(240, 240, 240, 0.3)', 'color':'rgba(68, 115, 158, 1)'},
id: 'sensor.fuel_tank', // Assign the sensor you want to display on the gauge
value: function(item, entity){
return entity.state;
},
settings: {
size: 120, // Defaults to 50% of either height or width, whichever is smaller
type: 'arch', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
min: 0, // Defaults to 0
max: 1000, // Defaults to 100
cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
thick: 6, // Defaults to 6
label: '', // Defaults to undefined
append: '@attributes.unit_of_measurement', // Defaults to undefined
prepend: '', // Defaults to undefined
duration: 1500, // Defaults to 1500ms
labelOnly: false, // Defaults to false
},
},
{
position: [1, 1],
width: 1,
height: 1,
title: 'Humidity',
//subtitle: 'Average',
type: TYPES.GAUGE,
customStyles: {'background-color':'rgba(240, 240, 240, 0.3)', 'color':'rgba(68, 115, 158, 1)'},
id: 'sensor.lywsd03mmc_hum', // Assign the sensor you want to display on the gauge
state: false, // hidding state
value: function(item, entity){
return entity.state;
},
settings: {
size: 120, // Defaults to 50% of either height or width, whichever is smaller
type: 'arch', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
min: 0, // Defaults to 0
max: 100, // Defaults to 100
cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
thick: 6, // Defaults to 6
label: '', // Defaults to undefined
append: '@attributes.unit_of_measurement', // Defaults to undefined
prepend: '', // Defaults to undefined
duration: 1500, // Defaults to 1500ms
labelOnly: false, // Defaults to false
},
},
{
position: [0, 2],
width: 2,
height: 1,
title: 'Solar Boiler',
subtitle: 'Roof',
type: TYPES.GAUGE,
customStyles: {'background-color':'rgba(240, 240, 240, 0.3)', 'color':'rgba(68, 115, 158, 1)'},
id: 'sensor.solar_boiler_temp', // Assign the sensor you want to display on the gauge
state: false, // hidding state
value: function(item, entity){
return entity.state;
},
settings: {
size: 170, // Defaults to 50% of either height or width, whichever is smaller
type: 'semi', // Options are: 'full', 'semi', and 'arch'. Defaults to 'full'
min: 0, // Defaults to 0
max: 100, // Defaults to 100
cap: 'round', // Options are: 'round', 'butt'. Defaults to 'butt'
thick: 6, // Defaults to 6
label: '', // Defaults to undefined
append: '@attributes.unit_of_measurement', // Defaults to undefined
prepend: '', // Defaults to undefined
duration: 1500, // Defaults to 1500ms
thresholds: { 0: { color: 'blue'}, 40: { color: 'orange' }, 65: { color: '#df4c1e' } }, // Defaults to undefined
labelOnly: false, // Defaults to false
fractionSize: 1, // Number of decimal places to round the number to. Defaults to current locale formatting
},
},
]
},
{
title: 'Lights',
width: 2,
height: 3,
// row: 0, // optional; index of the row used for the GRID layout. If not specified, the default is 0
items: [
{
position: [0, 0],
width: 1,
type: TYPES.SWITCH,
id: 'switch.livingroom_light1',
title: 'Lights 1',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-ceiling-light', 'on': 'mdi-ceiling-light'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [1, 0],
width: 1,
type: TYPES.SWITCH,
id: 'switch.entrance_light',
title: 'Entrance light',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-coach-lamp', 'on': 'mdi-coach-lamp'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [0, 1],
width: 1,
type: TYPES.SWITCH,
id: 'switch.livingroom_light2',
title: 'Lights 2',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-ceiling-light', 'on': 'mdi-ceiling-light'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [1, 1],
width: 1,
type: TYPES.SWITCH,
id: 'switch.wall_lamp',
title: 'Corridor',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-wall-sconce', 'on': 'mdi-wall-sconce'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [0, 2],
width: 1,
type: TYPES.SWITCH,
id: 'switch.livingroom_light3',
title: 'Lights 3',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-ceiling-light', 'on': 'mdi-ceiling-light'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [1, 2],
width: 1,
type: TYPES.SWITCH,
id: 'switch.tasmota_2',
title: 'Garden Lights',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-nature', 'on': 'mdi-nature'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
],
},
{
title: 'Control',
width: 3,
items: [
{
title: 'Thermostat',
position: [0, 0],
id: 'climate.lv_room',
type: TYPES.CLIMATE,
unit: '°C',
useHvacMode: true, // Optional: enables HVAC mode (by default uses PRESET mode)
state: function (item, entity) {
return 'Actual: ' + this.$scope.filterNumber(entity.attributes.current_temperature, 1) + ' °C';
},
states: {
//'auto': 'Automatic',
'heat': 'Heating',
'off': 'Off',
'idle': 'Idle'
},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'idle') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
if (entity.state == 'heat') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(223, 76, 30, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [1, 0],
type: TYPES.ALARM,
id: "alarm_control_panel.mqtt_alarm",
title: 'Home Alarm',
icons: {
arming: 'mdi-bell-outline',
disarmed: 'mdi-bell-off',
pending: 'mdi-bell',
armed_custom_bypass: 'mdi-bell-check',
armed_home: 'mdi-bell-plus',
armed_night: 'mdi-bell-sleep',
armed_away: 'mdi-bell',
triggered: 'mdi-bell-ring',
},
states: {
arming: 'Arming',
disarmed: 'Disarmed',
pending: 'Pending',
armed_custom_bypass: 'Armed custom bypass',
armed_home: 'Armed home',
armed_night: 'Armed night',
armed_away: 'Armed away',
triggered: 'Triggered',
},
customStyles: function(item, entity){
if (entity.state == 'disarmed') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 158, 115, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
// GARAGE DOOR AS PRESSED_BUTTON AND BINARY_SENSOR ENTITIES
{
position: [0, 1],
width: 2/3,
type: TYPES.CUSTOM,
title: 'Door',
subtitle: "Garage",
id: 'binary_sensor.garage_door_sensor',
states: {
on: 'OPEN',
off: 'CLOSED'
},
icons: {
'on': 'mdi-garage-open-variant',
'off': 'mdi-garage-variant'
},
action: function(item, entity) {
this.apiRequest({ type: 'call_service',
domain: 'switch',
service: 'toggle',
service_data: {
entity_id: 'switch.pressed_btn_garage_door'
}
});
},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 0.7)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
// GARAGE DOOR AS A COVER ENTITY
//{
//position: [0, 1],
//type: TYPES.CUSTOM,
//title: 'Garage Door',
//id: 'cover.garage_door',
//states: {
// open: 'OPEN',
// closed: 'CLOSED'
//},
//icons: {
// 'open': 'mdi-garage-open-variant',
// 'closed': 'mdi-garage-variant'
//},
//action: function(item, entity) {
// this.apiRequest({ type: 'call_service',
// domain: 'cover',
// service: 'toggle',
// service_data: {
// entity_id: 'cover.garage_door'
// }
// });
//},
//customStyles: function(item, entity){
// if (entity.state == 'closed') {
// a = 'rgba(240, 240, 240, 0.3)';
// b = 'rgba(68, 115, 158, 0.7)';
// }
// if (entity.state == 'open') {
// a = 'rgba(255, 255, 255, 0.4)';
// b = 'rgba(240, 190, 45, 1)';
// }
// return {
// //'backgroundColor':a, 'box-shadow': '1px 1px 0 rgba(54,47,36,.35),-1px -1px 0 hsla(0,0%,78.4%,.1)', 'color': b
// 'backgroundColor':a, 'color': b
// }
//},
//},
{
position: [2/3, 1],
width: 2/3,
type: TYPES.SWITCH,
id: 'switch.garage_ventilation',
title: 'Ventilation',
subtitle: 'Garage',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-fan', 'on': 'mdi-spin mdi-fan'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [4/3, 1],
width: 2/3,
type: TYPES.SWITCH,
id: 'switch.garage_external_electical_socket',
title: 'External Mains',
subtitle: 'Garage',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-power-socket-eu', 'on': 'mdi-power-socket-eu'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [0, 2],
width: 2/3,
type: TYPES.CUSTOM,
title: 'Hot Water',
id: 'switch.hotwater',
states: {
on: 'ON',
off: 'OFF'
},
icons: {
'on': 'mdi-hot-tub',
'off': 'mdi-hot-tub'
},
action: function(item, entity) {
this.apiRequest({ type: 'call_service',
domain: 'switch',
service: 'toggle',
service_data: {
entity_id: 'switch.hotwater'
}
});
},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 0.7)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [2/3, 2],
width: 2/3,
type: TYPES.SWITCH,
state: false,
id: 'switch.media_server',
title: 'Media Server',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-play-network-outline', 'on': 'mdi-play-network-outline'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
'backgroundColor':a, 'color': b
}
}
},
{
position: [4/3, 2],
width: 2/3,
type: TYPES.SWITCH,
id: 'switch.wifi',
title: 'WiFi',
states: { on: 'ON', off: 'OFF' },
icons: {'off': 'mdi-wifi', 'on': 'mdi-wifi'},
customStyles: function(item, entity){
if (entity.state == 'off') {
a = 'rgba(240, 240, 240, 0.3)';
b = 'rgba(68, 115, 158, 1)';
}
if (entity.state == 'on') {
a = 'rgba(255, 255, 255, 0.4)';
b = 'rgba(240, 190, 45, 1)';
}
return {
//'backgroundColor':a, 'box-shadow': '1px 1px 0 rgba(54,47,36,.35),-1px -1px 0 hsla(0,0%,78.4%,.1)', 'color': b
'backgroundColor':a, 'color': b
}
}
},
]
}
]
},
],
}
and this is my custom.css file:
.body {
background-color: #ffffff !important;
}
.pages-menu--scroll-indicator {
background-color: rgba(255,255,255,.6) !important;
}
.group-title {
font-size: 19px;
height: 35px;
position: relative;
top: -35px;
color: #44739e !important;
font-weight: 400;
opacity: .8
}
.pages-menu--item.ng-scope {
color: rgb(68, 115, 158) !important;
opacity: .9 !important;
}
.pages-menu--item.ng-scope.-active {
background-color: rgba(0,0,0,.1);
color: rgba(255, 255, 255, 1) !important;
/*opacity: .7 !important; */
}
/*
.item-climate--target {
font-size: 45px;
text-align: center;
}
.item-climate--mode.ng-scope {
font-size: 30px;
text-align: center;
padding: 5px 3px;
}
*/
.item-select.ng-scope {
color: #ffffff !important;
}
.-sensor-bigger-text .item-entity--value {
font-size: 300%;
color: rgb(150, 150, 150);
}
.-sensor-bigger-text .item-entity--unit {
font-size: 150%;
color: rgb(150, 150, 150);
}
.-sensor-smaller-text .item-entity--value {
font-size: 200%;
font-weight: 400;
/*color: rgb(150, 150, 150);*/
}
.-sensor-smaller-text .item-entity--unit {
font-size: 80%;
/*color: rgb(150, 150, 150);*/
}