danVnest-home-assistant/.storage/lovelace

2690 lines
142 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"version": 1,
"minor_version": 1,
"key": "lovelace",
"data": {
"config": {
"title": "Smart Nest",
"background": "var(--background-image)",
"views": [
{
"title": "Dashboards",
"path": "dashboards",
"icon": "mdi:home-assistant",
"sections": [
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Status",
"heading_style": "subtitle",
"icon": "mdi:home-assistant",
"badges": [
{
"type": "entity",
"show_state": true,
"show_icon": true,
"entity": "sensor.texts",
"name": "Guide",
"state_content": "name",
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/guide"
},
"icon": "mdi:text-box"
}
],
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 0px) and (max-width: 767px)"
}
]
},
{
"type": "heading",
"heading": "Status",
"heading_style": "subtitle",
"icon": "mdi:home-assistant",
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 768px)"
}
]
},
{
"type": "tile",
"entity": "binary_sensor.internet",
"name": "WARNING: Internet is disconnected - functionality limited",
"state_content": "last_changed",
"icon": "mdi:close-network",
"color": "red",
"layout_options": {
"grid_columns": 4,
"grid_rows": 1
},
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.internet",
"state_not": "on"
}
],
"card_mod": {
"style": {
"ha-tile-info$": "state-display {\n text-transform: lowercase !important;\n}\nstate-display:before {\n content: 'since';\n}\n"
}
}
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "sensor.device_issues",
"show_state": false,
"card_layout": "large-2-rows",
"tap_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"button_action": {
"tap_action": {
"action": "navigate",
"navigation_path": "#device-issues"
}
},
"sub_button": [
{
"entity": "sensor.unavailable_entities",
"show_state": true,
"show_background": false
},
{
"entity": "sensor.frozen_devices",
"show_state": true,
"show_background": false
}
],
"visibility": [
{
"condition": "numeric_state",
"entity": "sensor.device_issues",
"above": 0
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), red) !important; !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n}\n${card.querySelector('.bubble-name').innerText = 'WARNING: ' + hass.states['sensor.device_issues'].state + ' device issue' + (hass.states['sensor.device_issues'].state === '1' ? '': 's')}}\n${card.querySelector('.bubble-state').innerText = 'System functionality may be impaired'}\n${card.querySelector('.bubble-sub-button-1 .bubble-sub-button-name-container').innerText = hass.states['sensor.unavailable_entities'].state + ' unavailable' }\n${card.querySelector('.bubble-sub-button-2 .bubble-sub-button-name-container').innerText = hass.states['sensor.frozen_devices'].state + ' frozen' }\n"
},
{
"type": "custom:bubble-card",
"card_type": "select",
"entity": "input_select.scene",
"show_last_changed": true,
"sub_button": [
{
"entity": "input_boolean.pets_home_alone",
"show_name": true
}
],
"card_layout": "large",
"layout_options": {
"grid_columns": 4,
"grid_rows": 1
},
"styles": ".bubble-select-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container, .bubble-dropdown-arrow {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n.bubble-sub-button-1 {\n display: ${hass.states['input_boolean.pets_home_alone'].state === 'on' ? '' : 'none'} !important;\n}\n${card.querySelector('.bubble-name').innerText = state + \" scene\"}\n${icon.setAttribute(\"icon\", (() => {\n switch (state) {\n case 'Day':\n return 'mdi:weather-sunny';\n case 'Night':\n return 'mdi:weather-night';\n case 'Bright':\n return 'mdi:white-balance-sunny';\n case 'Sleep':\n return 'mdi:sleep';\n case 'Morning':\n return 'mdi:weather-sunset';\n case 'TV':\n return 'mdi:television';\n case 'Away (Night)':\n return 'mdi:home-off';\n case 'Away (Day)':\n return 'mdi:home-off';\n }\n})())}\n"
},
{
"type": "tile",
"entity": "lock.door_lock",
"state_content": [
"last_changed"
],
"name": "Front door",
"card_mod": {
"style": {
"ha-tile-info$": ".primary:after {\n content: \"{{ ' ' + states('lock.door_lock')}}\";\n}"
}
},
"layout_options": {
"grid_columns": "full"
},
"visibility": [
{
"condition": "user",
"users": []
}
]
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "lock.door_lock",
"show_state": false,
"show_last_changed": true,
"name": "Front door",
"card_layout": "large-2-rows",
"sub_button": [
{
"entity": "sensor.security_monitoring",
"show_state": true,
"show_background": false,
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
},
"hold_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
}
},
{
"entity": "sensor.security_monitoring_count_text",
"show_state": true,
"show_background": false,
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
},
"hold_action": {
"action": "navigate",
"navigation_path": "/lovelace/presence"
}
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-name:after {\n content: ' ${state}' !important;\n white-space: pre;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n} .rows-2 .bubble-sub-button-container {\n display: ${['Sleep','Away (Day)','Away (Night)'].includes(hass.states['input_select.scene'].state) ? '' : 'none'} !important;\n border-radius: var(--ha-card-border-radius) !important;\n border: 1.5px solid var(--accent-color) !important;\n padding-left: 5px !important;\n padding-right: 0px !important;\n margin-right: -3px !important;\n} .bubble-sub-button-1 .bubble-sub-button-name-container {\n text-transform: lowercase;\n} .bubble-sub-button-1 .bubble-sub-button-name-container:before {\n content: 'Monitoring ' !important;\n white-space: pre;\n text-transform: none;\n}\n"
},
{
"type": "map",
"entities": [
{
"entity": "person.dan"
},
{
"entity": "person.rachel"
}
],
"theme_mode": "light",
"hours_to_show": 1,
"layout_options": {
"grid_columns": 4,
"grid_rows": 2
},
"visibility": [
{
"condition": "state",
"entity": "sun.sun",
"state": "above_horizon"
},
{
"condition": "or",
"conditions": [
{
"condition": "and",
"conditions": [
{
"condition": "user",
"users": [
"15ff7a86d4ae4d38a60003ad4064ff78"
]
},
{
"condition": "state",
"entity": "person.rachel",
"state_not": "home"
}
]
},
{
"condition": "and",
"conditions": [
{
"condition": "user",
"users": [
"9a175674be354863afb9634adc4b8980"
]
},
{
"condition": "state",
"entity": "person.dan",
"state_not": "home"
}
]
}
]
}
]
},
{
"type": "map",
"entities": [
{
"entity": "person.dan"
},
{
"entity": "person.rachel"
}
],
"theme_mode": "dark",
"hours_to_show": 1,
"layout_options": {
"grid_columns": 4,
"grid_rows": 2
},
"visibility": [
{
"condition": "state",
"entity": "sun.sun",
"state_not": "above_horizon"
},
{
"condition": "or",
"conditions": [
{
"condition": "and",
"conditions": [
{
"condition": "user",
"users": [
"15ff7a86d4ae4d38a60003ad4064ff78"
]
},
{
"condition": "state",
"entity": "person.rachel",
"state_not": "home"
}
]
},
{
"condition": "and",
"conditions": [
{
"condition": "user",
"users": [
"9a175674be354863afb9634adc4b8980"
]
},
{
"condition": "state",
"entity": "person.dan",
"state_not": "home"
}
]
}
]
}
]
},
{
"type": "tile",
"entity": "sensor.washer_completion_time",
"name": "Washing done",
"icon": "mdi:washing-machine",
"color": "accent",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.washer_running",
"state": "on"
}
]
},
{
"type": "tile",
"entity": "sensor.washer_completion_time",
"name": "Washing done",
"icon": "mdi:washing-machine",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.washer_running",
"state": "off"
}
]
},
{
"type": "tile",
"entity": "sensor.dryer_completion_time",
"name": "Drying done",
"icon": "mdi:tumble-dryer",
"color": "accent",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.dryer_running",
"state": "on"
}
]
},
{
"type": "tile",
"entity": "sensor.dryer_completion_time",
"name": "Drying done",
"icon": "mdi:tumble-dryer",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.dryer_running",
"state": "off"
}
]
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "binary_sensor.plants_need_watering",
"show_state": false,
"card_layout": "large-2-rows",
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/plants"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/plants"
},
"hold_action": {
"action": "navigate",
"navigation_path": "/lovelace/plants"
},
"sub_button": [
{
"entity": "sensor.dry_plants",
"show_state": true,
"show_background": false
},
{
"entity": "sensor.plants_last_watered",
"show_state": true,
"show_background": false
}
],
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.plants_need_watering",
"state": "on"
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n}\n${card.querySelector('.bubble-sub-button-1 .bubble-sub-button-name-container').innerText = hass.states['sensor.dry_plants'].state + '% are dry' }\n${card.querySelector('.bubble-sub-button-2 .bubble-sub-button-name-container').innerText = 'Watered ' + hass.states['sensor.plants_last_watered'].state }\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "sensor.low_batteries",
"show_state": true,
"card_layout": "large-2-rows",
"tap_action": {
"action": "navigate",
"navigation_path": "#low-batteries"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#low-batteries"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#low-batteries"
},
"button_action": {
"tap_action": {
"action": "navigate",
"navigation_path": "#low-batteries"
}
},
"sub_button": [
{
"entity": "sensor.low_batteries",
"show_state": true,
"show_background": false
},
{
"entity": "sensor.low_batteries",
"show_state": false,
"show_background": false,
"show_attribute": true,
"attribute": "unavailable",
"icon": "mdi:battery-unknown"
}
],
"visibility": [
{
"condition": "numeric_state",
"entity": "sensor.low_batteries",
"above": 0
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), red) !important; !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n${card.querySelector('.bubble-name').innerText = 'WARNING: ' + hass.states['sensor.low_batteries'].state + ' low batter' + (hass.states['sensor.low_batteries'].state === '1' ? 'y': 'ies') }\n${card.querySelector('.bubble-state').innerText = 'Please check, charge, or replace'}\n${card.querySelector('.bubble-sub-button-1 .bubble-sub-button-name-container').innerText = hass.states['sensor.low_batteries'].state + ' below 25%' }\n${card.querySelector('.bubble-sub-button-2 .bubble-sub-button-name-container').innerText = hass.states['sensor.low_batteries'].attributes['unavailable'] + ' unavailable' }\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "sensor.charging_batteries",
"show_state": false,
"card_layout": "large-2-rows",
"tap_action": {
"action": "navigate",
"navigation_path": "#charging-batteries"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#charging-batteries"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#charging-batteries"
},
"button_action": {
"tap_action": {
"action": "navigate",
"navigation_path": "#charging-batteries"
}
},
"sub_button": [
{
"entity": "sensor.charging_batteries",
"show_state": false,
"show_attribute": true,
"show_background": false,
"attribute": "charged",
"icon": "mdi:battery"
},
{
"entity": "sensor.charging_batteries",
"show_state": false,
"show_attribute": true,
"show_background": false,
"attribute": "below_50",
"icon": "mdi:battery-50"
}
],
"visibility": [
{
"condition": "numeric_state",
"entity": "sensor.charging_batteries",
"above": 0
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), green) !important; !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n${card.querySelector('.bubble-name').innerText = hass.states['sensor.charging_batteries'].state + ' batter' + (hass.states['sensor.charging_batteries'].state === '1' ? 'y': 'ies') + ' charging' }\n${card.querySelector('.bubble-sub-button-1 .bubble-sub-button-name-container').innerText = hass.states['sensor.charging_batteries'].attributes['above_90'] + ' above 90%' }\n${card.querySelector('.bubble-sub-button-2 .bubble-sub-button-name-container').innerText = hass.states['sensor.charging_batteries'].attributes['below_50'] + ' below 50%' }\n"
}
],
"column_span": 1
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Climate",
"heading_style": "subtitle",
"icon": "mdi:thermometer"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"name": "Outside",
"entity": "sensor.outside_apparent_temperature",
"tap_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"card_layout": "large-2-rows",
"sub_button": [
{
"entity": "sensor.extreme_forecast_text",
"icon": "mdi:thermometer",
"show_state": true,
"show_background": false
},
{
"entity": "sensor.next_rain_forecast_text",
"show_state": true,
"show_background": false
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n${icon.setAttribute(\"icon\", (() => {\n switch (hass.states['sensor.pirateweather_icon_4h'].state) {\n case 'clear-day':\n return 'mdi:weather-sunny';\n case 'clear-night':\n return 'mdi:weather-night';\n case 'rain':\n return 'mdi:weather-rainy';\n case 'snow':\n return 'mdi:weather-snowy';\n case 'sleet':\n return 'mdi:weather-snowy-rainy';\n case 'wind':\n return 'mdi:weather-windy';\n case 'fog':\n return 'mdi:weather-fog';\n case 'cloudy':\n return 'mdi:weather-cloudy';\n case 'partly-cloudy-day':\n return 'mdi:weather-partly-cloudy';\n case 'partly-cloudy-night':\n return 'mdi:weather-night-partly-cloudy';\n }\n})())}\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"name": "Inside",
"entity": "sensor.weighted_average_inside_apparent_temperature",
"tap_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#weather"
},
"card_layout": "large-2-rows",
"sub_button": [
{
"entity": "sensor.living_room_apparent_temperature",
"icon": "mdi:sofa",
"show_state": true
},
{
"entity": "sensor.kitchen_apparent_temperature",
"icon": "mdi:fridge",
"show_state": true
},
{
"entity": "sensor.dog_bed_area_apparent_temperature",
"icon": "mdi:dog-side",
"show_state": true
},
{
"entity": "sensor.office_apparent_temperature",
"icon": "mdi:desktop-classic",
"show_state": true
},
{
"entity": "sensor.bedroom_apparent_temperature",
"icon": "mdi:bed",
"show_state": true
},
{
"entity": "sensor.nursery_apparent_temperature",
"icon": "mdi:cradle",
"show_state": true
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n}\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"name": "Control",
"button_type": "state",
"entity": "group.any_climate_control",
"show_state": true,
"card_layout": "large-2-rows",
"sub_button": [
{
"entity": "group.any_aircon",
"name": "Aircon",
"show_name": true
},
{
"entity": "group.any_fans",
"name": "Fans",
"show_name": true
},
{
"entity": "group.any_heaters",
"name": "Heaters",
"show_name": true
},
{
"entity": "group.any_humidifiers",
"name": "Humidifiers",
"show_name": true
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n box-sizing: border-box !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n} ${card.querySelector('.bubble-state').innerText = hass.states['sensor.climate_device_automatic_control_count'].state + '/' + hass.states['sensor.climate_device_count'].state + ' devices are automatic'}\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "sensor.humidifiers_status_text",
"show_state": false,
"show_last_changed": true,
"card_layout": "large",
"visibility": [
{
"condition": "state",
"entity": "sensor.humidifiers_status_text",
"state_not": "Humidifiers are functional"
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n${card.querySelector('.bubble-name').innerText = state }\n"
},
{
"type": "vertical-stack",
"cards": [
{
"type": "custom:bubble-card",
"card_type": "pop-up",
"hash": "#weather",
"button_type": "name",
"name": "Weather",
"icon": "mdi:text-box",
"show_name": true,
"card_layout": "large",
"styles": ".bubble-pop-up, .bubble-pop-up-container,\n.bubble-button-card-container, .bubble-close-button {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n}\n"
},
{
"type": "weather-forecast",
"show_current": false,
"show_forecast": true,
"entity": "weather.pirateweather",
"forecast_type": "daily"
},
{
"type": "tile",
"entity": "sensor.pirateweather_nearest_storm_distance",
"name": "Nearest storm"
}
]
}
],
"column_span": 1
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Lights",
"heading_style": "subtitle",
"icon": "mdi:lightbulb-variant"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "name",
"entity": "light.office",
"card_layout": "large-2-rows",
"sub_button": [
{
"entity": "group.all_lights",
"name": "All",
"show_name": true
},
{
"entity": "light.hall",
"name": "Hall",
"show_name": true
},
{
"entity": "group.entryway_lights",
"name": "Entryway",
"show_name": true
},
{
"entity": "light.bathroom",
"name": "Bathroom",
"show_name": true
},
{
"entity": "group.kitchen_lights",
"name": "Kitchen",
"show_name": true
},
{
"entity": "light.bedroom",
"name": "Bedroom",
"show_name": true
},
{
"entity": "group.tv_lights",
"name": "TV",
"show_name": true
},
{
"entity": "light.nursery",
"name": "Nursery",
"show_name": true
},
{
"entity": "group.dining_room_lights",
"name": "Dining",
"show_name": true
},
{
"entity": "light.office",
"name": "Office",
"show_name": true
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .bubble-name-container {\n max-width: 0px !important;\n} .large .bubble-icon-container {\n display: none;\n} .bubble-sub-button-container {\n margin: auto !important;\n padding: 0 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n}\n"
},
{
"type": "custom:bubble-card",
"card_type": "button",
"name": "Control",
"button_type": "state",
"entity": "group.any_light_control",
"show_state": true,
"card_layout": "large",
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n box-sizing: border-box !important;\n} .bubble-name {\n font-weight: 500 !important;\n}\n${card.querySelector('.bubble-state').innerText = hass.states['sensor.light_automatic_control_count'].state + '/' + hass.states['sensor.light_count'].state + ' lights are automatic'}\n",
"icon": "mdi:lightbulb-auto"
}
]
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Settings"
},
{
"cards": [
{
"entities": [
{
"entity": "input_datetime.morning_time"
},
{
"entity": "input_datetime.nursery_time"
},
{
"entity": "input_datetime.bed_time"
}
],
"show_header_toggle": false,
"type": "entities",
"state_color": true
},
{
"content": "Specify the time for which the ***Morning*** scene and pre-sleep climate controls will trigger. More information in the **Instructions** tab.",
"type": "markdown"
}
],
"type": "vertical-stack"
}
],
"column_span": 1,
"visibility": [
{
"condition": "user",
"users": []
}
]
},
{
"type": "grid",
"cards": [
{
"type": "vertical-stack",
"cards": [
{
"type": "custom:bubble-card",
"card_type": "pop-up",
"hash": "#device-issues",
"button_type": "name",
"name": "Device issues",
"icon": "mdi:alert-circle",
"show_name": true,
"card_layout": "large",
"styles": ".bubble-pop-up, .bubble-pop-up-container,\n.bubble-button-card-container, .bubble-close-button {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), red) !important; !important;\n}\n"
},
{
"type": "tile",
"entity": "binary_sensor.internet",
"name": "Internet is disconnected - reconnect to fix issues",
"state_content": "last_changed",
"icon": "mdi:close-network",
"color": "red",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.internet",
"state_not": "on"
}
],
"card_mod": {
"style": {
"ha-tile-info$": "state-display {\n text-transform: lowercase !important;\n}\nstate-display:before {\n content: 'since';\n}\n"
}
}
},
{
"type": "markdown",
"content": "The entities listed below are unavailable or frozen. \nThere are multiple potential causes for such states, and it is recommended to follow this guide to diagnose and fix them.\n\n<details><summary><i>Resolution guide</i></summary>\n\n1. If the internet is disconnected, try and restore it\n\n2. Check the device is plugged in or has sufficient battery charge\n\n3. Select an entity \n - if there is a warning that it is no longer being provided by the relevant integration, fix the configuration if possible or consider deleting it\n - select the cog icon and check the entity_id seems correct - in particular check if '_2' or similar is appended, this can indiciate it is a duplicate and helps direct the next step\n - select the 3 dots icon and check device and/or related info, look for and resolve duplicate entities, incorrect names, or any other detected issues - reload the relevant integration or adjust configuration if necessary\n - check the entity history to determine when the issue started and if that correlates with anything that could have been the cause\n\n4. Try reloading home assistant [ADD BUTTON]\n\n5. Try restarting home assistant [ADD BUTTON]\n\n6. If none of the above resolve the issue, either delete the entity if not required or add it to the ignored unavailable entities list in the system configuration\n\n</details>",
"card_mod": {
"style": {
"ha-markdown$": "summary {\n background: var(--primary-background-color);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 12px;\n width: 150px;\n border-radius: var(--ha-card-border-radius);\n border: 1.5px solid var(--accent-color);\n}\nsummary, summary i {\n padding-left: 10px;\n}"
}
}
},
{
"type": "custom:auto-entities",
"card": {
"type": "entities"
},
"filter": {
"template": "{{\n (state_attr('sensor.unavailable_entities', 'entity_id') +\n state_attr('sensor.frozen_devices', 'entity_id'))\n [:15]\n}}\n"
}
},
{
"type": "custom:auto-entities",
"card": {
"type": "history-graph",
"title": "History",
"hours_to_show": 240,
"refresh_interval": 0
},
"filter": {
"template": "{{\n (state_attr('sensor.unavailable_entities', 'entity_id') +\n state_attr('sensor.frozen_devices', 'entity_id'))\n [:15]\n}}\n"
}
},
{
"type": "markdown",
"content": "There are {{ states('sensor.device_issues')|int(1) - 15 }} additional device issues.\nResolve the above first to see more.",
"visibility": [
{
"condition": "numeric_state",
"entity": "sensor.device_issues",
"above": 15
}
]
}
]
},
{
"type": "vertical-stack",
"cards": [
{
"type": "custom:bubble-card",
"card_type": "pop-up",
"hash": "#low-batteries",
"button_type": "name",
"name": "Low batteries",
"icon": "mdi:battery-low",
"show_name": true,
"card_layout": "large",
"styles": ".bubble-pop-up, .bubble-pop-up-container,\n.bubble-button-card-container, .bubble-close-button {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), red) !important; !important;\n}\n"
},
{
"type": "tile",
"entity": "binary_sensor.internet",
"name": "Internet is disconnected - batteries may be unavailable",
"state_content": "last_changed",
"icon": "mdi:close-network",
"color": "red",
"visibility": [
{
"condition": "state",
"entity": "binary_sensor.internet",
"state_not": "on"
}
],
"card_mod": {
"style": {
"ha-tile-info$": "state-display {\n text-transform: lowercase !important;\n}\nstate-display:before {\n content: 'since';\n}\n"
}
}
},
{
"type": "markdown",
"content": "Once a battery is too flat for the device to function its battery level may not be reported, and as such appear as \"unavailable\". This can also occur when a battery is ok but the device can't connect. It can be worth checking other device issues first in this case.\n\nBatteries with low levels are still functional, but it is recommended to charge or replace them soon to keep the system functional."
},
{
"type": "custom:auto-entities",
"card": {
"type": "entities"
},
"filter": {
"template": "{{ state_attr('sensor.low_batteries', 'entity_id') }}"
},
"sort": {
"method": "state"
}
},
{
"type": "custom:auto-entities",
"card": {
"type": "history-graph",
"title": "History",
"hours_to_show": 240,
"refresh_interval": 0
},
"filter": {
"template": "{{ state_attr('sensor.low_batteries', 'entity_id') }}"
}
},
{
"type": "custom:bubble-card",
"card_type": "button",
"button_type": "state",
"entity": "sensor.device_issues",
"show_state": false,
"card_layout": "large-2-rows",
"tap_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"double_tap_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"hold_action": {
"action": "navigate",
"navigation_path": "#device-issues"
},
"sub_button": [
{
"entity": "sensor.unavailable_entities",
"show_state": true,
"show_background": false
},
{
"entity": "sensor.frozen_devices",
"show_state": true,
"show_background": false
}
],
"visibility": [
{
"condition": "numeric_state",
"entity": "sensor.device_issues",
"above": 0
}
],
"styles": ".bubble-button-card-container {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n border: 1.5px solid var(--accent-color) !important;\n box-sizing: border-box !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), red) !important; !important;\n} .bubble-name {\n font-weight: 500 !important;\n} .bubble-sub-button {\n width: 100%;\n justify-content: left !important;\n}\n${card.querySelector('.bubble-name').innerText = hass.states['sensor.device_issues'].state + ' possibly related device issue' + (hass.states['sensor.device_issues'].state === '1' ? '': 's')}}\n${card.querySelector('.bubble-sub-button-1 .bubble-sub-button-name-container').innerText = hass.states['sensor.unavailable_entities'].state + ' unavailable' }\n${card.querySelector('.bubble-sub-button-2 .bubble-sub-button-name-container').innerText = hass.states['sensor.frozen_devices'].state + ' frozen' }\n"
}
]
},
{
"type": "vertical-stack",
"cards": [
{
"type": "custom:bubble-card",
"card_type": "pop-up",
"hash": "#charging-batteries",
"button_type": "name",
"name": "Charging batteries",
"icon": "mdi:battery-charging",
"show_name": true,
"card_layout": "large",
"styles": ".bubble-pop-up, .bubble-pop-up-container,\n.bubble-button-card-container, .bubble-close-button {\n background: var(--ha-card-background) !important;\n border-radius: var(--ha-card-border-radius) !important;\n} .large .bubble-icon-container {\n min-width: 36px !important;\n min-height: 36px !important;\n background: var(--ha-card-background) !important;\n} .bubble-icon {\n color: color-mix(in srgb, var(--state-icon-color), green) !important; !important;\n}\n"
},
{
"type": "markdown",
"content": "Devices with integrated batteries that report their charge status are displayed here. You will be notified when a device is fully charged."
},
{
"type": "custom:auto-entities",
"card": {
"type": "entities"
},
"filter": {
"template": "{{ state_attr('sensor.charging_batteries', 'entity_id') }}"
},
"sort": {
"method": "state"
}
},
{
"type": "custom:auto-entities",
"card": {
"type": "history-graph",
"title": "History",
"hours_to_show": 6,
"refresh_interval": 0
},
"filter": {
"template": "{{ state_attr('sensor.charging_batteries', 'entity_id') }}"
}
}
]
}
]
}
],
"cards": [],
"dense_section_placement": true,
"type": "sections",
"max_columns": 2,
"badges": []
},
{
"title": "Climate",
"path": "climate",
"icon": "mdi:thermometer",
"cards": [
{
"cards": [
{
"entities": [
{
"entity": "sensor.weighted_average_inside_apparent_temperature",
"name": "Inside"
},
{
"entity": "sensor.outside_apparent_temperature",
"name": "Outside"
},
{
"entity": "sensor.extreme_forecast"
}
],
"show_name": true,
"type": "glance"
},
{
"entities": [
{
"entity": "sensor.bedroom_apparent_temperature",
"name": "Bedroom"
},
{
"entity": "sensor.nursery_apparent_temperature",
"name": "Nursery"
},
{
"entity": "sensor.office_apparent_temperature",
"name": "Office"
},
{
"entity": "sensor.dining_room_apparent_temperature",
"name": "Dining room"
},
{
"entity": "sensor.living_room_apparent_temperature",
"name": "Living room"
},
{
"entity": "sensor.dog_bed_area_apparent_temperature",
"name": "Dog bed area"
},
{
"entity": "sensor.kitchen_apparent_temperature",
"name": "Kitchen"
},
{
"entity": "sensor.bathroom_apparent_temperature",
"name": "Bathroom"
},
{
"entity": "sensor.entryway_apparent_temperature",
"name": "Entryway"
}
],
"show_name": true,
"columns": 3,
"type": "glance"
},
{
"type": "glance",
"entities": [
{
"entity": "input_number.humidifier_target"
},
{
"entity": "sensor.bedroom_humidity",
"name": "Bedroom"
},
{
"entity": "sensor.nursery_humidity",
"name": "Nursery"
}
]
}
],
"type": "vertical-stack"
},
{
"cards": [
{
"show_name": true,
"show_icon": true,
"show_state": false,
"type": "glance",
"entities": [
{
"entity": "group.all_aircon",
"name": "All"
},
{
"entity": "climate.living_room_aircon",
"name": "Living room"
},
{
"entity": "climate.dining_room_aircon",
"name": "Dining room"
},
{
"entity": "climate.bedroom_aircon"
}
],
"state_color": true,
"title": "Aircon"
},
{
"show_name": true,
"show_icon": true,
"show_state": false,
"type": "glance",
"entities": [
{
"entity": "group.all_fans",
"name": "All"
},
{
"entity": "fan.nursery",
"name": "Nursery"
},
{
"entity": "fan.office",
"name": "Office"
},
{
"entity": "fan.bedroom",
"name": "Bedroom"
}
],
"state_color": true,
"title": "Fans"
},
{
"show_name": true,
"show_icon": true,
"show_state": false,
"type": "glance",
"entities": [
{
"entity": "group.all_heaters",
"name": "All"
},
{
"entity": "switch.nursery_heater",
"name": "Nursery",
"icon": "mdi:radiator"
},
{
"entity": "switch.office_heater",
"name": "Office",
"icon": "mdi:radiator"
}
],
"title": "Heaters"
},
{
"show_name": true,
"show_icon": true,
"show_state": false,
"type": "glance",
"entities": [
{
"entity": "group.all_humidifiers",
"name": "All"
},
{
"entity": "humidifier.bedroom",
"name": "Bedroom",
"icon": "mdi:air-humidifier"
},
{
"entity": "humidifier.nursery",
"name": "Nursery",
"icon": "mdi:air-humidifier"
}
],
"title": "Humidifiers"
},
{
"content": "Manually controlling aircon, fans, or heaters may disable **automatic control** for those devices. You can toggle **automatic control** of all/individual devices below.",
"type": "markdown"
},
{
"type": "entities",
"title": "Automatic climate control",
"entities": [
"input_boolean.control_living_room_aircon",
"input_boolean.control_dining_room_aircon",
"input_boolean.control_bedroom_aircon",
"input_boolean.control_nursery_fan",
"input_boolean.control_office_fan",
"input_boolean.control_bedroom_fan",
"input_boolean.control_nursery_heater",
"input_boolean.control_office_heater",
"input_boolean.control_bedroom_humidifier",
"input_boolean.control_nursery_humidifier"
],
"show_header_toggle": true
},
{
"type": "markdown",
"content": "**Automatic climate control** will control each aircon, fan, and heater based on room temperature and occupancy.\nIf the **pets are home alone** (or are going to be soon), you can manually specify this or wait for their movement to be detected to trigger **climate control**.\nOnly the bedroom aircon will be controlled when **pets are home alone** (bedroom and office fans will be on as well) or after the specified bed time. **Aircon** can also be manually turned on and off. These settings can be controlled by telling Siri/Google:\n- **\"climate control on\"** or **\"climate control off\"**\n- **\"aircon on\"** or **\"aircon off\"**\n\nNOTE THAT DEVICES WILL ALWAYS TURN OFF WHEN AWAY EVEN IF AUTOMATIC CONTROL DISABLED"
}
],
"type": "vertical-stack"
},
{
"entities": [
{
"entity": "input_number.cooling_target_temperature"
},
{
"entity": "input_number.heating_target_temperature"
},
{
"entity": "input_number.high_temperature_aircon_trigger"
},
{
"entity": "input_number.low_temperature_aircon_trigger"
}
],
"show_header_toggle": false,
"title": "Day",
"type": "entities",
"state_color": true
},
{
"entities": [
{
"entity": "input_number.sleep_cooling_target_temperature"
},
{
"entity": "input_number.sleep_heating_target_temperature"
},
{
"entity": "input_number.sleep_high_temperature_aircon_trigger"
},
{
"entity": "input_number.sleep_low_temperature_aircon_trigger"
}
],
"show_header_toggle": false,
"title": "Night",
"type": "entities",
"state_color": true
},
{
"type": "entities",
"entities": [
{
"entity": "input_number.aircon_door_check_delay"
},
{
"entity": "input_number.aircon_vacating_delay"
},
{
"entity": "input_number.fan_vacating_delay"
},
{
"entity": "input_number.heater_vacating_delay"
},
{
"entity": "input_number.humidifier_vacating_delay"
}
],
"title": "Delays"
},
{
"cards": [
{
"entities": [
{
"entity": "sensor.weighted_average_inside_apparent_temperature",
"name": "Inside"
},
{
"entity": "sensor.outside_apparent_temperature",
"name": "Outside"
},
{
"entity": "sensor.bathroom_apparent_temperature",
"name": "Bathroom"
},
{
"entity": "sensor.bedroom_apparent_temperature",
"name": "Bedroom"
},
{
"entity": "sensor.dining_room_apparent_temperature",
"name": "Dining room"
},
{
"entity": "sensor.dog_bed_area_apparent_temperature",
"name": "Dog bed area"
},
{
"entity": "sensor.entryway_apparent_temperature",
"name": "Entryway"
},
{
"entity": "sensor.kitchen_apparent_temperature",
"name": "Kitchen"
},
{
"entity": "sensor.living_room_apparent_temperature",
"name": "Living room"
},
{
"entity": "sensor.nursery_apparent_temperature",
"name": "Nursery"
},
{
"entity": "sensor.office_apparent_temperature",
"name": "Office"
}
],
"refresh_interval": 0,
"title": "Temperatures",
"type": "history-graph",
"hours_to_show": 12,
"logarithmic_scale": false
},
{
"entities": [
{
"entity": "sensor.bedroom_humidity",
"name": "Bedroom"
},
{
"entity": "sensor.nursery_humidity",
"name": "Nursery"
}
],
"refresh_interval": 0,
"title": "Humidities",
"type": "history-graph",
"hours_to_show": 12,
"logarithmic_scale": false
}
],
"type": "vertical-stack"
}
]
},
{
"path": "lights",
"title": "Lights",
"icon": "mdi:lightbulb-variant",
"cards": [
{
"cards": [
{
"type": "glance",
"entities": [
{
"entity": "group.all_lights",
"name": "Any / all"
},
{
"entity": "group.entryway_lights",
"name": "Entryway"
},
{
"entity": "group.kitchen_lights",
"name": "Kitchen"
},
{
"entity": "group.tv_lights",
"name": "TV"
},
{
"entity": "group.dining_room_lights",
"name": "Dining"
},
{
"entity": "light.hall",
"name": "Hall"
},
{
"entity": "light.bathroom",
"name": "Bathroom"
},
{
"entity": "light.bedroom",
"name": "Bedroom"
},
{
"entity": "light.nursery",
"name": "Nursery"
},
{
"entity": "light.office",
"name": "Office"
}
],
"show_icon": true,
"show_name": true,
"show_state": false,
"title": "Lights",
"state_color": true
},
{
"content": "Manually controlling lights may disable **automatic control** for those lights. You can toggle **automatic control** of all/individual lights below.",
"type": "markdown"
},
{
"type": "entities",
"title": "Automatic light control",
"entities": [
"input_boolean.control_entryway_lights",
"input_boolean.control_kitchen_light",
"input_boolean.control_kitchen_strip_light",
"input_boolean.control_tv_lights",
"input_boolean.control_dining_room_lights",
"input_boolean.control_hall_light",
"input_boolean.control_bathroom_light",
"input_boolean.control_bedroom_light",
"input_boolean.control_nursery_light",
"input_boolean.control_office_light"
],
"show_header_toggle": true
},
{
"type": "markdown",
"content": "Lighting in the entryway, kitchen, office and bedroom will automatically brighten when someone enters, and dim shortly after they leave (depending on scene settings). Automatic bedroom lighting is disabled as soon as the ***Sleep*** scene starts, only enabling again when the bedroom **button** is clicked or after illuminance levels peak (i.e. after blinds are first opened in the morning).\n\nNOTE THAT DEVICES WILL ALWAYS TURN OFF WHEN AWAY EVEN IF AUTOMATIC CONTROL DISABLED"
}
],
"type": "vertical-stack"
},
{
"cards": [
{
"entities": [
{
"entity": "input_number.initial_circadian_brightness"
},
{
"entity": "input_number.initial_circadian_kelvin"
},
{
"entity": "input_number.final_circadian_brightness"
},
{
"entity": "input_number.final_circadian_kelvin"
},
{
"entity": "input_number.circadian_initial_sunset_offset"
},
{
"entity": "input_datetime.circadian_end_time"
}
],
"title": "Circadian Rhythm",
"type": "entities",
"state_color": false
},
{
"content": "Lighting at night will gradually transition between the initial and final brightness and colour values specified here.\n\nInitial circadian settings occur after sunset (specified in hours by *initial sunset offset*) and reaches the final values at *end time*.",
"type": "markdown"
}
],
"type": "vertical-stack"
},
{
"cards": [
{
"content": "Values here specify the *brightness* and colour temperature of lighting in different scenes. Colour temperature ranges from warm white (2000 *kelvin*) to cold white (4500 *kelvin*).\n\n*Motion* indicates the value is specific to when the room is occupied (otherwise defaulting to the normal values specified, the current circadian value, off, or maximum - depending on the scene).\n\n*Vacating delay* specifies how long the light will wait after someone leaves the room before reverting to its previous state.\n\nIf a *transition period* is available the light will smoothly change over that period to the motion brightness and kelvin specified or implied.",
"type": "markdown"
},
{
"entities": [
{
"entity": "input_number.night_motion_brightness"
},
{
"entity": "input_number.night_motion_kelvin"
},
{
"entity": "input_number.night_transition_period"
},
{
"entity": "input_number.night_vacating_delay"
}
],
"title": "Night",
"type": "entities"
},
{
"entities": [
{
"entity": "input_number.tv_brightness"
},
{
"entity": "input_number.tv_kelvin"
},
{
"entity": "input_number.tv_motion_brightness"
},
{
"entity": "input_number.tv_transition_period"
},
{
"entity": "input_number.tv_vacating_delay"
}
],
"title": "TV",
"type": "entities"
},
{
"entities": [
{
"entity": "input_number.sleep_motion_brightness"
},
{
"entity": "input_number.sleep_motion_kelvin"
},
{
"entity": "input_number.sleep_transition_period"
},
{
"entity": "input_number.sleep_vacating_delay"
}
],
"title": "Sleep",
"type": "entities"
},
{
"entities": [
{
"entity": "input_number.morning_brightness"
},
{
"entity": "input_number.morning_kelvin"
},
{
"entity": "input_number.morning_vacating_delay"
}
],
"title": "Morning",
"type": "entities"
}
],
"type": "vertical-stack"
},
{
"entities": [
{
"entity": "input_number.office_vacating_delay"
},
{
"entity": "input_number.bedroom_vacating_delay"
},
{
"entity": "input_number.bathroom_vacating_delay"
}
],
"title": "Room Vacating Delays",
"type": "entities"
}
]
},
{
"title": "Presence",
"path": "presence",
"icon": "mdi:cctv",
"badges": [],
"cards": [
{
"aspect_ratio": "2",
"default_zoom": 12,
"auto_fit": true,
"entities": [
{
"entity": "device_tracker.dan_s_phone"
},
{
"entity": "device_tracker.rachel_s_phone"
}
],
"hours_to_show": 1,
"type": "map",
"theme_mode": "dark"
},
{
"type": "custom:webrtc-camera",
"entity": "camera.front_door",
"poster": "image.front_door_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.front_door"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.front_door"
}
}
]
},
{
"type": "custom:webrtc-camera",
"entity": "camera.entryway",
"poster": "image.entryway_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.entryway"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.entryway"
}
}
]
},
{
"type": "custom:webrtc-camera",
"entity": "camera.living_room",
"poster": "image.living_room_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.living_room"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.living_room"
}
}
]
},
{
"type": "custom:webrtc-camera",
"entity": "camera.back_deck",
"poster": "image.back_deck_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.back_deck"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.back_deck"
}
}
]
},
{
"type": "custom:webrtc-camera",
"entity": "camera.back_door",
"poster": "image.back_door_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.back_door"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.back_door"
}
}
]
},
{
"type": "custom:webrtc-camera",
"entity": "camera.garage",
"poster": "image.garage_event_image",
"ui": true,
"shortcuts": [
{
"name": "Play",
"icon": "mdi:play",
"service": "camera.turn_on",
"service_data": {
"entity_id": "camera.garage"
}
},
{
"name": "Stop",
"icon": "mdi:stop",
"service": "camera.turn_off",
"service_data": {
"entity_id": "camera.garage"
}
}
]
},
{
"type": "history-graph",
"entities": [
{
"entity": "binary_sensor.entryway_multisensor_motion"
},
{
"entity": "binary_sensor.bathroom_multisensor_motion"
},
{
"entity": "binary_sensor.hall_multisensor_motion"
},
{
"entity": "binary_sensor.dining_room_multisensor_motion"
},
{
"entity": "binary_sensor.kitchen_door_motion"
},
{
"entity": "lock.door_lock"
},
{
"entity": "binary_sensor.bedroom_presence_sensor_occupancy"
},
{
"entity": "binary_sensor.kitchen_presence_sensor_occupancy"
},
{
"entity": "binary_sensor.nursery_presence_sensor_occupancy"
},
{
"entity": "binary_sensor.office_presence_sensor_occupancy"
}
],
"title": "Motion",
"hours_to_show": 24
}
],
"visible": [
{
"user": "15ff7a86d4ae4d38a60003ad4064ff78"
},
{
"user": "037b9dab7fb04176b342f8c42a79bb17"
}
]
},
{
"type": "sections",
"path": "electricity",
"sections": [
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Power",
"heading_style": "subtitle",
"icon": "mdi:flash",
"badges": [
{
"type": "entity",
"show_state": true,
"show_icon": true,
"entity": "sensor.texts",
"name": "Guide",
"state_content": "name",
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/guide"
},
"icon": "mdi:text-box"
}
],
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 0px) and (max-width: 767px)"
}
]
},
{
"type": "heading",
"heading": "Power",
"heading_style": "subtitle",
"icon": "mdi:flash",
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 768px)"
}
]
},
{
"type": "custom:power-flow-card-plus",
"entities": {
"grid": {
"entity": "sensor.power_meter_power_grid",
"secondary_info": {
"template": "",
"accept_negative": true
},
"color_circle": true,
"display_state": "one_way",
"use_metadata": false,
"color_value": true
},
"solar": {
"entity": "sensor.inverter_ac_power",
"display_zero_state": true,
"secondary_info": {},
"color_value": false,
"color_icon": false,
"invert_state": false
},
"fossil_fuel_percentage": {
"state_type": "percentage",
"secondary_info": {},
"entity": "sensor.electricity_maps_grid_fossil_fuel_percentage",
"color_value": false,
"display_zero": false,
"color_icon": true,
"display_zero_state": false,
"name": "Low-carbon"
},
"home": {
"secondary_info": {},
"subtract_individual": false,
"circle_animation": true,
"override_state": false,
"entity": "sensor.power_meter_power_load_consumed"
},
"individual": []
},
"clickable_entities": false,
"display_zero_lines": {
"mode": "show",
"transparency": 50,
"grey_color": [
189,
189,
189
]
},
"use_new_flow_rate_model": true,
"w_decimals": 0,
"kw_decimals": 1,
"min_flow_rate": 0.75,
"max_flow_rate": 6,
"max_expected_power": 2000,
"min_expected_power": 0.01,
"watt_threshold": 1000,
"transparency_zero_lines": 0,
"disable_dots": false
},
{
"type": "custom:auto-entities",
"card": {
"type": "custom:bar-card",
"height": "30px",
"positions": {
"icon": "inside",
"indicator": "inside"
},
"max": 1000,
"severity": [
{
"color": "#7bc13c",
"from": 0,
"to": 50
},
{
"color": "#c1bb3c",
"from": 50,
"to": 250
},
{
"color": "#ff8100",
"from": 250,
"to": 750
},
{
"color": "#ff6700",
"from": 750,
"to": 1500
},
{
"color": "#ff4d00",
"from": 1500,
"to": 50000
}
],
"unit_of_measurement": "W",
"decimal": 0,
"card_mod": {
"style": "bar-card-iconbar {\n --paper-item-icon-color: var(--text-secondary-color) !important;\n padding-left: 10px;\n justify-content: left;\n} bar-card-name {\n white-space: nowrap;\n width: 100%;\n padding-right: 10px;\n} bar-card-value {\n padding-right: 5px\n} bar-card-currentbar, bar-card-backgroundbar {\n border-radius: 10px !important;\n} bar-card-currentbar {\n opacity: 0.5;\n}"
}
},
"entities": [
{
"entity": "sensor.all_light_power",
"name": "Lights",
"icon": "mdi:lightbulb-group"
},
{
"entity": "sensor.living_room_aircon_power",
"name": "Living room aircon",
"icon": "mdi:air-conditioner"
},
{
"entity": "sensor.dining_room_aircon_power",
"name": "Dining room aircon",
"icon": "mdi:air-conditioner"
},
{
"entity": "sensor.bedroom_aircon_power",
"name": "Bedroom aircon",
"icon": "mdi:air-conditioner"
},
{
"entity": "sensor.office_heater_power",
"name": "Office heater",
"icon": "mdi:radiator"
},
{
"entity": "sensor.nursery_heater_power",
"name": "Nursery heater",
"icon": "mdi:radiator"
},
{
"entity": "sensor.all_fan_power",
"name": "Fans",
"icon": "mdi:fan"
},
{
"entity": "sensor.all_humidifier_power",
"name": "Humidifiers",
"icon": "mdi:air-humidifier"
},
{
"entity": "sensor.kitchen_appliances_power",
"name": "Kitchen appliances",
"icon": "mdi:kettle-pour-over"
},
{
"entity": "sensor.dishwasher_power",
"name": "Dishwasher",
"icon": "mdi:dishwasher"
},
{
"entity": "sensor.fridge_power",
"name": "Fridge",
"icon": "mdi:fridge"
},
{
"entity": "sensor.freezer_mini_fridge_routers_power",
"name": "Freezer, mini fridge, routers",
"icon": "mdi:fridge-industrial"
},
{
"entity": "sensor.washer_power",
"name": "Washer",
"icon": "mdi:washing-machine"
},
{
"entity": "sensor.dryer_power",
"name": "Dryer",
"icon": "mdi:tumble-dryer"
},
{
"entity": "sensor.tv_speakers_pc_home_assistant_router_relay_security_hub_power",
"name": "TV, speakers, PC, Home Assistant, router relay, security hub",
"icon": "mdi:television"
},
{
"entity": "sensor.water_heater_oven_stove_guest_suite_garage_all_other_power",
"name": "Water heater, oven & stove, guest suite, garage, all other",
"icon": "mdi:water-boiler"
},
{
"entity": "sensor.office_desk_computer_monitor_cooler_fish_tank_power",
"name": "Office desk, computer & monitor, cooler, fish tank",
"icon": "mdi:desktop-tower-monitor"
},
{
"entity": "sensor.phone_chargers_power",
"name": "Phone chargers",
"icon": "mdi:cellphone-charging"
},
{
"entity": "sensor.sensors_power",
"name": "Sensors",
"icon": "mdi:motion-sensor"
},
{
"entity": "sensor.paludarium_picture_frame_camera_power",
"name": "Paludarium, picture frame, camera",
"icon": "mdi:fishbowl"
},
{
"entity": "sensor.all_standby_power",
"name": "Standby",
"icon": "mdi:power-standby"
}
],
"filter": {
"exclude": [
{
"state": "<5"
},
{
"state": "un*"
}
]
},
"sort": {
"method": "state",
"numeric": true,
"reverse": true
}
},
{
"type": "markdown",
"content": "**Power** shows the current electricity usage across the home, while **energy** shows electricity usage over time.\nEnergy shows todays usage by default, but you can change the day or time period using the controls shown.\n\nPower and energy is tracked in the groups shown based on sensors and logic.\n<details><summary><i>Noteworthy groups</i></summary>\n\n- *Water heater, oven & stove, guest suite, garage, all other*\nComponents of this group could not be directly tracked, so the group is derived from total reported usage at the inverter minus all other tracked usage.\n\n- *Standby*\nThe total estimated power usage of all devices in standby. This total is only shown for reference as each components power is already included in other groups. When the standby power drops it is because a component is no longer in standby mode.\n</details>",
"card_mod": {
"style": {
"ha-markdown$": "summary {\n background: var(--primary-background-color);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 12px;\n width: 180px;\n border-radius: var(--ha-card-border-radius);\n border: 1.5px solid var(--accent-color);\n}\nsummary, summary i {\n padding-left: 10px;\n}\nspan {\n text-shadow: 0px 0px 2px var(--accent-color);\n}"
}
}
}
],
"column_span": 1
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Energy",
"heading_style": "subtitle",
"icon": "mdi:lightning-bolt"
},
{
"type": "energy-distribution"
},
{
"type": "energy-date-selection"
},
{
"type": "energy-usage-graph"
},
{
"type": "energy-devices-detail-graph"
}
],
"column_span": 1
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Costs",
"heading_style": "subtitle",
"icon": "mdi:currency-usd"
},
{
"type": "custom:mod-card",
"card_mod": {
"style": "ha-card {\n background: var(--ha-card-background);\n border: var(--ha-card-border-width) solid var(--divider-color);\n padding: 10px;\n}"
},
"card": {
"type": "custom:auto-entities",
"card": {
"type": "vertical-stack"
},
"card_param": "cards",
"filter": {
"template": "{% set total_cost_modifier = 10 %} [{% set items = [\n {'entity': 'total', 'name': 'Total', 'icon': 'home-lightning-bolt', 'state': states(\"sensor.total_energy_cost_weekly\") | float(0)},\n {'entity': 'electricity_provider_service', 'name': 'Electricity provider service', 'icon': 'factory', 'state': states(\"sensor.electricity_provider_service_energy_cost_weekly\") | float(0)},\n {'entity': 'lights', 'name': 'Lights', 'icon': 'lightbulb-group', 'state': states(\"sensor.lights_energy_cost_weekly\") | float(0)},\n {'entity': 'living_room_aircon', 'name': 'Living room aircon', 'icon': 'air-conditioner', 'state': states(\"sensor.living_room_aircon_energy_cost_weekly\") | float(0)},\n {'entity': 'dining_room_aircon', 'name': 'Dining room aircon', 'icon': 'air-conditioner', 'state': states(\"sensor.dining_room_aircon_energy_cost_weekly\") | float(0)},\n {'entity': 'bedroom_aircon', 'name': 'Bedroom aircon', 'icon': 'air-conditioner', 'state': states(\"sensor.bedroom_aircon_energy_cost_weekly\") | float(0)},\n {'entity': 'office_heater', 'name': 'Office heater', 'icon': 'radiator', 'state': states(\"sensor.office_heater_energy_cost_weekly\") | float(0)},\n {'entity': 'nursery_heater', 'name': 'Nursery heater', 'icon': 'radiator', 'state': states(\"sensor.nursery_heater_energy_cost_weekly\") | float(0)},\n {'entity': 'fans', 'name': 'Fans', 'icon': 'fan', 'state': states(\"sensor.fans_energy_cost_weekly\") | float(0)},\n {'entity': 'humidifiers', 'name': 'Humidifiers', 'icon': 'air-humidifier', 'state': states(\"sensor.humidifiers_energy_cost_weekly\") | float(0)},\n {'entity': 'kitchen_appliances', 'name': 'Kitchen appliances', 'icon': 'kettle-pour-over', 'state': states(\"sensor.kitchen_appliances_energy_cost_weekly\") | float(0)},\n {'entity': 'dishwasher', 'name': 'Dishwasher', 'icon': 'dishwasher', 'state': states(\"sensor.dishwasher_energy_cost_weekly\") | float(0)},\n {'entity': 'fridge', 'name': 'Fridge', 'icon': 'fridge', 'state': states(\"sensor.fridge_energy_cost_weekly\") | float(0)},\n {'entity': 'freezer_mini_fridge_routers', 'name': 'Freezer, mini fridge, routers', 'icon': 'fridge-industrial', 'state': states(\"sensor.freezer_mini_fridge_routers_energy_cost_weekly\") | float(0)},\n {'entity': 'washer', 'name': 'Washer', 'icon': 'washing-machine', 'state': states(\"sensor.washer_energy_cost_weekly\") | float(0)},\n {'entity': 'dryer', 'name': 'Dryer', 'icon': 'tumble-dryer', 'state': states(\"sensor.dryer_energy_cost_weekly\") | float(0)},\n {'entity': 'tv_speakers_pc_home_assistant_router_relay_security_hub', 'name': 'TV, speakers, PC, Home Assistant, router relay, security hub', 'icon': 'television', 'state': states(\"sensor.tv_speakers_pc_home_assistant_router_relay_security_hub_energy_cost_weekly\") | float(0)},\n {'entity': 'water_heater_oven_stove_guest_suite_garage_all_other', 'name': 'Water heater, oven & stove, guest suite, garage, all other', 'icon': 'water-boiler', 'state': states(\"sensor.water_heater_oven_stove_guest_suite_garage_all_other_energy_cost_weekly\") | float(0)},\n {'entity': 'office_desk_computer_monitor_cooler_fish_tank', 'name': 'Office desk, computer & monitor, cooler, fish tank', 'icon': 'desktop-tower-monitor', 'state': states(\"sensor.office_desk_computer_monitor_cooler_fish_tank_energy_cost_weekly\") | float(0)},\n {'entity': 'phone_chargers', 'name': 'Phone chargers', 'icon': 'cellphone-charging', 'state': states(\"sensor.phone_chargers_energy_cost_weekly\") | float(0)},\n {'entity': 'sensors', 'name': 'Sensors', 'icon': 'motion-sensor', 'state': states(\"sensor.sensors_energy_cost_weekly\") | float(0)},\n {'entity': 'paludarium_picture_frame_camera', 'name': 'Paludarium, picture frame, camera', 'icon': 'fishbowl', 'state': states(\"sensor.paludarium_picture_frame_camera_energy_cost_weekly\") | float(0)},\n {'entity': 'standby', 'name': 'Standby', 'icon': 'power-standby', 'state': states(\"sensor.standby_energy_cost_weekly\") | float(0)},\n] | sort(attribute='state', reverse=true) %} {% for item in items %} {% set good_cost_per_hour = 0.01 * (total_cost_modifier if item.entity == \"total\" else 1) %} {% set ok_cost_per_hour = 0.05 * (total_cost_modifier if item.entity == \"total\" else 1) %} {% set bad_cost_per_hour = 0.5 * (total_cost_modifier if item.entity == \"total\" else 1) %} {{{\n 'type': 'markdown',\n 'content': '<ha-icon icon=\"mdi:' + item.icon + '\"></ha-icon>&emsp;' + item.name,\n 'card_mod': {\n 'style': {\n '.': \"ha-card {\"\n \"background: none;\"\n \"border: none;\"\n \"margin-top: -10px;\"\n \"margin-bottom: -20px;\"\n \"margin-left: -10px;\"\n \"}\"\n ,\n 'ha-markdown$': \"ha-markdown-element p {\"\n \"white-space: nowrap;\"\n \"overflow: hidden;\"\n \"text-overflow: ellipsis;\"\n \"}\"\n }\n }\n}}},\n{{{\n 'type': 'horizontal-stack',\n 'cards': [\n {\n 'type': 'custom:mini-graph-card',\n 'entities': [\n 'sensor.' + item.entity + '_energy_cost_yearly',\n {\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_yearly',\n 'color': 'darkgreen',\n },\n ],\n 'hours_to_show': 8760,\n 'points_per_hour': 0.002,\n 'min_bound_range': 0.5,\n 'lower_bound': -0.1,\n 'update_interval': 3600,\n 'animate': true,\n 'font_size': 50,\n 'decimals': 1 if states('sensor.' + item.entity + '_energy_cost_yearly')|float(0) < 10 else 0,\n 'unit': ' ',\n 'group': true,\n 'align_state': 'center',\n 'color_thresholds': [\n { 'value': 0, 'color': '#0066cc' },\n { 'value': good_cost_per_hour * 8760, 'color': '#c1bb3c' },\n { 'value': ok_cost_per_hour * 8760, 'color': '#ff8100' },\n { 'value': bad_cost_per_hour * 8760, 'color': '#ff4d00' },\n ],\n 'show': {\n 'icon': false,\n 'name': false,\n 'points': false,\n 'legend': false,\n 'labels': false,\n },\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: var(--rgb-card-background-color);\"\n \"max-height: 40px;\"\n \"z-index: 1;\"\n \"} .states {\"\n \"padding: 3px 0 0 0;\"\n \"} .state:before {\"\n \"content: '$';\"\n \"} .state:after {\"\n \"content: '/year';\"\n \"}\"\n }\n },\n {\n 'type': 'custom:mini-graph-card',\n 'entities': [\n 'sensor.' + item.entity + '_energy_cost_monthly',\n {\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_monthly',\n 'color': 'darkgreen',\n },\n ],\n 'hours_to_show': 720,\n 'points_per_hour': 0.03,\n 'min_bound_range': 0.5,\n 'lower_bound': -0.1,\n 'update_interval': 3600,\n 'animate': true,\n 'font_size': 50,\n 'decimals': 1 if states('sensor.' + item.entity + '_energy_cost_monthly')|float(0) < 10 else 0,\n 'unit': ' ',\n 'group': true,\n 'align_state': 'center',\n 'color_thresholds': [\n { 'value': 0, 'color': '#0066cc' },\n { 'value': good_cost_per_hour * 720, 'color': '#c1bb3c' },\n { 'value': ok_cost_per_hour * 720, 'color': '#ff8100' },\n { 'value': bad_cost_per_hour * 720, 'color': '#ff4d00' },\n ],\n 'show': {\n 'icon': false,\n 'name': false,\n 'points': false,\n 'legend': false,\n 'labels': false,\n },\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: var(--rgb-card-background-color);\"\n \"max-height: 40px;\"\n \"z-index: 1;\"\n \"} .states {\"\n \"padding: 3px 0 0 0;\"\n \"} .state:before {\"\n \"content: '$';\"\n \"} .state:after {\"\n \"content: '/month';\"\n \"}\"\n }\n },\n {\n 'type': 'custom:mini-graph-card',\n 'entities': [\n 'sensor.' + item.entity + '_energy_cost_weekly',\n {\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_weekly',\n 'color': 'darkgreen',\n },\n ],\n 'hours_to_show': 168,\n 'points_per_hour': 0.1,\n 'min_bound_range': 0.5,\n 'lower_bound': -0.1,\n 'update_interval': 3600,\n 'animate': true,\n 'font_size': 50,\n 'decimals': 1 if states('sensor.' + item.entity + '_energy_cost_weekly')|float(0) < 10 else 0,\n 'unit': ' ',\n 'group': true,\n 'align_state': 'center',\n 'color_thresholds': [\n { 'value': 0, 'color': '#0066cc' },\n { 'value': good_cost_per_hour * 168, 'color': '#c1bb3c' },\n { 'value': ok_cost_per_hour * 168, 'color': '#ff8100' },\n { 'value': bad_cost_per_hour * 168, 'color': '#ff4d00' },\n ],\n 'show': {\n 'icon': false,\n 'name': false,\n 'points': false,\n 'legend': false,\n 'labels': false,\n },\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: var(--rgb-card-background-color);\"\n \"max-height: 40px;\"\n \"z-index: 1;\"\n \"} .states {\"\n \"padding: 3px 0 0 0;\"\n \"} .state:before {\"\n \"content: '$';\"\n \"} .state:after {\"\n \"content: '/week';\"\n \"}\"\n }\n },\n {\n 'type': 'custom:mini-graph-card',\n 'entities': [\n 'sensor.' + item.entity + '_energy_cost_today',\n {\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_today',\n 'color': 'darkgreen',\n },\n ],\n 'hours_to_show': max(now().hour, 1),\n 'points_per_hour': 20 / max(now().hour, 1),\n 'min_bound_range': 0.5,\n 'lower_bound': -0.1,\n 'update_interval': 60,\n 'animate': true,\n 'font_size': 50,\n 'decimals': 1 if states('sensor.' + item.entity + '_energy_cost_today')|float(0) < 10 else 0,\n 'unit': ' ',\n 'group': true,\n 'align_state': 'center',\n 'color_thresholds': [\n { 'value': 0, 'color': '#0066cc' },\n { 'value': good_cost_per_hour * 24, 'color': '#c1bb3c' },\n { 'value': ok_cost_per_hour * 24, 'color': '#ff8100' },\n { 'value': bad_cost_per_hour * 24, 'color': '#ff4d00' },\n ],\n 'show': {\n 'icon': false,\n 'name': false,\n 'points': false,\n 'legend': false,\n 'labels': false,\n },\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: var(--rgb-card-background-color);\"\n \"border: 1px solid var(--light-primary-color);\"\n \"max-height: 40px;\"\n \"z-index: 1;\"\n \"} .states {\"\n \"padding: 3px 0 0 0;\"\n \"} .state:before {\"\n \"content: '$';\"\n \"} .state:after {\"\n \"content: 'today';\"\n \"}\"\n }\n },\n {\n 'type': 'custom:mini-graph-card',\n 'entities': [\n 'sensor.' + item.entity + '_power_cost',\n {\n 'entity': 'sensor.' + item.entity + '_power_cost_savings',\n 'color': 'darkgreen',\n },\n ],\n 'hours_to_show': 1,\n 'points_per_hour': 20,\n 'min_bound_range': 0.5,\n 'lower_bound': -0.1,\n 'update_interval': 10,\n 'animate': true,\n 'font_size': 50,\n 'decimals': 1 if states('sensor.' + item.entity + '_power_cost')|float(0) < 10 else 0,\n 'unit': ' ',\n 'group': true,\n 'align_state': 'center',\n 'color_thresholds': [\n { 'value': 0, 'color': '#0066cc' },\n { 'value': good_cost_per_hour, 'color': '#c1bb3c' },\n { 'value': ok_cost_per_hour, 'color': '#ff8100' },\n { 'value': bad_cost_per_hour, 'color': '#ff4d00' },\n ],\n 'show': {\n 'icon': false,\n 'name': false,\n 'points': false,\n 'legend': false,\n 'labels': false,\n },\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: var(--rgb-card-background-color);\"\n \"border: 1px solid var(--light-primary-color);\"\n \"max-height: 40px;\"\n \"z-index: 1;\"\n \"} .states {\"\n \"padding: 3px 0 0 0;\"\n \"} .state:before {\"\n \"content: '$';\"\n \"} .states > .state:after {\"\n \"content: '/h now';\"\n }\n }\n ]\n}}},\n{{{\n 'type': 'horizontal-stack',\n 'cards': [\n {\n 'type': 'custom:button-card',\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_yearly',\n 'state_display': \"[[[ return '$<b>' + parseFloat(entity.state).toFixed(parseFloat(entity.state) < 10 ? 1 : 0) + '</b> saved' ]]]\",\n 'show_state': true,\n 'show_name': false,\n 'show_icon': false,\n 'show_units': true,\n 'styles': {\n 'card': [{\n 'font-size': '7px',\n 'color': 'white',\n 'background': 'darkgreen',\n 'margin-top': '-30px',\n 'padding-top': '25px',\n 'padding-bottom': '4px',\n 'height': '32px',\n }]\n }\n },\n {\n 'type': 'custom:button-card',\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_monthly',\n 'state_display': \"[[[ return '$<b>' + parseFloat(entity.state).toFixed(parseFloat(entity.state) < 10 ? 1 : 0) + '</b> saved' ]]]\",\n 'show_state': true,\n 'show_name': false,\n 'show_icon': false,\n 'show_units': true,\n 'styles': {\n 'card': [{\n 'font-size': '7px',\n 'color': 'white',\n 'background': 'darkgreen',\n 'margin-top': '-30px',\n 'padding-top': '25px',\n 'padding-bottom': '4px',\n 'height': '32px',\n }]\n }\n },\n {\n 'type': 'custom:button-card',\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_weekly',\n 'state_display': \"[[[ return '$<b>' + parseFloat(entity.state).toFixed(parseFloat(entity.state) < 10 ? 1 : 0) + '</b> saved' ]]]\",\n 'show_state': true,\n 'show_name': false,\n 'show_icon': false,\n 'show_units': true,\n 'styles': {\n 'card': [{\n 'font-size': '7px',\n 'color': 'white',\n 'background': 'darkgreen',\n 'margin-top': '-30px',\n 'padding-top': '25px',\n 'padding-bottom': '4px',\n 'height': '32px',\n }]\n }\n },\n {\n 'type': 'custom:button-card',\n 'entity': 'sensor.' + item.entity + '_energy_cost_savings_today',\n 'state_display': \"[[[ return '$<b>' + parseFloat(entity.state).toFixed(parseFloat(entity.state) < 10 ? 1 : 0) + '</b> saved' ]]]\",\n 'show_state': true,\n 'show_name': false,\n 'show_icon': false,\n 'show_units': true,\n 'styles': {\n 'card': [{\n 'font-size': '7px',\n 'color': 'white',\n 'background': 'darkgreen',\n 'margin-top': '-30px',\n 'padding-top': '25px',\n 'padding-bottom': '4px',\n 'height': '32px',\n }]\n }\n },\n {\n 'type': 'custom:button-card',\n 'entity': 'sensor.' + item.entity + '_power_cost_savings',\n 'state_display': \"[[[ return 'saving $<b>' + parseFloat(entity.state).toFixed(parseFloat(entity.state) < 10 ? 1 : 0) + '</b>/h' ]]]\",\n 'show_state': true,\n 'show_name': false,\n 'show_icon': false,\n 'show_units': true,\n 'styles': {\n 'card': [{\n 'font-size': '7px',\n 'color': 'white',\n 'background': 'darkgreen',\n 'margin-top': '-30px',\n 'padding-top': '25px',\n 'padding-bottom': '4px',\n 'height': '32px',\n }]\n }\n },\n ]\n}}}, {% if not loop.last %} {{{\n 'type' : 'entities',\n 'entities': [{\n 'type': 'divider',\n 'style': {\n 'margin': '-15px -26px 0 -26px',\n 'height': ('5' if loop.first else '1') + 'px !important',\n } \n }],\n 'card_mod': {\n 'style':\n \"ha-card {\"\n \"background: none;\"\n \"margin-bottom: -40px;\"\n \"}\"\n }\n}}}, {% endif %} {% endfor %}]"
}
}
},
{
"type": "vertical-stack",
"cards": [
{
"type": "markdown",
"content": "**Energy costs** are determined by the energy's source (grid and/or solar). The energy used is multiplied by the **grid rates** shown below, where the proportion of grid and solar energy contributes to costs and savings respectively. **Savings** represent how much extra would have needed to be spent if the solar system had never been installed.\n\n- *Yearly, monthly, and weekly* costs/savings are rolling totals, so a change indicates more/less usage than the previous period. As solar was only recently installed, the yearly value will increase until a year has past.\n- *Todays* costs/savings reset to $0 at midnight.\n- *Real-time* costs/savings are based on current power usage if it would be maintained for an hour.\n\nThe graphs show how costs change over their respective time periods, and are colour coded by <font color=#0066cc>low</font>, <font color=#c1bb3c>moderate</font>, and <font color=#ff4d00>high</font> costs. Likewise, the savings for that time period are also plotted in <font color=darkgreen>green</font>.\n\nGroups are shown in order of highest to lowest weekly cost.\n\n<details><summary><i>Noteworthy groups</i></summary>\n\n- *Total*\nCosts include fixed daily electricity provider costs, and savings include reimbursement for exported energy.\n\n- *Electricity provider service*\nThe fixed daily service costs charged by the provider, totalled per timeframe.\n\n- *Water heater, oven & stove, guest suite, garage, all other*\nComponents of this group could not be directly tracked, so the group is derived from total reported usage at the inverter minus all other tracked usage.\n\n- *Standby*\nTotal estimated costs and savings of all devices in standby. This total is only shown for reference as each component is already included in other groups.\n</details>\n\n**Daily averages** for solar produced, exported, and stored, as well as each variety of consumption are calculated since installation of the relevant component(s). Over time this will account for seasonal variation. These values indicate if the amount of solar generation and/or battery capacity is appropriate, and are also used to calculate the **return on investment** (details below).\n\n<details><summary><i>Return on investment</i></summary>\n\nThe **return on investment** section below includes a calculation for a battery as if it had already been installed. This is shown to help justify the decision to get one installed ASAP.\n\nIt is also useful to compare projected savings (minus install costs) with likely returns if the funds spent on installing the solar system had instead been invested at 6% per annum.\nIf savings are sufficiently high then eventually they will outweight the likely returns from standard investments (shown in years required to **beat investment in**). If -100 years is shown this indicates that investment always outperforms as compounding accelerates.\n\nNote that these **return on investment** figures ignore the increase in house value the solar system provides, which would likely cover all or most of the install costs and justify the installation from day 1.\n</details>\n\nThe **grid if used** rate is the current total cost per kWh if energy is consumed from the grid. The **saving with solar/battery** values show how much is currently being saved by using energy from those sources instead of the grid. The standard **grid rates** should be adjusted to match those specified by the energy provider.",
"card_mod": {
"style": {
"ha-markdown$": "font {\n text-shadow: 0.5px 0.5px 0.5px var(--primary-text-color), 0 0 2px var(--rgb-card-background-color), 0 0 5px var(--rgb-card-background-color);\n}\nsummary {\n background: var(--primary-background-color);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 12px;\n width: 180px;\n border-radius: var(--ha-card-border-radius);\n border: 1.5px solid var(--accent-color);\n}\nsummary, summary i {\n padding-left: 10px;\n}\nspan {\n text-shadow: 0px 0px 2px var(--accent-color);\n}"
}
}
},
{
"type": "glance",
"title": "Daily energy averages",
"entities": [
{
"entity": "sensor.average_daily_solar_production",
"name": "Production"
},
{
"entity": "sensor.average_daily_solar_export",
"name": "Solar export"
},
{
"entity": "sensor.average_daily_battery_export",
"name": "Battery export"
},
{
"entity": "sensor.average_daily_solar_storage",
"name": "Storage"
},
{
"entity": "sensor.average_daily_energy_consumption",
"name": "Total used"
},
{
"entity": "sensor.average_daily_solar_consumption",
"name": "Solar used"
},
{
"entity": "sensor.average_daily_battery_consumption",
"name": "Battery used"
},
{
"entity": "sensor.average_daily_grid_consumption",
"name": "Grid used"
}
],
"columns": 4,
"card_mod": {
"style": {
".entity$": {
".": "div:not(.name) {\n font-size: 12px !important;\n}\nstate-badge {\n margin: -3px !important;\n --mdc-icon-size: 30px !important;\n}\n"
}
}
}
},
{
"type": "entities",
"title": "Return on investment",
"entities": [
{
"type": "section",
"label": "Total"
},
{
"entity": "sensor.solar_and_battery_return_on_investment",
"name": "Savings (minus install cost)"
},
{
"entity": "sensor.solar_and_battery_years_to_break_even",
"name": "Break even in"
},
{
"entity": "sensor.solar_and_battery_years_to_beat_investment",
"name": "Beat investment in"
},
{
"type": "section",
"label": "Solar only"
},
{
"entity": "sensor.solar_return_on_investment",
"name": "Savings (minus install cost)"
},
{
"entity": "sensor.solar_years_to_break_even",
"name": "Break even in"
},
{
"entity": "sensor.solar_years_to_beat_investment",
"name": "Beat investment in"
},
{
"type": "section",
"label": "Battery only"
},
{
"entity": "sensor.battery_return_on_investment",
"name": "Would have saved (minus install cost)"
},
{
"entity": "sensor.battery_years_to_break_even",
"name": "Would break even in"
},
{
"entity": "sensor.battery_years_to_beat_investment",
"name": "Would beat investment in"
}
],
"card_mod": {
"style": {
".type-section$": ".divider {\n display: none;\n}\n"
}
}
},
{
"type": "entities",
"title": "Grid rates",
"entities": [
{
"entity": "sensor.grid_energy_cost_per_kwh",
"name": "Grid if used"
},
{
"entity": "sensor.savings_from_solar_per_kwh",
"name": "Saving with solar now"
},
{
"entity": "sensor.savings_from_battery_per_kwh",
"name": "Saving with battery now"
},
{
"type": "divider"
},
{
"entity": "input_number.energy_cost_first_100kwh_of_month",
"name": "<100kWh"
},
{
"entity": "input_number.energy_cost_after_first_100kwh_of_month",
"name": ">100kWh"
},
{
"entity": "input_number.energy_cost_controlled_load",
"name": "Controlled load"
},
{
"entity": "input_number.energy_cost_green_power",
"name": "Green surcharge"
},
{
"entity": "input_number.energy_cost_service",
"name": "Service"
},
{
"entity": "input_number.energy_export_price",
"name": "Export"
}
]
}
]
}
],
"column_span": 2
}
],
"max_columns": 2,
"title": "Electricity",
"icon": "mdi:lightning-bolt",
"dense_section_placement": true,
"cards": []
},
{
"title": "Plants",
"path": "plants",
"icon": "mdi:grass",
"type": "sections",
"sections": [
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Plants",
"heading_style": "subtitle",
"icon": "mdi:grass",
"badges": [
{
"type": "entity",
"show_state": true,
"show_icon": true,
"entity": "sensor.texts",
"name": "Guide",
"state_content": "name",
"tap_action": {
"action": "navigate",
"navigation_path": "/lovelace/guide"
},
"icon": "mdi:text-box"
}
],
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 0px) and (max-width: 767px)"
}
]
},
{
"type": "heading",
"heading": "Plants",
"heading_style": "subtitle",
"icon": "mdi:grass",
"visibility": [
{
"condition": "screen",
"media_query": "(min-width: 768px)"
}
]
},
{
"type": "custom:auto-entities",
"card": {
"type": "glance",
"title": "Soil",
"state_color": false,
"columns": 4,
"card_mod": {
"style": {
".entity$": {
".": "div:not(.name) {\n font-size: 12px !important;\n}\nstate-badge {\n margin: -3px !important;\n --mdc-icon-size: 30px !important;\n}\n",
"state-badge$": "ha-state-icon[data-state=off] {\n color: color-mix(in srgb, var(--state-icon-color), red) !important;\n} ha-state-icon[data-state=on] {\n color: color-mix(in srgb, var(--state-icon-color), blue) !important;\n}\n"
}
}
}
},
"entities": [
{
"entity": "binary_sensor.soil_moist_entryway",
"name": "Entryway",
"icon": "mdi:door"
},
{
"entity": "binary_sensor.soil_moist_guest_suite",
"name": "Guest suite",
"icon": "mdi:washing-machine"
},
{
"entity": "binary_sensor.soil_moist_stairway",
"name": "Stairway",
"icon": "mdi:stairs"
},
{
"entity": "binary_sensor.soil_moist_back_deck",
"name": "Back deck",
"icon": "mdi:grill"
},
{
"entity": "binary_sensor.soil_moist_living_room",
"name": "Living room",
"icon": "mdi:sofa"
},
{
"entity": "binary_sensor.soil_moist_dining_room",
"name": "Dining room",
"icon": "mdi:table-chair"
},
{
"entity": "binary_sensor.soil_moist_bathroom",
"name": "Bathroom",
"icon": "mdi:shower-head"
},
{
"entity": "binary_sensor.soil_moist_office",
"name": "Office",
"icon": "mdi:desktop-classic"
}
],
"sort": {
"method": "state"
},
"filter": null
},
{
"type": "markdown",
"content": "A selection of (mostly) indoor plants that require manual watering are monitored with soil moisture sensors. These sensors give an indication of when different areas of the house or types of plants become dry.\n\nPlants are reported as dry if their moisture level measures below 30%.\n\nThe soil moisture sensors seem to provide quite a range of values depending on their position and the soil type. They have been calibrated, but if you notice the following please report to Dan so he can recalibrate:\n- a plant sensor is reporting dry when in fact the soil still feels moist\n- a plant sensor is reporting high moisture when in fact the soil feels dry"
},
{
"type": "history-graph",
"title": "Soil moisture history",
"hours_to_show": 240,
"refresh_interval": 0,
"entities": [
{
"entity": "sensor.soil_moisture_entryway",
"name": "Entryway"
},
{
"entity": "sensor.soil_moisture_guest_suite",
"name": "Guest suite"
},
{
"entity": "sensor.soil_moisture_stairway",
"name": "Stairway"
},
{
"entity": "sensor.soil_moisture_back_deck",
"name": "Back deck"
},
{
"entity": "sensor.soil_moisture_living_room",
"name": "Living room"
},
{
"entity": "sensor.soil_moisture_dining_room",
"name": "Dining room"
},
{
"entity": "sensor.soil_moisture_bathroom",
"name": "Bathroom"
},
{
"entity": "sensor.soil_moisture_office",
"name": "Office"
}
]
}
]
},
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Garden",
"heading_style": "subtitle",
"icon": "mdi:sprout"
},
{
"type": "entities",
"title": "Watering",
"show_header_toggle": false,
"entities": [
{
"type": "custom:template-entity-row",
"entity": "switch.front_and_back_side_water",
"name": "Front & back side",
"icon": "mdi:grass",
"secondary": "{% from 'custom_templates.jinja' import next_water %}{{ next_water('front_and_back_side') }}",
"toggle": true
},
{
"type": "custom:template-entity-row",
"entity": "switch.ferns_water",
"name": "Ferns",
"icon": "mdi:palm-tree",
"secondary": "{% from 'custom_templates.jinja' import next_water %}{{ next_water('ferns') }}",
"toggle": true
},
{
"type": "custom:template-entity-row",
"entity": "switch.back_fence_water",
"name": "Back fence",
"icon": "mdi:fence",
"secondary": "{% from 'custom_templates.jinja' import next_water %}{{ next_water('back_fence') }}",
"toggle": true
},
{
"type": "custom:template-entity-row",
"entity": "switch.vegetable_garden_water",
"name": "Vegetable garden",
"icon": "mdi:sprout",
"secondary": "{% from 'custom_templates.jinja' import next_water %}{{ next_water('vegetable_garden') }}",
"toggle": true
},
{
"type": "custom:template-entity-row",
"entity": "switch.lawn_water",
"name": "Lawn",
"icon": "mdi:wave",
"secondary": "{% from 'custom_templates.jinja' import next_water %}{{ next_water('lawn') }}",
"toggle": true
}
]
},
{
"type": "markdown",
"content": "These garden areas are watered automatically based on prior, current, and forecast weather conditions, as well as watering history, soil, and plant type.\n\nIn addition, you can manually water garden sections with the buttons above if you think it is necessary. Each manual watering session lasts for ≈10 minutes. It's best not to water more than one section at once as the water pressure is reduced (so not all plants will get enough water). You can also toggle automatic watering and rain delays below. A rain delay will delay automatic watering for 1 day.\n\nTo ensure adequate watering without wastage, it is recommended to periodically check the following:\n\n- move the lawn sprinkler to cover drier parts of the lawn\n- the plants look healthy and their soil feels sufficiently moist in each section\n- the taps to the automatic watering controllers are fully on\n- there are no leaks at the taps or connections to the watering controllers\n\nUnfortunately some of these controls can get stuck (e.g. watering buttons will stay on once they've finished, or pressed buttons will immediately revert and ignore the command). In these cases, you'll need to open the b-hyve app to make everything sync and work again."
},
{
"type": "entities",
"title": "Automatic watering",
"show_header_toggle": false,
"entities": [
{
"entity": "switch.side_tap_smart_watering_program",
"name": "Side tap",
"icon": "mdi:water-pump"
},
{
"entity": "switch.back_tap_smart_watering_program",
"name": "Back tap",
"icon": "mdi:water-pump"
}
],
"layout_options": {
"grid_columns": 2,
"grid_rows": "auto"
}
},
{
"type": "entities",
"title": "Rain delay",
"show_header_toggle": false,
"entities": [
{
"entity": "switch.side_tap_rain_delay",
"name": "Side tap",
"icon": "mdi:weather-rainy"
},
{
"entity": "switch.back_tap_rain_delay",
"name": "Back tap",
"icon": "mdi:weather-rainy"
}
],
"layout_options": {
"grid_columns": 2,
"grid_rows": "auto"
}
},
{
"type": "history-graph",
"title": "Days since watered history",
"hours_to_show": 240,
"refresh_interval": 0,
"entities": [
{
"entity": "sensor.front_and_back_side_days_since_watered",
"name": "Front & back side"
},
{
"entity": "sensor.ferns_days_since_watered",
"name": "Ferns"
},
{
"entity": "sensor.back_fence_days_since_watered",
"name": "Back fence"
},
{
"entity": "sensor.vegetable_garden_days_since_watered",
"name": "Vegetable garden"
},
{
"entity": "sensor.lawn_days_since_watered",
"name": "Lawn"
}
]
}
]
}
],
"max_columns": 4,
"cards": []
},
{
"title": "Guide",
"path": "guide",
"icon": "",
"cards": [],
"type": "sections",
"sections": [
{
"type": "grid",
"cards": [
{
"type": "heading",
"heading": "Guide",
"heading_style": "subtitle",
"icon": "mdi:text-box"
},
{
"type": "markdown",
"content": "This Home Assistant system is designed to operate as autonomously as possible, so you hopefully don't need to use manual controls very often.\n\nCurrently, the main tasks/devices that require manual control are:\n- setting the sleep scene when everyone is in bed\n- nursery light & fan\n- back deck light\n- bathroom vent fan\n- toilet light/vent fan\n- downstairs lights & aircon (except the entryway lights)\n\n\nFor everything else, this dashboard provides an overview of Home Assistant and some basic controls. You can also find additional details and controls in the [<ha-icon icon=\"mdi:thermometer\"></ha-icon>**Climate**](/lovelace/climate), [<ha-icon icon=\"mdi:lightbulb-variant\"></ha-icon>**Lights**](/lovelace/lights), [<ha-icon icon=\"mdi:cctv\"></ha-icon>**Presence**](/lovelace/presence), [<ha-icon icon=\"mdi:lightning-bolt\"></ha-icon>**Electricity**](/lovelace/electricity), and [<ha-icon icon=\"mdi:grass\"></ha-icon>**Plants**](/lovelace/plants) dashboards (navigate to these with the icons at the top of the screen).\n\nPressing on icons or text will show relevant history graphs and/or controls. Anything with an <span>orange border</span> will show something different when pressed - usually a collection of other relevant information.\n\n<center><h3>For more information, select a topic:</h3></center>\n<details><summary><i>Automatic control</i></summary>\n\n**Climate** and **lighting** settings are automatically adjusted based on time, room occupancy, temperatures, illuminance, and various other factors. The system will transition between **scenes** throughout the day - these scenes are general categories for desired functionality. Settings for each scene are available in the other dashboards. The system will automatically switch between different scenes. You can also manually select a preferred scene.\n\nEach **scene** has a particular purpose:\n- ***Morning*** is designed to trigger before anyone wakes up (at the time specified in the settings here), providing dim kitchen lighting plus climate control to the whole house (rather than just the bedroom). Thus when anyone does get up it is to a comfortable temperature and sufficient lighting.\n- ***Day*** is triggered when ambient lighting in the house is sufficient, and thus turns off all lighting.\n- ***Night*** is triggered when there is insufficient lighting, turning on the main lights in the house. The brightness and colour temperature of all lighting adjusts as the night goes on, getting dimmer and warmer so as to reduce the impact to your circadian rhythm.\n- ***Sleep*** turns off all lighting in the house. If climate control is enabled, only the bedroom is monitored and controlled. This scene has to be manually triggered.\n- ***TV*** dims the lights for a nice viewing experience, automatically triggered when the TV is playing at Night.\n- ***Bright*** turns all lights on at full brightness and has to be manually triggered.\n- ***Away (Night/Day)*** turns off all lights (except one obvious one at night for security purposes) and disables climate control. Automatically triggered when both of us have left the house.\n</details>\n<details><summary><i>Manual control</i></summary>\n\nYou can manually control devices with their physical remotes/switches/buttons, or through this app.\nControls are provided for **lights**, **aircon**, **fans**, **heaters**, **humidifiers**, **door locks**, and the **garden watering system**. \n\nAutomatic controls should provide almost all the functionality you need, but manual control is of course useful when required.\n\nAutomatic control may be disabled when you manually adjust a device if there is a logic conflict. You can manually re-enable automatic control in this app, or disable control if you want to ensure the current device state is maintained.\n \n</details>\n<details><summary><i>Smart buttons</i></summary>\n\nThe **buttons** in the kitchen and bedroom will essentially toggle lighting when clicked, intelligently changing the scene based on the current conditions. The bedroom button also allows you to first switch from ***Night*** to ***Sleep*** while keeping the bedroom light on, then when clicked again it will turn the bedroom light off (properly entering ***Sleep***). Holding either button for a few seconds will toggle the aircon.\n</details>\n<details><summary><i>Voice control</i></summary>\n\nIn order to use Siri, you will need to add the following Siri shortcuts to your device: [Sleep Time](https://www.icloud.com/shortcuts/1c19b6e78b3c492d867cb63305bbfaa9), [Lights On Bright](https://www.icloud.com/shortcuts/d4bf116ae08c4d8a8290827f5c126010), [Lights On](https://www.icloud.com/shortcuts/7cb15602d0974ce1a897f422901acafd), [Lights Off](https://www.icloud.com/shortcuts/e424f0052a014954a71452d01a122167), [Aircon On](https://www.icloud.com/shortcuts/dab4081c117e4b8c8c0f3f5bff5b9a34), [Aircon Off](https://www.icloud.com/shortcuts/87e1dda3345f41f391c3030d09621655), [Enable Climate Control](https://www.icloud.com/shortcuts/19419fdeecea43b6914a420701fb7b35), [Disable Climate Control](https://www.icloud.com/shortcuts/f322c4c33abd45f5b2dd82281219b706), [Lock The Door](https://www.icloud.com/shortcuts/0e14667cabbd436aa2704a7fd31359b1), [Unlock The Door](https://www.icloud.com/shortcuts/27f357e7fdbd4293927259d4d4326b0d), [TV On](https://www.icloud.com/shortcuts/72c845af76b24ff28a965e34a07f7b6f).\n\n, or tell Siri/Google:\n- **\"lights on bright\"** for the *Bright* scene\n- **\"sleep time\"** for the *Sleep* scene\n\nIn order to use Google, you will need to connect your Google Assistant to IFTTT and add applets with webhooks to Home Assistant corresponding to each command.\n\nTODO: CHANGE ABOVE TO LIST OF QUOTES\nTODO: consider inbuilt LLM voice control?\n\n</details>",
"card_mod": {
"style": {
"ha-markdown$": "ha-icon {\n --mdc-icon-size: 12px;\n margin: 3px;\n} summary {\n background: var(--primary-background-color);\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 12px;\n width: 180px;\n border-radius: var(--ha-card-border-radius);\n border: 1.5px solid var(--accent-color);\n}\nsummary, summary i {\n padding-left: 10px;\n}\nspan {\n text-shadow: 0px 0px 2px var(--accent-color);\n}"
}
},
"layout_options": {
"grid_columns": "full"
}
}
],
"column_span": 2
}
],
"max_columns": 4
}
]
}
}
}