From f14814431c5b281f153588be09407b1a62ba9016 Mon Sep 17 00:00:00 2001 From: dfcarvajal Date: Sun, 4 Aug 2019 11:51:00 +0000 Subject: [PATCH] =?UTF-8?q?HACS=20-=20lovelace=20a=C3=B1adidos=20plugins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storage/lovelace | 1923 +++++++++++------ .../entity-attributes-card.js | 125 ++ .../entity-attributes-card.js.gz | Bin 0 -> 1277 bytes .../lovelace-auto-entities/auto-entities.js | 225 ++ .../auto-entities.js.gz | Bin 0 -> 1949 bytes .../lovelace-card-tools/card-tools.js | 428 ++++ .../lovelace-card-tools/card-tools.js.gz | Bin 0 -> 4107 bytes .../lovelace-layout-card/layout-card.js | 194 ++ .../lovelace-layout-card/layout-card.js.gz | Bin 0 -> 1715 bytes .../multiple-entity-row.js | 203 ++ .../multiple-entity-row.js.gz | Bin 0 -> 1900 bytes .../slider-entity-row.js | 53 + .../slider-entity-row.js.gz | Bin 0 -> 2068 bytes .../xiaomi-vacuum-card.js | 221 ++ .../xiaomi-vacuum-card.js.gz | Bin 0 -> 2004 bytes .../mini-media-player/mini-media-player.js | 1 + .../mini-media-player/mini-media-player.js.gz | Bin 0 -> 20613 bytes .../secondaryinfo-entity-row.js | 56 + .../secondaryinfo-entity-row.js.gz | Bin 0 -> 779 bytes .../vertical-stack-in-card.js | 176 ++ .../vertical-stack-in-card.js.gz | Bin 0 -> 1826 bytes www/lovelace/home/xiaomi_vacuum_02.jpg | Bin 0 -> 6524 bytes www/plugins/lovelace-auto-entities | 1 - www/plugins/lovelace-card-modder | 1 - www/plugins/lovelace-card-tools | 1 - www/plugins/lovelace-fold-entity-row | 1 - www/plugins/lovelace-layout-card | 1 - 27 files changed, 2965 insertions(+), 645 deletions(-) create mode 100644 www/community/entity-attributes-card/entity-attributes-card.js create mode 100644 www/community/entity-attributes-card/entity-attributes-card.js.gz create mode 100644 www/community/lovelace-auto-entities/auto-entities.js create mode 100644 www/community/lovelace-auto-entities/auto-entities.js.gz create mode 100644 www/community/lovelace-card-tools/card-tools.js create mode 100644 www/community/lovelace-card-tools/card-tools.js.gz create mode 100644 www/community/lovelace-layout-card/layout-card.js create mode 100644 www/community/lovelace-layout-card/layout-card.js.gz create mode 100644 www/community/lovelace-multiple-entity-row/multiple-entity-row.js create mode 100644 www/community/lovelace-multiple-entity-row/multiple-entity-row.js.gz create mode 100644 www/community/lovelace-slider-entity-row/slider-entity-row.js create mode 100644 www/community/lovelace-slider-entity-row/slider-entity-row.js.gz create mode 100644 www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js create mode 100644 www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js.gz create mode 100644 www/community/mini-media-player/mini-media-player.js create mode 100644 www/community/mini-media-player/mini-media-player.js.gz create mode 100644 www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js create mode 100644 www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js.gz create mode 100644 www/community/vertical-stack-in-card/vertical-stack-in-card.js create mode 100644 www/community/vertical-stack-in-card/vertical-stack-in-card.js.gz create mode 100644 www/lovelace/home/xiaomi_vacuum_02.jpg delete mode 160000 www/plugins/lovelace-auto-entities delete mode 160000 www/plugins/lovelace-card-modder delete mode 160000 www/plugins/lovelace-card-tools delete mode 160000 www/plugins/lovelace-fold-entity-row delete mode 160000 www/plugins/lovelace-layout-card diff --git a/.storage/lovelace b/.storage/lovelace index 74080fc..68d4dff 100644 --- a/.storage/lovelace +++ b/.storage/lovelace @@ -3,24 +3,52 @@ "config": { "resources": [ { - "type": "js", - "url": "/local/plugins/lovelace-card-modder/card-modder.js?v=1" + "type": "module", + "url": "/community_plugin/mini-media-player/mini-media-player.js" }, { "type": "js", - "url": "/local/plugins/lovelace-card-tools/card-tools.js?v=1" + "url": "/community_plugin/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js" }, { "type": "js", - "url": "/local/plugins/lovelace-auto-entities/auto-entities.js?v=1" + "url": "/community_plugin/lovelace-slider-entity-row/slider-entity-row.js" }, { "type": "js", - "url": "/local/plugins/lovelace-fold-entity-row/fold-entity-row.js?v=1" + "url": "/community_plugin/lovelace-layout-card/layout-card.js" }, { "type": "js", - "url": "/local/plugins/lovelace-layout-card/layout-card.js?v=1" + "url": "/community_plugin/lovelace-multiple-entity-row/multiple-entity-row.js" + }, + { + "type": "js", + "url": "/community_plugin/secondaryinfo-entity-row/secondaryinfo-entity-row.js" + }, + { + "type": "js", + "url": "/community_plugin/entity-attributes-card/entity-attributes-card.js" + }, + { + "type": "js", + "url": "/community_plugin/vertical-stack-in-card/vertical-stack-in-card.js" + }, + { + "type": "js", + "url": "/community_plugin/lovelace-card-tools/card-tools.js" + }, + { + "type": "js", + "url": "/community_plugin/monster-card/monster-card.js" + }, + { + "type": "js", + "url": "/community_plugin/lovelace-fold-entity-row/fold-entity-row.js" + }, + { + "type": "js", + "url": "/community_plugin/lovelace-auto-entities/auto-entities.js" } ], "title": "Hogar", @@ -29,195 +57,424 @@ "badges": [], "cards": [ { - "entities": [ + "cards": [ { - "entity": "sensor.qubino_zmnhtdx_smart_meter_s4_s5_s6_power", - "name": "Consumo el\u00e9ctrico" + "entities": [ + { + "entity": "sensor.qubino_zmnhtdx_smart_meter_s4_s5_s6_power", + "name": "Consumo El\u00e9ctrico" + }, + { + "entities": [ + "sensor.temperatura_salon", + "sensor.temperatura_exterior", + { + "entities": [ + "sensor.temperatura_salon", + "sensor.temperatura_exterior" + ], + "hours_to_show": 96, + "type": "custom:hui-history-graph-card" + } + ], + "head": "sensor.temperatura_salon", + "type": "custom:fold-entity-row" + }, + { + "entity": "fan.xiaomi_miio_device_2", + "name": "Purificador de Aire", + "primary": { + "entity": "binary_sensor.popp_smoke_detector_and_siren_sensor", + "name": "Calidad del Aire" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "sensor.openweather_coslada", + "name": "Tiempo Exterior" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "sensor.wireless_router_archer_c7_kbyte_sec_received", + "name": "kbytes/sec recibidos" + }, + { + "entity": "sensor.wireless_router_archer_c7_kbyte_sec_sent", + "name": "kbytes/sec enviados" + } + ], + "hours_to_show": 2, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "sensor.wireless_router_archer_c7_kbyte_sec_received", + "hide_state": true, + "name": "Tranferencia", + "primary": { + "entity": "sensor.wireless_router_archer_c7_kbyte_sec_received", + "name": "Recibido" + }, + "secondary": { + "entity": "sensor.wireless_router_archer_c7_kbyte_sec_sent", + "name": "Enviado" + }, + "type": "custom:multiple-entity-row" + }, + "type": "custom:fold-entity-row" + } + ], + "type": "entities" }, { - "entity": "sensor.temperatura_salon" + "card": { + "title": "Luces Encendidas & Desactivadas", + "type": "entities" + }, + "filter": { + "exclude": [ + { + "options": { + "secondary_info": "last-changed", + "tap_action": { + "action": "toggle" + } + }, + "state": "off" + } + ], + "include": [ + { + "domain": "light" + } + ] + }, + "show_empty": false, + "type": "custom:auto-entities" }, { - "entity": "sensor.temperatura_exterior" + "card": { + "title": "Movimiento Activo", + "type": "entities" + }, + "filter": { + "include": [ + { + "entity_id": "binary_sensor.mov*", + "options": { + "secondary_info": "last-changed" + }, + "state": "on" + } + ] + }, + "show_empty": false, + "type": "custom:auto-entities" + }, + "break", + { + "entities": [ + { + "entities": [ + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_pasillo_entrada" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_pasillo_entrada", + "name": "Entrada", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_cocina" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_cocina", + "name": "Cocina", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_salon_entrada" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_salon_entrada", + "name": "Entrada Sal\u00f3n", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_principal" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_principal", + "name": "H. Principal", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_noha" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_noha", + "name": "H. Noha", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_mia" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_mia", + "name": "H. Mia", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_estudio" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_estudio", + "name": "H. Estudio", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_pasillo_habitaciones" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_pasillo_habitaciones", + "name": "P. Habitaciones", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + } + ], + "head": { + "label": "Movimientos", + "type": "section" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + { + "entities": [ + "binary_sensor.puerta_entrada" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.puerta_entrada", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.puerta_tendedero" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.puerta_tendedero", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + } + ], + "head": { + "label": "Puertas", + "type": "section" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entity": "cover.persiana_habitacion_principal", + "name": "Principal" + }, + { + "entity": "cover.persiana_habitacion_noha", + "name": "Noha" + }, + { + "entity": "cover.persiana_habitacion_mia", + "name": "Mia" + }, + { + "entity": "cover.persiana_habitacion_estudio", + "name": "Estudio" + }, + { + "entity": "cover.persiana_salon_fase_dos", + "name": "Fase Dos" + }, + { + "entity": "cover.persiana_salon_piscina", + "name": "Piscina" + } + ], + "group_config": { + "type": "custom:slider-entity-row" + }, + "head": { + "label": "Persianas", + "type": "section" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entity": "switch.general_luces", + "icon": "mdi:lightbulb", + "name": "Luces" + }, + { + "entity": "switch.general_persianas", + "icon": "mdi:plus-circle-multiple-outline", + "name": "Persianas" + }, + { + "entity": "switch.sonoffuv1", + "icon": "mdi:power-socket-eu", + "name": "Varios1" + }, + { + "entity": "switch.sonoffuv2", + "icon": "mdi:power-socket-eu", + "name": "Varios2" + }, + { + "entity": "switch.sonoffhumedos", + "icon": "mdi:power-socket-eu", + "name": "H\u00famedos" + }, + { + "entity": "switch.sonoffhorno", + "icon": "mdi:stove", + "name": "Horno" + }, + { + "entity": "switch.general_caldera", + "icon": "mdi:radiator", + "name": "Caldera" + }, + { + "entity": "switch.sonofflavavajillas", + "icon": "mdi:amplifier", + "name": "Lavavajillas" + }, + { + "entity": "switch.sonofflavadora", + "icon": "mdi:amplifier", + "name": "Lavavadora" + }, + { + "entity": "switch.coche_electrico", + "icon": "mdi:car", + "name": "Coche" + } + ], + "head": { + "label": "Interruptores Generales", + "type": "section" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "title": "Variados", + "type": "entities" + }, + { + "entity": "media_player.grupo_altavoces", + "type": "custom:mini-media-player" } ], - "show_header_toggle": false, - "title": "Estados", - "type": "entities" - }, - { - "entities": [ - "light.luz_tendedero", - "light.luz_cocina", - "light.luz_salon_entrada", - "light.luz_salon_entrada_ambilight", - "light.luz_salon_television", - "light.luz_salon_television_ambilight", - "light.luz_pasillo_bano", - "light.luz_pasillo_estudio", - "light.luz_pasillo_salon", - "light.luz_habitacion_estudio", - "light.luz_habitacion_principal", - "light.luz_habitacion_mia", - "light.luz_habitacion_noha", - "switch.light_led_cabecero" - ], - "name": "Luces", - "show_empty": false, - "state_filter": [ - "on", - "unavailable" - ], - "type": "entity-filter" - }, - { - "entities": [ - "binary_sensor.movimiento_pasillo_entrada", - "binary_sensor.movimiento_cocina", - "binary_sensor.movimiento_salon_entrada", - "binary_sensor.movimiento_habitacion_principal", - "binary_sensor.movimiento_habitacion_noha", - "binary_sensor.movimiento_habitacion_mia", - "binary_sensor.movimiento_habitacion_estudio", - "binary_sensor.movimiento_pasillo_habitaciones" - ], - "name": "Movimiento", - "show_empty": false, - "state_filter": [ - "on" - ], - "type": "entity-filter" - }, - { - "entities": [ - { - "entity": "binary_sensor.puerta_entrada", - "name": "Entrada" - }, - { - "entity": "binary_sensor.puerta_tendedero", - "name": "Tendedero" - } - ], - "title": "Puertas", - "type": "history-graph" - }, - { - "entities": [ - { - "entity": "binary_sensor.movimiento_pasillo_entrada", - "name": "Entrada" - }, - { - "entity": "binary_sensor.movimiento_cocina", - "name": "Cocina" - }, - { - "entity": "binary_sensor.movimiento_salon_entrada", - "name": "Entrada Sal\u00f3n" - }, - { - "entity": "binary_sensor.movimiento_habitacion_principal", - "name": "H. Principal" - }, - { - "entity": "binary_sensor.movimiento_habitacion_noha", - "name": "H. Noha" - }, - { - "entity": "binary_sensor.movimiento_habitacion_mia", - "name": "H. Mia" - }, - { - "entity": "binary_sensor.movimiento_habitacion_estudio", - "name": "H. Estudio" - }, - { - "entity": "binary_sensor.movimiento_pasillo_habitaciones", - "name": "Pasillo H." - } - ], - "hours to show": 1, - "title": "Movimientos", - "type": "history-graph" - }, - { - "entities": [ - "cover.persiana_habitacion_principal", - "cover.persiana_habitacion_noha", - "cover.persiana_habitacion_mia", - "cover.persiana_habitacion_estudio", - "cover.persiana_salon_fase_dos", - "cover.persiana_salon_piscina" - ], - "name": "Persianas", - "type": "entities" - }, - { - "columns": 5, - "entities": [ - { - "entity": "switch.general_luces", - "icon": "mdi:lightbulb", - "name": "Luces" - }, - { - "entity": "switch.general_persianas", - "icon": "mdi:plus-circle-multiple-outline", - "name": "Persianas" - }, - { - "entity": "switch.sonoffuv1", - "icon": "mdi:power-socket-eu", - "name": "Varios1" - }, - { - "entity": "switch.sonoffuv2", - "icon": "mdi:power-socket-eu", - "name": "Varios2" - }, - { - "entity": "switch.sonoffhumedos", - "icon": "mdi:power-socket-eu", - "name": "H\u00famedos" - }, - { - "entity": "switch.sonoffhorno", - "icon": "mdi:stove", - "name": "Horno" - }, - { - "entity": "switch.general_caldera", - "icon": "mdi:radiator", - "name": "Caldera" - }, - { - "entity": "switch.sonofflavavajillas", - "icon": "mdi:amplifier", - "name": "Lavavajillas" - }, - { - "entity": "switch.sonofflavadora", - "icon": "mdi:amplifier", - "name": "Lavavadora" - }, - { - "entity": "switch.coche_electrico", - "icon": "mdi:car", - "name": "Coche" - } - ], - "show_name": true, - "show_state": false, - "title": "Interruptores Generales", - "type": "glance" - }, - { - "entity": "media_player.musica_en_casa", - "type": "media-control" + "layout": "vertical", + "type": "custom:layout-card" } ], "icon": "mdi:home", + "panel": true, "path": "default_view", "title": "Estado" }, @@ -225,41 +482,55 @@ "badges": [], "cards": [ { - "entities": [ - { - "entity": "light.luz_pasillo_salon" + "buttons": true, + "entity": "vacuum.xiaomi_vacuum_cleaner", + "image": "/local/lovelace/home/xiaomi_vacuum_02.jpg", + "labels": { + "battery": "Bater\u00eda", + "filter": "Filtro", + "main_brush": "Cepillo Principal", + "mode": "Modo", + "sensor": "Sensor", + "side_brush": "Cepillo Lateral", + "status": "Estado" + }, + "name": "Xiaomi Vacuum", + "type": "custom:xiaomi-vacuum-card" + }, + { + "card": { + "head": { + "label": "Luces", + "type": "section" }, - { - "entity": "light.luz_pasillo_estudio" - }, - { - "entity": "light.luz_pasillo_bano" - } - ], - "type": "entities" + "type": "custom:fold-entity-row" + }, + "filter": { + "include": [ + { + "entity_id": "light.luz_pasillo*" + } + ] + }, + "type": "custom:auto-entities" }, { "entities": [ { - "entity": "vacuum.xiaomi_vacuum_cleaner" + "entities": [ + { + "entity": "sensor.wifi_opengateway_esp32" + }, + { + "entity": "sensor.opengateway_lora" + } + ], + "head": { + "entity": "binary_sensor.openmqttgateway" + }, + "type": "custom:fold-entity-row" } ], - "title": "Aspiradora", - "type": "entities" - }, - { - "entities": [ - { - "entity": "binary_sensor.openmqttgateway" - }, - { - "entity": "sensor.wifi_opengateway_esp32" - }, - { - "entity": "sensor.opengateway_lora" - } - ], - "show_header_toggle": false, "type": "entities" } ], @@ -273,57 +544,114 @@ { "entities": [ { - "entity": "light.luz_habitacion_principal_entrada", - "name": "Entrada" - }, - { - "entity": "light.luz_habitacion_principal", - "name": "Techo" - }, - { - "entity": "binary_sensor.luz_habitacion_principal_nightlight" - }, - { - "entity": "light.luz_cabecero_habitacion_principal", - "name": "Cabecero" + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_principal" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_principal", + "name": "Movimiento", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" } ], - "show_header_toggle": true, - "title": "Luces", + "show_header_toggle": false, "type": "entities" }, { "entities": [ { - "entity": "cover.persiana_habitacion_principal" - }, - { - "entity": "input_boolean.control_persiana_habitacion_principal" + "entities": [ + { + "entity": "binary_sensor.luz_habitacion_principal_techo_nightlight", + "name": "Modo Noche" + }, + { + "entity": "input_boolean.luz_habitacion_principal_techo_noche", + "name": "Deshabilitar la luz para dormir" + }, + { + "entity": "timer.luzhabitacionprincipal", + "name": "Temporizador" + }, + { + "entity": "light.luz_habitacion_principal_entrada", + "name": "Luz Entrada" + }, + { + "entity": "light.luz_habitacion_principal_cabecero", + "name": "Luz Cabecero" + } + ], + "head": { + "entity": "light.luz_habitacion_principal_techo", + "name": "Luz Techo" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Persiana ", "type": "entities" }, { - "cards": [ + "entities": [ { "entities": [ { - "entity": "switch.philio_technology_corporation_pan03_switch_module_with_meter_3_kw_x1_switch", - "icon": "mdi:television", - "name": "Televisi\u00f3n" + "entity": "input_boolean.control_persiana_habitacion_principal", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianahabitacionprincipal", + "name": "Temporizador" } ], - "show_header_toggle": false, - "type": "entities" + "head": { + "entity": "cover.persiana_habitacion_principal", + "name": "Persiana", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" }, { - "entity": "media_player.hab_padres", - "type": "media-control" + "entity": "binary_sensor.ventana_habitacion_principal_pequena", + "name": "Ventana Peque\u00f1a" + }, + { + "entity": "binary_sensor.ventana_habitacion_principal_grande", + "name": "Ventana Grande" } ], - "type": "vertical-stack" + "show_header_toggle": false, + "type": "entities" + }, + { + "artwork": "cover", + "entity": "media_player.hab_padres", + "hide": { + "power": true, + "power_state": true + }, + "shortcuts": { + "buttons": [ + { + "data": { + "entity_id": "switch.philio_technology_corporation_pan03_switch_module_with_meter_3_kw_x1_switch" + }, + "icon": "mdi:power", + "id": "switch.toggle", + "type": "service" + } + ], + "columns": 4 + }, + "type": "custom:mini-media-player" } ], "icon": "mdi:home-plus", @@ -334,55 +662,93 @@ "badges": [], "cards": [ { - "entities": [ + "cards": [ { - "entity": "binary_sensor.movimiento_habitacion_noha", - "name": null - } + "entities": [ + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_noha" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_noha", + "name": "Movimiento", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "binary_sensor.luz_habitacion_noha_nightlight", + "name": "Modo Noche" + }, + { + "entity": "input_boolean.luz_habitacion_noha_noche", + "name": "Deshabilitar la luz para dormir" + }, + { + "entity": "timer.luzhabitacionnoha", + "name": "Temporizador" + } + ], + "head": { + "entity": "light.luz_habitacion_noha", + "name": "Luz Techo" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "input_boolean.control_persiana_habitacion_noha", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianahabitacionnoha", + "name": "Temporizador" + } + ], + "head": { + "entity": "cover.persiana_habitacion_noha", + "name": "Persiana", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" + }, + { + "entity": "binary_sensor.ventana_habitacion_noha", + "name": "Ventana" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + "break" ], - "hours_to_show": 1, - "type": "history-graph" - }, - { - "entities": [ - { - "entity": "light.luz_habitacion_noha", - "name": "Luz Principal" - }, - { - "entity": "binary_sensor.luz_habitacion_noha_nightlight", - "name": "Modo Noche" - }, - { - "entity": "input_boolean.luz_habitacion_noha_noche", - "name": "Deshabilitar la luz para dormir" - }, - { - "entity": "timer.luzhabitacionnoha", - "name": "Temporizador" - } - ], - "show_header_toggle": false, - "title": "Luces", - "type": "entities" - }, - { - "entities": [ - { - "entity": "cover.persiana_habitacion_noha", - "name": "Persiana" - }, - { - "entity": "input_boolean.control_persiana_habitacion_noha", - "name": "Activar el control autom\u00e1tico" - } - ], - "show_header_toggle": false, - "title": "Persiana", - "type": "entities" + "layout": "vertical", + "type": "custom:layout-card" } ], "icon": "mdi:home-floor-1", + "panel": true, "path": "habnoha", "title": "Habitaci\u00f3n Noha" }, @@ -392,27 +758,79 @@ { "entities": [ { - "entity": "light.luz_habitacion_mia" - }, - { - "entity": "binary_sensor.luz_habitacion_mia_nightlight" + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_mia" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_mia", + "name": "Movimiento", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Luz", "type": "entities" }, { "entities": [ { - "entity": "cover.persiana_habitacion_mia" - }, - { - "entity": "input_boolean.control_persiana_habitacion_mia" + "entities": [ + { + "entity": "binary_sensor.luz_habitacion_mia_nightlight", + "name": "Modo Noche" + }, + { + "entity": "input_boolean.luz_habitacion_mia_noche", + "name": "Deshabilitar la luz para dormir" + }, + { + "entity": "timer.luzhabitacionmia", + "name": "Temporizador" + } + ], + "head": { + "entity": "light.luz_habitacion_mia", + "name": "Luz Techo" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "input_boolean.control_persiana_habitacion_mia", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianahabitacionmia", + "name": "Temporizador" + } + ], + "head": { + "entity": "cover.persiana_habitacion_mia", + "name": "Persiana", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" + }, + { + "entity": "binary_sensor.ventana_habitacion_mia", + "name": "Ventana" } ], "show_header_toggle": false, - "title": "Persiana", "type": "entities" } ], @@ -426,43 +844,80 @@ { "entities": [ { - "entity": "light.luz_habitacion_estudio" - }, - { - "entity": "binary_sensor.luz_habitacion_estudio_nightlight" + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_habitacion_estudio" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_habitacion_estudio", + "name": "Movimiento", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Luces", "type": "entities" }, { "entities": [ { - "entity": "cover.persiana_habitacion_estudio" - }, - { - "entity": "input_boolean.control_persiana_habitacion_estudio" + "entities": [ + { + "entity": "binary_sensor.luz_habitacion_estudio_nightlight", + "name": "Modo Noche" + }, + { + "entity": "input_boolean.luz_habitacion_estudio_estudiar", + "name": "Activar el control Autom\u00e1tico" + }, + { + "entity": "timer.luzhabitacionestudio", + "name": "Temporizador" + } + ], + "head": { + "entity": "light.luz_habitacion_estudio", + "name": "Luz Techo" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Persiana", "type": "entities" }, { "entities": [ { - "entity": "switch.xiaomi_miio_switch", - "name": "Regleta" + "entities": [ + { + "entity": "input_boolean.control_persiana_habitacion_estudio", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianahabitacionestudio", + "name": "Temporizador" + } + ], + "head": { + "entity": "cover.persiana_habitacion_estudio", + "name": "Persiana", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" + }, + { + "entity": "binary_sensor.ventana_habitacion_estudio", + "name": "Ventana" } ], "show_header_toggle": false, - "title": "Enchufes", "type": "entities" - }, - { - "entity": "media_player.home_salon", - "type": "media-control" } ], "icon": "mdi:home-floor-3", @@ -473,164 +928,270 @@ "badges": [], "cards": [ { - "entities": [ + "cards": [ { - "entity": "sensor.wireless_router_archer_c7_kbyte_sec_received", - "name": "kbytes/sec recibidos" + "entities": [ + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_salon_entrada" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_salon_entrada", + "name": "Movimiento Entrada", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_salon_television" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_salon_television", + "name": "Movimiento Televisi\u00f3n", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" }, { - "entity": "sensor.wireless_router_archer_c7_kbyte_sec_sent", - "name": "kbytes/sec enviados" + "entities": [ + { + "entities": [ + { + "entity": "binary_sensor.luz_salon_entrada_nightlight", + "name": "Modo Noche" + }, + { + "entity": "light.luz_salon_entrada_ambilight", + "name": "Luz de Ambiente" + }, + { + "entity": "timer.luzsalonentrada", + "name": "Temporizador" + } + ], + "head": { + "entity": "light.luz_salon_entrada", + "name": "Luz Entrada" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + { + "entity": "binary_sensor.luz_salon_television_nightlight", + "name": "Modo Noche" + }, + { + "entity": "light.luz_salon_television_ambilight", + "name": "Luz de Ambiente" + }, + { + "entity": "timer.luzsalontelevision", + "name": "Temporizador" + } + ], + "head": { + "entity": "light.luz_salon_television", + "name": "Luz Televisi\u00f3n" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "input_boolean.control_persiana_salon_fase_dos", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianafasedos", + "name": "Temporizador" + } + ], + "head": { + "entity": "cover.persiana_salon_fase_dos", + "name": "Persiana Fase Dos", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" + }, + { + "entity": "binary_sensor.ventana_salon_fase_dos_grande", + "name": "Ventana Fase Dos Grande" + }, + { + "entity": "binary_sensor.ventana_salon_fase_dos_pequena", + "name": "Ventana Fase Dos Peque\u00f1a" + }, + { + "entities": [ + { + "entity": "input_boolean.control_persiana_salon_piscina", + "name": "Activar el control autom\u00e1tico" + }, + { + "entity": "timer.persianapiscina", + "name": "Temporizador" + } + ], + "head": { + "entity": "cover.persiana_salon_piscina", + "name": "Persiana Fase Dos", + "type": "custom:slider-entity-row" + }, + "type": "custom:fold-entity-row" + }, + { + "entity": "binary_sensor.ventana_salon_piscina_grande", + "name": "Ventana Piscina Grande" + }, + { + "entity": "binary_sensor.ventana_salon_piscina_pequena", + "name": "Ventana Piscina Peque\u00f1a" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + "break", + { + "columns": 3, + "entities": [ + { + "entity": "script.apagar_encender_humidificador", + "icon": "mdi:power", + "name": "ON/OFF" + }, + { + "entity": "script.mas_humidificador", + "icon": "mdi:plus", + "name": "M\u00e1s" + }, + { + "entity": "script.menos_humidificador", + "icon": "mdi:minus", + "name": "Menos" + }, + { + "entity": "script.display_humidificador", + "icon": "mdi:television", + "name": "Display" + }, + { + "entity": "script.calentador_humidificador", + "icon": "mdi:radiator", + "name": "Calentador" + }, + { + "entity": "script.luz_humidificador", + "icon": "mdi:lightbulb-outline", + "name": "Luz" + }, + { + "entity": "script.control_humedad_humidificador", + "icon": "mdi:cloud-outline", + "name": "Humedad" + }, + { + "entity": "script.tiempo_humidificador", + "icon": "mdi:clock", + "name": "Tiempo" + }, + { + "entity": "script.niebla_humidificador", + "icon": "mdi:shower-head", + "name": "Fuerza Niebla" + } + ], + "show_state": false, + "title": "Humidificador", + "type": "glance" + }, + { + "entity": "plant.salon", + "name": "Plantas del sal\u00f3n", + "type": "plant-status" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "switch.greenwave_reality_inc_powernode_6_port_switch_5", + "name": "Purificador de Aire", + "primary": { + "entity": "sensor.greenwave_reality_inc_powernode_6_port_power_5", + "name": "Consumo" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "switch.greenwave_reality_inc_powernode_6_port_switch_6", + "name": "Purificador de Aire", + "primary": { + "entity": "sensor.greenwave_reality_inc_powernode_6_port_power_6", + "name": "Consumo" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "switch.xiaomi_strip_2", + "name": "Regleta Principal Mueble" + } + ], + "head": { + "label": "Interruptores", + "type": "section" + }, + "type": "custom:fold-entity-row" + } + ], + "type": "entities" + }, + { + "entities": [ + { + "entity": "media_player.television_salon", + "type": "custom:mini-media-player" + }, + { + "entity": "media_player.google_cast", + "type": "custom:mini-media-player" + } + ], + "type": "entities" } ], - "hours_to_show": 2, - "refresh_interval": 60, - "title": "Gr\u00e1fica de Transferencia (2 horas)", - "type": "history-graph" - }, - { - "entities": [ - { - "entity": "light.luz_salon_entrada" - }, - { - "entity": "light.luz_salon_entrada_ambilight" - }, - { - "entity": "binary_sensor.luz_salon_entrada_nightlight" - }, - { - "entity": "light.luz_salon_television" - }, - { - "entity": "light.luz_salon_television_ambilight" - }, - { - "entity": "binary_sensor.luz_salon_television_nightlight" - } - ], - "title": "Luces", - "type": "entities" - }, - { - "entities": [ - { - "entity": "cover.persiana_salon_fase_dos" - }, - { - "entity": "input_boolean.control_persiana_salon_fase_dos" - }, - { - "entity": "cover.persiana_salon_piscina" - }, - { - "entity": "input_boolean.control_persiana_salon_piscina" - } - ], - "show_header_toggle": false, - "title": "Persianas", - "type": "entities" - }, - { - "entity": "media_player.television_salon", - "type": "media-control" - }, - { - "entity": "media_player.google_cast", - "type": "media-control" - }, - { - "columns": 3, - "entities": [ - { - "entity": "script.apagar_encender_humidificador", - "icon": "mdi:power", - "name": "ON/OFF" - }, - { - "entity": "script.mas_humidificador", - "icon": "mdi:plus", - "name": "M\u00e1s" - }, - { - "entity": "script.menos_humidificador", - "icon": "mdi:minus", - "name": "Menos" - }, - { - "entity": "script.display_humidificador", - "icon": "mdi:television", - "name": "Display" - }, - { - "entity": "script.calentador_humidificador", - "icon": "mdi:radiator", - "name": "Calentador" - }, - { - "entity": "script.luz_humidificador", - "icon": "mdi:lightbulb-outline", - "name": "Luz" - }, - { - "entity": "script.control_humedad_humidificador", - "icon": "mdi:cloud-outline", - "name": "Humedad" - }, - { - "entity": "script.tiempo_humidificador", - "icon": "mdi:clock", - "name": "Tiempo" - }, - { - "entity": "script.niebla_humidificador", - "icon": "mdi:shower-head", - "name": "Fuerza Niebla" - } - ], - "show_state": false, - "title": "Humidificador", - "type": "glance" - }, - { - "entity": "fan.xiaomi_miio_device_2", - "hold_action": { - "action": "toggle" - }, - "name": "Purificador de Aire", - "tap_action": { - "action": "more-info" - }, - "type": "entity-button" - }, - { - "entity": "plant.salon", - "name": "Plantas del sal\u00f3n", - "type": "plant-status" - }, - { - "entities": [ - { - "entity": "switch.xiaomi_strip_2", - "name": "Regleta Principal Mueble" - } - ], - "show_header_toggle": false, - "title": "Interruptores", - "type": "entities" - }, - { - "entities": [ - "sensor.temperatura_salon", - "sensor.temperatura_exterior" - ], - "hours_to_show": 96, - "refresh_interval": 300, - "title": "Temperaturas", - "type": "history-graph" + "layout": "vertical", + "type": "custom:layout-card" } ], "icon": "mdi:sofa", + "panel": true, "path": "salon", "title": "Sal\u00f3n" }, @@ -640,59 +1201,91 @@ { "entities": [ { - "entity": "binary_sensor.popp_smoke_detector_and_siren_sensor", - "name": "Estado" - }, - { - "entity": "switch.popp_smoke_detector_and_siren_switch", - "icon": "mdi:surround-sound", - "name": "Activar" + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_cocina" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_cocina", + "name": "Movimiento", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Alarma de Humos", + "type": "entities" + }, + { + "entities": [ + { + "entities": [ + { + "entity": "binary_sensor.luz_cocina_nightlight", + "name": "Modo Noche" + }, + { + "entity": "timer.luzcocina", + "name": "Temporizador" + }, + { + "entity": "light.led_cocina", + "name": "Led Cocina" + }, + { + "entity": "light.luz_tendedero", + "name": "Luz Tendedero" + } + ], + "head": { + "entity": "light.luz_cocina", + "name": "Luz Techo" + }, + "type": "custom:fold-entity-row" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "entities": [ + { + "entity": "switch.popp_smoke_detector_and_siren_switch", + "icon": "mdi:surround-sound", + "name": "Alarma de Humos", + "primary": { + "entity": "binary_sensor.popp_smoke_detector_and_siren_sensor", + "name": "Estado" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "switch.everspring_an158_plug_in_meter_appliance_module_switch", + "icon": "mdi:weather-windy", + "name": "Campana Extractora", + "primary": { + "entity": "sensor.everspring_an158_plug_in_meter_appliance_module_power", + "name": "Actual" + }, + "secondary": { + "entity": "sensor.everspring_an158_plug_in_meter_appliance_module_energy", + "name": "Acumulado" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + } + ], "type": "entities" }, { "entity": "media_player.home_cocina", - "type": "media-control" - }, - { - "entities": [ - { - "entity": "light.luz_cocina" - }, - { - "entity": "binary_sensor.luz_cocina_nightlight" - }, - { - "entity": "light.led_cocina" - }, - { - "entity": "light.luz_tendedero" - } - ], - "show_header_toggle": false, - "title": "Luces", - "type": "entities" - }, - { - "entities": [ - { - "entity": "switch.everspring_an158_plug_in_meter_appliance_module_switch", - "name": "Campana Extractora" - }, - { - "entity": "sensor.everspring_an158_plug_in_meter_appliance_module_power", - "name": "Consumo Campana Extractora Actual" - }, - { - "entity": "sensor.everspring_an158_plug_in_meter_appliance_module_energy", - "name": "Consumo Campana Extractora Acumulado" - } - ], - "title": "Interruptores", - "type": "entities" + "type": "custom:mini-media-player" } ], "icon": "mdi:food-variant", @@ -706,47 +1299,56 @@ { "entities": [ { - "entity": "binary_sensor.movimiento_bano_general" + "entities": [ + { + "entities": [ + "binary_sensor.movimiento_bano_general" + ], + "hours_to_show": 1, + "type": "custom:hui-history-graph-card" + } + ], + "head": { + "entity": "binary_sensor.movimiento_bano_general", + "name": "Movimiento Ba\u00f1o General", + "secondary_info": "last-changed" + }, + "type": "custom:fold-entity-row" } ], "show_header_toggle": false, - "title": "Movimiento Ba\u00f1o General", "type": "entities" }, { "entities": [ { - "entity": "sensor.sonoffbanogeneral_status", - "name": "Estado Interruptores" + "entities": [ + { + "entity": "light.luz_bano_general_secundaria", + "name": "Luz Secundaria" + } + ], + "head": { + "entity": "light.luz_bano_general_principal", + "name": "Luz Ba\u00f1o General" + }, + "type": "custom:fold-entity-row" }, { - "entity": "light.luz_bano_general_principal", - "name": "Luz Principal" - }, - { - "entity": "light.luz_bano_general_secundaria", - "name": "Luz Secundaria" + "entities": [ + { + "entity": "light.luz_bano_principal_secundaria", + "name": "Luz Secundaria" + } + ], + "head": { + "entity": "light.luz_bano_principal_principal", + "name": "Luz Ba\u00f1o Principal" + }, + "type": "custom:fold-entity-row" } ], - "title": "Luces Ba\u00f1o General", - "type": "entities" - }, - { - "entities": [ - { - "entity": "sensor.sonoffbanoprincipal_status", - "name": "Estado Interruptores" - }, - { - "entity": "light.luz_bano_principal_principal", - "name": "Luz Principal" - }, - { - "entity": "light.luz_bano_principal_secundaria", - "name": "Luz Secundaria" - } - ], - "title": "Ba\u00f1o Principal", + "show_header_toggle": false, "type": "entities" } ], @@ -754,6 +1356,106 @@ "path": "banos", "title": "Ba\u00f1os" }, + { + "badges": [], + "cards": [ + { + "entities": [ + { + "entity": "sensor.refresh_xee", + "icon": "mdi:cookie", + "name": "Estado token XEE" + } + ], + "show_header_toggle": false, + "type": "entities" + }, + { + "cards": [ + { + "entities": [ + { + "entity": "sensor.citroen_fecha_update", + "name": "Hora de Actualizaci\u00f3n" + }, + { + "entity": "sensor.citroen_combustible", + "name": "Gasolina" + }, + { + "entity": "sensor.citroen_bateria", + "name": "Bater\u00eda" + }, + { + "entity": "sensor.citroen_velocidad", + "name": "Velocidad" + }, + { + "entity": "sensor.citroen_kilometros", + "name": "Kil\u00f3metros" + }, + { + "entity": "sensor.citroen_revoluciones", + "name": "Revoluciones por Minuto" + } + ], + "show_header_toggle": false, + "title": "Citroen 2220HVZ", + "type": "entities" + }, + { + "camera_image": "camera.posicion_citroen", + "entities": [], + "title": "Posici\u00f3n del Citroen", + "type": "picture-glance" + } + ], + "type": "vertical-stack" + }, + { + "cards": [ + { + "entities": [ + { + "entity": "sensor.smart_fecha_update", + "name": "Hora de Actualizaci\u00f3n" + }, + { + "entity": "sensor.smart_bateria", + "name": "Bater\u00eda" + }, + { + "entity": "sensor.smart_velocidad", + "name": "Velocidad" + }, + { + "entity": "sensor.smart_kilometros", + "name": "Kil\u00f3metros" + }, + { + "entity": "sensor.smart_revoluciones", + "name": "Revoluciones por Minuto" + } + ], + "show_header_toggle": false, + "title": "Smart 8343 GMF", + "type": "entities" + }, + { + "camera_image": "camera.posicion_smart", + "entities": [], + "title": "Posici\u00f3n del Smart", + "type": "picture-glance" + } + ], + "type": "vertical-stack" + } + ], + "icon": "mdi:car", + "panel": false, + "path": "vehiculos", + "title": "Vehiculos" + }, { "badges": [], "cards": [ @@ -1047,110 +1749,10 @@ "path": "consumos", "title": "Consumos" }, - { - "badges": [], - "cards": [ - { - "entities": [ - { - "entity": "sensor.refresh_xee", - "icon": "mdi:cookie", - "name": "Estado token XEE" - } - ], - "show_header_toggle": false, - "type": "entities" - }, - { - "cards": [ - { - "entities": [ - { - "entity": "sensor.citroen_fecha_update", - "name": "Hora de Actualizaci\u00f3n" - }, - { - "entity": "sensor.citroen_combustible", - "name": "Gasolina" - }, - { - "entity": "sensor.citroen_bateria", - "name": "Bater\u00eda" - }, - { - "entity": "sensor.citroen_velocidad", - "name": "Velocidad" - }, - { - "entity": "sensor.citroen_kilometros", - "name": "Kil\u00f3metros" - }, - { - "entity": "sensor.citroen_revoluciones", - "name": "Revoluciones por Minuto" - } - ], - "show_header_toggle": false, - "title": "Citroen 2220HVZ", - "type": "entities" - }, - { - "camera_image": "camera.posicion_citroen", - "entities": [], - "title": "Posici\u00f3n del Citroen", - "type": "picture-glance" - } - ], - "type": "vertical-stack" - }, - { - "cards": [ - { - "entities": [ - { - "entity": "sensor.smart_fecha_update", - "name": "Hora de Actualizaci\u00f3n" - }, - { - "entity": "sensor.smart_bateria", - "name": "Bater\u00eda" - }, - { - "entity": "sensor.smart_velocidad", - "name": "Velocidad" - }, - { - "entity": "sensor.smart_kilometros", - "name": "Kil\u00f3metros" - }, - { - "entity": "sensor.smart_revoluciones", - "name": "Revoluciones por Minuto" - } - ], - "show_header_toggle": false, - "title": "Smart 8343 GMF", - "type": "entities" - }, - { - "camera_image": "camera.posicion_smart", - "entities": [], - "title": "Posici\u00f3n del Smart", - "type": "picture-glance" - } - ], - "type": "vertical-stack" - } - ], - "icon": "mdi:car", - "panel": false, - "path": "vehiculos", - "title": "Vehiculos" - }, { "badges": [ - "binary_sensor.workday", - "binary_sensor.vacaciones", + "binary_sensor.trabajo", + "binary_sensor.colegio", "sun.sun", "sensor.db_size", "sensor.coste_ayer_tdh", @@ -1662,6 +2264,47 @@ "on" ], "type": "entity-filter" + }, + { + "entities": [ + { + "entity": "switch.greenwave_reality_inc_powernode_6_port_switch_5", + "name": "Purificador de Aire", + "primary": { + "entity": "sensor.greenwave_reality_inc_powernode_6_port_power_5", + "name": "Consumo" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "switch.greenwave_reality_inc_powernode_6_port_switch_6", + "name": "Humidificador", + "primary": { + "entity": "sensor.greenwave_reality_inc_powernode_6_port_power_6", + "name": "Consumo" + }, + "toggle": true, + "type": "custom:multiple-entity-row" + }, + { + "entity": "switch.xiaomi_strip_2", + "name": "Regleta Principal Mueble" + } + ], + "head": { + "label": "Interruptores", + "type": "section" + }, + "type": "custom:fold-entity-row" + }, + { + "entities": [ + "sensor.greenwave_reality_inc_powernode_6_port_power_5", + "sensor.greenwave_reality_inc_powernode_6_port_power_6" + ], + "hours to show": 96, + "type": "history-graph" } ], "icon": "mdi:alert-decagram", diff --git a/www/community/entity-attributes-card/entity-attributes-card.js b/www/community/entity-attributes-card/entity-attributes-card.js new file mode 100644 index 0000000..30a30ca --- /dev/null +++ b/www/community/entity-attributes-card/entity-attributes-card.js @@ -0,0 +1,125 @@ +class EntityAttributesCard extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: 'open' }); + } + + _getAttributes(hass, filters) { + function _filterName(stateObj, pattern) { + let parts; + let attr_id; + let attribute; + if (typeof (pattern) === "object") { + parts = pattern["key"].split("."); + attribute = pattern["key"]; + + } else { + parts = pattern.split("."); + attribute = pattern; + } + attr_id = parts[2]; + if (attr_id.indexOf('*') === -1) { + return stateObj == attribute; + } + const regEx = new RegExp(`^${attribute.replace(/\*/g, '.*')}$`, 'i'); + return stateObj.search(regEx) === 0; + } + const attributes = new Map(); + filters.forEach((filter) => { + const filters = []; + filters.push(stateObj => _filterName(stateObj, filter)); + Object.keys(hass.states).sort().forEach(key => { + Object.keys(hass.states[key].attributes).sort().forEach(attr_key => { + if (filters.every(filterFunc => filterFunc(`${key}.${attr_key}`))) { + attributes.set(`${key}.${attr_key}`, { + name: `${filter.name?filter.name:attr_key.replace(/_/g, ' ')}`, + value: `${hass.states[key].attributes[attr_key]} ${filter.unit||''}`.trim(), + }); + } + }); + }); + }); + return Array.from(attributes.values()); + } + + setConfig(config) { + if (!config.filter.include || !Array.isArray(config.filter.include)) { + throw new Error('Please define filters'); + } + + if (!config.heading_name) config.heading_name = 'Attributes'; + if (!config.heading_state) config.heading_state = 'States'; + + const root = this.shadowRoot; + if (root.lastChild) root.removeChild(root.lastChild); + + const cardConfig = Object.assign({}, config); + const card = document.createElement('ha-card'); + card.header = config.title; + const content = document.createElement('div'); + const style = document.createElement('style'); + style.textContent = ` + table { + width: 100%; + padding: 16px; + } + thead th { + text-align: left; + } + tbody tr:nth-child(odd) { + background-color: var(--paper-card-background-color); + } + tbody tr:nth-child(even) { + background-color: var(--secondary-background-color); + } + `; + content.innerHTML = ` + + + + + + + + + +
${config.heading_name}${config.heading_state}
+ `; + card.appendChild(style); + card.appendChild(content); + root.appendChild(card) + this._config = cardConfig; + } + + _updateContent(element, attributes) { + element.innerHTML = ` + + ${attributes.map((attribute) => ` + + ${attribute.name} + ${attribute.value} + + `).join('')} + `; + } + + set hass(hass) { + const config = this._config; + const root = this.shadowRoot; + + let attributes = this._getAttributes(hass, config.filter.include); + if (config.filter.exclude) { + const excludeAttributes = this._getAttributes(hass, config.filter.exclude).map(attr => attr.name); + attributes = attributes.filter(attr => { + return !excludeAttributes.includes(attr.name) + }); + } + this._updateContent(root.getElementById('attributes'), attributes); + } + + getCardSize() { + return 1; + } +} + +customElements.define('entity-attributes-card', EntityAttributesCard); diff --git a/www/community/entity-attributes-card/entity-attributes-card.js.gz b/www/community/entity-attributes-card/entity-attributes-card.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ee340d25ffb1d2eef6092f5c5cb4490dbdb972d GIT binary patch literal 1277 zcmV@rlVRUqIX<~JBWpgcKVRB?HYI6XcS4~snHWV{C?&E*si?e-1wnM9C?gX6_ScuscR5{CrqJ#Lp@cK3M42cqaA-~tl4U{R zYhpfBn#m|uDo)aeG$#BN@6ehPIz|C6C<{0230Et;f_K%EQcbF{^R@;Jdcs5+G zudmU7FP>?l2CWQaC7^33{&Db)ZU;}1Eb>g@K{N;_4YU!|gSVLar9w29^thOh@^_cj zNecn<4FDKE{`lk@UEf9-BXo1W#KEV)8a}%8O%_y@f+6R6K=gg+1ez=Xiq+i)gfjYy zzUub^&;L2wHB^zHMII*od^JQt1d^+>IlN^-W8t3MNYYp&DK^Zlo);EsgjaCIT--sHVr&n9*R(O$a;cHP;<53Vqb^FB;?^0{Bl%hLZmhXCxfDVC zZN5haD#J)}p>WtJ1pr^4qlAxe@D#P?_86Jy_PE)|J6q@r72EpjSEx6QZNKpRYzGXg z$c9cctL9-CcG!7&2&z$akZ8C^f)E35jS*n2xJZBh?7fd2ahoeMlPU-@Wj@^F_7dl% zW%rJU9v#c43N>;|mZ`V5AgJaM;MO?ovaY;((`AZI`Zw;)J?p%^5hC73OTpLJ^N`V0 z;;`+7;ImuKme~p?=Hc9{<8*3|qFULEC3#6GdV52smVGA86CcERky5GPucjXEgn$kn z{F&1jIu4=Bj8T`{uJ(*xT@6wilZ>rqIyNCXa0s;$v@JcD9OYnw(_>*yHID}qJD~T9 zT5zu5&P*6-X3JMNX+`M!2u7N^O|zVY1`m0&<}cKo>;pQ?6PS8703f0+Hb|mu#qh2g z)_T^CX(<3pcv9-|7$t&&&h@awK^l)V!Z}mF8#Ac@qS|a2ygBXgxFUV@Gq zQf+hk4uQFMB<3ShFx_t(NpqJR@gnz!&ud0hI!2cl7e7qAi9~du;P|Ivv)}fWwhw+i zCR)@e&cTgi7`sc=BUx~=MM{jBN=J!_5+}s(EsHq$wi3K#WR&oni!qeBz@t$S!`5M3 zJlcnZACLk)k9|apq~K-}i|zNM%$uNSze4dbD)jc`dHBk>c-qLkG7g)1t>sFIX{Yl5 zWO}wcP-xZFIb3}oYbvS-hHp=hzU?S-WgV80>!58~L5DyC+yQ+0hRwZPqcg13qjQ%vs_}wXNHBtt<-yM%NjRsjY;eH=$hM>#HNd@;u~iEizie zF3~n~vp3A&k0F`*YmW;bc^_tGL=V@E+&qk)dB$)6-obzOFgT$j*EmQ1kb1)Uvf>Yk2T~A&C4B5s2t4H4Xp(_ { +class AutoEntities extends cardTools.LitElement { + + setConfig(config) { + if(!config || !config.card) + throw new Error("Invalid configuration"); + + this._config = config; + this.data = {}; + + this.entities = this.get_entities() || []; + this.card = cardTools.createCard(Object.assign({entities: this.entities}, config.card)); + } + + + match(pattern, str){ + if (typeof(str) === "string" && typeof(pattern) === "string") { + if((pattern.startsWith('/') && pattern.endsWith('/')) || pattern.indexOf('*') !== -1) { + if(pattern[0] !== '/') { + pattern = pattern.replace(/\./g, '\.'); + pattern = pattern.replace(/\*/g, '.*'); + pattern = `/^${pattern}$/`; + } + var regex = new RegExp(pattern.substr(1).slice(0,-1)); + return regex.test(str); + } + } + if(typeof(pattern) === "string") { + if(pattern.indexOf(":") !== -1 && typeof(str) === "object") { + while(pattern.indexOf(":") !== -1) + { + str = str[pattern.split(":")[0]]; + pattern = pattern.substr(pattern.indexOf(":")+1, pattern.length); + } + } + if(pattern.startsWith("<=")) return parseFloat(str) <= parseFloat(pattern.substr(2)); + if(pattern.startsWith(">=")) return parseFloat(str) >= parseFloat(pattern.substr(2)); + if(pattern.startsWith("<")) return parseFloat(str) < parseFloat(pattern.substr(1)); + if(pattern.startsWith(">")) return parseFloat(str) > parseFloat(pattern.substr(1)); + if(pattern.startsWith("!")) return parseFloat(str) != parseFloat(pattern.substr(1)); + if(pattern.startsWith("=")) return parseFloat(str) == parseFloat(pattern.substr(1)); + } + return str === pattern; + } + + match_filter(hass, entities, filter) { + let retval = []; + let count = -1; + entities.forEach((i) => { + count++; + if(!hass.states) return; + const e = (typeof(i) === "string")?hass.states[i]:hass.states[i.entity]; + if(!e) return; + + let unmatched = false; + Object.keys(filter).forEach((filterKey) => { + const key = filterKey.split(" ")[0]; + const value = filter[filterKey]; + switch(key) { + case "options": + break; + case "domain": + if(!this.match(value, e.entity_id.split('.')[0])) + unmatched = true; + break; + case "state": + if(!this.match(value, e.state)) + unmatched = true; + break; + case "entity_id": + if(!this.match(value, e.entity_id)) + unmatched = true; + break; + case "name": + if(!e.attributes.friendly_name + || !this.match(value, e.attributes.friendly_name) + ) + unmatched = true; + break; + case "area": + let found = false; + this.data.areas.forEach((a) => { + if(found) return; + if(this.match(value, a.name)) { + this.data.devices.forEach((d) => { + if(found) return; + if(d.area_id && d.area_id === a.area_id) { + this.data.entities.forEach((en) => { + if(found) return; + if(en.device_id === d.id && en.entity_id === e.entity_id) { + found = true; + } + }); + } + }); + } + }); + if(!found) unmatched = true; + break; + case "group": + if(!value.startsWith("group.") + || !hass.states[value] + || !hass.states[value].attributes.entity_id + || !hass.states[value].attributes.entity_id.includes(e.entity_id) + ) + unmatched = true; + break; + case "attributes": + Object.keys(value).forEach((entityKey) => { + const k = entityKey.split(" ")[0]; + const v = value[entityKey]; + if(!e.attributes[k] + || !this.match(v, e.attributes[k]) + ) + unmatched = true; + }); + break; + default: + unmatched = true; + } + }); + if(!unmatched) retval.push(count); + }); + return retval; + } + + get_entities() + { + let entities = []; + if(this._config.entities) + this._config.entities.forEach((e) => entities.push(e)); + + if(this._hass && this._config.filter) { + + if(this._config.filter.include){ + this._config.filter.include.forEach((f) => { + const add = this.match_filter(this._hass, Object.keys(this._hass.states), f); + let toAdd = []; + add.forEach((i) => { + toAdd.push(Object.assign({entity: Object.keys(this._hass.states)[i]}, f.options)); + }); + toAdd.sort((a,b) => { + if (a.entity < b.entity) return -1; + if (a.entity > b.entity) return 1; + return 0; + }); + toAdd.forEach((i) => entities.push(i)); + }); + } + + if(this._config.filter.exclude) { + this._config.filter.exclude.forEach((f) => { + const remove = this.match_filter(this._hass, entities, f); + for(var i = remove.length-1; i >= 0; i--) + { + entities.splice(remove[i],1); + } + }); + } + } + return entities; + } + + createRenderRoot() { + return this; + } + render() { + if(this.entities.length === 0 && this._config.show_empty === false) + return cardTools.LitHtml``; + return cardTools.LitHtml` +
${this.card}
+ `; + } + + async get_data(hass) { + try { + this.data.areas = await hass.callWS({type: "config/area_registry/list"}); + this.data.devices = await hass.callWS({type: "config/device_registry/list"}); + this.data.entities = await hass.callWS({type: "config/entity_registry/list"}); + } catch (err) { + } + } + + _compare_arrays(a,b) { + if(a === b) return true; + if(a == null || b == null) return false; + if(a.length != b.length) return false; + for(var i = 0; i < a.length; i++) { + if(a[i] !== b[i]) { + return false; + } + } + return true; + } + + set hass(hass) { + this._hass = hass; + this.get_data(hass).then(() => { + if(this.card) + { + this.card.hass = this._hass; + } + + const oldEntities = this.entities.map((e) => e.entity); + this.entities = this.get_entities() || []; + const newEntities = this.entities.map((e) => e.entity); + + if(!this._compare_arrays(oldEntities, newEntities)) { + this.card.setConfig(Object.assign({entities: this.entities}, this._config.card)); + this.requestUpdate(); + } + }); + } + +} + +customElements.define('auto-entities', AutoEntities); +}); + +window.setTimeout(() => { + if(customElements.get('card-tools')) return; + customElements.define('auto-entities', class extends HTMLElement{ + setConfig() { throw new Error("Can't find card-tools. See https://github.com/thomasloven/lovelace-card-tools");} + }); +}, 2000); diff --git a/www/community/lovelace-auto-entities/auto-entities.js.gz b/www/community/lovelace-auto-entities/auto-entities.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..129f15cd650e617ac3664c0415bf8d65ac44c817 GIT binary patch literal 1949 zcmV;O2V(diiwFoS5jI@{|6z4>Z!KkRbZK;HWpgfSa{#qjZExE)5dQ98!3aeyHID4` zV;pBFx(prGp+MT9A6ze?CEDg9OCCkVF;e~a9VwC`CE0Ob78JEj-aYrix8UH%JXo$BI&PWK~oa@{Rp%8jAvPr_k)nbjPD0%a)q9HQG)Xvy(xHhopQ=4$q{+v zB#m<Ijy z^2y|fpbvR^aujqGCkjG_?8F42N~bED-Y#eYqy7q#@&M@+JV4d3-Y^N_0u5>l1hY=} zVlc`IsA6KfRAU+-Tx9GTL$da%s*IJzlK%A6a=?j@EX;@GpsgMo>NMww0KQHQw2>5k zvACyncH#W2D#~tVOCz-mH7d*~Qt1pLD%S!hIngYtV%?Kn?kktnrd0!fkey?qRvUN( znx@ft0?9lvZV-cK3u4HphRY(%w^UTWdm+xwND(Y3XMjxyA{L@p`sh?Qga`>tMpGX0mE>^1hJ78u)kZINcXC$ z!wdzll_79r`xu8vux3uM=G!j7p)@yWq1obN@&KKRr9j-Nz%fcFnpm0y;USuj`iIC= zSpNz-1=xDEb0fl)F~OD2#IH~w90uoZ40JlHbc#G5_Xei z+}EyC48qEaSPTg&-@5yBE(MiovPBuSvOvDdwzp)xfe;b|visC#D_PF<>pQ+q?(Uof z*q&GXmoa@nG@f`2Eby*gJeh0G@^T1sSCa0|7>)B?8p#AIx;lBV)<$u*)8E`?7*-H( zG37{Z%LpgQ=a2rAIP+d0ud;C{`$$HX6wbc8VFDkXUX507dkmiH2cJW<(*3iLs@Ld- zEWyPP;m9Y<+$)sYX|Ry%4On=K8N-mIWNtB$faR*rO-`swpqfN!ktCvc&-D*OYn?;{ zv5un?z|;3^9i;Z&61xa8nP!Dwr>D+sB!(R$FAeAL#m)|G+|GTY%_-GmfON4NICTM> z$XRQZ+(>huBiwXmzZ^7Dn3xI`el4t(7^}RMCGmCRQNV1|HQtzlu2cEgZUc^gPSD~~ zvi(MJy~b(28C{kE0~hA z_3qQ3?-fhs*V>cd>Gtc@Tb%Ye0^}IgdW7gBA!x<QTkgu{e&J(Cu j=}`PH9zD)#J}(%{^dg)wK(9xm5q$d(UgGs5)*Ao-Sh2e% literal 0 HcmV?d00001 diff --git a/www/community/lovelace-card-tools/card-tools.js b/www/community/lovelace-card-tools/card-tools.js new file mode 100644 index 0000000..364522c --- /dev/null +++ b/www/community/lovelace-card-tools/card-tools.js @@ -0,0 +1,428 @@ +customElements.define('card-tools', +class { + static get CUSTOM_TYPE_PREFIX() { return "custom:"} + static get version() { return "0.4"} + + static checkVersion(v) { + if (this.version < v) { + throw new Error(`Old version of card-tools found. Get the latest version of card-tools.js from https://github.com/thomasloven/lovelace-card-tools`); + } + } + + static deprecationWarning() { + if(window.cardTools_deprecationWarning) return; + console.warn("One or more of your lovelace plugins are using the functions cardTools.litElement(), cardTools.litHtml() or cardTools.hass(). Those are replaced with better alternatives and will be removed a some point in the future.") + console.warn("If you are a plugin developer, make sure you are using the new functions (see documentation)."); + console.warn("If you are a plugin user, feel free to ignore this warning (or poke the developer of your plugins - not me though, I already know about this).") + console.warn("Best regards / thomasloven - " + (document.currentScript && document.currentScript.src)); + window.cardTools_deprecationWarning = true; + } + + static get LitElement() { + if(customElements.get('home-assistant-main')) + return Object.getPrototypeOf(customElements.get('home-assistant-main')); + return Object.getPrototypeOf(customElements.get('hui-view')); + } + static litElement() { // Backwards compatibility - deprecated + this.deprecationWarning(); + return this.LitElement; + } + + static get LitHtml() { + return this.LitElement.prototype.html; + } + static litHtml() { // Backwards compatibility - deprecated + this.deprecationWarning(); + return this.LitHtml; + } + + static get LitCSS() { + return this.LitElement.prototype.css; + } + + static get hass() { + var hass = function() { // Backwards compatibility - deprecated + this.deprecationWarning(); + return hass; + } + for (var k in document.querySelector('home-assistant').hass) + hass[k] = document.querySelector('home-assistant').hass[k]; + hass.original = document.querySelector('home-assistant').hass; + return hass; + } + + static fireEvent(ev, detail, entity=null) { + ev = new Event(ev, { + bubbles: true, + cancelable: false, + composed: true, + }); + ev.detail = detail || {}; + if(entity) { + entity.dispatchEvent(ev); + } else { + var root = document.querySelector("home-assistant"); + root = root && root.shadowRoot; + root = root && root.querySelector("home-assistant-main"); + root = root && root.shadowRoot; + root = root && root.querySelector("app-drawer-layout partial-panel-resolver"); + root = root && root.shadowRoot || root; + root = root && root.querySelector("ha-panel-lovelace"); + root = root && root.shadowRoot; + root = root && root.querySelector("hui-root"); + root = root && root.shadowRoot; + root = root && root.querySelector("ha-app-layout #view"); + root = root && root.firstElementChild; + if (root) root.dispatchEvent(ev); + } + } + + static get lovelace() { + var root = document.querySelector("home-assistant"); + root = root && root.shadowRoot; + root = root && root.querySelector("home-assistant-main"); + root = root && root.shadowRoot; + root = root && root.querySelector("app-drawer-layout partial-panel-resolver"); + root = root && root.shadowRoot || root; + root = root && root.querySelector("ha-panel-lovelace") + root = root && root.shadowRoot; + root = root && root.querySelector("hui-root") + if (root) { + var ll = root.lovelace + ll.current_view = root.___curView; + return ll; + } + return null; + } + + static createThing(thing, config) { + const _createThing = (tag, config) => { + const element = document.createElement(tag); + try { + element.setConfig(config); + } catch (err) { + console.error(tag, err); + return _createError(err.message, config); + } + return element; + }; + + const _createError = (error, config) => { + return _createThing("hui-error-card", { + type: "error", + error, + config, + }); + }; + + if(!config || typeof config !== "object" || !config.type) + return _createError(`No ${thing} type configured`, config); + let tag = config.type; + if(config.error) { + const err = config.error; + delete config.error; + return _createError(err, config); + } + if(tag.startsWith(this.CUSTOM_TYPE_PREFIX)) + tag = tag.substr(this.CUSTOM_TYPE_PREFIX.length); + else + tag = `hui-${tag}-${thing}`; + + if(customElements.get(tag)) + return _createThing(tag, config); + + // If element doesn't exist (yet) create an error + const element = _createError( + `Custom element doesn't exist: ${tag}.`, + config + ); + element.style.display = "None"; + const timer = setTimeout(() => { + element.style.display = ""; + }, 2000); + // Remove error if element is defined later + customElements.whenDefined(tag).then(() => { + clearTimeout(timer); + this.fireEvent("ll-rebuild", {}, element); + }); + + return element; + } + + static createCard(config) { + return this.createThing("card", config); + } + + static createElement(config) { + return this.createThing("element", config); + } + + static createEntityRow(config) { + const SPECIAL_TYPES = new Set([ + "call-service", + "divider", + "section", + "weblink", + ]); + const DEFAULT_ROWS = { + alert: "toggle", + automation: "toggle", + climate: "climate", + cover: "cover", + fan: "toggle", + group: "group", + input_boolean: "toggle", + input_number: "input-number", + input_select: "input-select", + input_text: "input-text", + light: "toggle", + media_player: "media-player", + lock: "lock", + remote: "toggle", + scene: "scene", + script: "script", + sensor: "sensor", + timer: "timer", + switch: "toggle", + vacuum: "toggle", + water_heater: "climate", + input_datetime: "input-datetime", + }; + + if(!config || typeof config !== "object" || (!config.entity && !config.type)) { + Object.assign(config, {error: "Invalid config given"}); + return this.createThing("", config); + } + + const type = config.type || "default"; + if(SPECIAL_TYPES.has(type) || type.startsWith(this.CUSTOM_TYPE_PREFIX)) + return this.createThing("row", config); + + const domain = config.entity.split(".", 1)[0]; + Object.assign(config, {type: DEFAULT_ROWS[domain] || "text"}); + return this.createThing("entity-row", config); + } + + static get deviceID() { + const ID_STORAGE_KEY = 'lovelace-player-device-id'; + if(window['fully'] && typeof fully.getDeviceId === "function") + return fully.getDeviceId(); + if(!localStorage[ID_STORAGE_KEY]) + { + const s4 = () => { + return Math.floor((1+Math.random())*100000).toString(16).substring(1); + } + localStorage[ID_STORAGE_KEY] = `${s4()}${s4()}-${s4()}${s4()}`; + } + return localStorage[ID_STORAGE_KEY]; + } + + static moreInfo(entity) { + this.fireEvent("hass-more-info", {entityId: entity}); + } + + static longpress(element) { + customElements.whenDefined("long-press").then(() => { + const longpress = document.body.querySelector("long-press"); + longpress.bind(element); + }); + return element; + } + + static hasTemplate(text) { + return /\[\[\s+.*\s+\]\]/.test(text); + } + + static parseTemplateString(str, specialData = {}) { + if(typeof(str) !== "string") return text; + const FUNCTION = /^[a-zA-Z0-9_]+\(.*\)$/; + const EXPR = /([^=<>!]+)\s*(==|!=|<|>|<=|>=)\s*([^=<>!]+)/; + const SPECIAL = /^\{.+\}$/; + const STRING = /^"[^"]*"|'[^']*'$/; + + if(typeof(specialData) === "string") specialData = {}; + specialData = Object.assign({ + user: this.hass.user.name, + browser: this.deviceID, + hash: location.hash.substr(1) || ' ', + }, specialData); + + const _parse_function = (str) => { + let args = [str.substr(0, str.indexOf('(')).trim()] + str = str.substr(str.indexOf('(')+1); + while(str) { + let index = 0; + let parens = 0; + let quote = false; + while(str[index]) { + let c = str[index++]; + + if(c === quote && index > 1 && str[index-2] !== "\\") + quote = false; + else if(`"'`.includes(c)) + quote = c; + if(quote) continue; + + if(c === '(') + parens = parens + 1; + else if(c === ')') { + parens = parens - 1; + continue + } + if(parens > 0) continue; + + if(",)".includes(c)) break; + } + args.push(str.substr(0, index-1).trim()); + str = str.substr(index); + } + return args; + }; + + const _parse_special = (str) => { + str = str.substr(1, str.length - 2); + return specialData[str] || `{${str}}`; + }; + + const _parse_entity = (str) => { + str = str.split("."); + let v; + if(str[0].match(SPECIAL)) { + v = _parse_special(str.shift()); + v = this.hass.states[v] || v; + } else { + v = this.hass.states[`${str.shift()}.${str.shift()}`]; + if(!str.length) return v['state']; + } + str.forEach(item => v=v[item]); + return v; + } + + const _eval_expr = (str) => { + str = EXPR.exec(str); + if(str === null) return false; + const lhs = this.parseTemplateString(str[1]); + const rhs = this.parseTemplateString(str[3]); + var expr = '' + if(parseFloat(lhs) != lhs) + expr = `"${lhs}" ${str[2]} "${rhs}"`; + else + expr = `${parseFloat(lhs)} ${str[2]} ${parseFloat(rhs)}` + return eval(expr); + } + + const _eval_function = (args) => { + if(args[0] === "if") { + if(_eval_expr(args[1])) + return this.parseTemplateString(args[2]); + return this.parseTemplateString(args[3]); + } + } + + try { + str = str.trim(); + if(str.match(STRING)) + return str.substr(1, str.length - 2); + if(str.match(SPECIAL)) + return _parse_special(str); + if(str.match(FUNCTION)) + return _eval_function(_parse_function(str)); + if(str.includes(".")) + return _parse_entity(str); + return str; + } catch (err) { + return `[[ Template matching failed: ${str} ]]`; + } + } + + static parseTemplate(text, data = {}) { + if(typeof(text) !== "string") return text; + // Note: .*? is javascript regex syntax for NON-greedy matching + var RE_template = /\[\[\s(.*?)\s\]\]/g; + text = text.replace(RE_template, (str, p1, offset, s) => this.parseTemplateString(p1, data)); + return text; + } + + static args(script=null) { + script = script || document.currentScript; + var url = script.src; + url = url.substr(url.indexOf("?")+1) + let args = {}; + url.split("&").forEach((a) => { + if(a.indexOf("=")) { + let parts = a.split("="); + args[parts[0]] = parts[1] + } else { + args[a] = true; + } + }); + return args; + } + + static localize(key, def="") { + const language = this.hass.language; + if(this.hass.resources[language] && this.hass.resources[language][key]) + return this.hass.resources[language][key]; + return def; + } + + static popUp(title, message, large=false) { + let popup = document.createElement('div'); + popup.innerHTML = ` + + + +
+ ${title} +
+
+ `; + popup.appendChild(message); + this.moreInfo(Object.keys(this.hass.states)[0]); + let moreInfo = document.querySelector("home-assistant")._moreInfoEl; + moreInfo._page = "none"; + moreInfo.shadowRoot.appendChild(popup); + moreInfo.large = large; + document.querySelector("home-assistant").provideHass(message); + + setTimeout(() => { + let interval = setInterval(() => { + if (moreInfo.getAttribute('aria-hidden')) { + popup.parentNode.removeChild(popup); + clearInterval(interval); + } + }, 100) + }, 1000); + return moreInfo; + } + static closePopUp() { + let moreInfo = document.querySelector("home-assistant")._moreInfoEl; + if (moreInfo) moreInfo.close() + } + + static logger(message, script=null) { + if(!('debug' in this.args(script))) return; + + if(typeof message !== "string") + message = JSON.stringify(message); + console.log(`%cDEBUG:%c ${message}`, + "color: blue; font-weight: bold", ""); + } + +}); + +// Global definition of cardTools +var cardTools = customElements.get('card-tools'); + +console.info(`%cCARD-TOOLS IS INSTALLED +%cDeviceID: ${customElements.get('card-tools').deviceID}`, +"color: green; font-weight: bold", +""); diff --git a/www/community/lovelace-card-tools/card-tools.js.gz b/www/community/lovelace-card-tools/card-tools.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..7cbadc1ce4b70c3dfd12bd55c24c0aae2b4aefd3 GIT binary patch literal 4107 zcmV+m5cKaKiwFo(D?nWW|6^ftWG!@WZ)|feYI6X!8*6jhHuAfF1;Wc!WGqs4u5&YI zTkfQ`llU&RGq%&m$*KgAki?oIRS=ZoI{NRoiwECw;$G8sED~7k3;V)?^|MqYi?fI= zSS(U6VAC*WcE_hYa7B_tX{Wp6M>I{z!ww;-pd$3ij0tk`;rizChtbV1@6Sf>ug+ed z|7<(tfp8`=9uv!#cn_>ib=8XTG)&?O=$`j2fE955ocVV@YQU8v2@?`di7n<~>S+|@ zh~#sGh&fNzBxY-J#(Bc+@nsYkVkDW8LLM?rvN-U_8{kIF8HuQ1sc47wegklxEXZ7l zWqQ!-%|bEHCZ3-xdSad|Xc{Fe7WeRPM1AHKOUKTkWDVsn3m32@XFfb8@lTY;VLY=7 z3GHoR5};bf6;hJxHD87GD}vW&7>7^j57 zWR?OZDgHEzeZ-!UoTwLtLK}qbbgScU#UcWRfk-ht2kWpMkKD|Ylu7iQEsV0%*1BPBBh+!om-wvp8HGtS}n+UMa?kZ-;r?K57=eMhR}3(S-BiQpMKteHLf z{=1S{6(;Xj0}ue(9pIU{U{xWkj)l9RVcc;X?dm#gTuy#tzCif*JQ0bwU$V=mU{l-s zbYxlRu0pof7)s$Ss)$E=J@P&E@78i3AYd#3Xc7X@J?w+g8w+++^a?TbHX}oYNeNXb zaf^zzhdw;A(pwrKy*WTP7Oj! zXXVRzMM_2NCy;MAv5|#43~ITH{hl#?f6XGWJIGfxBkedcsv48W=fT|&_L-96-#CN%s^S+(~z^X71}*pbwO`}hEbQmJ1DXrXHjJKfvteH%+Wct$={P~ zGKpAvAcIF&5BfCrA$P&V0h!V$Ehb>EAlC$C@QvOFw(=AUD5rY(^ocxd4o$#Oj1{GW zdiR1bh5h&EhBuSH2?N48FzzEyAVP0dqE%I*RhWlbCVwE-;;)y^DFoCjczg`%Q35ia zeFZ9XxpV_g*NnRny~m`pq+EnFa+fq_k;@q*9jKbVlr-)Ff1;pN(=s*8*H9+Ja~%H~ zsHuxe)Y|(SW{tRMSkJBPD+bahL;WC1^?1aT6fC1xr&p zW4Smvp{hn%QN6+3;Z9RI5+y1}ve2rYDi2EQ(lq1}c?`9>C84lXIv|#uwYr6pB!RN% zK*+qCglc$%)cH(7pidx1JS(e#XZ=305?MrBII96YgmQMa>ur3IkmnE5UN#b?MhK_2 zU|iE=ga>wtR#QTrXLUU$C35O!#CfqwLYTb?U^fJ7o!YX^HKsO(K5*uND{zti1ZQ5= zsc5!H@idcoBc9Z>2=2;s!OXApZ70yxwwi`r@P;EEzO1LG6PU_0&uq6G8CMcIdJ z$(LLq+RMc~xGd&H2>C$Fx=3PX9hMjo;ew$RKs>mCM@S2{U2&#P=#(w&^z8Mk5ASY9SC>B_O|y+OVjOJQ63J{96~t%;_8`xZ%{e~`VG0Abekx|b z;y8}uZ$3JuEl6fO$(ArIfAi5WUS?u6Ng%_uEmG5QwwOpV^3_$ZHJDUZBsq+Ft-%QP zv4Fsrd_D?i^A@EnSP;??I-VpiUtRTDEKU47n8TlZ3_FNYUp0KG&te>wzok*^YRO@I zD8?CNex$1&@^R^Vh#Y?l=yeF?LzCu;`dPMUj;}EmjOJ*(yk%#V#sU~ZGP%~wfQI`s zx!6E@>Y$5-WhFfq*;04GusWZ`+OZ&>$Os1C#psXO`nK zCjClEN1iQ+pfrnwmFM@0OJiTcmdqRRpOSmGGRl*+RZo73%OJsnN~wrYJp;%QA%tHK zR_!~3J>6~DqDEDNm7~N!p&d$zrGIQ%nq}4SC<(hYPMhbxfMIAmKeelY@%(fIYPov# z=4|wzvtK}-PJVTv+{{%A-7x4JRxc$6ohg+4_njdckhVBEf@Q_2A{UT88lP#hSv8F} zz)kNA%^4h;M%Qr0ff{;H<#VX;RExUwTP%?)88avJ0~K>`8YNI^*!#QkjZ+X}VLQ%? z{XP5#Qf_iBI4X7jpN_7=)-`dVb|G3rHam)GXF@*Ka#JimHc$(DO zR`m)1`*JSAx*-5#6`E1T4>P)-swvm{ymJ4$=l*Ln+`YAdOXqp741MG;!8|I=|_j^zNA^*WeJVz&?8?(L?E|N7?Y{NjzAwg$gi!xz@4&fwS1@I?pV z>OvN3aFqY&!qzpUXjDh5(bAX^UaB1^E0@h{eD`9y$Xmb@2!RER33uJ1VGgMo{S4y} zqL`b5*1pUc9n$HVvc4=p^*k=Oeq_QK#v8e#C3D9^DdjV?^8w5mB71-p-oSj>$IGeR zu{#cU3lAXx4Nd(ZZ`xqn#YOO89Zog$3!R&}$38@h32dq6@Q1A|wYJ)Bx)Q-|qddle+8xg1Q( z2bnf4%QY{D&G!1^D@q%)DGOG<11OwY1-GhM83&e?PKjj`WWFRIRWX@R(6}gQ#DaDN zrUY!kP}wNER+dPNb(DEpz)-f0B^3}W92Mf5>+iN(5)CyT42ansB89+PohgNCA~;ZH zx*@~ixcz#vvbnPK?vh}8Ev?G<&lJUKH>6i*BVh#Vo8tl$;@?40Ezb)xMGq-s5P=_0fAnUT)^>?HDJ;Q; zlIb*MAfj@xt>%rOsD;`GN=C%80?`v}C0*q+3oUTpJU~8a|FG*Ymp9{44v(LEsTnm2 ze~l~PqbX6X?<_1)cWPCzDe~nil}x{ZlcGr>Hf_Y00%PBD>IE)d-6C3QkoB!ntdOxl zfk4BD1Gd=<8N<%z%!@HQAhHk<=C{tmrMEG>;#Old>0#G z=MgN_c8l(YJ7+Xt+?BH>YnV{~4!hlP;6A>v0IX$^qh5)rqY_Vs&7&n<0)h}W+nr=W zByo`oVXQCvFb95=q|C}^0toxb%nibH5vD1ajGj3@>NU{igg}Etes|rsut(_1jj>4a z40w)n63-vxm?_$hdazte(W{9uE^iCWu{e<5n%H{JwMwKx<;^F3NC!Jg?RxczjnC2* zty%Mg4@|s~S#+j9H!$xWWGd-QR$N@@<&(wd6BR+EXig1Q8Zsb~ziRG_*<11iFNWUY zH-&|kRIJ^0ov2Rdg7K9+_W<0vezWUMOZqh%z@b*%0ueT!ysVz$!g`8 zsWwoa6U9XmFi(9(-Bdy8HZfUl-`jI`if47_sUwGBwD!@cH2L>3gp}jN zUt$bp{W!&rN|LtI2+^|{<8~gvTJj^FfgnV&NjB@K@65rVOUcx6if`(9}V(@?Hx?^`5QJ&T0U_u{l6cG)G&+@ z6gfV5b#?0ATwcDrCg { +let cardTools = customElements.get('card-tools'); +class LayoutCard extends cardTools.LitElement { + + async setConfig(config) { + this.config = config; + this.layout = config.layout || 'auto'; + this.minCols = config.column_num || 1; + this.maxCols = config.max_columns || 100; + this.colWidth = config.column_width || 400; + this.maxWidth = config.max_width || 500; + this.minHeight = config.min_height || 5; + this.rtl = config.rtl || false; + this.cardSize = 1; + + this.make_cards(); + + window.addEventListener('resize', () => this.build()); + window.addEventListener('hass-open-menu', () => setTimeout(() => this.build(), 100)); + window.addEventListener('hass-close-menu', () => setTimeout(() => this.build(), 100)); + window.addEventListener('location-changed', () => { + if(location.hash === "") setTimeout(() => + this.build(), 100) + }); + if(config.rebuild) + window.setTimeout(() => this.build(), config.rebuild); + } + + render() { + return cardTools.LitHtml` +
+ `; + } + + firstUpdated() { + if(this.parentElement && this.parentElement.id !== "view") + { + this.style.padding = "0"; + } + if(this.rtl) + this.shadowRoot.querySelector("#columns").style.flexDirection = 'row-reverse'; + this.build(); + this._cardModder = { + target: this, + styles: this.shadowRoot.querySelector("style") + }; + } + + static get styles() { + return cardTools.LitCSS` + :host { + padding: 8px 4px 0; + display: block; + } + + #columns { + display: flex; + flex-direction: row; + justify-content: center; + } + + .column { + flex-basis: 0; + flex-grow: 1; + overflow-x: hidden; + } + + .column > * { + display: block; + margin: 4px 4px 8px; + } + + .column > *:first-child { + margin-top: 0; + } + `; + } + + make_cards() { + this._cards = this.config.cards.map((c) => { + if (typeof c === 'string') return c; + const card = cardTools.createCard(c); + if(this._hass) card.hass = this._hass; + this.appendChild(card); // Place card in DOM to get size + return card; + }); + } + + update_columns() { + const width = (this.shadowRoot && this.shadowRoot.querySelector("#columns").clientWidth) || (this.parentElement && this.parentElement.clientWidth); + this.colNum = Math.floor(width / this.colWidth) || 1; + this.colNum = Math.max(this.colNum, this.minCols); + this.colNum = Math.min(this.colNum, this.maxCols); + } + + build() { + if (this.offsetParent === null) return; + const root = this.shadowRoot.querySelector("#columns"); + while(root.lastChild) { + root.removeChild(root.lastChild); + } + + this.update_columns(); + + if(!this._cards) this.make_cards(); + + let cols = []; + let colSize = []; + for(let i = 0; i < this.colNum; i++) { + cols.push([]); + colSize.push(0); + } + + const shortestCol = () => { + let i = 0; + for(let j = 0; j < this.colNum; j++) { + if(colSize[j] < this.min_height) + return j; + if(colSize[j] < colSize[i]) + i = j; + } + return i; + } + + let i = 0; + this._cards.forEach((c) => { + const isBreak = (typeof(c) === 'string'); + const sz = c.getCardSize ? c.getCardSize() : 1; + + switch(this.layout) { + case 'horizontal': + if(i >= this.colNum) i = 0; + i += 1; + if(isBreak) break; + cols[i-1].push(c); + colSize[i-1] += sz; + break; + case 'vertical': + if(isBreak){ + i += 1; + if(i >= this.colNum) + i = 0; + break; + } + cols[i].push(c); + colSize[i] += sz; + break; + case 'auto': + default: + if(isBreak) break; + cols[shortestCol()].push(c); + colSize[shortestCol()] += sz; + break; + } + }); + + cols = cols.filter((c) => c.length > 0); + cols.forEach((c, i) => { + const div = document.createElement('div'); + div.classList.add('column'); + c.forEach((e) => div.appendChild(e)); + root.appendChild(div); + if(cols.length > 1 && typeof(this.maxWidth) === 'object') { + div.style.setProperty('max-width', this.maxWidth[i]); + } else { + div.style.setProperty('max-width', this.maxWidth+'px'); + } + }); + + this.cardSize = Math.max.apply(null, colSize); + } + + set hass(hass) { + this._hass = hass; + if(this._cards) + this._cards + .filter((c) => typeof(c) !== 'string') + .forEach((c) => c.hass = hass); + } + + getCardSize() { + return this.cardSize; + } + +} + +customElements.define('layout-card', LayoutCard); +}); +window.setTimeout(() => { + if(customElements.get('card-tools')) return; + customElements.define('layout-card', class extends HTMLElement{ + setConfig() { throw new Error("Can't find card-tools. See https://github.com/thomasloven/lovelace-card-tools");} + }); +}, 2000); diff --git a/www/community/lovelace-layout-card/layout-card.js.gz b/www/community/lovelace-layout-card/layout-card.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..95f20739a3615c4b05335812697929a2577143dd GIT binary patch literal 1715 zcmV;k22A-MiwFpsb39!F|7>A-Z*_DnV_|Y+E^2cCtypbu+cpsXo?pRwKqW1<><%3; z*mVXh4bTrsS1cX&AqY}MqAa?yXqbwW3xv0E-MH(nw=}&$z*0* zm;c2Qk?l#|C@T2hI{XmU1bdzbCWVe_rk#}tJ0qbd$b81_Q zgScc56pV1$w(2Xrk&E0941L3jq}+s2lAPV)xXu~JS<=e)D#{_j8xox;YX5D`^285< z+0$DyGv!7@?MS#uNx_j*%*^!0a?OKI2qxuavoyXIh~a;ZRdt z6%}<=xV8B~tnx2v^9Pw}XR6Y}FBpPVQVvcj1% zIP=y74gq{h;#8Fd00S9gN!L=)FV~h2yIw`vP;9qBO+%hpO;O>wMDMll$309UzSyp5 znUYxHk;g@av-g5FX&M6{itA1<+ee#9aYa$ovW-LZtb;mjjKteOaZAW+%~JH4U5L>d zaG#vYNcfUHn33_Ae9EJkYMrbg?|;7_qSOhF)?&6>$vv~+Q3a`1h|_fCHc;A?jp?s` zui9D!dJ#CpIYVx$ULD9*`f^CKce<0pM@$=YauJCPs8d3rHg)Wd5pdE4o5i>qP1?HVvV3y`LXura}6?vWh8qbof!TuO0%gu4gvMOiv9pg*S4A zfi{`p>zy5Y5RQ*KKcvKPUGvPpx(>SXQ!+Ju;`*XP%CoW(6wa1%z;kDhPPZX61}(Kg z%f3NN+aNP)CcYlSh#-JUbnNriChEQ+%} z%;^9z{u{vRt15Ygd5X&hJs0cvgG4%cgE?*H;a}Zn1bNy{$mqZuCZOE9bl5SBBTk8j zLt+nTYftN?xLer?u#q?jr z+bTmpc+xDF^BEI&ZErhjRHJl$+Kk_Ps8@_^2tAaXxR4J2t>?TixmRG^Fy#`);lu+ik zPQ6j>RM)R_RW`L;-Y(HSyucaP?#vJ`n^T3GWhJ)0hm9lES-qiq>6XaU#+^{yjsJtN zV{d)m#ie(Q{o8iaxn(%=tuMRhu*sLM`9d*~6O^yVD|`AgQ&u-$wWFABW%kUaNv&hO zJnA6wl?{;=yNk7PXzA{3b>h@tel4&KQup5$}CKFlr{{ZgV J`yI^_00557R0;q9 literal 0 HcmV?d00001 diff --git a/www/community/lovelace-multiple-entity-row/multiple-entity-row.js b/www/community/lovelace-multiple-entity-row/multiple-entity-row.js new file mode 100644 index 0000000..435f838 --- /dev/null +++ b/www/community/lovelace-multiple-entity-row/multiple-entity-row.js @@ -0,0 +1,203 @@ +class MultipleEntityRow extends Polymer.Element { + + static get template() { + return Polymer.html` + + +
+
+ [[entityName(_config)]] +
+ + +
+
+ + + + +
`; + } + + primaryMoreInfo(e) { + e.stopPropagation(); + this.fireEvent(this._config.primary.entity) + } + + secondaryMoreInfo(e) { + e.stopPropagation(); + this.fireEvent(this._config.secondary.entity) + } + + entityName(data) { + return data && data.stateObj && data.name !== false ? this.computeStateName(data.stateObj, data.name) : null; + } + + entityState(data) { + if (!data || !data.stateObj) return this._hass.localize('state.default.unavailable'); + return data.attribute + ? data.stateObj.attributes[data.attribute] + ? `${data.stateObj.attributes[data.attribute]} ${data.unit ? data.unit : ''}` + : this._hass.localize('state.default.unavailable') + : this.computeStateValue(data.stateObj, data.unit); + } + + computeStateName(stateObj, name) { + return name || (stateObj.attributes.friendly_name === undefined + ? stateObj.entity_id.substr(stateObj.entity_id.indexOf('.') + 1).replace(/_/g, ' ') + : stateObj.attributes.friendly_name || ''); + } + + computeStateValue(stateObj, unit) { + let display; + const domain = stateObj.entity_id.substr(0, stateObj.entity_id.indexOf(".")); + + if (domain === "binary_sensor") { + if (stateObj.attributes.device_class) { + display = this._hass.localize(`state.${domain}.${stateObj.attributes.device_class}.${stateObj.state}`); + } + if (!display) { + display = this._hass.localize(`state.${domain}.default.${stateObj.state}`); + } + } else if ((unit || stateObj.attributes.unit_of_measurement) && !["unknown", "unavailable"].includes(stateObj.state)) { + display = `${stateObj.state} ${stateObj.attributes.unit_of_measurement}`; + } else if (domain === "zwave") { + display = ["initializing", "dead"].includes(stateObj.state) + ? this._hass.localize(`state.zwave.query_stage.${stateObj.state}`, 'query_stage', stateObj.attributes.query_stage) + : this._hass.localize(`state.zwave.default.${stateObj.state}`); + } else { + display = this._hass.localize(`state.${domain}.${stateObj.state}`); + } + + return display || + this._hass.localize(`state.default.${stateObj.state}`) || + this._hass.localize(`component.${domain}.state.${stateObj.state}`) || + stateObj.state; + } + + setConfig(config) { + if (!config.entity) throw new Error('Please define an entity.'); + if (config.primary && !config.primary.entity) throw new Error('Please define a primary entity.'); + if (config.secondary && !config.secondary.entity) throw new Error('Please define a secondary entity.'); + + this._config = config; + this.displayToggle = config.toggle === true; + this.displayValue = !this.displayToggle && !config.hide_state; + this.displayPrimary = config.primary && config.primary.entity; + this.displaySecondary = config.secondary && config.secondary.entity; + this.displayInfo = config.info && config.info.entity; + this.displayLastChanged = !this.displayInfo && config.secondary_info === 'last-changed'; + } + + set hass(hass) { + this._hass = hass; + + if (hass && this._config) { + const stateObj = this._config.entity in hass.states ? hass.states[this._config.entity] : null; + if (stateObj) { + this._config.stateObj = stateObj; + + this.primary = Object.assign({}, this._config.primary, { + stateObj: this.displayPrimary && this._config.primary.entity in hass.states ? + hass.states[this._config.primary.entity] : null + }); + this.secondary = Object.assign({}, this._config.secondary, { + stateObj: this.displaySecondary && this._config.secondary.entity in hass.states ? + hass.states[this._config.secondary.entity] : null + }); + this.info = Object.assign({}, this._config.info, { + stateObj: this.displayInfo && this._config.info.entity in hass.states ? + hass.states[this._config.info.entity] : null + }); + } + } + } + + fireEvent(entity, options = {}) { + const event = new Event('hass-more-info', { + bubbles: options.bubbles || true, + cancelable: options.cancelable || true, + composed: options.composed || true, + }); + event.detail = {entityId: entity}; + this.shadowRoot.dispatchEvent(event); + return event; + } +} + +customElements.define('multiple-entity-row', MultipleEntityRow); diff --git a/www/community/lovelace-multiple-entity-row/multiple-entity-row.js.gz b/www/community/lovelace-multiple-entity-row/multiple-entity-row.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..2ec84196070e3d97004ca068bacd36ad5d6ec2d2 GIT binary patch literal 1900 zcmV-y2b1_8iwFoPGdEoV|7~?_bZKyGWi4fHbZK;XEpl&nE^2cCtyx=d+cp$_&#z#F zp^`gGNrA2ylsJ7D@(^HMgLc@9Vc4=n*=%LelPJ4x;{U$GizHH_FB#&ZiA0s z;w&ml^r^}iS!eh@XN2v(&@IA07|xRtJ<@Eq!bNbO;T6sqdb+qk@F`iuNQ@SkA%<7$ zEMnLjz$Q|k0<)^f8}21rWwVRhlI=2l2SnkLmQ0Z+qy+w5h|&!IxDiWHMi#kGKyn$P z7}Vl|Z|vcJz^N1`e+^lw$kNV@Z53W9T>F4s|v{W)e^ zjPs)wfEv)TB?()G=(@3qO+*%Z4s@d7P`Sj zn$c~DmLy4PqZkCmZ?|xkk#$K*6PhqAGs+lFytj2g3}}9@k+FKx5i#ZuBd5fGRT33D zXJVDv@;8)2w2b@$Lt>B(_8D2>Zn)14nh?r z3v2*>4gcQjfMb!#rm+QCEREz43Ph-TX{PugHhHZG(#0>yPYBh!>srG3mMe)N)Efjb z_1SKXt>$T9a%XFrHd^n0v)K>T+AuP@SY-G}^!FFHSE?9qbx7qioqroSg;3pD3$vW9F0&KWhF)*r6n<4tt*B_0yVN5=3&b^KrrxBS$5O6NoHTyD3T)YQkeAoj4lna zgW6*0Jx_!HW(znMe`3!SR6&B%2xi=%%A-w0vS^-RSA$V=Ifxi5$Q-hp@jF9yL-g3w= z_tHuv4#d#2fDxnxfjK7IO$F5m(yPkB2a@BY6OD#jCe4&2L0Qd9R(O^j0z!U#PCYkp z2k2MyZV(h0IzWuQtLfEZh+Nb|<+OF+gXf-V}7 z9F2}Rc|Al&{B#0m0G1iWQws%5ojJ*&Elf+Cm$Yznt7>YS`w8BV7*9p(?(%4pJ=kr_ z$eGMY$ZlcC9-dAqF=)iYex?XBQ{naqxtUOT|9>VISC1X)=(L2tR^ygzki-H!O`N)a+re;Xfb@e8<)7n}&nm%((RC6IDn|$a@k;b&%5Y_Jzc)_!x!geNc*a6R_ zMUv*%k|cPlMYk(PT{BzdS{$rlu#0J~bgdu*<^w3(h4F#Bl_Or@wIcY}qukp4zYEWU zDXOt%Ds*tXUGc6+UHjc`L5Qo5x9l9oZCQdo{;M+vh#kB1Fwt1mxEvg?i?+li8lSx2?V-|pMWRZJM`ysO3%Z3)+ zdQS?idD_9Tlbk(>tQz>|Aatg{8p58OePf3v`Q#?xM}L)i*2r-eOn z{s=yoo9VA;fqib5+eK?$&0%OQ!&-2l7Wh2OkCCC-aH2fMV$5wB+O-2beAFm$qH(B| zKD`c$@C61P27@(sS0eC`gzDhjcN%%Qj1s#2LMaomj##`@(D9%BcL-v+?$v;IT$PNj m)Su7z{e~adp1V?iajRcd!SN0t_WlkB^8W)|oGBNg8vp0}get _max(){return this.stateObj.attributes.options.length-1}get _step(){return 1}}};customElements.define("slider-entity-row",class extends i{static get properties(){return{hass:{}}}setConfig(t){this._config=t;const e=t.entity.split(".")[0],s=u[e];if(!s)throw new Error(`Unsupported entity type: ${e}`);this.ctrl=new s(t)}render(){const t=this.ctrl;t.hass=this.hass;const e=a` + t.value=this.shadowRoot.querySelector("ha-slider").value} + class=${this._config.full_row?"full":""} + > + `,s=a` + + `,i=a` +
t.stopPropagation()}> + ${"unavailable"===t.stateObj.state?a` + + unavailable + + `:a` + ${this._config.hide_when_off&&t.isOff||!t.hasSlider?"":e} + ${this._config.hide_state||this._config.toggle?"":a` + + ${t.string} + + `} + ${this._config.toggle&&t.hasToggle?s:""} + `} +
+ `;return this._config.full_row?i:a` + ${i} + `}static get styles(){return r` + .wrapper { + display: flex; + align-items: center; + height: 40px; + } + .state { + min-width: 45px; + text-align: end; + } + ha-entity-toggle { + margin-left: 8px; + } + ha-slider.full { + width: 100%; + } + `}})}]); \ No newline at end of file diff --git a/www/community/lovelace-slider-entity-row/slider-entity-row.js.gz b/www/community/lovelace-slider-entity-row/slider-entity-row.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..216a6eb121840cf4c367a929a489884078895ad6 GIT binary patch literal 2068 zcmV+v2Oe~T$VdpncSMA=_G*w zAR-TS@JO>%+2v!;Yw$&7jI!ty%>!@OEk!3aFt*p>nZp*r(k|j7j3D|xk?Qh6N(`Y1 zQBme1mre$I%)dToO|WzoNCqjRh!FBQM3+ZPuXgWy80Qj~oH#OOki?bD0r6Hzo^jD- z3NZbx(e-ufCKVU?;b%q;Bokbox@eyt$O3atxxkrN95BrgKn6$DHd7p!U-q^V&Q}Qo zMkhNet!0%6NEbv`>?sdo*xb@xBx+8C1Ag-ENdAKIRX;$jAYg7}a|K`@6|XAmnu4#J z#r+w=hfpTH28SF4Dl18fSZ%IiMV>BgYcd%>@e#>_|MurEJf8B07Czp|J zouW8U3#m^zO`T=qLK8Y5Sr0eD0cl4g54G|Ge)+Cw{IVWyoQQ5|yw?Ke2YpQf39m?9aVH>bhj6whA(*$BugcXrT(~&ACzaP32uW_z0hb%2xTtV{;^Mi z1z_Q^0<;E?rPP%X&aZy@{Mj?Wid$qslkOymD=ACTdF!rJR9mccU7rO%lH4PKv$V4u^wZx#wK{6LZ6LY5uwOyW zkDHNdL7jVunvy@0inq7f3=~y`93e;=Z{ZfJN^+5BKEIxiruI~nSJ(c5q!h;m!>^?L z!w{o9e##kKmhk~prR!xl5pITyktf2u0o24*1ib!O_HDxf1V$2wm;^Cfu>{$fK6L>U z=P)#yl#}S71qvrcWPJju@B$j`fM`gLb>(Zwd&1}exTd6h+%rKAFbOCy4U;#LHKP_1 z2K2GTKPhV#eVepNrEJ-pD+w@|#D_e+Sl-6g^X2`a=c4ZGRYpb3U!i{=dZF1&M%SpF zNY30M+UnL6Z(x+r!s@-<-pj)%))XWn5s`&s-KELgVE+a*+(9_Sau0pWb(! zoCD7i(6hzaH0(f4%-#tdUJ$T>!3RMApHt)oJ{&I7o(?s_xex?P!RU|!{=IX=Q9{EB zI`759g%QYB{I?H4m%SMSu{ykj!uPZ>3k-~8JF#C}k99Pf6_tqL3;%IiV{^{U0n?h4 zt;+N&#WQVEX`UTMzS;_0a`G>hW8t2$&^vqibS-6aui@(V#T)An+*9woqR!=V91B3! z=9v>l67lDzoxG4umXEX<6YlqP79(&zzYH90y8@0}#F}jqcrc5*kUg)@(4abqS9l?mBYTVkzFM1bBx!aY|SKF#$yM6s!B@gtJ)SeVHYuEos_Bh)~ zG7{YyO4FkDIL)7b&2tg_uOj8^ovI!P5Nhp3-cYnkX7r(#k6>Fd7DJHNNUo3^)eOV! z%~dPxR_$#dIlagjs0dXUw$tVz(dbgef8oi{ip$)4WIGhIopj&2k7WDZiZhsejzd!pta`9Q836AZh;p4w4prTDxIW!~Fc??A^;viD4w z;99FE&<(X7vJadzu3j)w+af(|yX=}Kt2FQ_AH#N9b%Bd0DmF zFq`hO1%>Ze9y$qVBV~8EC+Zc|`Lrxrmev!MK}!L&t;I7<#UAKC7nTYEeSV?zgwR{l yp`c;?*&=bd1F4K`!H6%XHne?2CCFklc3dx)KlXVxHC);c-s=B0h;Zck8~^~(T=hi& literal 0 HcmV?d00001 diff --git a/www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js b/www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js new file mode 100644 index 0000000..61afd85 --- /dev/null +++ b/www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js @@ -0,0 +1,221 @@ +class XiaomiVacuumCard extends Polymer.Element { + + static get template() { + return Polymer.html` + + + +
+
+
[[_config.labels.status]]: [[stateObj.attributes.status]]
+
[[_config.labels.battery]]: [[stateObj.attributes.battery_level]] %
+
[[_config.labels.mode]]: [[stateObj.attributes.fan_speed]]
+
+ +
+ +
+ `; + } + + moreInfo() { this.fireEvent('hass-more-info'); } + startVaccum() { this.callService(this._config.service.start); } + pauseVacuum() { this.callService(this._config.service.pause); } + stopVacuum() { this.callService(this._config.service.stop); } + locateVacuum() { this.callService(this._config.service.locate); } + returnVacuum() { this.callService(this._config.service.return); } + cleanSpot() { this.callService(this._config.service.spot); } + + callService(service) { + this._hass.callService('vacuum', service, {entity_id: this._config.entity}); + } + + fireEvent(type, options = {}) { + const event = new Event(type, { + bubbles: options.bubbles || true, + cancelable: options.cancelable || true, + composed: options.composed || true, + }); + event.detail = {entityId: this._config.entity}; + this.shadowRoot.dispatchEvent(event); + return event; + } + + getCardSize() { + if (this.name && this.showButtons) return 5; + if (this.name || this.showButtons) return 4; + return 3; + } + + setConfig(config) { + const labels = { + status: 'Status', + battery: 'Battery', + mode: 'Mode', + main_brush: 'Main Brush', + side_brush: 'Side Brush', + filter: 'Filter', + sensor: 'Sensor', + hours: 'h', + }; + + const services = { + start: 'start', + pause: 'pause', + stop: 'stop', + locate: 'locate', + return: 'return_to_base', + spot: 'clean_spot', + }; + + const buttons = { + start: true, + pause: true, + stop: true, + spot: false, + locate: true, + return: true, + }; + + const vendors = { + xiaomi: { + image: '/local/img/vacuum.png', + details: true, + }, + ecovacs: { + image: '/local/img/vacuum_ecovacs.png', + details: false, + buttons: { + stop: false, + spot: true, + }, + service: { + start: 'turn_on', + pause: 'stop', + stop: 'turn_off', + }, + } + }; + + if (!config.entity) throw new Error('Please define an entity.'); + if (config.entity.split('.')[0] !== 'vacuum') throw new Error('Please define a vacuum entity.'); + if (config.vendor && !config.vendor in vendors) throw new Error('Please define a valid vendor.'); + + const vendor = vendors[config.vendor] || vendors.xiaomi; + + this.showDetails = vendor.details; + this.showButtons = config.buttons !== false; + + config.service = Object.assign({}, services, vendor.service); + config.buttons = Object.assign({}, buttons, vendor.buttons, config.buttons); + config.labels = Object.assign({}, labels, config.labels); + + this.contentText = `color: ${config.image !== false ? 'white; text-shadow: 0 0 10px black;' : 'var(--primary-text-color)'}`; + this.contentStyle = `padding: ${this.showButtons ? '16px 16px 4px' : '16px'}; ${this.contentText}`; + this.backgroundImage = config.image !== false ? `background-image: url('${config.image || vendor.image}')` : ''; + + this._config = config; + } + + set hass(hass) { + this._hass = hass; + + if (hass && this._config) { + this.stateObj = this._config.entity in hass.states ? hass.states[this._config.entity] : null; + + if (this.stateObj) { + this.name = this._config.name !== false && (this._config.name || this.stateObj.attributes.friendly_name); + } + } + } +} + +customElements.define('xiaomi-vacuum-card', XiaomiVacuumCard); diff --git a/www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js.gz b/www/community/lovelace-xiaomi-vacuum-card/xiaomi-vacuum-card.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..ef5f3ae50a3db048754d44e04fc5ed0496662b7a GIT binary patch literal 2004 zcmV;_2P^m=iwFpTCOBOJ|9EL(Z*6HUc41?6b!{zUVRB?HYI6X^TI+AyHW2^5zk)T^ z$p#`P?H(WGqyxHjKtBu}mSGrR7!EDbHd{&*NGgt-`hVZ?p%*3Daj>B&kVw3{-#vId z9;wC*ONsuWn5Xn_92Z6U3l<3?4~k@oM1OF$Pl=emV`zS!1<46k5z4rG zoDK8lTvA1O7NHnyC&K+XA|dH#0^I!G=Q^})Ra7z3F>}o`PVH&cFzn z(1hfkWNd%boK>L|&(8D6o5iE}8$pv{cQw_=)?;D0pui(mq!~DF6Mg*p0^vgO$w{T* z&}1D|Ze#6*aYfXQ_^IIx6?_+Na2}zj1R`W)-8HD0?wVmXyrN#cx_UV<7X}+Rde+>E zi-ZWr@ETT})?Nq-LuJ-=}y(fW2M7ugkNF*_q0S}ZUl3ibYChK(i^cUN$asn`OU>SR1HD`k zdLFw6$`LT{=_PZ?ejCZ~EAEnqStG@t8d z@?rIHij@)+N)xH+Jw6YEt^k0D{V=LySTZP)Y_UKu&w@{RLWZ%|I9tk`kYvE<{=p-O zBe#6_D^Zv-*^@t~X2Yzf5$cK!dWUJYT!}(%hkdMhmU^}!f*qJGhdpF)-UicwCghaz zn&&@OzNQSa;>gSz`hV>)$zZEJ;;o@C6DrjHnW_iUaG+xJ6qggp`PMWM@l%GTY3aS~UQCe?s&{R)O|bl?#3`KLjEo#~{Be=?%G$kyf;OaoK}Aexq`QaFo9jzQ z>D4(j5B(uO*WDZ!l03s*BWDjdXSl0{zOKJg@%&k{%ky)+)iPh%*_=Nom19P5b_=pk z_jM&WPrt6SjK{$E40o;IxwD(%JcKUt6A@q6ZF@EF47aV|xo&THO2Yro_b0cbMy>9| z>%lwQ$sg>MO4)GgdlaO$RByS0yn|z`8V9;*4>dJ*h3=;NBP>Tp%ZNfgWM{DKtMciBLKAj8v~ zOOiAs+(?)I&^Z1Y`=^OH9cUMANZt=bYSxav+~S1q{^T4GsLZj7w>Aa_wV}mbWt!nu zus1~MtI}KgxqbIZ*T|-bKCq(izAN=rz2c%TpH_h^=LtnNv-MW-qCEn&(q;XVRGAxN!*4Y8t{+%F4szbo zwa}Z6qfG6RY9Lg*k-LklP~7$_XI<8}Rk3NG089u?qP9(JbWk9-DKm( zL)8<>i&AyjSj~Kty3BP^9IXPW-rKTW&}!H0Vp`Hgn{(oauW{)ED0k*EKSJL=Iw?~( z>e!&4QD8px&FlvT+pk3E3jXOY2x!G{{Am`TNT*}-D}iCRp9+G*-K^ILbK$M6sJ>=> z``DQ{u%P}@`9uC-bm^DiFe~{RPIYv79}Mb5=(>8>_y+3=Xd&1*@S;KlRIrw z;D_3^ew9YQK{8)M#`;%(R}O;uk5^v|rR?XH-R`Q+es`4#Fg=~9Ue%`cH*7l0jkkG^ zzyf^C3dS1dv|7ee-K3{h*FB|Yiy5n@0NfgP=~W-vcOfh&Oa0RLYkaW6utAOHYos@9SK literal 0 HcmV?d00001 diff --git a/www/community/mini-media-player/mini-media-player.js b/www/community/mini-media-player/mini-media-player.js new file mode 100644 index 0000000..80c424e --- /dev/null +++ b/www/community/mini-media-player/mini-media-player.js @@ -0,0 +1 @@ +(function(){"use strict";function a(){const b=sa(["",""]);return a=function(){return b},b}function b(){const a=sa(["",""]);return b=function(){return a},a}function c(){const a=sa(["\n
\n
\n ","\n
\n
"]);return c=function(){return a},a}function d(){const a=sa(["\n
\n ","\n ","\n
"]);return d=function(){return a},a}function e(){const a=sa(["\n
\n "," ","\n
"]);return e=function(){return a},a}function f(){const a=sa(["\n
\n \n
"]);return f=function(){return a},a}function g(){const a=sa(["\n
\n
"]);return g=function(){return a},a}function h(){const a=sa(["
"]);return h=function(){return a},a}function i(){const a=sa(["\n \n \n "]);return i=function(){return a},a}function j(){const a=sa(["\n \n \n "]);return j=function(){return a},a}function k(){const a=sa(["\n \n
\n ","\n
\n
\n
\n ","\n
\n ","\n ","\n
\n \n \n
\n
\n ","\n \n \n ","\n \n \n
\n
\n
\n \n \n
\n \n "]);return k=function(){return a},a}function l(){const a=sa(["\n :host {\n display: flex;\n line-height: 40px;\n max-height: 40px;\n }\n :host([flow]) mmp-media-controls {\n max-width: unset;\n }\n mmp-media-controls {\n max-width: 200px;\n }\n .group-button {\n height: 34px;\n width: 34px;\n min-width: 34px;\n margin: 3px;\n }\n paper-icon-button {\n min-width: 40px;\n }\n "]);return l=function(){return a},a}function m(){const a=sa(["\n \n ","\n \n "]);return m=function(){return a},a}function n(){const a=sa(["\n \n "]);return n=function(){return a},a}function o(){const a=sa(["\n \n "]);return o=function(){return a},a}function p(){const a=sa(["\n \n "]);return p=function(){return a},a}function q(){const a=sa(["\n \n "]);return q=function(){return a},a}function r(){const a=sa(["\n \n "]);return r=function(){return a},a}function s(){const a=sa(["\n \n \n "]);return s=function(){return a},a}function t(){const a=sa(["\n ","\n ","\n ","\n ","\n ","\n ","\n "]);return t=function(){return a},a}function u(){const a=sa(["\n \n ","\n \n "]);return u=function(){return a},a}function v(){const a=sa(["\n :host {\n display: flex;\n width: 100%;\n }\n .flex {\n display: flex;\n flex: 1;\n justify-content: space-between;\n }\n ha-slider {\n max-width: none;\n min-width: 100px;\n width: 100%;\n }\n paper-icon-button {\n min-width: 40px;\n }\n .mmp-media-controls__volume {\n flex: 100;\n max-height: 40px;\n }\n .mmp-media-controls__volume.--buttons {\n justify-content: left;\n }\n .mmp-media-controls__media {\n direction: ltr;\n max-width: calc(40px * 3);\n margin-right: 0;\n margin-left: auto;\n }\n .mmp-media-controls__media[flow] {\n max-width: none;\n }\n .mmp-media-controls__shuffle {\n flex: 3;\n flex-shrink: 200;\n justify-content: center;\n }\n .mmp-media-controls__shuffle paper-icon-button {\n height: 36px;\n width: 36px;\n min-width: 36px;\n margin: 2px;\n }\n "]);return v=function(){return a},a}function w(){const a=sa(["\n \n \n "]);return w=function(){return a},a}function x(){const a=sa(["\n \n \n "]);return x=function(){return a},a}function y(){const a=sa(["\n \n \n "]);return y=function(){return a},a}function z(){const a=sa(["\n \n \n "]);return z=function(){return a},a}function A(){const a=sa(["\n
\n ","\n \n \n \n \n
"]);return A=function(){return a},a}function B(){const a=sa(["\n
\n ","\n \n \n
"]);return B=function(){return a},a}function C(){const a=sa([""]);return C=function(){return a},a}function D(){const a=sa(["\n
\n \n \n \n \n \n \n
\n "]);return D=function(){return a},a}function E(){const a=sa([""]);return E=function(){return a},a}function F(){const a=sa(["\n
\n \n \n
\n "]);return F=function(){return a},a}function G(){const a=sa([""]);return G=function(){return a},a}function H(){const a=sa(["\n ","\n ","\n ","\n "]);return H=function(){return a},a}function I(){const a=sa(["\n :host {\n max-width: 120px;\n min-width: 40px;\n }\n :host([full]) {\n max-width: none;\n }\n "]);return I=function(){return a},a}function J(){const a=sa(["\n \n "]);return J=function(){return a},a}function K(){const a=sa(["\n :host {\n max-width: 120px;\n min-width: 40px;\n }\n :host([full]) {\n max-width: none;\n }\n "]);return K=function(){return a},a}function L(){const a=sa(["\n \n "]);return L=function(){return a},a}function M(){const a=sa(["\n .mmp-progress {\n cursor: pointer;\n left: 0; right: 0; bottom: 0;\n position: absolute;\n pointer-events: auto;\n min-height: 10px;\n }\n .mmp-progress__duration {\n display: flex;\n justify-content: space-between;\n font-size: .8em;\n margin: 8px calc(var(--ha-card-border-radius, 4px) / 2);\n margin-top: 0;\n padding: 0 6px;\n }\n paper-progress {\n height: var(--paper-progress-height, 4px);\n bottom: 0;\n position: absolute;\n width: 100%;\n --paper-progress-active-color: var(--mmp-accent-color);\n --paper-progress-container-color: rgba(100,100,100,.15);\n --paper-progress-transition-duration: 1s;\n --paper-progress-transition-timing-function: linear;\n --paper-progress-transition-delay: 0s;\n }\n .mmp-progress[paused] paper-progress {\n --paper-progress-active-color: var(--disabled-text-color, rgba(150,150,150,.5));\n }\n "]);return M=function(){return a},a}function N(){const a=sa([""]);return N=function(){return a},a}function O(){const a=sa(["\n
\n ","\n ","\n
\n "]);return O=function(){return a},a}function P(){const a=sa(["\n
\n ","\n \n \n
\n "]);return P=function(){return a},a}function Q(){const a=sa(["\n :host {\n align-items: center;\n margin-left: 8px;\n display: flex;\n }\n .mmp-tts__input {\n cursor: text;\n flex: 1;\n margin-right: 8px;\n --paper-input-container-input: {\n font-size: 1em;\n };\n }\n ha-card[rtl] .mmp-tts__input {\n margin-right: auto;\n margin-left: 8px;\n }\n .mmp-tts__button {\n margin: 0;\n height: 30px;\n padding: 0 .4em;\n }\n paper-input {\n opacity: .75;\n --paper-input-container-color: var(--mmp-text-color);\n --paper-input-container-focus-color: var(--mmp-text-color);\n --paper-input-container: {\n padding: 0;\n };\n }\n paper-input[focused] {\n opacity: 1;\n }\n\n ha-card[artwork*='cover'][has-artwork] paper-input {\n --paper-input-container-focus-color: #FFFFFF;\n }\n ha-card[artwork*='cover'][has-artwork] paper-input {\n --paper-input-container-color: #FFFFFF;\n --paper-input-container-input-color: #FFFFFF;\n }\n "]);return Q=function(){return a},a}function R(){const a=sa(["\n \n \n \n SEND\n \n "]);return R=function(){return a},a}function S(){const a=sa(["\n .mmp-shortcuts__buttons {\n box-sizing: border-box;\n display: flex;\n flex-wrap: wrap;\n margin-top: 8px;\n }\n .mmp-shortcuts__button {\n min-width: calc(50% - 8px);\n flex: 1;\n }\n .mmp-shortcuts__button > div {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n }\n .mmp-shortcuts__button > div[align='left'] {\n justify-content: flex-start;\n }\n .mmp-shortcuts__button > div[align='right'] {\n justify-content: flex-end;\n }\n .mmp-shortcuts__button[columns='1'] {\n min-width: calc(100% - 8px);\n }\n .mmp-shortcuts__button[columns='3'] {\n min-width: calc(33.33% - 8px);\n }\n .mmp-shortcuts__button[columns='4'] {\n min-width: calc(25% - 8px);\n }\n .mmp-shortcuts__button[columns='5'] {\n min-width: calc(20% - 8px);\n }\n .mmp-shortcuts__button > div > span {\n line-height: 24px;\n text-transform: initial;\n }\n .mmp-shortcuts__button > div > *:nth-child(2) {\n margin-left: 4px;\n }\n "]);return S=function(){return a},a}function T(){const a=sa(["\n ","\n ","\n "]);return T=function(){return a},a}function U(){const a=sa(["",""]);return U=function(){return a},a}function V(){const a=sa([""]);return V=function(){return a},a}function W(){const a=sa(["\n \n
\n ","\n ","\n
\n "]);return W=function(){return a},a}function X(){const a=sa(["\n
\n ","\n
\n "]);return X=function(){return a},a}function Y(){const a=sa(["\n \n \n "]);return Y=function(){return a},a}function Z(){const a=sa([""]);return Z=function(){return a},a}function $(){const a=sa(["\n :host {\n display: block;\n }\n :host([faded]) {\n opacity: .75;\n }\n :host[small] .mmp-dropdown__label {\n max-width: 60px;\n display: block;\n position: relative;\n width: auto;\n text-transform: initial;\n }\n :host[full] .mmp-dropdown__label {\n max-width: none;\n }\n .mmp-dropdown {\n padding: 0;\n display: block;\n }\n .mmp-dropdown__button {\n display: flex;\n font-size: 1em;\n justify-content: space-between;\n align-items: center;\n height: 36px;\n margin: 2px 0;\n }\n .mmp-dropdown__button.icon {\n height: 40px;\n margin: 0;\n }\n .mmp-dropdown__button > div {\n display: flex;\n flex: 1;\n justify-content: space-between;\n align-items: center;\n height: 36px;\n max-width: 100%;\n }\n .mmp-dropdown__label {\n text-align: left;\n text-transform: none;\n }\n .mmp-dropdown__icon {\n height: 24px;\n width: 24px;\n min-width: 24px;\n }\n paper-item > *:nth-child(2) {\n margin-left: 4px;\n }\n paper-menu-button[focused] mmp-button iron-icon {\n color: var(--mmp-accent-color);\n transform: rotate(180deg);\n }\n paper-menu-button[focused] paper-icon-button {\n color: var(--mmp-accent-color);\n transform: rotate(180deg);\n }\n paper-menu-button[focused] paper-icon-button[focused] {\n color: var(--mmp-text-color);\n transform: rotate(0deg);\n }\n "]);return $=function(){return a},a}function _(){const a=sa(["",""]);return _=function(){return a},a}function aa(){const a=sa([""]);return aa=function(){return a},a}function ba(){const a=sa(["\n \n ","\n ","\n "]);return ba=function(){return a},a}function ca(){const a=sa(["\n \n
\n \n ","\n \n \n
\n
\n "]);return ca=function(){return a},a}function da(){const a=sa(["\n \n \n "]);return da=function(){return a},a}function ea(){const a=sa(["\n \n ","\n \n ","\n \n \n "]);return ea=function(){return a},a}function fa(){const a=sa(["\n .ellipsis {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .label {\n margin: 0 8px;\n }\n paper-icon-button {\n transition: color .25s;\n }\n paper-icon-button[color] {\n color: var(--mmp-accent-color) !important;\n opacity: 1 !important;\n }\n paper-icon-button[inactive] {\n opacity: .5;\n }\n"]);return fa=function(){return a},a}function ga(){const a=sa(["\n .mmp-group-list {\n display: flex;\n flex-direction: column;\n margin-left: 8px;\n }\n .mmp-group-list__title {\n font-weight: 500;\n letter-spacing: .1em;\n margin: 8px 0 4px;\n text-transform: uppercase;\n }\n .mmp-group-list__buttons {\n display: flex;\n }\n .mmp-group-list__button {\n margin: 8px 8px 0 0;\n min-width: 0;\n text-transform: uppercase;\n text-align: center;\n width: 50%;\n --mdc-theme-primary: transparent;\n background: rgba(255,255,255,0.25);\n }\n "]);return ga=function(){return a},a}function ha(){const a=sa([""]);return ha=function(){return a},a}function ia(){const a=sa(["Leave"]);return ia=function(){return a},a}function ja(){const a=sa(["Ungroup"]);return ja=function(){return a},a}function ka(){const a=sa(["\n "]);return ka=function(){return a},a}function la(){const a=sa(["\n
\n Group speakers\n ","\n
\n \n ","\n \n \n Group all\n \n
\n
\n "]);return la=function(){return a},a}function ma(){const a=sa(["\n :host {\n position: relative;\n box-sizing: border-box;\n margin: 4px;\n min-width: 0;\n overflow: hidden;\n transition: background .5s;\n }\n :host([raised]) {\n background: rgba(255,255,255,0.25);\n min-height: 36px;\n box-shadow:\n 0px 3px 1px -2px rgba(0, 0, 0, 0.2),\n 0px 2px 2px 0px rgba(0, 0, 0, 0.14),\n 0px 1px 5px 0px rgba(0,0,0,.12);\n }\n :host([color]) {\n background: var(--mmp-active-color);\n transition: background .25s;\n opacity: 1;\n }\n :host([faded]) {\n opacity: .75;\n }\n .container {\n height: 100%;\n width: 100%;\n }\n .slot-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 8px;\n width: auto;\n }\n paper-ripple {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n }\n "]);return ma=function(){return a},a}function na(){const a=sa(["\n
\n
\n \n
\n \n
\n "]);return na=function(){return a},a}function oa(){const a=sa(["\n paper-checkbox {\n padding: 8px 0;\n }\n paper-checkbox > span {\n font-weight: 600;\n }\n\n ha-card[artwork*='cover'][has-artwork] paper-checkbox[disabled] {\n --paper-checkbox-checkmark-color: rgba(0,0,0,.5);\n }\n ha-card[artwork*='cover'][has-artwork] paper-checkbox {\n --paper-checkbox-unchecked-color: #FFFFFF;\n --paper-checkbox-label-color: #FFFFFF;\n }\n "]);return oa=function(){return a},a}function pa(){const a=sa(["(master)"]);return pa=function(){return a},a}function qa(){const a=sa(["\n \n ","\n ","\n \n "]);return qa=function(){return a},a}function ra(){const a=sa(["\n :host {\n overflow: visible !important;\n display: block;\n --mmp-accent-color: var(--mini-media-player-accent-color, var(--accent-color, #f39c12));\n --mmp-base-color: var(--mini-media-player-base-color, var(--primary-text-color, #000));\n --mmp-overlay-color: var(--mini-media-player-overlay-color, rgba(0,0,0,0.5));\n --mmp-overlay-base-color: var(--mini-media-player-overlay-base-color, #fff);\n --mmp-overlay-accent-color: var(--mini-media-player-overlay-accent-color, --mmp-accent-color);\n --mmp-text-color: var(--mini-media-player-base-color, --primary-text-color);\n --mmp-media-cover-info-color: var(--mini-media-player-media-cover-info-color, --mmp-text-color);\n --mmp-text-color-inverted: var(--disabled-text-color);\n --mmp-active-color: var(--mmp-accent-color);\n --mmp-icon-color: var(--mini-media-player-base-color, var(--paper-item-icon-color, #44739e));\n --mmp-info-opacity: 1;\n --mdc-theme-primary: var(--mmp-text-color);\n --mdc-theme-on-primary: var(--mmp-text-color);\n --paper-checkbox-unchecked-color: var(--mmp-text-color);\n --paper-checkbox-label-color: var(--mmp-text-color);\n color: var(--mmp-text-color);\n }\n ha-card.--bg {\n --mmp-info-opacity: .75;\n }\n ha-card.--has-artwork[artwork*='cover'] {\n --mmp-accent-color: var(--mini-media-player-overlay-accent-color, var(--mini-media-player-accent-color, var(--accent-color, #f39c12)));\n --mmp-text-color: var(--mmp-overlay-base-color);\n --mmp-text-color-inverted: #000;\n --mmp-active-color: rgba(255,255,255,.5);\n --mmp-icon-color: var(--mmp-text-color);\n --mmp-info-opacity: .75;\n --paper-slider-container-color: var(--mini-media-player-overlay-color, rgba(255,255,255,.75));\n --mdc-theme-primary: var(--mmp-text-color);\n --mdc-theme-on-primary: var(--mmp-text-color);\n --paper-checkbox-unchecked-color: var(--mmp-text-color);\n --paper-checkbox-label-color: var(--mmp-text-color);\n color: var(--mmp-text-color);\n }\n ha-card {\n cursor: default;\n display: flex;\n background: transparent;\n overflow: hidden;\n padding: 0;\n position: relative;\n color: inherit;\n }\n ha-card.--group {\n box-shadow: none;\n }\n ha-card.--more-info {\n cursor: pointer;\n }\n ha-card.--collapse {\n overflow: visible;\n }\n .mmp__bg, .mmp__player, .mmp__container {\n border-radius: var(--ha-card-border-radius, 0);\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n }\n .mmp__container {\n overflow: hidden;\n height: 100%;\n width: 100%;\n position: absolute;\n pointer-events: none;\n }\n ha-card:before {\n content: '';\n padding-top: 0px;\n transition: padding-top .5s cubic-bezier(.21,.61,.35,1);\n will-change: padding-top;\n }\n ha-card.--initial .entity__artwork,\n ha-card.--initial .entity__icon {\n animation-duration: .001s;\n }\n ha-card.--initial:before,\n ha-card.--initial .mmp-player {\n transition: none;\n }\n header {\n display: none;\n }\n ha-card[artwork='full-cover'].--has-artwork:before {\n padding-top: 56%;\n }\n ha-card[artwork='full-cover'].--has-artwork[content='music']:before,\n ha-card[artwork='full-cover-fit'].--has-artwork:before {\n padding-top: 100%;\n }\n .mmp__bg {\n background: var(--ha-card-background, var(--paper-card-background-color, white));\n position: absolute;\n top: 0; right: 0; bottom: 0; left: 0;\n overflow: hidden;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n }\n ha-card.--group .mmp__bg {\n background: transparent;\n }\n .cover,\n .cover:before {\n display: block;\n opacity: 0;\n position: absolute;\n top: 0; right: 0; bottom: 0; left: 0;\n transition: opacity .75s cubic-bezier(.21,.61,.35,1);\n will-change: opacity;\n }\n .cover {\n animation: fade-in .5s cubic-bezier(.21,.61,.35,1);\n background-size: cover;\n background-repeat: no-repeat;\n background-position: center center;\n }\n .cover:before {\n background: var(--mmp-overlay-color);\n content: '';\n }\n ha-card[artwork*='full-cover'].--has-artwork .mmp-player {\n background: linear-gradient(to top, var(--mmp-overlay-color) 25%, transparent 100%);\n border-bottom-left-radius: var(--ha-card-border-radius, 0);\n border-bottom-right-radius: var(--ha-card-border-radius, 0);\n }\n ha-card.--has-artwork .cover,\n ha-card.--has-artwork[artwork='cover'] .cover:before,\n ha-card.--bg .cover {\n opacity: .999;\n }\n ha-card[artwork='default'] .cover {\n display: none;\n }\n ha-card.--bg .cover {\n display: block;\n }\n ha-card[artwork='full-cover-fit'].--has-artwork .cover {\n background-color: black;\n background-size: contain;\n }\n .mmp-player {\n align-self: flex-end;\n box-sizing: border-box;\n position: relative;\n padding: 16px;\n transition: padding .25s ease-out;\n width: 100%;\n will-change: padding;\n }\n ha-card.--group .mmp-player {\n padding: 2px 0;\n }\n .flex {\n display: flex;\n display: -ms-flexbox;\n display: -webkit-flex;\n flex-direction: row;\n }\n .mmp-player__core {\n position: relative;\n }\n .entity__info {\n justify-content: center;\n display: flex;\n flex-direction: column;\n margin-left: 8px;\n position: relative;\n overflow: hidden;\n user-select: none;\n }\n ha-card.--rtl .entity__info {\n margin-left: auto;\n margin-right: 8px;\n }\n ha-card[content='movie'] .attr__media_season,\n ha-card[content='movie'] .attr__media_episode {\n display: none;\n }\n .entity__icon {\n color: var(--mmp-icon-color);\n }\n .entity__artwork, .entity__icon {\n animation: fade-in .25s ease-out;\n background-position: center center;\n background-repeat: no-repeat;\n background-size: cover;\n border-radius: 100%;\n height: 40px;\n width: 40px;\n min-width: 40px;\n line-height: 40px;\n margin-right: 8px;\n position: relative;\n text-align: center;\n will-change: border-color;\n transition: border-color .25s ease-out;\n }\n ha-card.--rtl .entity__artwork,\n ha-card.--rtl .entity__icon {\n margin-right: auto;\n }\n .entity__artwork[border] {\n border: 2px solid var(--primary-text-color);\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n }\n .entity__artwork[border][state='playing'] {\n border-color: var(--mmp-accent-color);\n }\n .entity__info__name,\n .entity__info__media[short] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .entity__info__name {\n line-height: 20px;\n color: var(--mmp-text-color);\n }\n .entity__info__media {\n color: var(--secondary-text-color);\n max-height: 6em;\n word-break: break-word;\n opacity: var(--mmp-info-opacity);\n transition: color .5s;\n }\n .entity__info__media[short] {\n max-height: 20px;\n overflow: hidden;\n }\n .attr__app_name {\n display: none;\n }\n .attr__app_name:first-child,\n .attr__app_name:first-of-type {\n display: inline;\n }\n .mmp-player__core[inactive] .entity__info__media {\n color: var(--mmp-text-color);\n max-width: 200px;\n opacity: .5;\n }\n .entity__info__media[short-scroll] {\n max-height: 20px;\n white-space: nowrap;\n }\n .entity__info__media[scroll] > span {\n visibility: hidden;\n }\n .entity__info__media[scroll] > div {\n animation: move linear infinite;\n }\n .entity__info__media[scroll] .marquee {\n animation: slide linear infinite;\n }\n .entity__info__media[scroll] .marquee,\n .entity__info__media[scroll] > div {\n animation-duration: inherit;\n visibility: visible;\n }\n .entity__info__media[scroll] {\n animation-duration: 10s;\n mask-image: linear-gradient(to right, transparent 0%, black 5%, black 95%, transparent 100%);\n -webkit-mask-image: linear-gradient(to right, transparent 0%, black 5%, black 95%, transparent 100%);\n }\n .marquee {\n visibility: hidden;\n position: absolute;\n white-space: nowrap;\n }\n ha-card[artwork*='cover'].--has-artwork .entity__info__media,\n ha-card.--bg .entity__info__media {\n color: var(--mmp-media-cover-info-color);\n }\n .entity__info__media span:before {\n content: ' - ';\n }\n .entity__info__media span:first-of-type:before {\n content: '';\n }\n .entity__info__media span:empty {\n display: none;\n }\n .mmp-player__adds {\n margin-left: 48px;\n position: relative;\n }\n ha-card.--rtl .mmp-player__adds {\n margin-left: auto;\n margin-right: 48px;\n }\n .mmp-player__adds > *:nth-child(2) {\n margin-top: 0px;\n }\n mmp-powerstrip {\n flex: 1;\n justify-content: flex-end;\n margin-right: 0;\n margin-left: auto;\n width: auto;\n max-width: 100%;\n }\n mmp-media-controls {\n flex-wrap: wrap;\n justify-content: center;\n }\n ha-card.--flow mmp-powerstrip {\n justify-content: space-between;\n margin-left: auto;\n }\n ha-card.--flow.--rtl mmp-powerstrip {\n margin-right: auto;\n }\n ha-card.--flow .entity__info {\n display: none;\n }\n ha-card.--responsive .mmp-player__adds {\n margin-left: 0;\n }\n ha-card.--responsive.--rtl .mmp-player__adds {\n margin-right: 0;\n }\n ha-card.--responsive .mmp-player__adds > mmp-media-controls {\n padding: 0;\n }\n ha-card.--runtime .mmp-player {\n padding-bottom: calc(16px + 8px);\n }\n ha-card.--runtime.--group .mmp-player {\n padding-bottom: calc(16px + 8px);\n }\n .mmp-player div:empty {\n display: none;\n }\n @keyframes slide {\n 100% { transform: translateX(-100%); }\n }\n @keyframes move {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n @keyframes fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n"]);return ra=function(){return a},a}function sa(a,b){return b||(b=a.slice(0)),Object.freeze(Object.defineProperties(a,{raw:{value:Object.freeze(b)}}))}function ta(a){for(var b=1;ba.parentNode.removeChild(a))}function va(a,b){let c=2"function"==typeof a&&Ia.has(a),Ka=window.customElements!==void 0&&window.customElements.polyfillWrapFlushCallback!==void 0,La=function(a,b){for(let c=2"),Qa=new RegExp("".concat(Oa,"|").concat(Pa)),Ra="$lit$";class Sa{constructor(a,b){this.parts=[],this.element=b;const c=[],d=[],e=document.createTreeWalker(b.content,133,null,!1);let f=0,g=-1,h=0;for(const i=a.strings,j=a.values.length;h{const c=a.length-b.length;return 0<=c&&a.slice(c)===b},Ua=a=>-1!==a.index,Va=()=>document.createComment(""),Wa=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;class Xa{constructor(a,b,c){this.__parts=[],this.template=a,this.processor=b,this.options=c}update(a){let b=0;for(const c of this.__parts)void 0!==c&&c.setValue(a[b]),b++;for(const b of this.__parts)void 0!==b&&b.commit()}_clone(){const a=Ka?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),b=[],c=this.template.parts,d=document.createTreeWalker(a,133,null,!1);let e,f=0,g=0,h=d.nextNode();for(;f",e+1);const f=Wa.exec(a);b+=null===f?a+(c?Oa:Pa):a.substr(0,f.index)+f[1]+f[2]+Ra+f[3]+Oa}return b+=this.strings[a],b}getTemplateElement(){const a=document.createElement("template");return a.innerHTML=this.getHTML(),a}}const Za=a=>null===a||"object"!=typeof a&&"function"!=typeof a,$a=a=>Array.isArray(a)||!!(a&&a[Symbol.iterator]);class _a{constructor(a,b,c){this.dirty=!0,this.element=a,this.name=b,this.strings=c,this.parts=[];for(let d=0;dthis.handleEvent(a)}setValue(a){this.__pendingValue=a}commit(){for(;Ja(this.__pendingValue);){const a=this.__pendingValue;this.__pendingValue=Ma,a(this)}if(this.__pendingValue===Ma)return;const a=this.__pendingValue,b=this.value,c=null==a||null!=b&&(a.capture!==b.capture||a.once!==b.once||a.passive!==b.passive);c&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),null!=a&&(null==b||c)&&(this.__options=hb(a),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=a,this.__pendingValue=Ma}handleEvent(a){"function"==typeof this.value?this.value.call(this.eventContext||this.element,a):this.value.handleEvent(a)}}const hb=a=>a&&(fb?{capture:a.capture,passive:a.passive,once:a.once}:a.capture);const ib=new class{handleAttributeExpressions(a,b,c,d){const e=b[0];if("."===e){const d=new db(a,b.slice(1),c);return d.parts}if("@"===e)return[new gb(a,b.slice(1),d.eventContext)];if("?"===e)return[new cb(a,b.slice(1),c)];const f=new _a(a,b,c);return f.parts}handleTextExpression(a){return new bb(a)}},jb=new Map,kb=new WeakMap,lb=(a,b,c)=>{let d=kb.get(b);d===void 0&&(La(b,b.firstChild),kb.set(b,d=new bb(Object.assign({templateFactory:sa},c))),d.appendInto(b)),d.setValue(a),d.commit()};(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.0.0");const mb=function(a){for(var b=arguments.length,c=Array(1{let b=11===a.nodeType?0:1;for(const c=document.createTreeWalker(a,nb,null,!1);c.nextNode();)b++;return b},pb=function(a){let b=1"".concat(a,"--").concat(b);let rb=!0;"undefined"==typeof window.ShadyCSS?rb=!1:"undefined"==typeof window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),rb=!1);const sb=a=>b=>{const c=qb(b.type,a);let d=jb.get(c);void 0===d&&(d={stringsArray:new WeakMap,keyString:new Map},jb.set(c,d));let e=d.stringsArray.get(b.strings);if(void 0!==e)return e;const f=b.strings.join(Oa);if(e=d.keyString.get(f),void 0===e){const c=b.getTemplateElement();rb&&window.ShadyCSS.prepareTemplateDom(c,a),e=new Sa(b,c),d.keyString.set(f,e)}return d.stringsArray.set(b.strings,e),e},tb=["html","svg"],ub=a=>{tb.forEach(b=>{const c=jb.get(qb(b,a));c!==void 0&&c.keyString.forEach(a=>{const b=a.element.content,c=new Set;Array.from(b.querySelectorAll("style")).forEach(a=>{c.add(a)}),ua(a,c)})})},vb=new Set,wb=(a,b,c)=>{vb.add(c);const d=a.querySelectorAll("style"),e=d.length;if(0===e)return void window.ShadyCSS.prepareTemplateStyles(b.element,c);const f=document.createElement("style");for(let g=0;g{const d=c.scopeName,e=kb.has(b),f=rb&&11===b.nodeType&&!!b.host&&a instanceof Ya,g=f&&!vb.has(d),h=g?document.createDocumentFragment():b;if(lb(a,h,Object.assign({templateFactory:sb(d)},c)),g){const a=kb.get(h);kb.delete(h),a.value instanceof Xa&&wb(h,a.value.template,d),La(b,b.firstChild),b.appendChild(h),kb.set(b,a)}!e&&f&&window.ShadyCSS.styleElement(b.host)};window.JSCompiler_renameProperty=a=>a;const yb={toAttribute(a,b){return b===Boolean?a?"":null:b===Object||b===Array?null==a?a:JSON.stringify(a):a},fromAttribute(a,b){return b===Boolean?null!==a:b===Number?null===a?null:+a:b===Object||b===Array?JSON.parse(a):a}},zb=(a,b)=>b!==a&&(b===b||a===a),Ab={attribute:!0,type:String,converter:yb,reflect:!1,hasChanged:zb},Bb=Promise.resolve(!0),Cb=1,Db=4,Eb=8,Fb=16,Gb=32;class Hb extends HTMLElement{constructor(){super(),this._updateState=0,this._instanceProperties=void 0,this._updatePromise=Bb,this._hasConnectedResolver=void 0,this._changedProperties=new Map,this._reflectingProperties=void 0,this.initialize()}static get observedAttributes(){this.finalize();const a=[];return this._classProperties.forEach((b,c)=>{const d=this._attributeNameForProperty(c,b);void 0!==d&&(this._attributeToPropertyMap.set(d,c),a.push(d))}),a}static _ensureClassProperties(){if(!this.hasOwnProperty(JSCompiler_renameProperty("_classProperties",this))){this._classProperties=new Map;const a=Object.getPrototypeOf(this)._classProperties;a!==void 0&&a.forEach((a,b)=>this._classProperties.set(b,a))}}static createProperty(a){let b=1{if(this.hasOwnProperty(b)){const a=this[b];delete this[b],this._instanceProperties||(this._instanceProperties=new Map),this._instanceProperties.set(b,a)}})}_applyInstanceProperties(){this._instanceProperties.forEach((a,b)=>this[b]=a),this._instanceProperties=void 0}connectedCallback(){this._updateState|=Gb,this._hasConnectedResolver&&(this._hasConnectedResolver(),this._hasConnectedResolver=void 0)}disconnectedCallback(){}attributeChangedCallback(a,b,c){b!==c&&this._attributeToProperty(a,c)}_propertyToAttribute(a,b){let c=2{b=a,c=d});try{yield d}catch(a){}a._hasConnected||(yield new Promise(b=>a._hasConnectedResolver=b));try{const b=a.performUpdate();null!=b&&(yield b)}catch(a){c(a)}b(!a._hasRequestedUpdate)})()}get _hasConnected(){return this._updateState&Gb}get _hasRequestedUpdate(){return this._updateState&Db}get hasUpdated(){return this._updateState&Cb}performUpdate(){this._instanceProperties&&this._applyInstanceProperties();let a=!1;const b=this._changedProperties;try{a=this.shouldUpdate(b),a&&this.update(b)}catch(b){throw a=!1,b}finally{this._markUpdated()}a&&(!(this._updateState&Cb)&&(this._updateState|=Cb,this.firstUpdated(b)),this.updated(b))}_markUpdated(){this._changedProperties=new Map,this._updateState&=~Db}get updateComplete(){return this._updatePromise}shouldUpdate(a){return!0}update(a){this._reflectingProperties!==void 0&&0this._propertyToAttribute(b,this[b],a)),this._reflectingProperties=void 0)}updated(a){}firstUpdated(a){}}Hb.finalized=!0;const Ib="adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Jb=Symbol();class Kb{constructor(a,b){if(b!==Jb)throw new Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=a}get styleSheet(){return void 0===this._styleSheet&&(Ib?(this._styleSheet=new CSSStyleSheet,this._styleSheet.replaceSync(this.cssText)):this._styleSheet=null),this._styleSheet}toString(){return this.cssText}}const Lb=a=>{if(a instanceof Kb)return a.cssText;if("number"==typeof a)return a;throw new Error("Value passed to 'css' function must be a 'css' function result: ".concat(a,". Use 'unsafeCSS' to pass non-literal values, but\n take care to ensure page security."))},Mb=function(a){for(var b=arguments.length,c=Array(1b+Lb(c)+a[d+1],a[0]);return new Kb(e,Jb)};(window.litElementVersions||(window.litElementVersions=[])).push("2.2.0");const Nb=a=>a.flat?a.flat(1/0):xa(a);class Ob extends Hb{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const a=this.styles,b=[];if(Array.isArray(a)){const c=Nb(a),d=c.reduceRight((a,b)=>(a.add(b),a),new Set);d.forEach(a=>b.unshift(a))}else a&&b.push(a);return b}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const a=this.constructor._styles;0===a.length||(window.ShadyCSS===void 0||window.ShadyCSS.nativeShadow?Ib?this.renderRoot.adoptedStyleSheets=a.map(a=>a.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(a.map(a=>a.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&window.ShadyCSS!==void 0&&window.ShadyCSS.styleElement(this)}update(a){super.update(a);const b=this.render();b instanceof Ya&&this.constructor.render(b,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(a=>{const b=document.createElement("style");b.textContent=a.cssText,this.renderRoot.appendChild(b)}))}render(){}}Ob.finalized=!0,Ob.render=xb;const Pb=new WeakMap,Qb=(a=>function(){const b=a(...arguments);return Ia.set(b,!0),b})(a=>b=>{if(!(b instanceof ab)||b instanceof eb||"class"!==b.committer.name||1ta({text:this.attr[a.attr],prefix:""},a)).filter(a=>a.text)}get hasProgress(){return!this.config.hide.progress&&!this.idle&&jc.every(a=>a in this.attr)}get progress(){return this.position+(Date.now()-new Date(this.updatedAt).getTime())/1e3}get idleView(){const a=this.config.idle_view;return!!(a.when_idle&&this.isIdle||a.when_standby&&this.isStandby||a.when_paused&&this.isPaused)||!!(this.updatedAt&&a.after&&!this.isPlaying)&&this.checkIdleAfter(a.after)}get trackIdle(){return this.active&&!this.isPlaying&&this.updatedAt&&this.config.idle_view&&this.config.idle_view.after}checkIdleAfter(a){const b=(Date.now()-new Date(this.updatedAt).getTime())/1e3;return this.idle=b>60*a,this.active=this.isActive,this.idle}get supportsShuffle(){return"undefined"!=typeof this.attr.shuffle}get supportsMute(){return"undefined"!=typeof this.attr.is_volume_muted}getAttribute(a){return this.attr[a]||""}fetchThumbnail(){var a=this;return wa(function*(){try{const b=yield a.hass.callWS({type:"media_player_thumbnail",entity_id:a.config.entity}),c=b.content_type,d=b.content;return"url(data:".concat(c,";base64,").concat(d,")")}catch(a){return console.error("mini-media-player: Failed fetching thumbnail"),!1}})()}toggle(a){return this.config.toggle_power?this.callService(a,"toggle"):this.isOff?this.callService(a,"turn_on"):void this.callService(a,"turn_off")}toggleMute(a){this.callService(a,"volume_mute",{is_volume_muted:!this.muted})}toggleShuffle(a){this.callService(a,"shuffle_set",{shuffle:!this.shuffle})}setSource(a,b){this.callService(a,"select_source",{source:b})}setMedia(a,b){this.callService(a,"play_media",ta({},b))}playPause(a){this.callService(a,"media_play_pause")}setSoundMode(a,b){this.callService(a,"select_sound_mode",{sound_mode:b})}next(a){this.callService(a,"media_next_track")}prev(a){this.callService(a,"media_previous_track")}stop(a){this.callService(a,"media_stop")}volumeUp(a){this.callService(a,"volume_up")}volumeDown(a){this.callService(a,"volume_down")}seek(a,b){this.callService(a,"media_seek",{seek_position:b})}setVolume(a,b){this.config.speaker_group.sync_volume?this.group.forEach(c=>{const d=this.config.speaker_group.entities.find(a=>a.entity_id===c)||{};let e=b;d.volume_offset&&(e+=d.volume_offset/100,1e&&(e=0)),this.callService(a,"volume_set",{entity_id:c,volume_level:e})}):this.callService(a,"volume_set",{entity_id:this.config.entity,volume_level:b})}handleGroupChange(a,b,c){const d=this.config.speaker_group.platform,e={entity_id:b};if(c){if(e.master=this.config.entity,"sonos"===d)return this.callService(a,"join",e,d);this.callService(a,"".concat(d,"_JOIN"),e)}else{if("sonos"===d)return this.callService(a,"unjoin",e,d);this.callService(a,"".concat(d,"_UNJOIN"),e)}}toggleScript(a,b){let c=2a.stopPropagation(),this.handleClick,this.item.name,this.master?mb(pa()):"")}handleClick(a){a.stopPropagation(),this.dispatchEvent(new CustomEvent("change",{detail:{entity:this.item.entity_id,checked:!this.checked}}))}static get styles(){return Mb(oa())}}customElements.define("mmp-group-item",nc);class oc extends Ob{render(){return mb(na())}static get styles(){return Mb(ma())}}customElements.define("mmp-button",oc);class pc extends Ob{static get properties(){return{entities:{},player:{},visible:Boolean}}get group(){return this.player.group}get master(){return this.player.master}get isMaster(){return this.player.isMaster}handleGroupChange(a){const b=a.detail,c=b.entity,d=b.checked;this.player.handleGroupChange(a,c,d)}render(){let a=0mb(ka(),this.handleGroupChange,a,a.entity_id===this.player.id||b.includes(a.entity_id),a.entity_id===this.player.id||c!==this.player.id,a.entity_id===c)),2>b.length,a=>this.player.handleGroupChange(a,d?b:this.player.entity_id,!1),d?mb(ja()):mb(ia()),!d,a=>this.player.handleGroupChange(a,this.entities.map(a=>a.entity_id),!0)):mb(ha())}static get styles(){return Mb(ga())}}customElements.define("mmp-group-list",pc);const qc=Mb(fa());class rc extends Ob{static get properties(){return{items:[],label:String,selected:String}}get selectedId(){return this.items.map(a=>a.id).indexOf(this.selected)}onChange(a){this.dispatchEvent(new CustomEvent("change",{detail:a}))}render(){return mb(ea(),"right","top",44,a=>a.stopPropagation(),this.icon?mb(da(),hc.DROPDOWN):mb(ca(),this.selected||this.label,hc.DROPDOWN),this.selectedId,this.items.map(a=>mb(ba(),a.id||a.name,()=>this.onChange(a),a.icon?mb(aa(),a.icon):"",a.name?mb(_(),a.name):"")))}static get styles(){return[qc,Mb($())]}}customElements.define("mmp-dropdown",rc);class sc extends Ob{static get properties(){return{player:{},shortcuts:{}}}get buttons(){return this.shortcuts.buttons}get list(){return this.shortcuts.list}get show(){return!this.shortcuts.hide_when_off||this.player.active}get active(){return this.player.getAttribute(this.shortcuts.attribute)}get height(){return this.shortcuts.column_height||36}render(){if(!this.show)return mb(Z());const a=this.active,b=this.list?mb(Y(),this.handleShortcut,this.list,this.shortcuts.label,a):"",c=this.buttons?mb(X(),this.buttons.map(b=>mb(W(),"min-height: ".concat(this.height,"px;"),this.shortcuts.columns,b.id===a,a=>this.handleShortcut(a,b),this.shortcuts.align_text,b.icon?mb(V(),b.icon):"",b.name?mb(U(),b.name):""))):"";return mb(T(),c,b)}handleShortcut(a,b){const c=b||a.detail,d=c.type,e=c.id,f=c.data;if("source"===d)return this.player.setSource(a,e);if("service"===d)return this.player.toggleService(a,e,f);if("script"===d)return this.player.toggleScript(a,e,f);if("sound_mode"===d)return this.player.setSoundMode(a,e);this.player.setMedia(a,{media_content_type:d,media_content_id:e})}static get styles(){return[qc,Mb(S())]}}customElements.define("mmp-shortcuts",sc);const tc=function(a,b){let c=2a.stopPropagation(),this.handleTts)}handleTts(a){const b=this.config,c=this.message,d={message:c,entity_id:b.entity_id||this.entity};b.language&&(d.language=b.language),"alexa"===b.platform?this.hass.callService("notify","alexa_media",{message:c,data:{type:b.type||"tts"},target:d.entity_id}):"sonos"===b.platform?this.hass.callService("script","sonos_say",{sonos_entity:d.entity_id,volume:b.volume||.5,message:c}):"webos"===b.platform?this.hass.callService("notify",d.entity_id.split(".").slice(-1)[0],{message:c}):"ga"===b.platform?this.hass.callService("notify","ga_broadcast",{message:c}):this.hass.callService("tts","".concat(b.platform,"_say"),d),a.stopPropagation(),this.reset()}reset(){this.input.value=""}static get styles(){return Mb(Q())}}customElements.define("mmp-tts",uc);var vc=a=>{let b=parseInt(a%60,10),c=parseInt(a/60%60,10),d=parseInt(a/3600%24,10);return d=10>d?"0".concat(d):d,c=10>c?"0".concat(c):c,b=10>b?"0".concat(b):b,"".concat("00"===d?"":"".concat(d,":")).concat(c,":").concat(b)};class wc extends Ob{static get properties(){return{_player:{},showTime:Boolean,progress:Number,duration:Number,tracker:{},track:Boolean}}set player(a){this._player=a,this.hasProgress&&this.trackProgress()}get duration(){return this.player.mediaDuration}get player(){return this._player}get hasProgress(){return this.player.hasProgress}render(){return this.player.active&&this.hasProgress?mb(P(),this.handleSeek,!this.player.isPlaying,this.showTime?mb(O(),vc(this.progress),vc(this.duration)):"",this.progress,this.duration):mb(N())}trackProgress(){this.progress=this.player.progress,this.tracker||(this.tracker=setInterval(()=>this.trackProgress(),1e3)),this.player.isPlaying||(clearInterval(this.tracker),this.tracker=null)}handleSeek(a){const b=this.duration,c=a.offsetX/a.target.offsetWidth*b;this.player.seek(a,c)}disconnectedCallback(){clearInterval(this.tracker)}static get styles(){return Mb(M())}}customElements.define("mmp-progress",wc);class xc extends Ob{static get properties(){return{player:{},selected:String,icon:Boolean}}get source(){return this.player.source}get sources(){return this.player.sources.map(a=>({name:a,id:a,type:"source"}))}render(){return mb(L(),this.handleSource,this.sources,this.source,this.selected||this.source,this.icon)}handleSource(a){const b=a.detail.id;this.player.setSource(a,b),this.selected=b}static get styles(){return Mb(K())}}customElements.define("mmp-source-menu",xc);class yc extends Ob{static get properties(){return{player:{},selected:String,icon:Boolean}}get mode(){return this.player.soundMode}get modes(){return this.player.soundModes.map(a=>({name:a,id:a,type:"soundMode"}))}render(){return mb(J(),this.handleChange,this.modes,this.mode,this.selected||this.mode,this.icon)}handleChange(a){const b=a.detail.id;this.player.setSoundMode(a,b),this.selected=b}static get styles(){return Mb(I())}}customElements.define("mmp-sound-menu",yc);class zc extends Ob{static get properties(){return{player:{},config:{},break:Boolean}}get showShuffle(){return!this.config.hide.shuffle&&this.player.supportsShuffle}get maxVol(){return this.config.max_volume||100}get minVol(){return this.config.min_volume||0}render(){const a=this.config.hide;return mb(H(),a.volume?mb(G()):this.renderVolControls(this.player.muted),this.showShuffle?mb(F(),a=>this.player.toggleShuffle(a),hc.SHUFFLE,this.player.shuffle):mb(E()),a.controls?mb(C()):mb(D(),this.config.flow||this.break,a=>this.player.prev(a),hc.PREV,a=>this.player.playPause(a),hc.PLAY[this.player.isPlaying],a=>this.player.next(a),hc.NEXT))}renderVolControls(a){return this.config.volume_stateless?this.renderVolButtons(a):this.renderVolSlider(a)}renderVolSlider(a){return mb(B(),this.renderMuteButton(a),this.handleVolumeChange,a=>a.stopPropagation(),a,this.minVol,this.maxVol,100*this.player.vol,"ltr")}renderVolButtons(a){return mb(A(),this.renderMuteButton(a),a=>this.player.volumeDown(a),hc.VOL_DOWN,a=>this.player.volumeUp(a),hc.VOL_UP)}renderMuteButton(a){if(!this.config.hide.mute)switch(this.config.replace_mute){case"play":return mb(z(),a=>this.player.playPause(a),hc.PLAY[this.player.isPlaying]);case"stop":return mb(y(),a=>this.player.stop(a),hc.STOP);case"next":return mb(x(),a=>this.player.next(a),hc.NEXT);default:return this.player.supportsMute?mb(w(),a=>this.player.toggleMute(a),hc.MUTE[a]):void 0;}}handleVolumeChange(a){const b=parseFloat(a.target.value)/100;this.player.setVolume(a,b)}static get styles(){return[qc,Mb(v())]}}customElements.define("mmp-media-controls",zc);class Ac extends Ob{static get properties(){return{hass:{},player:{},config:{},groupVisible:Boolean,idle:Boolean}}get showGroupButton(){return this.config.speaker_group.entities}get showPowerButton(){return!this.config.hide.power}get powerColor(){return this.player.active&&!this.config.hide.power_state}get sourceSize(){return"icon"===this.config.source||this.config.collapse||this.idle}get soundSize(){return"icon"===this.config.sound_mode||this.config.collapse||this.idle}get hasSource(){return 0this.player.toggle(a),this.powerColor):"")}handleGroupClick(a){a.stopPropagation(),this.dispatchEvent(new CustomEvent("toggleGroupList"))}get renderIdleView(){return this.player.isPaused?mb(n(),hc.PLAY[this.player.isPlaying],a=>this.player.playPause(a)):mb(m(),tc(this.hass,"state.media_player.idle","Idle"))}static get styles(){return[qc,Mb(l())]}}customElements.define("mmp-powerstrip",Ac),customElements.get("ha-slider")||customElements.define("ha-slider",class extends customElements.get("paper-slider"){});class Bc extends Ob{constructor(){super(),this._overflow=!1,this.initial=!0,this.picture=!1,this.thumbnail=!1,this.edit=!1,this.rtl=!1}static get properties(){return{_hass:{},config:{},entity:{},player:{},_overflow:Boolean,break:Boolean,initial:Boolean,picture:String,thumbnail:String,edit:Boolean,rtl:Boolean,idle:Boolean}}static get styles(){return mc}set hass(a){if(a){const b=a.states[this.config.entity];this._hass=a,b&&this.entity!==b&&(this.entity=b,this.player=new lc(a,this.config,b),this.rtl=this.computeRTL(a),this.idle=this.player.idle,this.player.trackIdle&&this.updateIdleStatus())}}get hass(){return this._hass}set overflow(a){this._overflow!==a&&(this._overflow=a)}get overflow(){return this._overflow}get name(){return this.config.name||this.player.name}setConfig(a){if(!a.entity||"media_player"!==a.entity.split(".")[0])throw new Error("Specify an entity from within the media_player domain.");const b=ta({artwork:"default",info:"default",more_info:!0,source:"default",sound_mode:"default",toggle_power:!0},a,{hide:ta({},gc,a.hide),speaker_group:ta({show_group_count:!0,platform:"sonos"},a.sonos,a.speaker_group),shortcuts:ta({label:"Shortcuts..."},a.shortcuts)});b.max_volume=+b.max_volume||100,b.min_volume=+b.min_volume||0,b.collapse=b.hide.controls||b.hide.volume,b.info=b.collapse&&"scroll"!==b.info?"short":b.info,b.flow=b.hide.icon&&b.hide.name&&b.hide.info,this.config=b}shouldUpdate(a){return void 0===this.break&&this.computeRect(this),ic.some(b=>a.has(b))&&this.player}firstUpdated(){const a=new fc(a=>{a.forEach(a=>{window.requestAnimationFrame(()=>{"scroll"===this.config.info&&this.computeOverflow(),this._resizeTimer||(this.computeRect(a),this._resizeTimer=setTimeout(()=>{this._resizeTimer=null,this.computeRect(this._resizeEntry)},250)),this._resizeEntry=a})})});a.observe(this),setTimeout(()=>this.initial=!1,250),this.edit=this.config.speaker_group.expanded||!1}updated(){"scroll"===this.config.info&&setTimeout(()=>{this.computeOverflow()},10)}render(){let a=0mb(b(),"attr__".concat(a.attr),a.prefix+a.text))):"",e.map(b=>mb(a(),"attr__".concat(b.attr),b.prefix+b.text)))}}speakerCount(){if(this.config.speaker_group.show_group_count){const a=this.player.groupCount;return 1{this.thumbnail=a}),this.picture=b),!!(c&&this.thumbnail)}computeIcon(){return this.config.icon?this.config.icon:this.player.icon||hc.DEFAULT}computeOverflow(){const a=this.shadowRoot.querySelector(".marquee");if(a){const b=a.clientWidth>a.parentNode.clientWidth;this.overflow=!!(b&&this.player.active)&&7.5+a.clientWidth/50}}computeRect(a){const b=a.contentRect||a.getBoundingClientRect(),c=b.left,d=b.width;this.break=d+2*c<390}computeRTL(a){const b=a.language||"en";return!!a.translationMetadata.translations[b]&&(a.translationMetadata.translations[b].isRTL||!1)}toggleGroupList(){this.edit=!this.edit}handleMoreInfo(a){a.stopPropagation(),this.config.more_info&&this.fire("hass-more-info",{entityId:this.config.entity})}fire(a,b,c){const d=c||{},f=null===b||void 0===b?{}:b,g=new Event(a,{bubbles:void 0===d.bubbles||d.bubbles,cancelable:!!d.cancelable,composed:void 0===d.composed||d.composed});return g.detail=f,this.dispatchEvent(g),g}updateIdleStatus(){this._idleTracker&&clearTimeout(this._idleTracker);const a=(Date.now()-new Date(this.player.updatedAt).getTime())/1e3;this._idleTracker=setTimeout(()=>{this.idle=this.player.checkIdleAfter(this.config.idle_view.after),this.player.idle=this.idle,this._idleTracker=null},1e3*(60*this.config.idle_view.after-a))}getCardSize(){return this.config.collapse?1:2}}customElements.define("mini-media-player",Bc)})})(); diff --git a/www/community/mini-media-player/mini-media-player.js.gz b/www/community/mini-media-player/mini-media-player.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..499401253fd4df0858f94f124612685a7f453ed8 GIT binary patch literal 20613 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 literal 0 HcmV?d00001 diff --git a/www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js b/www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js new file mode 100644 index 0000000..e6ca89e --- /dev/null +++ b/www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js @@ -0,0 +1,56 @@ +customElements.whenDefined('card-tools').then(() => { + + class SecondaryInfoEntityRow extends cardTools.LitElement { + version() { return "0.3.1"; } + + render() { + return cardTools.LitHtml` + ${this._wrappedElement} + `; + } + + setConfig(config) { + cardTools.checkVersion(0.4); + this._config = config; + this._wrappedElement = this._createElement(config); + this.requestUpdate(); + } + + set hass(hass) { + this._hass = hass; + this._stateObj = this._config.entity in hass.states ? hass.states[this._config.entity] : null; + this._updateElement(this._wrappedElement, hass); + } + + _createElement(config) { + // Override the custom row type in order to create the 'standard' row for this entity + let defaultRowConfig = Object.assign(config, {type: "default"}); + const element = cardTools.createEntityRow(defaultRowConfig); + return element; + } + + async _updateElement(wrappedElement, hass) { + if (!wrappedElement) return; + + this._wrappedElement.hass = hass; + await this._wrappedElement.updateComplete; + await this._wrappedElement.shadowRoot.querySelector("hui-generic-entity-row"); + let secondaryInfoDiv = this._wrappedElement.shadowRoot.querySelector("hui-generic-entity-row").shadowRoot.querySelector(".secondary"); + if (secondaryInfoDiv && this._config.secondary_info) { + let text = window.cardTools.parseTemplate(this._config.secondary_info, {entity: this._config.entity}); + secondaryInfoDiv.innerHTML = text; + } + } + } + customElements.define('secondaryinfo-entity-row', SecondaryInfoEntityRow); + +}); + +setTimeout(() => { + if (customElements.get('card-tools')) return; + customElements.define('secondaryinfo-entity-row', class extends HTMLElement { + setConfig() { + throw new Error("Can't find card-tools. See https://github.com/thomasloven/lovelace-card-tools"); + } + }); +}, 2000); diff --git a/www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js.gz b/www/community/secondaryinfo-entity-row/secondaryinfo-entity-row.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e3ea0518316ff657fc2656c096249511fcc877d GIT binary patch literal 779 zcmV+m1N8hKiwFqc?>1cm|8r$yZ*F8^a(QWPW^XNJZggpMc`b5pcP?sk0Hsw;Z`&{o zz2{eO#?UxGqGTVZ1l}qy*lj`*d+96Gio~uPD^IMa{ z0bC|1e|{|!8j1J4NzJezPy~TfC?48O>Kxg$^t2cemS6W|TKp~k%Fxl5Rm|pL@42KP z;oS@U(#)uU^M4rI-`Yqz;^MOQ#o;@QL1$^&29@QR z>=SR(sGo;#PqkgQM#{q>TyZH{6(fTp$oy1*hzDB|U2T~5f?e%#GX z=f>ugp~$I*kh0=2&Z8_PJ|5G36|jORNici0&?UJ(Y(3~0g3=+_HTIe99067Za#Vvw zvioBgHX$2<$^%qJYSk}t8!e%+39a%sG*xp5U)2qJCE%p<$FdjC)?c)a6t(*lB&TM% zV!83J-CPpIW_@i82|hY@bHjQ_GBym7Obr&O(JDD8Hg&)o9W+$*d+Uzd;F)@;&c%OY zz2G7$)Fve_{u4?kC-t*h8QdziXzt%WGvZdx*{qdj7UEE9tH?T>A#3gX%nO0Jo{N0O zZLOkN+eLe-GZ#v;E*G=UmtI!pQ+L^Q>QBWg>ys_cr&`#pVtZ;wLU;Smj56le@gzIk zG-qmwCZlQ&?xk*EEs*Nd^HBKz#;h2%`'; + root.appendChild(title); + } + + const _createThing = (tag, config) => { + const element = document.createElement(tag); + try { + element.setConfig(config); + } catch (err) { + console.error(tag, err); + return _createError(err.message, config); + } + return element; + }; + + const _createError = (error, config) => { + return _createThing("hui-error-card", { + type: "error", + error, + config, + }); + }; + + const _fireEvent = (ev, detail, entity=null) => { + ev = new Event(ev, { + bubbles: true, + cancelable: false, + composed: true, + }); + ev.detail = detail || {}; + + if (entity) { + entity.dispatchEvent(ev); + } else { + document + .querySelector("home-assistant") + .shadowRoot.querySelector("home-assistant-main") + .shadowRoot.querySelector("app-drawer-layout partial-panel-resolver") + .shadowRoot.querySelector("ha-panel-lovelace") + .shadowRoot.querySelector("hui-root") + .shadowRoot.querySelector("ha-app-layout #view") + .firstElementChild + .dispatchEvent(ev); + } + } + + config.cards.forEach((item) => { + let tag = item.type; + + if (tag.startsWith("divider")) { + tag = `hui-divider-row`; + } else if (tag.startsWith("custom:")) { + tag = tag.substr("custom:".length); + } else { + tag = `hui-${tag}-card`; + } + + if (customElements.get(tag)) { + const element = _createThing(tag, item); + root.appendChild(element); + this._refCards.push(element); + } else { + // If element doesn't exist (yet) create an error + const element = _createError( + `Custom element doesn't exist: ${tag}.`, + item + ); + element.style.display = "None"; + + const time = setTimeout(() => { + element.style.display = ""; + }, 2000); + + // Remove error if element is defined later + customElements.whenDefined(tag).then(() => { + clearTimeout(time); + _fireEvent("ll-rebuild", {}, element); + }); + + root.appendChild(element); + this._refCards.push(element); + } + }); + } + + set hass(hass) { + if (this._refCards) { + this._refCards.forEach((card) => { + card.hass = hass; + }); + } + } + + connectedCallback() { + this._refCards.forEach((element) => { + let fn = () => { + this._card(element); + }; + + if(element.updateComplete) { + element.updateComplete.then(fn); + } else { + fn(); + } + }); + } + + _card(element) { + if (element.shadowRoot) { + if (!element.shadowRoot.querySelector('ha-card')) { + let searchEles = element.shadowRoot.getElementById("root"); + if (!searchEles) { + searchEles = element.shadowRoot.getElementById("card"); + } + if (!searchEles) return; + searchEles = searchEles.childNodes; + for (let i = 0; i < searchEles.length; i++) { + if(searchEles[i].style !== undefined){ + searchEles[i].style.margin = "0px"; + } + this._card(searchEles[i]); + } + } else { + element.shadowRoot.querySelector('ha-card').style.boxShadow = 'none'; + } + } else { + if (typeof element.querySelector === 'function' && element.querySelector('ha-card')) { + element.querySelector('ha-card').style.boxShadow = 'none'; + } + let searchEles = element.childNodes; + for (let i = 0; i < searchEles.length; i++) { + if (searchEles[i] && searchEles[i].style) { + searchEles[i].style.margin = "0px"; + } + this._card(searchEles[i]); + } + } + } + + getCardSize() { + let totalSize = 0; + this._refCards.forEach((element) => { + totalSize += typeof element.getCardSize === 'function' ? element.getCardSize() : 1; + }); + return totalSize; + } +} + +customElements.define('vertical-stack-in-card', VerticalStackInCard); diff --git a/www/community/vertical-stack-in-card/vertical-stack-in-card.js.gz b/www/community/vertical-stack-in-card/vertical-stack-in-card.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..1466f1b86b94ab0545f0cc9b3145002b7a00c8f4 GIT binary patch literal 1826 zcmV+-2i^D|iwFq3IW}Da|8`|^bZKK@Y%OziVPk78X>KiJVRB?HYI6X!SzB-0HWYr( zuVA&ImXJtwvu+P@-C@fDtialbrq~{eBB7;Yn}|$$BxT1<{oi*;%Cat$owS(I#x{BG z{LY1Pnp367-yk(hX@0F~diR!JQkfCB*T6GH{`~mvud5suz%_X|A^1uKS6UXS7BY;= zHSL<>S!f@Mb5G-s(+WIYE?BovDAStUWw znM$Zev*y>9JA5Duk--HSh$Zj=*_P_IC-zN&zC?*^7N+*CZXTPG@R?gCU%!&_W0In? z$}apSCEX-U+4r!%9o6MHyQEkX4r_8HC5B;OLsklBJQY$xst2`Llm=E#DZR-dnTUJm z7a5aaMP(Sra~d0+F>b{!VrOJX&X@Q0|B%SpgoZ<0bN`Z;uOdV65;uSL6P#OupK#L< z#YRk<<~)jmk>5a>f&4%-Rw$p1W;d30`^*^FCkAmflcM0+UdWOnTuM3BcASb_$Q~&f zQ_GxgjEG4t(mSN8$Sf#{G~gPSJQdvb!q#(^0|^aTGN_dPb%yjv89o)5G$}` zjtSF6+phv&2REZa#pfI<L^i_GPU!?!m@9LjGTsy`YSpz=`D*%{f@?C~3KW!pBgR-IFp6MXfc3yojyi-AbRqf9XV)>1GFgC9bOx2DtJW7ZG^4q`jSl)V zWfHDd?&L#QoskSQWjRKhBhEHsUgWvQFIXYHZPA9;GIpJq6q88~>H?8cfX7mc$o?K|yZ{&+zdf4UGXEO9338mlIDe^F?% zq&TnA97`#O9IGUz;R?Im)6Ju$h#b3oPE+^>5tt~Z{C$&h<5}s_4=V=iJ|UO^N|#m6 z7Fa*oF-Y{3<7&)Jrb1rfs2zq(!@`qN*cS=bIYh4^NK6IrKo==+$iO2~|1dqb6ALrL zNaRDa6L)LESkhrQ*SB6U`-G>3(qeIONVsJwCU|GrlP5XwnVvs3X=+yf_<&!wwk)=- z?1sXrD^E@(GjL6+ubb3+T%#V_=3)=U(_Pxlx0K-_ZH}kOvQYCL>fT7;o$l?lGBXpP z_yEnm#|$Uo26RN6-Gp-20v_wAYl~iB-(K1<`n6sVcOuE{nU~o_t+U~YO*Is>uNv3 zjN}+qPxzaVG}rDw9D{{sqH*D%4`~im?wmF5dxB|R`@S6pxvA2V0?}zk3G}QVqg$WD z{}0Ab+I@Qe6oKIFP=)4C`w>D@e)qvZLwi+FO}Xfaso64@QFC21Z=?R%sBR>}k7Fl+ z?2_iWxj;9b#q`;+i-fiVNxtJ1mh)+N~i{+12cJ((xGw6 zA6uQKJbdgSH$7<`a+Rl5_io#4pC)z5T1|dXJ}DV^OTG!Y!eqjZjWZ~Q-XjlNMwzR> zZ{B8M;AV|3?5#a}VNp-=K2@Ea{(V_`+yHm4=(09U*ndgV>S0Wm2k}cn6E224!x6r{ zuCuykj?1T~eU2j-_Y9xd=khVgv+RB8x5 z8t7i&KLLrJM~?%JJ#NsOI6kGe6yp3Rs@Bs~NX8i1!L;D1W`YmM^XGoLBPnu>=gH0- z%)34aejofys2ay?g5d$w@tl1;_O>VAh`Fu5+hAQVo#dK*fkvOPHv*w)Zgy;NzM}>0 z1)Yvb3tTk=+R*ydM}$^hke8zqUmq=>cvR|keF1%KO-HUUgo9Q214*pRFC;PJ4t{68 QUrtcbe^C@)7*-ho05L&wvj6}9 literal 0 HcmV?d00001 diff --git a/www/lovelace/home/xiaomi_vacuum_02.jpg b/www/lovelace/home/xiaomi_vacuum_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52753ac469fd9b741a2bde6d88f32ee16f96f4d8 GIT binary patch literal 6524 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 Qp_kY~rY8H1_