diff --git a/.HA_VERSION b/.HA_VERSION index c107ae9..eded85a 100644 --- a/.HA_VERSION +++ b/.HA_VERSION @@ -1 +1 @@ -0.118.4 \ No newline at end of file +0.118.5 \ No newline at end of file diff --git a/.gitsecret/keys/random_seed b/.gitsecret/keys/random_seed new file mode 100644 index 0000000..e5d2645 Binary files /dev/null and b/.gitsecret/keys/random_seed differ diff --git a/.gitsecret/paths/mapping.cfg b/.gitsecret/paths/mapping.cfg index 03cdeec..49d124e 100644 --- a/.gitsecret/paths/mapping.cfg +++ b/.gitsecret/paths/mapping.cfg @@ -1 +1 @@ -secrets.yaml +secrets.yaml:fc78becc67bfb934dca66f15d286a3406e85527b2b5f6e6a8c9814ac7f9da21a diff --git a/.storage/auth b/.storage/auth index 0936a04..d1c6c87 100644 --- a/.storage/auth +++ b/.storage/auth @@ -127,7 +127,7 @@ "access_token_expiration": 1800.0, "token": "552d438c538636357742acea47d8a022fcaab47c74a20435614f69540088948934d66767b0348eeec4c4de979691f12f3ce28c20c3854dfd0b5b263efd07f40f", "jwt_key": "0ed3886ff667ce6e5f17c621f1c8b8c1f14fe258f2669022c078f14e5e5c3906a8b37ad6c949aa6c1af800a5fbc94fd6e581de258a01c884e368cf6d0d5c741f", - "last_used_at": "2020-12-09T03:15:11.893278+00:00", + "last_used_at": "2020-12-09T20:26:42.959689+00:00", "last_used_ip": "172.30.32.2" }, { @@ -267,7 +267,7 @@ "access_token_expiration": 1800.0, "token": "67154748b468ae62cff3021f566ce8f1d94d89f7e223b3dfb8432226347f1e1f0ba05674e2e089fa98ee08add0be40d38e70f3af9dc74cf9dbb5f9e93d358cb0", "jwt_key": "50e901c4783bb84711838442d27a1ea4d44213eea590113bb1154bd69efc18d98cc8892287520a35a5154b087996bdeba2e131697f28bade44e8f5cc75fa6235", - "last_used_at": "2020-12-08T05:25:01.537324+00:00", + "last_used_at": "2020-12-10T00:25:07.571836+00:00", "last_used_ip": "10.0.0.2" }, { @@ -379,7 +379,7 @@ "access_token_expiration": 1800.0, "token": "5ea306ab1552457ebe01b7a632f008417ee813749b8c9e8a605abcda6df8145d6922caeca209e9a0fef78487981656434ed6d563a0dd74f6c16538a498591e94", "jwt_key": "f4bba52687f6c7f9b9094db72b688a5c6083438a8d72ac9aa9cc3e53362cb3211106ec8dcac9de6e09a54aa131a0064a3e67a46d842f1f24d8ab42f0cca321d4", - "last_used_at": "2020-12-08T05:25:00.817801+00:00", + "last_used_at": "2020-12-09T20:42:53.448449+00:00", "last_used_ip": "10.0.0.2" }, { @@ -855,7 +855,7 @@ "access_token_expiration": 1800.0, "token": "46d540bf2741ae57b9c41eeec6dccc4b0d8c764718b8d98bd92b1d5dc912dbe45a8ff92705590c7f4bac5f9e02df341ad67d34ddb13a7b299e1c5174606d1fd9", "jwt_key": "7a21b2744a112754c6941f07a8aada1391788805946db768f6337c8d05081b0de9c7b0a5c66d56cb241b8e537e4ad696be65c833ef22717697ba1a78f83c9132", - "last_used_at": "2020-12-09T03:21:59.845672+00:00", + "last_used_at": "2020-12-10T00:45:09.973888+00:00", "last_used_ip": "10.0.0.2" }, { @@ -886,34 +886,6 @@ "last_used_at": "2020-11-25T15:01:59.406207+00:00", "last_used_ip": "10.0.0.177" }, - { - "id": "8939761e39a54299a664bfcaa240dc9e", - "user_id": "99685dc45d9f40dc8183e11ce5128038", - "client_id": "https://ha.kebler.net/", - "client_name": null, - "client_icon": null, - "token_type": "normal", - "created_at": "2020-12-06T16:27:13.151351+00:00", - "access_token_expiration": 1800.0, - "token": "e559ac22f009c8ebb7dd77eb5910eb9bf7f033078053605260ade0288da3b130fed5e7b6d7f2f744a5bf7da1f58ea30c7dfe08e4ae245c068e41592dead8adb7", - "jwt_key": "ea22e65251d533073e2421aa93edf45d2f8a4ff7704391570749f8b6f016ec5300556e35f3ddb705cb5f3bec795b7012941aaca80fd4785098931af3d0735d54", - "last_used_at": "2020-12-06T16:27:13.151511+00:00", - "last_used_ip": "10.0.0.2" - }, - { - "id": "4ceb46fd6839478d8f0445f1965b01d6", - "user_id": "99685dc45d9f40dc8183e11ce5128038", - "client_id": "https://ha.kebler.net/", - "client_name": null, - "client_icon": null, - "token_type": "normal", - "created_at": "2020-12-07T04:32:12.604141+00:00", - "access_token_expiration": 1800.0, - "token": "3f474a977d94cc4f87d71db8a47a574f1163b231277e92110667a284b2e4ff0314347b26865be56cc42bf30e6b6f4aa0e30c74202860a23524f4ef56a7445ff8", - "jwt_key": "b918861665e665eb9dd76cf4270b9c72fed9e566bc6b2ef55f47f213da998a3c40cac4f38d2830077b24df62541a0085c1c2471a278ff2ebfb842b3f6eabeff7", - "last_used_at": "2020-12-07T04:32:12.604333+00:00", - "last_used_ip": "10.0.0.2" - }, { "id": "4deb1c92841543cbb4d86079a5320f99", "user_id": "5270c6dbb87642d29fb41212df19da0c", diff --git a/.storage/core.entity_registry b/.storage/core.entity_registry index fcc017f..48cd5c4 100644 --- a/.storage/core.entity_registry +++ b/.storage/core.entity_registry @@ -7,7 +7,6 @@ "entity_id": "binary_sensor.updater", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "updater", "platform": "updater", "name": null, @@ -24,7 +23,6 @@ "entity_id": "person.sysadmin", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "sysadmin", "platform": "person", "name": null, @@ -41,7 +39,6 @@ "entity_id": "input_number.fan_on_temp", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "fan_on_temp", "platform": "input_number", "name": null, @@ -58,7 +55,6 @@ "entity_id": "input_datetime.security_lights_interior_time_off", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "security_lights_interior_time_off", "platform": "input_datetime", "name": null, @@ -75,7 +71,6 @@ "entity_id": "input_boolean.zone_1_reset_zone", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "zone_1_reset_zone", "platform": "input_boolean", "name": null, @@ -92,7 +87,6 @@ "entity_id": "input_number.node_test_first_number", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "node_test_first_number", "platform": "input_number", "name": null, @@ -109,7 +103,6 @@ "entity_id": "input_number.node_test_second_number", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "node_test_second_number", "platform": "input_number", "name": null, @@ -126,7 +119,6 @@ "entity_id": "input_number.test_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "test_schedule_base_hour", "platform": "input_number", "name": null, @@ -143,7 +135,6 @@ "entity_id": "input_number.test_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "test_schedule_base_minute", "platform": "input_number", "name": null, @@ -160,7 +151,6 @@ "entity_id": "input_number.test_timer_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "test_timer_duration", "platform": "input_number", "name": null, @@ -177,7 +167,6 @@ "entity_id": "input_number.zone_1_timer_minutes", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "zone_1_timer_minutes", "platform": "input_number", "name": null, @@ -194,7 +183,6 @@ "entity_id": "input_number.zone_1_timer_hours", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "zone_1_timer_hours", "platform": "input_number", "name": null, @@ -211,7 +199,6 @@ "entity_id": "input_number.zone_1_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "zone_1_duration", "platform": "input_number", "name": null, @@ -228,7 +215,6 @@ "entity_id": "input_number.zone_1_repeat", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "zone_1_repeat", "platform": "input_number", "name": null, @@ -245,7 +231,6 @@ "entity_id": "device_tracker.700t1c", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "6cb92e1b94d47217", "platform": "mobile_app", "name": null, @@ -262,7 +247,6 @@ "entity_id": "sensor.outside_temperature_2", "config_entry_id": "f2587c6a3ce34da5a1209b077a39d931", "device_id": "93560a2f0c64414e8c1a69dbbf3bf97f", - "area_id": null, "unique_id": "ESPsensoroutside_temperature", "platform": "mqtt", "name": null, @@ -279,7 +263,6 @@ "entity_id": "sensor.outside_humidity_2", "config_entry_id": "f2587c6a3ce34da5a1209b077a39d931", "device_id": "93560a2f0c64414e8c1a69dbbf3bf97f", - "area_id": null, "unique_id": "ESPsensoroutside_humidity", "platform": "mqtt", "name": null, @@ -296,7 +279,6 @@ "entity_id": "sensor.inside_temperature", "config_entry_id": "9436e71647e64581a19a2cc8172f9a35", "device_id": "1883f8cbd6b548b992e9a1974008f81f", - "area_id": null, "unique_id": "inside_temp_humdsensorinside_temperature", "platform": "esphome", "name": null, @@ -313,7 +295,6 @@ "entity_id": "sensor.inside_humidity", "config_entry_id": "9436e71647e64581a19a2cc8172f9a35", "device_id": "1883f8cbd6b548b992e9a1974008f81f", - "area_id": null, "unique_id": "inside_temp_humdsensorinside_humidity", "platform": "esphome", "name": null, @@ -330,7 +311,6 @@ "entity_id": "sensor.outside_temperature", "config_entry_id": "cf5266d3fa4a4824850935818193ac48", "device_id": "207200b764c24bb2ac697f37d7c8b4e2", - "area_id": null, "unique_id": "outside_temp_humdsensoroutside_temperature", "platform": "esphome", "name": null, @@ -347,7 +327,6 @@ "entity_id": "sensor.outside_humidity", "config_entry_id": "cf5266d3fa4a4824850935818193ac48", "device_id": "207200b764c24bb2ac697f37d7c8b4e2", - "area_id": null, "unique_id": "outside_temp_humdsensoroutside_humidity", "platform": "esphome", "name": null, @@ -364,7 +343,6 @@ "entity_id": "sensor.700t1c_battery_level", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_level", "platform": "mobile_app", "name": null, @@ -375,13 +353,12 @@ "device_class": "battery", "unit_of_measurement": "%", "original_name": "700T1C Battery Level", - "original_icon": "mdi:battery" + "original_icon": "mdi:battery-90" }, { "entity_id": "sensor.700t1c_battery_state", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_state", "platform": "mobile_app", "name": null, @@ -392,13 +369,12 @@ "device_class": "battery", "unit_of_measurement": null, "original_name": "700T1C Battery State", - "original_icon": "mdi:battery-charging" + "original_icon": "mdi:battery-unknown" }, { "entity_id": "sensor.700t1c_wifi_connection", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_wifi_connection", "platform": "mobile_app", "name": null, @@ -415,7 +391,6 @@ "entity_id": "weather.kgcd_daynight", "config_entry_id": "3ed789ad543542018f094a6d3d209d9a", "device_id": null, - "area_id": null, "unique_id": "44.46097018572946_-118.71158838272095_daynight", "platform": "nws", "name": null, @@ -432,7 +407,6 @@ "entity_id": "weather.kgcd_hourly", "config_entry_id": "3ed789ad543542018f094a6d3d209d9a", "device_id": null, - "area_id": null, "unique_id": "44.46097018572946_-118.71158838272095_hourly", "platform": "nws", "name": null, @@ -449,7 +423,6 @@ "entity_id": "input_number.irrigation_zone_1_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_schedule_base_hour", "platform": "input_number", "name": null, @@ -466,7 +439,6 @@ "entity_id": "input_number.irrigation_zone_1_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_schedule_base_minute", "platform": "input_number", "name": null, @@ -483,7 +455,6 @@ "entity_id": "input_boolean.irrigation_zone_1_schedule_enable", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_schedule_enable", "platform": "input_boolean", "name": null, @@ -500,7 +471,6 @@ "entity_id": "input_boolean.irrigation_zone_1_manual", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_manual", "platform": "input_boolean", "name": null, @@ -517,7 +487,6 @@ "entity_id": "input_number.irrigation_zone_1_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_duration", "platform": "input_number", "name": null, @@ -534,7 +503,6 @@ "entity_id": "input_boolean.irrigation_zone_3_schedule_enable", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_schedule_enable", "platform": "input_boolean", "name": null, @@ -551,7 +519,6 @@ "entity_id": "input_boolean.irrigation_zone_3_manual", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_manual", "platform": "input_boolean", "name": null, @@ -568,7 +535,6 @@ "entity_id": "input_number.irrigation_zone_3_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_duration", "platform": "input_number", "name": null, @@ -585,7 +551,6 @@ "entity_id": "input_number.irrigation_zone_3_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_schedule_base_hour", "platform": "input_number", "name": null, @@ -602,7 +567,6 @@ "entity_id": "input_number.irrigation_zone_3_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_schedule_base_minute", "platform": "input_number", "name": null, @@ -619,7 +583,6 @@ "entity_id": "input_boolean.irrigation_zone_3_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_schedule_enabled", "platform": "input_boolean", "name": null, @@ -636,7 +599,6 @@ "entity_id": "input_boolean.irrigation_zone_3_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_state", "platform": "input_boolean", "name": null, @@ -653,7 +615,6 @@ "entity_id": "input_boolean.irrigation_zone_3_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_3_active", "platform": "input_boolean", "name": null, @@ -670,7 +631,6 @@ "entity_id": "input_boolean.irrigation_zone_1_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_schedule_enabled", "platform": "input_boolean", "name": null, @@ -687,7 +647,6 @@ "entity_id": "input_boolean.irrigation_zone_1_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_active", "platform": "input_boolean", "name": null, @@ -704,7 +663,6 @@ "entity_id": "input_boolean.irrigation_zone_2_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_schedule_enabled", "platform": "input_boolean", "name": null, @@ -721,7 +679,6 @@ "entity_id": "input_boolean.irrigation_zone_2_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_active", "platform": "input_boolean", "name": null, @@ -738,7 +695,6 @@ "entity_id": "input_boolean.irrigation_zone_4_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_schedule_enabled", "platform": "input_boolean", "name": null, @@ -755,7 +711,6 @@ "entity_id": "input_boolean.irrigation_zone_4_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_active", "platform": "input_boolean", "name": null, @@ -772,7 +727,6 @@ "entity_id": "input_boolean.irrigation_zone_5_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_schedule_enabled", "platform": "input_boolean", "name": null, @@ -789,7 +743,6 @@ "entity_id": "input_boolean.irrigation_zone_5_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_active", "platform": "input_boolean", "name": null, @@ -806,7 +759,6 @@ "entity_id": "input_boolean.irrigation_zone_6_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_schedule_enabled", "platform": "input_boolean", "name": null, @@ -823,7 +775,6 @@ "entity_id": "input_boolean.irrigation_zone_6_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_active", "platform": "input_boolean", "name": null, @@ -840,7 +791,6 @@ "entity_id": "input_boolean.irrigation_zone_7_schedule_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_schedule_enabled", "platform": "input_boolean", "name": null, @@ -857,7 +807,6 @@ "entity_id": "input_boolean.irrigation_zone_7_active", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_active", "platform": "input_boolean", "name": null, @@ -874,7 +823,6 @@ "entity_id": "input_number.irrigation_zone_2_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_duration", "platform": "input_number", "name": null, @@ -891,7 +839,6 @@ "entity_id": "input_number.irrigation_zone_2_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_schedule_base_hour", "platform": "input_number", "name": null, @@ -908,7 +855,6 @@ "entity_id": "input_number.irrigation_zone_2_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_schedule_base_minute", "platform": "input_number", "name": null, @@ -925,7 +871,6 @@ "entity_id": "input_number.irrigation_zone_4_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_duration", "platform": "input_number", "name": null, @@ -942,7 +887,6 @@ "entity_id": "input_number.irrigation_zone_4_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_schedule_base_hour", "platform": "input_number", "name": null, @@ -959,7 +903,6 @@ "entity_id": "input_number.irrigation_zone_4_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_schedule_base_minute", "platform": "input_number", "name": null, @@ -976,7 +919,6 @@ "entity_id": "input_number.irrigation_zone_5_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_duration", "platform": "input_number", "name": null, @@ -993,7 +935,6 @@ "entity_id": "input_number.irrigation_zone_5_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_schedule_base_hour", "platform": "input_number", "name": null, @@ -1010,7 +951,6 @@ "entity_id": "input_number.irrigation_zone_5_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_schedule_base_minute", "platform": "input_number", "name": null, @@ -1027,7 +967,6 @@ "entity_id": "input_number.irrigation_zone_6_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_duration", "platform": "input_number", "name": null, @@ -1044,7 +983,6 @@ "entity_id": "input_number.irrigation_zone_6_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_schedule_base_hour", "platform": "input_number", "name": null, @@ -1061,7 +999,6 @@ "entity_id": "input_number.irrigation_zone_6_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_schedule_base_minute", "platform": "input_number", "name": null, @@ -1078,7 +1015,6 @@ "entity_id": "input_number.irrigation_zone_7_duration", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_duration", "platform": "input_number", "name": null, @@ -1095,7 +1031,6 @@ "entity_id": "input_number.irrigation_zone_7_schedule_base_hour", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_schedule_base_hour", "platform": "input_number", "name": null, @@ -1112,7 +1047,6 @@ "entity_id": "input_number.irrigation_zone_7_schedule_base_minute", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_schedule_base_minute", "platform": "input_number", "name": null, @@ -1129,7 +1063,6 @@ "entity_id": "input_boolean.irrigation_pump", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_pump", "platform": "input_boolean", "name": null, @@ -1146,7 +1079,6 @@ "entity_id": "input_boolean.irrigation_enabled", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_enabled", "platform": "input_boolean", "name": null, @@ -1163,7 +1095,6 @@ "entity_id": "input_boolean.irrigation_zone_1_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_1_state", "platform": "input_boolean", "name": null, @@ -1180,7 +1111,6 @@ "entity_id": "input_boolean.irrigation_zone_2_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_2_state", "platform": "input_boolean", "name": null, @@ -1197,7 +1127,6 @@ "entity_id": "input_boolean.irrigation_zone_4_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_4_state", "platform": "input_boolean", "name": null, @@ -1214,7 +1143,6 @@ "entity_id": "input_boolean.irrigation_zone_5_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_5_state", "platform": "input_boolean", "name": null, @@ -1231,7 +1159,6 @@ "entity_id": "input_boolean.irrigation_zone_6_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_6_state", "platform": "input_boolean", "name": null, @@ -1248,7 +1175,6 @@ "entity_id": "input_boolean.irrigation_zone_7_state", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "irrigation_zone_7_state", "platform": "input_boolean", "name": null, @@ -1265,7 +1191,6 @@ "entity_id": "device_tracker.sm_g935r4", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "ea51283736a711a9", "platform": "mobile_app", "name": null, @@ -1282,7 +1207,6 @@ "entity_id": "sensor.sm_g935r4_battery_level", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_battery_level", "platform": "mobile_app", "name": null, @@ -1299,7 +1223,6 @@ "entity_id": "sensor.sm_g935r4_battery_state", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_battery_state", "platform": "mobile_app", "name": null, @@ -1316,7 +1239,6 @@ "entity_id": "sensor.sm_g935r4_wifi_connection", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_wifi_connection", "platform": "mobile_app", "name": null, @@ -1333,7 +1255,6 @@ "entity_id": "sensor.sm_g935r4_geocoded_location", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_geocoded_location", "platform": "mobile_app", "name": null, @@ -1350,7 +1271,6 @@ "entity_id": "sensor.xt1064_battery_state", "config_entry_id": "ea9548ce249e4e388ef42aa16cedfa29", "device_id": "f16e11491ac04282ab179f5727d4f5dc", - "area_id": null, "unique_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_battery_state", "platform": "mobile_app", "name": null, @@ -1367,7 +1287,6 @@ "entity_id": "sensor.xt1064_wifi_connection_2", "config_entry_id": "ea9548ce249e4e388ef42aa16cedfa29", "device_id": "f16e11491ac04282ab179f5727d4f5dc", - "area_id": null, "unique_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_wifi_connection", "platform": "mobile_app", "name": null, @@ -1384,7 +1303,6 @@ "entity_id": "device_tracker.white_motog", "config_entry_id": "ea9548ce249e4e388ef42aa16cedfa29", "device_id": "f16e11491ac04282ab179f5727d4f5dc", - "area_id": null, "unique_id": "764372054dcb3823", "platform": "mobile_app", "name": "White Moto G", @@ -1401,7 +1319,6 @@ "entity_id": "sensor.white_motog_battery_level_2", "config_entry_id": "ea9548ce249e4e388ef42aa16cedfa29", "device_id": "f16e11491ac04282ab179f5727d4f5dc", - "area_id": null, "unique_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_battery_level", "platform": "mobile_app", "name": null, @@ -1418,7 +1335,6 @@ "entity_id": "device_tracker.lgus215", "config_entry_id": "0f3b31063a5d4293a373c98d6c5d5c77", "device_id": "ff1bf04ce1b2439b8a7ebc9237a010d9", - "area_id": null, "unique_id": "315c682d3b2d88cc", "platform": "mobile_app", "name": null, @@ -1435,7 +1351,6 @@ "entity_id": "sensor.lgus215_battery_level", "config_entry_id": "0f3b31063a5d4293a373c98d6c5d5c77", "device_id": "ff1bf04ce1b2439b8a7ebc9237a010d9", - "area_id": null, "unique_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_battery_level", "platform": "mobile_app", "name": null, @@ -1452,7 +1367,6 @@ "entity_id": "sensor.lgus215_battery_state", "config_entry_id": "0f3b31063a5d4293a373c98d6c5d5c77", "device_id": "ff1bf04ce1b2439b8a7ebc9237a010d9", - "area_id": null, "unique_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_battery_state", "platform": "mobile_app", "name": null, @@ -1469,7 +1383,6 @@ "entity_id": "sensor.lgus215_wifi_connection", "config_entry_id": "0f3b31063a5d4293a373c98d6c5d5c77", "device_id": "ff1bf04ce1b2439b8a7ebc9237a010d9", - "area_id": null, "unique_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_wifi_connection", "platform": "mobile_app", "name": null, @@ -1486,7 +1399,6 @@ "entity_id": "sensor.700t1c_bluetooth_connection", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_bluetooth_connection", "platform": "mobile_app", "name": null, @@ -1503,7 +1415,6 @@ "entity_id": "sensor.700t1c_light_sensor", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_light_sensor", "platform": "mobile_app", "name": null, @@ -1520,7 +1431,6 @@ "entity_id": "sensor.700t1c_next_alarm", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_next_alarm", "platform": "mobile_app", "name": null, @@ -1537,7 +1447,6 @@ "entity_id": "sensor.700t1c_storage_sensor", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_storage_sensor", "platform": "mobile_app", "name": null, @@ -1554,7 +1463,6 @@ "entity_id": "sensor.sm_g935r4_bluetooth_connection", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_bluetooth_connection", "platform": "mobile_app", "name": null, @@ -1571,7 +1479,6 @@ "entity_id": "sensor.sm_g935r4_light_sensor", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_light_sensor", "platform": "mobile_app", "name": null, @@ -1588,7 +1495,6 @@ "entity_id": "sensor.sm_g935r4_next_alarm", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_next_alarm", "platform": "mobile_app", "name": null, @@ -1605,7 +1511,6 @@ "entity_id": "sensor.sm_g935r4_storage_sensor", "config_entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c", "device_id": "379851aebc71474585da2f6ce68a5745", - "area_id": null, "unique_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_storage_sensor", "platform": "mobile_app", "name": null, @@ -1622,7 +1527,6 @@ "entity_id": "sensor.700t1c_audio_sensor", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_audio_sensor", "platform": "mobile_app", "name": null, @@ -1639,7 +1543,6 @@ "entity_id": "sensor.700t1c_do_not_disturb_sensor", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_dnd_sensor", "platform": "mobile_app", "name": null, @@ -1656,7 +1559,6 @@ "entity_id": "sensor.700t1c_last_reboot", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_last_reboot", "platform": "mobile_app", "name": null, @@ -1673,7 +1575,6 @@ "entity_id": "sensor.700t1c_detected_activity", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_detected_activity", "platform": "mobile_app", "name": null, @@ -1690,7 +1591,6 @@ "entity_id": "binary_sensor.700t1c_is_charging", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_is_charging", "platform": "mobile_app", "name": null, @@ -1701,13 +1601,12 @@ "device_class": "plug", "unit_of_measurement": null, "original_name": "700T1C Is Charging", - "original_icon": "mdi:power-plug" + "original_icon": "mdi:power-plug-off" }, { "entity_id": "sensor.700t1c_charger_type", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_charger_type", "platform": "mobile_app", "name": null, @@ -1724,7 +1623,6 @@ "entity_id": "sensor.700t1c_battery_health", "config_entry_id": "2872c3dbbf1246c2b7aab8c616984183", "device_id": "515c6f88684b452e86231c4411e3001e", - "area_id": null, "unique_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_health", "platform": "mobile_app", "name": null, @@ -1741,7 +1639,6 @@ "entity_id": "automation.system_set_custom_theme_at_startup", "config_entry_id": null, "device_id": null, - "area_id": null, "unique_id": "themestartup", "platform": "automation", "name": null, @@ -1758,13 +1655,12 @@ "entity_id": "sensor.hacs", "config_entry_id": "d00c44239e11a6b5cc8a1f44eb4c23e2", "device_id": "da36236384f2c8816377b036cf723ece", - "area_id": null, "unique_id": "0717a0cd-745c-48fd-9b16-c8534c9704f9-bc944b0f-fd42-4a58-a072-ade38d1444cd", "platform": "hacs", "name": null, "icon": null, "disabled_by": null, - "capabilities": null, + "capabilities": {}, "supported_features": 0, "device_class": null, "unit_of_measurement": "pending update(s)", diff --git a/.storage/core.restore_state b/.storage/core.restore_state index 72f3a9c..4ef59c7 100644 --- a/.storage/core.restore_state +++ b/.storage/core.restore_state @@ -16,83 +16,15 @@ "user_id": "99685dc45d9f40dc8183e11ce5128038", "friendly_name": "sysadmin" }, - "last_changed": "2020-12-08T05:25:00.344021+00:00", - "last_updated": "2020-12-08T05:25:02.997639+00:00", + "last_changed": "2020-12-09T20:26:41.515970+00:00", + "last_updated": "2020-12-09T20:26:45.048998+00:00", "context": { - "id": "4255f575145f5b45cd7400e14766b5f0", + "id": "43eee253a9194721bfe37a06f37c2652", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "variable.node_test_sum", - "state": "0", - "attributes": {}, - "last_changed": "2020-12-08T05:25:00.748365+00:00", - "last_updated": "2020-12-08T05:25:00.748365+00:00", - "context": { - "id": "ecd48655f8280e92da236c91e1b80758", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "variable.node_test_switch", - "state": "OFF", - "attributes": { - "icon": "mdi:flash" - }, - "last_changed": "2020-12-08T05:25:00.748425+00:00", - "last_updated": "2020-12-08T05:25:00.748425+00:00", - "context": { - "id": "69cb64e5d3dd7b63f1938640d328c79b", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "variable.irrigation_zone_1_schedule_countdown", - "state": "disabled", - "attributes": { - "icon": "mdi:timer-sand", - "friendly_name": "Countdown to Next Scheduled Run" - }, - "last_changed": "2020-12-08T05:25:00.748465+00:00", - "last_updated": "2020-12-08T05:25:00.748465+00:00", - "context": { - "id": "2e819b9a0d598d3c93287390faa1186e", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "variable.irrigation_zone_1_schedule_next_dt", - "state": "disabled", - "attributes": { - "friendly_name": "Time of Next Scheduled Run", - "icon": "mdi:clock" - }, - "last_changed": "2020-12-08T05:25:00.748503+00:00", - "last_updated": "2020-12-08T05:25:00.748503+00:00", - "context": { - "id": "f94d0de80a7b2bc8f638b0af8b8f04bf", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -102,15 +34,15 @@ "friendly_name": "Countdown to Next Scheduled Run", "icon": "mdi:alarm" }, - "last_changed": "2020-12-08T05:25:00.748544+00:00", - "last_updated": "2020-12-08T05:25:00.748544+00:00", + "last_changed": "2020-12-09T20:26:41.907239+00:00", + "last_updated": "2020-12-09T20:26:41.907239+00:00", "context": { - "id": "c2e9e762cebededd2819fc6d906ec9df", + "id": "f9441dfde631e98cce0c7ef370acd1f9", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -120,15 +52,15 @@ "friendly_name": "Next Scheduled Run at", "icon": "mdi:alarm" }, - "last_changed": "2020-12-08T05:25:00.748577+00:00", - "last_updated": "2020-12-08T05:25:00.748577+00:00", + "last_changed": "2020-12-09T20:26:41.907286+00:00", + "last_updated": "2020-12-09T20:26:41.907286+00:00", "context": { - "id": "37d19e65ad25c33e4e6847bf13061749", + "id": "67bea654a29f0d54483de864c93361f3", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -138,15 +70,15 @@ "friendly_name": "Next Schedule to Run", "icon": "mdi:calendar" }, - "last_changed": "2020-12-08T05:25:00.748609+00:00", - "last_updated": "2020-12-08T05:25:00.748609+00:00", + "last_changed": "2020-12-09T20:26:41.907321+00:00", + "last_updated": "2020-12-09T20:26:41.907321+00:00", "context": { - "id": "f713d899e96f1ed98962fe6388d17c6f", + "id": "0407e5ac9837d6e539163e9ea7780e51", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -156,15 +88,15 @@ "friendly_name": "Zones Running Now", "icon": "mdi:view-list" }, - "last_changed": "2020-12-08T05:25:00.748639+00:00", - "last_updated": "2020-12-08T05:25:00.748639+00:00", + "last_changed": "2020-12-09T20:26:41.907354+00:00", + "last_updated": "2020-12-09T20:26:41.907354+00:00", "context": { - "id": "7a0b33cc2d2bc7dfa0ca426d82f2bf4f", + "id": "c0de2ed362aae3857243ac7cc142a186", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -174,15 +106,51 @@ "friendly_name": "Zones Queued to Run", "icon": "mdi:view-list" }, - "last_changed": "2020-12-08T05:25:00.748670+00:00", - "last_updated": "2020-12-08T05:25:00.748670+00:00", + "last_changed": "2020-12-09T20:26:41.907385+00:00", + "last_updated": "2020-12-09T20:26:41.907385+00:00", "context": { - "id": "5e92cceb251ddb4a794e4c4159129559", + "id": "f45d3d02359bcf64af75269ac753bde6", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "variable.irrigation_zone_1_schedule_countdown", + "state": "disabled", + "attributes": { + "icon": "mdi:timer-sand", + "friendly_name": "Countdown to Next Scheduled Run" + }, + "last_changed": "2020-12-09T20:26:41.907417+00:00", + "last_updated": "2020-12-09T20:26:41.907417+00:00", + "context": { + "id": "4c2b896c31d639440e970026f1744d5b", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "variable.irrigation_zone_1_schedule_next_dt", + "state": "disabled", + "attributes": { + "friendly_name": "Time of Next Scheduled Run", + "icon": "mdi:clock" + }, + "last_changed": "2020-12-09T20:26:41.907447+00:00", + "last_updated": "2020-12-09T20:26:41.907447+00:00", + "context": { + "id": "dad0178442c2cbac578c2d06bcd9b43d", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -192,15 +160,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.748702+00:00", - "last_updated": "2020-12-08T05:25:00.748702+00:00", + "last_changed": "2020-12-09T20:26:41.907477+00:00", + "last_updated": "2020-12-09T20:26:41.907477+00:00", "context": { - "id": "a674065748110184cc3552dfe8e39258", + "id": "3db1edd595edda1cc0812d268419f51f", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -210,15 +178,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.748736+00:00", - "last_updated": "2020-12-08T05:25:00.748736+00:00", + "last_changed": "2020-12-09T20:26:41.907506+00:00", + "last_updated": "2020-12-09T20:26:41.907506+00:00", "context": { - "id": "751275476d35233beca9f0b30711655e", + "id": "97b371bbe757851726d985003575e8fe", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -228,15 +196,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.748771+00:00", - "last_updated": "2020-12-08T05:25:00.748771+00:00", + "last_changed": "2020-12-09T20:26:41.907536+00:00", + "last_updated": "2020-12-09T20:26:41.907536+00:00", "context": { - "id": "62238a8a16560f7568fc643150612ed4", + "id": "df1204ae3f9c91568923a1c7ee137668", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -246,15 +214,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.748803+00:00", - "last_updated": "2020-12-08T05:25:00.748803+00:00", + "last_changed": "2020-12-09T20:26:41.907565+00:00", + "last_updated": "2020-12-09T20:26:41.907565+00:00", "context": { - "id": "6217301a3d9e1e60a08f7673e95f807a", + "id": "12f29b95ea69e61f303477a4a95db801", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -264,15 +232,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.748835+00:00", - "last_updated": "2020-12-08T05:25:00.748835+00:00", + "last_changed": "2020-12-09T20:26:41.907594+00:00", + "last_updated": "2020-12-09T20:26:41.907594+00:00", "context": { - "id": "4a9dac0b2e2e02987d24cf49a24794b1", + "id": "8e89b1ee9f3bf6a7945daaafd50fc914", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -282,15 +250,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.748865+00:00", - "last_updated": "2020-12-08T05:25:00.748865+00:00", + "last_changed": "2020-12-09T20:26:41.907623+00:00", + "last_updated": "2020-12-09T20:26:41.907623+00:00", "context": { - "id": "c1b5807b07a53d8885cc4406dc330c0c", + "id": "7bb9f6cf9a962465c20516393c4d1996", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -300,15 +268,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.748896+00:00", - "last_updated": "2020-12-08T05:25:00.748896+00:00", + "last_changed": "2020-12-09T20:26:41.907653+00:00", + "last_updated": "2020-12-09T20:26:41.907653+00:00", "context": { - "id": "db736a852be84abb240e5721bbc3337a", + "id": "d72c6a0708d91e3f479daae7463b1d68", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -318,15 +286,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.748927+00:00", - "last_updated": "2020-12-08T05:25:00.748927+00:00", + "last_changed": "2020-12-09T20:26:41.907681+00:00", + "last_updated": "2020-12-09T20:26:41.907681+00:00", "context": { - "id": "14188bfad2c0e4c34816f033c51edf5a", + "id": "d465e99267316ae4c287c2c74e56f57d", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -336,15 +304,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.748960+00:00", - "last_updated": "2020-12-08T05:25:00.748960+00:00", + "last_changed": "2020-12-09T20:26:41.907712+00:00", + "last_updated": "2020-12-09T20:26:41.907712+00:00", "context": { - "id": "598c4bcc240c9354fb37794607258329", + "id": "05ad38d7d8e841b6511ffc32c4d78e70", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -354,15 +322,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.748992+00:00", - "last_updated": "2020-12-08T05:25:00.748992+00:00", + "last_changed": "2020-12-09T20:26:41.907741+00:00", + "last_updated": "2020-12-09T20:26:41.907741+00:00", "context": { - "id": "085d3c06359e71d6128d57952c7dd387", + "id": "7c09698d01cd958bced998ea46980c9e", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -372,15 +340,15 @@ "icon": "mdi:timer-sand", "friendly_name": "Countdown to Next Scheduled Run" }, - "last_changed": "2020-12-08T05:25:00.749024+00:00", - "last_updated": "2020-12-08T05:25:00.749024+00:00", + "last_changed": "2020-12-09T20:26:41.907771+00:00", + "last_updated": "2020-12-09T20:26:41.907771+00:00", "context": { - "id": "e1c369cd1716b30c17ba671475ebf52b", + "id": "1a3e3675a8908fc5fa1aaa76496b9361", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -390,15 +358,15 @@ "friendly_name": "Time of Next Scheduled Run", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.749060+00:00", - "last_updated": "2020-12-08T05:25:00.749060+00:00", + "last_changed": "2020-12-09T20:26:41.907800+00:00", + "last_updated": "2020-12-09T20:26:41.907800+00:00", "context": { - "id": "8d88ec9f27dc83d6216b5d3974e3c27d", + "id": "081d7ce5d7a9fbe149d1a6ba208550e7", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -412,15 +380,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750229+00:00", - "last_updated": "2020-12-08T05:25:00.750229+00:00", + "last_changed": "2020-12-09T20:26:41.908765+00:00", + "last_updated": "2020-12-09T20:26:41.908765+00:00", "context": { - "id": "e3e45a3129daaa40a608e21a341e8907", + "id": "be2f8ac4a1fb5cc7d787a26c0012497f", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -434,15 +402,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750296+00:00", - "last_updated": "2020-12-08T05:25:00.750296+00:00", + "last_changed": "2020-12-09T20:26:41.908825+00:00", + "last_updated": "2020-12-09T20:26:41.908825+00:00", "context": { - "id": "293a69646f52ae7683790b70c4e74d0f", + "id": "c7679a60f15b395771591aba01eaf1ad", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -456,15 +424,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750350+00:00", - "last_updated": "2020-12-08T05:25:00.750350+00:00", + "last_changed": "2020-12-09T20:26:41.908873+00:00", + "last_updated": "2020-12-09T20:26:41.908873+00:00", "context": { - "id": "2f77e0955c20015c685930176ce86980", + "id": "82d46d1b78708d249b3ac49ed844239a", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -478,15 +446,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750401+00:00", - "last_updated": "2020-12-08T05:25:00.750401+00:00", + "last_changed": "2020-12-09T20:26:41.908918+00:00", + "last_updated": "2020-12-09T20:26:41.908918+00:00", "context": { - "id": "5b2f6604fe5e9a12576577aee0d5f271", + "id": "73d5fd4a168cadf9bb18a23a3309833f", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -500,15 +468,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750449+00:00", - "last_updated": "2020-12-08T05:25:00.750449+00:00", + "last_changed": "2020-12-09T20:26:41.908961+00:00", + "last_updated": "2020-12-09T20:26:41.908961+00:00", "context": { - "id": "21dae0d2d34c882ba47e220f6b98fe5e", + "id": "b7ebf0faca1aacb71f11755e82ab5a68", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -522,15 +490,15 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750497+00:00", - "last_updated": "2020-12-08T05:25:00.750497+00:00", + "last_changed": "2020-12-09T20:26:41.909004+00:00", + "last_updated": "2020-12-09T20:26:41.909004+00:00", "context": { - "id": "4d7253bc8638860bdcbd4cf37111bc05", + "id": "ffa089e12713d04442763cbddb1a1b2b", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -544,328 +512,38 @@ "friendly_name": "Repeat Every", "icon": "mdi:repeat" }, - "last_changed": "2020-12-08T05:25:00.750544+00:00", - "last_updated": "2020-12-08T05:25:00.750544+00:00", + "last_changed": "2020-12-09T20:26:41.909045+00:00", + "last_updated": "2020-12-09T20:26:41.909045+00:00", "context": { - "id": "17a4332be00403a613e70a2d4481d1a7", + "id": "902cde23f036a9919747b9d6e1330945", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_1_schedule_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.752408+00:00", - "last_updated": "2020-12-08T05:25:00.752408+00:00", - "context": { - "id": "f20ccf4a600ae730c0b5467a9aebaf81", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_1_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.752474+00:00", - "last_updated": "2020-12-08T05:25:00.752474+00:00", - "context": { - "id": "2055fd4c26728938c112a63f92d0842d", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_pump", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Well Pump", - "icon": "mdi:water-pump" - }, - "last_changed": "2020-12-08T05:25:00.752533+00:00", - "last_updated": "2020-12-08T05:25:00.752533+00:00", - "context": { - "id": "99ed4cdeeeb31f123f1e48510408389f", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Irrigation System Enabled", - "icon": "mdi:water" - }, - "last_changed": "2020-12-08T05:25:00.752594+00:00", - "last_updated": "2020-12-08T05:25:00.752594+00:00", - "context": { - "id": "62f52d16d2eed84271d763ed6f557ed3", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_2_schedule_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.752648+00:00", - "last_updated": "2020-12-08T05:25:00.752648+00:00", - "context": { - "id": "bb1065a7f4663f62f68445dd2b03e460", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_2_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.752700+00:00", - "last_updated": "2020-12-08T05:25:00.752700+00:00", - "context": { - "id": "cc3d81b0a87239acb4abd78710cf188b", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_3_schedule_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.752750+00:00", - "last_updated": "2020-12-08T05:25:00.752750+00:00", - "context": { - "id": "3c5e3b86305d13fd0a0ddd84ff67fa5b", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_3_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.752800+00:00", - "last_updated": "2020-12-08T05:25:00.752800+00:00", - "context": { - "id": "38eb980329d5b79f0d2e26bb5872cadb", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_4_schedule_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.752849+00:00", - "last_updated": "2020-12-08T05:25:00.752849+00:00", - "context": { - "id": "29951bdcd1214ee82554d0d0915b9d9f", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_4_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.752898+00:00", - "last_updated": "2020-12-08T05:25:00.752898+00:00", - "context": { - "id": "95aeba03dbd19f8b417fc25fcf593f28", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_5_schedule_enabled", - "state": "on", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.752947+00:00", - "last_updated": "2020-12-08T05:25:00.752947+00:00", - "context": { - "id": "a0beff858f1b21c48fd9be638c8a625d", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_5_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.752996+00:00", - "last_updated": "2020-12-08T05:25:00.752996+00:00", - "context": { - "id": "c7b5a3b65d7c0383f444fdb2fe460a9b", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_6_schedule_enabled", - "state": "on", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.753047+00:00", - "last_updated": "2020-12-08T05:25:00.753047+00:00", - "context": { - "id": "4f88548e6c06ad8eccf1e89cb1d800b5", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_6_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.753105+00:00", - "last_updated": "2020-12-08T05:25:00.753105+00:00", - "context": { - "id": "fe21c425423f99be8bac2d7d5ccc14ca", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_7_schedule_enabled", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Schedule (enabled/disabled)" - }, - "last_changed": "2020-12-08T05:25:00.753154+00:00", - "last_updated": "2020-12-08T05:25:00.753154+00:00", - "context": { - "id": "3592f97e375fafbf67c3aa821f9696d9", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_boolean.irrigation_zone_7_state", - "state": "off", - "attributes": { - "editable": false, - "friendly_name": "Zone State (manual override)" - }, - "last_changed": "2020-12-08T05:25:00.753204+00:00", - "last_updated": "2020-12-08T05:25:00.753204+00:00", - "context": { - "id": "f100bd58ceb516494efa69580b7a4458", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { "entity_id": "input_datetime.security_lights_interior_time_off", - "state": "22:30:00", + "state": "22:20:00", "attributes": { "editable": false, "has_date": false, "has_time": true, "hour": 22, - "minute": 30, + "minute": 20, "second": 0, - "timestamp": 81000 + "timestamp": 80400 }, - "last_changed": "2020-12-08T05:25:00.754630+00:00", - "last_updated": "2020-12-08T05:25:00.754630+00:00", + "last_changed": "2020-12-09T21:31:54.094274+00:00", + "last_updated": "2020-12-09T21:31:54.094274+00:00", "context": { - "id": "32da5ad7fa766eca40a0a4784ced040d", + "id": "efa2f2c107e3adc683eb4591f8770e8f", "parent_id": null, - "user_id": null + "user_id": "99685dc45d9f40dc8183e11ce5128038" } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -882,61 +560,15 @@ "friendly_name": "Fan On Set Temperature (C)", "icon": "mdi:target" }, - "last_changed": "2020-12-08T05:25:00.755171+00:00", - "last_updated": "2020-12-08T05:25:00.755171+00:00", + "last_changed": "2020-12-09T20:26:41.911760+00:00", + "last_updated": "2020-12-09T20:26:41.911760+00:00", "context": { - "id": "e87632e5ed4c67fde31794228ee65d22", + "id": "278552940a408bce8c89f601bb0687c4", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_number.node_test_first_number", - "state": "25.0", - "attributes": { - "initial": 25.0, - "editable": false, - "min": 0.0, - "max": 100.0, - "step": 1.0, - "mode": "slider", - "friendly_name": "First Number" - }, - "last_changed": "2020-12-08T05:25:00.755223+00:00", - "last_updated": "2020-12-08T05:25:00.755223+00:00", - "context": { - "id": "e69e7f897026333dd263b59a66343ccc", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "input_number.node_test_second_number", - "state": "75.0", - "attributes": { - "initial": 75.0, - "editable": false, - "min": 0.0, - "max": 100.0, - "step": 1.0, - "mode": "slider", - "friendly_name": "Second Number" - }, - "last_changed": "2020-12-08T05:25:00.755264+00:00", - "last_updated": "2020-12-08T05:25:00.755264+00:00", - "context": { - "id": "8c7f2bc11904fd59885ee09cb1ebda43", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -952,15 +584,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755337+00:00", - "last_updated": "2020-12-08T05:25:00.755337+00:00", + "last_changed": "2020-12-09T20:26:41.911826+00:00", + "last_updated": "2020-12-09T20:26:41.911826+00:00", "context": { - "id": "6dff36871bbb629e6a90b635a5a0bc86", + "id": "376df98691297c8fc9641ea12321f3a9", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -976,15 +608,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755379+00:00", - "last_updated": "2020-12-08T05:25:00.755379+00:00", + "last_changed": "2020-12-09T20:26:41.911866+00:00", + "last_updated": "2020-12-09T20:26:41.911866+00:00", "context": { - "id": "88aafb3a2af12ca01818c0dae8f76a05", + "id": "a8903e31ab532097fc63fd8761261a4b", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1000,15 +632,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755416+00:00", - "last_updated": "2020-12-08T05:25:00.755416+00:00", + "last_changed": "2020-12-09T20:26:41.911902+00:00", + "last_updated": "2020-12-09T20:26:41.911902+00:00", "context": { - "id": "f1d5dc1ac45010dc5b5ddb562c0ef3fa", + "id": "7af4b0ede8a2d581732654279da6b5e9", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1024,15 +656,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755476+00:00", - "last_updated": "2020-12-08T05:25:00.755476+00:00", + "last_changed": "2020-12-09T20:26:41.911957+00:00", + "last_updated": "2020-12-09T20:26:41.911957+00:00", "context": { - "id": "bd4d9d97cad4d81f2116339561ff5969", + "id": "4ed3687a031318f294c59e78f220b4e3", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1048,15 +680,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755517+00:00", - "last_updated": "2020-12-08T05:25:00.755517+00:00", + "last_changed": "2020-12-09T20:26:41.911994+00:00", + "last_updated": "2020-12-09T20:26:41.911994+00:00", "context": { - "id": "ca0e8e74d944bb5468fd8c000438f6df", + "id": "ff5f44881b7d788bdb3dd3eacaa6686d", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1072,15 +704,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755553+00:00", - "last_updated": "2020-12-08T05:25:00.755553+00:00", + "last_changed": "2020-12-09T20:26:41.912026+00:00", + "last_updated": "2020-12-09T20:26:41.912026+00:00", "context": { - "id": "16d2223edd72f746de304127d2889d5d", + "id": "41ff8c9690e22dad2d92f3300531f6c6", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1096,15 +728,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755610+00:00", - "last_updated": "2020-12-08T05:25:00.755610+00:00", + "last_changed": "2020-12-09T20:26:41.912074+00:00", + "last_updated": "2020-12-09T20:26:41.912074+00:00", "context": { - "id": "9b5be34cbd81399103b468094a48a880", + "id": "2ef962c667193fd06e37f41b4c777640", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1120,15 +752,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755651+00:00", - "last_updated": "2020-12-08T05:25:00.755651+00:00", + "last_changed": "2020-12-09T20:26:41.912108+00:00", + "last_updated": "2020-12-09T20:26:41.912108+00:00", "context": { - "id": "522cc3dc28ac8bf704cee4f9880d7051", + "id": "aa63ba629c7123b45451508705f8464c", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1144,15 +776,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755687+00:00", - "last_updated": "2020-12-08T05:25:00.755687+00:00", + "last_changed": "2020-12-09T20:26:41.912146+00:00", + "last_updated": "2020-12-09T20:26:41.912146+00:00", "context": { - "id": "51ba8efb111c9ca2bfb1a58bb6c95728", + "id": "d233bab016fa8a0ebaf23bf71e559438", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1168,15 +800,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755739+00:00", - "last_updated": "2020-12-08T05:25:00.755739+00:00", + "last_changed": "2020-12-09T20:26:41.912193+00:00", + "last_updated": "2020-12-09T20:26:41.912193+00:00", "context": { - "id": "3ec87caff395b3f59af3e7624e30a852", + "id": "6aef62175ccca92b03e552872a235ae5", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1192,15 +824,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755776+00:00", - "last_updated": "2020-12-08T05:25:00.755776+00:00", + "last_changed": "2020-12-09T20:26:41.912229+00:00", + "last_updated": "2020-12-09T20:26:41.912229+00:00", "context": { - "id": "d478969b942c21079be796b521c02bed", + "id": "02205c0b1f7a496b00c1704f5aed7c39", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1216,15 +848,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755811+00:00", - "last_updated": "2020-12-08T05:25:00.755811+00:00", + "last_changed": "2020-12-09T20:26:41.912261+00:00", + "last_updated": "2020-12-09T20:26:41.912261+00:00", "context": { - "id": "3ead7bd0c1891bfa7e18e4e9664840a0", + "id": "e9e687f451f81440a1980fa08076b1c0", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1240,15 +872,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755863+00:00", - "last_updated": "2020-12-08T05:25:00.755863+00:00", + "last_changed": "2020-12-09T20:26:41.912314+00:00", + "last_updated": "2020-12-09T20:26:41.912314+00:00", "context": { - "id": "722617726165891f651575777539d430", + "id": "ff8ee7f4147c0d443a358b01b4ae37e4", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1264,15 +896,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755899+00:00", - "last_updated": "2020-12-08T05:25:00.755899+00:00", + "last_changed": "2020-12-09T20:26:41.912350+00:00", + "last_updated": "2020-12-09T20:26:41.912350+00:00", "context": { - "id": "3b04eee81ea61483eaec22951136d566", + "id": "abc1ba2d797d699b1d83cf77d00edb83", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1288,15 +920,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.755933+00:00", - "last_updated": "2020-12-08T05:25:00.755933+00:00", + "last_changed": "2020-12-09T20:26:41.912383+00:00", + "last_updated": "2020-12-09T20:26:41.912383+00:00", "context": { - "id": "e70936c27fad7725a8a35471342e0d2c", + "id": "ad8f18c90f2c2e0da7657081ba12bc66", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1312,15 +944,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.755982+00:00", - "last_updated": "2020-12-08T05:25:00.755982+00:00", + "last_changed": "2020-12-09T20:26:41.912429+00:00", + "last_updated": "2020-12-09T20:26:41.912429+00:00", "context": { - "id": "23a3422eee3bd73e4c9301fbe7756406", + "id": "2ac6e2cf5f52f42498b655d869e53512", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1336,15 +968,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.756020+00:00", - "last_updated": "2020-12-08T05:25:00.756020+00:00", + "last_changed": "2020-12-09T20:26:41.912473+00:00", + "last_updated": "2020-12-09T20:26:41.912473+00:00", "context": { - "id": "b44b8a0b2ae20d4fc086c668736f4f47", + "id": "dff5d4a1eda2f8d7c63d68884525db22", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1360,15 +992,15 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.756055+00:00", - "last_updated": "2020-12-08T05:25:00.756055+00:00", + "last_changed": "2020-12-09T20:26:41.912508+00:00", + "last_updated": "2020-12-09T20:26:41.912508+00:00", "context": { - "id": "ddb18c213d8c0970f2f8a4884d9be481", + "id": "54a72dfb5d536ac40d6908f926c33484", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1384,15 +1016,15 @@ "friendly_name": "Duration in minutes", "icon": "mdi:timer-sand" }, - "last_changed": "2020-12-08T05:25:00.756104+00:00", - "last_updated": "2020-12-08T05:25:00.756104+00:00", + "last_changed": "2020-12-09T20:26:41.912555+00:00", + "last_updated": "2020-12-09T20:26:41.912555+00:00", "context": { - "id": "7cbe9116c9197977c164b440947190d5", + "id": "1b1854ec76c54602e02b22b5b25511ef", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1408,15 +1040,15 @@ "friendly_name": "Hour of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.756141+00:00", - "last_updated": "2020-12-08T05:25:00.756141+00:00", + "last_changed": "2020-12-09T20:26:41.912589+00:00", + "last_updated": "2020-12-09T20:26:41.912589+00:00", "context": { - "id": "e9a00b873c3de16bb9d1a997b907b2e5", + "id": "20475d898aa84968ad104ebbab827ec4", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1432,76 +1064,325 @@ "friendly_name": "Minute of Day", "icon": "mdi:clock" }, - "last_changed": "2020-12-08T05:25:00.756177+00:00", - "last_updated": "2020-12-08T05:25:00.756177+00:00", + "last_changed": "2020-12-09T20:26:41.912620+00:00", + "last_updated": "2020-12-09T20:26:41.912620+00:00", "context": { - "id": "0279640a47052c11b16485ede482cf17", + "id": "f4754e3d076adc9b48ace80d09b1c977", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { - "entity_id": "automation.system_set_custom_theme_at_startup", - "state": "on", + "entity_id": "input_boolean.irrigation_pump", + "state": "off", "attributes": { - "last_triggered": "2020-12-08T05:25:03.059367+00:00", - "mode": "single", - "current": 0, - "id": "themestartup", - "friendly_name": "System - Set Custom Theme at Startup" + "editable": false, + "friendly_name": "Well Pump", + "icon": "mdi:water-pump" }, - "last_changed": "2020-12-08T05:25:00.983260+00:00", - "last_updated": "2020-12-08T05:25:03.077445+00:00", + "last_changed": "2020-12-09T20:26:41.915006+00:00", + "last_updated": "2020-12-09T20:26:41.915006+00:00", "context": { - "id": "76d5b39b7c4ca8de78ee92b61076832d", + "id": "df32316ccc437e88b941b118e151617e", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { - "entity_id": "automation.restart_notification", - "state": "on", + "entity_id": "input_boolean.irrigation_enabled", + "state": "off", "attributes": { - "last_triggered": "2020-12-08T05:25:03.059516+00:00", - "mode": "single", - "current": 0, - "friendly_name": "Restart Notification" + "editable": false, + "friendly_name": "Irrigation System Enabled", + "icon": "mdi:water" }, - "last_changed": "2020-12-08T05:25:00.983382+00:00", - "last_updated": "2020-12-08T05:25:05.190029+00:00", + "last_changed": "2020-12-09T20:26:41.915070+00:00", + "last_updated": "2020-12-09T20:26:41.915070+00:00", "context": { - "id": "ff750280c2a575e2f51f73c06bff7264", + "id": "eeba13f6b571bd99f67a776b8a11fd3c", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_1_schedule_enabled", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915125+00:00", + "last_updated": "2020-12-09T20:26:41.915125+00:00", + "context": { + "id": "6a96d2c0a8b103136b4c4dc4081f5596", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_1_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915176+00:00", + "last_updated": "2020-12-09T20:26:41.915176+00:00", + "context": { + "id": "1e71f58d8ef81cd205fc4b93c6cb49db", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_2_schedule_enabled", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915224+00:00", + "last_updated": "2020-12-09T20:26:41.915224+00:00", + "context": { + "id": "60629fada2d7f12878379ca1f27eb4e1", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_2_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915273+00:00", + "last_updated": "2020-12-09T20:26:41.915273+00:00", + "context": { + "id": "94b91faac2944b58399849a535661e58", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_3_schedule_enabled", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915325+00:00", + "last_updated": "2020-12-09T20:26:41.915325+00:00", + "context": { + "id": "45b2f9a332c96a80fae4380cd53469f3", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_3_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915373+00:00", + "last_updated": "2020-12-09T20:26:41.915373+00:00", + "context": { + "id": "cffbfa9a002289259e15ee6b9263a88b", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_4_schedule_enabled", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915420+00:00", + "last_updated": "2020-12-09T20:26:41.915420+00:00", + "context": { + "id": "301feb2b7d2e18b3ad60f74122a7eb2c", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_4_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915466+00:00", + "last_updated": "2020-12-09T20:26:41.915466+00:00", + "context": { + "id": "bbdb6e649f2da67860eec6189a8e8b08", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_5_schedule_enabled", + "state": "on", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915511+00:00", + "last_updated": "2020-12-09T20:26:41.915511+00:00", + "context": { + "id": "d7ee73e8b0e9f9f466642061980459f2", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_5_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915556+00:00", + "last_updated": "2020-12-09T20:26:41.915556+00:00", + "context": { + "id": "cb28e68edd49f04fb355bf7c9d94200d", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_6_schedule_enabled", + "state": "on", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915602+00:00", + "last_updated": "2020-12-09T20:26:41.915602+00:00", + "context": { + "id": "08543f6d89fa5a5b41d9093d45e0b3ed", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_6_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915647+00:00", + "last_updated": "2020-12-09T20:26:41.915647+00:00", + "context": { + "id": "5426d55fed29bcc064c13d5f3c977392", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_7_schedule_enabled", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Schedule (enabled/disabled)" + }, + "last_changed": "2020-12-09T20:26:41.915696+00:00", + "last_updated": "2020-12-09T20:26:41.915696+00:00", + "context": { + "id": "2ef6703c80b7b4e59d6ec3328212f989", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "input_boolean.irrigation_zone_7_state", + "state": "off", + "attributes": { + "editable": false, + "friendly_name": "Zone State (manual override)" + }, + "last_changed": "2020-12-09T20:26:41.915743+00:00", + "last_updated": "2020-12-09T20:26:41.915743+00:00", + "context": { + "id": "ccc0d704dad2a47500e638d27f48ae27", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { "entity_id": "automation.closet_fan_on_set_temperature_slider", "state": "on", "attributes": { - "last_triggered": "2020-12-09T03:25:04.075368+00:00", + "last_triggered": "2020-12-10T00:41:41.766698+00:00", "mode": "single", "current": 0, "friendly_name": "Closet Fan On Set Temperature slider" }, - "last_changed": "2020-12-08T05:25:00.983482+00:00", - "last_updated": "2020-12-09T03:25:04.080231+00:00", + "last_changed": "2020-12-09T20:26:42.050394+00:00", + "last_updated": "2020-12-10T00:41:41.768906+00:00", "context": { - "id": "45fa9166d84e926558a00b4c56201ebe", + "id": "e8d99c20b6378d066bf108ebbddb6391", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1513,75 +1394,75 @@ "current": 0, "friendly_name": "Closet Fan Temp Slider Moved" }, - "last_changed": "2020-12-08T05:25:00.983576+00:00", - "last_updated": "2020-12-08T05:25:00.983576+00:00", + "last_changed": "2020-12-09T20:26:42.050581+00:00", + "last_updated": "2020-12-09T20:26:42.050581+00:00", "context": { - "id": "af809fac85084fd4740deaa24db02ad9", + "id": "2950d36ee4b21914a7d60d5e27d2c276", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { "entity_id": "automation.security_lights_interior_time_off", "state": "on", "attributes": { - "last_triggered": "2020-12-06T06:30:00.999141+00:00", + "last_triggered": "2020-11-28T06:30:00.613271+00:00", "mode": "single", "current": 0, "friendly_name": "security_lights_interior_time_off" }, - "last_changed": "2020-12-08T05:25:00.983712+00:00", - "last_updated": "2020-12-08T05:25:00.983712+00:00", + "last_changed": "2020-12-09T20:26:42.050682+00:00", + "last_updated": "2020-12-09T20:26:42.050682+00:00", "context": { - "id": "7e277322f7fbac5c4e7c67f4eef42871", + "id": "594d0868735b0131619d11f6c5e93b3e", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { "entity_id": "automation.security_lights_interior_time_on", "state": "on", "attributes": { - "last_triggered": "2020-12-08T23:33:27.001284+00:00", + "last_triggered": "2020-12-09T23:30:04.292311+00:00", "mode": "single", "current": 0, "friendly_name": "security_lights_interior_time_on" }, - "last_changed": "2020-12-08T05:25:00.983814+00:00", - "last_updated": "2020-12-08T23:33:27.009497+00:00", + "last_changed": "2020-12-09T20:26:42.050776+00:00", + "last_updated": "2020-12-09T23:30:04.306806+00:00", "context": { - "id": "2ee234181f8664e15891164be03b0063", + "id": "fd9a9234813987a9e450bd86d6814350", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { "entity_id": "automation.power_state_on_ha_start_up", "state": "on", "attributes": { - "last_triggered": "2020-12-08T05:25:03.059634+00:00", + "last_triggered": "2020-12-09T20:26:45.114627+00:00", "mode": "single", "current": 0, "friendly_name": "\u201cPower state on HA start-up\u201d" }, - "last_changed": "2020-12-08T05:25:00.983911+00:00", - "last_updated": "2020-12-08T05:25:03.080166+00:00", + "last_changed": "2020-12-09T20:26:42.050868+00:00", + "last_updated": "2020-12-09T20:26:45.144215+00:00", "context": { - "id": "4b062a8a61b8355d337ffc2a181999bb", + "id": "f294abf94d19e198032fac7410fc4c87", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1590,15 +1471,15 @@ "attributes": { "friendly_name": "All Sonoffs on Network" }, - "last_changed": "2020-12-08T23:33:27.121145+00:00", - "last_updated": "2020-12-08T23:33:27.121145+00:00", + "last_changed": "2020-12-09T23:30:04.411208+00:00", + "last_updated": "2020-12-09T23:30:04.411208+00:00", "context": { - "id": "2ee234181f8664e15891164be03b0063", + "id": "fd9a9234813987a9e450bd86d6814350", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1608,15 +1489,15 @@ "source_type": "gps", "friendly_name": "700T1C" }, - "last_changed": "2020-12-08T05:25:01.267061+00:00", - "last_updated": "2020-12-08T05:25:01.267061+00:00", + "last_changed": "2020-12-09T20:26:42.174560+00:00", + "last_updated": "2020-12-09T20:26:42.174560+00:00", "context": { - "id": "4ce6f00d7984c133e3b19fc63b18d63f", + "id": "17ab3cc9e878d481cd9a392a1748bfbb", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1633,15 +1514,15 @@ "vertical_accuracy": 6, "friendly_name": "SM-G935R4" }, - "last_changed": "2020-12-08T05:25:01.267258+00:00", - "last_updated": "2020-12-08T05:25:01.267258+00:00", + "last_changed": "2020-12-09T20:26:42.174712+00:00", + "last_updated": "2020-12-09T20:26:42.174712+00:00", "context": { - "id": "684ad1241578e464c230310c7f821247", + "id": "49a33b51211e74febd927bc8478ba67d", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1651,15 +1532,15 @@ "source_type": "gps", "friendly_name": "White Moto G" }, - "last_changed": "2020-12-08T05:25:01.267368+00:00", - "last_updated": "2020-12-08T05:25:01.267368+00:00", + "last_changed": "2020-12-09T20:26:42.174793+00:00", + "last_updated": "2020-12-09T20:26:42.174793+00:00", "context": { - "id": "66647dcc08c2dc675c3ea2675f8ead78", + "id": "5deca5f87aef43c66d32380afe08b6a7", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" }, { "state": { @@ -1669,15 +1550,179 @@ "source_type": "gps", "friendly_name": "LGUS215" }, - "last_changed": "2020-12-08T05:25:01.267462+00:00", - "last_updated": "2020-12-08T05:25:01.267462+00:00", + "last_changed": "2020-12-09T20:26:42.174865+00:00", + "last_updated": "2020-12-09T20:26:42.174865+00:00", "context": { - "id": "12781f71d6eb0534f39dc2a359a38804", + "id": "d64be658f89ad7223b71f70adf29c516", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "switch.outside_north_circuit_1", + "state": "off", + "attributes": { + "friendly_name": "Outside North Circuit 1" + }, + "last_changed": "2020-12-10T00:18:24.897171+00:00", + "last_updated": "2020-12-10T00:18:24.897171+00:00", + "context": { + "id": "9332b209d1efb1f46c7fc55103e9c4ee", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "switch.outside_north_circuit_2", + "state": "off", + "attributes": { + "friendly_name": "Outside North Circuit 2" + }, + "last_changed": "2020-12-10T00:18:24.897337+00:00", + "last_updated": "2020-12-10T00:18:24.897337+00:00", + "context": { + "id": "27ce65691fe8d0609f3d0fb95b2595de", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "switch.fan_automation_enabled", + "state": "on", + "attributes": { + "friendly_name": "Fan Automation Enabled", + "icon": "mdi:fan" + }, + "last_changed": "2020-12-09T20:26:44.606603+00:00", + "last_updated": "2020-12-09T20:26:44.606603+00:00", + "context": { + "id": "9f4f5689041a8ccf0c47a198c2a33b94", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "switch.sonoff_white", + "state": "on", + "attributes": { + "friendly_name": "Sonoff White" + }, + "last_changed": "2020-12-09T23:30:04.406452+00:00", + "last_updated": "2020-12-09T23:30:04.406452+00:00", + "context": { + "id": "fd9a9234813987a9e450bd86d6814350", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "switch.sonoff_brown", + "state": "on", + "attributes": { + "friendly_name": "Sonoff Brown" + }, + "last_changed": "2020-12-09T23:30:04.405955+00:00", + "last_updated": "2020-12-09T23:30:04.405955+00:00", + "context": { + "id": "fd9a9234813987a9e450bd86d6814350", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-10T00:41:45.404443+00:00" + }, + { + "state": { + "entity_id": "variable.node_test_sum", + "state": "0", + "attributes": {}, + "last_changed": "2020-12-09T05:08:12.495831+00:00", + "last_updated": "2020-12-09T05:08:12.495831+00:00", + "context": { + "id": "f6308025913fb16258b42cc7ec5bb7cd", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-09T05:41:10.530964+00:00" + }, + { + "state": { + "entity_id": "variable.node_test_switch", + "state": "OFF", + "attributes": { + "icon": "mdi:flash" + }, + "last_changed": "2020-12-09T05:08:12.495943+00:00", + "last_updated": "2020-12-09T05:08:12.495943+00:00", + "context": { + "id": "68069e3b0a77e8259547c980eefa0bd9", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-09T05:41:10.530964+00:00" + }, + { + "state": { + "entity_id": "input_number.node_test_first_number", + "state": "25.0", + "attributes": { + "initial": 25.0, + "editable": false, + "min": 0.0, + "max": 100.0, + "step": 1.0, + "mode": "slider", + "friendly_name": "First Number" + }, + "last_changed": "2020-12-09T05:08:12.533638+00:00", + "last_updated": "2020-12-09T05:08:12.533638+00:00", + "context": { + "id": "86eec51a440b9fd19a11e9f752275e36", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-09T05:41:10.530964+00:00" + }, + { + "state": { + "entity_id": "input_number.node_test_second_number", + "state": "75.0", + "attributes": { + "initial": 75.0, + "editable": false, + "min": 0.0, + "max": 100.0, + "step": 1.0, + "mode": "slider", + "friendly_name": "Second Number" + }, + "last_changed": "2020-12-09T05:08:12.533798+00:00", + "last_updated": "2020-12-09T05:08:12.533798+00:00", + "context": { + "id": "1235d7d70434da7aebbf8807f4cd24ba", + "parent_id": null, + "user_id": null + } + }, + "last_seen": "2020-12-09T05:41:10.530964+00:00" }, { "state": { @@ -1688,101 +1733,15 @@ "assumed_state": true, "supported_features": 0 }, - "last_changed": "2020-12-08T05:25:01.416827+00:00", - "last_updated": "2020-12-08T05:25:01.416827+00:00", + "last_changed": "2020-12-09T05:08:12.579495+00:00", + "last_updated": "2020-12-09T05:08:12.579495+00:00", "context": { - "id": "ce98612457458c2d4fbf0cfa96c1b78d", + "id": "983845fa8eff4907658cee3edbde82c3", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "switch.fan_automation_enabled", - "state": "on", - "attributes": { - "friendly_name": "Fan Automation Enabled", - "icon": "mdi:fan" - }, - "last_changed": "2020-12-08T05:25:02.977553+00:00", - "last_updated": "2020-12-08T05:25:02.977553+00:00", - "context": { - "id": "0220b0de6de9f945ed644872bb78cd86", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "switch.outside_north_circuit_1", - "state": "off", - "attributes": { - "friendly_name": "Outside North Circuit 1" - }, - "last_changed": "2020-12-09T03:05:30.493999+00:00", - "last_updated": "2020-12-09T03:05:30.493999+00:00", - "context": { - "id": "63e955a64b49d2226172c5d3ab9cebfc", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "switch.outside_north_circuit_2", - "state": "off", - "attributes": { - "friendly_name": "Outside North Circuit 2" - }, - "last_changed": "2020-12-09T03:05:30.494193+00:00", - "last_updated": "2020-12-09T03:05:30.494193+00:00", - "context": { - "id": "cefb26be9817194b081564a86132e249", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "switch.sonoff_white", - "state": "on", - "attributes": { - "friendly_name": "Sonoff White" - }, - "last_changed": "2020-12-08T23:33:27.124669+00:00", - "last_updated": "2020-12-08T23:33:27.124669+00:00", - "context": { - "id": "2ee234181f8664e15891164be03b0063", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" - }, - { - "state": { - "entity_id": "switch.sonoff_brown", - "state": "on", - "attributes": { - "friendly_name": "Sonoff Brown" - }, - "last_changed": "2020-12-08T23:33:27.117563+00:00", - "last_updated": "2020-12-08T23:33:27.117563+00:00", - "context": { - "id": "2ee234181f8664e15891164be03b0063", - "parent_id": null, - "user_id": null - } - }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-09T05:41:10.530964+00:00" }, { "state": { @@ -1791,15 +1750,15 @@ "attributes": { "friendly_name": "Circuit 1" }, - "last_changed": "2020-12-08T05:25:01.430019+00:00", - "last_updated": "2020-12-08T05:25:01.430019+00:00", + "last_changed": "2020-12-09T05:08:12.582611+00:00", + "last_updated": "2020-12-09T05:08:12.582611+00:00", "context": { - "id": "efc99edad00e0378b97418a8061eb822", + "id": "7c8b1a72833308acb14240bfbe917182", "parent_id": null, "user_id": null } }, - "last_seen": "2020-12-09T03:25:05.267622+00:00" + "last_seen": "2020-12-09T05:41:10.530964+00:00" } ] } \ No newline at end of file diff --git a/.storage/hacs.removed b/.storage/hacs.removed new file mode 100644 index 0000000..4f06760 --- /dev/null +++ b/.storage/hacs.removed @@ -0,0 +1,461 @@ +{ + "data": [ + { + "acknowledged": true, + "link": "https://github.com/hacs/default/pull/2", + "reason": "Security issues, known to steal auth tokens.", + "removal_type": "critical", + "repository": "test/test" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "amaximus/bkk_stop_card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "au190/au190_bkk_stop_card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "au190/au190_lock_entity" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "au190/au190_thermostat_card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "basnijholt/media_player.kef" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "benleb/ad-batterycheck" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "benleb/ad-ench-ad3" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "bieniu/ha-ad-airly" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "Boosik/discord_game" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "boralyl/hass-smartthinq" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/boilerplate-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/camera-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/custom-card-helpers" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/information" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/marquee-state-element" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/monster-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/muuri-grid" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/timer-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-cards/tracker-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/binary_sensor.hadockermon" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/blueprint" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/camera.multisource" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/cloudflare" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/complimentr" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/custom_cards" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/custom_components" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/custom_updater" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/google_keep" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/hassbian_config" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/information" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/lists" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.ctabustracker" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.custom_aftership" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.custom_cards" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.custom_components" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.geoip" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.launchlibrary" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.ruter" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.syncthing" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.tautulli" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sensor.versions" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/sickchill" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/switch.hadockermon" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "custom-components/usps_mail" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "eifinger/here_travel_time" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "home-assistant-community-themes/template" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "home-assistant-community-themes/theme-request" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "keatontaylor/alexa_media_player" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "kethoth/green_slate_theme" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "ljmerza/waze-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "maykar/compact-custom-header" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "Michsior14/ha-kaiterra" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "Michsior14/ha-laser-egg" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "PTST/O365Calendar-HomeAssistant" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "Rocka84/dual-gauge-card" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "shaonianzhentan/ha-cloud-music" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "tenly2000/HomeAssistant-Places" + }, + { + "acknowledged": false, + "link": null, + "reason": null, + "removal_type": "blacklist", + "repository": "xaviml/z2m_ikea_controller" + }, + { + "acknowledged": false, + "link": "https://github.com/hacs/integration/pull/1045", + "reason": "Request from author", + "removal_type": "blacklist", + "repository": "r-renato/hass-xiaomi-mi-flora-and-flower-care" + }, + { + "acknowledged": false, + "link": null, + "reason": "Abandoned/Broken", + "removal_type": "stale", + "repository": "custom-cards/dual-gauge-card" + }, + { + "acknowledged": false, + "link": "https://github.com/hacs/default/issues/318", + "reason": "Abandoned/Broken", + "removal_type": "stale", + "repository": "custom-cards/surveillance-card" + }, + { + "acknowledged": false, + "link": "https://github.com/hacs/default/issues/344", + "reason": "Repository is archived", + "removal_type": "blacklist", + "repository": "robmarkcole/HASS-Sighthound" + }, + { + "acknowledged": false, + "link": "https://github.com/hacs/default/issues/344", + "reason": "Repository is archived", + "removal_type": "blacklist", + "repository": "custom-cards/home-setter" + }, + { + "acknowledged": false, + "link": "https://github.com/hacs/default/issues/347", + "reason": "Repository is archived", + "removal_type": "blacklist", + "repository": "pippyn/Home-Assistant-Sensor-Ophaalkalender" + } + ], + "key": "hacs.removed", + "version": "6" +} \ No newline at end of file diff --git a/.storage/hacs.repositories b/.storage/hacs.repositories index 358be11..a0d226d 100644 --- a/.storage/hacs.repositories +++ b/.storage/hacs.repositories @@ -58,7 +58,7 @@ "category": "plugin", "description": "Custom calendar card for Home Assistant with Lovelace", "domain": "", - "downloads": 5641, + "downloads": 0, "full_name": "atomic7777/atomic_calendar", "first_install": true, "installed_commit": null, @@ -80,7 +80,7 @@ "category": "plugin", "description": "FKF Budapest Garbage Collection Card for Home Assistant/Lovelace", "domain": "", - "downloads": 82, + "downloads": 0, "full_name": "amaximus/fkf-garbage-collection-card", "first_install": true, "installed_commit": null, @@ -144,7 +144,7 @@ "category": "plugin", "description": "Show battery states or attributes with dynamic icon on entity rows in Home Assistant's Lovelace UI", "domain": "", - "downloads": 2171, + "downloads": 0, "full_name": "benct/lovelace-battery-entity-row", "first_install": true, "installed_commit": null, @@ -182,7 +182,7 @@ "category": "plugin", "description": "Minimalistic climate card for Home Assistant Lovelace UI", "domain": "", - "downloads": 2923, + "downloads": 0, "full_name": "artem-sedykh/mini-climate-card", "first_install": true, "installed_commit": null, @@ -283,7 +283,7 @@ "category": "plugin", "description": "Minimalistic humidifier card for Home Assistant Lovelace UI", "domain": "", - "downloads": 546, + "downloads": 0, "full_name": "artem-sedykh/mini-humidifier", "first_install": true, "installed_commit": null, @@ -350,7 +350,7 @@ "category": "plugin", "description": "Home Assistant Custom Card to show Zigbee2mqtt network map", "domain": "", - "downloads": 8421, + "downloads": 0, "full_name": "azuwis/zigbee2mqtt-networkmap", "first_install": true, "installed_commit": null, @@ -403,7 +403,7 @@ "category": "plugin", "description": "Custom Lovelace card for Garbage Collection custom component", "domain": "", - "downloads": 1191, + "downloads": 0, "full_name": "amaximus/garbage-collection-card", "first_install": true, "installed_commit": null, @@ -435,7 +435,7 @@ "category": "plugin", "description": "Custom Transmission card for Home Assistant/Lovelace", "domain": "", - "downloads": 188, + "downloads": 0, "full_name": "amaximus/transmission-card", "first_install": true, "installed_commit": null, @@ -490,7 +490,7 @@ "category": "plugin", "description": "GitHub repository sensor data on entity rows in Home Assistant's Lovelace UI", "domain": "", - "downloads": 359, + "downloads": 0, "full_name": "benct/lovelace-github-entity-row", "first_install": true, "installed_commit": null, @@ -549,7 +549,7 @@ "category": "plugin", "description": "Simple card for various robot vacuums in Home Assistant's Lovelace UI", "domain": "", - "downloads": 3680, + "downloads": 0, "full_name": "benct/lovelace-xiaomi-vacuum-card", "first_install": true, "installed_commit": null, @@ -631,7 +631,7 @@ "category": "plugin", "description": "Show multiple entity states and attributes on entity rows in Home Assistant's Lovelace UI", "domain": "", - "downloads": 4175, + "downloads": 0, "full_name": "benct/lovelace-multiple-entity-row", "first_install": true, "installed_commit": null, @@ -671,7 +671,7 @@ "category": "plugin", "description": "\ud83c\udf21 Thermostat card with a round and black feel to it", "domain": "", - "downloads": 1256, + "downloads": 0, "full_name": "ciotlosm/lovelace-thermostat-dark-card", "first_install": true, "installed_commit": null, @@ -753,7 +753,7 @@ "category": "plugin", "description": "\ud83d\udca1 A Lovelace custom card for RGB lights", "domain": "", - "downloads": 3785, + "downloads": 0, "full_name": "bokub/rgb-light-card", "first_install": true, "installed_commit": null, @@ -788,7 +788,7 @@ "category": "plugin", "description": "Customizable Animated Bar card for Home Assistant Lovelace", "domain": "", - "downloads": 7782, + "downloads": 0, "full_name": "custom-cards/bar-card", "first_install": true, "installed_commit": null, @@ -809,32 +809,6 @@ "topics": [], "version_installed": null }, - "142545838": { - "authors": [], - "category": "plugin", - "description": "The card makes it possible to use gauges from https://canvas-gauges.com/", - "domain": "", - "downloads": 2019, - "full_name": "custom-cards/canvas-gauge-card", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "8e769e3", - "last_release_tag": "0.4.1", - "last_updated": "2020-09-25T19:45:39Z", - "name": "canvas-gauge-card", - "new": false, - "repository_manifest": { - "name": "Canvas Gauge Card", - "render_readme": true, - "filename": "canvas-gauge-card.js" - }, - "selected_tag": null, - "show_beta": false, - "stars": 60, - "topics": [], - "version_installed": null - }, "141952963": { "authors": [], "category": "plugin", @@ -862,7 +836,7 @@ "category": "plugin", "description": null, "domain": "", - "downloads": 1599, + "downloads": 0, "full_name": "custom-cards/cover-element", "first_install": true, "installed_commit": null, @@ -906,7 +880,7 @@ "category": "plugin", "description": "Check Button Card is a button that tracks when it is last pressed, for the Home Assistant Lovelace front-end using MQTT auto discovery.", "domain": "", - "downloads": 1107, + "downloads": 0, "full_name": "custom-cards/check-button-card", "first_install": true, "installed_commit": null, @@ -998,7 +972,7 @@ "category": "plugin", "description": "\ud83e\uddf9 Declutter your lovelace configuration with the help of this card", "domain": "", - "downloads": 3086, + "downloads": 0, "full_name": "custom-cards/decluttering-card", "first_install": true, "installed_commit": null, @@ -1051,7 +1025,7 @@ "category": "plugin", "description": "A group element for picture-elements with dynamic toggle capability", "domain": "", - "downloads": 523, + "downloads": 0, "full_name": "custom-cards/group-element", "first_install": true, "installed_commit": null, @@ -1120,7 +1094,7 @@ "category": "plugin", "description": "Show a notification count badge.", "domain": "", - "downloads": 450, + "downloads": 0, "full_name": "custom-cards/favicon-counter", "first_install": true, "installed_commit": null, @@ -1344,7 +1318,7 @@ "category": "plugin", "description": null, "domain": "", - "downloads": 395, + "downloads": 0, "full_name": "custom-cards/text-action-element", "first_install": true, "installed_commit": null, @@ -1388,7 +1362,7 @@ "category": "plugin", "description": "\ud83d\udee0 group multiple cards into one card without the borders", "domain": "", - "downloads": 2453, + "downloads": 0, "full_name": "custom-cards/stack-in-card", "first_install": true, "installed_commit": null, @@ -1531,7 +1505,7 @@ "category": "plugin", "description": "Home Assistant Lovelace custom card to use with Spain electricity hourly pricing (PVPC) integration", "domain": "", - "downloads": 410, + "downloads": 0, "full_name": "danimart1991/pvpc-hourly-pricing-card", "first_install": true, "installed_commit": null, @@ -1653,7 +1627,7 @@ "category": "plugin", "description": "A card giving richer public transit display using NextBus sensors.", "domain": "", - "downloads": 116, + "downloads": 0, "full_name": "dcramer/lovelace-nextbus-card", "first_install": true, "installed_commit": null, @@ -1772,7 +1746,7 @@ "category": "plugin", "description": "Shutter card for Home Assistant Lovelace UI", "domain": "", - "downloads": 3040, + "downloads": 0, "full_name": "Deejayfool/hass-shutter-card", "first_install": true, "installed_commit": null, @@ -1804,7 +1778,7 @@ "category": "plugin", "description": "Air Purifier card for Home Assistant Lovelace UI", "domain": "", - "downloads": 708, + "downloads": 0, "full_name": "denysdovhan/purifier-card", "first_install": true, "installed_commit": null, @@ -1925,7 +1899,7 @@ "category": "plugin", "description": "Vacuum cleaner card for Home Assistant Lovelace UI", "domain": "", - "downloads": 5693, + "downloads": 0, "full_name": "denysdovhan/vacuum-card", "first_install": true, "installed_commit": null, @@ -1960,7 +1934,7 @@ "category": "plugin", "description": "A Lovelace card to display Norwegian mail delivery days", "domain": "", - "downloads": 353, + "downloads": 0, "full_name": "ezand/lovelace-posten-card", "first_install": true, "installed_commit": null, @@ -1991,7 +1965,7 @@ "category": "plugin", "description": ":point_up_2: Swipe Glance Card", "domain": "", - "downloads": 641, + "downloads": 0, "full_name": "dooz127/swipe-glance-card", "first_install": true, "installed_commit": null, @@ -2049,7 +2023,7 @@ "category": "plugin", "description": "A simple lovelace multiline text input card", "domain": "", - "downloads": 228, + "downloads": 0, "full_name": "faeibson/lovelace-multiline-text-input-card", "first_install": true, "installed_commit": null, @@ -2483,7 +2457,7 @@ "category": "plugin", "description": "\ud83d\udcc2 Folder Card for Home Assistant's Lovelace UI", "domain": "", - "downloads": 404, + "downloads": 0, "full_name": "GeorgeSG/lovelace-folder-card", "first_install": true, "installed_commit": null, @@ -2646,7 +2620,7 @@ "category": "plugin", "description": "\ud83d\udce6 Aftership Card for package tracking", "domain": "", - "downloads": 931, + "downloads": 0, "full_name": "iantrich/aftership-card", "first_install": true, "installed_commit": null, @@ -2672,7 +2646,7 @@ "category": "plugin", "description": "\ud83d\udcdd Templatable Lovelace Configurations", "domain": "", - "downloads": 1957, + "downloads": 0, "full_name": "iantrich/config-template-card", "first_install": true, "installed_commit": null, @@ -2698,7 +2672,7 @@ "category": "plugin", "description": "\ud83c\udfa7 Podcast Player Card", "domain": "", - "downloads": 415, + "downloads": 0, "full_name": "iantrich/podcast-card", "first_install": true, "installed_commit": null, @@ -2723,7 +2697,7 @@ "category": "plugin", "description": "\ud83d\udd12 Apply restrictions to Lovelace cards", "domain": "", - "downloads": 1717, + "downloads": 0, "full_name": "iantrich/restriction-card", "first_install": true, "installed_commit": null, @@ -2754,7 +2728,7 @@ "category": "plugin", "description": "\ud83d\udcfa Roku Remote Card", "domain": "", - "downloads": 783, + "downloads": 0, "full_name": "iantrich/roku-card", "first_install": true, "installed_commit": null, @@ -2785,7 +2759,7 @@ "category": "plugin", "description": "\u2b55 Radial Menu Element", "domain": "", - "downloads": 550, + "downloads": 0, "full_name": "iantrich/radial-menu", "first_install": true, "installed_commit": null, @@ -2811,7 +2785,7 @@ "category": "plugin", "description": "\ud83d\uddc2 Text Divider Row", "domain": "", - "downloads": 2474, + "downloads": 0, "full_name": "iantrich/text-divider-row", "first_install": true, "installed_commit": null, @@ -2944,7 +2918,7 @@ "category": "plugin", "description": "A Lightning Detection Display Card for Home Assistant Lovelace", "domain": "", - "downloads": 680, + "downloads": 0, "full_name": "ironsheep/lovelace-lightning-detector-card", "first_install": true, "installed_commit": null, @@ -2978,7 +2952,7 @@ "category": "plugin", "description": "A Raspberry Pi status display Card for Home Assistant Lovelace", "domain": "", - "downloads": 2952, + "downloads": 0, "full_name": "ironsheep/lovelace-rpi-monitor-card", "first_install": true, "installed_commit": null, @@ -3049,7 +3023,7 @@ "category": "plugin", "description": "Adds highly configurable buttons that use actions and per-state styling.", "domain": "", - "downloads": 2639, + "downloads": 0, "full_name": "jcwillox/lovelace-paper-buttons-row", "first_install": true, "installed_commit": null, @@ -3079,7 +3053,7 @@ "category": "plugin", "description": "\ud83d\udc24 Adds many useful extensions to lovelace, such as templating secondary info, stacking within a card and more!", "domain": "", - "downloads": 1374, + "downloads": 0, "full_name": "jcwillox/lovelace-canary", "first_install": true, "installed_commit": null, @@ -3142,7 +3116,7 @@ "category": "plugin", "description": "Minimalistic graph card for Home Assistant Lovelace UI", "domain": "", - "downloads": 37557, + "downloads": 0, "full_name": "kalkih/mini-graph-card", "first_install": true, "installed_commit": null, @@ -3173,7 +3147,7 @@ "category": "plugin", "description": "Minimalistic media card for Home Assistant Lovelace UI", "domain": "", - "downloads": 23598, + "downloads": 0, "full_name": "kalkih/mini-media-player", "first_install": true, "installed_commit": null, @@ -3230,7 +3204,7 @@ "category": "plugin", "description": "Minimalistic weather card for Home Assistant", "domain": "", - "downloads": 3343, + "downloads": 0, "full_name": "kalkih/simple-weather-card", "first_install": true, "installed_commit": null, @@ -3258,7 +3232,7 @@ "category": "plugin", "description": "A Lovelace Card for visualizing power distributions.", "domain": "", - "downloads": 588, + "downloads": 0, "full_name": "JonahKr/power-distribution-card", "first_install": true, "installed_commit": null, @@ -3322,7 +3296,7 @@ "category": "plugin", "description": "fitbit-card for lovelace", "domain": "", - "downloads": 1128, + "downloads": 0, "full_name": "ljmerza/fitbit-card", "first_install": true, "installed_commit": null, @@ -3375,7 +3349,7 @@ "category": "plugin", "description": "Track your repo issues, starts, forks, and pull requests", "domain": "", - "downloads": 488, + "downloads": 0, "full_name": "ljmerza/github-card", "first_install": true, "installed_commit": null, @@ -3428,7 +3402,7 @@ "category": "plugin", "description": "Cover card with homekit style vertical position slider (best with panel-mode but normal-mode works also)", "domain": "", - "downloads": 1011, + "downloads": 0, "full_name": "konnectedvn/lovelace-vertical-slider-cover-card", "first_install": true, "installed_commit": null, @@ -3458,7 +3432,7 @@ "category": "plugin", "description": "our groceries lovelace card", "domain": "", - "downloads": 521, + "downloads": 0, "full_name": "ljmerza/our-groceries-card", "first_install": true, "installed_commit": null, @@ -3480,7 +3454,7 @@ "category": "plugin", "description": "Make your Home Assistant browser fullscreen with one tap.", "domain": "", - "downloads": 690, + "downloads": 0, "full_name": "KTibow/fullscreen-card", "first_install": true, "installed_commit": null, @@ -3514,7 +3488,7 @@ "category": "plugin", "description": "Reddit Card for Home Assistant", "domain": "", - "downloads": 404, + "downloads": 0, "full_name": "ljmerza/reddit-card", "first_install": true, "installed_commit": null, @@ -3536,7 +3510,7 @@ "category": "plugin", "description": "Control any light or switch entity", "domain": "", - "downloads": 5977, + "downloads": 0, "full_name": "ljmerza/light-entity-card", "first_install": true, "installed_commit": null, @@ -3562,7 +3536,7 @@ "category": "plugin", "description": "Graph of Buienradars rain forecast ", "domain": "", - "downloads": 1285, + "downloads": 0, "full_name": "lukevink/lovelace-buien-rain-card", "first_install": true, "installed_commit": null, @@ -3591,7 +3565,7 @@ "category": "plugin", "description": "show travel times for you travel time sensors", "domain": "", - "downloads": 1489, + "downloads": 0, "full_name": "ljmerza/travel-time-card", "first_install": true, "installed_commit": null, @@ -3617,7 +3591,7 @@ "category": "plugin", "description": "Show Tracking Numbers from the Email Sensor for Home Assistant", "domain": "", - "downloads": 451, + "downloads": 0, "full_name": "ljmerza/tracking-number-card", "first_install": true, "installed_commit": null, @@ -3886,7 +3860,7 @@ "category": "plugin", "description": "Select List Card displays an input_select entity as a list in lovelace", "domain": "", - "downloads": 1117, + "downloads": 0, "full_name": "mattieha/select-list-card", "first_install": true, "installed_commit": null, @@ -3919,7 +3893,7 @@ "category": "plugin", "description": "\u2194\ufe0f Swipe through Lovelace views on mobile.", "domain": "", - "downloads": 3040, + "downloads": 0, "full_name": "maykar/lovelace-swipe-navigation", "first_install": true, "installed_commit": null, @@ -3941,7 +3915,7 @@ "category": "plugin", "description": "Github stats card for Home Assistant", "domain": "", - "downloads": 245, + "downloads": 0, "full_name": "maxwroc/github-flexi-card", "first_install": true, "installed_commit": null, @@ -3974,7 +3948,7 @@ "category": "plugin", "description": "Battery state card for Home Assistant", "domain": "", - "downloads": 1555, + "downloads": 0, "full_name": "maxwroc/battery-state-card", "first_install": true, "installed_commit": null, @@ -4002,36 +3976,6 @@ ], "version_installed": null }, - "303101606": { - "authors": [], - "category": "plugin", - "description": "\ud83d\ude48 Hides the Home Assistant header and/or sidebar", - "domain": "", - "downloads": 2699, - "full_name": "maykar/kiosk-mode", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "78b95f3", - "last_release_tag": "1.4.7", - "last_updated": "2020-11-19T12:46:12Z", - "name": "kiosk-mode", - "new": false, - "repository_manifest": { - "name": "Kiosk Mode", - "render_readme": true - }, - "selected_tag": null, - "show_beta": false, - "stars": 47, - "topics": [ - "home-assistant", - "kiosk", - "kiosk-mode", - "lovelace" - ], - "version_installed": null - }, "204049047": { "authors": [], "category": "plugin", @@ -4062,7 +4006,7 @@ "category": "plugin", "description": "A fluffy banner card for Home Assistant \ud83e\udd70", "domain": "", - "downloads": 3967, + "downloads": 0, "full_name": "nervetattoo/banner-card", "first_install": true, "installed_commit": null, @@ -4095,7 +4039,7 @@ "category": "plugin", "description": "A different take on the thermostat card for Home Assistant \u2668\ufe0f", "domain": "", - "downloads": 2816, + "downloads": 0, "full_name": "nervetattoo/simple-thermostat", "first_install": true, "installed_commit": null, @@ -4127,7 +4071,7 @@ "category": "plugin", "description": "HA Lovelace card for control of scheduler entities", "domain": "", - "downloads": 2581, + "downloads": 0, "full_name": "nielsfaber/scheduler-card", "first_install": true, "installed_commit": null, @@ -4167,7 +4111,7 @@ "category": "plugin", "description": "\ud83d\udcd0 Home Assistant Card: Similar to vertical/horizontal-stack, but removes card borders", "domain": "", - "downloads": 15721, + "downloads": 0, "full_name": "ofekashery/vertical-stack-in-card", "first_install": true, "installed_commit": null, @@ -4570,7 +4514,7 @@ "category": "plugin", "description": "Logbook card for Home Assistant UI Lovelace", "domain": "", - "downloads": 1450, + "downloads": 0, "full_name": "royto/logbook-card", "first_install": true, "installed_commit": null, @@ -4653,7 +4597,7 @@ "category": "plugin", "description": "Honeycomb menu is a Home Assistant module (not a card) that can be applied to any lovelace card. When activated by the defined action on said card, the module will display a 'rounded' list of honeycomb buttons with an optional XY pad to make interfacing with lovelace more fluent", "domain": "", - "downloads": 595, + "downloads": 0, "full_name": "Sian-Lee-SA/honeycomb-menu", "first_install": true, "installed_commit": null, @@ -4718,7 +4662,7 @@ "category": "plugin", "description": "A Home Assistant Lovelace Care for Harmony Integration", "domain": "", - "downloads": 1629, + "downloads": 0, "full_name": "sbryfcz/harmony-card", "first_install": true, "installed_commit": null, @@ -4831,31 +4775,6 @@ ], "version_installed": null }, - "167744584": { - "authors": [], - "category": "plugin", - "description": "\ud83d\udd39Automatically populate the entities-list of lovelace cards", - "domain": "", - "downloads": 0, - "full_name": "thomasloven/lovelace-auto-entities", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "f17fcc1", - "last_release_tag": "1.7.0", - "last_updated": "2020-11-21T19:52:51Z", - "name": "lovelace-auto-entities", - "new": false, - "repository_manifest": { - "name": "auto-entities", - "render_readme": true - }, - "selected_tag": null, - "show_beta": false, - "stars": 327, - "topics": [], - "version_installed": null - }, "281453608": { "authors": [], "category": "plugin", @@ -4883,31 +4802,6 @@ ], "version_installed": null }, - "190927524": { - "authors": [], - "category": "plugin", - "description": "\ud83d\udd39 Add CSS styles to (almost) any lovelace card", - "domain": "", - "downloads": 0, - "full_name": "thomasloven/lovelace-card-mod", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "457cf40", - "last_release_tag": "2.0.3", - "last_updated": "2020-11-18T09:01:24Z", - "name": "lovelace-card-mod", - "new": false, - "repository_manifest": { - "name": "card-mod", - "homeassistant": "0.98.0" - }, - "selected_tag": null, - "show_beta": false, - "stars": 215, - "topics": [], - "version_installed": null - }, "161403328": { "authors": [], "category": "plugin", @@ -4933,31 +4827,6 @@ "topics": [], "version_installed": null }, - "150781994": { - "authors": [], - "category": "plugin", - "description": "\ud83d\udd39 A foldable row for entities card, containing other rows", - "domain": "", - "downloads": 0, - "full_name": "thomasloven/lovelace-fold-entity-row", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "01b4108", - "last_release_tag": "19", - "last_updated": "2020-08-01T03:12:50Z", - "name": "lovelace-fold-entity-row", - "new": false, - "repository_manifest": { - "name": "fold-entity-row", - "render_readme": true - }, - "selected_tag": null, - "show_beta": false, - "stars": 190, - "topics": [], - "version_installed": null - }, "180197912": { "authors": [], "category": "plugin", @@ -5135,31 +5004,6 @@ "topics": [], "version_installed": null }, - "156434866": { - "authors": [], - "category": "plugin", - "description": "\ud83d\udd39 Get more control over the placement of lovelace cards.", - "domain": "", - "downloads": 0, - "full_name": "thomasloven/lovelace-layout-card", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "e8f0ac8", - "last_release_tag": "16", - "last_updated": "2020-11-18T07:35:50Z", - "name": "lovelace-layout-card", - "new": false, - "repository_manifest": { - "name": "layout-card", - "render_readme": true - }, - "selected_tag": null, - "show_beta": false, - "stars": 249, - "topics": [], - "version_installed": null - }, "249942054": { "authors": [], "category": "plugin", @@ -5247,7 +5091,7 @@ "category": "plugin", "description": "A Lovelace card that shows a directional indicator on a compass for Home Assistant", "domain": "", - "downloads": 463, + "downloads": 0, "full_name": "tomvanswam/compass-card", "first_install": true, "installed_commit": null, @@ -5302,41 +5146,12 @@ ], "version_installed": null }, - "223008910": { - "authors": [], - "category": "plugin", - "description": "Custom Sidebar for Home Assistant", - "domain": "", - "downloads": 0, - "full_name": "Villhellm/custom-sidebar", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "3ed0a8f", - "last_release_tag": "v0.2.2", - "last_updated": "2020-10-31T13:26:16Z", - "name": "custom-sidebar", - "new": false, - "repository_manifest": { - "name": "Custom Sidebar", - "render_readme": true - }, - "selected_tag": null, - "show_beta": false, - "stars": 52, - "topics": [ - "custom", - "hacktoberfest", - "sidebar" - ], - "version_installed": null - }, "259904390": { "authors": [], "category": "plugin", "description": "A custom lovelace card for the custom Jumbo component.", "domain": "", - "downloads": 248, + "downloads": 0, "full_name": "Voxxie/lovelace-jumbo-card", "first_install": true, "installed_commit": null, @@ -5396,7 +5211,7 @@ "category": "python_script", "description": "Script that adds MQTT discovery support for Shellies devices", "domain": "", - "downloads": 170, + "downloads": 0, "full_name": "bieniu/ha-shellies-discovery", "first_install": true, "installed_commit": null, @@ -6186,34 +6001,6 @@ ], "version_installed": null }, - "215075805": { - "authors": [], - "category": "theme", - "description": "Blue Night theme for Home Assistant", - "domain": "", - "downloads": 0, - "full_name": "home-assistant-community-themes/blue-night", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "4c34f97", - "last_release_tag": null, - "last_updated": "2020-09-30T17:38:02Z", - "name": "blue-night", - "new": false, - "repository_manifest": { - "name": "Blue Night Theme" - }, - "selected_tag": null, - "show_beta": false, - "stars": 6, - "topics": [ - "hacs", - "home-assistant", - "theme" - ], - "version_installed": null - }, "235984421": { "authors": [], "category": "theme", @@ -6578,34 +6365,6 @@ ], "version_installed": null }, - "216165131": { - "authors": [], - "category": "theme", - "description": "Solarized Light theme for Home Assistant", - "domain": "", - "downloads": 0, - "full_name": "home-assistant-community-themes/solarized-light", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "54c1ab2", - "last_release_tag": null, - "last_updated": "2020-10-05T07:15:33Z", - "name": "solarized-light", - "new": false, - "repository_manifest": { - "name": "Solarized Light Theme" - }, - "selected_tag": null, - "show_beta": false, - "stars": 3, - "topics": [ - "hacs", - "home-assistant", - "theme" - ], - "version_installed": null - }, "216181396": { "authors": [], "category": "theme", @@ -7147,31 +6906,6 @@ ], "version_installed": null }, - "221287384": { - "authors": [], - "category": "theme", - "description": "Clear Theme for Home Assistant", - "domain": "", - "downloads": 0, - "full_name": "naofireblade/clear-theme", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "a9f68e1", - "last_release_tag": "v1.1", - "last_updated": "2020-10-08T10:10:49Z", - "name": "clear-theme", - "new": false, - "repository_manifest": { - "name": "Clear Theme", - "homeassistant": "0.102.0" - }, - "selected_tag": null, - "show_beta": false, - "stars": 16, - "topics": [], - "version_installed": null - }, "221288367": { "authors": [], "category": "theme", @@ -7279,32 +7013,6 @@ "topics": [], "version_installed": null }, - "197006509": { - "authors": [], - "category": "theme", - "description": "A Dark Theme for Home Assistant", - "domain": "", - "downloads": 0, - "full_name": "seangreen2/slate_theme", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "c18ae17", - "last_release_tag": null, - "last_updated": "2020-11-21T01:36:26Z", - "name": "slate_theme", - "new": false, - "repository_manifest": {}, - "selected_tag": null, - "show_beta": false, - "stars": 77, - "topics": [ - "hacs", - "home-assistant", - "theme" - ], - "version_installed": null - }, "226567922": { "authors": [], "category": "theme", @@ -8567,7 +8275,7 @@ "category": "integration", "description": "Airly air quality custom integration", "domain": "airly", - "downloads": 120, + "downloads": 0, "full_name": "bieniu/ha-airly", "first_install": true, "installed_commit": null, @@ -8605,7 +8313,7 @@ "category": "integration", "description": "GIO\u015a (Polish G\u0142\u00f3wny Inspektorat Ochrony \u015arodowiska) air quality data integration for Home Assistant", "domain": "gios", - "downloads": 114, + "downloads": 0, "full_name": "bieniu/ha-gios", "first_install": true, "installed_commit": null, @@ -9285,7 +8993,7 @@ "category": "integration", "description": "\ud83d\ude8d Home Assistant custom sensor for finding Czech Public Transportation Connections", "domain": "cz_pub_tran", - "downloads": 51, + "downloads": 0, "full_name": "bruxy70/CZ-Public-Transport", "first_install": true, "installed_commit": null, @@ -9364,7 +9072,7 @@ "category": "integration", "description": "\ud83d\uddd1 Custom Home Assistant sensor for scheduling garbage collection (or other regularly re-occurring events - weekly on given days, semi-weekly or monthly)", "domain": "garbage_collection", - "downloads": 2537, + "downloads": 0, "full_name": "bruxy70/Garbage-Collection", "first_install": true, "installed_commit": null, @@ -10018,7 +9726,7 @@ "category": "integration", "description": "This is a custom component to allow control of Amazon Alexa devices in Home Assistant using the unofficial Alexa API.", "domain": "alexa_media", - "downloads": 2661, + "downloads": 0, "full_name": "custom-components/alexa_media_player", "first_install": true, "installed_commit": null, @@ -10297,7 +10005,7 @@ "category": "integration", "description": "\ud83c\udfa7 gPodder Integration for Podcast Feed Monitoring", "domain": "gpodder", - "downloads": 219, + "downloads": 0, "full_name": "custom-components/gpodder", "first_install": true, "installed_commit": null, @@ -10477,7 +10185,7 @@ "category": "integration", "description": "Pyscript adds rich Python scripting to HASS", "domain": "pyscript", - "downloads": 1106, + "downloads": 0, "full_name": "custom-components/pyscript", "first_install": true, "installed_commit": null, @@ -11974,7 +11682,7 @@ "category": "integration", "description": "proscenic 790T intergration for home assistant", "domain": "proscenic", - "downloads": 43, + "downloads": 0, "full_name": "deblockt/hass-proscenic-790T-vacuum", "first_install": true, "installed_commit": null, @@ -12533,7 +12241,7 @@ "category": "integration", "description": "Prosenic Vacuum integration for Home Assitant", "domain": "prosenic", - "downloads": 42, + "downloads": 0, "full_name": "edenhaus/ha-prosenic", "first_install": true, "installed_commit": null, @@ -13550,7 +13258,7 @@ "category": "integration", "description": "iCloud3 is a device_tracker custom_component for iPhones, iPads & iWatches that monitors zone & location events triggered by the HA iOS Companion App", "domain": "icloud3", - "downloads": 899, + "downloads": 0, "full_name": "gcobb321/icloud3", "first_install": true, "installed_commit": null, @@ -14425,7 +14133,7 @@ "category": "integration", "description": "\ud83d\uddc3\ufe0f Improved Backup Service for Hass.io that can Automatically Remove Snapshots and Supports Generational Backup Schemes.", "domain": "auto_backup", - "downloads": 3348, + "downloads": 0, "full_name": "jcwillox/hass-auto-backup", "first_install": true, "installed_commit": null, @@ -15670,7 +15378,7 @@ "category": "integration", "description": "Home Assistant custom component for Beward security Cameras and Doorbells", "domain": "beward", - "downloads": 1, + "downloads": 0, "full_name": "Limych/ha-beward", "first_install": true, "installed_commit": null, @@ -15745,7 +15453,7 @@ "category": "integration", "description": "Gismeteo Weather Provider for Home Assistant", "domain": "gismeteo", - "downloads": 12, + "downloads": 0, "full_name": "Limych/ha-gismeteo", "first_install": true, "installed_commit": null, @@ -15784,7 +15492,7 @@ "category": "integration", "description": "Car Wash Binary Sensor for Home Assistant", "domain": "car_wash", - "downloads": 1, + "downloads": 0, "full_name": "Limych/ha-car_wash", "first_install": true, "installed_commit": null, @@ -15820,7 +15528,7 @@ "category": "integration", "description": "Indoor Air Quality Sensor Component for Home Assistant", "domain": "iaquk", - "downloads": 5, + "downloads": 0, "full_name": "Limych/ha-iaquk", "first_install": true, "installed_commit": null, @@ -16335,7 +16043,7 @@ "category": "integration", "description": "Home assistant custom camera platform for NWS radar loops", "domain": "nwsradar", - "downloads": 1042, + "downloads": 0, "full_name": "MatthewFlamm/nwsradar", "first_install": true, "installed_commit": null, @@ -16400,7 +16108,7 @@ "category": "integration", "description": "This is a Home-Assistant custom component that pulls Fortnite stats using the python API library from the site fortnitetracker.com", "domain": "fortnite", - "downloads": 2, + "downloads": 0, "full_name": "michaellunzer/Home-Assistant-Custom-Component-Fortnite", "first_install": true, "installed_commit": null, @@ -16785,7 +16493,7 @@ "category": "integration", "description": "A custom component for Home Assistant to detect iPhones connected to local LAN, even if the phone is in deep sleep.", "domain": "iphonedetect", - "downloads": 3330, + "downloads": 0, "full_name": "mudape/iphonedetect", "first_install": true, "installed_commit": null, @@ -16988,7 +16696,7 @@ "category": "integration", "description": "Easy to use alarm system integration for Home Assistant", "domain": "alarmo", - "downloads": 578, + "downloads": 0, "full_name": "nielsfaber/alarmo", "first_install": true, "installed_commit": null, @@ -17099,7 +16807,7 @@ "category": "integration", "description": "Home Assistant integration for Goldair WiFi heaters, dehumidifiers and fans", "domain": "goldair_climate", - "downloads": 70, + "downloads": 0, "full_name": "nikrolls/homeassistant-goldair-climate", "first_install": true, "installed_commit": null, @@ -17508,7 +17216,7 @@ "category": "integration", "description": "Calendarific holiday sensor for Home Assistant ", "domain": "calendarific", - "downloads": 303, + "downloads": 0, "full_name": "pinkywafer/Calendarific", "first_install": true, "installed_commit": null, @@ -17548,7 +17256,7 @@ "category": "integration", "description": "Anniversary Countdown Sensor for Home Assistant", "domain": "anniversaries", - "downloads": 1791, + "downloads": 0, "full_name": "pinkywafer/Anniversaries", "first_install": true, "installed_commit": null, @@ -18612,7 +18320,7 @@ "category": "integration", "description": "Volkswagen Carnet Component for home assistant", "domain": "volkswagencarnet", - "downloads": 864, + "downloads": 0, "full_name": "robinostlund/homeassistant-volkswagencarnet", "first_install": true, "installed_commit": null, @@ -19871,7 +19579,7 @@ "category": "integration", "description": "Shelly smart home platform for Home Assistant", "domain": "shelly", - "downloads": 3125, + "downloads": 0, "full_name": "StyraHem/ShellyForHASS", "first_install": true, "installed_commit": null, @@ -20310,28 +20018,6 @@ "topics": [], "version_installed": null }, - "200897141": { - "authors": [], - "category": "integration", - "description": "\ud83d\udd39 Improve the lovelace yaml parser for Home Assistant", - "domain": "lovelace_gen", - "downloads": 0, - "full_name": "thomasloven/hass-lovelace_gen", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "14fd723", - "last_release_tag": "6", - "last_updated": "2020-02-26T13:18:57Z", - "name": "lovelace_gen", - "new": false, - "repository_manifest": {}, - "selected_tag": null, - "show_beta": false, - "stars": 71, - "topics": [], - "version_installed": null - }, "157618389": { "authors": [], "category": "integration", @@ -20595,7 +20281,7 @@ "category": "integration", "description": "Mikrotik router integration for Home Assistant", "domain": "mikrotik_router", - "downloads": 1644, + "downloads": 0, "full_name": "tomaae/homeassistant-mikrotik_router", "first_install": true, "installed_commit": null, @@ -20638,7 +20324,7 @@ "category": "integration", "description": "OpenMediaVault integration for Home Assistant", "domain": "openmediavault", - "downloads": 1393, + "downloads": 0, "full_name": "tomaae/homeassistant-openmediavault", "first_install": true, "installed_commit": null, @@ -21189,7 +20875,7 @@ "category": "integration", "description": "Melnor Raincloud Home Assistant Integration", "domain": "raincloud", - "downloads": 49, + "downloads": 0, "full_name": "vanstinator/hass-raincloud", "first_install": true, "installed_commit": null, @@ -21659,42 +21345,6 @@ ], "version_installed": null }, - "202987887": { - "authors": [ - "@zachowj" - ], - "category": "integration", - "description": "Companion Component for node-red-contrib-home-assistant-websocket to help integrate Node-RED with Home Assistant Core", - "domain": "nodered", - "downloads": 0, - "full_name": "zachowj/hass-node-red", - "first_install": true, - "installed_commit": null, - "installed": false, - "last_commit": "739619e", - "last_release_tag": "v0.4.4", - "last_updated": "2020-10-15T23:29:00Z", - "name": "nodered", - "new": false, - "repository_manifest": { - "name": "Node-RED", - "domains": [ - "binary_sensor", - "sensor", - "switch" - ], - "homeassistant": "0.96.0", - "iot_class": "local_push" - }, - "selected_tag": null, - "show_beta": false, - "stars": 93, - "topics": [ - "home-assistant", - "node-red" - ], - "version_installed": null - }, "199761906": { "authors": [ "@adminiuga" @@ -21761,64 +21411,149 @@ ], "version_installed": null }, - "260526528": { + "216165131": { "authors": [], - "category": "plugin", - "description": "Custom Dark Sky Weather plugin for HACS. This creates a rich weather card using the Dark Sky weather plugin.", - "domain": "", + "category": "theme", + "description": "Solarized Light theme for Home Assistant", + "domain": null, "downloads": 0, - "full_name": "clayauld/lovelace-darksky-card", - "first_install": false, - "installed_commit": "03e6eac", - "installed": true, - "last_commit": "03e6eac", + "full_name": "home-assistant-community-themes/solarized-light", + "first_install": true, + "installed_commit": null, + "installed": false, + "last_commit": "54c1ab2", "last_release_tag": null, - "last_updated": "2020-11-05T01:35:52Z", - "name": "lovelace-darksky-card", + "last_updated": "2020-10-05T07:15:33Z", + "name": "solarized-light", "new": false, "repository_manifest": { - "name": "Dark Sky Rich Weather Card", - "content_in_root": true, - "filename": "lovelace-darksky-card.js", - "render_readme": "true" + "name": "Solarized Light Theme" }, "selected_tag": null, "show_beta": false, "stars": 3, - "topics": [], + "topics": [ + "hacs", + "home-assistant", + "theme" + ], "version_installed": null }, - "261262884": { + "215075805": { "authors": [], - "category": "plugin", - "description": "\ud83d\udd70\ufe0f Time Picker Card for Home Assistant's Lovelace UI", - "domain": "", - "downloads": 958, - "full_name": "GeorgeSG/lovelace-time-picker-card", - "first_install": false, - "installed_commit": "c3fa2ce", - "installed": true, - "last_commit": "c3fa2ce", - "last_release_tag": "1.1.1", - "last_updated": "2020-11-22T14:38:10Z", - "name": "lovelace-time-picker-card", + "category": "theme", + "description": "Blue Night theme for Home Assistant", + "domain": null, + "downloads": 0, + "full_name": "home-assistant-community-themes/blue-night", + "first_install": true, + "installed_commit": null, + "installed": false, + "last_commit": "4c34f97", + "last_release_tag": null, + "last_updated": "2020-09-30T17:38:02Z", + "name": "blue-night", "new": false, "repository_manifest": { - "name": "Time Picker Card", - "render_readme": true, - "filename": "time-picker-card.js" + "name": "Blue Night Theme" }, "selected_tag": null, "show_beta": false, - "stars": 43, + "stars": 6, + "topics": [ + "hacs", + "home-assistant", + "theme" + ], + "version_installed": null + }, + "197006509": { + "authors": [], + "category": "theme", + "description": "A Dark Theme for Home Assistant", + "domain": null, + "downloads": 0, + "full_name": "seangreen2/slate_theme", + "first_install": true, + "installed_commit": null, + "installed": false, + "last_commit": "c18ae17", + "last_release_tag": null, + "last_updated": "2020-11-21T01:36:26Z", + "name": "slate_theme", + "new": false, + "repository_manifest": {}, + "selected_tag": null, + "show_beta": false, + "stars": 77, + "topics": [ + "hacs", + "home-assistant", + "theme" + ], + "version_installed": null + }, + "202987887": { + "authors": [ + "@zachowj" + ], + "category": "integration", + "description": "Companion Component for node-red-contrib-home-assistant-websocket to help integrate Node-RED with Home Assistant Core", + "domain": "nodered", + "downloads": 0, + "full_name": "zachowj/hass-node-red", + "first_install": true, + "installed_commit": null, + "installed": false, + "last_commit": "739619e", + "last_release_tag": "v0.4.4", + "last_updated": "2020-10-15T23:29:00Z", + "name": "nodered", + "new": false, + "repository_manifest": { + "name": "Node-RED", + "domains": [ + "binary_sensor", + "sensor", + "switch" + ], + "homeassistant": "0.96.0", + "iot_class": "local_push" + }, + "selected_tag": null, + "show_beta": false, + "stars": 93, "topics": [ "home-assistant", - "homeassistant", - "lovelace", - "lovelace-card", - "lovelace-custom-card" + "node-red" ], - "version_installed": "1.1.1" + "version_installed": null + }, + "142545838": { + "authors": [], + "category": "plugin", + "description": "The card makes it possible to use gauges from https://canvas-gauges.com/", + "domain": null, + "downloads": 0, + "full_name": "custom-cards/canvas-gauge-card", + "first_install": true, + "installed_commit": null, + "installed": false, + "last_commit": "8e769e3", + "last_release_tag": "0.4.1", + "last_updated": "2020-09-25T19:45:39Z", + "name": "canvas-gauge-card", + "new": false, + "repository_manifest": { + "name": "Canvas Gauge Card", + "render_readme": true, + "filename": "canvas-gauge-card.js" + }, + "selected_tag": null, + "show_beta": false, + "stars": 60, + "topics": [], + "version_installed": null }, "172733314": { "authors": [ @@ -21827,7 +21562,7 @@ "category": "integration", "description": "HACS gives you a powerful UI to handle downloads of all your custom needs.", "domain": "hacs", - "downloads": 9120, + "downloads": 10720, "full_name": "hacs/integration", "first_install": false, "installed_commit": null, @@ -21847,7 +21582,7 @@ }, "selected_tag": null, "show_beta": false, - "stars": 1422, + "stars": 1426, "topics": [ "community", "hacktoberfest", @@ -21859,6 +21594,56 @@ ], "version_installed": "1.8.0" }, + "221287384": { + "authors": [], + "category": "theme", + "description": "Clear Theme for Home Assistant", + "domain": null, + "downloads": 0, + "full_name": "naofireblade/clear-theme", + "first_install": false, + "installed_commit": "e3c9149", + "installed": true, + "last_commit": "a9f68e1", + "last_release_tag": "v1.1", + "last_updated": "2020-10-08T10:10:49Z", + "name": "clear-theme", + "new": false, + "repository_manifest": { + "name": "Clear Theme", + "homeassistant": "0.102.0" + }, + "selected_tag": null, + "show_beta": false, + "stars": 16, + "topics": [], + "version_installed": "v1.1" + }, + "150781994": { + "authors": [], + "category": "plugin", + "description": "\ud83d\udd39 A foldable row for entities card, containing other rows", + "domain": null, + "downloads": 0, + "full_name": "thomasloven/lovelace-fold-entity-row", + "first_install": false, + "installed_commit": "01b4108", + "installed": true, + "last_commit": "01b4108", + "last_release_tag": "19", + "last_updated": "2020-08-01T03:12:50Z", + "name": "lovelace-fold-entity-row", + "new": false, + "repository_manifest": { + "name": "fold-entity-row", + "render_readme": true + }, + "selected_tag": null, + "show_beta": false, + "stars": 190, + "topics": [], + "version_installed": "19" + }, "162468030": { "authors": [], "category": "theme", @@ -21892,12 +21677,62 @@ ], "version_installed": null }, + "190927524": { + "authors": [], + "category": "plugin", + "description": "\ud83d\udd39 Add CSS styles to (almost) any lovelace card", + "domain": null, + "downloads": 0, + "full_name": "thomasloven/lovelace-card-mod", + "first_install": false, + "installed_commit": "457cf40", + "installed": true, + "last_commit": "457cf40", + "last_release_tag": "2.0.3", + "last_updated": "2020-11-18T09:01:24Z", + "name": "lovelace-card-mod", + "new": false, + "repository_manifest": { + "name": "card-mod", + "homeassistant": "0.98.0" + }, + "selected_tag": null, + "show_beta": false, + "stars": 215, + "topics": [], + "version_installed": "2.0.3" + }, + "156434866": { + "authors": [], + "category": "plugin", + "description": "\ud83d\udd39 Get more control over the placement of lovelace cards.", + "domain": null, + "downloads": 0, + "full_name": "thomasloven/lovelace-layout-card", + "first_install": false, + "installed_commit": "e8f0ac8", + "installed": true, + "last_commit": "e8f0ac8", + "last_release_tag": "16", + "last_updated": "2020-11-18T07:35:50Z", + "name": "lovelace-layout-card", + "new": false, + "repository_manifest": { + "name": "layout-card", + "render_readme": true + }, + "selected_tag": null, + "show_beta": false, + "stars": 249, + "topics": [], + "version_installed": "16" + }, "146194325": { "authors": [], "category": "plugin", "description": "\u2747\ufe0f Lovelace button-card for home assistant", "domain": "", - "downloads": 5070, + "downloads": 5414, "full_name": "custom-cards/button-card", "first_install": false, "installed_commit": "b5de991", @@ -21915,7 +21750,7 @@ }, "selected_tag": null, "show_beta": false, - "stars": 580, + "stars": 581, "topics": [ "home-assistant", "home-assistant-custom", @@ -21924,6 +21759,171 @@ "lovelace-ui" ], "version_installed": "3.4.0" + }, + "167744584": { + "authors": [], + "category": "plugin", + "description": "\ud83d\udd39Automatically populate the entities-list of lovelace cards", + "domain": null, + "downloads": 0, + "full_name": "thomasloven/lovelace-auto-entities", + "first_install": false, + "installed_commit": "f17fcc1", + "installed": true, + "last_commit": "f17fcc1", + "last_release_tag": "1.7.0", + "last_updated": "2020-11-21T19:52:51Z", + "name": "lovelace-auto-entities", + "new": false, + "repository_manifest": { + "name": "auto-entities", + "render_readme": true + }, + "selected_tag": null, + "show_beta": false, + "stars": 328, + "topics": [], + "version_installed": "1.7.0" + }, + "260526528": { + "authors": [], + "category": "plugin", + "description": "Custom Dark Sky Weather plugin for HACS. This creates a rich weather card using the Dark Sky weather plugin.", + "domain": "", + "downloads": 0, + "full_name": "clayauld/lovelace-darksky-card", + "first_install": false, + "installed_commit": "03e6eac", + "installed": true, + "last_commit": "03e6eac", + "last_release_tag": null, + "last_updated": "2020-11-05T01:35:52Z", + "name": "lovelace-darksky-card", + "new": false, + "repository_manifest": { + "name": "Dark Sky Rich Weather Card", + "content_in_root": true, + "filename": "lovelace-darksky-card.js", + "render_readme": "true" + }, + "selected_tag": null, + "show_beta": false, + "stars": 3, + "topics": [], + "version_installed": null + }, + "223008910": { + "authors": [], + "category": "plugin", + "description": "Custom Sidebar for Home Assistant", + "domain": "", + "downloads": 0, + "full_name": "Villhellm/custom-sidebar", + "first_install": false, + "installed_commit": "3ed0a8f", + "installed": true, + "last_commit": "3ed0a8f", + "last_release_tag": "v0.2.2", + "last_updated": "2020-10-31T13:26:16Z", + "name": "custom-sidebar", + "new": false, + "repository_manifest": { + "name": "Custom Sidebar", + "render_readme": true + }, + "selected_tag": null, + "show_beta": false, + "stars": 52, + "topics": [ + "custom", + "hacktoberfest", + "sidebar" + ], + "version_installed": "v0.2.2" + }, + "200897141": { + "authors": [], + "category": "integration", + "description": "\ud83d\udd39 Improve the lovelace yaml parser for Home Assistant", + "domain": "lovelace_gen", + "downloads": 0, + "full_name": "thomasloven/hass-lovelace_gen", + "first_install": false, + "installed_commit": "14fd723", + "installed": true, + "last_commit": "14fd723", + "last_release_tag": "6", + "last_updated": "2020-02-26T13:18:57Z", + "name": "lovelace_gen", + "new": false, + "repository_manifest": {}, + "selected_tag": null, + "show_beta": false, + "stars": 71, + "topics": [], + "version_installed": "6" + }, + "303101606": { + "authors": [], + "category": "plugin", + "description": "\ud83d\ude48 Hides the Home Assistant header and/or sidebar", + "domain": "", + "downloads": 2767, + "full_name": "maykar/kiosk-mode", + "first_install": false, + "installed_commit": "78b95f3", + "installed": true, + "last_commit": "78b95f3", + "last_release_tag": "1.4.7", + "last_updated": "2020-11-19T12:46:12Z", + "name": "kiosk-mode", + "new": false, + "repository_manifest": { + "name": "Kiosk Mode", + "render_readme": true + }, + "selected_tag": null, + "show_beta": false, + "stars": 48, + "topics": [ + "home-assistant", + "kiosk", + "kiosk-mode", + "lovelace" + ], + "version_installed": "1.4.7" + }, + "261262884": { + "authors": [], + "category": "plugin", + "description": "\ud83d\udd70\ufe0f Time Picker Card for Home Assistant's Lovelace UI", + "domain": "", + "downloads": 980, + "full_name": "GeorgeSG/lovelace-time-picker-card", + "first_install": false, + "installed_commit": "c3fa2ce", + "installed": true, + "last_commit": "c3fa2ce", + "last_release_tag": "1.1.1", + "last_updated": "2020-11-22T14:38:10Z", + "name": "lovelace-time-picker-card", + "new": false, + "repository_manifest": { + "name": "Time Picker Card", + "render_readme": true, + "filename": "time-picker-card.js" + }, + "selected_tag": null, + "show_beta": false, + "stars": 43, + "topics": [ + "home-assistant", + "homeassistant", + "lovelace", + "lovelace-card", + "lovelace-custom-card" + ], + "version_installed": "1.1.1" } } } \ No newline at end of file diff --git a/.storage/hacs/101090553.hacs b/.storage/hacs/101090553.hacs new file mode 100644 index 0000000..c28db5d --- /dev/null +++ b/.storage/hacs/101090553.hacs @@ -0,0 +1,49 @@ +{ + "version": "6", + "key": "hacs/101090553.hacs", + "data": { + "archived": false, + "authors": [ + "@rogro82" + ], + "category": "integration", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "Home Assistant variables component", + "domain": "variable", + "domains": [], + "downloads": 0, + "file_name": "", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "rogro82/hass-variables", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "101090553", + "iot_class": null, + "installed": true, + "installed_commit": "fd9b44e", + "installed_version": null, + "open_issues": 29, + "last_commit": "fd9b44e", + "last_version": null, + "last_updated": "2020-10-27T17:12:19Z", + "manifest_name": "variable", + "new": false, + "persistent_directory": null, + "pushed_at": "2020-10-27T17:12:19", + "releases": false, + "render_readme": false, + "published_tags": [], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 166, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/146194325.hacs b/.storage/hacs/146194325.hacs index a787cbd..b4a6c63 100644 --- a/.storage/hacs/146194325.hacs +++ b/.storage/hacs/146194325.hacs @@ -12,7 +12,7 @@ "description": "\u2747\ufe0f Lovelace button-card for home assistant", "domain": "", "domains": [], - "downloads": 5070, + "downloads": 5414, "file_name": "button-card.js", "filename": "button-card.js", "first_install": false, @@ -46,7 +46,7 @@ ], "selected_tag": null, "show_beta": false, - "stargazers_count": 580, + "stargazers_count": 581, "topics": [ "home-assistant", "home-assistant-custom", diff --git a/.storage/hacs/150781994.hacs b/.storage/hacs/150781994.hacs new file mode 100644 index 0000000..88a9091 --- /dev/null +++ b/.storage/hacs/150781994.hacs @@ -0,0 +1,53 @@ +{ + "version": "6", + "key": "hacs/150781994.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\udd39 A foldable row for entities card, containing other rows", + "domain": null, + "domains": [], + "downloads": 0, + "file_name": "fold-entity-row.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "thomasloven/lovelace-fold-entity-row", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "150781994", + "iot_class": null, + "installed": true, + "installed_commit": "01b4108", + "installed_version": "19", + "open_issues": 15, + "last_commit": "01b4108", + "last_version": "19", + "last_updated": "2020-08-01T03:12:50Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-08-01T03:12:50", + "releases": true, + "render_readme": true, + "published_tags": [ + "19", + "18", + "17", + "16", + "15" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 190, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/156434866.hacs b/.storage/hacs/156434866.hacs new file mode 100644 index 0000000..381066c --- /dev/null +++ b/.storage/hacs/156434866.hacs @@ -0,0 +1,53 @@ +{ + "version": "6", + "key": "hacs/156434866.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\udd39 Get more control over the placement of lovelace cards.", + "domain": null, + "domains": [], + "downloads": 0, + "file_name": "layout-card.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "thomasloven/lovelace-layout-card", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "156434866", + "iot_class": null, + "installed": true, + "installed_commit": "e8f0ac8", + "installed_version": "16", + "open_issues": 29, + "last_commit": "e8f0ac8", + "last_version": "16", + "last_updated": "2020-11-18T07:35:50Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-11-18T07:35:50", + "releases": true, + "render_readme": true, + "published_tags": [ + "16", + "15", + "14", + "13", + "12" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 249, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/167744584.hacs b/.storage/hacs/167744584.hacs new file mode 100644 index 0000000..27e7929 --- /dev/null +++ b/.storage/hacs/167744584.hacs @@ -0,0 +1,53 @@ +{ + "version": "6", + "key": "hacs/167744584.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\udd39Automatically populate the entities-list of lovelace cards", + "domain": null, + "domains": [], + "downloads": 0, + "file_name": "auto-entities.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "thomasloven/lovelace-auto-entities", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "167744584", + "iot_class": null, + "installed": true, + "installed_commit": "f17fcc1", + "installed_version": "1.7.0", + "open_issues": 21, + "last_commit": "f17fcc1", + "last_version": "1.7.0", + "last_updated": "2020-11-21T19:52:51Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-11-21T19:52:51", + "releases": true, + "render_readme": true, + "published_tags": [ + "1.7.0", + "16", + "15", + "14", + "13" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 328, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/172733314.hacs b/.storage/hacs/172733314.hacs index 5f76e61..f07d8f7 100644 --- a/.storage/hacs/172733314.hacs +++ b/.storage/hacs/172733314.hacs @@ -14,7 +14,7 @@ "description": "HACS gives you a powerful UI to handle downloads of all your custom needs.", "domain": "hacs", "domains": [], - "downloads": 9120, + "downloads": 10720, "file_name": "", "filename": "hacs.zip", "first_install": false, @@ -29,7 +29,7 @@ "installed": true, "installed_commit": null, "installed_version": "1.8.0", - "open_issues": 30, + "open_issues": 29, "last_commit": "d41c3f7", "last_version": "1.8.0", "last_updated": "2020-12-08T07:18:56Z", @@ -48,7 +48,7 @@ ], "selected_tag": null, "show_beta": false, - "stargazers_count": 1422, + "stargazers_count": 1426, "topics": [ "community", "hacktoberfest", diff --git a/.storage/hacs/190927524.hacs b/.storage/hacs/190927524.hacs new file mode 100644 index 0000000..fbcafde --- /dev/null +++ b/.storage/hacs/190927524.hacs @@ -0,0 +1,53 @@ +{ + "version": "6", + "key": "hacs/190927524.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\udd39 Add CSS styles to (almost) any lovelace card", + "domain": null, + "domains": [], + "downloads": 0, + "file_name": "card-mod.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "thomasloven/lovelace-card-mod", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": "0.98.0", + "id": "190927524", + "iot_class": null, + "installed": true, + "installed_commit": "457cf40", + "installed_version": "2.0.3", + "open_issues": 20, + "last_commit": "457cf40", + "last_version": "2.0.3", + "last_updated": "2020-11-18T09:01:24Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-11-18T09:01:24", + "releases": true, + "render_readme": false, + "published_tags": [ + "2.0.3", + "2.0.2", + "2.0.1", + "2.0.0", + "14" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 215, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/200897141.hacs b/.storage/hacs/200897141.hacs new file mode 100644 index 0000000..aedffcb --- /dev/null +++ b/.storage/hacs/200897141.hacs @@ -0,0 +1,53 @@ +{ + "version": "6", + "key": "hacs/200897141.hacs", + "data": { + "archived": false, + "authors": [], + "category": "integration", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\udd39 Improve the lovelace yaml parser for Home Assistant", + "domain": "lovelace_gen", + "domains": [], + "downloads": 0, + "file_name": "", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "thomasloven/hass-lovelace_gen", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "200897141", + "iot_class": null, + "installed": true, + "installed_commit": "14fd723", + "installed_version": "6", + "open_issues": 8, + "last_commit": "14fd723", + "last_version": "6", + "last_updated": "2020-02-26T13:18:57Z", + "manifest_name": "Lovelace Gen", + "new": false, + "persistent_directory": null, + "pushed_at": "2020-02-26T13:18:57", + "releases": true, + "render_readme": false, + "published_tags": [ + "6", + "5", + "4", + "3", + "2" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 71, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/221287384.hacs b/.storage/hacs/221287384.hacs new file mode 100644 index 0000000..1fccda2 --- /dev/null +++ b/.storage/hacs/221287384.hacs @@ -0,0 +1,50 @@ +{ + "version": "6", + "key": "hacs/221287384.hacs", + "data": { + "archived": false, + "authors": [], + "category": "theme", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "Clear Theme for Home Assistant", + "domain": null, + "domains": [], + "downloads": 0, + "file_name": "clear.yaml", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "naofireblade/clear-theme", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": "0.102.0", + "id": "221287384", + "iot_class": null, + "installed": true, + "installed_commit": "e3c9149", + "installed_version": "v1.1", + "open_issues": 2, + "last_commit": "a9f68e1", + "last_version": "v1.1", + "last_updated": "2020-10-08T10:10:49Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-10-08T10:10:49", + "releases": true, + "render_readme": false, + "published_tags": [ + "v1.1", + "v1.0" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 16, + "topics": [], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/223008910.hacs b/.storage/hacs/223008910.hacs new file mode 100644 index 0000000..0094715 --- /dev/null +++ b/.storage/hacs/223008910.hacs @@ -0,0 +1,57 @@ +{ + "version": "6", + "key": "hacs/223008910.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "Custom Sidebar for Home Assistant", + "domain": "", + "domains": [], + "downloads": 0, + "file_name": "custom-sidebar.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "Villhellm/custom-sidebar", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "223008910", + "iot_class": null, + "installed": true, + "installed_commit": "3ed0a8f", + "installed_version": "v0.2.2", + "open_issues": 5, + "last_commit": "3ed0a8f", + "last_version": "v0.2.2", + "last_updated": "2020-10-31T13:26:16Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-10-31T13:26:16", + "releases": true, + "render_readme": true, + "published_tags": [ + "v0.2.2", + "v0.2.1", + "v0.2.0", + "v0.1.7", + "v0.1.6" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 52, + "topics": [ + "custom", + "hacktoberfest", + "sidebar" + ], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/hacs/261262884.hacs b/.storage/hacs/261262884.hacs index 5c52b41..bc41a16 100644 --- a/.storage/hacs/261262884.hacs +++ b/.storage/hacs/261262884.hacs @@ -12,7 +12,7 @@ "description": "\ud83d\udd70\ufe0f Time Picker Card for Home Assistant's Lovelace UI", "domain": "", "domains": [], - "downloads": 958, + "downloads": 980, "file_name": "time-picker-card.js", "filename": "time-picker-card.js", "first_install": false, diff --git a/.storage/hacs/303101606.hacs b/.storage/hacs/303101606.hacs new file mode 100644 index 0000000..2a64515 --- /dev/null +++ b/.storage/hacs/303101606.hacs @@ -0,0 +1,58 @@ +{ + "version": "6", + "key": "hacs/303101606.hacs", + "data": { + "archived": false, + "authors": [], + "category": "plugin", + "content_in_root": false, + "country": [], + "config_flow": false, + "default_branch": "master", + "description": "\ud83d\ude48 Hides the Home Assistant header and/or sidebar", + "domain": "", + "domains": [], + "downloads": 2767, + "file_name": "kiosk-mode.js", + "filename": "", + "first_install": false, + "fork": false, + "full_name": "maykar/kiosk-mode", + "hacs": null, + "hide": false, + "hide_default_branch": false, + "homeassistant": null, + "id": "303101606", + "iot_class": null, + "installed": true, + "installed_commit": "78b95f3", + "installed_version": "1.4.7", + "open_issues": 3, + "last_commit": "78b95f3", + "last_version": "1.4.7", + "last_updated": "2020-11-19T12:46:12Z", + "manifest_name": null, + "new": false, + "persistent_directory": null, + "pushed_at": "2020-11-19T12:46:12", + "releases": true, + "render_readme": true, + "published_tags": [ + "1.4.7", + "1.4.5", + "1.4.4", + "1.4.3", + "1.4.2" + ], + "selected_tag": null, + "show_beta": false, + "stargazers_count": 48, + "topics": [ + "home-assistant", + "kiosk", + "kiosk-mode", + "lovelace" + ], + "zip_release": false + } +} \ No newline at end of file diff --git a/.storage/http b/.storage/http index 76a1513..37f759e 100644 --- a/.storage/http +++ b/.storage/http @@ -2,12 +2,12 @@ "version": 1, "key": "http", "data": { - "server_port": 8123, "ssl_profile": "modern", + "server_port": 8123, + "login_attempts_threshold": -1, "cors_allowed_origins": [ "https://cast.home-assistant.io" ], - "login_attempts_threshold": -1, "ip_ban_enabled": true } } \ No newline at end of file diff --git a/.storage/lovelace.lovelace_learning b/.storage/lovelace.lovelace_learning deleted file mode 100644 index be9bda1..0000000 --- a/.storage/lovelace.lovelace_learning +++ /dev/null @@ -1,209 +0,0 @@ -{ - "version": 1, - "key": "lovelace.lovelace_learning", - "data": { - "config": { - "title": "238 McHaley", - "views": [ - { - "title": "Meterology", - "path": "meterology", - "icon": "mdi:thermometer-lines", - "badges": [], - "cards": [ - { - "type": "entities", - "show_header_toggle": false, - "title": "Outside", - "entities": [ - "sensor.outside_temperature", - "sensor.outside_humidity" - ] - }, - { - "type": "entities", - "show_header_toggle": false, - "title": "Inside", - "entities": [ - "sensor.inside_temperature", - "sensor.inside_humidity" - ] - }, - { - "type": "weather-forecast", - "entity": "weather.praire_city_weather" - }, - { - "type": "entities", - "entities": [ - { - "entity": "sensor.bme_outside_temperature", - "icon": "mdi:temperature-fahrenheit", - "name": "Outside Temperature", - "secondary_info": "last-changed" - }, - { - "entity": "sensor.bme_outside_humidity", - "name": "Humidity", - "icon": "mdi:water-percent" - }, - { - "entity": "sensor.bme_outside_barometric_pressure", - "name": "Barometric Pressue", - "icon": "mdi:gauge" - }, - { - "entity": "sensor.bme_outside_dew_point_temperature", - "name": "Dew Point Temperature", - "icon": "mdi:thermometer-lines" - } - ], - "title": "Outside Conditions", - "theme": "Dark Blue", - "show_header_toggle": false - }, - { - "type": "iframe", - "url": "https://embed.windy.com/embed2.html?lat=44.422&lon=-118.718&detailLat=44.452&detailLon=-118.529&width=650&height=450&zoom=9&level=surface&overlay=radar&product=radar&menu=&message=&marker=&calendar=now&pressure=&type=map&location=coordinates&detail=&metricWind=mph&metricTemp=%C2%B0F&radarRange=-1", - "aspect_ratio": "100%", - "title": "Live Weather Map" - }, - { - "type": "iframe", - "title": "Local Radar", - "aspect_ratio": "100%", - "url": "https://www.rainviewer.com/map.html?loc=44.4823,-118.7828,10&oFa=0&oC=1&oU=0&oCS=1&oF=0&oAP=0&rmt=0&c=0&o=83&lm=1&th=1&sm=1&sn=1" - }, - { - "type": "weather-forecast", - "entity": "weather.praire_city_weather" - }, - { - "type": "custom:lovelace-darksky-card", - "entity_current_conditions": "sensor.dark_sky_icon", - "entity_temperature": "sensor.dark_sky_temperature", - "entity_forecast_high_temp_1": "sensor.dark_sky_daytime_high_temperature_1d", - "entity_forecast_high_temp_2": "sensor.dark_sky_daytime_high_temperature_2d", - "entity_forecast_high_temp_3": "sensor.dark_sky_daytime_high_temperature_3d", - "entity_forecast_high_temp_4": "sensor.dark_sky_daytime_high_temperature_4d", - "entity_forecast_high_temp_5": "sensor.dark_sky_daytime_high_temperature_5d", - "entity_forecast_icon_1": "sensor.dark_sky_icon_1d", - "entity_forecast_icon_2": "sensor.dark_sky_icon_2d", - "entity_forecast_icon_3": "sensor.dark_sky_icon_3d", - "entity_forecast_icon_4": "sensor.dark_sky_icon_4d", - "entity_forecast_icon_5": "sensor.dark_sky_icon_5d", - "entity_forecast_low_temp_1": "sensor.dark_sky_overnight_low_temperature_0d", - "entity_forecast_low_temp_2": "sensor.dark_sky_overnight_low_temperature_1d", - "entity_forecast_low_temp_3": "sensor.dark_sky_overnight_low_temperature_2d", - "entity_forecast_low_temp_4": "sensor.dark_sky_overnight_low_temperature_3d", - "entity_forecast_low_temp_5": "sensor.dark_sky_overnight_low_temperature_4d", - "entity_summary_1": "sensor.dark_sky_summary_1d", - "entity_summary_2": "sensor.dark_sky_summary_2d", - "entity_summary_3": "sensor.dark_sky_summary_3d", - "entity_summary_4": "sensor.dark_sky_summary_4d", - "entity_summary_5": "sensor.dark_sky_summary_5d", - "entity_sun": "sun.sun", - "entity_visibility": "sensor.dark_sky_visibility", - "entity_daytime_high": "sensor.dark_sky_daytime_high_temperature_0d", - "entity_wind_bearing": "sensor.dark_sky_wind_bearing", - "entity_wind_speed": "sensor.dark_sky_wind_speed", - "entity_humidity": "sensor.dark_sky_humidity", - "entity_pressure": "sensor.dark_sky_pressure", - "entity_apparent_temp": "sensor.dark_sky_apparent_temperature", - "entity_daily_summary": "sensor.dark_sky_daily_summary", - "entity_pop": "sensor.dark_sky_precip_probability", - "entity_pop_intensity": "sensor.dark_sky_precip_intensity", - "entity_pop_1": "sensor.dark_sky_precip_probability_1d", - "entity_pop_2": "sensor.dark_sky_precip_probability_2d", - "entity_pop_3": "sensor.dark_sky_precip_probability_3d", - "entity_pop_4": "sensor.dark_sky_precip_probability_4d", - "entity_pop_5": "sensor.dark_sky_precip_probability_5d" - } - ] - }, - { - "title": "Lights", - "path": "lights", - "icon": "mdi:lightbulb", - "badges": [], - "cards": [ - { - "type": "entities", - "show_header_toggle": false, - "title": "Indoor Security Lights", - "entities": [ - { - "entity": "switch.all_sonoffs", - "name": "Lights State (manual override)" - }, - { - "entity": "input_datetime.security_lights_interior_time_off", - "name": "Time Of Day To Turn Off (24HR)" - }, - { - "entity": "automation.security_lights_interior_time_on", - "name": "Lights On At Sunset Automation Enabled" - }, - { - "entity": "automation.security_lights_interior_time_off", - "name": "Lights Off Automation Enabled" - } - ] - }, - { - "type": "entities", - "show_header_toggle": false, - "title": "Raw Sonoff Control", - "entities": [ - "switch.sonoff_white", - "switch.sonoff_brown", - "switch.all_sonoffs" - ] - }, - { - "type": "custom:time-picker-card", - "entity": "input_datetime.security_lights_interior_time_off", - "hour_mode": 24, - "hour_step": 1, - "minute_step": 5, - "second_step": 5, - "name": "lights off at", - "layout": { - "embedded": true, - "name": "header", - "align_controls": "center" - }, - "link_values": false - }, - { - "type": "button", - "tap_action": { - "action": "toggle" - }, - "entity": "switch.outside_north_circuit_1" - } - ] - }, - { - "title": "Electronics Closet", - "path": "electronics-closet", - "icon": "mdi:door", - "badges": [], - "cards": [ - { - "type": "entities", - "show_header_toggle": false, - "title": "Temperature Control", - "entities": [ - "sensor.closet_temperature", - "input_number.fan_on_temp", - "switch.fan_automation_enabled", - "fan.fan_state" - ] - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/.storage/lovelace.lovelace_main b/.storage/lovelace.lovelace_main new file mode 100644 index 0000000..8758dd5 --- /dev/null +++ b/.storage/lovelace.lovelace_main @@ -0,0 +1,101 @@ +{ + "version": 1, + "key": "lovelace.lovelace_main", + "data": { + "config": { + "title": "238 McHaley", + "path": "lovelace-main", + "views": [ + { + "title": "Lights/Outlets", + "path": "circuits", + "icon": "", + "badges": [], + "cards": [ + { + "type": "entities", + "show_header_toggle": false, + "title": "Indoor Security Lights", + "entities": [ + { + "entity": "switch.all_sonoffs", + "name": "Lights State (manual override)" + }, + { + "entity": "input_datetime.security_lights_interior_time_off", + "name": "Time Of Day To Turn Off (24HR)" + }, + { + "entity": "automation.security_lights_interior_time_on", + "name": "Lights On At Sunset Automation Enabled" + }, + { + "entity": "automation.security_lights_interior_time_off", + "name": "Lights Off Automation Enabled" + } + ] + }, + { + "type": "entities", + "show_header_toggle": false, + "title": "Raw Sonoff Control", + "entities": [ + "switch.sonoff_white", + "switch.sonoff_brown", + "switch.all_sonoffs" + ] + }, + { + "type": "custom:time-picker-card", + "entity": "input_datetime.security_lights_interior_time_off", + "hour_mode": 24, + "hour_step": 1, + "minute_step": 5, + "second_step": 5, + "name": "lights off at", + "layout": { + "embedded": true, + "name": "header", + "align_controls": "center" + }, + "link_values": false + }, + { + "type": "button", + "tap_action": { + "action": "toggle" + }, + "entity": "switch.outside_north_circuit_1" + } + ] + }, + { + "title": "sensors", + "path": "sensors", + "icon": "", + "badges": [], + "cards": [] + }, + { + "title": "Electronics Closet", + "path": "electronics-closet", + "icon": "", + "badges": [], + "cards": [ + { + "type": "entities", + "show_header_toggle": false, + "title": "Temperature Control", + "entities": [ + "sensor.closet_temperature", + "input_number.fan_on_temp", + "switch.fan_automation_enabled", + "fan.fan_state" + ] + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/.storage/lovelace.lovelace_user b/.storage/lovelace.lovelace_user new file mode 100644 index 0000000..5e0e7a9 --- /dev/null +++ b/.storage/lovelace.lovelace_user @@ -0,0 +1,381 @@ +{ + "data": { + "config": { + "title": "All Entities", + "views": [ + { + "badges": [ + { + "entity": "binary_sensor.updater" + }, + { + "entity": "person.sysadmin" + }, + { + "entity": "sensor.time" + }, + { + "entity": "sensor.date" + }, + { + "entity": "sensor.date_time" + }, + { + "entity": "sensor.date_time_iso" + }, + { + "entity": "sensor.time_date" + }, + { + "entity": "sensor.time_utc" + }, + { + "entity": "sensor.internet_time" + }, + { + "entity": "sensor.zone_1_duration" + }, + { + "entity": "sensor.zone_1_repeat" + }, + { + "entity": "sensor.zone_1_time_delta" + }, + { + "entity": "sensor.closet_temperature" + }, + { + "entity": "sensor.panic_on_percent" + }, + { + "entity": "sensor.zone_1_timer_next" + }, + { + "entity": "sensor.forecast_summary" + }, + { + "entity": "sensor.forecast_summary_0d" + }, + { + "entity": "sensor.forecast_summary_2d" + }, + { + "entity": "sensor.forecast_summary_3d" + }, + { + "entity": "sensor.forecast_summary_0h" + }, + { + "entity": "sensor.forecast_summary_1h" + }, + { + "entity": "sensor.forecast_summary_2h" + }, + { + "entity": "sensor.forecast_summary_3h" + }, + { + "entity": "sensor.forecast_icon" + }, + { + "entity": "sensor.forecast_icon_0d" + }, + { + "entity": "sensor.forecast_icon_2d" + }, + { + "entity": "sensor.forecast_icon_3d" + }, + { + "entity": "sensor.forecast_icon_0h" + }, + { + "entity": "sensor.forecast_icon_1h" + }, + { + "entity": "sensor.forecast_icon_2h" + }, + { + "entity": "sensor.forecast_icon_3h" + }, + { + "entity": "sensor.forecast_temperature" + }, + { + "entity": "sensor.forecast_temperature_0h" + }, + { + "entity": "sensor.forecast_temperature_1h" + }, + { + "entity": "sensor.forecast_temperature_2h" + }, + { + "entity": "sensor.forecast_temperature_3h" + }, + { + "entity": "sensor.forecast_dew_point" + }, + { + "entity": "sensor.forecast_dew_point_0d" + }, + { + "entity": "sensor.forecast_dew_point_2d" + }, + { + "entity": "sensor.forecast_dew_point_3d" + }, + { + "entity": "sensor.forecast_dew_point_0h" + }, + { + "entity": "sensor.forecast_dew_point_1h" + }, + { + "entity": "sensor.forecast_dew_point_2h" + }, + { + "entity": "sensor.forecast_dew_point_3h" + }, + { + "entity": "sensor.forecast_wind_speed" + }, + { + "entity": "sensor.forecast_wind_speed_0d" + }, + { + "entity": "sensor.forecast_wind_speed_2d" + }, + { + "entity": "sensor.forecast_wind_speed_3d" + }, + { + "entity": "sensor.forecast_wind_speed_0h" + }, + { + "entity": "sensor.forecast_wind_speed_1h" + }, + { + "entity": "sensor.forecast_wind_speed_2h" + }, + { + "entity": "sensor.forecast_wind_speed_3h" + }, + { + "entity": "sensor.forecast_wind_bearing" + }, + { + "entity": "sensor.forecast_wind_bearing_0d" + }, + { + "entity": "sensor.forecast_wind_bearing_2d" + }, + { + "entity": "sensor.forecast_wind_bearing_3d" + }, + { + "entity": "sensor.forecast_wind_bearing_0h" + }, + { + "entity": "sensor.forecast_wind_bearing_1h" + }, + { + "entity": "sensor.forecast_wind_bearing_2h" + }, + { + "entity": "sensor.forecast_wind_bearing_3h" + }, + { + "entity": "sensor.forecast_cloud_coverage" + }, + { + "entity": "sensor.forecast_cloud_coverage_0d" + }, + { + "entity": "sensor.forecast_cloud_coverage_2d" + }, + { + "entity": "sensor.forecast_cloud_coverage_3d" + }, + { + "entity": "sensor.forecast_cloud_coverage_0h" + }, + { + "entity": "sensor.forecast_cloud_coverage_1h" + }, + { + "entity": "sensor.forecast_cloud_coverage_2h" + }, + { + "entity": "sensor.forecast_cloud_coverage_3h" + }, + { + "entity": "sensor.forecast_daytime_high_temperature_0d" + }, + { + "entity": "sensor.forecast_daytime_high_temperature_2d" + }, + { + "entity": "sensor.forecast_daytime_high_temperature_3d" + }, + { + "entity": "sensor.forecast_overnight_low_temperature_0d" + }, + { + "entity": "sensor.forecast_overnight_low_temperature_2d" + }, + { + "entity": "sensor.forecast_overnight_low_temperature_3d" + }, + { + "entity": "sensor.forecast_moon_phase_0d" + }, + { + "entity": "sensor.forecast_moon_phase_2d" + }, + { + "entity": "sensor.forecast_moon_phase_3d" + }, + { + "entity": "sensor.forecast_sunset_0d" + }, + { + "entity": "sensor.forecast_sunset_2d" + }, + { + "entity": "sensor.forecast_sunset_3d" + }, + { + "entity": "sensor.forecast_alerts" + }, + { + "entity": "sensor.outside_temperature" + }, + { + "entity": "sensor.outside_humidity" + }, + { + "entity": "sensor.hacs" + }, + { + "entity": "sun.sun" + } + ], + "cards": [ + { + "entities": [ + "switch.sonoff_white", + "switch.sonoff_brown" + ], + "show_header_toggle": true, + "title": "sonoffs", + "type": "entities" + }, + { + "entities": [ + "sensor.zone_1_last_run", + "sensor.zone_1_next_run" + ], + "show_header_toggle": true, + "title": "zone_1_status", + "type": "entities" + }, + { + "entities": [ + "sensor.zone_1_base_time", + "input_number.zone_1_timer_hours", + "input_number.zone_1_timer_minutes", + "input_number.zone_1_duration", + "input_number.zone_1_repeat" + ], + "show_header_toggle": true, + "title": "zone_1_set", + "type": "entities" + }, + { + "entities": [ + { + "entity": "fan.fan_state", + "name": "State (manual override)" + } + ], + "title": "Fan", + "type": "entities" + }, + { + "entities": [ + "input_boolean.zone_1_reset_zone" + ], + "title": "Input boolean", + "type": "entities" + }, + { + "entities": [ + "input_datetime.security_lights_interior_time_off" + ], + "title": "Input datetime", + "type": "entities" + }, + { + "entities": [ + "input_number.test_timer_duration", + "input_number.fan_on_temp", + "input_number.node_test_first_number", + "input_number.test_schedule_base_hour", + "input_number.test_schedule_base_minute", + "input_number.node_test_second_number" + ], + "title": "Input number", + "type": "entities" + }, + { + "entities": [ + "light.panic" + ], + "title": "Light", + "type": "entities" + }, + { + "entities": [ + "script.zone_1_run" + ], + "title": "Script", + "type": "entities" + }, + { + "entities": [ + "switch.all_sonoffs", + "switch.circuit_1", + "switch.fan_automation_enabled", + "switch.zone_1", + "switch.zone_1_timer", + "switch.irrigation_zone_1", + "switch.irrigation_zone_2", + "switch.irrigation_zone_3", + "switch.irrigation_zone_4", + "switch.irrigation_zone_5", + "switch.irrigation_zone_6", + "switch.irrigation_zone_7", + "switch.irrigation_zone_8" + ], + "title": "Switch", + "type": "entities" + }, + { + "entity": "weather.238", + "type": "weather-forecast" + }, + { + "entity": "weather.praire_city_weather", + "type": "weather-forecast" + } + ], + "path": "default_view", + "title": "Home" + } + ] + } + }, + "key": "lovelace.lovelace_user", + "version": 1 +} diff --git a/.storage/lovelace.system_setup b/.storage/lovelace.system_setup index 0f6c635..ab901cb 100644 --- a/.storage/lovelace.system_setup +++ b/.storage/lovelace.system_setup @@ -15,15 +15,15 @@ "entities": [ { "type": "weblink", - "name": "ESPHome", - "url": "/15ef4d2f_esphome", - "icon": "mdi:alpha-e-box" + "name": "Configuration", + "url": "/config/dashboard", + "icon": "mdi:cog" }, { "type": "weblink", - "name": "HACS", - "url": "/hacs/entry", - "icon": "mdi:alpha-h-box" + "name": "Edit Configuration Files", + "url": "/a0d7b954_vscode", + "icon": "mdi:playlist-edit" }, { "type": "weblink", @@ -33,15 +33,95 @@ }, { "type": "weblink", - "name": "Edit Configuration Files", - "url": "/a0d7b954_vscode", - "icon": "mdi:playlist-edit" + "name": "HA version", + "url": "/config/info", + "icon": "mdi:home-assistant" + }, + { + "type": "weblink", + "name": "HA Supervisor/OS version", + "url": "/hassio/system", + "icon": "mdi:home-assistant" + }, + { + "type": "weblink", + "name": "System Snapshots", + "url": "/hassio/snapshots", + "icon": "mdi:camera-plus" } ] }, { "type": "entities", - "title": "HomeAssistant", + "show_header_toggle": false, + "entities": [ + { + "type": "weblink", + "name": "Terminal", + "url": "/core_ssh", + "icon": "mdi:console-network-outline" + }, + { + "type": "weblink", + "name": "Restart", + "url": "/config/server_control", + "icon": "mdi:restart" + }, + { + "type": "weblink", + "name": "Entities/State", + "url": "/developer-tools/state", + "icon": "mdi:sim-outline" + }, + { + "type": "weblink", + "name": "Events", + "url": "/developer-tools/event", + "icon": "mdi:calendar-clock" + }, + { + "type": "weblink", + "name": "Templates", + "url": "/developer-tools/template", + "icon": "mdi:content-duplicate" + }, + { + "type": "weblink", + "name": "Services", + "url": "/developer-tools/service", + "icon": "mdi:room-service" + } + ], + "title": "Tools" + }, + { + "type": "entities", + "show_header_toggle": false, + "entities": [ + { + "type": "weblink", + "name": "Add-Ons", + "url": "/hassio/dashboard", + "icon": "mdi:video-input-component" + }, + { + "type": "weblink", + "name": "Components-HACS", + "url": "/hacs/entry", + "icon": "mdi:alpha-h-box" + }, + { + "type": "weblink", + "name": "ESPHome", + "url": "/15ef4d2f_esphome", + "icon": "mdi:alpha-e-box" + } + ], + "title": "Add-ons/Components" + }, + { + "type": "entities", + "title": "HomeAssistant Info", "show_header_toggle": false, "entities": [ { @@ -58,7 +138,7 @@ }, { "type": "weblink", - "name": "Available Components", + "name": "Integrations", "url": "https://home-assistant.io/components/", "icon": "mdi:briefcase-check" }, @@ -70,9 +150,9 @@ }, { "type": "weblink", - "name": "Getting Help", - "url": "https://home-assistant.io/help/", - "icon": "mdi:help" + "name": "Awesome HA", + "url": "https://www.awesome-ha.com/", + "icon": "mdi:creation" }, { "type": "weblink", @@ -81,6 +161,37 @@ "icon": "mdi:comment-multiple-outline" } ] + }, + { + "title": "Dashboards", + "type": "entities", + "show_header_toggle": false, + "entities": [ + { + "type": "weblink", + "name": "Dashboards List", + "url": "/config/lovelace/dashboards", + "icon": "mdi:format-list-bulleted" + }, + { + "type": "weblink", + "name": "All Entities", + "url": "/lovelace/default_view", + "icon": "mdi:view-dashboard-variant" + }, + { + "type": "weblink", + "name": "Manual Yaml", + "url": "/lovelace-manual", + "icon": "mdi:view-dashboard-variant" + }, + { + "type": "weblink", + "name": "Manual Yaml Panel", + "url": "/lovelace-panel", + "icon": "mdi:view-dashboard-variant" + } + ] } ] } diff --git a/.storage/lovelace_dashboards b/.storage/lovelace_dashboards index 2bcd6d0..78dd728 100644 --- a/.storage/lovelace_dashboards +++ b/.storage/lovelace_dashboards @@ -6,10 +6,10 @@ { "require_admin": false, "show_in_sidebar": true, - "title": "Learning", - "url_path": "lovelace-learning", + "title": "Main", + "url_path": "lovelace-main", "mode": "storage", - "id": "lovelace_learning" + "id": "lovelace_main" }, { "require_admin": true, @@ -18,6 +18,15 @@ "url_path": "system-setup", "mode": "storage", "id": "system_setup" + }, + { + "require_admin": false, + "show_in_sidebar": true, + "icon": "mdi:weather-cloudy", + "title": "Weather", + "url_path": "lovelace-weather", + "mode": "storage", + "id": "lovelace_weather" } ] } diff --git a/.storage/mobile_app b/.storage/mobile_app index 34d48cf..59cd3a9 100644 --- a/.storage/mobile_app +++ b/.storage/mobile_app @@ -7,9 +7,9 @@ "added": true, "attributes": {}, "device_class": "plug", - "icon": "mdi:power-plug", + "icon": "mdi:power-plug-off", "name": "Is Charging", - "state": true, + "state": false, "type": "binary_sensor", "unique_id": "is_charging", "webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4" @@ -197,9 +197,9 @@ "added": true, "attributes": {}, "device_class": "battery", - "icon": "mdi:battery", + "icon": "mdi:battery-90", "name": "Battery Level", - "state": 100, + "state": 97, "type": "sensor", "unique_id": "battery_level", "unit_of_measurement": "%", @@ -209,9 +209,9 @@ "added": true, "attributes": {}, "device_class": "battery", - "icon": "mdi:battery-charging", + "icon": "mdi:battery-unknown", "name": "Battery State", - "state": "full", + "state": "unknown", "type": "sensor", "unique_id": "battery_state", "webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4" @@ -273,13 +273,13 @@ "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_last_reboot": { "added": true, "attributes": { - "Local Time": "Thu Dec 03 12:36:33 PST 2020", - "Time in Milliseconds": 1607027793942 + "Local Time": "Wed Dec 09 15:27:19 PST 2020", + "Time in Milliseconds": 1607556439220 }, "device_class": "timestamp", "icon": "mdi:restart", "name": "Last Reboot", - "state": "2020-12-03T20:36:33Z", + "state": "2020-12-09T23:27:19Z", "type": "sensor", "unique_id": "last_reboot", "webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4" @@ -290,7 +290,7 @@ "device_class": "illuminance", "icon": "mdi:brightness-5", "name": "Light Sensor", - "state": "116", + "state": "9", "type": "sensor", "unique_id": "light_sensor", "unit_of_measurement": "lx", diff --git a/configs/auth.yaml b/configs/auth.yaml index 180e002..c428ad1 100644 --- a/configs/auth.yaml +++ b/configs/auth.yaml @@ -1,4 +1,6 @@ -# authorization settings - none needed +# authorization settings - none needed only available via vpn + +# old settings # - type: homeassistant # - type: trusted_networks # trusted_networks: diff --git a/configs/groups.yaml b/configs/groups.yaml index e69de29..6a1c686 100644 --- a/configs/groups.yaml +++ b/configs/groups.yaml @@ -0,0 +1 @@ +# glabal set groups (rest are set in packages) diff --git a/configuration.yaml b/configuration.yaml index 8caa168..b2d946c 100644 --- a/configuration.yaml +++ b/configuration.yaml @@ -1,20 +1,22 @@ homeassistant: - # see packages/aa_system.yaml for basic settings customize: !include configs/customize.yaml - auth_providers: !include configs/auth.yaml + # auth_providers: !include configs/auth.yaml # mqtt: !include configs/mqtt.yaml # set by integration + # rest are organized by files in packages/ directory + # see packages/aa_system.yaml for common settings packages: !include_dir_named packages # discovery: default_config: -automation: !include configs/automations.yaml -notify: !include configs/notify.yaml +# automation: !include configs/automations.yaml +# notify: !include configs/notify.yaml # group: !include configs/groups.yaml # script: !include configs/scripts.yaml # http: !include configs/http.yaml # mqtt: !include configs/mqtt.yaml # panel_iframe: !include configs/panel.yaml + python_script: # see https://github.com/thomasloven/hass-browser_mod @@ -22,7 +24,6 @@ python_script: frontend: themes: !include_dir_merge_named themes - # not needed browser_mod handles it extra_module_url: # see https://github.com/Villhellm/custom-sidebar - /hacsfiles/custom-sidebar/custom-sidebar.js @@ -44,6 +45,7 @@ lovelace: # - 'time_date' # - 'time_utc' # - 'beat' +# if time date added then exclude from recorder to avoid huge db # recorder: # exclude: # entities: diff --git a/custom_components/hacs/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/__pycache__/__init__.cpython-38.pyc index adca759..d908299 100644 Binary files a/custom_components/hacs/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/base.cpython-38.pyc b/custom_components/hacs/__pycache__/base.cpython-38.pyc index d3ca0b8..f2ba3bd 100644 Binary files a/custom_components/hacs/__pycache__/base.cpython-38.pyc and b/custom_components/hacs/__pycache__/base.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/config_flow.cpython-38.pyc b/custom_components/hacs/__pycache__/config_flow.cpython-38.pyc index 608509e..7105676 100644 Binary files a/custom_components/hacs/__pycache__/config_flow.cpython-38.pyc and b/custom_components/hacs/__pycache__/config_flow.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/const.cpython-38.pyc b/custom_components/hacs/__pycache__/const.cpython-38.pyc index 62b3011..e6ab5c5 100644 Binary files a/custom_components/hacs/__pycache__/const.cpython-38.pyc and b/custom_components/hacs/__pycache__/const.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/enums.cpython-38.pyc b/custom_components/hacs/__pycache__/enums.cpython-38.pyc index 6a40443..6750ab1 100644 Binary files a/custom_components/hacs/__pycache__/enums.cpython-38.pyc and b/custom_components/hacs/__pycache__/enums.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/sensor.cpython-38.pyc b/custom_components/hacs/__pycache__/sensor.cpython-38.pyc index 73d92a5..377b4d5 100644 Binary files a/custom_components/hacs/__pycache__/sensor.cpython-38.pyc and b/custom_components/hacs/__pycache__/sensor.cpython-38.pyc differ diff --git a/custom_components/hacs/__pycache__/share.cpython-38.pyc b/custom_components/hacs/__pycache__/share.cpython-38.pyc index 0bb1fe6..fd1ec68 100644 Binary files a/custom_components/hacs/__pycache__/share.cpython-38.pyc and b/custom_components/hacs/__pycache__/share.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/api/__pycache__/__init__.cpython-38.pyc index 3841d57..6870d1b 100644 Binary files a/custom_components/hacs/api/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/acknowledge_critical_repository.cpython-38.pyc b/custom_components/hacs/api/__pycache__/acknowledge_critical_repository.cpython-38.pyc index 93cc168..bb7280a 100644 Binary files a/custom_components/hacs/api/__pycache__/acknowledge_critical_repository.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/acknowledge_critical_repository.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/check_local_path.cpython-38.pyc b/custom_components/hacs/api/__pycache__/check_local_path.cpython-38.pyc index 812583d..6d4f168 100644 Binary files a/custom_components/hacs/api/__pycache__/check_local_path.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/check_local_path.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/get_critical_repositories.cpython-38.pyc b/custom_components/hacs/api/__pycache__/get_critical_repositories.cpython-38.pyc index 8d31941..57248e8 100644 Binary files a/custom_components/hacs/api/__pycache__/get_critical_repositories.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/get_critical_repositories.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_config.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_config.cpython-38.pyc index ff8083d..42df7c2 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_config.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_config.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_removed.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_removed.cpython-38.pyc index b73d233..9d79101 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_removed.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_removed.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_repositories.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_repositories.cpython-38.pyc index 4a10629..36ccbe2 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_repositories.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_repositories.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_repository.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_repository.cpython-38.pyc index 84390f4..f98baf3 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_repository.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_repository.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_repository_data.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_repository_data.cpython-38.pyc index 1a45178..ea09263 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_repository_data.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_repository_data.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_settings.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_settings.cpython-38.pyc index a345469..ca94170 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_settings.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_settings.cpython-38.pyc differ diff --git a/custom_components/hacs/api/__pycache__/hacs_status.cpython-38.pyc b/custom_components/hacs/api/__pycache__/hacs_status.cpython-38.pyc index 6fe6e8e..3237b38 100644 Binary files a/custom_components/hacs/api/__pycache__/hacs_status.cpython-38.pyc and b/custom_components/hacs/api/__pycache__/hacs_status.cpython-38.pyc differ diff --git a/custom_components/hacs/hacsbase/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/hacsbase/__pycache__/__init__.cpython-38.pyc index 1809b80..89f7338 100644 Binary files a/custom_components/hacs/hacsbase/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/hacsbase/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/hacsbase/__pycache__/configuration.cpython-38.pyc b/custom_components/hacs/hacsbase/__pycache__/configuration.cpython-38.pyc index 9513610..54bd12a 100644 Binary files a/custom_components/hacs/hacsbase/__pycache__/configuration.cpython-38.pyc and b/custom_components/hacs/hacsbase/__pycache__/configuration.cpython-38.pyc differ diff --git a/custom_components/hacs/hacsbase/__pycache__/data.cpython-38.pyc b/custom_components/hacs/hacsbase/__pycache__/data.cpython-38.pyc index 11981f5..3ef26ef 100644 Binary files a/custom_components/hacs/hacsbase/__pycache__/data.cpython-38.pyc and b/custom_components/hacs/hacsbase/__pycache__/data.cpython-38.pyc differ diff --git a/custom_components/hacs/hacsbase/__pycache__/hacs.cpython-38.pyc b/custom_components/hacs/hacsbase/__pycache__/hacs.cpython-38.pyc index 81b589a..0ac5292 100644 Binary files a/custom_components/hacs/hacsbase/__pycache__/hacs.cpython-38.pyc and b/custom_components/hacs/hacsbase/__pycache__/hacs.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/helpers/__pycache__/__init__.cpython-38.pyc index ac59aa0..fbb4276 100644 Binary files a/custom_components/hacs/helpers/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/helpers/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/__init__.cpython-38.pyc index 4bc010c..e134564 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/exceptions.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/exceptions.cpython-38.pyc index c7f8b11..f7557da 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/exceptions.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/exceptions.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/frontend_view.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/frontend_view.cpython-38.pyc index 4c36ce9..16ef980 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/frontend_view.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/frontend_view.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/manifest.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/manifest.cpython-38.pyc index 8c9627b..2bedee0 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/manifest.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/manifest.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/removed.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/removed.cpython-38.pyc index 101b97a..55dc665 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/removed.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/removed.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/repository.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/repository.cpython-38.pyc index d15ad33..40ba7fd 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/repository.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/repository.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/repositorydata.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/repositorydata.cpython-38.pyc index 4df1eb1..849987e 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/repositorydata.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/repositorydata.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/classes/__pycache__/validate.cpython-38.pyc b/custom_components/hacs/helpers/classes/__pycache__/validate.cpython-38.pyc index 0de8e06..2412b30 100644 Binary files a/custom_components/hacs/helpers/classes/__pycache__/validate.cpython-38.pyc and b/custom_components/hacs/helpers/classes/__pycache__/validate.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/__init__.cpython-38.pyc index 41b5882..c0454a7 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/configuration_schema.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/configuration_schema.cpython-38.pyc index 83944b4..debcfcc 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/configuration_schema.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/configuration_schema.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/constrains.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/constrains.cpython-38.pyc index 5addd8d..9a93cfb 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/constrains.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/constrains.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/download.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/download.cpython-38.pyc index 0cce5aa..78eeb5c 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/download.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/download.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/filters.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/filters.cpython-38.pyc index 7b2190e..a22d74d 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/filters.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/filters.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/get_list_from_default.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/get_list_from_default.cpython-38.pyc index c1539ff..19504b4 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/get_list_from_default.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/get_list_from_default.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/information.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/information.cpython-38.pyc index 8759d61..e34e27d 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/information.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/information.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/is_safe_to_remove.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/is_safe_to_remove.cpython-38.pyc index cdbb709..3433525 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/is_safe_to_remove.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/is_safe_to_remove.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/logger.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/logger.cpython-38.pyc index f63be79..e0b602f 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/logger.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/logger.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/misc.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/misc.cpython-38.pyc index de4b450..dc67b48 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/misc.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/misc.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/path_exsist.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/path_exsist.cpython-38.pyc index d59bfad..1d9707a 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/path_exsist.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/path_exsist.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/register_repository.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/register_repository.cpython-38.pyc index 24948dd..c207493 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/register_repository.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/register_repository.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/remaining_github_calls.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/remaining_github_calls.cpython-38.pyc index c16380c..b9311aa 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/remaining_github_calls.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/remaining_github_calls.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/save.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/save.cpython-38.pyc index 8ceffd7..6aa79d9 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/save.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/save.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/store.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/store.cpython-38.pyc index 1894d3a..1962d1f 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/store.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/store.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/template.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/template.cpython-38.pyc index d6c6662..fc867ef 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/template.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/template.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/validate_repository.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/validate_repository.cpython-38.pyc index c4dbdb1..e938e3d 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/validate_repository.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/validate_repository.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/functions/__pycache__/version_to_install.cpython-38.pyc b/custom_components/hacs/helpers/functions/__pycache__/version_to_install.cpython-38.pyc index bf50c8b..f888187 100644 Binary files a/custom_components/hacs/helpers/functions/__pycache__/version_to_install.cpython-38.pyc and b/custom_components/hacs/helpers/functions/__pycache__/version_to_install.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/methods/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/helpers/methods/__pycache__/__init__.cpython-38.pyc index 586b3b7..2661a66 100644 Binary files a/custom_components/hacs/helpers/methods/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/helpers/methods/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/methods/__pycache__/installation.cpython-38.pyc b/custom_components/hacs/helpers/methods/__pycache__/installation.cpython-38.pyc index 0845fdd..f105681 100644 Binary files a/custom_components/hacs/helpers/methods/__pycache__/installation.cpython-38.pyc and b/custom_components/hacs/helpers/methods/__pycache__/installation.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/methods/__pycache__/registration.cpython-38.pyc b/custom_components/hacs/helpers/methods/__pycache__/registration.cpython-38.pyc index 4ab53be..c6515f4 100644 Binary files a/custom_components/hacs/helpers/methods/__pycache__/registration.cpython-38.pyc and b/custom_components/hacs/helpers/methods/__pycache__/registration.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/methods/__pycache__/reinstall_if_needed.cpython-38.pyc b/custom_components/hacs/helpers/methods/__pycache__/reinstall_if_needed.cpython-38.pyc index 54952f9..11c22a6 100644 Binary files a/custom_components/hacs/helpers/methods/__pycache__/reinstall_if_needed.cpython-38.pyc and b/custom_components/hacs/helpers/methods/__pycache__/reinstall_if_needed.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/properties/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/helpers/properties/__pycache__/__init__.cpython-38.pyc index 85d0ba2..336e1f4 100644 Binary files a/custom_components/hacs/helpers/properties/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/helpers/properties/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/properties/__pycache__/can_be_installed.cpython-38.pyc b/custom_components/hacs/helpers/properties/__pycache__/can_be_installed.cpython-38.pyc index 91812af..92f5be4 100644 Binary files a/custom_components/hacs/helpers/properties/__pycache__/can_be_installed.cpython-38.pyc and b/custom_components/hacs/helpers/properties/__pycache__/can_be_installed.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/properties/__pycache__/custom.cpython-38.pyc b/custom_components/hacs/helpers/properties/__pycache__/custom.cpython-38.pyc index 8db3846..5d8fdb5 100644 Binary files a/custom_components/hacs/helpers/properties/__pycache__/custom.cpython-38.pyc and b/custom_components/hacs/helpers/properties/__pycache__/custom.cpython-38.pyc differ diff --git a/custom_components/hacs/helpers/properties/__pycache__/pending_update.cpython-38.pyc b/custom_components/hacs/helpers/properties/__pycache__/pending_update.cpython-38.pyc index c601c75..c06245a 100644 Binary files a/custom_components/hacs/helpers/properties/__pycache__/pending_update.cpython-38.pyc and b/custom_components/hacs/helpers/properties/__pycache__/pending_update.cpython-38.pyc differ diff --git a/custom_components/hacs/models/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/models/__pycache__/__init__.cpython-38.pyc index f31a36a..abf484e 100644 Binary files a/custom_components/hacs/models/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/models/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/models/__pycache__/core.cpython-38.pyc b/custom_components/hacs/models/__pycache__/core.cpython-38.pyc index a184e32..5c1e0a7 100644 Binary files a/custom_components/hacs/models/__pycache__/core.cpython-38.pyc and b/custom_components/hacs/models/__pycache__/core.cpython-38.pyc differ diff --git a/custom_components/hacs/models/__pycache__/frontend.cpython-38.pyc b/custom_components/hacs/models/__pycache__/frontend.cpython-38.pyc index e9488f2..4afac60 100644 Binary files a/custom_components/hacs/models/__pycache__/frontend.cpython-38.pyc and b/custom_components/hacs/models/__pycache__/frontend.cpython-38.pyc differ diff --git a/custom_components/hacs/models/__pycache__/system.cpython-38.pyc b/custom_components/hacs/models/__pycache__/system.cpython-38.pyc index deaccfe..33ba6bb 100644 Binary files a/custom_components/hacs/models/__pycache__/system.cpython-38.pyc and b/custom_components/hacs/models/__pycache__/system.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/__init__.cpython-38.pyc index 0009e49..6d33287 100644 Binary files a/custom_components/hacs/operational/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/backup.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/backup.cpython-38.pyc index ec2ae01..75736e8 100644 Binary files a/custom_components/hacs/operational/__pycache__/backup.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/backup.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/factory.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/factory.cpython-38.pyc index b96d98e..fcf29a8 100644 Binary files a/custom_components/hacs/operational/__pycache__/factory.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/factory.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/reload.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/reload.cpython-38.pyc index bd7b979..26f10d6 100644 Binary files a/custom_components/hacs/operational/__pycache__/reload.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/reload.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/remove.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/remove.cpython-38.pyc index 033ef3c..b774861 100644 Binary files a/custom_components/hacs/operational/__pycache__/remove.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/remove.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/__pycache__/setup.cpython-38.pyc b/custom_components/hacs/operational/__pycache__/setup.cpython-38.pyc index 55c8a10..8a692b2 100644 Binary files a/custom_components/hacs/operational/__pycache__/setup.cpython-38.pyc and b/custom_components/hacs/operational/__pycache__/setup.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/__init__.cpython-38.pyc index ba681d2..ad080de 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/categories.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/categories.cpython-38.pyc index bf70adf..e7364ee 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/categories.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/categories.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/clear_storage.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/clear_storage.cpython-38.pyc index 53857ab..e8ea349 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/clear_storage.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/clear_storage.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/frontend.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/frontend.cpython-38.pyc index 42dceb6..f6db57e 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/frontend.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/frontend.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/load_hacs_repository.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/load_hacs_repository.cpython-38.pyc index 330778c..54b3514 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/load_hacs_repository.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/load_hacs_repository.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/sensor.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/sensor.cpython-38.pyc index fb3ada7..39be44e 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/sensor.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/sensor.cpython-38.pyc differ diff --git a/custom_components/hacs/operational/setup_actions/__pycache__/websocket_api.cpython-38.pyc b/custom_components/hacs/operational/setup_actions/__pycache__/websocket_api.cpython-38.pyc index 87b1f34..6036a4e 100644 Binary files a/custom_components/hacs/operational/setup_actions/__pycache__/websocket_api.cpython-38.pyc and b/custom_components/hacs/operational/setup_actions/__pycache__/websocket_api.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/__init__.cpython-38.pyc index 5b45997..6bb8180 100644 Binary files a/custom_components/hacs/repositories/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/appdaemon.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/appdaemon.cpython-38.pyc index bfad5ee..8983009 100644 Binary files a/custom_components/hacs/repositories/__pycache__/appdaemon.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/appdaemon.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/integration.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/integration.cpython-38.pyc index 2d60350..f298a8b 100644 Binary files a/custom_components/hacs/repositories/__pycache__/integration.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/integration.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/netdaemon.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/netdaemon.cpython-38.pyc index 9c28b17..96697b7 100644 Binary files a/custom_components/hacs/repositories/__pycache__/netdaemon.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/netdaemon.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/plugin.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/plugin.cpython-38.pyc index 635cbc0..7d64f8e 100644 Binary files a/custom_components/hacs/repositories/__pycache__/plugin.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/plugin.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/python_script.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/python_script.cpython-38.pyc index 1a366aa..0f22c6a 100644 Binary files a/custom_components/hacs/repositories/__pycache__/python_script.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/python_script.cpython-38.pyc differ diff --git a/custom_components/hacs/repositories/__pycache__/theme.cpython-38.pyc b/custom_components/hacs/repositories/__pycache__/theme.cpython-38.pyc index 69a60f1..529c44f 100644 Binary files a/custom_components/hacs/repositories/__pycache__/theme.cpython-38.pyc and b/custom_components/hacs/repositories/__pycache__/theme.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/validate/__pycache__/__init__.cpython-38.pyc index f805c80..4a16596 100644 Binary files a/custom_components/hacs/validate/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/validate/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/__pycache__/base.cpython-38.pyc b/custom_components/hacs/validate/__pycache__/base.cpython-38.pyc index 73727d9..0347042 100644 Binary files a/custom_components/hacs/validate/__pycache__/base.cpython-38.pyc and b/custom_components/hacs/validate/__pycache__/base.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/common/__pycache__/hacs_manifest.cpython-38.pyc b/custom_components/hacs/validate/common/__pycache__/hacs_manifest.cpython-38.pyc index 6102be9..ebf7e02 100644 Binary files a/custom_components/hacs/validate/common/__pycache__/hacs_manifest.cpython-38.pyc and b/custom_components/hacs/validate/common/__pycache__/hacs_manifest.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/common/__pycache__/repository_description.cpython-38.pyc b/custom_components/hacs/validate/common/__pycache__/repository_description.cpython-38.pyc index ddc3925..d296a7f 100644 Binary files a/custom_components/hacs/validate/common/__pycache__/repository_description.cpython-38.pyc and b/custom_components/hacs/validate/common/__pycache__/repository_description.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/common/__pycache__/repository_information_file.cpython-38.pyc b/custom_components/hacs/validate/common/__pycache__/repository_information_file.cpython-38.pyc index 4767363..b73dd1b 100644 Binary files a/custom_components/hacs/validate/common/__pycache__/repository_information_file.cpython-38.pyc and b/custom_components/hacs/validate/common/__pycache__/repository_information_file.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/common/__pycache__/repository_topics.cpython-38.pyc b/custom_components/hacs/validate/common/__pycache__/repository_topics.cpython-38.pyc index e738d8c..326ec0c 100644 Binary files a/custom_components/hacs/validate/common/__pycache__/repository_topics.cpython-38.pyc and b/custom_components/hacs/validate/common/__pycache__/repository_topics.cpython-38.pyc differ diff --git a/custom_components/hacs/validate/integration/__pycache__/integration_manifest.cpython-38.pyc b/custom_components/hacs/validate/integration/__pycache__/integration_manifest.cpython-38.pyc index d78ae61..ee81d72 100644 Binary files a/custom_components/hacs/validate/integration/__pycache__/integration_manifest.cpython-38.pyc and b/custom_components/hacs/validate/integration/__pycache__/integration_manifest.cpython-38.pyc differ diff --git a/custom_components/hacs/webresponses/__pycache__/__init__.cpython-38.pyc b/custom_components/hacs/webresponses/__pycache__/__init__.cpython-38.pyc index 2eaec8f..a2fad36 100644 Binary files a/custom_components/hacs/webresponses/__pycache__/__init__.cpython-38.pyc and b/custom_components/hacs/webresponses/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/hacs/webresponses/__pycache__/category.cpython-38.pyc b/custom_components/hacs/webresponses/__pycache__/category.cpython-38.pyc index 1c9c57d..236a684 100644 Binary files a/custom_components/hacs/webresponses/__pycache__/category.cpython-38.pyc and b/custom_components/hacs/webresponses/__pycache__/category.cpython-38.pyc differ diff --git a/custom_components/hacs/webresponses/__pycache__/frontend.cpython-38.pyc b/custom_components/hacs/webresponses/__pycache__/frontend.cpython-38.pyc index b01b5bb..bd5abe8 100644 Binary files a/custom_components/hacs/webresponses/__pycache__/frontend.cpython-38.pyc and b/custom_components/hacs/webresponses/__pycache__/frontend.cpython-38.pyc differ diff --git a/custom_components/hacs/webresponses/__pycache__/iconset.cpython-38.pyc b/custom_components/hacs/webresponses/__pycache__/iconset.cpython-38.pyc index 5ba2dc6..d69588f 100644 Binary files a/custom_components/hacs/webresponses/__pycache__/iconset.cpython-38.pyc and b/custom_components/hacs/webresponses/__pycache__/iconset.cpython-38.pyc differ diff --git a/custom_components/input_select/__pycache__/__init__.cpython-38.pyc b/custom_components/input_select/__pycache__/__init__.cpython-38.pyc index d169c4d..aeaa2b6 100644 Binary files a/custom_components/input_select/__pycache__/__init__.cpython-38.pyc and b/custom_components/input_select/__pycache__/__init__.cpython-38.pyc differ diff --git a/custom_components/nodered/__init__.py b/custom_components/nodered/__init__.py deleted file mode 100644 index 9db7199..0000000 --- a/custom_components/nodered/__init__.py +++ /dev/null @@ -1,258 +0,0 @@ -""" -Component to integrate with node-red. - -For more details about this component, please refer to -https://github.com/zachowj/hass-node-red -""" -import asyncio -import logging -import os -from typing import Any, Dict, Optional, Union - -from integrationhelper.const import CC_STARTUP_VERSION - -from homeassistant.const import ( - CONF_DEVICE_CLASS, - CONF_ICON, - CONF_STATE, - CONF_TYPE, - CONF_UNIT_OF_MEASUREMENT, -) -from homeassistant.core import callback -from homeassistant.helpers.dispatcher import ( - async_dispatcher_connect, - async_dispatcher_send, -) -from homeassistant.helpers.entity import Entity - -from .const import ( - CONF_COMPONENT, - CONF_CONFIG, - CONF_DEVICE_INFO, - CONF_NAME, - CONF_NODE_ID, - CONF_REMOVE, - CONF_SERVER_ID, - CONF_VERSION, - DEFAULT_NAME, - DOMAIN, - DOMAIN_DATA, - ISSUE_URL, - NODERED_DISCOVERY_UPDATED, - NODERED_ENTITY, - REQUIRED_FILES, - VERSION, -) -from .discovery import ( - ALREADY_DISCOVERED, - CHANGE_ENTITY_TYPE, - CONFIG_ENTRY_IS_SETUP, - NODERED_DISCOVERY, - start_discovery, - stop_discovery, -) -from .websocket import register_websocket_handlers - -_LOGGER = logging.getLogger(__name__) - - -async def async_setup(hass, config): - """Stub to allow setting up this component. - - Configuration through YAML is not supported. - """ - return True - - -async def async_setup_entry(hass, config_entry): - """Set up this integration using UI.""" - - # Print startup message - _LOGGER.info( - CC_STARTUP_VERSION.format(name=DOMAIN, version=VERSION, issue_link=ISSUE_URL) - ) - - # Check that all required files are present - file_check = await hass.async_add_executor_job(check_files, hass) - if not file_check: - return False - - # Create DATA dict - hass.data[DOMAIN_DATA] = {} - - register_websocket_handlers(hass) - await start_discovery(hass, hass.data[DOMAIN_DATA], config_entry) - hass.bus.async_fire(DOMAIN, {CONF_TYPE: "loaded", CONF_VERSION: VERSION}) - - return True - - -def check_files(hass): - """Return bool that indicates if all files are present.""" - # Verify that the user downloaded all files. - base = f"{hass.config.path()}/custom_components/{DOMAIN}/" - missing = [] - for file in REQUIRED_FILES: - fullpath = "{}{}".format(base, file) - if not os.path.exists(fullpath): - missing.append(file) - - if missing: - _LOGGER.critical(f"The following files are missing: {str(missing)}") - returnvalue = False - else: - returnvalue = True - - return returnvalue - - -async def async_remove_entry(hass, config_entry): - """Handle removal of an entry.""" - if hass.data[DOMAIN_DATA][CONFIG_ENTRY_IS_SETUP]: - await asyncio.wait( - [ - hass.config_entries.async_forward_entry_unload(config_entry, platform) - for platform in hass.data[DOMAIN_DATA][CONFIG_ENTRY_IS_SETUP] - ] - ) - - stop_discovery(hass) - del hass.data[DOMAIN_DATA] - hass.bus.async_fire(DOMAIN, {CONF_TYPE: "unloaded"}) - - -class NodeRedEntity(Entity): - """nodered Sensor class.""" - - def __init__(self, hass, config): - """Initialize the entity.""" - self.hass = hass - self.attr = {} - self._config = config[CONF_CONFIG] - self._component = None - self._device_info = config.get(CONF_DEVICE_INFO) - self._state = None - self._server_id = config[CONF_SERVER_ID] - self._node_id = config[CONF_NODE_ID] - self._remove_signal_discovery_update = None - self._remove_signal_entity_update = None - - @property - def should_poll(self) -> bool: - """Return True if entity has to be polled for state. - - False if entity pushes its state to HA. - """ - return False - - @property - def unique_id(self) -> Optional[str]: - """Return a unique ID to use for this sensor.""" - return f"{DOMAIN}-{self._server_id}-{self._node_id}" - - @property - def device_class(self) -> Optional[str]: - """Return the class of this binary_sensor.""" - return self._config.get(CONF_DEVICE_CLASS) - - @property - def name(self) -> Optional[str]: - """Return the name of the sensor.""" - return self._config.get(CONF_NAME, f"{DEFAULT_NAME} {self._node_id}") - - @property - def state(self) -> Union[None, str, int, float]: - """Return the state of the sensor.""" - return self._state - - @property - def icon(self) -> Optional[str]: - """Return the icon of the sensor.""" - return self._config.get(CONF_ICON) - - @property - def unit_of_measurement(self) -> Optional[str]: - """Return the unit this state is expressed in.""" - return self._config.get(CONF_UNIT_OF_MEASUREMENT) - - @property - def device_state_attributes(self) -> Optional[Dict[str, Any]]: - """Return the state attributes.""" - return self.attr - - @property - def device_info(self) -> Optional[Dict[str, Any]]: - """Return device specific attributes.""" - info = None - if self._device_info is not None and "id" in self._device_info: - # Use the id property to create the device identifier then delete it - info = {"identifiers": {(DOMAIN, self._device_info["id"])}} - del self._device_info["id"] - info.update(self._device_info) - - return info - - @callback - def handle_entity_update(self, msg): - """Update entity state.""" - _LOGGER.debug(f"Entity Update: {msg}") - self.attr = msg.get("attributes", {}) - self._state = msg[CONF_STATE] - self.async_write_ha_state() - - @callback - def handle_discovery_update(self, msg, connection): - """Update entity config.""" - if CONF_REMOVE not in msg: - self._config = msg[CONF_CONFIG] - self.async_write_ha_state() - return - - # Otherwise, remove entity - if msg[CONF_REMOVE] == CHANGE_ENTITY_TYPE: - # recreate entity if component type changed - @callback - def recreate_entity(): - """Create entity with new type.""" - del msg[CONF_REMOVE] - async_dispatcher_send( - self.hass, - NODERED_DISCOVERY.format(msg[CONF_COMPONENT]), - msg, - connection, - ) - - self.async_on_remove(recreate_entity) - - self.hass.async_create_task(self.async_remove()) - - async def async_added_to_hass(self) -> None: - """Run when entity about to be added to hass.""" - - self._remove_signal_entity_update = async_dispatcher_connect( - self.hass, - NODERED_ENTITY.format(self._server_id, self._node_id), - self.handle_entity_update, - ) - self._remove_signal_discovery_update = async_dispatcher_connect( - self.hass, - NODERED_DISCOVERY_UPDATED.format(self.unique_id), - self.handle_discovery_update, - ) - - async def async_will_remove_from_hass(self) -> None: - """Run when entity will be removed from hass.""" - if self._remove_signal_entity_update is not None: - self._remove_signal_entity_update() - if self._remove_signal_discovery_update is not None: - self._remove_signal_discovery_update() - - del self.hass.data[DOMAIN_DATA][ALREADY_DISCOVERED][self.unique_id] - - # Remove the entity_id from the entity registry - registry = await self.hass.helpers.entity_registry.async_get_registry() - entity_id = registry.async_get_entity_id( - self._component, DOMAIN, self.unique_id, - ) - if entity_id: - registry.async_remove(entity_id) diff --git a/custom_components/nodered/__pycache__/__init__.cpython-38.pyc b/custom_components/nodered/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index bc4119b..0000000 Binary files a/custom_components/nodered/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/custom_components/nodered/__pycache__/config_flow.cpython-38.pyc b/custom_components/nodered/__pycache__/config_flow.cpython-38.pyc deleted file mode 100644 index 37aa7fe..0000000 Binary files a/custom_components/nodered/__pycache__/config_flow.cpython-38.pyc and /dev/null differ diff --git a/custom_components/nodered/__pycache__/const.cpython-38.pyc b/custom_components/nodered/__pycache__/const.cpython-38.pyc deleted file mode 100644 index ce9bc83..0000000 Binary files a/custom_components/nodered/__pycache__/const.cpython-38.pyc and /dev/null differ diff --git a/custom_components/nodered/__pycache__/discovery.cpython-38.pyc b/custom_components/nodered/__pycache__/discovery.cpython-38.pyc deleted file mode 100644 index cd5bd31..0000000 Binary files a/custom_components/nodered/__pycache__/discovery.cpython-38.pyc and /dev/null differ diff --git a/custom_components/nodered/__pycache__/websocket.cpython-38.pyc b/custom_components/nodered/__pycache__/websocket.cpython-38.pyc deleted file mode 100644 index aab66c3..0000000 Binary files a/custom_components/nodered/__pycache__/websocket.cpython-38.pyc and /dev/null differ diff --git a/custom_components/nodered/binary_sensor.py b/custom_components/nodered/binary_sensor.py deleted file mode 100644 index 4d2502e..0000000 --- a/custom_components/nodered/binary_sensor.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Binary sensor platform for nodered.""" -from numbers import Number - -from homeassistant.const import ( - CONF_STATE, - STATE_HOME, - STATE_OFF, - STATE_ON, - STATE_OPEN, - STATE_UNLOCKED, -) -from homeassistant.helpers.dispatcher import async_dispatcher_connect - -from . import NodeRedEntity -from .const import CONF_ATTRIBUTES, CONF_BINARY_SENSOR, NODERED_DISCOVERY_NEW - - -async def async_setup_entry(hass, config_entry, async_add_devices): - """Set up sensor platform.""" - - async def async_discover(config, connection): - await _async_setup_entity(hass, config, async_add_devices) - - async_dispatcher_connect( - hass, NODERED_DISCOVERY_NEW.format(CONF_BINARY_SENSOR), async_discover, - ) - - -async def _async_setup_entity(hass, config, async_add_devices): - """Set up the Node-RED binary-sensor.""" - async_add_devices([NodeRedBinarySensor(hass, config)]) - - -class NodeRedBinarySensor(NodeRedEntity): - """Node-RED binary-sensor class.""" - - on_states = ( - "1", - "true", - "yes", - "enable", - STATE_ON, - STATE_OPEN, - STATE_HOME, - STATE_UNLOCKED, - ) - - def __init__(self, hass, config): - """Initialize the binary sensor.""" - super().__init__(hass, config) - self._component = CONF_BINARY_SENSOR - self._state = config.get(CONF_STATE) - self.attr = config.get(CONF_ATTRIBUTES, {}) - - @property - def is_on(self): - """Return true if the binary sensor is on.""" - value = self._state - - if isinstance(value, bool): - return value - if isinstance(value, str): - value = value.lower().strip() - if value in NodeRedBinarySensor.on_states: - return True - elif isinstance(value, Number): - return value != 0 - - return False - - @property - def state(self): - """Return the state of the binary sensor.""" - return STATE_ON if self.is_on else STATE_OFF diff --git a/custom_components/nodered/config_flow.py b/custom_components/nodered/config_flow.py deleted file mode 100644 index f0b5ef8..0000000 --- a/custom_components/nodered/config_flow.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Adds config flow for Node-RED.""" -import logging - -from homeassistant import config_entries - -from .const import DOMAIN - -_LOGGER = logging.getLogger(__name__) - - -@config_entries.HANDLERS.register(DOMAIN) -class NodeRedFlowHandler(config_entries.ConfigFlow): - """Config flow for Node-RED.""" - - VERSION = 1 - CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_PUSH - - def __init__(self): - """Initialize.""" - self._errors = {} - - async def async_step_user(self, user_input=None): - """Handle a user initiated set up flow to create a webhook.""" - if self._async_current_entries(): - return self.async_abort(reason="single_instance_allowed") - if self.hass.data.get(DOMAIN): - return self.async_abort(reason="single_instance_allowed") - - if user_input is None: - return self.async_show_form(step_id="user") - return self.async_create_entry(title="Node-RED", data={},) diff --git a/custom_components/nodered/const.py b/custom_components/nodered/const.py deleted file mode 100644 index aab71c9..0000000 --- a/custom_components/nodered/const.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Constants for Node-RED.""" -# Base component constants -DOMAIN = "nodered" -DOMAIN_DATA = f"{DOMAIN}_data" -VERSION = "0.4.4" -REQUIRED_FILES = [ - "translations/en.json", - "binary_sensor.py", - "config_flow.py", - "const.py", - "discovery.py", - "manifest.json", - "sensor.py", - "services.yaml", - "switch.py", - "websocket.py", -] -ISSUE_URL = "https://github.com/zachowj/hass-node-red/issues" -ATTRIBUTION = "Data from this is provided by Node-RED." - -# Configuration -CONF_ATTRIBUTES = "attributes" -CONF_BINARY_SENSOR = "binary_sensor" -CONF_COMPONENT = "component" -CONF_CONFIG = "config" -CONF_CONNECTION = "connection" -CONF_DATA = "data" -CONF_DEVICE_INFO = "device_info" -CONF_ENABLED = "enabled" -CONF_NAME = "name" -CONF_NODE_ID = "node_id" -CONF_OUTPUT_PATH = "output_path" -CONF_PAYLOAD = "payload" -CONF_REMOVE = "remove" -CONF_SENSOR = "sensor" -CONF_SERVER_ID = "server_id" -CONF_SKIP_CONDITION = "skip_condition" -CONF_SWITCH = "switch" -CONF_TRIGGER_ENTITY_ID = "trigger_entity_id" -CONF_VERSION = "version" - -NODERED_DISCOVERY = "nodered_discovery" -NODERED_DISCOVERY_NEW = "nodered_discovery_new_{}" -NODERED_DISCOVERY_UPDATED = "nodered_discovery_updated_{}" -NODERED_ENTITY = "nodered_entity_{}_{}" - -SERVICE_TRIGGER = "trigger" - -# Defaults -DEFAULT_NAME = DOMAIN -SWITCH_ICON = "mdi:electric-switch-closed" diff --git a/custom_components/nodered/discovery.py b/custom_components/nodered/discovery.py deleted file mode 100644 index 72b471c..0000000 --- a/custom_components/nodered/discovery.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Support for Node-RED discovery.""" -import asyncio -import logging - -from homeassistant.helpers.dispatcher import ( - async_dispatcher_connect, - async_dispatcher_send, -) -from homeassistant.helpers.typing import HomeAssistantType - -from .const import ( - CONF_BINARY_SENSOR, - CONF_COMPONENT, - CONF_NODE_ID, - CONF_REMOVE, - CONF_SENSOR, - CONF_SERVER_ID, - CONF_SWITCH, - DOMAIN, - DOMAIN_DATA, - NODERED_DISCOVERY, - NODERED_DISCOVERY_NEW, - NODERED_DISCOVERY_UPDATED, -) - -SUPPORTED_COMPONENTS = [ - CONF_SWITCH, - CONF_BINARY_SENSOR, - CONF_SENSOR, -] - -_LOGGER = logging.getLogger(__name__) - -ALREADY_DISCOVERED = "discovered_components" -CHANGE_ENTITY_TYPE = "change_entity_type" -CONFIG_ENTRY_LOCK = "config_entry_lock" -CONFIG_ENTRY_IS_SETUP = "config_entry_is_setup" -DISCOVERY_DISPATCHED = "discovery_dispatched" - - -async def start_discovery( - hass: HomeAssistantType, hass_config, config_entry=None -) -> bool: - """Initialize of Node-RED Discovery.""" - - async def async_device_message_received(msg, connection): - """Process the received message.""" - component = msg[CONF_COMPONENT] - server_id = msg[CONF_SERVER_ID] - node_id = msg[CONF_NODE_ID] - - if component not in SUPPORTED_COMPONENTS: - _LOGGER.warning(f"Integration {component} is not supported") - return - - discovery_hash = f"{DOMAIN}-{server_id}-{node_id}" - data = hass.data[DOMAIN_DATA] - - _LOGGER.debug(f"Discovery message: {msg}") - - if ALREADY_DISCOVERED not in data: - data[ALREADY_DISCOVERED] = {} - if discovery_hash in data[ALREADY_DISCOVERED]: - - if data[ALREADY_DISCOVERED][discovery_hash] != component: - # Remove old - log_text = f"Changing {data[ALREADY_DISCOVERED][discovery_hash]} to" - msg[CONF_REMOVE] = CHANGE_ENTITY_TYPE - elif CONF_REMOVE in msg: - log_text = "Removing" - else: - # Dispatch update - log_text = "Updating" - - _LOGGER.info(f"{log_text} {component} {server_id} {node_id}") - - data[ALREADY_DISCOVERED][discovery_hash] = component - async_dispatcher_send( - hass, NODERED_DISCOVERY_UPDATED.format(discovery_hash), msg, connection - ) - else: - # Add component - _LOGGER.info(f"Creating {component} {server_id} {node_id}") - data[ALREADY_DISCOVERED][discovery_hash] = component - - async with data[CONFIG_ENTRY_LOCK]: - if component not in data[CONFIG_ENTRY_IS_SETUP]: - await hass.config_entries.async_forward_entry_setup( - config_entry, component - ) - data[CONFIG_ENTRY_IS_SETUP].add(component) - - async_dispatcher_send( - hass, NODERED_DISCOVERY_NEW.format(component), msg, connection - ) - - hass.data[DOMAIN_DATA][CONFIG_ENTRY_LOCK] = asyncio.Lock() - hass.data[DOMAIN_DATA][CONFIG_ENTRY_IS_SETUP] = set() - - hass.data[DOMAIN_DATA][DISCOVERY_DISPATCHED] = async_dispatcher_connect( - hass, NODERED_DISCOVERY, async_device_message_received, - ) - - -def stop_discovery(hass: HomeAssistantType): - """Remove discovery dispatcher.""" - hass.data[DOMAIN_DATA][DISCOVERY_DISPATCHED]() diff --git a/custom_components/nodered/manifest.json b/custom_components/nodered/manifest.json deleted file mode 100644 index 2850639..0000000 --- a/custom_components/nodered/manifest.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "domain": "nodered", - "name": "Node-RED", - "documentation": "https://github.com/zachowj/node-red", - "dependencies": [], - "config_flow": true, - "codeowners": [ - "@zachowj" - ], - "requirements": [ - "integrationhelper" - ], - "homeassistant": "0.96.0" -} diff --git a/custom_components/nodered/sensor.py b/custom_components/nodered/sensor.py deleted file mode 100644 index 34f191d..0000000 --- a/custom_components/nodered/sensor.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Sensor platform for nodered.""" -import logging - -from homeassistant.const import CONF_STATE -from homeassistant.helpers.dispatcher import async_dispatcher_connect - -from . import NodeRedEntity -from .const import CONF_ATTRIBUTES, CONF_SENSOR, NODERED_DISCOVERY_NEW - -_LOGGER = logging.getLogger(__name__) - - -async def async_setup_entry(hass, config_entry, async_add_entities): - """Set up sensor platform.""" - - async def async_discover(config, connection): - await _async_setup_entity(hass, config, async_add_entities) - - async_dispatcher_connect( - hass, NODERED_DISCOVERY_NEW.format(CONF_SENSOR), async_discover, - ) - - -async def _async_setup_entity(hass, config, async_add_entities): - """Set up the Node-RED sensor.""" - async_add_entities([NodeRedSensor(hass, config)]) - - -class NodeRedSensor(NodeRedEntity): - """Node-RED Sensor class.""" - - def __init__(self, hass, config): - """Initialize the sensor.""" - super().__init__(hass, config) - self._component = CONF_SENSOR - self._state = config.get(CONF_STATE) - self.attr = config.get(CONF_ATTRIBUTES, {}) diff --git a/custom_components/nodered/services.yaml b/custom_components/nodered/services.yaml deleted file mode 100644 index 6bd5b36..0000000 --- a/custom_components/nodered/services.yaml +++ /dev/null @@ -1,17 +0,0 @@ -trigger: - description: Trigger a Node-RED Event Node - fields: - entity_id: - description: Entity Id of the Node-RED switch - example: switch.nodered_motion - trigger_entity_id: - description: Entity Id to trigger the event node with. Only needed if the node is not triggered by a single entity. - example: sun.sun - skip_condition: - description: Skip conditions of the node (defaults to false) - example: true - output_path: - description: Which output of the node to use (defaults to true, the top output). Only used when skip_condition is set to true. - example: true - payload: - description: The payload the node will output when triggered. Work only when triggering a entity node not an event node. diff --git a/custom_components/nodered/switch.py b/custom_components/nodered/switch.py deleted file mode 100644 index 4cc82cf..0000000 --- a/custom_components/nodered/switch.py +++ /dev/null @@ -1,153 +0,0 @@ -"""Sensor platform for nodered.""" -import logging - -import voluptuous as vol - -from homeassistant.components.websocket_api import event_message -from homeassistant.const import ( - CONF_ENTITY_ID, - CONF_ICON, - CONF_ID, - CONF_STATE, - CONF_TYPE, - EVENT_STATE_CHANGED, -) -from homeassistant.core import callback -from homeassistant.helpers import entity_platform -import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.dispatcher import async_dispatcher_connect -from homeassistant.helpers.entity import ToggleEntity - -from . import NodeRedEntity -from .const import ( - CONF_CONFIG, - CONF_DATA, - CONF_OUTPUT_PATH, - CONF_PAYLOAD, - CONF_SKIP_CONDITION, - CONF_SWITCH, - CONF_TRIGGER_ENTITY_ID, - NODERED_DISCOVERY_NEW, - SERVICE_TRIGGER, - SWITCH_ICON, -) - -_LOGGER = logging.getLogger(__name__) - -SERVICE_TRIGGER_SCHEMA = vol.Schema( - { - vol.Required(CONF_ENTITY_ID): cv.entity_ids, - vol.Optional(CONF_TRIGGER_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_SKIP_CONDITION): cv.boolean, - vol.Optional(CONF_OUTPUT_PATH): cv.boolean, - vol.Optional(CONF_PAYLOAD): vol.Extra, - } -) -EVENT_TRIGGER_NODE = "automation_triggered" - - -async def async_setup_entry(hass, config_entry, async_add_entities): - """Set up the Switch platform.""" - - async def async_discover(config, connection): - await _async_setup_entity(hass, config, async_add_entities, connection) - - async_dispatcher_connect( - hass, NODERED_DISCOVERY_NEW.format(CONF_SWITCH), async_discover, - ) - - platform = entity_platform.current_platform.get() - - platform.async_register_entity_service( - SERVICE_TRIGGER, SERVICE_TRIGGER_SCHEMA, "async_trigger_node" - ) - - -async def _async_setup_entity(hass, config, async_add_entities, connection): - """Set up the Node-RED Switch.""" - async_add_entities([NodeRedSwitch(hass, config, connection)]) - - -class NodeRedSwitch(ToggleEntity, NodeRedEntity): - """Node-RED Switch class.""" - - def __init__(self, hass, config, connection): - """Initialize the switch.""" - super().__init__(hass, config) - self._message_id = config[CONF_ID] - self._connection = connection - self._state = config.get(CONF_STATE, True) - self._component = CONF_SWITCH - self._available = True - - @property - def is_on(self) -> bool: - """Return the state of the switch.""" - return self._state - - @property - def icon(self): - """Return the icon of the sensor.""" - return self._config.get(CONF_ICON, SWITCH_ICON) - - @property - def available(self) -> bool: - """Return True if entity is available.""" - return self._available - - async def async_turn_off(self, **kwargs) -> None: - """Turn off the switch.""" - self._update_node_red(False) - - async def async_turn_on(self, **kwargs) -> None: - """Turn on the switch.""" - self._update_node_red(True) - - async def async_trigger_node(self, **kwargs) -> None: - """Trigger node in Node-RED.""" - data = {} - data[CONF_ENTITY_ID] = kwargs.get(CONF_TRIGGER_ENTITY_ID) - data[CONF_SKIP_CONDITION] = kwargs.get(CONF_SKIP_CONDITION, False) - data[CONF_OUTPUT_PATH] = kwargs.get(CONF_OUTPUT_PATH, True) - if kwargs.get(CONF_PAYLOAD) is not None: - data[CONF_PAYLOAD] = kwargs[CONF_PAYLOAD] - - self._connection.send_message( - event_message( - self._message_id, {CONF_TYPE: EVENT_TRIGGER_NODE, CONF_DATA: data}, - ) - ) - - def _update_node_red(self, state): - self._connection.send_message( - event_message( - self._message_id, {CONF_TYPE: EVENT_STATE_CHANGED, CONF_STATE: state} - ) - ) - - @callback - def handle_lost_connection(self): - """Set availability to False when disconnected.""" - self._available = False - self.async_write_ha_state() - - @callback - def handle_discovery_update(self, msg, connection): - """Update entity config.""" - if "remove" in msg: - # Remove entity - self.hass.async_create_task(self.async_remove()) - else: - self._available = True - self._state = msg[CONF_STATE] - self._config = msg[CONF_CONFIG] - self._message_id = msg[CONF_ID] - self._connection = connection - self._connection.subscriptions[msg[CONF_ID]] = self.handle_lost_connection - self.async_write_ha_state() - - async def async_added_to_hass(self) -> None: - """Run when entity about to be added to hass.""" - await super().async_added_to_hass() - - self._connection.subscriptions[self._message_id] = self.handle_lost_connection diff --git a/custom_components/nodered/translations/en.json b/custom_components/nodered/translations/en.json deleted file mode 100644 index 02f6ad0..0000000 --- a/custom_components/nodered/translations/en.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "config": { - "title": "Node-RED", - "step": { - "user": { - "title": "Node-RED", - "description": "Are you sure you want to set up Node-RED?" - } - }, - "abort": { - "single_instance_allowed": "Only a single configuration of Node-RED is allowed." - } - } -} diff --git a/custom_components/nodered/websocket.py b/custom_components/nodered/websocket.py deleted file mode 100644 index 17ffea7..0000000 --- a/custom_components/nodered/websocket.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Websocket API for Node-RED.""" -import json -import logging - -import voluptuous as vol - -from homeassistant.components.websocket_api import ( - async_register_command, - async_response, - event_message, - require_admin, - result_message, - websocket_command, -) -from homeassistant.const import ( - CONF_ID, - CONF_NAME, - CONF_STATE, - CONF_TYPE, - CONF_WEBHOOK_ID, -) -from homeassistant.core import callback -import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.dispatcher import async_dispatcher_send -from homeassistant.helpers.typing import HomeAssistantType - -from .const import ( - CONF_ATTRIBUTES, - CONF_COMPONENT, - CONF_CONFIG, - CONF_DEVICE_INFO, - CONF_NODE_ID, - CONF_REMOVE, - CONF_SERVER_ID, - DOMAIN, - NODERED_DISCOVERY, - NODERED_ENTITY, - VERSION, -) - -_LOGGER = logging.getLogger(__name__) - - -def register_websocket_handlers(hass: HomeAssistantType): - """Register the websocket handlers.""" - - async_register_command(hass, websocket_version) - async_register_command(hass, websocket_webhook) - async_register_command(hass, websocket_discovery) - async_register_command(hass, websocket_entity) - - -@require_admin -@websocket_command( - { - vol.Required(CONF_TYPE): "nodered/discovery", - vol.Required(CONF_COMPONENT): cv.string, - vol.Required(CONF_SERVER_ID): cv.string, - vol.Required(CONF_NODE_ID): cv.string, - vol.Optional(CONF_CONFIG, default={}): dict, - vol.Optional(CONF_STATE): vol.Any(bool, str, int, float), - vol.Optional(CONF_ATTRIBUTES): dict, - vol.Optional(CONF_REMOVE): bool, - vol.Optional(CONF_DEVICE_INFO): dict, - } -) -def websocket_discovery(hass, connection, msg): - """Sensor command.""" - async_dispatcher_send( - hass, NODERED_DISCOVERY.format(msg[CONF_COMPONENT]), msg, connection - ) - connection.send_message(result_message(msg[CONF_ID], {"success": True})) - - -@require_admin -@websocket_command( - { - vol.Required(CONF_TYPE): "nodered/entity", - vol.Required(CONF_SERVER_ID): cv.string, - vol.Required(CONF_NODE_ID): cv.string, - vol.Required(CONF_STATE): vol.Any(bool, str, int, float), - vol.Optional(CONF_ATTRIBUTES, default={}): dict, - } -) -def websocket_entity(hass, connection, msg): - """Sensor command.""" - - async_dispatcher_send( - hass, NODERED_ENTITY.format(msg[CONF_SERVER_ID], msg[CONF_NODE_ID]), msg - ) - connection.send_message(result_message(msg[CONF_ID], {"success": True})) - - -@require_admin -@websocket_command({vol.Required(CONF_TYPE): "nodered/version"}) -def websocket_version(hass, connection, msg): - """Version command.""" - - connection.send_message(result_message(msg[CONF_ID], VERSION)) - - -@require_admin -@async_response -@websocket_command( - { - vol.Required(CONF_TYPE): "nodered/webhook", - vol.Required(CONF_WEBHOOK_ID): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_SERVER_ID): cv.string, - } -) -async def websocket_webhook(hass, connection, msg): - """Create webhook command.""" - webhook_id = msg[CONF_WEBHOOK_ID] - - @callback - async def handle_webhook(hass, id, request): - """Handle webhook callback.""" - body = await request.text() - try: - payload = json.loads(body) if body else {} - except ValueError: - payload = body - - data = {"payload": payload, "headers": dict(request.headers)} - - _LOGGER.debug(f"Webhook received {id[:15]}..: {data}") - connection.send_message(event_message(msg[CONF_ID], {"data": data})) - - def remove_webhook() -> None: - """Remove webhook command.""" - try: - hass.components.webhook.async_unregister(webhook_id) - - except ValueError: - pass - - _LOGGER.info(f"Webhook removed: {webhook_id[:15]}..") - connection.send_message(result_message(msg[CONF_ID], {"success": True})) - - try: - hass.components.webhook.async_register( - DOMAIN, msg[CONF_NAME], webhook_id, handle_webhook - ) - except ValueError: - connection.send_message(result_message(msg[CONF_ID], {"success": False})) - return - - _LOGGER.info(f"Webhook created: {webhook_id[:15]}..") - connection.subscriptions[msg[CONF_ID]] = remove_webhook - connection.send_message(result_message(msg[CONF_ID], {"success": True})) diff --git a/custom_components/variable/__pycache__/__init__.cpython-38.pyc b/custom_components/variable/__pycache__/__init__.cpython-38.pyc index d0bf3a5..37117e5 100644 Binary files a/custom_components/variable/__pycache__/__init__.cpython-38.pyc and b/custom_components/variable/__pycache__/__init__.cpython-38.pyc differ diff --git a/esphome/inside_temp_humd/platformio.ini b/esphome/inside_temp_humd/platformio.ini new file mode 100644 index 0000000..d03716b --- /dev/null +++ b/esphome/inside_temp_humd/platformio.ini @@ -0,0 +1,36 @@ +; Auto generated code by esphome + +[common] +lib_deps = +build_flags = +upload_flags = + +; ===== DO NOT EDIT ANYTHING BELOW THIS LINE ===== +; ========== AUTO GENERATED CODE BEGIN =========== +[env:inside_temp_humd] +board = d1_mini +board_build.flash_mode = dout +board_build.ldscript = eagle.flash.4m.ld +build_flags = + -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_DEBUG + -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH + -DUSE_STORE_LOG_STR_IN_FLASH + -Wno-sign-compare + -Wno-unused-but-set-variable + -Wno-unused-variable + -fno-exceptions + ${common.build_flags} +framework = arduino +lib_deps = + ESPAsyncTCP-esphome@1.2.3 + ESP8266WiFi + ESP8266mDNS + ESPAsyncWebServer-esphome@1.2.7 + Update + Wire + ${common.lib_deps} +platform = espressif8266@2.6.2 +upload_speed = 115200 +; =========== AUTO GENERATED CODE END ============ +; ========= YOU CAN EDIT AFTER THIS LINE ========= + diff --git a/esphome/outside_temp/platformio.ini b/esphome/outside_temp/platformio.ini new file mode 100644 index 0000000..a3393b8 --- /dev/null +++ b/esphome/outside_temp/platformio.ini @@ -0,0 +1,34 @@ +; Auto generated code by esphome + +[common] +lib_deps = +build_flags = +upload_flags = + +; ===== DO NOT EDIT ANYTHING BELOW THIS LINE ===== +; ========== AUTO GENERATED CODE BEGIN =========== +[env:outside_temp] +board = d1_mini +board_build.flash_mode = dout +build_flags = + -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_DEBUG + -DUSE_STORE_LOG_STR_IN_FLASH + -Wl,-Teagle.flash.4m.ld + -Wno-sign-compare + -Wno-unused-but-set-variable + -Wno-unused-variable + -fno-exceptions + ${common.build_flags} +framework = arduino +lib_deps = + ESPAsyncTCP-esphome@1.2.2 + ESP8266WiFi + ESP8266mDNS + ESPAsyncWebServer-esphome@1.2.6 + Update + ${common.lib_deps} +platform = espressif8266@2.2.3 +upload_speed = 460800 +; =========== AUTO GENERATED CODE END ============ +; ========= YOU CAN EDIT AFTER THIS LINE ========= + diff --git a/esphome/outside_temp_humd/platformio.ini b/esphome/outside_temp_humd/platformio.ini new file mode 100644 index 0000000..275713b --- /dev/null +++ b/esphome/outside_temp_humd/platformio.ini @@ -0,0 +1,35 @@ +; Auto generated code by esphome + +[common] +lib_deps = +build_flags = +upload_flags = + +; ===== DO NOT EDIT ANYTHING BELOW THIS LINE ===== +; ========== AUTO GENERATED CODE BEGIN =========== +[env:outside_temp_humd] +board = d1_mini +board_build.flash_mode = dout +build_flags = + -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_DEBUG + -DUSE_STORE_LOG_STR_IN_FLASH + -Wl,-Teagle.flash.4m.ld + -Wno-sign-compare + -Wno-unused-but-set-variable + -Wno-unused-variable + -fno-exceptions + ${common.build_flags} +framework = arduino +lib_deps = + ESPAsyncTCP-esphome@1.2.2 + ESP8266WiFi + ESP8266mDNS + ESPAsyncWebServer-esphome@1.2.6 + Update + Wire + ${common.lib_deps} +platform = espressif8266@2.2.3 +upload_speed = 460800 +; =========== AUTO GENERATED CODE END ============ +; ========= YOU CAN EDIT AFTER THIS LINE ========= + diff --git a/esphome/outside_temp_humid/platformio.ini b/esphome/outside_temp_humid/platformio.ini new file mode 100644 index 0000000..c5ca85b --- /dev/null +++ b/esphome/outside_temp_humid/platformio.ini @@ -0,0 +1,34 @@ +; Auto generated code by esphome + +[common] +lib_deps = +build_flags = +upload_flags = + +; ===== DO NOT EDIT ANYTHING BELOW THIS LINE ===== +; ========== AUTO GENERATED CODE BEGIN =========== +[env:outside_temp_humid] +board = d1_mini +board_build.flash_mode = dout +build_flags = + -DESPHOME_LOG_LEVEL=ESPHOME_LOG_LEVEL_DEBUG + -DUSE_STORE_LOG_STR_IN_FLASH + -Wl,-Teagle.flash.4m.ld + -Wno-sign-compare + -Wno-unused-but-set-variable + -Wno-unused-variable + -fno-exceptions + ${common.build_flags} +framework = arduino +lib_deps = + ESPAsyncTCP-esphome@1.2.2 + ESP8266WiFi + ESP8266mDNS + ESPAsyncWebServer-esphome@1.2.6 + Update + ${common.lib_deps} +platform = espressif8266@2.2.3 +upload_speed = 460800 +; =========== AUTO GENERATED CODE END ============ +; ========= YOU CAN EDIT AFTER THIS LINE ========= + diff --git a/home-assistant.log b/home-assistant.log new file mode 100644 index 0000000..096ddd7 --- /dev/null +++ b/home-assistant.log @@ -0,0 +1,6 @@ +2020-12-09 12:26:40 WARNING (MainThread) [homeassistant.loader] You are using a custom integration for variable which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant. +2020-12-09 12:26:40 WARNING (MainThread) [homeassistant.loader] You are using a custom integration for input_select which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant. +2020-12-09 12:26:40 WARNING (MainThread) [homeassistant.loader] You are using a custom integration for hacs which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant. +2020-12-09 12:42:54 ERROR (MainThread) [frontend.js.latest.202011112] https://ha.kebler.net/frontend_latest/chunk.cf0cfe4f7e4d6da03074.js:694:1055 Uncaught TypeError: Cannot read property 'url_path' of undefined +2020-12-09 13:09:39 ERROR (MainThread) [frontend.js.latest.202011112] https://ha.kebler.net/frontend_latest/chunk.cf0cfe4f7e4d6da03074.js:694:1025 TypeError: this.panel is undefined +2020-12-09 16:46:56 ERROR (MainThread) [homeassistant.components.nws] Error requesting NWS forecast hourly station KGCD data: 500, message='Internal Server Error', url=URL('https://api.weather.gov/gridpoints/PDT/123,42/forecast/hourly') diff --git a/home-assistant_v2.db b/home-assistant_v2.db new file mode 100644 index 0000000..b6dc86f Binary files /dev/null and b/home-assistant_v2.db differ diff --git a/lovelace/dashboards.yaml b/lovelace/dashboards.yaml index a614bba..a1ca408 100644 --- a/lovelace/dashboards.yaml +++ b/lovelace/dashboards.yaml @@ -1,12 +1,12 @@ lovelace-panel: mode: yaml - title: panel + title: Manual - Panel icon: mdi:script - show_in_sidebar: true + show_in_sidebar: false filename: lovelace/panel.yaml lovelace-manual: mode: yaml - title: manual + title: Manual icon: mdi:script - show_in_sidebar: true + show_in_sidebar: false filename: lovelace/manual.yaml diff --git a/lovelace/panel.yaml b/lovelace/panel.yaml index 5519283..4ebfe21 100644 --- a/lovelace/panel.yaml +++ b/lovelace/panel.yaml @@ -1,4 +1,4 @@ -title: Panel Dashboard +title: Panel Dashboard - Manual panel: true # theme: slate # custom cards registration diff --git a/secrets.yaml b/secrets.yaml new file mode 100644 index 0000000..ea709ec --- /dev/null +++ b/secrets.yaml @@ -0,0 +1,2 @@ +darksky_api_key: 21b1870b9e52cf1ce234798ddfd0fbce +pushsafer_api_key: DLq9cXqNwBptT4CxD5cQ diff --git a/secrets.yaml.secret b/secrets.yaml.secret new file mode 100644 index 0000000..2d2c05a Binary files /dev/null and b/secrets.yaml.secret differ diff --git a/www/community/banner-card/banner-card.js.gz b/www/community/banner-card/banner-card.js.gz new file mode 100644 index 0000000..b4c97a4 Binary files /dev/null and b/www/community/banner-card/banner-card.js.gz differ diff --git a/www/community/button-card/button-card.js.gz b/www/community/button-card/button-card.js.gz new file mode 100644 index 0000000..9b933fb Binary files /dev/null and b/www/community/button-card/button-card.js.gz differ diff --git a/www/community/custom-sidebar/custom-sidebar.js b/www/community/custom-sidebar/custom-sidebar.js new file mode 100644 index 0000000..a5af861 --- /dev/null +++ b/www/community/custom-sidebar/custom-sidebar.js @@ -0,0 +1,2241 @@ +console.log("Custom Sidebar is loading"); + +var Hacky_Hackerson = setInterval(run, 1000 / 60); +var Loaded = false; +var Haobj = null; +var Root = null; +var TitleElement = null; + +function Current_Order(config) { + var return_order = null; + if (config) { + if(config.title){ + setTitle(config.title); + } + if (config.order) { + return_order = config.order; + } + if (config.exceptions) { + for (var i = 0; i < config.exceptions.length; i++) { + var current_exception = config.exceptions[i]; + var current_environment_enabled = true; + var current_exception_keys = Object.keys(current_exception); + for (var x = 0; x < current_exception_keys.length; x++) { + console.log(navigator.userAgent); + switch (current_exception_keys[x]) { + case "user": + if(current_exception.user.includes(',')){ + current_exception.user = current_exception.user.replace(/, /g, ',').split(','); + } + if (current_exception.user instanceof Array) { + current_environment_enabled = current_exception.user.map(x => x.toLowerCase()).some(x => x == Haobj.user.name.toLowerCase()); + } + else { + if (current_exception.user.toLowerCase() != Haobj.user.name.toLowerCase()) { + current_environment_enabled = false; + } + } + break; + case "device": + if(current_exception.device.includes(',')){ + current_exception.device = current_exception.device.replace(/, /g, ',').split(','); + } + if (current_exception.device instanceof Array) { + current_environment_enabled = false; + current_exception.device.forEach(device=>{ + if (navigator.userAgent.toLowerCase().includes(device.toLowerCase())) { + current_environment_enabled = true; + } + }); + } + else { + if (!navigator.userAgent.toLowerCase().includes(current_exception.device.toLowerCase())) { + current_environment_enabled = false; + } + } + break; + case "not_user": + if(current_exception.not_user.includes(',')){ + current_exception.not_user = current_exception.not_user.replace(/, /g, ',').split(','); + } + if (current_exception.not_user instanceof Array) { + current_environment_enabled = !current_exception.not_user.map(x => x.toLowerCase()).some(x => x == Haobj.user.name.toLowerCase()); + } + else { + if (current_exception.not_user.toLowerCase() == Haobj.user.name.toLowerCase()) { + current_environment_enabled = false; + } + } + break; + case "not_device": + if(current_exception.not_device.includes(',')){ + current_exception.not_device = current_exception.not_device.replace(/, /g, ',').split(','); + } + if (current_exception.not_device instanceof Array) { + current_exception.not_device.forEach(not_device=>{ + if (navigator.userAgent.toLowerCase().includes(not_device.toLowerCase())) { + current_environment_enabled = false; + } + }); + } + else { + if (navigator.userAgent.toLowerCase().includes(current_exception.not_device.toLowerCase())) { + current_environment_enabled = false; + } + } + break; + } + if (current_environment_enabled == false) { + break; + } + } + if (current_environment_enabled) { + if (current_exception.order) { + if (current_exception.base_order && return_order) { + rearrange(return_order); + } + return_order = current_exception.order; + } + } + } + } + } + + return return_order; +} + +function rearrange(order) { + if (order) { + for (var i = order.length - 1; i >= 0; i--) { + if (order[i].new_item == true) { + createItem(Root, order[i]); + } + } + for (var i = order.length - 1; i >= 0; i--) { + moveItem(Root, order[i]); + } + } +} + +function setTitle(title){ + if(TitleElement){ + TitleElement.innerHTML = title; + } +} + +function run() { + Root = getSidebar(); + if (Root && !Loaded) { + Loaded = true; + var req = new XMLHttpRequest(); + req.onload = function () { + var order = Current_Order(YAML.parse(this.responseText)); + rearrange(order); + clearInterval(Hacky_Hackerson) + console.log("Custom Sidebar is loaded"); + }; + req.onerror = function () { + clearInterval(Hacky_Hackerson); + } + req.open("GET", "/local/sidebar-order.yaml?rnd=" + rando()); + req.send(); + } +} + +function getSidebar() { + let root = document.querySelector("home-assistant"); + Haobj = root.hass; + root = root && root.shadowRoot; + root = root && root.querySelector("home-assistant-main"); + root = root && root.shadowRoot; + root = root && root.querySelector("app-drawer-layout app-drawer"); + root = root && root.querySelector("ha-sidebar"); + root = root && root.shadowRoot; + TitleElement = root && root.querySelector('.title') ? root.querySelector('.title') : null ; + root = root && root.querySelector("paper-listbox"); + return root; +} + +function createItem(elements, item) { + var cln = getConfigurationElement(elements).cloneNode(true); + if (cln) { + cln.querySelector("paper-icon-item").querySelector("ha-icon").setAttribute("icon", item.icon); + cln.querySelector("paper-icon-item").querySelector("span").innerHTML = item.item; + cln.href = item.href; + cln.setAttribute("data-panel", item.item); + elements.insertBefore(cln, elements.children[0]); + } +} + +function getConfigurationElement(elements) { + for (var i = 0; i < elements.children.length; i++) { + if (elements.children[i].tagName == "A") { + var current = elements.children[i].getAttribute("data-panel"); + if (current == "config") { + return elements.children[i]; + } + } + } +} + +function moveItem(elements, config_entry) { + for (var i = 0; i < elements.children.length; i++) { + if (elements.children[i].tagName == "A") { + var current = elements.children[i].children[0].getElementsByTagName("span")[0].innerHTML.replace('', '').replace('', ''); + var match = false; + if (config_entry.exact) { + match = current == config_entry.item; + } else { + match = current.toLowerCase().includes(config_entry.item.toLowerCase()); + } + + if (match) { + if (config_entry.href) { + elements.children[i].href = config_entry.href; + } + + if (config_entry.name) { + elements.children[i].children[0].getElementsByTagName("span")[0].innerHTML = elements.children[i].children[0].getElementsByTagName("span")[0].innerHTML.replace(current, config_entry.name); + } + + if (config_entry.icon) { + var icon_holder = elements.children[i].querySelector("ha-icon"); + if (icon_holder) { + icon_holder.setAttribute("icon", config_entry.icon); + } else { + var old_icon = elements.children[i].querySelector("ha-svg-icon"); + if (old_icon) { + var icon_item = elements.children[i].querySelector("paper-icon-item"); + icon_item.removeChild(old_icon); + icon_holder = document.createElement("ha-icon"); + icon_holder.setAttribute("slot", "item-icon"); + icon_holder.setAttribute("icon", config_entry.icon); + icon_item.prepend(icon_holder); + } + } + } + if (config_entry.hide == true) { + elements.children[i].style.display = "none"; + } else { + elements.children[i].style.display = "block"; + if (config_entry.bottom == true) { + elements.insertBefore(elements.children[i], elements.querySelector("div").nextSibling); + } else { + elements.insertBefore(elements.children[i], elements.children[0]); + } + } + } + } + } +} + +function rando() { + return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); +} + +//YAML parser taken from https://github.com/jeremyfa/yaml.js +(function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a + } + var p = n[i] = { + exports: {} + }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r) + }, p, p.exports, r, e, n, t) + } + return n[i].exports + } + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o + } + return r +})()({ + 1: [function (require, module, exports) { + var Dumper, Inline, Utils; + + Utils = require('./Utils'); + + Inline = require('./Inline'); + + Dumper = (function () { + function Dumper() { } + + Dumper.indentation = 4; + + Dumper.prototype.dump = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + var i, key, len, output, prefix, value, willBeInlined; + if (inline == null) { + inline = 0; + } + if (indent == null) { + indent = 0; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + output = ''; + if (typeof input === 'function') { + return output; + } + prefix = (indent ? Utils.strRepeat(' ', indent) : ''); + if (inline <= 0 || typeof input !== 'object' || input instanceof Date || Utils.isEmpty(input)) { + output += prefix + Inline.dump(input, exceptionOnInvalidType, objectEncoder); + } else { + if (input instanceof Array) { + for (i = 0, len = input.length; i < len; i++) { + value = input[i]; + willBeInlined = inline - 1 <= 0 || typeof value !== 'object' || Utils.isEmpty(value); + output += prefix + '-' + (willBeInlined ? ' ' : "\n") + this.dump(value, inline - 1, (willBeInlined ? 0 : indent + this.indentation), exceptionOnInvalidType, objectEncoder) + (willBeInlined ? "\n" : ''); + } + } else { + for (key in input) { + value = input[key]; + willBeInlined = inline - 1 <= 0 || typeof value !== 'object' || Utils.isEmpty(value); + output += prefix + Inline.dump(key, exceptionOnInvalidType, objectEncoder) + ':' + (willBeInlined ? ' ' : "\n") + this.dump(value, inline - 1, (willBeInlined ? 0 : indent + this.indentation), exceptionOnInvalidType, objectEncoder) + (willBeInlined ? "\n" : ''); + } + } + } + return output; + }; + + return Dumper; + + })(); + + module.exports = Dumper; + + + }, { + "./Inline": 6, + "./Utils": 10 + }], + 2: [function (require, module, exports) { + var Escaper, Pattern; + + Pattern = require('./Pattern'); + + Escaper = (function () { + var ch; + + function Escaper() { } + + Escaper.LIST_ESCAPEES = ['\\', '\\\\', '\\"', '"', "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", (ch = String.fromCharCode)(0x0085), ch(0x00A0), ch(0x2028), ch(0x2029)]; + + Escaper.LIST_ESCAPED = ['\\\\', '\\"', '\\"', '\\"', "\\0", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", "\\x18", "\\x19", "\\x1a", "\\e", "\\x1c", "\\x1d", "\\x1e", "\\x1f", "\\N", "\\_", "\\L", "\\P"]; + + Escaper.MAPPING_ESCAPEES_TO_ESCAPED = (function () { + var i, j, mapping, ref; + mapping = {}; + for (i = j = 0, ref = Escaper.LIST_ESCAPEES.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { + mapping[Escaper.LIST_ESCAPEES[i]] = Escaper.LIST_ESCAPED[i]; + } + return mapping; + })(); + + Escaper.PATTERN_CHARACTERS_TO_ESCAPE = new Pattern('[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9'); + + Escaper.PATTERN_MAPPING_ESCAPEES = new Pattern(Escaper.LIST_ESCAPEES.join('|').split('\\').join('\\\\')); + + Escaper.PATTERN_SINGLE_QUOTING = new Pattern('[\\s\'":{}[\\],&*#?]|^[-?|<>=!%@`]'); + + Escaper.requiresDoubleQuoting = function (value) { + return this.PATTERN_CHARACTERS_TO_ESCAPE.test(value); + }; + + Escaper.escapeWithDoubleQuotes = function (value) { + var result; + result = this.PATTERN_MAPPING_ESCAPEES.replace(value, (function (_this) { + return function (str) { + return _this.MAPPING_ESCAPEES_TO_ESCAPED[str]; + }; + })(this)); + return '"' + result + '"'; + }; + + Escaper.requiresSingleQuoting = function (value) { + return this.PATTERN_SINGLE_QUOTING.test(value); + }; + + Escaper.escapeWithSingleQuotes = function (value) { + return "'" + value.replace(/'/g, "''") + "'"; + }; + + return Escaper; + + })(); + + module.exports = Escaper; + + + }, { + "./Pattern": 8 + }], + 3: [function (require, module, exports) { + var DumpException, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + DumpException = (function (superClass) { + extend(DumpException, superClass); + + function DumpException(message, parsedLine, snippet) { + DumpException.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + DumpException.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return DumpException; + + })(Error); + + module.exports = DumpException; + + + }, {}], + 4: [function (require, module, exports) { + var ParseException, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + ParseException = (function (superClass) { + extend(ParseException, superClass); + + function ParseException(message, parsedLine, snippet) { + ParseException.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + ParseException.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return ParseException; + + })(Error); + + module.exports = ParseException; + + + }, {}], + 5: [function (require, module, exports) { + var ParseMore, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + ParseMore = (function (superClass) { + extend(ParseMore, superClass); + + function ParseMore(message, parsedLine, snippet) { + ParseMore.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + ParseMore.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return ParseMore; + + })(Error); + + module.exports = ParseMore; + + + }, {}], + 6: [function (require, module, exports) { + var DumpException, Escaper, Inline, ParseException, ParseMore, Pattern, Unescaper, Utils, + indexOf = [].indexOf || function (item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) return i; + } + return -1; + }; + + Pattern = require('./Pattern'); + + Unescaper = require('./Unescaper'); + + Escaper = require('./Escaper'); + + Utils = require('./Utils'); + + ParseException = require('./Exception/ParseException'); + + ParseMore = require('./Exception/ParseMore'); + + DumpException = require('./Exception/DumpException'); + + Inline = (function () { + function Inline() { } + + Inline.REGEX_QUOTED_STRING = '(?:"(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\']*(?:\'\'[^\']*)*)\')'; + + Inline.PATTERN_TRAILING_COMMENTS = new Pattern('^\\s*#.*$'); + + Inline.PATTERN_QUOTED_SCALAR = new Pattern('^' + Inline.REGEX_QUOTED_STRING); + + Inline.PATTERN_THOUSAND_NUMERIC_SCALAR = new Pattern('^(-|\\+)?[0-9,]+(\\.[0-9]+)?$'); + + Inline.PATTERN_SCALAR_BY_DELIMITERS = {}; + + Inline.settings = {}; + + Inline.configure = function (exceptionOnInvalidType, objectDecoder) { + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = null; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.settings.exceptionOnInvalidType = exceptionOnInvalidType; + this.settings.objectDecoder = objectDecoder; + }; + + Inline.parse = function (value, exceptionOnInvalidType, objectDecoder) { + var context, result; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.settings.exceptionOnInvalidType = exceptionOnInvalidType; + this.settings.objectDecoder = objectDecoder; + if (value == null) { + return ''; + } + value = Utils.trim(value); + if (0 === value.length) { + return ''; + } + context = { + exceptionOnInvalidType: exceptionOnInvalidType, + objectDecoder: objectDecoder, + i: 0 + }; + switch (value.charAt(0)) { + case '[': + result = this.parseSequence(value, context); + ++context.i; + break; + case '{': + result = this.parseMapping(value, context); + ++context.i; + break; + default: + result = this.parseScalar(value, null, ['"', "'"], context); + } + if (this.PATTERN_TRAILING_COMMENTS.replace(value.slice(context.i), '') !== '') { + throw new ParseException('Unexpected characters near "' + value.slice(context.i) + '".'); + } + return result; + }; + + Inline.dump = function (value, exceptionOnInvalidType, objectEncoder) { + var ref, result, type; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + if (value == null) { + return 'null'; + } + type = typeof value; + if (type === 'object') { + if (value instanceof Date) { + return value.toISOString(); + } else if (objectEncoder != null) { + result = objectEncoder(value); + if (typeof result === 'string' || (result != null)) { + return result; + } + } + return this.dumpObject(value); + } + if (type === 'boolean') { + return (value ? 'true' : 'false'); + } + if (Utils.isDigits(value)) { + return (type === 'string' ? "'" + value + "'" : String(parseInt(value))); + } + if (Utils.isNumeric(value)) { + return (type === 'string' ? "'" + value + "'" : String(parseFloat(value))); + } + if (type === 'number') { + return (value === Infinity ? '.Inf' : (value === -Infinity ? '-.Inf' : (isNaN(value) ? '.NaN' : value))); + } + if (Escaper.requiresDoubleQuoting(value)) { + return Escaper.escapeWithDoubleQuotes(value); + } + if (Escaper.requiresSingleQuoting(value)) { + return Escaper.escapeWithSingleQuotes(value); + } + if ('' === value) { + return '""'; + } + if (Utils.PATTERN_DATE.test(value)) { + return "'" + value + "'"; + } + if ((ref = value.toLowerCase()) === 'null' || ref === '~' || ref === 'true' || ref === 'false') { + return "'" + value + "'"; + } + return value; + }; + + Inline.dumpObject = function (value, exceptionOnInvalidType, objectSupport) { + var j, key, len1, output, val; + if (objectSupport == null) { + objectSupport = null; + } + if (value instanceof Array) { + output = []; + for (j = 0, len1 = value.length; j < len1; j++) { + val = value[j]; + output.push(this.dump(val)); + } + return '[' + output.join(', ') + ']'; + } else { + output = []; + for (key in value) { + val = value[key]; + output.push(this.dump(key) + ': ' + this.dump(val)); + } + return '{' + output.join(', ') + '}'; + } + }; + + Inline.parseScalar = function (scalar, delimiters, stringDelimiters, context, evaluate) { + var i, joinedDelimiters, match, output, pattern, ref, ref1, strpos, tmp; + if (delimiters == null) { + delimiters = null; + } + if (stringDelimiters == null) { + stringDelimiters = ['"', "'"]; + } + if (context == null) { + context = null; + } + if (evaluate == null) { + evaluate = true; + } + if (context == null) { + context = { + exceptionOnInvalidType: this.settings.exceptionOnInvalidType, + objectDecoder: this.settings.objectDecoder, + i: 0 + }; + } + i = context.i; + if (ref = scalar.charAt(i), indexOf.call(stringDelimiters, ref) >= 0) { + output = this.parseQuotedScalar(scalar, context); + i = context.i; + if (delimiters != null) { + tmp = Utils.ltrim(scalar.slice(i), ' '); + if (!(ref1 = tmp.charAt(0), indexOf.call(delimiters, ref1) >= 0)) { + throw new ParseException('Unexpected characters (' + scalar.slice(i) + ').'); + } + } + } else { + if (!delimiters) { + output = scalar.slice(i); + i += output.length; + strpos = output.indexOf(' #'); + if (strpos !== -1) { + output = Utils.rtrim(output.slice(0, strpos)); + } + } else { + joinedDelimiters = delimiters.join('|'); + pattern = this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters]; + if (pattern == null) { + pattern = new Pattern('^(.+?)(' + joinedDelimiters + ')'); + this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters] = pattern; + } + if (match = pattern.exec(scalar.slice(i))) { + output = match[1]; + i += output.length; + } else { + throw new ParseException('Malformed inline YAML string (' + scalar + ').'); + } + } + if (evaluate) { + output = this.evaluateScalar(output, context); + } + } + context.i = i; + return output; + }; + + Inline.parseQuotedScalar = function (scalar, context) { + var i, match, output; + i = context.i; + if (!(match = this.PATTERN_QUOTED_SCALAR.exec(scalar.slice(i)))) { + throw new ParseMore('Malformed inline YAML string (' + scalar.slice(i) + ').'); + } + output = match[0].substr(1, match[0].length - 2); + if ('"' === scalar.charAt(i)) { + output = Unescaper.unescapeDoubleQuotedString(output); + } else { + output = Unescaper.unescapeSingleQuotedString(output); + } + i += match[0].length; + context.i = i; + return output; + }; + + Inline.parseSequence = function (sequence, context) { + var e, error, i, isQuoted, len, output, ref, value; + output = []; + len = sequence.length; + i = context.i; + i += 1; + while (i < len) { + context.i = i; + switch (sequence.charAt(i)) { + case '[': + output.push(this.parseSequence(sequence, context)); + i = context.i; + break; + case '{': + output.push(this.parseMapping(sequence, context)); + i = context.i; + break; + case ']': + return output; + case ',': + case ' ': + case "\n": + break; + default: + isQuoted = ((ref = sequence.charAt(i)) === '"' || ref === "'"); + value = this.parseScalar(sequence, [',', ']'], ['"', "'"], context); + i = context.i; + if (!isQuoted && typeof value === 'string' && (value.indexOf(': ') !== -1 || value.indexOf(":\n") !== -1)) { + try { + value = this.parseMapping('{' + value + '}'); + } catch (error) { + e = error; + } + } + output.push(value); + --i; + } + ++i; + } + throw new ParseMore('Malformed inline YAML string ' + sequence); + }; + + Inline.parseMapping = function (mapping, context) { + var done, i, key, len, output, shouldContinueWhileLoop, value; + output = {}; + len = mapping.length; + i = context.i; + i += 1; + shouldContinueWhileLoop = false; + while (i < len) { + context.i = i; + switch (mapping.charAt(i)) { + case ' ': + case ',': + case "\n": + ++i; + context.i = i; + shouldContinueWhileLoop = true; + break; + case '}': + return output; + } + if (shouldContinueWhileLoop) { + shouldContinueWhileLoop = false; + continue; + } + key = this.parseScalar(mapping, [':', ' ', "\n"], ['"', "'"], context, false); + i = context.i; + done = false; + while (i < len) { + context.i = i; + switch (mapping.charAt(i)) { + case '[': + value = this.parseSequence(mapping, context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + break; + case '{': + value = this.parseMapping(mapping, context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + break; + case ':': + case ' ': + case "\n": + break; + default: + value = this.parseScalar(mapping, [',', '}'], ['"', "'"], context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + --i; + } + ++i; + if (done) { + break; + } + } + } + throw new ParseMore('Malformed inline YAML string ' + mapping); + }; + + Inline.evaluateScalar = function (scalar, context) { + var cast, date, exceptionOnInvalidType, firstChar, firstSpace, firstWord, objectDecoder, raw, scalarLower, subValue, trimmedScalar; + scalar = Utils.trim(scalar); + scalarLower = scalar.toLowerCase(); + switch (scalarLower) { + case 'null': + case '': + case '~': + return null; + case 'true': + return true; + case 'false': + return false; + case '.inf': + return Infinity; + case '.nan': + return NaN; + case '-.inf': + return Infinity; + default: + firstChar = scalarLower.charAt(0); + switch (firstChar) { + case '!': + firstSpace = scalar.indexOf(' '); + if (firstSpace === -1) { + firstWord = scalarLower; + } else { + firstWord = scalarLower.slice(0, firstSpace); + } + switch (firstWord) { + case '!': + if (firstSpace !== -1) { + return parseInt(this.parseScalar(scalar.slice(2))); + } + return null; + case '!str': + return Utils.ltrim(scalar.slice(4)); + case '!!str': + return Utils.ltrim(scalar.slice(5)); + case '!!int': + return parseInt(this.parseScalar(scalar.slice(5))); + case '!!bool': + return Utils.parseBoolean(this.parseScalar(scalar.slice(6)), false); + case '!!float': + return parseFloat(this.parseScalar(scalar.slice(7))); + case '!!timestamp': + return Utils.stringToDate(Utils.ltrim(scalar.slice(11))); + default: + if (context == null) { + context = { + exceptionOnInvalidType: this.settings.exceptionOnInvalidType, + objectDecoder: this.settings.objectDecoder, + i: 0 + }; + } + objectDecoder = context.objectDecoder, exceptionOnInvalidType = context.exceptionOnInvalidType; + if (objectDecoder) { + trimmedScalar = Utils.rtrim(scalar); + firstSpace = trimmedScalar.indexOf(' '); + if (firstSpace === -1) { + return objectDecoder(trimmedScalar, null); + } else { + subValue = Utils.ltrim(trimmedScalar.slice(firstSpace + 1)); + if (!(subValue.length > 0)) { + subValue = null; + } + return objectDecoder(trimmedScalar.slice(0, firstSpace), subValue); + } + } + if (exceptionOnInvalidType) { + throw new ParseException('Custom object support when parsing a YAML file has been disabled.'); + } + return null; + } + break; + case '0': + if ('0x' === scalar.slice(0, 2)) { + return Utils.hexDec(scalar); + } else if (Utils.isDigits(scalar)) { + return Utils.octDec(scalar); + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else { + return scalar; + } + break; + case '+': + if (Utils.isDigits(scalar)) { + raw = scalar; + cast = parseInt(raw); + if (raw === String(cast)) { + return cast; + } else { + return raw; + } + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + case '-': + if (Utils.isDigits(scalar.slice(1))) { + if ('0' === scalar.charAt(1)) { + return -Utils.octDec(scalar.slice(1)); + } else { + raw = scalar.slice(1); + cast = parseInt(raw); + if (raw === String(cast)) { + return -cast; + } else { + return -raw; + } + } + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + default: + if (date = Utils.stringToDate(scalar)) { + return date; + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + } + } + }; + + return Inline; + + })(); + + module.exports = Inline; + + + }, { + "./Escaper": 2, + "./Exception/DumpException": 3, + "./Exception/ParseException": 4, + "./Exception/ParseMore": 5, + "./Pattern": 8, + "./Unescaper": 9, + "./Utils": 10 + }], + 7: [function (require, module, exports) { + var Inline, ParseException, ParseMore, Parser, Pattern, Utils; + + Inline = require('./Inline'); + + Pattern = require('./Pattern'); + + Utils = require('./Utils'); + + ParseException = require('./Exception/ParseException'); + + ParseMore = require('./Exception/ParseMore'); + + Parser = (function () { + Parser.prototype.PATTERN_FOLDED_SCALAR_ALL = new Pattern('^(?:(?![^\\|>]*)\\s+)?(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$'); + + Parser.prototype.PATTERN_FOLDED_SCALAR_END = new Pattern('(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$'); + + Parser.prototype.PATTERN_SEQUENCE_ITEM = new Pattern('^\\-((?\\s+)(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_ANCHOR_VALUE = new Pattern('^&(?[^ ]+) *(?.*)'); + + Parser.prototype.PATTERN_COMPACT_NOTATION = new Pattern('^(?' + Inline.REGEX_QUOTED_STRING + '|[^ \'"\\{\\[].*?) *\\:(\\s+(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_MAPPING_ITEM = new Pattern('^(?' + Inline.REGEX_QUOTED_STRING + '|[^ \'"\\[\\{].*?) *\\:(\\s+(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_DECIMAL = new Pattern('\\d+'); + + Parser.prototype.PATTERN_INDENT_SPACES = new Pattern('^ +'); + + Parser.prototype.PATTERN_TRAILING_LINES = new Pattern('(\n*)$'); + + Parser.prototype.PATTERN_YAML_HEADER = new Pattern('^\\%YAML[: ][\\d\\.]+.*\n', 'm'); + + Parser.prototype.PATTERN_LEADING_COMMENTS = new Pattern('^(\\#.*?\n)+', 'm'); + + Parser.prototype.PATTERN_DOCUMENT_MARKER_START = new Pattern('^\\-\\-\\-.*?\n', 'm'); + + Parser.prototype.PATTERN_DOCUMENT_MARKER_END = new Pattern('^\\.\\.\\.\\s*$', 'm'); + + Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION = {}; + + Parser.prototype.CONTEXT_NONE = 0; + + Parser.prototype.CONTEXT_SEQUENCE = 1; + + Parser.prototype.CONTEXT_MAPPING = 2; + + function Parser(offset) { + this.offset = offset != null ? offset : 0; + this.lines = []; + this.currentLineNb = -1; + this.currentLine = ''; + this.refs = {}; + } + + Parser.prototype.parse = function (value, exceptionOnInvalidType, objectDecoder) { + var alias, allowOverwrite, block, c, context, data, e, error, error1, error2, first, i, indent, isRef, j, k, key, l, lastKey, len, len1, len2, len3, lineCount, m, matches, mergeNode, n, name, parsed, parsedItem, parser, ref, ref1, ref2, refName, refValue, val, values; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.currentLineNb = -1; + this.currentLine = ''; + this.lines = this.cleanup(value).split("\n"); + data = null; + context = this.CONTEXT_NONE; + allowOverwrite = false; + while (this.moveToNextLine()) { + if (this.isCurrentLineEmpty()) { + continue; + } + if ("\t" === this.currentLine[0]) { + throw new ParseException('A YAML file cannot contain tabs as indentation.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + isRef = mergeNode = false; + if (values = this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)) { + if (this.CONTEXT_MAPPING === context) { + throw new ParseException('You cannot define a sequence item when in a mapping'); + } + context = this.CONTEXT_SEQUENCE; + if (data == null) { + data = []; + } + if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) { + isRef = matches.ref; + values.value = matches.value; + } + if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ').indexOf('#') === 0) { + if (this.currentLineNb < this.lines.length - 1 && !this.isNextLineUnIndentedCollection()) { + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + data.push(parser.parse(this.getNextEmbedBlock(null, true), exceptionOnInvalidType, objectDecoder)); + } else { + data.push(null); + } + } else { + if (((ref = values.leadspaces) != null ? ref.length : void 0) && (matches = this.PATTERN_COMPACT_NOTATION.exec(values.value))) { + c = this.getRealCurrentLineNb(); + parser = new Parser(c); + parser.refs = this.refs; + block = values.value; + indent = this.getCurrentLineIndentation(); + if (this.isNextLineIndented(false)) { + block += "\n" + this.getNextEmbedBlock(indent + values.leadspaces.length + 1, true); + } + data.push(parser.parse(block, exceptionOnInvalidType, objectDecoder)); + } else { + data.push(this.parseValue(values.value, exceptionOnInvalidType, objectDecoder)); + } + } + } else if ((values = this.PATTERN_MAPPING_ITEM.exec(this.currentLine)) && values.key.indexOf(' #') === -1) { + if (this.CONTEXT_SEQUENCE === context) { + throw new ParseException('You cannot define a mapping item when in a sequence'); + } + context = this.CONTEXT_MAPPING; + if (data == null) { + data = {}; + } + Inline.configure(exceptionOnInvalidType, objectDecoder); + try { + key = Inline.parseScalar(values.key); + } catch (error) { + e = error; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + if ('<<' === key) { + mergeNode = true; + allowOverwrite = true; + if (((ref1 = values.value) != null ? ref1.indexOf('*') : void 0) === 0) { + refName = values.value.slice(1); + if (this.refs[refName] == null) { + throw new ParseException('Reference "' + refName + '" does not exist.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + refValue = this.refs[refName]; + if (typeof refValue !== 'object') { + throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + if (refValue instanceof Array) { + for (i = j = 0, len = refValue.length; j < len; i = ++j) { + value = refValue[i]; + if (data[name = String(i)] == null) { + data[name] = value; + } + } + } else { + for (key in refValue) { + value = refValue[key]; + if (data[key] == null) { + data[key] = value; + } + } + } + } else { + if ((values.value != null) && values.value !== '') { + value = values.value; + } else { + value = this.getNextEmbedBlock(); + } + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + parsed = parser.parse(value, exceptionOnInvalidType); + if (typeof parsed !== 'object') { + throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + if (parsed instanceof Array) { + for (l = 0, len1 = parsed.length; l < len1; l++) { + parsedItem = parsed[l]; + if (typeof parsedItem !== 'object') { + throw new ParseException('Merge items must be objects.', this.getRealCurrentLineNb() + 1, parsedItem); + } + if (parsedItem instanceof Array) { + for (i = m = 0, len2 = parsedItem.length; m < len2; i = ++m) { + value = parsedItem[i]; + k = String(i); + if (!data.hasOwnProperty(k)) { + data[k] = value; + } + } + } else { + for (key in parsedItem) { + value = parsedItem[key]; + if (!data.hasOwnProperty(key)) { + data[key] = value; + } + } + } + } + } else { + for (key in parsed) { + value = parsed[key]; + if (!data.hasOwnProperty(key)) { + data[key] = value; + } + } + } + } + } else if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) { + isRef = matches.ref; + values.value = matches.value; + } + if (mergeNode) { + + } else if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ').indexOf('#') === 0) { + if (!(this.isNextLineIndented()) && !(this.isNextLineUnIndentedCollection())) { + if (allowOverwrite || data[key] === void 0) { + data[key] = null; + } + } else { + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + val = parser.parse(this.getNextEmbedBlock(), exceptionOnInvalidType, objectDecoder); + if (allowOverwrite || data[key] === void 0) { + data[key] = val; + } + } + } else { + val = this.parseValue(values.value, exceptionOnInvalidType, objectDecoder); + if (allowOverwrite || data[key] === void 0) { + data[key] = val; + } + } + } else { + lineCount = this.lines.length; + if (1 === lineCount || (2 === lineCount && Utils.isEmpty(this.lines[1]))) { + try { + value = Inline.parse(this.lines[0], exceptionOnInvalidType, objectDecoder); + } catch (error1) { + e = error1; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + if (typeof value === 'object') { + if (value instanceof Array) { + first = value[0]; + } else { + for (key in value) { + first = value[key]; + break; + } + } + if (typeof first === 'string' && first.indexOf('*') === 0) { + data = []; + for (n = 0, len3 = value.length; n < len3; n++) { + alias = value[n]; + data.push(this.refs[alias.slice(1)]); + } + value = data; + } + } + return value; + } else if ((ref2 = Utils.ltrim(value).charAt(0)) === '[' || ref2 === '{') { + try { + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } catch (error2) { + e = error2; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + } + throw new ParseException('Unable to parse.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + if (isRef) { + if (data instanceof Array) { + this.refs[isRef] = data[data.length - 1]; + } else { + lastKey = null; + for (key in data) { + lastKey = key; + } + this.refs[isRef] = data[lastKey]; + } + } + } + if (Utils.isEmpty(data)) { + return null; + } else { + return data; + } + }; + + Parser.prototype.getRealCurrentLineNb = function () { + return this.currentLineNb + this.offset; + }; + + Parser.prototype.getCurrentLineIndentation = function () { + return this.currentLine.length - Utils.ltrim(this.currentLine, ' ').length; + }; + + Parser.prototype.getNextEmbedBlock = function (indentation, includeUnindentedCollection) { + var data, indent, isItUnindentedCollection, newIndent, removeComments, removeCommentsPattern, unindentedEmbedBlock; + if (indentation == null) { + indentation = null; + } + if (includeUnindentedCollection == null) { + includeUnindentedCollection = false; + } + this.moveToNextLine(); + if (indentation == null) { + newIndent = this.getCurrentLineIndentation(); + unindentedEmbedBlock = this.isStringUnIndentedCollectionItem(this.currentLine); + if (!(this.isCurrentLineEmpty()) && 0 === newIndent && !unindentedEmbedBlock) { + throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + } else { + newIndent = indentation; + } + data = [this.currentLine.slice(newIndent)]; + if (!includeUnindentedCollection) { + isItUnindentedCollection = this.isStringUnIndentedCollectionItem(this.currentLine); + } + removeCommentsPattern = this.PATTERN_FOLDED_SCALAR_END; + removeComments = !removeCommentsPattern.test(this.currentLine); + while (this.moveToNextLine()) { + indent = this.getCurrentLineIndentation(); + if (indent === newIndent) { + removeComments = !removeCommentsPattern.test(this.currentLine); + } + if (removeComments && this.isCurrentLineComment()) { + continue; + } + if (this.isCurrentLineBlank()) { + data.push(this.currentLine.slice(newIndent)); + continue; + } + if (isItUnindentedCollection && !this.isStringUnIndentedCollectionItem(this.currentLine) && indent === newIndent) { + this.moveToPreviousLine(); + break; + } + if (indent >= newIndent) { + data.push(this.currentLine.slice(newIndent)); + } else if (Utils.ltrim(this.currentLine).charAt(0) === '#') { + + } else if (0 === indent) { + this.moveToPreviousLine(); + break; + } else { + throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + } + return data.join("\n"); + }; + + Parser.prototype.moveToNextLine = function () { + if (this.currentLineNb >= this.lines.length - 1) { + return false; + } + this.currentLine = this.lines[++this.currentLineNb]; + return true; + }; + + Parser.prototype.moveToPreviousLine = function () { + this.currentLine = this.lines[--this.currentLineNb]; + }; + + Parser.prototype.parseValue = function (value, exceptionOnInvalidType, objectDecoder) { + var e, error, foldedIndent, matches, modifiers, pos, ref, ref1, val; + if (0 === value.indexOf('*')) { + pos = value.indexOf('#'); + if (pos !== -1) { + value = value.substr(1, pos - 2); + } else { + value = value.slice(1); + } + if (this.refs[value] === void 0) { + throw new ParseException('Reference "' + value + '" does not exist.', this.currentLine); + } + return this.refs[value]; + } + if (matches = this.PATTERN_FOLDED_SCALAR_ALL.exec(value)) { + modifiers = (ref = matches.modifiers) != null ? ref : ''; + foldedIndent = Math.abs(parseInt(modifiers)); + if (isNaN(foldedIndent)) { + foldedIndent = 0; + } + val = this.parseFoldedScalar(matches.separator, this.PATTERN_DECIMAL.replace(modifiers, ''), foldedIndent); + if (matches.type != null) { + Inline.configure(exceptionOnInvalidType, objectDecoder); + return Inline.parseScalar(matches.type + ' ' + val); + } else { + return val; + } + } + if ((ref1 = value.charAt(0)) === '[' || ref1 === '{' || ref1 === '"' || ref1 === "'") { + while (true) { + try { + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } catch (error) { + e = error; + if (e instanceof ParseMore && this.moveToNextLine()) { + value += "\n" + Utils.trim(this.currentLine, ' '); + } else { + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + } + } + } else { + if (this.isNextLineIndented()) { + value += "\n" + this.getNextEmbedBlock(); + } + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } + }; + + Parser.prototype.parseFoldedScalar = function (separator, indicator, indentation) { + var isCurrentLineBlank, j, len, line, matches, newText, notEOF, pattern, ref, text; + if (indicator == null) { + indicator = ''; + } + if (indentation == null) { + indentation = 0; + } + notEOF = this.moveToNextLine(); + if (!notEOF) { + return ''; + } + isCurrentLineBlank = this.isCurrentLineBlank(); + text = ''; + while (notEOF && isCurrentLineBlank) { + if (notEOF = this.moveToNextLine()) { + text += "\n"; + isCurrentLineBlank = this.isCurrentLineBlank(); + } + } + if (0 === indentation) { + if (matches = this.PATTERN_INDENT_SPACES.exec(this.currentLine)) { + indentation = matches[0].length; + } + } + if (indentation > 0) { + pattern = this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation]; + if (pattern == null) { + pattern = new Pattern('^ {' + indentation + '}(.*)$'); + Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation] = pattern; + } + while (notEOF && (isCurrentLineBlank || (matches = pattern.exec(this.currentLine)))) { + if (isCurrentLineBlank) { + text += this.currentLine.slice(indentation); + } else { + text += matches[1]; + } + if (notEOF = this.moveToNextLine()) { + text += "\n"; + isCurrentLineBlank = this.isCurrentLineBlank(); + } + } + } else if (notEOF) { + text += "\n"; + } + if (notEOF) { + this.moveToPreviousLine(); + } + if ('>' === separator) { + newText = ''; + ref = text.split("\n"); + for (j = 0, len = ref.length; j < len; j++) { + line = ref[j]; + if (line.length === 0 || line.charAt(0) === ' ') { + newText = Utils.rtrim(newText, ' ') + line + "\n"; + } else { + newText += line + ' '; + } + } + text = newText; + } + if ('+' !== indicator) { + text = Utils.rtrim(text); + } + if ('' === indicator) { + text = this.PATTERN_TRAILING_LINES.replace(text, "\n"); + } else if ('-' === indicator) { + text = this.PATTERN_TRAILING_LINES.replace(text, ''); + } + return text; + }; + + Parser.prototype.isNextLineIndented = function (ignoreComments) { + var EOF, currentIndentation, ret; + if (ignoreComments == null) { + ignoreComments = true; + } + currentIndentation = this.getCurrentLineIndentation(); + EOF = !this.moveToNextLine(); + if (ignoreComments) { + while (!EOF && this.isCurrentLineEmpty()) { + EOF = !this.moveToNextLine(); + } + } else { + while (!EOF && this.isCurrentLineBlank()) { + EOF = !this.moveToNextLine(); + } + } + if (EOF) { + return false; + } + ret = false; + if (this.getCurrentLineIndentation() > currentIndentation) { + ret = true; + } + this.moveToPreviousLine(); + return ret; + }; + + Parser.prototype.isCurrentLineEmpty = function () { + var trimmedLine; + trimmedLine = Utils.trim(this.currentLine, ' '); + return trimmedLine.length === 0 || trimmedLine.charAt(0) === '#'; + }; + + Parser.prototype.isCurrentLineBlank = function () { + return '' === Utils.trim(this.currentLine, ' '); + }; + + Parser.prototype.isCurrentLineComment = function () { + var ltrimmedLine; + ltrimmedLine = Utils.ltrim(this.currentLine, ' '); + return ltrimmedLine.charAt(0) === '#'; + }; + + Parser.prototype.cleanup = function (value) { + var count, i, indent, j, l, len, len1, line, lines, ref, ref1, ref2, smallestIndent, trimmedValue; + if (value.indexOf("\r") !== -1) { + value = value.split("\r\n").join("\n").split("\r").join("\n"); + } + count = 0; + ref = this.PATTERN_YAML_HEADER.replaceAll(value, ''), value = ref[0], count = ref[1]; + this.offset += count; + ref1 = this.PATTERN_LEADING_COMMENTS.replaceAll(value, '', 1), trimmedValue = ref1[0], count = ref1[1]; + if (count === 1) { + this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n"); + value = trimmedValue; + } + ref2 = this.PATTERN_DOCUMENT_MARKER_START.replaceAll(value, '', 1), trimmedValue = ref2[0], count = ref2[1]; + if (count === 1) { + this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n"); + value = trimmedValue; + value = this.PATTERN_DOCUMENT_MARKER_END.replace(value, ''); + } + lines = value.split("\n"); + smallestIndent = -1; + for (j = 0, len = lines.length; j < len; j++) { + line = lines[j]; + if (Utils.trim(line, ' ').length === 0) { + continue; + } + indent = line.length - Utils.ltrim(line).length; + if (smallestIndent === -1 || indent < smallestIndent) { + smallestIndent = indent; + } + } + if (smallestIndent > 0) { + for (i = l = 0, len1 = lines.length; l < len1; i = ++l) { + line = lines[i]; + lines[i] = line.slice(smallestIndent); + } + value = lines.join("\n"); + } + return value; + }; + + Parser.prototype.isNextLineUnIndentedCollection = function (currentIndentation) { + var notEOF, ret; + if (currentIndentation == null) { + currentIndentation = null; + } + if (currentIndentation == null) { + currentIndentation = this.getCurrentLineIndentation(); + } + notEOF = this.moveToNextLine(); + while (notEOF && this.isCurrentLineEmpty()) { + notEOF = this.moveToNextLine(); + } + if (false === notEOF) { + return false; + } + ret = false; + if (this.getCurrentLineIndentation() === currentIndentation && this.isStringUnIndentedCollectionItem(this.currentLine)) { + ret = true; + } + this.moveToPreviousLine(); + return ret; + }; + + Parser.prototype.isStringUnIndentedCollectionItem = function () { + return this.currentLine === '-' || this.currentLine.slice(0, 2) === '- '; + }; + + return Parser; + + })(); + + module.exports = Parser; + + + }, { + "./Exception/ParseException": 4, + "./Exception/ParseMore": 5, + "./Inline": 6, + "./Pattern": 8, + "./Utils": 10 + }], + 8: [function (require, module, exports) { + var Pattern; + + Pattern = (function () { + Pattern.prototype.regex = null; + + Pattern.prototype.rawRegex = null; + + Pattern.prototype.cleanedRegex = null; + + Pattern.prototype.mapping = null; + + function Pattern(rawRegex, modifiers) { + var _char, capturingBracketNumber, cleanedRegex, i, len, mapping, name, part, subChar; + if (modifiers == null) { + modifiers = ''; + } + cleanedRegex = ''; + len = rawRegex.length; + mapping = null; + capturingBracketNumber = 0; + i = 0; + while (i < len) { + _char = rawRegex.charAt(i); + if (_char === '\\') { + cleanedRegex += rawRegex.slice(i, +(i + 1) + 1 || 9e9); + i++; + } else if (_char === '(') { + if (i < len - 2) { + part = rawRegex.slice(i, +(i + 2) + 1 || 9e9); + if (part === '(?:') { + i += 2; + cleanedRegex += part; + } else if (part === '(?<') { + capturingBracketNumber++; + i += 2; + name = ''; + while (i + 1 < len) { + subChar = rawRegex.charAt(i + 1); + if (subChar === '>') { + cleanedRegex += '('; + i++; + if (name.length > 0) { + if (mapping == null) { + mapping = {}; + } + mapping[name] = capturingBracketNumber; + } + break; + } else { + name += subChar; + } + i++; + } + } else { + cleanedRegex += _char; + capturingBracketNumber++; + } + } else { + cleanedRegex += _char; + } + } else { + cleanedRegex += _char; + } + i++; + } + this.rawRegex = rawRegex; + this.cleanedRegex = cleanedRegex; + this.regex = new RegExp(this.cleanedRegex, 'g' + modifiers.replace('g', '')); + this.mapping = mapping; + } + + Pattern.prototype.exec = function (str) { + var index, matches, name, ref; + this.regex.lastIndex = 0; + matches = this.regex.exec(str); + if (matches == null) { + return null; + } + if (this.mapping != null) { + ref = this.mapping; + for (name in ref) { + index = ref[name]; + matches[name] = matches[index]; + } + } + return matches; + }; + + Pattern.prototype.test = function (str) { + this.regex.lastIndex = 0; + return this.regex.test(str); + }; + + Pattern.prototype.replace = function (str, replacement) { + this.regex.lastIndex = 0; + return str.replace(this.regex, replacement); + }; + + Pattern.prototype.replaceAll = function (str, replacement, limit) { + var count; + if (limit == null) { + limit = 0; + } + this.regex.lastIndex = 0; + count = 0; + while (this.regex.test(str) && (limit === 0 || count < limit)) { + this.regex.lastIndex = 0; + str = str.replace(this.regex, replacement); + count++; + } + return [str, count]; + }; + + return Pattern; + + })(); + + module.exports = Pattern; + + + }, {}], + 9: [function (require, module, exports) { + var Pattern, Unescaper, Utils; + + Utils = require('./Utils'); + + Pattern = require('./Pattern'); + + Unescaper = (function () { + function Unescaper() { } + + Unescaper.PATTERN_ESCAPED_CHARACTER = new Pattern('\\\\([0abt\tnvfre "\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})'); + + Unescaper.unescapeSingleQuotedString = function (value) { + return value.replace(/\'\'/g, '\''); + }; + + Unescaper.unescapeDoubleQuotedString = function (value) { + if (this._unescapeCallback == null) { + this._unescapeCallback = (function (_this) { + return function (str) { + return _this.unescapeCharacter(str); + }; + })(this); + } + return this.PATTERN_ESCAPED_CHARACTER.replace(value, this._unescapeCallback); + }; + + Unescaper.unescapeCharacter = function (value) { + var ch; + ch = String.fromCharCode; + switch (value.charAt(1)) { + case '0': + return ch(0); + case 'a': + return ch(7); + case 'b': + return ch(8); + case 't': + return "\t"; + case "\t": + return "\t"; + case 'n': + return "\n"; + case 'v': + return ch(11); + case 'f': + return ch(12); + case 'r': + return ch(13); + case 'e': + return ch(27); + case ' ': + return ' '; + case '"': + return '"'; + case '/': + return '/'; + case '\\': + return '\\'; + case 'N': + return ch(0x0085); + case '_': + return ch(0x00A0); + case 'L': + return ch(0x2028); + case 'P': + return ch(0x2029); + case 'x': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 2))); + case 'u': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 4))); + case 'U': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 8))); + default: + return ''; + } + }; + + return Unescaper; + + })(); + + module.exports = Unescaper; + + + }, { + "./Pattern": 8, + "./Utils": 10 + }], + 10: [function (require, module, exports) { + var Pattern, Utils, + hasProp = {}.hasOwnProperty; + + Pattern = require('./Pattern'); + + Utils = (function () { + function Utils() { } + + Utils.REGEX_LEFT_TRIM_BY_CHAR = {}; + + Utils.REGEX_RIGHT_TRIM_BY_CHAR = {}; + + Utils.REGEX_SPACES = /\s+/g; + + Utils.REGEX_DIGITS = /^\d+$/; + + Utils.REGEX_OCTAL = /[^0-7]/gi; + + Utils.REGEX_HEXADECIMAL = /[^a-f0-9]/gi; + + Utils.PATTERN_DATE = new Pattern('^' + '(?[0-9][0-9][0-9][0-9])' + '-(?[0-9][0-9]?)' + '-(?[0-9][0-9]?)' + '(?:(?:[Tt]|[ \t]+)' + '(?[0-9][0-9]?)' + ':(?[0-9][0-9])' + ':(?[0-9][0-9])' + '(?:\.(?[0-9]*))?' + '(?:[ \t]*(?Z|(?[-+])(?[0-9][0-9]?)' + '(?::(?[0-9][0-9]))?))?)?' + '$', 'i'); + + Utils.LOCAL_TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000; + + Utils.trim = function (str, _char) { + var regexLeft, regexRight; + if (_char == null) { + _char = '\\s'; + } + regexLeft = this.REGEX_LEFT_TRIM_BY_CHAR[_char]; + if (regexLeft == null) { + this.REGEX_LEFT_TRIM_BY_CHAR[_char] = regexLeft = new RegExp('^' + _char + '' + _char + '*'); + } + regexLeft.lastIndex = 0; + regexRight = this.REGEX_RIGHT_TRIM_BY_CHAR[_char]; + if (regexRight == null) { + this.REGEX_RIGHT_TRIM_BY_CHAR[_char] = regexRight = new RegExp(_char + '' + _char + '*$'); + } + regexRight.lastIndex = 0; + return str.replace(regexLeft, '').replace(regexRight, ''); + }; + + Utils.ltrim = function (str, _char) { + var regexLeft; + if (_char == null) { + _char = '\\s'; + } + regexLeft = this.REGEX_LEFT_TRIM_BY_CHAR[_char]; + if (regexLeft == null) { + this.REGEX_LEFT_TRIM_BY_CHAR[_char] = regexLeft = new RegExp('^' + _char + '' + _char + '*'); + } + regexLeft.lastIndex = 0; + return str.replace(regexLeft, ''); + }; + + Utils.rtrim = function (str, _char) { + var regexRight; + if (_char == null) { + _char = '\\s'; + } + regexRight = this.REGEX_RIGHT_TRIM_BY_CHAR[_char]; + if (regexRight == null) { + this.REGEX_RIGHT_TRIM_BY_CHAR[_char] = regexRight = new RegExp(_char + '' + _char + '*$'); + } + regexRight.lastIndex = 0; + return str.replace(regexRight, ''); + }; + + Utils.isEmpty = function (value) { + return !value || value === '' || value === '0' || (value instanceof Array && value.length === 0) || this.isEmptyObject(value); + }; + + Utils.isEmptyObject = function (value) { + var k; + return value instanceof Object && ((function () { + var results; + results = []; + for (k in value) { + if (!hasProp.call(value, k)) continue; + results.push(k); + } + return results; + })()).length === 0; + }; + + Utils.subStrCount = function (string, subString, start, length) { + var c, i, j, len, ref, sublen; + c = 0; + string = '' + string; + subString = '' + subString; + if (start != null) { + string = string.slice(start); + } + if (length != null) { + string = string.slice(0, length); + } + len = string.length; + sublen = subString.length; + for (i = j = 0, ref = len; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { + if (subString === string.slice(i, sublen)) { + c++; + i += sublen - 1; + } + } + return c; + }; + + Utils.isDigits = function (input) { + this.REGEX_DIGITS.lastIndex = 0; + return this.REGEX_DIGITS.test(input); + }; + + Utils.octDec = function (input) { + this.REGEX_OCTAL.lastIndex = 0; + return parseInt((input + '').replace(this.REGEX_OCTAL, ''), 8); + }; + + Utils.hexDec = function (input) { + this.REGEX_HEXADECIMAL.lastIndex = 0; + input = this.trim(input); + if ((input + '').slice(0, 2) === '0x') { + input = (input + '').slice(2); + } + return parseInt((input + '').replace(this.REGEX_HEXADECIMAL, ''), 16); + }; + + Utils.utf8chr = function (c) { + var ch; + ch = String.fromCharCode; + if (0x80 > (c %= 0x200000)) { + return ch(c); + } + if (0x800 > c) { + return ch(0xC0 | c >> 6) + ch(0x80 | c & 0x3F); + } + if (0x10000 > c) { + return ch(0xE0 | c >> 12) + ch(0x80 | c >> 6 & 0x3F) + ch(0x80 | c & 0x3F); + } + return ch(0xF0 | c >> 18) + ch(0x80 | c >> 12 & 0x3F) + ch(0x80 | c >> 6 & 0x3F) + ch(0x80 | c & 0x3F); + }; + + Utils.parseBoolean = function (input, strict) { + var lowerInput; + if (strict == null) { + strict = true; + } + if (typeof input === 'string') { + lowerInput = input.toLowerCase(); + if (!strict) { + if (lowerInput === 'no') { + return false; + } + } + if (lowerInput === '0') { + return false; + } + if (lowerInput === 'false') { + return false; + } + if (lowerInput === '') { + return false; + } + return true; + } + return !!input; + }; + + Utils.isNumeric = function (input) { + this.REGEX_SPACES.lastIndex = 0; + return typeof input === 'number' || typeof input === 'string' && !isNaN(input) && input.replace(this.REGEX_SPACES, '') !== ''; + }; + + Utils.stringToDate = function (str) { + var date, day, fraction, hour, info, minute, month, second, tz_hour, tz_minute, tz_offset, year; + if (!(str != null ? str.length : void 0)) { + return null; + } + info = this.PATTERN_DATE.exec(str); + if (!info) { + return null; + } + year = parseInt(info.year, 10); + month = parseInt(info.month, 10) - 1; + day = parseInt(info.day, 10); + if (info.hour == null) { + date = new Date(Date.UTC(year, month, day)); + return date; + } + hour = parseInt(info.hour, 10); + minute = parseInt(info.minute, 10); + second = parseInt(info.second, 10); + if (info.fraction != null) { + fraction = info.fraction.slice(0, 3); + while (fraction.length < 3) { + fraction += '0'; + } + fraction = parseInt(fraction, 10); + } else { + fraction = 0; + } + if (info.tz != null) { + tz_hour = parseInt(info.tz_hour, 10); + if (info.tz_minute != null) { + tz_minute = parseInt(info.tz_minute, 10); + } else { + tz_minute = 0; + } + tz_offset = (tz_hour * 60 + tz_minute) * 60000; + if ('-' === info.tz_sign) { + tz_offset *= -1; + } + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + if (tz_offset) { + date.setTime(date.getTime() - tz_offset); + } + return date; + }; + + Utils.strRepeat = function (str, number) { + var i, res; + res = ''; + i = 0; + while (i < number) { + res += str; + i++; + } + return res; + }; + + Utils.getStringFromFile = function (path, callback) { + var data, fs, j, len1, name, ref, req, xhr; + if (callback == null) { + callback = null; + } + xhr = null; + if (typeof window !== "undefined" && window !== null) { + if (window.XMLHttpRequest) { + xhr = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + ref = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; + for (j = 0, len1 = ref.length; j < len1; j++) { + name = ref[j]; + try { + xhr = new ActiveXObject(name); + } catch (undefined) { } + } + } + } + if (xhr != null) { + if (callback != null) { + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200 || xhr.status === 0) { + return callback(xhr.responseText); + } else { + return callback(null); + } + } + }; + xhr.open('GET', path, true); + return xhr.send(null); + } else { + xhr.open('GET', path, false); + xhr.send(null); + if (xhr.status === 200 || xhr.status === 0) { + return xhr.responseText; + } + return null; + } + } else { + req = require; + fs = req('fs'); + if (callback != null) { + return fs.readFile(path, function (err, data) { + if (err) { + return callback(null); + } else { + return callback(String(data)); + } + }); + } else { + data = fs.readFileSync(path); + if (data != null) { + return String(data); + } + return null; + } + } + }; + + return Utils; + + })(); + + module.exports = Utils; + + + }, { + "./Pattern": 8 + }], + 11: [function (require, module, exports) { + var Dumper, Parser, Utils, Yaml; + + Parser = require('./Parser'); + + Dumper = require('./Dumper'); + + Utils = require('./Utils'); + + Yaml = (function () { + function Yaml() { } + + Yaml.parse = function (input, exceptionOnInvalidType, objectDecoder) { + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + return new Parser().parse(input, exceptionOnInvalidType, objectDecoder); + }; + + Yaml.parseFile = function (path, callback, exceptionOnInvalidType, objectDecoder) { + var input; + if (callback == null) { + callback = null; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + if (callback != null) { + return Utils.getStringFromFile(path, (function (_this) { + return function (input) { + var result; + result = null; + if (input != null) { + result = _this.parse(input, exceptionOnInvalidType, objectDecoder); + } + callback(result); + }; + })(this)); + } else { + input = Utils.getStringFromFile(path); + if (input != null) { + return this.parse(input, exceptionOnInvalidType, objectDecoder); + } + return null; + } + }; + + Yaml.dump = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + var yaml; + if (inline == null) { + inline = 2; + } + if (indent == null) { + indent = 4; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + yaml = new Dumper(); + yaml.indentation = indent; + return yaml.dump(input, inline, 0, exceptionOnInvalidType, objectEncoder); + }; + + Yaml.stringify = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + return this.dump(input, inline, indent, exceptionOnInvalidType, objectEncoder); + }; + + Yaml.load = function (path, callback, exceptionOnInvalidType, objectDecoder) { + return this.parseFile(path, callback, exceptionOnInvalidType, objectDecoder); + }; + + return Yaml; + + })(); + + if (typeof window !== "undefined" && window !== null) { + window.YAML = Yaml; + } + + if (typeof window === "undefined" || window === null) { + this.YAML = Yaml; + } + + module.exports = Yaml; + + + }, { + "./Dumper": 1, + "./Parser": 7, + "./Utils": 10 + }] +}, {}, [11]); diff --git a/www/community/custom-sidebar/custom-sidebar.js.gz b/www/community/custom-sidebar/custom-sidebar.js.gz new file mode 100644 index 0000000..be0baac Binary files /dev/null and b/www/community/custom-sidebar/custom-sidebar.js.gz differ diff --git a/www/community/kiosk-mode/kiosk-mode.js b/www/community/kiosk-mode/kiosk-mode.js new file mode 100644 index 0000000..c6e2aad --- /dev/null +++ b/www/community/kiosk-mode/kiosk-mode.js @@ -0,0 +1,42 @@ +"use strict";function e(e,r){return o(e)||n(e,r)||d(e,r)||t()}function t(){throw new TypeError( +"Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")} +function n(e,r){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var t=[],n=!0,o=!1,a=void 0;try{for(var i,l=e[Symbol.iterator]();!(n=( +i=l.next()).done)&&(t.push(i.value),!r||t.length!==r);n=!0);}catch(e){o=!0,a=e}finally{try{n||null==l.return||l.return()}finally{if(o)throw a}} +return t}}function o(e){if(Array.isArray(e))return e}function r(e){return l(e)||i(e)||d(e)||a()}function a(){throw new TypeError( +"Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function i(e){ +if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function l(e){if(Array.isArray(e))return c(e)}function f(e,r){var t +;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(t=d(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0,r=function( +){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError( +"Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0, +i=!1;return{s:function(){t=e[Symbol.iterator]()},n:function(){var e=t.next();return a=e.done,e},e:function(e){i=!0,o=e},f:function(){try{ +a||null==t.return||t.return()}finally{if(i)throw o}}}}function d(e,r){if(e){if("string"==typeof e)return c(e,r);var t=Object.prototype.toString.call(e +).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e +):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?c(e,r):void 0}}function c(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0, +n=new Array(r);t="))return parseFloat(e)>=parseFloat(t.substr(2));if(t.startsWith("<"))return parseFloat(e)"))return parseFloat(e)>parseFloat(t.substr(1));if(t.startsWith("!"))return parseFloat(e)!=parseFloat(t.substr(1));if(t.startsWith("="))return parseFloat(e)==parseFloat(t.substr(1))}return t===e}function h(t,e){return function(i){const r="string"==typeof i?t.states[i]:t.states[i.entity];if(!r)return!1;for(const[s,n]of Object.entries(e))switch(s.split(" ")[0]){case"options":case"sort":break;case"domain":if(!f(n,r.entity_id.split(".")[0]))return!1;break;case"entity_id":if(!f(n,r.entity_id))return!1;break;case"state":if(!f(n,r.state))return!1;break;case"name":if(!r.attributes.friendly_name||!f(n,r.attributes.friendly_name))return!1;break;case"group":if(!(n.startsWith("group.")&&t.states[n]&&t.states[n].attributes.entity_id&&t.states[n].attributes.entity_id.includes(r.entity_id)))return!1;break;case"attributes":for(const[t,e]of Object.entries(n)){let i=t.split(" ")[0].trim(),s=r.attributes;for(;i&&s;){let t;[t,i]=i.split(":"),s=s[t]}if(void 0===s||void 0!==e&&!f(e,s))return!1}break;case"not":if(h(t,n)(i))return!1;break;case"or":for(const e of n)if(h(t,e)(i))return!0;return!1;case"device":if(!window.cardToolsData||!window.cardToolsData.devices)return!1;let e=!1;for(const t of window.cardToolsData.devices)(f(n,t.name_by_user)||f(n,t.name))&&d(t).includes(r.entity_id)&&(e=!0);if(!e)return!1;break;case"area":if(!window.cardToolsData||!window.cardToolsData.areas)return!1;let s=!1;for(const t of window.cardToolsData.areas)f(n,t.name)&&u(t).flatMap(d).includes(r.entity_id)&&(s=!0);if(!s)return!1;break;case"last_changed":if(!f(n,((new Date).getTime()-new Date(r.last_changed).getTime())/6e4))return!1;break;case"last_updated":if(!f(n,((new Date).getTime()-new Date(r.last_updated).getTime())/6e4))return!1;break;default:return!1}return!0}}function p(t,e){return"string"==typeof e&&(e={method:e}),function(i,r){const s="string"==typeof i?t.states[i]:t.states[i.entity],n="string"==typeof r?t.states[r]:t.states[r.entity];if(void 0===s||void 0===n)return 0;const[a,o]=e.reverse?[-1,1]:[1,-1];function l(t,i){return e.ignore_case&&t.toLowerCase&&(t=t.toLowerCase()),e.ignore_case&&i.toLowerCase&&(i=i.toLowerCase()),e.numeric&&(isNaN(parseFloat(t))&&isNaN(parseFloat(i))||(t=isNaN(parseFloat(t))?void 0:parseFloat(t),i=isNaN(parseFloat(i))?void 0:parseFloat(i))),void 0===t&&void 0===i?0:void 0===t?a:void 0===i||ti?a:0}switch(e.method){case"domain":return l(s.entity_id.split(".")[0],n.entity_id.split(".")[0]);case"entity_id":return l(s.entity_id,n.entity_id);case"friendly_name":case"name":return l(s.attributes.friendly_name||s.entity_id.split(".")[1],n.attributes.friendly_name||n.entity_id.split(".")[1]);case"state":return l(s.state,n.state);case"attribute":let t=s.attributes,i=n.attributes,r=e.attribute;for(;r;){let e;if([e,r]=r.split(":"),t=t[e],i=i[e],void 0===t&&void 0===i)return 0;if(void 0===t)return a;if(void 0===i)return o}return l(t,i);case"last_changed":return e.numeric=!0,l(new Date(n.last_changed).getTime(),new Date(s.last_changed).getTime());case"last_updated":return e.numeric=!0,l(new Date(n.last_updated).getTime(),new Date(s.last_updated).getTime());case"last_triggered":return null==s.attributes.last_triggered||null==n.attributes.last_triggered?0:(e.numeric=!0,l(new Date(n.attributes.last_triggered).getTime(),new Date(s.attributes.last_triggered).getTime()));default:return 0}}}function g(t,e,i=null){if((t=new Event(t,{bubbles:!0,cancelable:!1,composed:!0})).detail=e||{},i)i.dispatchEvent(t);else{var r=function(){var t=document.querySelector("hc-main");return t=t?(t=(t=(t=t&&t.shadowRoot)&&t.querySelector("hc-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-view")||t.querySelector("hui-panel-view"):(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=document.querySelector("home-assistant"))&&t.shadowRoot)&&t.querySelector("home-assistant-main"))&&t.shadowRoot)&&t.querySelector("app-drawer-layout partial-panel-resolver"))&&t.shadowRoot||t)&&t.querySelector("ha-panel-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-root"))&&t.shadowRoot)&&t.querySelector("ha-app-layout"))&&t.querySelector("#view"))&&t.firstElementChild}();r&&r.dispatchEvent(t)}}c();let m=window.cardHelpers;const y=new Promise(async(t,e)=>{m&&t();const i=async()=>{m=await window.loadCardHelpers(),window.cardHelpers=m,t()};window.loadCardHelpers?i():window.addEventListener("load",async()=>{!async function(){if(customElements.get("hui-view"))return!0;await customElements.whenDefined("partial-panel-resolver");const t=document.createElement("partial-panel-resolver");if(t.hass={panels:[{url_path:"tmp",component_name:"lovelace"}]},t._updateRoutes(),await t.routerOptions.routes.tmp.load(),!customElements.get("ha-panel-lovelace"))return!1;const e=document.createElement("ha-panel-lovelace");e.hass=n(),void 0===e.hass&&(await new Promise(t=>{window.addEventListener("connection-status",e=>{console.log(e),t()},{once:!0})}),e.hass=n()),e.panel={config:{mode:null}},e._fetchConfig()}(),window.loadCardHelpers&&i()})});function w(t,e){const i={type:"error",error:t,origConfig:e},r=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{const t=document.createElement("hui-error-card");t.setConfig(i),r.parentElement&&r.parentElement.replaceChild(t,r)}),y.then(()=>{g("ll-rebuild",{},r)}),r}function _(t,e){if(!e||"object"!=typeof e||!e.type)return w(`No ${t} type configured`,e);let i=e.type;if(i=i.startsWith("custom:")?i.substr("custom:".length):`hui-${i}-${t}`,customElements.get(i))return function(t,e){let i=document.createElement(t);try{i.setConfig(JSON.parse(JSON.stringify(e)))}catch(t){i=w(t,e)}return y.then(()=>{g("ll-rebuild",{},i)}),i}(i,e);const r=w(`Custom element doesn't exist: ${i}.`,e);r.style.display="None";const s=setTimeout(()=>{r.style.display=""},2e3);return customElements.whenDefined(i).then(()=>{clearTimeout(s),g("ll-rebuild",{},r)}),r}const b="lovelace-player-device-id";function v(){if(!localStorage[b]){const t=()=>Math.floor(1e5*(1+Math.random())).toString(16).substring(1);window.fully&&"function"==typeof fully.getDeviceId?localStorage[b]=fully.getDeviceId():localStorage[b]=`${t()}${t()}-${t()}${t()}`}return localStorage[b]}let S=v();const E=new URLSearchParams(window.location.search);var O;E.get("deviceID")&&null!==(O=E.get("deviceID"))&&("clear"===O?localStorage.removeItem(b):localStorage[b]=O,S=v());class T extends r{static get properties(){return{hass:{}}}setConfig(t){if(!t)throw new Error("No configuration.");if(!t.card||!t.card.type)throw new Error("No card type specified.");if(!t.filter&&!t.entities)throw new Error("No filters specified.");t=JSON.parse(JSON.stringify(t)),this._config?(this._config=t,this.hass=this.hass):(this._config=t,this.hass=n(),this._getEntities(),this.cardConfig={[t.card_param||"entities"]:this.entities,...t.card},this.card=function(t){return m?m.createCardElement(t):_("card",t)}(this.cardConfig)),t.filter&&t.filter.template&&(this.template="",(String(t.filter.template).includes("{%")||String(t.filter.template).includes("{{"))&&function(t,e,i,r=!0){t||(t=n().connection);let s={user:n().user.name,browser:S,hash:location.hash.substr(1)||" ",...i.variables},a=i.template,o=i.entity_ids;t.subscribeMessage(t=>{if(r){let i=String(t.result);const r=/_\([^)]*\)/g;i=i.replace(r,t=>n().localize(t.substring(2,t.length-1))||t),e(i)}else e(t.result)},{type:"render_template",template:a,variables:s,entity_ids:o})}(null,t=>{this.template=t,this._getEntities()},{template:t.filter.template,variables:{config:t},entity_ids:t.filter.entity_ids},!1)),c().then(()=>this._getEntities())}_getEntities(){const t=t=>t?"string"==typeof t?{entity:t.trim()}:t:null;let e=[];if(this._config.entities&&(e=e.concat(this._config.entities.map(t))),this.hass&&this._config.filter){if(this.template&&(e="string"==typeof this.template?e.concat(this.template.split(/[\s,]+/).map(t)):e.concat(this.template.map(t))),e=e.filter(Boolean),this._config.filter.include){const i=Object.keys(this.hass.states).map(t);for(const t of this._config.filter.include){if(void 0!==t.type){e.push(t);continue}let r=i.filter(h(this.hass,t)).map(e=>JSON.parse(JSON.stringify(new Object({...e,...t.options})).replace(/this.entity_id/g,e.entity)));void 0!==t.sort&&(r=r.sort(p(this.hass,t.sort))),e=e.concat(r)}}if(this._config.filter.exclude)for(const t of this._config.filter.exclude)e=e.filter(e=>"string"!=typeof e&&void 0===e.entity||!h(this.hass,t)(e));if(this._config.sort&&(e=e.sort(p(this.hass,this._config.sort)),this._config.sort.count)){const t=this._config.sort.first||0;e=e.slice(t,t+this._config.sort.count)}if(this._config.unique){function i(t,e){return typeof t==typeof e&&("object"!=typeof t?t===e:Object.keys(t).lenght===Object.keys(e).length&&(!Object.keys(t).some(t=>!Object.keys(e).includes(t))&&Object.keys(t).every(r=>i(t[r],e[r]))))}let t=[];for(const r of e)"entity"===this._config.unique&&t.some(t=>t.entity===r.entity)||t.some(t=>i(t,r))||t.push(r);e=t}this.entities=e}else this.entities=e}set entities(t){(function(t,e){if(t===e)return!0;if(null==t||null==e)return!1;if(t.length!=e.length)return!1;for(var i=0;ithis._getEntities(),0))}createRenderRoot(){return this}render(){return s` + ${this.card}`}getCardSize(){let t=0;return this.card&&this.card.getCardSize&&(t=this.card.getCardSize()),1===t&&this.entities.length&&(t=this.entities.length),0===t&&this._config.filter&&this._config.filter.include&&(t=Object.keys(this._config.filter.include).length),t||1}}if(!customElements.get("auto-entities")){customElements.define("auto-entities",T);const t=i(0);console.info(`%cAUTO-ENTITIES ${t.version} IS INSTALLED`,"color: green; font-weight: bold","")}}]); \ No newline at end of file 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 0000000..b22b6ba Binary files /dev/null and b/www/community/lovelace-auto-entities/auto-entities.js.gz differ diff --git a/www/community/lovelace-auto-entities/webpack.config.js b/www/community/lovelace-auto-entities/webpack.config.js new file mode 100644 index 0000000..452cd0a --- /dev/null +++ b/www/community/lovelace-auto-entities/webpack.config.js @@ -0,0 +1,10 @@ +const path = require('path') + +module.exports = { + entry: './src/main.js', + mode: 'production', + output: { + filename: 'auto-entities.js', + path: path.resolve(__dirname) + } +} \ No newline at end of file diff --git a/www/community/lovelace-auto-entities/webpack.config.js.gz b/www/community/lovelace-auto-entities/webpack.config.js.gz new file mode 100644 index 0000000..1a8bb32 Binary files /dev/null and b/www/community/lovelace-auto-entities/webpack.config.js.gz differ diff --git a/www/community/lovelace-card-mod/card-mod.js b/www/community/lovelace-card-mod/card-mod.js new file mode 100644 index 0000000..b05f619 --- /dev/null +++ b/www/community/lovelace-card-mod/card-mod.js @@ -0,0 +1,9 @@ +!function(e){var t={};function o(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)o.d(n,r,function(t){return e[t]}.bind(null,r));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e){e.exports=JSON.parse('{"name":"card-mod","private":true,"version":"2.0.3","description":"","scripts":{"build":"webpack","watch":"webpack --watch --mode=development","update-card-tools":"npm uninstall card-tools && npm install thomasloven/lovelace-card-tools"},"keywords":[],"author":"Thomas Lovén","license":"MIT","devDependencies":{"webpack":"^4.44.2","webpack-cli":"^3.3.12"},"dependencies":{"card-tools":"github:thomasloven/lovelace-card-tools"}}')},function(e,t,o){"use strict";o.r(t);const n=customElements.get("home-assistant-main")?Object.getPrototypeOf(customElements.get("home-assistant-main")):Object.getPrototypeOf(customElements.get("hui-view")),r=n.prototype.html;n.prototype.css;function a(){return document.querySelector("hc-main")?document.querySelector("hc-main").hass:document.querySelector("home-assistant")?document.querySelector("home-assistant").hass:void 0}const s="lovelace-player-device-id";function i(){if(!localStorage[s]){const e=()=>Math.floor(1e5*(1+Math.random())).toString(16).substring(1);window.fully&&"function"==typeof fully.getDeviceId?localStorage[s]=fully.getDeviceId():localStorage[s]=`${e()}${e()}-${e()}${e()}`}return localStorage[s]}let l=i();const c=new URLSearchParams(window.location.search);var d;c.get("deviceID")&&null!==(d=c.get("deviceID"))&&("clear"===d?localStorage.removeItem(s):localStorage[s]=d,l=i());const p=async e=>{await(async()=>{if(customElements.get("developer-tools-event"))return;await customElements.whenDefined("partial-panel-resolver");const e=document.createElement("partial-panel-resolver");e.hass={panels:[{url_path:"tmp",component_name:"developer-tools"}]},e._updateRoutes(),await e.routerOptions.routes.tmp.load(),await customElements.whenDefined("developer-tools-router");const t=document.createElement("developer-tools-router");await t.routerOptions.routes.event.load()})();return document.createElement("developer-tools-event")._computeParsedEventData(e)};async function u(e,t,o=!1){let n=e;"string"==typeof t&&(t=t.split(/(\$| )/)),""===t[t.length-1]&&t.pop();for(const[e,r]of t.entries())if(r.trim().length){if(!n)return null;n.localName&&n.localName.includes("-")&&await customElements.whenDefined(n.localName),n.updateComplete&&await n.updateComplete,n="$"===r?o&&e==t.length-1?[n.shadowRoot]:n.shadowRoot:o&&e==t.length-1?n.querySelectorAll(r):n.querySelector(r)}return n}async function h(e,t,o=!1,n=1e4){return Promise.race([u(e,t,o),new Promise((e,t)=>setTimeout(()=>t(new Error("timeout")),n))]).catch(e=>{if(!e.message||"timeout"!==e.message)throw e;return null})}const m={template:"",variables:{},entity_ids:[]},y=async(e,t,o,n,r,a=!0)=>{if(e.localName.includes("-")&&await customElements.whenDefined(e.localName),e.updateComplete&&await e.updateComplete,e.modElement)return y(e.modElement,t,o,n,r,a);e._cardMod=e._cardMod||document.createElement("card-mod");(a&&e.shadowRoot||e).appendChild(e._cardMod),e.updateComplete&&await e.updateComplete,e._cardMod.type=t,e._cardMod.template={template:o,variables:n,entity_ids:r}};class f extends n{static get properties(){return{_renderedStyles:{},_renderer:{}}}static get applyToElement(){return y}constructor(){super(),document.querySelector("home-assistant").addEventListener("settheme",()=>{this._setTemplate(this._data)})}connectedCallback(){super.connectedCallback(),this.template=this._data,this.setAttribute("slot","none")}async getTheme(){if(!this.type)return null;let e=this.parentElement?this.parentElement:this;const t=window.getComputedStyle(e).getPropertyValue("--card-mod-theme"),o=a().themes.themes;return o[t]?o[t][`card-mod-${this.type}-yaml`]?await p(o[t][`card-mod-${this.type}-yaml`]):o[t]["card-mod-"+this.type]?o[t]["card-mod-"+this.type]:null:null}set template(e){e&&(this._data=JSON.parse(JSON.stringify(e)),this.themeApplied=this._setTemplate(this._data))}async _setTemplate(e){this._parent||(e.theme_template=await this.getTheme(),"string"==typeof e.template&&(e.template={".":e.template}),"string"==typeof e.theme_template&&(e.theme_template={".":e.theme_template})),await this.setStyle(e)}async unStyle(){this._styledChildren=this._styledChildren||new Set;for(const e of this._styledChildren)e.template=m}_mergeDeep(e,t){const o=e=>e&&"object"==typeof e&&!Array.isArray(e);if(o(e)&&o(t))for(const n in t)o(t[n])?(e[n]||Object.assign(e,{[n]:{}}),"string"==typeof e[n]&&(e[n]={".":e[n]}),this._mergeDeep(e[n],t[n])):e[n]?e[n]=t[n]+e[n]:e[n]=t[n];return e}async setStyle(e){let{template:t,theme_template:o,variables:n,entity_ids:r}=e;if(await this.unStyle(),t||(t={}),t=JSON.parse(JSON.stringify(t)),this._mergeDeep(t,o),"string"==typeof t){if(this._renderedStyles=t,this._renderer){try{await this._renderer()}catch(e){if(!e.code||"not_found"!==e.code)throw e}this._renderer=void 0}return s=t,void((String(s).includes("{%")||String(s).includes("{{"))&&(this._renderer=await function(e,t,o){e||(e=a().connection);let n={user:a().user.name,browser:l,hash:location.hash.substr(1)||" ",...o.variables},r=o.template,s=o.entity_ids;return e.subscribeMessage(e=>{let o=e.result;o=o.replace(/_\([^)]*\)/g,e=>a().localize(e.substring(2,e.length-1))||e),t(o)},{type:"render_template",template:r,variables:n,entity_ids:s})}(null,e=>{this._renderedStyles=e},{template:t,variables:n})))}var s;await this.updateComplete;const i=this.parentElement||this.parentNode;if(!i)return{template:"",variable:variable,entity_ids:r};i.updateComplete&&await i.updateComplete;for(const e of Object.keys(t)){let o=[];if("."!==e){if(o=await h(i,e,!0),o.length)for(const a of o){if(!a)continue;let o=a.querySelector(":scope > card-mod");o&&o._parent===(this._parent||this)||(o=document.createElement("card-mod"),this._styledChildren.add(o),o._parent=this._parent||this),o.template={template:t[e],variables:n,entity_ids:r},a.appendChild(o),await o.themeApplied}}else this.setStyle({template:t[e],variables:n,entity_ids:r})}}createRenderRoot(){return this}render(){return r` + + `}}if(!customElements.get("card-mod")){customElements.define("card-mod",f);const e=o(0);console.info(`%cCARD-MOD ${e.version} IS INSTALLED`,"color: green; font-weight: bold","")}function g(e,t,o=null){if((e=new Event(e,{bubbles:!0,cancelable:!1,composed:!0})).detail=t||{},o)o.dispatchEvent(e);else{var n=function(){var e=document.querySelector("hc-main");return e=e?(e=(e=(e=e&&e.shadowRoot)&&e.querySelector("hc-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-view")||e.querySelector("hui-panel-view"):(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=document.querySelector("home-assistant"))&&e.shadowRoot)&&e.querySelector("home-assistant-main"))&&e.shadowRoot)&&e.querySelector("app-drawer-layout partial-panel-resolver"))&&e.shadowRoot||e)&&e.querySelector("ha-panel-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-root"))&&e.shadowRoot)&&e.querySelector("ha-app-layout"))&&e.querySelector("#view"))&&e.firstElementChild}();n&&n.dispatchEvent(e)}}customElements.whenDefined("ha-card").then(()=>{const e=customElements.get("ha-card");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=function(e){return e.config?e.config:e._config?e._config:e.host?t(e.host):e.parentElement?t(e.parentElement):e.parentNode?t(e.parentNode):null},o=e.prototype.firstUpdated;e.prototype.firstUpdated=function(e){o&&o.bind(this)(e);const n=this.shadowRoot.querySelector(".card-header");n&&this.insertBefore(n,this.children[0]);const r=t(this);if(!r)return;r.class&&this.classList.add(r.class),r.type&&this.classList.add("type-"+r.type.replace(":","-"));(()=>{y(this,"card",r.style,{config:r},r.entity_ids,!1)})()},g("ll-rebuild",{})}),customElements.whenDefined("hui-entities-card").then(()=>{const e=customElements.get("hui-entities-card");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.renderEntity;e.prototype.renderEntity=function(e){const o=t.bind(this)(e);if(!e)return o;if(!o||!o.values)return o;const n=o.values[0];if(!n)return o;e.entity_ids;e.class&&n.classList.add(e.class);const r=()=>y(n,"row",e.style,{config:e},e.entity_ids);return r(),o.values[0]&&o.values[0].addEventListener("ll-rebuild",r),o},g("ll-rebuild",{})}),customElements.whenDefined("hui-glance-card").then(()=>{const e=customElements.get("hui-glance-card");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.firstUpdated;e.prototype.firstUpdated=function(e){t&&t.bind(this)(e);this.shadowRoot.querySelectorAll("ha-card div.entity").forEach(e=>{const t=e.attachShadow({mode:"open"});[...e.children].forEach(e=>t.appendChild(e));const o=document.createElement("style");t.appendChild(o),o.innerHTML="\n :host {\n box-sizing: border-box;\n padding: 0 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n cursor: pointer;\n margin-bottom: 12px;\n width: var(--glance-column-width, 20%);\n }\n div {\n width: 100%;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .name {\n min-height: var(--paper-font-body1_-_line-height, 20px);\n }\n state-badge {\n margin: 8px 0;\n }\n ";const n=e.config||e.entityConf;if(!n)return;n.entity_ids;n.class&&e.classList.add(n.class);y(e,"glance",n.style,{config:n},n.entity_ids)})},g("ll-rebuild",{})}),customElements.whenDefined("hui-state-label-badge").then(()=>{const e=customElements.get("hui-state-label-badge");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.firstUpdated;e.prototype.firstUpdated=function(e){t&&t.bind(this)(e);const o=this._config;if(!o)return;o.entity_ids;o.class&&this.classList.add(o.class);(()=>{y(this,"badge",o.style,{config:o},o.entity_ids)})()},g("ll-rebuild",{})}),customElements.whenDefined("hui-view").then(()=>{const e=customElements.get("hui-view");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.firstUpdated;e.prototype.firstUpdated=function(e){t&&t.bind(this)(e);(()=>{y(this,"view","",{},[])})()},g("ll-rebuild",{})}),customElements.whenDefined("hui-root").then(()=>{const e=customElements.get("hui-root");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.firstUpdated;e.prototype.firstUpdated=async function(e){t&&t.bind(this)(e);(()=>{y(this,"root","",{},[])})()},g("ll-rebuild",{});let o=document.querySelector("home-assistant");o=o&&o.shadowRoot,o=o&&o.querySelector("home-assistant-main"),o=o&&o.shadowRoot,o=o&&o.querySelector("app-drawer-layout partial-panel-resolver"),o=o&&o.querySelector("ha-panel-lovelace"),o=o&&o.shadowRoot,o=o&&o.querySelector("hui-root"),o&&o.firstUpdated()}),customElements.whenDefined("ha-more-info-dialog").then(()=>{const e=customElements.get("ha-more-info-dialog");if(e.prototype.cardmod_patched)return;e.prototype.cardmod_patched=!0;const t=e.prototype.showDialog;e.prototype.showDialog=function(e){const o=()=>{y(this.shadowRoot.querySelector("ha-dialog"),"more-info","",{config:e},[e.entityId],!1)};t.bind(this)(e),this.requestUpdate().then(async()=>{await this.shadowRoot.querySelector("ha-dialog").updateComplete,o()})};let o=document.querySelector("home-assistant");o=o&&o.shadowRoot,o=o&&o.querySelector("ha-more-info-dialog"),o&&(o.showDialog=e.prototype.showDialog.bind(o),o.showDialog({entityId:o.entityId}))});let w=window.cardHelpers;const _=new Promise(async(e,t)=>{w&&e();const o=async()=>{w=await window.loadCardHelpers(),window.cardHelpers=w,e()};window.loadCardHelpers?o():window.addEventListener("load",async()=>{!async function(){if(customElements.get("hui-view"))return!0;await customElements.whenDefined("partial-panel-resolver");const e=document.createElement("partial-panel-resolver");if(e.hass={panels:[{url_path:"tmp",component_name:"lovelace"}]},e._updateRoutes(),await e.routerOptions.routes.tmp.load(),!customElements.get("ha-panel-lovelace"))return!1;const t=document.createElement("ha-panel-lovelace");t.hass=a(),void 0===t.hass&&(await new Promise(e=>{window.addEventListener("connection-status",t=>{console.log(t),e()},{once:!0})}),t.hass=a()),t.panel={config:{mode:null}},t._fetchConfig()}(),window.loadCardHelpers&&o()})});function v(e,t){const o={type:"error",error:e,origConfig:t},n=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{const e=document.createElement("hui-error-card");e.setConfig(o),n.parentElement&&n.parentElement.replaceChild(e,n)}),_.then(()=>{g("ll-rebuild",{},n)}),n}function b(e,t){if(!t||"object"!=typeof t||!t.type)return v(`No ${e} type configured`,t);let o=t.type;if(o=o.startsWith("custom:")?o.substr("custom:".length):`hui-${o}-${e}`,customElements.get(o))return function(e,t){let o=document.createElement(e);try{o.setConfig(JSON.parse(JSON.stringify(t)))}catch(e){o=v(e,t)}return _.then(()=>{g("ll-rebuild",{},o)}),o}(o,t);const n=v(`Custom element doesn't exist: ${o}.`,t);n.style.display="None";const r=setTimeout(()=>{n.style.display=""},2e3);return customElements.whenDefined(o).then(()=>{clearTimeout(r),g("ll-rebuild",{},n)}),n}const S="\nha-card {\n background: none;\n box-shadow: none;\n}";customElements.define("mod-card",class extends n{static get properties(){return{hass:{}}}setConfig(e){this._config=JSON.parse(JSON.stringify(e)),void 0===e.style?this._config.style=S:"string"==typeof e.style?this._config.style=S+e.style:e.style["."]?this._config.style["."]=S+e.style["."]:this._config.style["."]=S,this.card=function(e){return w?w.createCardElement(e):b("card",e)}(this._config.card),this.card.hass=a()}render(){return r` + + ${this.card} + + `}set hass(e){this.card&&(this.card.hass=e)}getCardSize(){if(this._config.report_size)return this._config.report_size;let e=this.shadowRoot;return e&&(e=e.querySelector("ha-card card-maker")),e&&(e=e.getCardSize),e&&(e=e()),e||1}})}]); \ No newline at end of file diff --git a/www/community/lovelace-card-mod/card-mod.js.gz b/www/community/lovelace-card-mod/card-mod.js.gz new file mode 100644 index 0000000..cb1e60b Binary files /dev/null and b/www/community/lovelace-card-mod/card-mod.js.gz differ diff --git a/www/community/lovelace-card-mod/webpack.config.js b/www/community/lovelace-card-mod/webpack.config.js new file mode 100644 index 0000000..17ebf5b --- /dev/null +++ b/www/community/lovelace-card-mod/webpack.config.js @@ -0,0 +1,10 @@ +const path = require('path'); + +module.exports = { + entry: './src/main.js', + mode: 'production', + output: { + filename: 'card-mod.js', + path: path.resolve(__dirname) + } +}; diff --git a/www/community/lovelace-card-mod/webpack.config.js.gz b/www/community/lovelace-card-mod/webpack.config.js.gz new file mode 100644 index 0000000..872453f Binary files /dev/null and b/www/community/lovelace-card-mod/webpack.config.js.gz differ diff --git a/www/community/lovelace-fold-entity-row/fold-entity-row.js b/www/community/lovelace-fold-entity-row/fold-entity-row.js new file mode 100644 index 0000000..d0eab35 --- /dev/null +++ b/www/community/lovelace-fold-entity-row/fold-entity-row.js @@ -0,0 +1,46 @@ +!function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e){e.exports=JSON.parse('{"name":"fold-entity-row","private":true,"version":"19.0.0","description":"","scripts":{"build":"webpack","watch":"webpack --watch --mode=development","update-card-tools":"npm uninstall card-tools && npm install thomasloven/lovelace-card-tools"},"keywords":[],"author":"Thomas Lovén","license":"MIT","devDependencies":{"webpack":"^4.42.0","webpack-cli":"^3.3.11"},"dependencies":{"card-tools":"github:thomasloven/lovelace-card-tools"}}')},function(e,t,o){"use strict";o.r(t);const n=customElements.get("home-assistant-main")?Object.getPrototypeOf(customElements.get("home-assistant-main")):Object.getPrototypeOf(customElements.get("hui-view")),i=n.prototype.html,r=n.prototype.css;function s(){return document.querySelector("hc-main")?document.querySelector("hc-main").hass:document.querySelector("home-assistant")?document.querySelector("home-assistant").hass:void 0}function a(e,t,o=null){if((e=new Event(e,{bubbles:!0,cancelable:!1,composed:!0})).detail=t||{},o)o.dispatchEvent(e);else{var n=function(){var e=document.querySelector("hc-main");return e=e?(e=(e=(e=e&&e.shadowRoot)&&e.querySelector("hc-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-view")||e.querySelector("hui-panel-view"):(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=document.querySelector("home-assistant"))&&e.shadowRoot)&&e.querySelector("home-assistant-main"))&&e.shadowRoot)&&e.querySelector("app-drawer-layout partial-panel-resolver"))&&e.shadowRoot||e)&&e.querySelector("ha-panel-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-root"))&&e.shadowRoot)&&e.querySelector("ha-app-layout #view"))&&e.firstElementChild}();n&&n.dispatchEvent(e)}}const l=["input_number","input_select","input_text","scene","weblink"];let c=window.cardHelpers;const d=new Promise(async(e,t)=>{c&&e();const o=async()=>{c=await window.loadCardHelpers(),window.cardHelpers=c,e()};window.loadCardHelpers?o():window.addEventListener("load",async()=>{!function(){if(customElements.get("hui-view"))return!0;const e=document.createElement("partial-panel-resolver");if(e.hass=s(),!e.hass||!e.hass.panels)return!1;e.route={path:"/lovelace/"},e._updateRoutes();try{document.querySelector("home-assistant").appendChild(e)}catch(e){}finally{document.querySelector("home-assistant").removeChild(e)}customElements.get("hui-view")}(),window.loadCardHelpers&&o()})});function u(e,t){const o={type:"error",error:e,origConfig:t},n=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{const e=document.createElement("hui-error-card");e.setConfig(o),n.parentElement&&n.parentElement.replaceChild(e,n)}),d.then(()=>{a("ll-rebuild",{},n)}),n}function h(e,t){if(!t||"object"!=typeof t||!t.type)return u(`No ${e} type configured`,t);let o=t.type;if(o=o.startsWith("custom:")?o.substr("custom:".length):`hui-${o}-${e}`,customElements.get(o))return function(e,t){let o=document.createElement(e);try{o.setConfig(JSON.parse(JSON.stringify(t)))}catch(e){o=u(e,t)}return d.then(()=>{a("ll-rebuild",{},o)}),o}(o,t);const n=u(`Custom element doesn't exist: ${o}.`,t);n.style.display="None";const i=setTimeout(()=>{n.style.display=""},2e3);return customElements.whenDefined(o).then(()=>{clearTimeout(i),a("ll-rebuild",{},n)}),n}function p(e){if(c)return c.createRowElement(e);const t=new Set(["call-service","cast","conditional","divider","section","select","weblink"]),o={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",lock:"lock",media_player:"media-player",remote:"toggle",scene:"scene",script:"script",sensor:"sensor",timer:"timer",switch:"toggle",vacuum:"toggle",water_heater:"climate",input_datetime:"input-datetime",none:void 0};if(!e)return u("Invalid configuration given.",e);if("string"==typeof e&&(e={entity:e}),"object"!=typeof e||!e.entity&&!e.type)return u("Invalid configuration given.",e);const n=e.type||"default";return t.has(n)||n.startsWith("custom:")?h("row",e):h("entity-row",{type:o[e.entity?e.entity.split(".",1)[0]:"none"]||"text",...e})}class m extends n{static get properties(){return{open:Boolean,rows:{}}}setConfig(e){this._config=Object.assign({},{open:!1,padding:20,group_config:{}},e),this.open=this.open||this._config.open;let t=this._config.head;if(this._config.entity&&(t=this._config.entity),!t)throw new Error("No fold head specified");"string"==typeof t&&(t={entity:t});let o=this._config.items;if(void 0!==this._config.entities&&(o=this._config.entities),t.entity&&t.entity.startsWith("group.")&&void 0===o)o=s().states[t.entity].attributes.entity_id;else{if(void 0===o)throw new Error("No entities specified.");if(!o||void 0===o.length)throw new Error("Entities must be a list.")}const n=e=>("string"==typeof e&&(e={entity:e}),Object.assign({},this._config.group_config,e));this.head=p(t),this.head.hass=s(),this.head.addEventListener("click",e=>{this.hasMoreInfo(t)||t.tap_action||this.toggle(e)}),this.head.setAttribute("head","head"),this.applyStyle(this.head,t),"HUI-SECTION-ROW"===this.head.tagName&&customElements.whenDefined(this.head.localName).then(async()=>{await this.updateComplete,await this.head.updateComplete,this.head.shadowRoot.querySelector(".divider").style.marginRight="-56px"}),this.rows=o.map(e=>{const t=p(n(e));return t.hass=s(),this.hasMoreInfo(e)&&t.classList.add("state-card-dialog"),this.applyStyle(t,n(e)),t})}async applyStyle(e,t){if(!t.style)return;e.updateComplete&&await e.updateComplete;const o=document.createElement("card-mod");o.template={template:t.style,variables:{config:t},entity_ids:t.entity_ids},customElements.whenDefined(e.localName).then(()=>{e.shadowRoot&&e.shadowRoot.appendChild(o)})}toggle(e){e&&e.stopPropagation(),this.open=!this.open}hasMoreInfo(e){const t=e.entity||("string"==typeof e?e:null);return!(!t||l.includes(t.split(".",1)[0]))}set hass(e){this.rows.forEach(t=>t.hass=e),this.head.hass=e}render(){return i` + + +
+ ${this.rows} +
+ `}static get styles(){return r` + #head { + --toggle-icon-width: 40px; + display: flex; + cursor: pointer; + align-items: center; + } + #head :not(ha-icon) { + flex-grow: 1; + max-width: calc(100% - var(--toggle-icon-width)); + } + #head ha-icon { + width: var(--toggle-icon-width); + cursor: pointer + } + + #items { + padding: 0; + margin: 0; + overflow: hidden; + max-height: 0; + } + #items[open] { + overflow: visible; + max-height: none; + } + .state-card-dialog { + cursor: pointer; + } + `}}if(!customElements.get("fold-entity-row")){customElements.define("fold-entity-row",m);const e=o(0);console.info(`%cFOLD-ENTITY-ROW ${e.version} IS INSTALLED`,"color: green; font-weight: bold","")}}]); \ No newline at end of file diff --git a/www/community/lovelace-fold-entity-row/fold-entity-row.js.gz b/www/community/lovelace-fold-entity-row/fold-entity-row.js.gz new file mode 100644 index 0000000..f88d4fe Binary files /dev/null and b/www/community/lovelace-fold-entity-row/fold-entity-row.js.gz differ diff --git a/www/community/lovelace-fold-entity-row/webpack.config.js b/www/community/lovelace-fold-entity-row/webpack.config.js new file mode 100644 index 0000000..9572dd9 --- /dev/null +++ b/www/community/lovelace-fold-entity-row/webpack.config.js @@ -0,0 +1,10 @@ +const path = require('path'); + +module.exports = { + entry: './src/main.js', + mode: 'production', + output: { + filename: 'fold-entity-row.js', + path: path.resolve(__dirname) + } +}; diff --git a/www/community/lovelace-fold-entity-row/webpack.config.js.gz b/www/community/lovelace-fold-entity-row/webpack.config.js.gz new file mode 100644 index 0000000..847a6d2 Binary files /dev/null and b/www/community/lovelace-fold-entity-row/webpack.config.js.gz differ diff --git a/www/community/lovelace-layout-card/layout-card.js b/www/community/lovelace-layout-card/layout-card.js new file mode 100644 index 0000000..01736bf --- /dev/null +++ b/www/community/lovelace-layout-card/layout-card.js @@ -0,0 +1,92 @@ +!function(t){var e={};function i(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)i.d(n,o,function(e){return t[e]}.bind(null,o));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=5)}([function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ContentRect=function(t){if("getBBox"in t){var e=t.getBBox();return Object.freeze({height:e.height,left:0,top:0,width:e.width})}var i=window.getComputedStyle(t);return Object.freeze({height:parseFloat(i.height||"0"),left:parseFloat(i.paddingLeft||"0"),top:parseFloat(i.paddingTop||"0"),width:parseFloat(i.width||"0")})}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=i(2),o=i(3),r=[],s=function(){function t(t){this.$$observationTargets=[],this.$$activeTargets=[],this.$$skippedTargets=[];var e=function(t){if(void 0===t)return"Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.";if("function"!=typeof t)return"Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function."}(t);if(e)throw TypeError(e);this.$$callback=t,r.push(this)}return t.prototype.observe=function(t){var e=a("observe",t);if(e)throw TypeError(e);c(this.$$observationTargets,t)>0||(this.$$observationTargets.push(new n.ResizeObservation(t)),f())},t.prototype.unobserve=function(t){var e=a("unobserve",t);if(e)throw TypeError(e);var i=c(this.$$observationTargets,t);i<0||(this.$$observationTargets.splice(i,1),m())},t.prototype.disconnect=function(){this.$$observationTargets=[],this.$$activeTargets=[]},t}();function a(t,e){return void 0===e?"Failed to execute '"+t+"' on 'ResizeObserver': 1 argument required, but only 0 present.":e instanceof window.Element?void 0:"Failed to execute '"+t+"' on 'ResizeObserver': parameter 1 is not of type 'Element'."}function c(t,e){for(var i=0;it?e.$$activeTargets.push(i):e.$$skippedTargets.push(i))}))}))},u=function(){var t=1/0;return r.forEach((function(e){if(e.$$activeTargets.length){var i=[];e.$$activeTargets.forEach((function(e){var n=new o.ResizeObserverEntry(e.target);i.push(n),e.$$broadcastWidth=n.contentRect.width,e.$$broadcastHeight=n.contentRect.height;var r=h(e.target);r{c&&t();const i=async()=>{c=await window.loadCardHelpers(),window.cardHelpers=c,t()};window.loadCardHelpers?i():window.addEventListener("load",async()=>{!function(){if(customElements.get("hui-view"))return!0;const t=document.createElement("partial-panel-resolver");if(t.hass=s(),!t.hass||!t.hass.panels)return!1;t.route={path:"/lovelace/"},t._updateRoutes();try{document.querySelector("home-assistant").appendChild(t)}catch(t){}finally{document.querySelector("home-assistant").removeChild(t)}customElements.get("hui-view")}(),window.loadCardHelpers&&i()})});function d(t,e){const i={type:"error",error:t,origConfig:e},n=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{const t=document.createElement("hui-error-card");t.setConfig(i),n.parentElement&&n.parentElement.replaceChild(t,n)}),l.then(()=>{a("ll-rebuild",{},n)}),n}function u(t,e){if(!e||"object"!=typeof e||!e.type)return d(`No ${t} type configured`,e);let i=e.type;if(i=i.startsWith("custom:")?i.substr("custom:".length):`hui-${i}-${t}`,customElements.get(i))return function(t,e){let i=document.createElement(t);try{i.setConfig(JSON.parse(JSON.stringify(e)))}catch(t){i=d(t,e)}return l.then(()=>{a("ll-rebuild",{},i)}),i}(i,e);const n=d(`Custom element doesn't exist: ${i}.`,e);n.style.display="None";const o=setTimeout(()=>{n.style.display=""},2e3);return customElements.whenDefined(i).then(()=>{clearTimeout(o),a("ll-rebuild",{},n)}),n}const h=t=>"function"==typeof t.getCardSize?t.getCardSize():customElements.get(t.localName)?1:customElements.whenDefined(t.localName).then(()=>h(t)),p=async(t,e,i)=>{const n=t=>"string"==typeof t&&t.endsWith("%")?Math.floor(e*parseInt(t)/100):parseInt(t);let o=0;if("object"==typeof i.column_width){let t=e;for(;t>0;){let e=i.column_width[o];void 0===e&&(e=i.column_width.slice(-1)[0]),t-=n(e),o+=1}o=Math.max(o-1,1)}else o=Math.floor(e/n(i.column_width));o=Math.max(o,i.min_columns),o=Math.min(o,i.max_columns),"auto"===i.layout&&"docked"===s().dockedSidebar&&!window.matchMedia("(max-width: 870px)").matches&&i.sidebar_column&&(o-=1),o=Math.max(o,1);let r=[];for(let t=0;t{let n=0;for(const i of t){if(n+=1,!i)continue;const t=e[(n-1)%e.length];t.appendChild(i),t.length+=await h(i)}})(t,r);break;case"vertical":await(async(t,e,i)=>{let n=0;for(const i of t){if(!i){n+=1;continue}const t=e[n%e.length];t.appendChild(i),t.length+=await h(i)}})(t,r);break;case"auto":default:await(async(t,e,i)=>{function n(){let t=0;for(let n=0;nt.childElementCount>0),r};var f=i(1);class g extends n{static get properties(){return{hass:{},_config:{}}}async setConfig(t){this._config={layout:"auto",min_height:5,column_width:300,max_width:t.column_width||"500px",min_columns:t.column_num||1,max_columns:t.column_num||100,sidebar_column:!1,...t},this.cards=[],this.columns=[],this._layoutWidth=0}connectedCallback(){super.connectedCallback();let t=this.parentElement,e=10;for(;e--&&t;){if("HUI-PANEL-VIEW"===t.tagName)this.classList.add("panel");else if("HUI-VERTICAL-STACK-CARD"===t.tagName)this.classList.add("stacked");else if("DIV"!==t.tagName&&"root"!==t.id)break;t=t.parentElement?t.parentElement:t.getRootNode().host}}async firstUpdated(){window.addEventListener("location-changed",()=>{""===location.hash&&setTimeout(()=>this.updateSize(),100)}),this.resizer||(this.resizer=new f.ResizeObserver(()=>{this.updateSize()}),this.resizer.observe(this)),this.updateSize()}async updateSize(){let t=this.getBoundingClientRect().width;this.classList.contains("panel")&&!window.matchMedia("(max-width: 870px)").matches&&this._config.sidebar_column&&(this.hass&&"docked"===this.hass.dockedSidebar?t+=256:t+=64),t&&Math.abs(t-this._layoutWidth)>50&&(this._layoutWidth=t,this.resizer.disconnect(),await this.place_cards(),this.requestUpdate().then(()=>this.resizer.observe(this)))}async updated(t){if(!this.cards.length&&(this._config.entities&&this._config.entities.length||this._config.cards&&this._config.cards.length)){this.clientWidth;this.cards=await this.build_cards(),await this.place_cards(),this.requestUpdate()}if(t.has("hass")&&this.hass&&this.cards)for(const t of this.cards)t&&(t.hass=this.hass)}async build_card(t){if("break"===t){if("grid"===this._config.layout){const t=document.createElement("div");return this.shadowRoot.querySelector("#staging").appendChild(t),t}return null}const e={...t,...this._config.card_options},i=function(t){return c?c.createCardElement(t):u("card",t)}(e);return i.hass=s(),"grid"===this._config.layout&&(i.style.gridColumn=e.gridcol||"auto",i.style.gridRow=e.gridrow||"auto"),this.shadowRoot.querySelector("#staging").appendChild(i),new Promise((t,e)=>i.updateComplete?i.updateComplete.then(()=>t(i)):t(i))}async build_cards(){const t=this.shadowRoot.querySelector("#staging");for(;t.lastChild;)t.removeChild(t.lastChild);return Promise.all((this._config.entities||this._config.cards).map(t=>this.build_card(t)))}async place_cards(){"grid"!==this._config.layout&&this.cards.length&&(this.columns=await p(this.cards,this._layoutWidth||1,this._config),this._config.rtl&&this.columns.reverse(),this.format_columns())}format_columns(){const t=(t,e,i,n="px")=>{if(void 0===this._config[e])return"";let o=t+": ";const r=this._config[e];return"object"==typeof r?r.length>i?o+=""+r[i]:o+=""+r.slice(-1):o+=""+r,o.endsWith("px")||o.endsWith("%")||(o+=n),o+";"};for(const[e,i]of this.columns.entries()){const n=[t("max-width","max_width",e),t("min-width","min_width",e),t("width","column_width",e),t("flex-grow","flex_grow",e,"")];i.style.cssText="".concat(...n)}}getCardSize(){return this.columns&&this.columns.length?Math.max.apply(Math,this.columns.map(t=>t.length)):this._config.entities?2*this._config.entities.length:this._config.cards?2*this._config.cards.length:1}render(){return"grid"===this._config.layout?o` +
+ `:o` +
+ ${this.columns.map(t=>o` + ${t} + `)} +
+
+ `}static get styles(){return r` + :host { + padding: 0; + display: block; + margin-bottom: 0!important; + } + :host(.panel) { + padding: 0 4px; + margin-top: 8px; + } + :host(.panel.stacked:first-child) { + margin-top: 8px !important; + } + @media(max-width: 500px) { + :host(.panel) { + padding-left: 0px; + padding-right: 0px; + } + } + + #columns { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: -8px; + } + + .column { + flex-basis: 0; + flex-grow: 1; + overflow-x: hidden; + } + .column:first-child { + margin-left: -4px; + } + .column:last-child { + margin-right: -4px; + } + :host(.panel) .column { + margin: 0; + } + + + .cards>*, + .grid>* { + display: block; + margin: 4px 4px 8px; + } + .cards>*:first-child { + margin-top: 8px; + } + .cards>*:last-child { + margin-bottom: 4px; + } + @media(max-width: 500px) { + .cards:first-child>*, + .grid>* { + margin-left: 0px; + } + .cards:last-child>*, + .grid>* { + margin-right: 0px; + } + } + + #staging:not(.grid) { + visibility: hidden; + height: 0; + } + #staging.grid { + margin: 0 -4px; + } + `}get _cardModder(){return{target:this}}}if(!customElements.get("layout-card")){customElements.define("layout-card",g);const t=i(4);console.info(`%cLAYOUT-CARD ${t.version} IS INSTALLED`,"color: green; font-weight: bold","")}}]); \ No newline at end of file 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 0000000..4ac34e0 Binary files /dev/null and b/www/community/lovelace-layout-card/layout-card.js.gz differ diff --git a/www/community/lovelace-layout-card/webpack.config.js b/www/community/lovelace-layout-card/webpack.config.js new file mode 100644 index 0000000..e24daea --- /dev/null +++ b/www/community/lovelace-layout-card/webpack.config.js @@ -0,0 +1,10 @@ +const path = require('path'); + +module.exports = { + entry: './src/main.js', + mode: 'production', + output: { + filename: 'layout-card.js', + path: path.resolve(__dirname) + } +}; \ No newline at end of file diff --git a/www/community/lovelace-layout-card/webpack.config.js.gz b/www/community/lovelace-layout-card/webpack.config.js.gz new file mode 100644 index 0000000..4ff7d4b Binary files /dev/null and b/www/community/lovelace-layout-card/webpack.config.js.gz differ diff --git a/www/sidebar-order.yaml b/www/sidebar-order.yaml index 5a66098..467809f 100644 --- a/www/sidebar-order.yaml +++ b/www/sidebar-order.yaml @@ -8,6 +8,14 @@ order: hide: true - item: logbook hide: true + - item: 'Terminal' + hide: true + - item: 'Developer Tools' + hide: true + - item: 'Supervisor' + hide: true + - item: 'Configuration' + hide: true - item: 'Media Browser' hide: true - item: 'Visual Studio Code' @@ -18,18 +26,16 @@ order: hide: true - item: Setup icon: "mdi:vector-link" - bottom: true + hide: true - - new_item: true - item: Server Controls - href: /config/server_control - icon: "mdi:server" - bottom: true -# exceptions: -# - user: sysadmin -# base_order: true -# order: -# - item: map -# hide: false -# - item: developer tools -# hide: true + # - new_item: true + # item: Server Controls + # href: /config/server_control + # icon: "mdi:server" + # bottom: true +exceptions: + - user: sysadmin + base_order: true + order: + - item: Setup + bottom: true