diff --git a/.cache/brands/integrations/3_day_blinds/icon.png b/.cache/brands/integrations/3_day_blinds/icon.png new file mode 100644 index 0000000..d465b40 Binary files /dev/null and b/.cache/brands/integrations/3_day_blinds/icon.png differ diff --git a/.cache/brands/integrations/_placeholder/dark_icon.png b/.cache/brands/integrations/_placeholder/dark_icon.png new file mode 100644 index 0000000..02cc160 Binary files /dev/null and b/.cache/brands/integrations/_placeholder/dark_icon.png differ diff --git a/.cache/brands/integrations/abode/icon.png b/.cache/brands/integrations/abode/icon.png new file mode 100644 index 0000000..ad08a47 Binary files /dev/null and b/.cache/brands/integrations/abode/icon.png differ diff --git a/.cache/brands/integrations/acaia/icon.png b/.cache/brands/integrations/acaia/icon.png new file mode 100644 index 0000000..6f74cfa Binary files /dev/null and b/.cache/brands/integrations/acaia/icon.png differ diff --git a/.cache/brands/integrations/accuweather/icon.png b/.cache/brands/integrations/accuweather/icon.png new file mode 100644 index 0000000..a3c7dc1 Binary files /dev/null and b/.cache/brands/integrations/accuweather/icon.png differ diff --git a/.cache/brands/integrations/acomax/icon.png b/.cache/brands/integrations/acomax/icon.png new file mode 100644 index 0000000..7482ab8 Binary files /dev/null and b/.cache/brands/integrations/acomax/icon.png differ diff --git a/.cache/brands/integrations/actron_air/icon.png b/.cache/brands/integrations/actron_air/icon.png new file mode 100644 index 0000000..6c4ff72 Binary files /dev/null and b/.cache/brands/integrations/actron_air/icon.png differ diff --git a/.cache/brands/integrations/adax/icon.png b/.cache/brands/integrations/adax/icon.png new file mode 100644 index 0000000..f013ea6 Binary files /dev/null and b/.cache/brands/integrations/adax/icon.png differ diff --git a/.cache/brands/integrations/adguard/icon.png b/.cache/brands/integrations/adguard/icon.png new file mode 100644 index 0000000..0fed052 Binary files /dev/null and b/.cache/brands/integrations/adguard/icon.png differ diff --git a/.cache/brands/integrations/advantage_air/icon.png b/.cache/brands/integrations/advantage_air/icon.png new file mode 100644 index 0000000..ac2f2c9 Binary files /dev/null and b/.cache/brands/integrations/advantage_air/icon.png differ diff --git a/.cache/brands/integrations/aemet/icon.png b/.cache/brands/integrations/aemet/icon.png new file mode 100644 index 0000000..c73f97c Binary files /dev/null and b/.cache/brands/integrations/aemet/icon.png differ diff --git a/.cache/brands/integrations/aep_ohio/icon.png b/.cache/brands/integrations/aep_ohio/icon.png new file mode 100644 index 0000000..82f8ec2 Binary files /dev/null and b/.cache/brands/integrations/aep_ohio/icon.png differ diff --git a/.cache/brands/integrations/aep_texas/icon.png b/.cache/brands/integrations/aep_texas/icon.png new file mode 100644 index 0000000..424eca4 Binary files /dev/null and b/.cache/brands/integrations/aep_texas/icon.png differ diff --git a/.cache/brands/integrations/aftership/icon.png b/.cache/brands/integrations/aftership/icon.png new file mode 100644 index 0000000..8d26467 Binary files /dev/null and b/.cache/brands/integrations/aftership/icon.png differ diff --git a/.cache/brands/integrations/agent_dvr/icon.png b/.cache/brands/integrations/agent_dvr/icon.png new file mode 100644 index 0000000..481b927 Binary files /dev/null and b/.cache/brands/integrations/agent_dvr/icon.png differ diff --git a/.cache/brands/integrations/ai_task/dark_icon.png b/.cache/brands/integrations/ai_task/dark_icon.png new file mode 100644 index 0000000..5461512 Binary files /dev/null and b/.cache/brands/integrations/ai_task/dark_icon.png differ diff --git a/.cache/brands/integrations/ai_task/icon.png b/.cache/brands/integrations/ai_task/icon.png new file mode 100644 index 0000000..5461512 Binary files /dev/null and b/.cache/brands/integrations/ai_task/icon.png differ diff --git a/.cache/brands/integrations/airq/icon.png b/.cache/brands/integrations/airq/icon.png new file mode 100644 index 0000000..98918d0 Binary files /dev/null and b/.cache/brands/integrations/airq/icon.png differ diff --git a/.cache/brands/integrations/airtouch4/dark_icon.png b/.cache/brands/integrations/airtouch4/dark_icon.png new file mode 100644 index 0000000..9e174a1 Binary files /dev/null and b/.cache/brands/integrations/airtouch4/dark_icon.png differ diff --git a/.cache/brands/integrations/airtouch5/dark_icon.png b/.cache/brands/integrations/airtouch5/dark_icon.png new file mode 100644 index 0000000..f366d23 Binary files /dev/null and b/.cache/brands/integrations/airtouch5/dark_icon.png differ diff --git a/.cache/brands/integrations/airvisual/dark_icon.png b/.cache/brands/integrations/airvisual/dark_icon.png new file mode 100644 index 0000000..1280f76 Binary files /dev/null and b/.cache/brands/integrations/airvisual/dark_icon.png differ diff --git a/.cache/brands/integrations/airzone/dark_icon.png b/.cache/brands/integrations/airzone/dark_icon.png new file mode 100644 index 0000000..e93ef6f Binary files /dev/null and b/.cache/brands/integrations/airzone/dark_icon.png differ diff --git a/.cache/brands/integrations/aladdin_connect/dark_icon.png b/.cache/brands/integrations/aladdin_connect/dark_icon.png new file mode 100644 index 0000000..ae9803d Binary files /dev/null and b/.cache/brands/integrations/aladdin_connect/dark_icon.png differ diff --git a/.cache/brands/integrations/alarmdecoder/dark_icon.png b/.cache/brands/integrations/alarmdecoder/dark_icon.png new file mode 100644 index 0000000..b82680b Binary files /dev/null and b/.cache/brands/integrations/alarmdecoder/dark_icon.png differ diff --git a/.cache/brands/integrations/altruist/dark_icon.png b/.cache/brands/integrations/altruist/dark_icon.png new file mode 100644 index 0000000..419ba1f Binary files /dev/null and b/.cache/brands/integrations/altruist/dark_icon.png differ diff --git a/.cache/brands/integrations/amazon/dark_icon.png b/.cache/brands/integrations/amazon/dark_icon.png new file mode 100644 index 0000000..1e6fc76 Binary files /dev/null and b/.cache/brands/integrations/amazon/dark_icon.png differ diff --git a/.cache/brands/integrations/amberelectric/dark_icon.png b/.cache/brands/integrations/amberelectric/dark_icon.png new file mode 100644 index 0000000..52718b4 Binary files /dev/null and b/.cache/brands/integrations/amberelectric/dark_icon.png differ diff --git a/.cache/brands/integrations/ambient_weather/dark_icon.png b/.cache/brands/integrations/ambient_weather/dark_icon.png new file mode 100644 index 0000000..7e0b302 Binary files /dev/null and b/.cache/brands/integrations/ambient_weather/dark_icon.png differ diff --git a/.cache/brands/integrations/american_standard/dark_icon.png b/.cache/brands/integrations/american_standard/dark_icon.png new file mode 100644 index 0000000..e69de29 diff --git a/.cache/brands/integrations/amp_motorization/dark_icon.png b/.cache/brands/integrations/amp_motorization/dark_icon.png new file mode 100644 index 0000000..2422e11 Binary files /dev/null and b/.cache/brands/integrations/amp_motorization/dark_icon.png differ diff --git a/.cache/brands/integrations/analytics_insights/dark_icon.png b/.cache/brands/integrations/analytics_insights/dark_icon.png new file mode 100644 index 0000000..e411a7b Binary files /dev/null and b/.cache/brands/integrations/analytics_insights/dark_icon.png differ diff --git a/.cache/brands/integrations/android_ip_webcam/dark_icon.png b/.cache/brands/integrations/android_ip_webcam/dark_icon.png new file mode 100644 index 0000000..e8e1d4b Binary files /dev/null and b/.cache/brands/integrations/android_ip_webcam/dark_icon.png differ diff --git a/.cache/brands/integrations/androidtv/dark_icon.png b/.cache/brands/integrations/androidtv/dark_icon.png new file mode 100644 index 0000000..404a84d Binary files /dev/null and b/.cache/brands/integrations/androidtv/dark_icon.png differ diff --git a/.cache/brands/integrations/anglian_water/dark_icon.png b/.cache/brands/integrations/anglian_water/dark_icon.png new file mode 100644 index 0000000..48cf5fc Binary files /dev/null and b/.cache/brands/integrations/anglian_water/dark_icon.png differ diff --git a/.cache/brands/integrations/anniversary/dark_icon@2x.png b/.cache/brands/integrations/anniversary/dark_icon@2x.png new file mode 100644 index 0000000..9a90fee Binary files /dev/null and b/.cache/brands/integrations/anniversary/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/anova/dark_icon.png b/.cache/brands/integrations/anova/dark_icon.png new file mode 100644 index 0000000..c187f17 Binary files /dev/null and b/.cache/brands/integrations/anova/dark_icon.png differ diff --git a/.cache/brands/integrations/anthemav/dark_icon.png b/.cache/brands/integrations/anthemav/dark_icon.png new file mode 100644 index 0000000..5a5d9cf Binary files /dev/null and b/.cache/brands/integrations/anthemav/dark_icon.png differ diff --git a/.cache/brands/integrations/anthropic/dark_icon.png b/.cache/brands/integrations/anthropic/dark_icon.png new file mode 100644 index 0000000..d381758 Binary files /dev/null and b/.cache/brands/integrations/anthropic/dark_icon.png differ diff --git a/.cache/brands/integrations/anwb_energie/dark_icon.png b/.cache/brands/integrations/anwb_energie/dark_icon.png new file mode 100644 index 0000000..e69de29 diff --git a/.cache/brands/integrations/aosmith/icon.png b/.cache/brands/integrations/aosmith/icon.png new file mode 100644 index 0000000..2f88de7 Binary files /dev/null and b/.cache/brands/integrations/aosmith/icon.png differ diff --git a/.cache/brands/integrations/apcupsd/dark_icon.png b/.cache/brands/integrations/apcupsd/dark_icon.png new file mode 100644 index 0000000..7a9b835 Binary files /dev/null and b/.cache/brands/integrations/apcupsd/dark_icon.png differ diff --git a/.cache/brands/integrations/apollo_automation/dark_icon.png b/.cache/brands/integrations/apollo_automation/dark_icon.png new file mode 100644 index 0000000..4c14895 Binary files /dev/null and b/.cache/brands/integrations/apollo_automation/dark_icon.png differ diff --git a/.cache/brands/integrations/appalachianpower/dark_icon.png b/.cache/brands/integrations/appalachianpower/dark_icon.png new file mode 100644 index 0000000..ceca892 Binary files /dev/null and b/.cache/brands/integrations/appalachianpower/dark_icon.png differ diff --git a/.cache/brands/integrations/apple/dark_icon.png b/.cache/brands/integrations/apple/dark_icon.png new file mode 100644 index 0000000..fb868dc Binary files /dev/null and b/.cache/brands/integrations/apple/dark_icon.png differ diff --git a/.cache/brands/integrations/aprilaire/dark_icon.png b/.cache/brands/integrations/aprilaire/dark_icon.png new file mode 100644 index 0000000..c7a5546 Binary files /dev/null and b/.cache/brands/integrations/aprilaire/dark_icon.png differ diff --git a/.cache/brands/integrations/apsystems/dark_icon.png b/.cache/brands/integrations/apsystems/dark_icon.png new file mode 100644 index 0000000..fe43f60 Binary files /dev/null and b/.cache/brands/integrations/apsystems/dark_icon.png differ diff --git a/.cache/brands/integrations/aqara/dark_icon.png b/.cache/brands/integrations/aqara/dark_icon.png new file mode 100644 index 0000000..9ea494a Binary files /dev/null and b/.cache/brands/integrations/aqara/dark_icon.png differ diff --git a/.cache/brands/integrations/aquacell/dark_icon.png b/.cache/brands/integrations/aquacell/dark_icon.png new file mode 100644 index 0000000..1301b7b Binary files /dev/null and b/.cache/brands/integrations/aquacell/dark_icon.png differ diff --git a/.cache/brands/integrations/aranet/dark_icon.png b/.cache/brands/integrations/aranet/dark_icon.png new file mode 100644 index 0000000..5df7e39 Binary files /dev/null and b/.cache/brands/integrations/aranet/dark_icon.png differ diff --git a/.cache/brands/integrations/arcam_fmj/dark_icon.png b/.cache/brands/integrations/arcam_fmj/dark_icon.png new file mode 100644 index 0000000..daff2eb Binary files /dev/null and b/.cache/brands/integrations/arcam_fmj/dark_icon.png differ diff --git a/.cache/brands/integrations/artsound/dark_icon.png b/.cache/brands/integrations/artsound/dark_icon.png new file mode 100644 index 0000000..383a892 Binary files /dev/null and b/.cache/brands/integrations/artsound/dark_icon.png differ diff --git a/.cache/brands/integrations/aruba/dark_icon.png b/.cache/brands/integrations/aruba/dark_icon.png new file mode 100644 index 0000000..dd0ef75 Binary files /dev/null and b/.cache/brands/integrations/aruba/dark_icon.png differ diff --git a/.cache/brands/integrations/arve/dark_icon.png b/.cache/brands/integrations/arve/dark_icon.png new file mode 100644 index 0000000..837e39e Binary files /dev/null and b/.cache/brands/integrations/arve/dark_icon.png differ diff --git a/.cache/brands/integrations/aseko_pool_live/dark_icon.png b/.cache/brands/integrations/aseko_pool_live/dark_icon.png new file mode 100644 index 0000000..b66361c Binary files /dev/null and b/.cache/brands/integrations/aseko_pool_live/dark_icon.png differ diff --git a/.cache/brands/integrations/asuswrt/dark_icon.png b/.cache/brands/integrations/asuswrt/dark_icon.png new file mode 100644 index 0000000..f9a7909 Binary files /dev/null and b/.cache/brands/integrations/asuswrt/dark_icon.png differ diff --git a/.cache/brands/integrations/atag/dark_icon.png b/.cache/brands/integrations/atag/dark_icon.png new file mode 100644 index 0000000..2ce6b94 Binary files /dev/null and b/.cache/brands/integrations/atag/dark_icon.png differ diff --git a/.cache/brands/integrations/atlanticcityelectric/dark_icon.png b/.cache/brands/integrations/atlanticcityelectric/dark_icon.png new file mode 100644 index 0000000..c808a40 Binary files /dev/null and b/.cache/brands/integrations/atlanticcityelectric/dark_icon.png differ diff --git a/.cache/brands/integrations/august/dark_icon.png b/.cache/brands/integrations/august/dark_icon.png new file mode 100644 index 0000000..2bfe9cd Binary files /dev/null and b/.cache/brands/integrations/august/dark_icon.png differ diff --git a/.cache/brands/integrations/aurora/dark_icon.png b/.cache/brands/integrations/aurora/dark_icon.png new file mode 100644 index 0000000..d657ee1 Binary files /dev/null and b/.cache/brands/integrations/aurora/dark_icon.png differ diff --git a/.cache/brands/integrations/aurora_abb_powerone/dark_icon.png b/.cache/brands/integrations/aurora_abb_powerone/dark_icon.png new file mode 100644 index 0000000..d2b80e3 Binary files /dev/null and b/.cache/brands/integrations/aurora_abb_powerone/dark_icon.png differ diff --git a/.cache/brands/integrations/aussie_broadband/dark_icon.png b/.cache/brands/integrations/aussie_broadband/dark_icon.png new file mode 100644 index 0000000..0b32b43 Binary files /dev/null and b/.cache/brands/integrations/aussie_broadband/dark_icon.png differ diff --git a/.cache/brands/integrations/autarco/dark_icon.png b/.cache/brands/integrations/autarco/dark_icon.png new file mode 100644 index 0000000..0958f65 Binary files /dev/null and b/.cache/brands/integrations/autarco/dark_icon.png differ diff --git a/.cache/brands/integrations/autoskope/dark_icon.png b/.cache/brands/integrations/autoskope/dark_icon.png new file mode 100644 index 0000000..5f774ae Binary files /dev/null and b/.cache/brands/integrations/autoskope/dark_icon.png differ diff --git a/.cache/brands/integrations/awair/dark_icon.png b/.cache/brands/integrations/awair/dark_icon.png new file mode 100644 index 0000000..57b234f Binary files /dev/null and b/.cache/brands/integrations/awair/dark_icon.png differ diff --git a/.cache/brands/integrations/axis/dark_icon.png b/.cache/brands/integrations/axis/dark_icon.png new file mode 100644 index 0000000..17cc8ec Binary files /dev/null and b/.cache/brands/integrations/axis/dark_icon.png differ diff --git a/.cache/brands/integrations/backblaze_b2/dark_icon.png b/.cache/brands/integrations/backblaze_b2/dark_icon.png new file mode 100644 index 0000000..c3de452 Binary files /dev/null and b/.cache/brands/integrations/backblaze_b2/dark_icon.png differ diff --git a/.cache/brands/integrations/baf/dark_icon.png b/.cache/brands/integrations/baf/dark_icon.png new file mode 100644 index 0000000..43d2b42 Binary files /dev/null and b/.cache/brands/integrations/baf/dark_icon.png differ diff --git a/.cache/brands/integrations/balay/dark_icon.png b/.cache/brands/integrations/balay/dark_icon.png new file mode 100644 index 0000000..baee084 Binary files /dev/null and b/.cache/brands/integrations/balay/dark_icon.png differ diff --git a/.cache/brands/integrations/balay/icon.png b/.cache/brands/integrations/balay/icon.png new file mode 100644 index 0000000..baee084 Binary files /dev/null and b/.cache/brands/integrations/balay/icon.png differ diff --git a/.cache/brands/integrations/balboa/dark_icon.png b/.cache/brands/integrations/balboa/dark_icon.png new file mode 100644 index 0000000..5830d6d Binary files /dev/null and b/.cache/brands/integrations/balboa/dark_icon.png differ diff --git a/.cache/brands/integrations/bang_olufsen/dark_icon.png b/.cache/brands/integrations/bang_olufsen/dark_icon.png new file mode 100644 index 0000000..3bcb41a Binary files /dev/null and b/.cache/brands/integrations/bang_olufsen/dark_icon.png differ diff --git a/.cache/brands/integrations/bauknecht/dark_icon.png b/.cache/brands/integrations/bauknecht/dark_icon.png new file mode 100644 index 0000000..bdc3347 Binary files /dev/null and b/.cache/brands/integrations/bauknecht/dark_icon.png differ diff --git a/.cache/brands/integrations/bauknecht/icon.png b/.cache/brands/integrations/bauknecht/icon.png new file mode 100644 index 0000000..bdc3347 Binary files /dev/null and b/.cache/brands/integrations/bauknecht/icon.png differ diff --git a/.cache/brands/integrations/bayesian/dark_icon.png b/.cache/brands/integrations/bayesian/dark_icon.png new file mode 100644 index 0000000..aae7777 Binary files /dev/null and b/.cache/brands/integrations/bayesian/dark_icon.png differ diff --git a/.cache/brands/integrations/bayesian/icon.png b/.cache/brands/integrations/bayesian/icon.png new file mode 100644 index 0000000..aae7777 Binary files /dev/null and b/.cache/brands/integrations/bayesian/icon.png differ diff --git a/.cache/brands/integrations/bega/dark_icon.png b/.cache/brands/integrations/bega/dark_icon.png new file mode 100644 index 0000000..f1f2a39 Binary files /dev/null and b/.cache/brands/integrations/bega/dark_icon.png differ diff --git a/.cache/brands/integrations/bega/icon.png b/.cache/brands/integrations/bega/icon.png new file mode 100644 index 0000000..f1f2a39 Binary files /dev/null and b/.cache/brands/integrations/bega/icon.png differ diff --git a/.cache/brands/integrations/bge/dark_icon.png b/.cache/brands/integrations/bge/dark_icon.png new file mode 100644 index 0000000..ba6f8a5 Binary files /dev/null and b/.cache/brands/integrations/bge/dark_icon.png differ diff --git a/.cache/brands/integrations/blebox/dark_icon.png b/.cache/brands/integrations/blebox/dark_icon.png new file mode 100644 index 0000000..ebd5c26 Binary files /dev/null and b/.cache/brands/integrations/blebox/dark_icon.png differ diff --git a/.cache/brands/integrations/blink/dark_icon.png b/.cache/brands/integrations/blink/dark_icon.png new file mode 100644 index 0000000..17f545e Binary files /dev/null and b/.cache/brands/integrations/blink/dark_icon.png differ diff --git a/.cache/brands/integrations/blink/icon.png b/.cache/brands/integrations/blink/icon.png new file mode 100644 index 0000000..17f545e Binary files /dev/null and b/.cache/brands/integrations/blink/icon.png differ diff --git a/.cache/brands/integrations/bliss_automation/dark_icon.png b/.cache/brands/integrations/bliss_automation/dark_icon.png new file mode 100644 index 0000000..4336d2d Binary files /dev/null and b/.cache/brands/integrations/bliss_automation/dark_icon.png differ diff --git a/.cache/brands/integrations/bliss_automation/icon.png b/.cache/brands/integrations/bliss_automation/icon.png new file mode 100644 index 0000000..4336d2d Binary files /dev/null and b/.cache/brands/integrations/bliss_automation/icon.png differ diff --git a/.cache/brands/integrations/bloc_blinds/dark_icon.png b/.cache/brands/integrations/bloc_blinds/dark_icon.png new file mode 100644 index 0000000..b6ad74f Binary files /dev/null and b/.cache/brands/integrations/bloc_blinds/dark_icon.png differ diff --git a/.cache/brands/integrations/bloc_blinds/icon.png b/.cache/brands/integrations/bloc_blinds/icon.png new file mode 100644 index 0000000..b6ad74f Binary files /dev/null and b/.cache/brands/integrations/bloc_blinds/icon.png differ diff --git a/.cache/brands/integrations/blue_current/dark_icon.png b/.cache/brands/integrations/blue_current/dark_icon.png new file mode 100644 index 0000000..6fef144 Binary files /dev/null and b/.cache/brands/integrations/blue_current/dark_icon.png differ diff --git a/.cache/brands/integrations/bluemaestro/dark_icon.png b/.cache/brands/integrations/bluemaestro/dark_icon.png new file mode 100644 index 0000000..87c4ab9 Binary files /dev/null and b/.cache/brands/integrations/bluemaestro/dark_icon.png differ diff --git a/.cache/brands/integrations/bluemaestro/icon.png b/.cache/brands/integrations/bluemaestro/icon.png new file mode 100644 index 0000000..87c4ab9 Binary files /dev/null and b/.cache/brands/integrations/bluemaestro/icon.png differ diff --git a/.cache/brands/integrations/bluesound/dark_icon.png b/.cache/brands/integrations/bluesound/dark_icon.png new file mode 100644 index 0000000..838f47e Binary files /dev/null and b/.cache/brands/integrations/bluesound/dark_icon.png differ diff --git a/.cache/brands/integrations/bluesound/icon.png b/.cache/brands/integrations/bluesound/icon.png new file mode 100644 index 0000000..838f47e Binary files /dev/null and b/.cache/brands/integrations/bluesound/icon.png differ diff --git a/.cache/brands/integrations/bluetooth/dark_icon@2x.png b/.cache/brands/integrations/bluetooth/dark_icon@2x.png new file mode 100644 index 0000000..eb00398 Binary files /dev/null and b/.cache/brands/integrations/bluetooth/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/bluetooth/dark_logo.png b/.cache/brands/integrations/bluetooth/dark_logo.png new file mode 100644 index 0000000..4ee2e08 Binary files /dev/null and b/.cache/brands/integrations/bluetooth/dark_logo.png differ diff --git a/.cache/brands/integrations/bond/dark_icon.png b/.cache/brands/integrations/bond/dark_icon.png new file mode 100644 index 0000000..5ef7432 Binary files /dev/null and b/.cache/brands/integrations/bond/dark_icon.png differ diff --git a/.cache/brands/integrations/bond/icon.png b/.cache/brands/integrations/bond/icon.png new file mode 100644 index 0000000..5ef7432 Binary files /dev/null and b/.cache/brands/integrations/bond/icon.png differ diff --git a/.cache/brands/integrations/bosch/dark_icon.png b/.cache/brands/integrations/bosch/dark_icon.png new file mode 100644 index 0000000..0519809 Binary files /dev/null and b/.cache/brands/integrations/bosch/dark_icon.png differ diff --git a/.cache/brands/integrations/bosch/icon.png b/.cache/brands/integrations/bosch/icon.png new file mode 100644 index 0000000..de3d30d Binary files /dev/null and b/.cache/brands/integrations/bosch/icon.png differ diff --git a/.cache/brands/integrations/brandt/dark_icon.png b/.cache/brands/integrations/brandt/dark_icon.png new file mode 100644 index 0000000..3818483 Binary files /dev/null and b/.cache/brands/integrations/brandt/dark_icon.png differ diff --git a/.cache/brands/integrations/bring/dark_icon.png b/.cache/brands/integrations/bring/dark_icon.png new file mode 100644 index 0000000..aabd541 Binary files /dev/null and b/.cache/brands/integrations/bring/dark_icon.png differ diff --git a/.cache/brands/integrations/bring/icon.png b/.cache/brands/integrations/bring/icon.png new file mode 100644 index 0000000..4450cea Binary files /dev/null and b/.cache/brands/integrations/bring/icon.png differ diff --git a/.cache/brands/integrations/broadlink/dark_icon.png b/.cache/brands/integrations/broadlink/dark_icon.png new file mode 100644 index 0000000..a9bbb2a Binary files /dev/null and b/.cache/brands/integrations/broadlink/dark_icon.png differ diff --git a/.cache/brands/integrations/broadlink/icon.png b/.cache/brands/integrations/broadlink/icon.png new file mode 100644 index 0000000..a9bbb2a Binary files /dev/null and b/.cache/brands/integrations/broadlink/icon.png differ diff --git a/.cache/brands/integrations/brottsplatskartan/dark_icon.png b/.cache/brands/integrations/brottsplatskartan/dark_icon.png new file mode 100644 index 0000000..93b8ae9 Binary files /dev/null and b/.cache/brands/integrations/brottsplatskartan/dark_icon.png differ diff --git a/.cache/brands/integrations/brottsplatskartan/icon.png b/.cache/brands/integrations/brottsplatskartan/icon.png new file mode 100644 index 0000000..93b8ae9 Binary files /dev/null and b/.cache/brands/integrations/brottsplatskartan/icon.png differ diff --git a/.cache/brands/integrations/brunt/dark_icon.png b/.cache/brands/integrations/brunt/dark_icon.png new file mode 100644 index 0000000..50880fd Binary files /dev/null and b/.cache/brands/integrations/brunt/dark_icon.png differ diff --git a/.cache/brands/integrations/bryant_evolution/dark_icon.png b/.cache/brands/integrations/bryant_evolution/dark_icon.png new file mode 100644 index 0000000..56dff21 Binary files /dev/null and b/.cache/brands/integrations/bryant_evolution/dark_icon.png differ diff --git a/.cache/brands/integrations/bsblan/dark_icon.png b/.cache/brands/integrations/bsblan/dark_icon.png new file mode 100644 index 0000000..6078063 Binary files /dev/null and b/.cache/brands/integrations/bsblan/dark_icon.png differ diff --git a/.cache/brands/integrations/bsblan/icon.png b/.cache/brands/integrations/bsblan/icon.png new file mode 100644 index 0000000..a38ef35 Binary files /dev/null and b/.cache/brands/integrations/bsblan/icon.png differ diff --git a/.cache/brands/integrations/bswitch/dark_icon.png b/.cache/brands/integrations/bswitch/dark_icon.png new file mode 100644 index 0000000..f4c293a Binary files /dev/null and b/.cache/brands/integrations/bswitch/dark_icon.png differ diff --git a/.cache/brands/integrations/bswitch/icon.png b/.cache/brands/integrations/bswitch/icon.png new file mode 100644 index 0000000..f4c293a Binary files /dev/null and b/.cache/brands/integrations/bswitch/icon.png differ diff --git a/.cache/brands/integrations/bthome/dark_icon.png b/.cache/brands/integrations/bthome/dark_icon.png new file mode 100644 index 0000000..3079633 Binary files /dev/null and b/.cache/brands/integrations/bthome/dark_icon.png differ diff --git a/.cache/brands/integrations/bthome/icon.png b/.cache/brands/integrations/bthome/icon.png new file mode 100644 index 0000000..6738b06 Binary files /dev/null and b/.cache/brands/integrations/bthome/icon.png differ diff --git a/.cache/brands/integrations/bticino/dark_icon.png b/.cache/brands/integrations/bticino/dark_icon.png new file mode 100644 index 0000000..30669a1 Binary files /dev/null and b/.cache/brands/integrations/bticino/dark_icon.png differ diff --git a/.cache/brands/integrations/bticino/icon.png b/.cache/brands/integrations/bticino/icon.png new file mode 100644 index 0000000..30669a1 Binary files /dev/null and b/.cache/brands/integrations/bticino/icon.png differ diff --git a/.cache/brands/integrations/bubendorff/dark_icon.png b/.cache/brands/integrations/bubendorff/dark_icon.png new file mode 100644 index 0000000..604689f Binary files /dev/null and b/.cache/brands/integrations/bubendorff/dark_icon.png differ diff --git a/.cache/brands/integrations/bubendorff/icon.png b/.cache/brands/integrations/bubendorff/icon.png new file mode 100644 index 0000000..604689f Binary files /dev/null and b/.cache/brands/integrations/bubendorff/icon.png differ diff --git a/.cache/brands/integrations/buienradar/dark_icon.png b/.cache/brands/integrations/buienradar/dark_icon.png new file mode 100644 index 0000000..48b4efa Binary files /dev/null and b/.cache/brands/integrations/buienradar/dark_icon.png differ diff --git a/.cache/brands/integrations/buienradar/icon.png b/.cache/brands/integrations/buienradar/icon.png new file mode 100644 index 0000000..48b4efa Binary files /dev/null and b/.cache/brands/integrations/buienradar/icon.png differ diff --git a/.cache/brands/integrations/burbank_water_and_power/dark_icon.png b/.cache/brands/integrations/burbank_water_and_power/dark_icon.png new file mode 100644 index 0000000..7e685cf Binary files /dev/null and b/.cache/brands/integrations/burbank_water_and_power/dark_icon.png differ diff --git a/.cache/brands/integrations/byd_vehicle/dark_icon.png b/.cache/brands/integrations/byd_vehicle/dark_icon.png new file mode 100644 index 0000000..a86a688 Binary files /dev/null and b/.cache/brands/integrations/byd_vehicle/dark_icon.png differ diff --git a/.cache/brands/integrations/byd_vehicle/dark_icon@2x.png b/.cache/brands/integrations/byd_vehicle/dark_icon@2x.png new file mode 100644 index 0000000..ebcd336 Binary files /dev/null and b/.cache/brands/integrations/byd_vehicle/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/byd_vehicle/dark_logo.png b/.cache/brands/integrations/byd_vehicle/dark_logo.png new file mode 100644 index 0000000..d36c311 Binary files /dev/null and b/.cache/brands/integrations/byd_vehicle/dark_logo.png differ diff --git a/.cache/brands/integrations/byd_vehicle/icon.png b/.cache/brands/integrations/byd_vehicle/icon.png new file mode 100644 index 0000000..a86a688 Binary files /dev/null and b/.cache/brands/integrations/byd_vehicle/icon.png differ diff --git a/.cache/brands/integrations/caldav/dark_icon.png b/.cache/brands/integrations/caldav/dark_icon.png new file mode 100644 index 0000000..f179f07 Binary files /dev/null and b/.cache/brands/integrations/caldav/dark_icon.png differ diff --git a/.cache/brands/integrations/cambridge_audio/dark_icon.png b/.cache/brands/integrations/cambridge_audio/dark_icon.png new file mode 100644 index 0000000..db634b1 Binary files /dev/null and b/.cache/brands/integrations/cambridge_audio/dark_icon.png differ diff --git a/.cache/brands/integrations/camera/dark_icon.png b/.cache/brands/integrations/camera/dark_icon.png new file mode 100644 index 0000000..69a2a57 Binary files /dev/null and b/.cache/brands/integrations/camera/dark_icon.png differ diff --git a/.cache/brands/integrations/camera/icon.png b/.cache/brands/integrations/camera/icon.png new file mode 100644 index 0000000..69a2a57 Binary files /dev/null and b/.cache/brands/integrations/camera/icon.png differ diff --git a/.cache/brands/integrations/canary/dark_icon.png b/.cache/brands/integrations/canary/dark_icon.png new file mode 100644 index 0000000..2a9cfc0 Binary files /dev/null and b/.cache/brands/integrations/canary/dark_icon.png differ diff --git a/.cache/brands/integrations/casper_glow/dark_icon.png b/.cache/brands/integrations/casper_glow/dark_icon.png new file mode 100644 index 0000000..4bc8c54 Binary files /dev/null and b/.cache/brands/integrations/casper_glow/dark_icon.png differ diff --git a/.cache/brands/integrations/cast/dark_icon@2x.png b/.cache/brands/integrations/cast/dark_icon@2x.png new file mode 100644 index 0000000..43b37a3 Binary files /dev/null and b/.cache/brands/integrations/cast/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/cast/dark_logo.png b/.cache/brands/integrations/cast/dark_logo.png new file mode 100644 index 0000000..b2c0c2f Binary files /dev/null and b/.cache/brands/integrations/cast/dark_logo.png differ diff --git a/.cache/brands/integrations/cert_expiry/dark_icon.png b/.cache/brands/integrations/cert_expiry/dark_icon.png new file mode 100644 index 0000000..b519595 Binary files /dev/null and b/.cache/brands/integrations/cert_expiry/dark_icon.png differ diff --git a/.cache/brands/integrations/chacon_dio/dark_icon.png b/.cache/brands/integrations/chacon_dio/dark_icon.png new file mode 100644 index 0000000..1a95f54 Binary files /dev/null and b/.cache/brands/integrations/chacon_dio/dark_icon.png differ diff --git a/.cache/brands/integrations/chess_com/dark_icon.png b/.cache/brands/integrations/chess_com/dark_icon.png new file mode 100644 index 0000000..1c67885 Binary files /dev/null and b/.cache/brands/integrations/chess_com/dark_icon.png differ diff --git a/.cache/brands/integrations/cisco/dark_icon.png b/.cache/brands/integrations/cisco/dark_icon.png new file mode 100644 index 0000000..3f88ee5 Binary files /dev/null and b/.cache/brands/integrations/cisco/dark_icon.png differ diff --git a/.cache/brands/integrations/clicksend/dark_icon.png b/.cache/brands/integrations/clicksend/dark_icon.png new file mode 100644 index 0000000..5c57552 Binary files /dev/null and b/.cache/brands/integrations/clicksend/dark_icon.png differ diff --git a/.cache/brands/integrations/cloud/dark_icon.png b/.cache/brands/integrations/cloud/dark_icon.png new file mode 100644 index 0000000..874cd91 Binary files /dev/null and b/.cache/brands/integrations/cloud/dark_icon.png differ diff --git a/.cache/brands/integrations/co2signal/dark_icon.png b/.cache/brands/integrations/co2signal/dark_icon.png new file mode 100644 index 0000000..1650ec9 Binary files /dev/null and b/.cache/brands/integrations/co2signal/dark_icon.png differ diff --git a/.cache/brands/integrations/coautilities/dark_icon.png b/.cache/brands/integrations/coautilities/dark_icon.png new file mode 100644 index 0000000..5a0436b Binary files /dev/null and b/.cache/brands/integrations/coautilities/dark_icon.png differ diff --git a/.cache/brands/integrations/coinbase/dark_icon.png b/.cache/brands/integrations/coinbase/dark_icon.png new file mode 100644 index 0000000..9f3bc53 Binary files /dev/null and b/.cache/brands/integrations/coinbase/dark_icon.png differ diff --git a/.cache/brands/integrations/color_extractor/dark_icon.png b/.cache/brands/integrations/color_extractor/dark_icon.png new file mode 100644 index 0000000..c7415d2 Binary files /dev/null and b/.cache/brands/integrations/color_extractor/dark_icon.png differ diff --git a/.cache/brands/integrations/comed/dark_icon.png b/.cache/brands/integrations/comed/dark_icon.png new file mode 100644 index 0000000..b805d95 Binary files /dev/null and b/.cache/brands/integrations/comed/dark_icon.png differ diff --git a/.cache/brands/integrations/comelit/dark_icon.png b/.cache/brands/integrations/comelit/dark_icon.png new file mode 100644 index 0000000..6a4cf06 Binary files /dev/null and b/.cache/brands/integrations/comelit/dark_icon.png differ diff --git a/.cache/brands/integrations/compit/dark_icon.png b/.cache/brands/integrations/compit/dark_icon.png new file mode 100644 index 0000000..40d9ac5 Binary files /dev/null and b/.cache/brands/integrations/compit/dark_icon.png differ diff --git a/.cache/brands/integrations/coned/dark_icon.png b/.cache/brands/integrations/coned/dark_icon.png new file mode 100644 index 0000000..f740b80 Binary files /dev/null and b/.cache/brands/integrations/coned/dark_icon.png differ diff --git a/.cache/brands/integrations/constructa/dark_icon.png b/.cache/brands/integrations/constructa/dark_icon.png new file mode 100644 index 0000000..0c649e4 Binary files /dev/null and b/.cache/brands/integrations/constructa/dark_icon.png differ diff --git a/.cache/brands/integrations/control4/dark_icon.png b/.cache/brands/integrations/control4/dark_icon.png new file mode 100644 index 0000000..dc7d12f Binary files /dev/null and b/.cache/brands/integrations/control4/dark_icon.png differ diff --git a/.cache/brands/integrations/cookidoo/dark_icon.png b/.cache/brands/integrations/cookidoo/dark_icon.png new file mode 100644 index 0000000..d589630 Binary files /dev/null and b/.cache/brands/integrations/cookidoo/dark_icon.png differ diff --git a/.cache/brands/integrations/coolmaster/dark_icon.png b/.cache/brands/integrations/coolmaster/dark_icon.png new file mode 100644 index 0000000..7b09d7a Binary files /dev/null and b/.cache/brands/integrations/coolmaster/dark_icon.png differ diff --git a/.cache/brands/integrations/cosori/dark_icon.png b/.cache/brands/integrations/cosori/dark_icon.png new file mode 100644 index 0000000..e69de29 diff --git a/.cache/brands/integrations/cozytouch/dark_icon.png b/.cache/brands/integrations/cozytouch/dark_icon.png new file mode 100644 index 0000000..c1b9885 Binary files /dev/null and b/.cache/brands/integrations/cozytouch/dark_icon.png differ diff --git a/.cache/brands/integrations/cpuspeed/dark_icon.png b/.cache/brands/integrations/cpuspeed/dark_icon.png new file mode 100644 index 0000000..9bd46ed Binary files /dev/null and b/.cache/brands/integrations/cpuspeed/dark_icon.png differ diff --git a/.cache/brands/integrations/cribl/dark_icon.png b/.cache/brands/integrations/cribl/dark_icon.png new file mode 100644 index 0000000..261d26e Binary files /dev/null and b/.cache/brands/integrations/cribl/dark_icon.png differ diff --git a/.cache/brands/integrations/crownstone/dark_icon.png b/.cache/brands/integrations/crownstone/dark_icon.png new file mode 100644 index 0000000..749666a Binary files /dev/null and b/.cache/brands/integrations/crownstone/dark_icon.png differ diff --git a/.cache/brands/integrations/cync/dark_icon.png b/.cache/brands/integrations/cync/dark_icon.png new file mode 100644 index 0000000..0a4c16a Binary files /dev/null and b/.cache/brands/integrations/cync/dark_icon.png differ diff --git a/.cache/brands/integrations/dacia/dark_icon.png b/.cache/brands/integrations/dacia/dark_icon.png new file mode 100644 index 0000000..11db358 Binary files /dev/null and b/.cache/brands/integrations/dacia/dark_icon.png differ diff --git a/.cache/brands/integrations/daikin/dark_icon.png b/.cache/brands/integrations/daikin/dark_icon.png new file mode 100644 index 0000000..5dfb669 Binary files /dev/null and b/.cache/brands/integrations/daikin/dark_icon.png differ diff --git a/.cache/brands/integrations/datadog/dark_icon.png b/.cache/brands/integrations/datadog/dark_icon.png new file mode 100644 index 0000000..2e13a1a Binary files /dev/null and b/.cache/brands/integrations/datadog/dark_icon.png differ diff --git a/.cache/brands/integrations/deako/dark_icon.png b/.cache/brands/integrations/deako/dark_icon.png new file mode 100644 index 0000000..1780ac6 Binary files /dev/null and b/.cache/brands/integrations/deako/dark_icon.png differ diff --git a/.cache/brands/integrations/deconz/dark_icon.png b/.cache/brands/integrations/deconz/dark_icon.png new file mode 100644 index 0000000..f9709e9 Binary files /dev/null and b/.cache/brands/integrations/deconz/dark_icon.png differ diff --git a/.cache/brands/integrations/decorquip/dark_icon.png b/.cache/brands/integrations/decorquip/dark_icon.png new file mode 100644 index 0000000..9284cb4 Binary files /dev/null and b/.cache/brands/integrations/decorquip/dark_icon.png differ diff --git a/.cache/brands/integrations/delmarva/dark_icon.png b/.cache/brands/integrations/delmarva/dark_icon.png new file mode 100644 index 0000000..7d77ffc Binary files /dev/null and b/.cache/brands/integrations/delmarva/dark_icon.png differ diff --git a/.cache/brands/integrations/deluge/dark_icon.png b/.cache/brands/integrations/deluge/dark_icon.png new file mode 100644 index 0000000..b57a90b Binary files /dev/null and b/.cache/brands/integrations/deluge/dark_icon.png differ diff --git a/.cache/brands/integrations/denon/dark_icon.png b/.cache/brands/integrations/denon/dark_icon.png new file mode 100644 index 0000000..a872589 Binary files /dev/null and b/.cache/brands/integrations/denon/dark_icon.png differ diff --git a/.cache/brands/integrations/devialet/dark_icon.png b/.cache/brands/integrations/devialet/dark_icon.png new file mode 100644 index 0000000..d458805 Binary files /dev/null and b/.cache/brands/integrations/devialet/dark_icon.png differ diff --git a/.cache/brands/integrations/devolo/dark_icon.png b/.cache/brands/integrations/devolo/dark_icon.png new file mode 100644 index 0000000..be77495 Binary files /dev/null and b/.cache/brands/integrations/devolo/dark_icon.png differ diff --git a/.cache/brands/integrations/dexcom/dark_icon.png b/.cache/brands/integrations/dexcom/dark_icon.png new file mode 100644 index 0000000..36b0e28 Binary files /dev/null and b/.cache/brands/integrations/dexcom/dark_icon.png differ diff --git a/.cache/brands/integrations/diaz/dark_icon.png b/.cache/brands/integrations/diaz/dark_icon.png new file mode 100644 index 0000000..2c0e955 Binary files /dev/null and b/.cache/brands/integrations/diaz/dark_icon.png differ diff --git a/.cache/brands/integrations/digital_loggers/dark_icon.png b/.cache/brands/integrations/digital_loggers/dark_icon.png new file mode 100644 index 0000000..f1e3c4d Binary files /dev/null and b/.cache/brands/integrations/digital_loggers/dark_icon.png differ diff --git a/.cache/brands/integrations/discord/dark_icon.png b/.cache/brands/integrations/discord/dark_icon.png new file mode 100644 index 0000000..b48a5d8 Binary files /dev/null and b/.cache/brands/integrations/discord/dark_icon.png differ diff --git a/.cache/brands/integrations/discovergy/dark_icon.png b/.cache/brands/integrations/discovergy/dark_icon.png new file mode 100644 index 0000000..5510ccb Binary files /dev/null and b/.cache/brands/integrations/discovergy/dark_icon.png differ diff --git a/.cache/brands/integrations/dlink/dark_icon.png b/.cache/brands/integrations/dlink/dark_icon.png new file mode 100644 index 0000000..e17d84f Binary files /dev/null and b/.cache/brands/integrations/dlink/dark_icon.png differ diff --git a/.cache/brands/integrations/dlna/dark_icon.png b/.cache/brands/integrations/dlna/dark_icon.png new file mode 100644 index 0000000..763d242 Binary files /dev/null and b/.cache/brands/integrations/dlna/dark_icon.png differ diff --git a/.cache/brands/integrations/dnsip/dark_icon.png b/.cache/brands/integrations/dnsip/dark_icon.png new file mode 100644 index 0000000..82e064f Binary files /dev/null and b/.cache/brands/integrations/dnsip/dark_icon.png differ diff --git a/.cache/brands/integrations/doorbird/dark_icon.png b/.cache/brands/integrations/doorbird/dark_icon.png new file mode 100644 index 0000000..31ebba3 Binary files /dev/null and b/.cache/brands/integrations/doorbird/dark_icon.png differ diff --git a/.cache/brands/integrations/dooya/dark_icon.png b/.cache/brands/integrations/dooya/dark_icon.png new file mode 100644 index 0000000..7d63cfb Binary files /dev/null and b/.cache/brands/integrations/dooya/dark_icon.png differ diff --git a/.cache/brands/integrations/dormakaba_dkey/dark_icon.png b/.cache/brands/integrations/dormakaba_dkey/dark_icon.png new file mode 100644 index 0000000..1fc85e5 Binary files /dev/null and b/.cache/brands/integrations/dormakaba_dkey/dark_icon.png differ diff --git a/.cache/brands/integrations/downloader/dark_icon.png b/.cache/brands/integrations/downloader/dark_icon.png new file mode 100644 index 0000000..5c6bc77 Binary files /dev/null and b/.cache/brands/integrations/downloader/dark_icon.png differ diff --git a/.cache/brands/integrations/dremel_3d_printer/dark_icon.png b/.cache/brands/integrations/dremel_3d_printer/dark_icon.png new file mode 100644 index 0000000..b42b6e1 Binary files /dev/null and b/.cache/brands/integrations/dremel_3d_printer/dark_icon.png differ diff --git a/.cache/brands/integrations/drop_connect/dark_icon.png b/.cache/brands/integrations/drop_connect/dark_icon.png new file mode 100644 index 0000000..434aa1d Binary files /dev/null and b/.cache/brands/integrations/drop_connect/dark_icon.png differ diff --git a/.cache/brands/integrations/droplet/dark_icon.png b/.cache/brands/integrations/droplet/dark_icon.png new file mode 100644 index 0000000..4587676 Binary files /dev/null and b/.cache/brands/integrations/droplet/dark_icon.png differ diff --git a/.cache/brands/integrations/dsmr/dark_icon.png b/.cache/brands/integrations/dsmr/dark_icon.png new file mode 100644 index 0000000..f87500c Binary files /dev/null and b/.cache/brands/integrations/dsmr/dark_icon.png differ diff --git a/.cache/brands/integrations/dsmr_reader/dark_icon.png b/.cache/brands/integrations/dsmr_reader/dark_icon.png new file mode 100644 index 0000000..afeae92 Binary files /dev/null and b/.cache/brands/integrations/dsmr_reader/dark_icon.png differ diff --git a/.cache/brands/integrations/duckdns/dark_icon.png b/.cache/brands/integrations/duckdns/dark_icon.png new file mode 100644 index 0000000..79e3534 Binary files /dev/null and b/.cache/brands/integrations/duckdns/dark_icon.png differ diff --git a/.cache/brands/integrations/dunehd/dark_icon.png b/.cache/brands/integrations/dunehd/dark_icon.png new file mode 100644 index 0000000..1e583cb Binary files /dev/null and b/.cache/brands/integrations/dunehd/dark_icon.png differ diff --git a/.cache/brands/integrations/duotecno/dark_icon.png b/.cache/brands/integrations/duotecno/dark_icon.png new file mode 100644 index 0000000..de6efd9 Binary files /dev/null and b/.cache/brands/integrations/duotecno/dark_icon.png differ diff --git a/.cache/brands/integrations/duquesne_light/dark_icon.png b/.cache/brands/integrations/duquesne_light/dark_icon.png new file mode 100644 index 0000000..39edd66 Binary files /dev/null and b/.cache/brands/integrations/duquesne_light/dark_icon.png differ diff --git a/.cache/brands/integrations/dwd_weather_warnings/dark_icon.png b/.cache/brands/integrations/dwd_weather_warnings/dark_icon.png new file mode 100644 index 0000000..378dec3 Binary files /dev/null and b/.cache/brands/integrations/dwd_weather_warnings/dark_icon.png differ diff --git a/.cache/brands/integrations/eastron/dark_icon.png b/.cache/brands/integrations/eastron/dark_icon.png new file mode 100644 index 0000000..d9d0989 Binary files /dev/null and b/.cache/brands/integrations/eastron/dark_icon.png differ diff --git a/.cache/brands/integrations/easyenergy/dark_icon.png b/.cache/brands/integrations/easyenergy/dark_icon.png new file mode 100644 index 0000000..b1a37b3 Binary files /dev/null and b/.cache/brands/integrations/easyenergy/dark_icon.png differ diff --git a/.cache/brands/integrations/ecobee/dark_icon.png b/.cache/brands/integrations/ecobee/dark_icon.png new file mode 100644 index 0000000..dea27a6 Binary files /dev/null and b/.cache/brands/integrations/ecobee/dark_icon.png differ diff --git a/.cache/brands/integrations/ecoforest/dark_icon.png b/.cache/brands/integrations/ecoforest/dark_icon.png new file mode 100644 index 0000000..d3ace2e Binary files /dev/null and b/.cache/brands/integrations/ecoforest/dark_icon.png differ diff --git a/.cache/brands/integrations/ecovacs/dark_icon.png b/.cache/brands/integrations/ecovacs/dark_icon.png new file mode 100644 index 0000000..8387ae4 Binary files /dev/null and b/.cache/brands/integrations/ecovacs/dark_icon.png differ diff --git a/.cache/brands/integrations/ecowitt/dark_icon.png b/.cache/brands/integrations/ecowitt/dark_icon.png new file mode 100644 index 0000000..96fd1ba Binary files /dev/null and b/.cache/brands/integrations/ecowitt/dark_icon.png differ diff --git a/.cache/brands/integrations/edl21/dark_icon.png b/.cache/brands/integrations/edl21/dark_icon.png new file mode 100644 index 0000000..3672f04 Binary files /dev/null and b/.cache/brands/integrations/edl21/dark_icon.png differ diff --git a/.cache/brands/integrations/efergy/dark_icon.png b/.cache/brands/integrations/efergy/dark_icon.png new file mode 100644 index 0000000..c5fb89a Binary files /dev/null and b/.cache/brands/integrations/efergy/dark_icon.png differ diff --git a/.cache/brands/integrations/egauge/dark_icon.png b/.cache/brands/integrations/egauge/dark_icon.png new file mode 100644 index 0000000..0e20d1b Binary files /dev/null and b/.cache/brands/integrations/egauge/dark_icon.png differ diff --git a/.cache/brands/integrations/eheimdigital/dark_icon.png b/.cache/brands/integrations/eheimdigital/dark_icon.png new file mode 100644 index 0000000..20a9ccd Binary files /dev/null and b/.cache/brands/integrations/eheimdigital/dark_icon.png differ diff --git a/.cache/brands/integrations/ekeybionyx/dark_icon.png b/.cache/brands/integrations/ekeybionyx/dark_icon.png new file mode 100644 index 0000000..30ce06e Binary files /dev/null and b/.cache/brands/integrations/ekeybionyx/dark_icon.png differ diff --git a/.cache/brands/integrations/electrasmart/dark_icon.png b/.cache/brands/integrations/electrasmart/dark_icon.png new file mode 100644 index 0000000..5deaa8a Binary files /dev/null and b/.cache/brands/integrations/electrasmart/dark_icon.png differ diff --git a/.cache/brands/integrations/electric_kiwi/dark_icon.png b/.cache/brands/integrations/electric_kiwi/dark_icon.png new file mode 100644 index 0000000..8ecb75b Binary files /dev/null and b/.cache/brands/integrations/electric_kiwi/dark_icon.png differ diff --git a/.cache/brands/integrations/elevenlabs/dark_icon.png b/.cache/brands/integrations/elevenlabs/dark_icon.png new file mode 100644 index 0000000..c17b9ca Binary files /dev/null and b/.cache/brands/integrations/elevenlabs/dark_icon.png differ diff --git a/.cache/brands/integrations/elgato/dark_icon.png b/.cache/brands/integrations/elgato/dark_icon.png new file mode 100644 index 0000000..ee9211f Binary files /dev/null and b/.cache/brands/integrations/elgato/dark_icon.png differ diff --git a/.cache/brands/integrations/elkm1/dark_icon.png b/.cache/brands/integrations/elkm1/dark_icon.png new file mode 100644 index 0000000..9ad2dd2 Binary files /dev/null and b/.cache/brands/integrations/elkm1/dark_icon.png differ diff --git a/.cache/brands/integrations/elmax/dark_icon.png b/.cache/brands/integrations/elmax/dark_icon.png new file mode 100644 index 0000000..58d7272 Binary files /dev/null and b/.cache/brands/integrations/elmax/dark_icon.png differ diff --git a/.cache/brands/integrations/eltako/dark_icon.png b/.cache/brands/integrations/eltako/dark_icon.png new file mode 100644 index 0000000..4eacc87 Binary files /dev/null and b/.cache/brands/integrations/eltako/dark_icon.png differ diff --git a/.cache/brands/integrations/elvia/dark_icon.png b/.cache/brands/integrations/elvia/dark_icon.png new file mode 100644 index 0000000..79565dc Binary files /dev/null and b/.cache/brands/integrations/elvia/dark_icon.png differ diff --git a/.cache/brands/integrations/emby/dark_icon.png b/.cache/brands/integrations/emby/dark_icon.png new file mode 100644 index 0000000..ace3bf4 Binary files /dev/null and b/.cache/brands/integrations/emby/dark_icon.png differ diff --git a/.cache/brands/integrations/emby/icon.png b/.cache/brands/integrations/emby/icon.png new file mode 100644 index 0000000..ad98372 Binary files /dev/null and b/.cache/brands/integrations/emby/icon.png differ diff --git a/.cache/brands/integrations/emoncms/dark_icon.png b/.cache/brands/integrations/emoncms/dark_icon.png new file mode 100644 index 0000000..388568f Binary files /dev/null and b/.cache/brands/integrations/emoncms/dark_icon.png differ diff --git a/.cache/brands/integrations/emulated_roku/dark_icon.png b/.cache/brands/integrations/emulated_roku/dark_icon.png new file mode 100644 index 0000000..39f0c14 Binary files /dev/null and b/.cache/brands/integrations/emulated_roku/dark_icon.png differ diff --git a/.cache/brands/integrations/energenie_power_sockets/dark_icon.png b/.cache/brands/integrations/energenie_power_sockets/dark_icon.png new file mode 100644 index 0000000..b68804a Binary files /dev/null and b/.cache/brands/integrations/energenie_power_sockets/dark_icon.png differ diff --git a/.cache/brands/integrations/energie_vanons/dark_icon.png b/.cache/brands/integrations/energie_vanons/dark_icon.png new file mode 100644 index 0000000..65ea940 Binary files /dev/null and b/.cache/brands/integrations/energie_vanons/dark_icon.png differ diff --git a/.cache/brands/integrations/energyid/dark_icon.png b/.cache/brands/integrations/energyid/dark_icon.png new file mode 100644 index 0000000..27157c0 Binary files /dev/null and b/.cache/brands/integrations/energyid/dark_icon.png differ diff --git a/.cache/brands/integrations/energyzero/dark_icon.png b/.cache/brands/integrations/energyzero/dark_icon.png new file mode 100644 index 0000000..983a5b8 Binary files /dev/null and b/.cache/brands/integrations/energyzero/dark_icon.png differ diff --git a/.cache/brands/integrations/enigma2/dark_icon.png b/.cache/brands/integrations/enigma2/dark_icon.png new file mode 100644 index 0000000..78c70a0 Binary files /dev/null and b/.cache/brands/integrations/enigma2/dark_icon.png differ diff --git a/.cache/brands/integrations/enocean/dark_icon.png b/.cache/brands/integrations/enocean/dark_icon.png new file mode 100644 index 0000000..fbdf728 Binary files /dev/null and b/.cache/brands/integrations/enocean/dark_icon.png differ diff --git a/.cache/brands/integrations/enphase_envoy/dark_icon.png b/.cache/brands/integrations/enphase_envoy/dark_icon.png new file mode 100644 index 0000000..a0107d4 Binary files /dev/null and b/.cache/brands/integrations/enphase_envoy/dark_icon.png differ diff --git a/.cache/brands/integrations/entur_public_transport/dark_icon.png b/.cache/brands/integrations/entur_public_transport/dark_icon.png new file mode 100644 index 0000000..7624f79 Binary files /dev/null and b/.cache/brands/integrations/entur_public_transport/dark_icon.png differ diff --git a/.cache/brands/integrations/environment_canada/dark_icon.png b/.cache/brands/integrations/environment_canada/dark_icon.png new file mode 100644 index 0000000..309dabc Binary files /dev/null and b/.cache/brands/integrations/environment_canada/dark_icon.png differ diff --git a/.cache/brands/integrations/epic_games_store/dark_icon.png b/.cache/brands/integrations/epic_games_store/dark_icon.png new file mode 100644 index 0000000..4eac388 Binary files /dev/null and b/.cache/brands/integrations/epic_games_store/dark_icon.png differ diff --git a/.cache/brands/integrations/epion/dark_icon.png b/.cache/brands/integrations/epion/dark_icon.png new file mode 100644 index 0000000..10c38fe Binary files /dev/null and b/.cache/brands/integrations/epion/dark_icon.png differ diff --git a/.cache/brands/integrations/epson/dark_icon.png b/.cache/brands/integrations/epson/dark_icon.png new file mode 100644 index 0000000..92b60f6 Binary files /dev/null and b/.cache/brands/integrations/epson/dark_icon.png differ diff --git a/.cache/brands/integrations/eq3/dark_icon.png b/.cache/brands/integrations/eq3/dark_icon.png new file mode 100644 index 0000000..53a91c0 Binary files /dev/null and b/.cache/brands/integrations/eq3/dark_icon.png differ diff --git a/.cache/brands/integrations/escea/dark_icon.png b/.cache/brands/integrations/escea/dark_icon.png new file mode 100644 index 0000000..fa9fc58 Binary files /dev/null and b/.cache/brands/integrations/escea/dark_icon.png differ diff --git a/.cache/brands/integrations/esera_onewire/dark_icon.png b/.cache/brands/integrations/esera_onewire/dark_icon.png new file mode 100644 index 0000000..d57e886 Binary files /dev/null and b/.cache/brands/integrations/esera_onewire/dark_icon.png differ diff --git a/.cache/brands/integrations/essent/dark_icon.png b/.cache/brands/integrations/essent/dark_icon.png new file mode 100644 index 0000000..38faa8b Binary files /dev/null and b/.cache/brands/integrations/essent/dark_icon.png differ diff --git a/.cache/brands/integrations/eufy/dark_icon.png b/.cache/brands/integrations/eufy/dark_icon.png new file mode 100644 index 0000000..604282e Binary files /dev/null and b/.cache/brands/integrations/eufy/dark_icon.png differ diff --git a/.cache/brands/integrations/eve/dark_icon.png b/.cache/brands/integrations/eve/dark_icon.png new file mode 100644 index 0000000..37dea87 Binary files /dev/null and b/.cache/brands/integrations/eve/dark_icon.png differ diff --git a/.cache/brands/integrations/evergy/dark_icon.png b/.cache/brands/integrations/evergy/dark_icon.png new file mode 100644 index 0000000..565c201 Binary files /dev/null and b/.cache/brands/integrations/evergy/dark_icon.png differ diff --git a/.cache/brands/integrations/evil_genius_labs/dark_icon.png b/.cache/brands/integrations/evil_genius_labs/dark_icon.png new file mode 100644 index 0000000..29f7c54 Binary files /dev/null and b/.cache/brands/integrations/evil_genius_labs/dark_icon.png differ diff --git a/.cache/brands/integrations/evnex/dark_icon.png b/.cache/brands/integrations/evnex/dark_icon.png new file mode 100644 index 0000000..a3a9d2e Binary files /dev/null and b/.cache/brands/integrations/evnex/dark_icon.png differ diff --git a/.cache/brands/integrations/ezviz/dark_icon.png b/.cache/brands/integrations/ezviz/dark_icon.png new file mode 100644 index 0000000..76c2647 Binary files /dev/null and b/.cache/brands/integrations/ezviz/dark_icon.png differ diff --git a/.cache/brands/integrations/faa_delays/dark_icon.png b/.cache/brands/integrations/faa_delays/dark_icon.png new file mode 100644 index 0000000..57366f5 Binary files /dev/null and b/.cache/brands/integrations/faa_delays/dark_icon.png differ diff --git a/.cache/brands/integrations/fish_audio/dark_icon.png b/.cache/brands/integrations/fish_audio/dark_icon.png new file mode 100644 index 0000000..16d99c5 Binary files /dev/null and b/.cache/brands/integrations/fish_audio/dark_icon.png differ diff --git a/.cache/brands/integrations/flightradar24/dark_icon@2x.png b/.cache/brands/integrations/flightradar24/dark_icon@2x.png new file mode 100644 index 0000000..cd96652 Binary files /dev/null and b/.cache/brands/integrations/flightradar24/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/folder_watcher/dark_icon.png b/.cache/brands/integrations/folder_watcher/dark_icon.png new file mode 100644 index 0000000..5f26e51 Binary files /dev/null and b/.cache/brands/integrations/folder_watcher/dark_icon.png differ diff --git a/.cache/brands/integrations/foscam/dark_icon.png b/.cache/brands/integrations/foscam/dark_icon.png new file mode 100644 index 0000000..d62e18a Binary files /dev/null and b/.cache/brands/integrations/foscam/dark_icon.png differ diff --git a/.cache/brands/integrations/frankever/dark_icon.png b/.cache/brands/integrations/frankever/dark_icon.png new file mode 100644 index 0000000..ca8cabc Binary files /dev/null and b/.cache/brands/integrations/frankever/dark_icon.png differ diff --git a/.cache/brands/integrations/frient/dark_icon.png b/.cache/brands/integrations/frient/dark_icon.png new file mode 100644 index 0000000..331f4db Binary files /dev/null and b/.cache/brands/integrations/frient/dark_icon.png differ diff --git a/.cache/brands/integrations/fronius/dark_icon.png b/.cache/brands/integrations/fronius/dark_icon.png new file mode 100644 index 0000000..3fd8ce0 Binary files /dev/null and b/.cache/brands/integrations/fronius/dark_icon.png differ diff --git a/.cache/brands/integrations/frontier_silicon/dark_icon.png b/.cache/brands/integrations/frontier_silicon/dark_icon.png new file mode 100644 index 0000000..d91c3e4 Binary files /dev/null and b/.cache/brands/integrations/frontier_silicon/dark_icon.png differ diff --git a/.cache/brands/integrations/fyta/dark_icon.png b/.cache/brands/integrations/fyta/dark_icon.png new file mode 100644 index 0000000..faefb39 Binary files /dev/null and b/.cache/brands/integrations/fyta/dark_icon.png differ diff --git a/.cache/brands/integrations/gaggenau/dark_icon.png b/.cache/brands/integrations/gaggenau/dark_icon.png new file mode 100644 index 0000000..260acab Binary files /dev/null and b/.cache/brands/integrations/gaggenau/dark_icon.png differ diff --git a/.cache/brands/integrations/garages_amsterdam/dark_icon.png b/.cache/brands/integrations/garages_amsterdam/dark_icon.png new file mode 100644 index 0000000..51755fb Binary files /dev/null and b/.cache/brands/integrations/garages_amsterdam/dark_icon.png differ diff --git a/.cache/brands/integrations/gardena_bluetooth/dark_icon.png b/.cache/brands/integrations/gardena_bluetooth/dark_icon.png new file mode 100644 index 0000000..c12f27b Binary files /dev/null and b/.cache/brands/integrations/gardena_bluetooth/dark_icon.png differ diff --git a/.cache/brands/integrations/gaviota/dark_icon.png b/.cache/brands/integrations/gaviota/dark_icon.png new file mode 100644 index 0000000..02ea0c9 Binary files /dev/null and b/.cache/brands/integrations/gaviota/dark_icon.png differ diff --git a/.cache/brands/integrations/gdacs/dark_icon.png b/.cache/brands/integrations/gdacs/dark_icon.png new file mode 100644 index 0000000..c4e9619 Binary files /dev/null and b/.cache/brands/integrations/gdacs/dark_icon.png differ diff --git a/.cache/brands/integrations/generic/dark_icon.png b/.cache/brands/integrations/generic/dark_icon.png new file mode 100644 index 0000000..69a2a57 Binary files /dev/null and b/.cache/brands/integrations/generic/dark_icon.png differ diff --git a/.cache/brands/integrations/geniushub/dark_icon.png b/.cache/brands/integrations/geniushub/dark_icon.png new file mode 100644 index 0000000..c785919 Binary files /dev/null and b/.cache/brands/integrations/geniushub/dark_icon.png differ diff --git a/.cache/brands/integrations/gentex_homelink/dark_icon.png b/.cache/brands/integrations/gentex_homelink/dark_icon.png new file mode 100644 index 0000000..12ff514 Binary files /dev/null and b/.cache/brands/integrations/gentex_homelink/dark_icon.png differ diff --git a/.cache/brands/integrations/geo_json_events/dark_icon.png b/.cache/brands/integrations/geo_json_events/dark_icon.png new file mode 100644 index 0000000..357a7ca Binary files /dev/null and b/.cache/brands/integrations/geo_json_events/dark_icon.png differ diff --git a/.cache/brands/integrations/geocaching/dark_icon.png b/.cache/brands/integrations/geocaching/dark_icon.png new file mode 100644 index 0000000..5bea88a Binary files /dev/null and b/.cache/brands/integrations/geocaching/dark_icon.png differ diff --git a/.cache/brands/integrations/geofency/dark_icon.png b/.cache/brands/integrations/geofency/dark_icon.png new file mode 100644 index 0000000..7922219 Binary files /dev/null and b/.cache/brands/integrations/geofency/dark_icon.png differ diff --git a/.cache/brands/integrations/geonet/dark_icon.png b/.cache/brands/integrations/geonet/dark_icon.png new file mode 100644 index 0000000..fd1f554 Binary files /dev/null and b/.cache/brands/integrations/geonet/dark_icon.png differ diff --git a/.cache/brands/integrations/ghost/dark_icon.png b/.cache/brands/integrations/ghost/dark_icon.png new file mode 100644 index 0000000..acdb128 Binary files /dev/null and b/.cache/brands/integrations/ghost/dark_icon.png differ diff --git a/.cache/brands/integrations/gios/dark_icon.png b/.cache/brands/integrations/gios/dark_icon.png new file mode 100644 index 0000000..c1f6f67 Binary files /dev/null and b/.cache/brands/integrations/gios/dark_icon.png differ diff --git a/.cache/brands/integrations/github/dark_icon.png b/.cache/brands/integrations/github/dark_icon.png new file mode 100644 index 0000000..e19527b Binary files /dev/null and b/.cache/brands/integrations/github/dark_icon.png differ diff --git a/.cache/brands/integrations/glances/dark_icon.png b/.cache/brands/integrations/glances/dark_icon.png new file mode 100644 index 0000000..fda5b48 Binary files /dev/null and b/.cache/brands/integrations/glances/dark_icon.png differ diff --git a/.cache/brands/integrations/globalcache/dark_icon.png b/.cache/brands/integrations/globalcache/dark_icon.png new file mode 100644 index 0000000..b793839 Binary files /dev/null and b/.cache/brands/integrations/globalcache/dark_icon.png differ diff --git a/.cache/brands/integrations/goalzero/dark_icon.png b/.cache/brands/integrations/goalzero/dark_icon.png new file mode 100644 index 0000000..75d62d7 Binary files /dev/null and b/.cache/brands/integrations/goalzero/dark_icon.png differ diff --git a/.cache/brands/integrations/gogogate2/dark_icon.png b/.cache/brands/integrations/gogogate2/dark_icon.png new file mode 100644 index 0000000..9801cf1 Binary files /dev/null and b/.cache/brands/integrations/gogogate2/dark_icon.png differ diff --git a/.cache/brands/integrations/goodwe/dark_icon.png b/.cache/brands/integrations/goodwe/dark_icon.png new file mode 100644 index 0000000..473b634 Binary files /dev/null and b/.cache/brands/integrations/goodwe/dark_icon.png differ diff --git a/.cache/brands/integrations/govee/dark_icon.png b/.cache/brands/integrations/govee/dark_icon.png new file mode 100644 index 0000000..e6f2fe6 Binary files /dev/null and b/.cache/brands/integrations/govee/dark_icon.png differ diff --git a/.cache/brands/integrations/gpsd/dark_icon.png b/.cache/brands/integrations/gpsd/dark_icon.png new file mode 100644 index 0000000..6bf241a Binary files /dev/null and b/.cache/brands/integrations/gpsd/dark_icon.png differ diff --git a/.cache/brands/integrations/gpslogger/dark_icon.png b/.cache/brands/integrations/gpslogger/dark_icon.png new file mode 100644 index 0000000..2079868 Binary files /dev/null and b/.cache/brands/integrations/gpslogger/dark_icon.png differ diff --git a/.cache/brands/integrations/green_planet_energy/dark_icon.png b/.cache/brands/integrations/green_planet_energy/dark_icon.png new file mode 100644 index 0000000..bdef7ac Binary files /dev/null and b/.cache/brands/integrations/green_planet_energy/dark_icon.png differ diff --git a/.cache/brands/integrations/growatt_server/dark_icon.png b/.cache/brands/integrations/growatt_server/dark_icon.png new file mode 100644 index 0000000..60cba73 Binary files /dev/null and b/.cache/brands/integrations/growatt_server/dark_icon.png differ diff --git a/.cache/brands/integrations/guardian/dark_icon.png b/.cache/brands/integrations/guardian/dark_icon.png new file mode 100644 index 0000000..8c47526 Binary files /dev/null and b/.cache/brands/integrations/guardian/dark_icon.png differ diff --git a/.cache/brands/integrations/habitica/dark_icon.png b/.cache/brands/integrations/habitica/dark_icon.png new file mode 100644 index 0000000..c223b0d Binary files /dev/null and b/.cache/brands/integrations/habitica/dark_icon.png differ diff --git a/.cache/brands/integrations/hanna/dark_icon.png b/.cache/brands/integrations/hanna/dark_icon.png new file mode 100644 index 0000000..187c32c Binary files /dev/null and b/.cache/brands/integrations/hanna/dark_icon.png differ diff --git a/.cache/brands/integrations/harvey/dark_icon.png b/.cache/brands/integrations/harvey/dark_icon.png new file mode 100644 index 0000000..aebbea9 Binary files /dev/null and b/.cache/brands/integrations/harvey/dark_icon.png differ diff --git a/.cache/brands/integrations/havana_shade/dark_icon.png b/.cache/brands/integrations/havana_shade/dark_icon.png new file mode 100644 index 0000000..24a4e00 Binary files /dev/null and b/.cache/brands/integrations/havana_shade/dark_icon.png differ diff --git a/.cache/brands/integrations/hdfury/dark_icon.png b/.cache/brands/integrations/hdfury/dark_icon.png new file mode 100644 index 0000000..077266b Binary files /dev/null and b/.cache/brands/integrations/hdfury/dark_icon.png differ diff --git a/.cache/brands/integrations/heatit/dark_icon.png b/.cache/brands/integrations/heatit/dark_icon.png new file mode 100644 index 0000000..9df3283 Binary files /dev/null and b/.cache/brands/integrations/heatit/dark_icon.png differ diff --git a/.cache/brands/integrations/hegel/dark_icon.png b/.cache/brands/integrations/hegel/dark_icon.png new file mode 100644 index 0000000..9606890 Binary files /dev/null and b/.cache/brands/integrations/hegel/dark_icon.png differ diff --git a/.cache/brands/integrations/heicko/dark_icon.png b/.cache/brands/integrations/heicko/dark_icon.png new file mode 100644 index 0000000..cfac82b Binary files /dev/null and b/.cache/brands/integrations/heicko/dark_icon.png differ diff --git a/.cache/brands/integrations/heiman/dark_icon.png b/.cache/brands/integrations/heiman/dark_icon.png new file mode 100644 index 0000000..27884a5 Binary files /dev/null and b/.cache/brands/integrations/heiman/dark_icon.png differ diff --git a/.cache/brands/integrations/heiwa/dark_icon.png b/.cache/brands/integrations/heiwa/dark_icon.png new file mode 100644 index 0000000..26c8d61 Binary files /dev/null and b/.cache/brands/integrations/heiwa/dark_icon.png differ diff --git a/.cache/brands/integrations/heltun/dark_icon.png b/.cache/brands/integrations/heltun/dark_icon.png new file mode 100644 index 0000000..2527b5e Binary files /dev/null and b/.cache/brands/integrations/heltun/dark_icon.png differ diff --git a/.cache/brands/integrations/here_travel_time/dark_icon.png b/.cache/brands/integrations/here_travel_time/dark_icon.png new file mode 100644 index 0000000..9e4248b Binary files /dev/null and b/.cache/brands/integrations/here_travel_time/dark_icon.png differ diff --git a/.cache/brands/integrations/hexaom/dark_icon.png b/.cache/brands/integrations/hexaom/dark_icon.png new file mode 100644 index 0000000..d76b0ce Binary files /dev/null and b/.cache/brands/integrations/hexaom/dark_icon.png differ diff --git a/.cache/brands/integrations/hi_kumo/dark_icon.png b/.cache/brands/integrations/hi_kumo/dark_icon.png new file mode 100644 index 0000000..1c5383d Binary files /dev/null and b/.cache/brands/integrations/hi_kumo/dark_icon.png differ diff --git a/.cache/brands/integrations/hikvision/dark_icon.png b/.cache/brands/integrations/hikvision/dark_icon.png new file mode 100644 index 0000000..e840654 Binary files /dev/null and b/.cache/brands/integrations/hikvision/dark_icon.png differ diff --git a/.cache/brands/integrations/hisense_aehw4a1/dark_icon.png b/.cache/brands/integrations/hisense_aehw4a1/dark_icon.png new file mode 100644 index 0000000..c240c2c Binary files /dev/null and b/.cache/brands/integrations/hisense_aehw4a1/dark_icon.png differ diff --git a/.cache/brands/integrations/hive/dark_icon.png b/.cache/brands/integrations/hive/dark_icon.png new file mode 100644 index 0000000..1388ab4 Binary files /dev/null and b/.cache/brands/integrations/hive/dark_icon.png differ diff --git a/.cache/brands/integrations/hko/dark_icon.png b/.cache/brands/integrations/hko/dark_icon.png new file mode 100644 index 0000000..72c1ac3 Binary files /dev/null and b/.cache/brands/integrations/hko/dark_icon.png differ diff --git a/.cache/brands/integrations/hlk_sw16/dark_icon.png b/.cache/brands/integrations/hlk_sw16/dark_icon.png new file mode 100644 index 0000000..f488786 Binary files /dev/null and b/.cache/brands/integrations/hlk_sw16/dark_icon.png differ diff --git a/.cache/brands/integrations/holiday/dark_icon.png b/.cache/brands/integrations/holiday/dark_icon.png new file mode 100644 index 0000000..ded642b Binary files /dev/null and b/.cache/brands/integrations/holiday/dark_icon.png differ diff --git a/.cache/brands/integrations/homeassistant/dark_icon.png b/.cache/brands/integrations/homeassistant/dark_icon.png new file mode 100644 index 0000000..39f0c14 Binary files /dev/null and b/.cache/brands/integrations/homeassistant/dark_icon.png differ diff --git a/.cache/brands/integrations/homeassistant_sky_connect/dark_icon.png b/.cache/brands/integrations/homeassistant_sky_connect/dark_icon.png new file mode 100644 index 0000000..3f1b9fb Binary files /dev/null and b/.cache/brands/integrations/homeassistant_sky_connect/dark_icon.png differ diff --git a/.cache/brands/integrations/homeassistant_sky_connect/dark_icon@2x.png b/.cache/brands/integrations/homeassistant_sky_connect/dark_icon@2x.png new file mode 100644 index 0000000..22228f5 Binary files /dev/null and b/.cache/brands/integrations/homeassistant_sky_connect/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/homeassistant_sky_connect/dark_logo.png b/.cache/brands/integrations/homeassistant_sky_connect/dark_logo.png new file mode 100644 index 0000000..a915972 Binary files /dev/null and b/.cache/brands/integrations/homeassistant_sky_connect/dark_logo.png differ diff --git a/.cache/brands/integrations/homeassistant_sky_connect/icon.png b/.cache/brands/integrations/homeassistant_sky_connect/icon.png new file mode 100644 index 0000000..3f1b9fb Binary files /dev/null and b/.cache/brands/integrations/homeassistant_sky_connect/icon.png differ diff --git a/.cache/brands/integrations/homee/dark_icon.png b/.cache/brands/integrations/homee/dark_icon.png new file mode 100644 index 0000000..146f358 Binary files /dev/null and b/.cache/brands/integrations/homee/dark_icon.png differ diff --git a/.cache/brands/integrations/homematic/dark_icon.png b/.cache/brands/integrations/homematic/dark_icon.png new file mode 100644 index 0000000..560ffde Binary files /dev/null and b/.cache/brands/integrations/homematic/dark_icon.png differ diff --git a/.cache/brands/integrations/homeseer/dark_icon.png b/.cache/brands/integrations/homeseer/dark_icon.png new file mode 100644 index 0000000..5705712 Binary files /dev/null and b/.cache/brands/integrations/homeseer/dark_icon.png differ diff --git a/.cache/brands/integrations/homevolt/dark_icon.png b/.cache/brands/integrations/homevolt/dark_icon.png new file mode 100644 index 0000000..479e308 Binary files /dev/null and b/.cache/brands/integrations/homevolt/dark_icon.png differ diff --git a/.cache/brands/integrations/homewizard/dark_icon.png b/.cache/brands/integrations/homewizard/dark_icon.png new file mode 100644 index 0000000..d182f70 Binary files /dev/null and b/.cache/brands/integrations/homewizard/dark_icon.png differ diff --git a/.cache/brands/integrations/honeywell/dark_icon.png b/.cache/brands/integrations/honeywell/dark_icon.png new file mode 100644 index 0000000..535aaf4 Binary files /dev/null and b/.cache/brands/integrations/honeywell/dark_icon.png differ diff --git a/.cache/brands/integrations/hr_energy_qube/dark_icon.png b/.cache/brands/integrations/hr_energy_qube/dark_icon.png new file mode 100644 index 0000000..6263f73 Binary files /dev/null and b/.cache/brands/integrations/hr_energy_qube/dark_icon.png differ diff --git a/.cache/brands/integrations/html5/dark_icon.png b/.cache/brands/integrations/html5/dark_icon.png new file mode 100644 index 0000000..ca8b6f1 Binary files /dev/null and b/.cache/brands/integrations/html5/dark_icon.png differ diff --git a/.cache/brands/integrations/huawei_lte/dark_icon.png b/.cache/brands/integrations/huawei_lte/dark_icon.png new file mode 100644 index 0000000..4ea743f Binary files /dev/null and b/.cache/brands/integrations/huawei_lte/dark_icon.png differ diff --git a/.cache/brands/integrations/hunterdouglas_powerview/dark_icon.png b/.cache/brands/integrations/hunterdouglas_powerview/dark_icon.png new file mode 100644 index 0000000..6dad547 Binary files /dev/null and b/.cache/brands/integrations/hunterdouglas_powerview/dark_icon.png differ diff --git a/.cache/brands/integrations/hurrican_shutters_wholesale/dark_icon.png b/.cache/brands/integrations/hurrican_shutters_wholesale/dark_icon.png new file mode 100644 index 0000000..83925b6 Binary files /dev/null and b/.cache/brands/integrations/hurrican_shutters_wholesale/dark_icon.png differ diff --git a/.cache/brands/integrations/husqvarna/dark_icon.png b/.cache/brands/integrations/husqvarna/dark_icon.png new file mode 100644 index 0000000..87ad5ce Binary files /dev/null and b/.cache/brands/integrations/husqvarna/dark_icon.png differ diff --git a/.cache/brands/integrations/huum/dark_icon.png b/.cache/brands/integrations/huum/dark_icon.png new file mode 100644 index 0000000..71f59d1 Binary files /dev/null and b/.cache/brands/integrations/huum/dark_icon.png differ diff --git a/.cache/brands/integrations/hvv_departures/dark_icon.png b/.cache/brands/integrations/hvv_departures/dark_icon.png new file mode 100644 index 0000000..8033bd5 Binary files /dev/null and b/.cache/brands/integrations/hvv_departures/dark_icon.png differ diff --git a/.cache/brands/integrations/hydrawise/dark_icon.png b/.cache/brands/integrations/hydrawise/dark_icon.png new file mode 100644 index 0000000..9580042 Binary files /dev/null and b/.cache/brands/integrations/hydrawise/dark_icon.png differ diff --git a/.cache/brands/integrations/hyperion/dark_icon.png b/.cache/brands/integrations/hyperion/dark_icon.png new file mode 100644 index 0000000..0e996e3 Binary files /dev/null and b/.cache/brands/integrations/hyperion/dark_icon.png differ diff --git a/.cache/brands/integrations/hypontech/dark_icon.png b/.cache/brands/integrations/hypontech/dark_icon.png new file mode 100644 index 0000000..2d4dab5 Binary files /dev/null and b/.cache/brands/integrations/hypontech/dark_icon.png differ diff --git a/.cache/brands/integrations/ialarm/dark_icon.png b/.cache/brands/integrations/ialarm/dark_icon.png new file mode 100644 index 0000000..001edcd Binary files /dev/null and b/.cache/brands/integrations/ialarm/dark_icon.png differ diff --git a/.cache/brands/integrations/idrive_e2/dark_icon.png b/.cache/brands/integrations/idrive_e2/dark_icon.png new file mode 100644 index 0000000..87f3762 Binary files /dev/null and b/.cache/brands/integrations/idrive_e2/dark_icon.png differ diff --git a/.cache/brands/integrations/ifttt/dark_icon.png b/.cache/brands/integrations/ifttt/dark_icon.png new file mode 100644 index 0000000..c7c0507 Binary files /dev/null and b/.cache/brands/integrations/ifttt/dark_icon.png differ diff --git a/.cache/brands/integrations/igloohome/dark_icon.png b/.cache/brands/integrations/igloohome/dark_icon.png new file mode 100644 index 0000000..a2cab20 Binary files /dev/null and b/.cache/brands/integrations/igloohome/dark_icon.png differ diff --git a/.cache/brands/integrations/ikea/dark_icon.png b/.cache/brands/integrations/ikea/dark_icon.png new file mode 100644 index 0000000..50ff887 Binary files /dev/null and b/.cache/brands/integrations/ikea/dark_icon.png differ diff --git a/.cache/brands/integrations/image/dark_icon.png b/.cache/brands/integrations/image/dark_icon.png new file mode 100644 index 0000000..c10f094 Binary files /dev/null and b/.cache/brands/integrations/image/dark_icon.png differ diff --git a/.cache/brands/integrations/image/icon.png b/.cache/brands/integrations/image/icon.png new file mode 100644 index 0000000..c10f094 Binary files /dev/null and b/.cache/brands/integrations/image/icon.png differ diff --git a/.cache/brands/integrations/image_upload/dark_icon.png b/.cache/brands/integrations/image_upload/dark_icon.png new file mode 100644 index 0000000..c10f094 Binary files /dev/null and b/.cache/brands/integrations/image_upload/dark_icon.png differ diff --git a/.cache/brands/integrations/image_upload/icon.png b/.cache/brands/integrations/image_upload/icon.png new file mode 100644 index 0000000..c10f094 Binary files /dev/null and b/.cache/brands/integrations/image_upload/icon.png differ diff --git a/.cache/brands/integrations/imap/dark_icon.png b/.cache/brands/integrations/imap/dark_icon.png new file mode 100644 index 0000000..4bd89cb Binary files /dev/null and b/.cache/brands/integrations/imap/dark_icon.png differ diff --git a/.cache/brands/integrations/imeon_inverter/dark_icon.png b/.cache/brands/integrations/imeon_inverter/dark_icon.png new file mode 100644 index 0000000..50fdaa6 Binary files /dev/null and b/.cache/brands/integrations/imeon_inverter/dark_icon.png differ diff --git a/.cache/brands/integrations/imgw_pib/dark_icon.png b/.cache/brands/integrations/imgw_pib/dark_icon.png new file mode 100644 index 0000000..13aac7f Binary files /dev/null and b/.cache/brands/integrations/imgw_pib/dark_icon.png differ diff --git a/.cache/brands/integrations/immich/dark_icon.png b/.cache/brands/integrations/immich/dark_icon.png new file mode 100644 index 0000000..8216d3f Binary files /dev/null and b/.cache/brands/integrations/immich/dark_icon.png differ diff --git a/.cache/brands/integrations/improv_ble/dark_icon.png b/.cache/brands/integrations/improv_ble/dark_icon.png new file mode 100644 index 0000000..0f8b9c4 Binary files /dev/null and b/.cache/brands/integrations/improv_ble/dark_icon.png differ diff --git a/.cache/brands/integrations/incomfort/dark_icon.png b/.cache/brands/integrations/incomfort/dark_icon.png new file mode 100644 index 0000000..0905c17 Binary files /dev/null and b/.cache/brands/integrations/incomfort/dark_icon.png differ diff --git a/.cache/brands/integrations/indevolt/dark_icon.png b/.cache/brands/integrations/indevolt/dark_icon.png new file mode 100644 index 0000000..5a2974a Binary files /dev/null and b/.cache/brands/integrations/indevolt/dark_icon.png differ diff --git a/.cache/brands/integrations/indianamichiganpower/dark_icon.png b/.cache/brands/integrations/indianamichiganpower/dark_icon.png new file mode 100644 index 0000000..0196483 Binary files /dev/null and b/.cache/brands/integrations/indianamichiganpower/dark_icon.png differ diff --git a/.cache/brands/integrations/inels/dark_icon.png b/.cache/brands/integrations/inels/dark_icon.png new file mode 100644 index 0000000..f07418a Binary files /dev/null and b/.cache/brands/integrations/inels/dark_icon.png differ diff --git a/.cache/brands/integrations/inkbird/dark_icon.png b/.cache/brands/integrations/inkbird/dark_icon.png new file mode 100644 index 0000000..0bf61cb Binary files /dev/null and b/.cache/brands/integrations/inkbird/dark_icon.png differ diff --git a/.cache/brands/integrations/inovelli/dark_icon.png b/.cache/brands/integrations/inovelli/dark_icon.png new file mode 100644 index 0000000..547c4fa Binary files /dev/null and b/.cache/brands/integrations/inovelli/dark_icon.png differ diff --git a/.cache/brands/integrations/inspired_shades/dark_icon.png b/.cache/brands/integrations/inspired_shades/dark_icon.png new file mode 100644 index 0000000..0d51b44 Binary files /dev/null and b/.cache/brands/integrations/inspired_shades/dark_icon.png differ diff --git a/.cache/brands/integrations/insteon/dark_icon.png b/.cache/brands/integrations/insteon/dark_icon.png new file mode 100644 index 0000000..5f360b0 Binary files /dev/null and b/.cache/brands/integrations/insteon/dark_icon.png differ diff --git a/.cache/brands/integrations/intelliclima/dark_icon.png b/.cache/brands/integrations/intelliclima/dark_icon.png new file mode 100644 index 0000000..99d4b27 Binary files /dev/null and b/.cache/brands/integrations/intelliclima/dark_icon.png differ diff --git a/.cache/brands/integrations/intellifire/dark_icon.png b/.cache/brands/integrations/intellifire/dark_icon.png new file mode 100644 index 0000000..c801357 Binary files /dev/null and b/.cache/brands/integrations/intellifire/dark_icon.png differ diff --git a/.cache/brands/integrations/ios/dark_icon.png b/.cache/brands/integrations/ios/dark_icon.png new file mode 100644 index 0000000..2b65363 Binary files /dev/null and b/.cache/brands/integrations/ios/dark_icon.png differ diff --git a/.cache/brands/integrations/ipma/dark_icon.png b/.cache/brands/integrations/ipma/dark_icon.png new file mode 100644 index 0000000..26cbf15 Binary files /dev/null and b/.cache/brands/integrations/ipma/dark_icon.png differ diff --git a/.cache/brands/integrations/kegtron/dark_icon.png b/.cache/brands/integrations/kegtron/dark_icon.png new file mode 100644 index 0000000..7c9177d Binary files /dev/null and b/.cache/brands/integrations/kegtron/dark_icon.png differ diff --git a/.cache/brands/integrations/keymitt_ble/dark_icon.png b/.cache/brands/integrations/keymitt_ble/dark_icon.png new file mode 100644 index 0000000..a092a5f Binary files /dev/null and b/.cache/brands/integrations/keymitt_ble/dark_icon.png differ diff --git a/.cache/brands/integrations/kmtronic/dark_icon.png b/.cache/brands/integrations/kmtronic/dark_icon.png new file mode 100644 index 0000000..a672158 Binary files /dev/null and b/.cache/brands/integrations/kmtronic/dark_icon.png differ diff --git a/.cache/brands/integrations/lupusec/dark_icon.png b/.cache/brands/integrations/lupusec/dark_icon.png new file mode 100644 index 0000000..b6108b8 Binary files /dev/null and b/.cache/brands/integrations/lupusec/dark_icon.png differ diff --git a/.cache/brands/integrations/lutron/dark_icon.png b/.cache/brands/integrations/lutron/dark_icon.png new file mode 100644 index 0000000..a2f7956 Binary files /dev/null and b/.cache/brands/integrations/lutron/dark_icon.png differ diff --git a/.cache/brands/integrations/matter/dark_icon@2x.png b/.cache/brands/integrations/matter/dark_icon@2x.png new file mode 100644 index 0000000..c4573bc Binary files /dev/null and b/.cache/brands/integrations/matter/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/matter/icon@2x.png b/.cache/brands/integrations/matter/icon@2x.png new file mode 100644 index 0000000..81ae646 Binary files /dev/null and b/.cache/brands/integrations/matter/icon@2x.png differ diff --git a/.cache/brands/integrations/matter/logo.png b/.cache/brands/integrations/matter/logo.png new file mode 100644 index 0000000..38cce00 Binary files /dev/null and b/.cache/brands/integrations/matter/logo.png differ diff --git a/.cache/brands/integrations/media_source/dark_icon.png b/.cache/brands/integrations/media_source/dark_icon.png new file mode 100644 index 0000000..a0f3dbe Binary files /dev/null and b/.cache/brands/integrations/media_source/dark_icon.png differ diff --git a/.cache/brands/integrations/media_source/icon.png b/.cache/brands/integrations/media_source/icon.png new file mode 100644 index 0000000..a0f3dbe Binary files /dev/null and b/.cache/brands/integrations/media_source/icon.png differ diff --git a/.cache/brands/integrations/mqtt/dark_logo.png b/.cache/brands/integrations/mqtt/dark_logo.png new file mode 100644 index 0000000..b1e1d89 Binary files /dev/null and b/.cache/brands/integrations/mqtt/dark_logo.png differ diff --git a/.cache/brands/integrations/mystrom/dark_icon.png b/.cache/brands/integrations/mystrom/dark_icon.png new file mode 100644 index 0000000..6e6106f Binary files /dev/null and b/.cache/brands/integrations/mystrom/dark_icon.png differ diff --git a/.cache/brands/integrations/nibe_heatpump/dark_icon.png b/.cache/brands/integrations/nibe_heatpump/dark_icon.png new file mode 100644 index 0000000..f03e75e Binary files /dev/null and b/.cache/brands/integrations/nibe_heatpump/dark_icon.png differ diff --git a/.cache/brands/integrations/nutrichef/dark_icon.png b/.cache/brands/integrations/nutrichef/dark_icon.png new file mode 100644 index 0000000..97c54bc Binary files /dev/null and b/.cache/brands/integrations/nutrichef/dark_icon.png differ diff --git a/.cache/brands/integrations/omnilogic/dark_icon.png b/.cache/brands/integrations/omnilogic/dark_icon.png new file mode 100644 index 0000000..b2d062f Binary files /dev/null and b/.cache/brands/integrations/omnilogic/dark_icon.png differ diff --git a/.cache/brands/integrations/onewire/icon.png b/.cache/brands/integrations/onewire/icon.png new file mode 100644 index 0000000..d5b7b7d Binary files /dev/null and b/.cache/brands/integrations/onewire/icon.png differ diff --git a/.cache/brands/integrations/opentherm_gw/dark_icon.png b/.cache/brands/integrations/opentherm_gw/dark_icon.png new file mode 100644 index 0000000..b0b1ac7 Binary files /dev/null and b/.cache/brands/integrations/opentherm_gw/dark_icon.png differ diff --git a/.cache/brands/integrations/otbr/dark_icon.png b/.cache/brands/integrations/otbr/dark_icon.png new file mode 100644 index 0000000..afed723 Binary files /dev/null and b/.cache/brands/integrations/otbr/dark_icon.png differ diff --git a/.cache/brands/integrations/otbr/dark_icon@2x.png b/.cache/brands/integrations/otbr/dark_icon@2x.png new file mode 100644 index 0000000..afed723 Binary files /dev/null and b/.cache/brands/integrations/otbr/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/otbr/icon.png b/.cache/brands/integrations/otbr/icon.png new file mode 100644 index 0000000..afed723 Binary files /dev/null and b/.cache/brands/integrations/otbr/icon.png differ diff --git a/.cache/brands/integrations/palazzetti/dark_icon.png b/.cache/brands/integrations/palazzetti/dark_icon.png new file mode 100644 index 0000000..4520139 Binary files /dev/null and b/.cache/brands/integrations/palazzetti/dark_icon.png differ diff --git a/.cache/brands/integrations/panasonic/dark_icon.png b/.cache/brands/integrations/panasonic/dark_icon.png new file mode 100644 index 0000000..b3659c1 Binary files /dev/null and b/.cache/brands/integrations/panasonic/dark_icon.png differ diff --git a/.cache/brands/integrations/paperless_ngx/dark_icon.png b/.cache/brands/integrations/paperless_ngx/dark_icon.png new file mode 100644 index 0000000..6b6ea49 Binary files /dev/null and b/.cache/brands/integrations/paperless_ngx/dark_icon.png differ diff --git a/.cache/brands/integrations/peblar/dark_icon.png b/.cache/brands/integrations/peblar/dark_icon.png new file mode 100644 index 0000000..a2096b0 Binary files /dev/null and b/.cache/brands/integrations/peblar/dark_icon.png differ diff --git a/.cache/brands/integrations/pegel_online/dark_icon.png b/.cache/brands/integrations/pegel_online/dark_icon.png new file mode 100644 index 0000000..f7cd53e Binary files /dev/null and b/.cache/brands/integrations/pegel_online/dark_icon.png differ diff --git a/.cache/brands/integrations/philips/dark_icon.png b/.cache/brands/integrations/philips/dark_icon.png new file mode 100644 index 0000000..428c6ce Binary files /dev/null and b/.cache/brands/integrations/philips/dark_icon.png differ diff --git a/.cache/brands/integrations/pi_hole/dark_icon.png b/.cache/brands/integrations/pi_hole/dark_icon.png new file mode 100644 index 0000000..3854fad Binary files /dev/null and b/.cache/brands/integrations/pi_hole/dark_icon.png differ diff --git a/.cache/brands/integrations/picnic/dark_icon.png b/.cache/brands/integrations/picnic/dark_icon.png new file mode 100644 index 0000000..a1c5f41 Binary files /dev/null and b/.cache/brands/integrations/picnic/dark_icon.png differ diff --git a/.cache/brands/integrations/pinecil/dark_icon.png b/.cache/brands/integrations/pinecil/dark_icon.png new file mode 100644 index 0000000..ef46922 Binary files /dev/null and b/.cache/brands/integrations/pinecil/dark_icon.png differ diff --git a/.cache/brands/integrations/piper/dark_icon.png b/.cache/brands/integrations/piper/dark_icon.png new file mode 100644 index 0000000..db956c3 Binary files /dev/null and b/.cache/brands/integrations/piper/dark_icon.png differ diff --git a/.cache/brands/integrations/pitsos/dark_icon.png b/.cache/brands/integrations/pitsos/dark_icon.png new file mode 100644 index 0000000..7ec4894 Binary files /dev/null and b/.cache/brands/integrations/pitsos/dark_icon.png differ diff --git a/.cache/brands/integrations/plaato/dark_icon.png b/.cache/brands/integrations/plaato/dark_icon.png new file mode 100644 index 0000000..7c7c3ae Binary files /dev/null and b/.cache/brands/integrations/plaato/dark_icon.png differ diff --git a/.cache/brands/integrations/plugwise/dark_icon.png b/.cache/brands/integrations/plugwise/dark_icon.png new file mode 100644 index 0000000..05d52a3 Binary files /dev/null and b/.cache/brands/integrations/plugwise/dark_icon.png differ diff --git a/.cache/brands/integrations/poolsense/dark_icon.png b/.cache/brands/integrations/poolsense/dark_icon.png new file mode 100644 index 0000000..6f5bc4b Binary files /dev/null and b/.cache/brands/integrations/poolsense/dark_icon.png differ diff --git a/.cache/brands/integrations/portainer/dark_icon.png b/.cache/brands/integrations/portainer/dark_icon.png new file mode 100644 index 0000000..744e4c9 Binary files /dev/null and b/.cache/brands/integrations/portainer/dark_icon.png differ diff --git a/.cache/brands/integrations/powerfox/dark_icon.png b/.cache/brands/integrations/powerfox/dark_icon.png new file mode 100644 index 0000000..ddbffcf Binary files /dev/null and b/.cache/brands/integrations/powerfox/dark_icon.png differ diff --git a/.cache/brands/integrations/prana/dark_icon.png b/.cache/brands/integrations/prana/dark_icon.png new file mode 100644 index 0000000..07632ff Binary files /dev/null and b/.cache/brands/integrations/prana/dark_icon.png differ diff --git a/.cache/brands/integrations/profiler/dark_icon.png b/.cache/brands/integrations/profiler/dark_icon.png new file mode 100644 index 0000000..d7392a0 Binary files /dev/null and b/.cache/brands/integrations/profiler/dark_icon.png differ diff --git a/.cache/brands/integrations/profilo/dark_icon.png b/.cache/brands/integrations/profilo/dark_icon.png new file mode 100644 index 0000000..388812c Binary files /dev/null and b/.cache/brands/integrations/profilo/dark_icon.png differ diff --git a/.cache/brands/integrations/pse/dark_icon.png b/.cache/brands/integrations/pse/dark_icon.png new file mode 100644 index 0000000..ca562ee Binary files /dev/null and b/.cache/brands/integrations/pse/dark_icon.png differ diff --git a/.cache/brands/integrations/psoklahoma/dark_icon.png b/.cache/brands/integrations/psoklahoma/dark_icon.png new file mode 100644 index 0000000..3f1984a Binary files /dev/null and b/.cache/brands/integrations/psoklahoma/dark_icon.png differ diff --git a/.cache/brands/integrations/pulseaudio_loopback/dark_icon.png b/.cache/brands/integrations/pulseaudio_loopback/dark_icon.png new file mode 100644 index 0000000..300fc8b Binary files /dev/null and b/.cache/brands/integrations/pulseaudio_loopback/dark_icon.png differ diff --git a/.cache/brands/integrations/pure_energie/dark_icon.png b/.cache/brands/integrations/pure_energie/dark_icon.png new file mode 100644 index 0000000..ad20b2e Binary files /dev/null and b/.cache/brands/integrations/pure_energie/dark_icon.png differ diff --git a/.cache/brands/integrations/purpleair/dark_icon.png b/.cache/brands/integrations/purpleair/dark_icon.png new file mode 100644 index 0000000..1a48546 Binary files /dev/null and b/.cache/brands/integrations/purpleair/dark_icon.png differ diff --git a/.cache/brands/integrations/push/dark_icon.png b/.cache/brands/integrations/push/dark_icon.png new file mode 100644 index 0000000..dd5f9cf Binary files /dev/null and b/.cache/brands/integrations/push/dark_icon.png differ diff --git a/.cache/brands/integrations/pushbullet/dark_icon.png b/.cache/brands/integrations/pushbullet/dark_icon.png new file mode 100644 index 0000000..5155f35 Binary files /dev/null and b/.cache/brands/integrations/pushbullet/dark_icon.png differ diff --git a/.cache/brands/integrations/pushover/dark_icon@2x.png b/.cache/brands/integrations/pushover/dark_icon@2x.png new file mode 100644 index 0000000..9fcc7e5 Binary files /dev/null and b/.cache/brands/integrations/pushover/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/pushsafer/dark_icon.png b/.cache/brands/integrations/pushsafer/dark_icon.png new file mode 100644 index 0000000..49fde01 Binary files /dev/null and b/.cache/brands/integrations/pushsafer/dark_icon.png differ diff --git a/.cache/brands/integrations/pvoutput/dark_icon.png b/.cache/brands/integrations/pvoutput/dark_icon.png new file mode 100644 index 0000000..dd6b595 Binary files /dev/null and b/.cache/brands/integrations/pvoutput/dark_icon.png differ diff --git a/.cache/brands/integrations/samsung/dark_icon.png b/.cache/brands/integrations/samsung/dark_icon.png new file mode 100644 index 0000000..a3bde39 Binary files /dev/null and b/.cache/brands/integrations/samsung/dark_icon.png differ diff --git a/.cache/brands/integrations/sensorpush/dark_icon.png b/.cache/brands/integrations/sensorpush/dark_icon.png new file mode 100644 index 0000000..700892e Binary files /dev/null and b/.cache/brands/integrations/sensorpush/dark_icon.png differ diff --git a/.cache/brands/integrations/seventeentrack/icon.png b/.cache/brands/integrations/seventeentrack/icon.png new file mode 100644 index 0000000..b6754a2 Binary files /dev/null and b/.cache/brands/integrations/seventeentrack/icon.png differ diff --git a/.cache/brands/integrations/simplepush/dark_icon.png b/.cache/brands/integrations/simplepush/dark_icon.png new file mode 100644 index 0000000..2253c83 Binary files /dev/null and b/.cache/brands/integrations/simplepush/dark_icon.png differ diff --git a/.cache/brands/integrations/smarther/dark_icon.png b/.cache/brands/integrations/smarther/dark_icon.png new file mode 100644 index 0000000..30669a1 Binary files /dev/null and b/.cache/brands/integrations/smarther/dark_icon.png differ diff --git a/.cache/brands/integrations/smartthings/dark_icon.png b/.cache/brands/integrations/smartthings/dark_icon.png new file mode 100644 index 0000000..9dc7c5c Binary files /dev/null and b/.cache/brands/integrations/smartthings/dark_icon.png differ diff --git a/.cache/brands/integrations/snoo/dark_icon.png b/.cache/brands/integrations/snoo/dark_icon.png new file mode 100644 index 0000000..3c1f2d1 Binary files /dev/null and b/.cache/brands/integrations/snoo/dark_icon.png differ diff --git a/.cache/brands/integrations/snoo/icon.png b/.cache/brands/integrations/snoo/icon.png new file mode 100644 index 0000000..3c1f2d1 Binary files /dev/null and b/.cache/brands/integrations/snoo/icon.png differ diff --git a/.cache/brands/integrations/soundtouch/dark_icon.png b/.cache/brands/integrations/soundtouch/dark_icon.png new file mode 100644 index 0000000..8ca37bb Binary files /dev/null and b/.cache/brands/integrations/soundtouch/dark_icon.png differ diff --git a/.cache/brands/integrations/streamlabswater/dark_icon.png b/.cache/brands/integrations/streamlabswater/dark_icon.png new file mode 100644 index 0000000..4652149 Binary files /dev/null and b/.cache/brands/integrations/streamlabswater/dark_icon.png differ diff --git a/.cache/brands/integrations/swiss_public_transport/dark_icon.png b/.cache/brands/integrations/swiss_public_transport/dark_icon.png new file mode 100644 index 0000000..54d8e3a Binary files /dev/null and b/.cache/brands/integrations/swiss_public_transport/dark_icon.png differ diff --git a/.cache/brands/integrations/syncthing/dark_icon.png b/.cache/brands/integrations/syncthing/dark_icon.png new file mode 100644 index 0000000..d8d9409 Binary files /dev/null and b/.cache/brands/integrations/syncthing/dark_icon.png differ diff --git a/.cache/brands/integrations/tado/dark_icon.png b/.cache/brands/integrations/tado/dark_icon.png new file mode 100644 index 0000000..de03515 Binary files /dev/null and b/.cache/brands/integrations/tado/dark_icon.png differ diff --git a/.cache/brands/integrations/tailscale/dark_icon.png b/.cache/brands/integrations/tailscale/dark_icon.png new file mode 100644 index 0000000..ec94849 Binary files /dev/null and b/.cache/brands/integrations/tailscale/dark_icon.png differ diff --git a/.cache/brands/integrations/tailwind/dark_icon.png b/.cache/brands/integrations/tailwind/dark_icon.png new file mode 100644 index 0000000..0912061 Binary files /dev/null and b/.cache/brands/integrations/tailwind/dark_icon.png differ diff --git a/.cache/brands/integrations/tankerkoenig/dark_icon.png b/.cache/brands/integrations/tankerkoenig/dark_icon.png new file mode 100644 index 0000000..28780f4 Binary files /dev/null and b/.cache/brands/integrations/tankerkoenig/dark_icon.png differ diff --git a/.cache/brands/integrations/tautulli/dark_icon@2x.png b/.cache/brands/integrations/tautulli/dark_icon@2x.png new file mode 100644 index 0000000..408a4ef Binary files /dev/null and b/.cache/brands/integrations/tautulli/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/tautulli/dark_logo.png b/.cache/brands/integrations/tautulli/dark_logo.png new file mode 100644 index 0000000..aeb42e7 Binary files /dev/null and b/.cache/brands/integrations/tautulli/dark_logo.png differ diff --git a/.cache/brands/integrations/technove/dark_icon.png b/.cache/brands/integrations/technove/dark_icon.png new file mode 100644 index 0000000..18e906c Binary files /dev/null and b/.cache/brands/integrations/technove/dark_icon.png differ diff --git a/.cache/brands/integrations/tedee/dark_icon.png b/.cache/brands/integrations/tedee/dark_icon.png new file mode 100644 index 0000000..26d46dd Binary files /dev/null and b/.cache/brands/integrations/tedee/dark_icon.png differ diff --git a/.cache/brands/integrations/telegram/dark_icon.png b/.cache/brands/integrations/telegram/dark_icon.png new file mode 100644 index 0000000..e74bc27 Binary files /dev/null and b/.cache/brands/integrations/telegram/dark_icon.png differ diff --git a/.cache/brands/integrations/telldus/dark_icon.png b/.cache/brands/integrations/telldus/dark_icon.png new file mode 100644 index 0000000..3931cd9 Binary files /dev/null and b/.cache/brands/integrations/telldus/dark_icon.png differ diff --git a/.cache/brands/integrations/teltonika/dark_icon.png b/.cache/brands/integrations/teltonika/dark_icon.png new file mode 100644 index 0000000..2f0bcfe Binary files /dev/null and b/.cache/brands/integrations/teltonika/dark_icon.png differ diff --git a/.cache/brands/integrations/thermador/dark_icon.png b/.cache/brands/integrations/thermador/dark_icon.png new file mode 100644 index 0000000..e662a97 Binary files /dev/null and b/.cache/brands/integrations/thermador/dark_icon.png differ diff --git a/.cache/brands/integrations/thermobeacon/dark_icon.png b/.cache/brands/integrations/thermobeacon/dark_icon.png new file mode 100644 index 0000000..c055391 Binary files /dev/null and b/.cache/brands/integrations/thermobeacon/dark_icon.png differ diff --git a/.cache/brands/integrations/thermoplus/dark_icon.png b/.cache/brands/integrations/thermoplus/dark_icon.png new file mode 100644 index 0000000..f77b347 Binary files /dev/null and b/.cache/brands/integrations/thermoplus/dark_icon.png differ diff --git a/.cache/brands/integrations/thermopro/dark_icon.png b/.cache/brands/integrations/thermopro/dark_icon.png new file mode 100644 index 0000000..3235d6c Binary files /dev/null and b/.cache/brands/integrations/thermopro/dark_icon.png differ diff --git a/.cache/brands/integrations/thethingsnetwork/dark_icon.png b/.cache/brands/integrations/thethingsnetwork/dark_icon.png new file mode 100644 index 0000000..34d103b Binary files /dev/null and b/.cache/brands/integrations/thethingsnetwork/dark_icon.png differ diff --git a/.cache/brands/integrations/third_reality/dark_icon.png b/.cache/brands/integrations/third_reality/dark_icon.png new file mode 100644 index 0000000..2e98f47 Binary files /dev/null and b/.cache/brands/integrations/third_reality/dark_icon.png differ diff --git a/.cache/brands/integrations/thread/dark_icon@2x.png b/.cache/brands/integrations/thread/dark_icon@2x.png new file mode 100644 index 0000000..80250ba Binary files /dev/null and b/.cache/brands/integrations/thread/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/thread/icon@2x.png b/.cache/brands/integrations/thread/icon@2x.png new file mode 100644 index 0000000..80250ba Binary files /dev/null and b/.cache/brands/integrations/thread/icon@2x.png differ diff --git a/.cache/brands/integrations/threshold/dark_icon.png b/.cache/brands/integrations/threshold/dark_icon.png new file mode 100644 index 0000000..c5fc3e8 Binary files /dev/null and b/.cache/brands/integrations/threshold/dark_icon.png differ diff --git a/.cache/brands/integrations/tilt/dark_icon.png b/.cache/brands/integrations/tilt/dark_icon.png new file mode 100644 index 0000000..4fc3ed9 Binary files /dev/null and b/.cache/brands/integrations/tilt/dark_icon.png differ diff --git a/.cache/brands/integrations/tplink/dark_icon.png b/.cache/brands/integrations/tplink/dark_icon.png new file mode 100644 index 0000000..3a8961c Binary files /dev/null and b/.cache/brands/integrations/tplink/dark_icon.png differ diff --git a/.cache/brands/integrations/traccar/dark_icon.png b/.cache/brands/integrations/traccar/dark_icon.png new file mode 100644 index 0000000..ffe4f74 Binary files /dev/null and b/.cache/brands/integrations/traccar/dark_icon.png differ diff --git a/.cache/brands/integrations/tractive/dark_icon.png b/.cache/brands/integrations/tractive/dark_icon.png new file mode 100644 index 0000000..f828c88 Binary files /dev/null and b/.cache/brands/integrations/tractive/dark_icon.png differ diff --git a/.cache/brands/integrations/trane/dark_icon.png b/.cache/brands/integrations/trane/dark_icon.png new file mode 100644 index 0000000..beefca6 Binary files /dev/null and b/.cache/brands/integrations/trane/dark_icon.png differ diff --git a/.cache/brands/integrations/transmission/dark_icon.png b/.cache/brands/integrations/transmission/dark_icon.png new file mode 100644 index 0000000..1ec25f4 Binary files /dev/null and b/.cache/brands/integrations/transmission/dark_icon.png differ diff --git a/.cache/brands/integrations/triggercmd/dark_icon.png b/.cache/brands/integrations/triggercmd/dark_icon.png new file mode 100644 index 0000000..645aa32 Binary files /dev/null and b/.cache/brands/integrations/triggercmd/dark_icon.png differ diff --git a/.cache/brands/integrations/trmnl/dark_icon.png b/.cache/brands/integrations/trmnl/dark_icon.png new file mode 100644 index 0000000..6a1714d Binary files /dev/null and b/.cache/brands/integrations/trmnl/dark_icon.png differ diff --git a/.cache/brands/integrations/tuya/dark_icon@2x.png b/.cache/brands/integrations/tuya/dark_icon@2x.png new file mode 100644 index 0000000..4dac3dd Binary files /dev/null and b/.cache/brands/integrations/tuya/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/twilio/dark_icon.png b/.cache/brands/integrations/twilio/dark_icon.png new file mode 100644 index 0000000..1f88b9c Binary files /dev/null and b/.cache/brands/integrations/twilio/dark_icon.png differ diff --git a/.cache/brands/integrations/victron/dark_icon.png b/.cache/brands/integrations/victron/dark_icon.png new file mode 100644 index 0000000..f256adc Binary files /dev/null and b/.cache/brands/integrations/victron/dark_icon.png differ diff --git a/.cache/brands/integrations/wemo/dark_icon.png b/.cache/brands/integrations/wemo/dark_icon.png new file mode 100644 index 0000000..5b6e2f2 Binary files /dev/null and b/.cache/brands/integrations/wemo/dark_icon.png differ diff --git a/.cache/brands/integrations/withings/dark_icon.png b/.cache/brands/integrations/withings/dark_icon.png new file mode 100644 index 0000000..8b8d20f Binary files /dev/null and b/.cache/brands/integrations/withings/dark_icon.png differ diff --git a/.cache/brands/integrations/wyoming/dark_icon@2x.png b/.cache/brands/integrations/wyoming/dark_icon@2x.png new file mode 100644 index 0000000..93b61b3 Binary files /dev/null and b/.cache/brands/integrations/wyoming/dark_icon@2x.png differ diff --git a/.cache/brands/integrations/zamg/dark_icon.png b/.cache/brands/integrations/zamg/dark_icon.png new file mode 100644 index 0000000..3ed7199 Binary files /dev/null and b/.cache/brands/integrations/zamg/dark_icon.png differ diff --git a/.ha_run.lock b/.ha_run.lock index af610aa..fb25d3f 100644 --- a/.ha_run.lock +++ b/.ha_run.lock @@ -1 +1 @@ -{"pid": 67, "version": 1, "ha_version": "2026.4.4", "start_ts": 1777174011.4286706} \ No newline at end of file +{"pid": 67, "version": 1, "ha_version": "2026.5.0", "start_ts": 1778146972.604623} \ No newline at end of file diff --git a/automations/weekly_battery_notifications_check.yaml b/automations/weekly_battery_notifications_check.yaml index babd5bc..ad3549b 100644 --- a/automations/weekly_battery_notifications_check.yaml +++ b/automations/weekly_battery_notifications_check.yaml @@ -7,7 +7,7 @@ day: 1 time: "21:00:00" actions: - - service: notify.pushover_2 + - service: notify.pushover_zorruno data: message: > Weekly Battery Check. Low Devices: diff --git a/automations/zigbee_low_battery_notifications_2.yaml b/automations/zigbee_low_battery_notifications_2.yaml index 31fc0d3..d23b0aa 100644 --- a/automations/zigbee_low_battery_notifications_2.yaml +++ b/automations/zigbee_low_battery_notifications_2.yaml @@ -19,7 +19,7 @@ {% endfor -%} {{ ns.found }} action: - - service: notify.pushover_2 + - service: notify.pushover_zorruno data: title: View Road Sensors message: > diff --git a/esphome/esp-loungeenvironment.yaml b/esphome/esp-loungeenvironment.yaml index 4a54981..d5e7a82 100644 --- a/esphome/esp-loungeenvironment.yaml +++ b/esphome/esp-loungeenvironment.yaml @@ -351,6 +351,8 @@ sensor: device_class: temperature state_class: measurement accuracy_decimals: 2 + filters: + - offset: -2.9 on_value: then: # Publish current temperature to local MQTT status topic diff --git a/esphome/esp-mainhallwaymainlights.yaml b/esphome/esp-mainhallwaymainlights.yaml index fefcefd..061d051 100644 --- a/esphome/esp-mainhallwaymainlights.yaml +++ b/esphome/esp-mainhallwaymainlights.yaml @@ -6,6 +6,9 @@ # https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaylights.yaml #:########################################################################################:# # VERSIONS: +# V1.3 2026-05-07 Refactored MQTT sync to use template HA switch actions; physical button and +# HA control now publish command topics; relay callbacks publish status only +# to prevent command ping-pong/chattering. # V1.2 2026-04-03 Fixed local button logic so physical press toggles relay; moved custom MQTT # status publish to relay state changes; corrected ESP8266 notes and wording # V1.1 2026-04-03 Updated yaml to zorruno layout V1.1; corrected KS-811 single naming and @@ -14,27 +17,38 @@ #:########################################################################################:# # HARDWARE: # - Zemismart KS-811 Single push button +# - ESP8266 variant +# - Button 1: GPIO0 +# - Relay 1: GPIO12 +# - Status LED: GPIO2 (inverted) #:########################################################################################:# # OPERATION NOTES: # - Main hallway switch with 1 output: # 1) Main Hallway Lights -# - A single press of the physical button toggles Relay 1 ON/OFF locally -# - Relay state is published to the custom MQTT status topic for remote sync -# - Status LED uses GPIO2 +# - A single press of the physical button toggles the Main Hallway Lights group. +# - Home Assistant control of the exposed template switch also toggles the same group. +# - MQTT command topic requests On/Off changes. +# - Relay state changes publish retained status only. +# - Relays never publish command topics directly. This prevents command ping-pong/chattering. #:########################################################################################:# # MQTT COMMANDS: -# - None +# - ${mqtt_this_device_command_topic1} +# Payloads: ${mqtt_command_on}, ${mqtt_command_off} +# - Status topic: +# - ${mqtt_this_device_status_topic1} +# Payloads mirror the actual relay state and are published retained. #:########################################################################################:# # OFFLINE NOTES: # - a) Home Assistant offline (network and MQTT online): -# - Device remains on WiFi and MQTT -# - Physical button still toggles relay locally +# - Local button control continues. +# - MQTT command/status operation continues. # - b) MQTT offline (or Home Assistant and MQTT offline): -# - Physical button still toggles relay locally -# - Remote control/state sync is unavailable until MQTT returns +# - Local button control continues. +# - If Home Assistant is online and connected by native ESPHome API, HA control can still +# change the local relay but remote MQTT sync is unavailable until MQTT returns. # - c) Entire WiFi/network offline: -# - Physical button still toggles relay locally -# - Accurate time is not needed; SNTP is not used +# - Local wall-switch button control continues. +# - Accurate time is not needed. SNTP is not used for this device. #:########################################################################################:# #:########################################################################################:# @@ -50,7 +64,7 @@ substitutions: # Project Naming project_name: "Zemismart Technologies.KS-811 Single" # Project Details - project_version: "v1.1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version + project_version: "v1.3" # Project V denotes release of yaml file, allowing checking of deployed vs latest version # Passwords api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names @@ -64,17 +78,21 @@ substitutions: current_ip_address: ${static_ip_address} # Device Settings - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc + log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, VERY_VERBOSE + update_interval: "60s" # General sensor update interval - # MQTT REMOTE Controls + # Default relay restore mode + # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF + relay_restore_mode: "RESTORE_DEFAULT_OFF" + + # MQTT Remote Controls mqtt_this_device_function1: "mainhallway-mainlights" mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" mqtt_this_device_status_topic1: "${mqtt_status_main_topic}/${mqtt_this_device_function1}" mqtt_command_on: "On" mqtt_command_off: "Off" - # Switch/Relay/Button Naming & Icons + # Switch/Relay/Button Naming switch_1_name: "Main Hallway Lights" #:########################################################################################:# @@ -123,7 +141,7 @@ packages: esphome: name: "${device_name}" friendly_name: "${friendly_name}" - comment: "${description_comment}" # Appears on the esphome page in HA + comment: "${description_comment}" # Appears on the ESPHome page in HA area: "${device_area}" project: name: "${project_name}" @@ -135,8 +153,8 @@ esphome: #:########################################################################################:# esp8266: board: esp01_1m - early_pin_init: false # Initialise pins early to known values. Recommended false where switches are involved. Defaults to true. - board_flash_mode: dout # Default is dout + early_pin_init: false # Recommended false where relays/switches are involved + board_flash_mode: dout #:########################################################################################:# # LOGGING @@ -144,15 +162,17 @@ esp8266: #:########################################################################################:# logger: level: "${log_level}" - #baud_rate: 0 # set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) + #baud_rate: 0 # Set to 0 for no logging via UART if UART is needed elsewhere #esp8266_store_log_strings_in_flash: false #tx_buffer_size: 64 #:########################################################################################:# # MQTT: Device-specific MQTT command triggers -# This adds device-specific MQTT command triggers to the common MQTT configuration. +# This extends the common MQTT package with local custom command/status topics. #:########################################################################################:# mqtt: + # Republish current relay state whenever MQTT reconnects so retained status stays accurate + # for subscribers that reconnect later. on_connect: - mqtt.publish: topic: "${mqtt_this_device_status_topic1}" @@ -161,23 +181,23 @@ mqtt: retain: true on_message: + # Mirror remote command onto Relay_1, but only if a real state change is needed. + # Do not republish the command from here. Relay status is published by the relay callback. - topic: "${mqtt_this_device_command_topic1}" payload: "${mqtt_command_on}" then: - - delay: 50ms - if: condition: - lambda: 'return !id(Relay_1).state;' + lambda: "return !id(Relay_1).state;" then: - switch.turn_on: Relay_1 - topic: "${mqtt_this_device_command_topic1}" payload: "${mqtt_command_off}" then: - - delay: 50ms - if: condition: - lambda: 'return id(Relay_1).state;' + lambda: "return id(Relay_1).state;" then: - switch.turn_off: Relay_1 @@ -187,8 +207,55 @@ mqtt: #:########################################################################################:# status_led: pin: - number: GPIO02 - inverted: yes + number: GPIO2 + inverted: true + +#:########################################################################################:# +# SCRIPTS +# https://esphome.io/components/script.html +#:########################################################################################:# +script: + # Local/HA requested ON. Change the local relay immediately, then publish a non-retained + # command so any other linked switch follows. + - id: mainhallway_mainlights_on + mode: restart + then: + - if: + condition: + lambda: "return !id(Relay_1).state;" + then: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + retain: false + + # Local/HA requested OFF. Change the local relay immediately, then publish a non-retained + # command so any other linked switch follows. + - id: mainhallway_mainlights_off + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + retain: false + + # Physical button toggle logic. This is the only place that decides ON vs OFF. + - id: mainhallway_mainlights_toggle + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - script.execute: mainhallway_mainlights_off + else: + - script.execute: mainhallway_mainlights_on #:########################################################################################:# # BINARY SENSORS @@ -205,29 +272,32 @@ binary_sensor: - delayed_on: 10ms - delayed_off: 10ms on_press: - - if: - condition: - switch.is_on: Relay_1 - then: - - switch.turn_off: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_off}" - else: - - switch.turn_on: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_on}" + - script.execute: mainhallway_mainlights_toggle #:########################################################################################:# # SWITCH # https://esphome.io/components/switch/ #:########################################################################################:# switch: - - platform: gpio + # Exposed Home Assistant control. This is the switch to use in HA. + - platform: template name: "Relay 1: ${switch_1_name}" + id: Relay_1_HA + lambda: |- + return id(Relay_1).state; + turn_on_action: + - script.execute: mainhallway_mainlights_on + turn_off_action: + - script.execute: mainhallway_mainlights_off + + # Physical relay. Kept internal so HA uses the template switch above. + # Relay callbacks publish retained status only, not commands. + - platform: gpio + name: "Internal Relay 1: ${switch_1_name}" + internal: true pin: GPIO12 id: Relay_1 + restore_mode: ${relay_restore_mode} on_turn_on: - mqtt.publish: topic: "${mqtt_this_device_status_topic1}" diff --git a/esphome/esp-mainhallwaynightlights.yaml b/esphome/esp-mainhallwaynightlights.yaml index ca2948e..ded404a 100644 --- a/esphome/esp-mainhallwaynightlights.yaml +++ b/esphome/esp-mainhallwaynightlights.yaml @@ -1,39 +1,56 @@ #:########################################################################################:# -# TITLE: MAIN HALLWAY LIGHTSWITCH 2 (BK7231N) +# TITLE: MAIN HALLWAY NIGHTLIGHTS SWITCH (BK7231N) # zorruno.com layout v1.1 2026 #:########################################################################################:# # REPO: -# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaylights2.yaml +# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaynightlights.yaml #:########################################################################################:# # VERSIONS: -# V1.1 2026-04-03 Updated yaml to zorruno layout V1.1; corrected KS-811 single naming and operation notes; updated BK7231N single-switch pin mapping +# V1.2 2026-05-07 Refactored MQTT sync to use template HA switch actions; physical button and +# HA control now publish command topics; relay callbacks publish status only +# to prevent command ping-pong/chattering. +# V1.1 2026-04-03 Updated yaml to zorruno layout V1.1; corrected KS-811 single naming and +# operation notes; updated BK7231N single-switch pin mapping # V1.0 2026-04-03 Initial #:########################################################################################:# # HARDWARE: # - Zemismart KS-811 Single push button # - BK7231N based switch # - BK72XX board: generic-bk7231n-qfn32-tuya -# - BK7231N single-switch pin mapping checked against KS-811 BK references +# - BK7231N single-switch pin mapping: +# - Button 1: P24 +# - Relay 1: P16 +# - Status LED: P22 inverted #:########################################################################################:# # OPERATION NOTES: -# - Main hallway nightlight switch with 1 output: +# - Main hallway nightlights switch with 1 output: # 1) Main Hallway Nightlights -# - A single press of the physical button toggles Relay 1 ON/OFF -# - Status LED uses P22 +# - A single press of the physical button toggles the Main Hallway Nightlights group. +# - Home Assistant control of the exposed template switch also toggles the same group. +# - MQTT command topic requests On/Off changes. +# - Relay state changes publish retained status only. +# - Relays never publish command topics directly. This prevents command ping-pong/chattering. +# - This switch shares the mainhallway-nightlights command topic with Relay 2 on the +# Main Hallway North Lightswitch. #:########################################################################################:# # MQTT COMMANDS: -# - None +# - ${mqtt_this_device_command_topic1} +# Payloads: ${mqtt_command_on}, ${mqtt_command_off} +# - Status topic: +# - ${mqtt_this_device_status_topic1} +# Payloads mirror the actual relay state and are published retained. #:########################################################################################:# # OFFLINE NOTES: # - a) Home Assistant offline (network and MQTT online): -# - Device remains on WiFi and MQTT -# - Physical button still toggles relay locally +# - Local button control continues. +# - MQTT command/status operation continues. # - b) MQTT offline (or Home Assistant and MQTT offline): -# - Physical button still toggles relay locally -# - Remote control/state sync is unavailable until MQTT returns +# - Local button control continues. +# - If Home Assistant is online and connected by native ESPHome API, HA control can still +# change the local relay but remote MQTT sync is unavailable until MQTT returns. # - c) Entire WiFi/network offline: -# - Physical button still toggles relay locally -# - Accurate time is not needed; SNTP is not used +# - Local wall-switch button control continues. +# - Accurate time is not needed. SNTP is not used for this device. #:########################################################################################:# #:########################################################################################:# @@ -49,7 +66,7 @@ substitutions: # Project Naming project_name: "Zemismart Technologies.KS-811 Single BK7231N" # Project Details - project_version: "v1.1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version + project_version: "v1.2" # Project V denotes release of yaml file, allowing checking of deployed vs latest version # Passwords api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names @@ -63,21 +80,21 @@ substitutions: current_ip_address: ${static_ip_address} # Device Settings - log_level: "INFO" # Define logging level: NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE - update_interval: "60s" # update time for for general sensors etc + log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, VERY_VERBOSE + update_interval: "60s" # General sensor update interval - # MQTT REMOTE Controls + # Default relay restore mode + # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF + relay_restore_mode: "RESTORE_DEFAULT_OFF" + + # MQTT Remote Controls mqtt_this_device_function1: "mainhallway-nightlights" mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" mqtt_this_device_status_topic1: "${mqtt_status_main_topic}/${mqtt_this_device_function1}" mqtt_command_on: "On" mqtt_command_off: "Off" - # Default relay restore mode - # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF - relay_restore_mode: "RESTORE_DEFAULT_OFF" - - # Switch/Relay/Button Naming & Icons + # Switch/Relay/Button Naming switch_1_name: "Main Hallway Nightlights" #:########################################################################################:# @@ -137,7 +154,7 @@ wifi: esphome: name: "${device_name}" friendly_name: "${friendly_name}" - comment: "${description_comment}" # Appears on the esphome page in HA + comment: "${description_comment}" # Appears on the ESPHome page in HA area: "${device_area}" project: name: "${project_name}" @@ -156,15 +173,17 @@ bk72xx: # https://esphome.io/components/logger.html #:########################################################################################:# logger: - level: "${log_level}" # INFO Level suggested, or DEBUG for testing - baud_rate: 0 # set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM) + level: "${log_level}" # INFO Level suggested, or DEBUG for testing + baud_rate: 0 # set to 0 for no logging via UART, needed if you are using it for other serial things id: logger_id #:########################################################################################:# # MQTT: Device-specific MQTT command triggers -# This adds device-specific MQTT command triggers to the common MQTT configuration. +# This extends the common MQTT package with local custom command/status topics. #:########################################################################################:# mqtt: + # Republish current relay state whenever MQTT reconnects so retained status stays accurate + # for subscribers that reconnect later. on_connect: - mqtt.publish: topic: "${mqtt_this_device_status_topic1}" @@ -173,23 +192,23 @@ mqtt: retain: true on_message: + # Mirror remote command onto Relay_1, but only if a real state change is needed. + # Do not republish the command from here. Relay status is published by the relay callback. - topic: "${mqtt_this_device_command_topic1}" payload: "${mqtt_command_on}" then: - - delay: 50ms - if: condition: - lambda: 'return !id(Relay_1).state;' + lambda: "return !id(Relay_1).state;" then: - switch.turn_on: Relay_1 - topic: "${mqtt_this_device_command_topic1}" payload: "${mqtt_command_off}" then: - - delay: 50ms - if: condition: - lambda: 'return id(Relay_1).state;' + lambda: "return id(Relay_1).state;" then: - switch.turn_off: Relay_1 @@ -202,6 +221,53 @@ status_led: number: P22 # GPIO22 inverted: true +#:########################################################################################:# +# SCRIPTS +# https://esphome.io/components/script.html +#:########################################################################################:# +script: + # Local/HA requested ON. Change the local relay immediately, then publish a non-retained + # command so the matching relay on the north switch follows. + - id: mainhallway_nightlights_on + mode: restart + then: + - if: + condition: + lambda: "return !id(Relay_1).state;" + then: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + retain: false + + # Local/HA requested OFF. Change the local relay immediately, then publish a non-retained + # command so the matching relay on the north switch follows. + - id: mainhallway_nightlights_off + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + retain: false + + # Physical button toggle logic. This is the only place that decides ON vs OFF. + - id: mainhallway_nightlights_toggle + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - script.execute: mainhallway_nightlights_off + else: + - script.execute: mainhallway_nightlights_on + #:########################################################################################:# # BINARY SENSORS: # https://esphome.io/components/binary_sensor/ @@ -211,7 +277,7 @@ binary_sensor: id: button_1 internal: true pin: - number: P24 + number: P24 # GPIO24 mode: input: true pullup: true @@ -221,28 +287,31 @@ binary_sensor: - delayed_on: 10ms - delayed_off: 10ms on_press: - - if: - condition: - switch.is_on: Relay_1 - then: - - switch.turn_off: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_off}" - else: - - switch.turn_on: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_on}" + - script.execute: mainhallway_nightlights_toggle #:########################################################################################:# # SWITCH COMPONENT: # https://esphome.io/components/switch/ #:########################################################################################:# switch: - - platform: gpio + # Exposed Home Assistant control. This controls the local relay and publishes the matching + # command so the Main Hallway North Lightswitch nightlights relay follows. + - platform: template name: "Relay 1: ${switch_1_name}" - pin: P16 + id: Relay_1_HA + lambda: |- + return id(Relay_1).state; + turn_on_action: + - script.execute: mainhallway_nightlights_on + turn_off_action: + - script.execute: mainhallway_nightlights_off + + # Physical relay. Kept internal so HA uses the template switch above. + # Relay callbacks publish retained status only, not commands. + - platform: gpio + name: "Internal Relay 1: ${switch_1_name}" + internal: true + pin: P16 # GPIO16 id: Relay_1 restore_mode: ${relay_restore_mode} on_turn_on: diff --git a/esphome/esp-mainhallwaynorthlightswitch.yaml b/esphome/esp-mainhallwaynorthlightswitch.yaml index 2d742da..f902abb 100644 --- a/esphome/esp-mainhallwaynorthlightswitch.yaml +++ b/esphome/esp-mainhallwaynorthlightswitch.yaml @@ -6,6 +6,9 @@ # https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-mainhallwaynorthlightswitch.yaml #:########################################################################################:# # VERSIONS: +# V1.2 2026-05-07 Refactored MQTT sync to use template HA switch actions; physical buttons and +# HA controls now publish command topics; relay callbacks publish status only +# to prevent command ping-pong/chattering. # V1.1 2026-04-04 Updated yaml to zorruno layout V1.1; checked KS-811 dual ESP8266 GPIO mapping; # corrected Relay 2 naming; added MQTT state republish on reconnect; added # GPIO16 polling for Button 1 compatibility; expanded notes/comments @@ -22,11 +25,12 @@ # - Status LED: GPIO2 (inverted) #:########################################################################################:# # OPERATION NOTES: -# - Button 1 toggles Relay 1 locally. -# - Button 2 toggles Relay 2 locally. -# - MQTT command topics can also turn each relay On or Off. -# - Custom MQTT status topics publish the actual relay state after local or MQTT changes. -# - Current relay states are also republished whenever MQTT reconnects, helping late subscribers. +# - Button 1 toggles the Main Hallway Lights group. +# - Button 2 toggles the Main Hallway Nightlights group. +# - Home Assistant control of the exposed template switches also toggles the matching groups. +# - MQTT command topics request On/Off changes. +# - Relay state changes publish retained status only. +# - Relays never publish command topics directly. This prevents command ping-pong/chattering. # - GPIO16 on ESP8266 does not support normal GPIO interrupts, so Button 1 uses polling mode. #:########################################################################################:# # MQTT COMMANDS: @@ -46,8 +50,8 @@ # # b) MQTT offline (or HA and MQTT offline) # - Local button control continues. -# - If Home Assistant is online and connected by native ESPHome API, HA control can still work. -# - Custom MQTT commands/status are unavailable until MQTT returns. +# - If Home Assistant is online and connected by native ESPHome API, HA control can still +# change the local relays but remote MQTT sync is unavailable until MQTT returns. # # c) Entire WiFi/network offline # - Local wall-switch button control continues for both relays. @@ -67,7 +71,7 @@ substitutions: # Project Naming project_name: "Zemismart Technologies.KS-811 Double" - project_version: "v1.1" # Project V denotes release of yaml file, allowing checking of deployed vs latest version + project_version: "v1.2" # Project V denotes release of yaml file, allowing checking of deployed vs latest version # Passwords api_key: !secret esp-api_key # unfortunately you can't use substitutions inside secrets names @@ -84,6 +88,10 @@ substitutions: log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, VERY_VERBOSE update_interval: "60s" # General sensor update interval + # Default relay restore mode + # Options: RESTORE_DEFAULT_OFF, RESTORE_DEFAULT_ON, ALWAYS_ON, ALWAYS_OFF + relay_restore_mode: "RESTORE_DEFAULT_OFF" + # MQTT Remote Controls mqtt_this_device_function1: "mainhallway-mainlights" mqtt_this_device_command_topic1: "${mqtt_command_main_topic}/${mqtt_this_device_function1}" @@ -190,7 +198,8 @@ mqtt: retain: true on_message: - # Mirror remote state onto Relay_1, but only if a real state change is needed. + # Mirror remote command onto Relay_1, but only if a real state change is needed. + # Do not republish the command from here. Relay status is published by the relay callback. - topic: "${mqtt_this_device_command_topic1}" payload: "${mqtt_command_on}" then: @@ -209,7 +218,8 @@ mqtt: then: - switch.turn_off: Relay_1 - # Mirror remote state onto Relay_2, but only if a real state change is needed. + # Mirror remote command onto Relay_2, but only if a real state change is needed. + # Do not republish the command from here. Relay status is published by the relay callback. - topic: "${mqtt_this_device_command_topic2}" payload: "${mqtt_command_on}" then: @@ -237,6 +247,93 @@ status_led: number: GPIO2 inverted: true +#:########################################################################################:# +# SCRIPTS +# https://esphome.io/components/script.html +#:########################################################################################:# +script: + # Local/HA requested ON for Main Hallway Lights. Change the local relay immediately, then + # publish a non-retained command so any other linked switch follows. + - id: mainhallway_mainlights_on + mode: restart + then: + - if: + condition: + lambda: "return !id(Relay_1).state;" + then: + - switch.turn_on: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_on}" + retain: false + + # Local/HA requested OFF for Main Hallway Lights. + - id: mainhallway_mainlights_off + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - switch.turn_off: Relay_1 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic1}" + payload: "${mqtt_command_off}" + retain: false + + # Physical Button 1 toggle logic. + - id: mainhallway_mainlights_toggle + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_1).state;" + then: + - script.execute: mainhallway_mainlights_off + else: + - script.execute: mainhallway_mainlights_on + + # Local/HA requested ON for Main Hallway Nightlights. Change the local relay immediately, + # then publish a non-retained command so any other linked switch follows. + - id: mainhallway_nightlights_on + mode: restart + then: + - if: + condition: + lambda: "return !id(Relay_2).state;" + then: + - switch.turn_on: Relay_2 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_on}" + retain: false + + # Local/HA requested OFF for Main Hallway Nightlights. + - id: mainhallway_nightlights_off + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_2).state;" + then: + - switch.turn_off: Relay_2 + - mqtt.publish: + topic: "${mqtt_this_device_command_topic2}" + payload: "${mqtt_command_off}" + retain: false + + # Physical Button 2 toggle logic. + - id: mainhallway_nightlights_toggle + mode: restart + then: + - if: + condition: + lambda: "return id(Relay_2).state;" + then: + - script.execute: mainhallway_nightlights_off + else: + - script.execute: mainhallway_nightlights_on + #:########################################################################################:# # BINARY SENSORS # https://esphome.io/components/binary_sensor/ @@ -254,19 +351,7 @@ binary_sensor: - delayed_on: 10ms - delayed_off: 10ms on_press: - - if: - condition: - switch.is_on: Relay_1 - then: - - switch.turn_off: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_off}" - else: - - switch.turn_on: Relay_1 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic1}" - payload: "${mqtt_command_on}" + - script.execute: mainhallway_mainlights_toggle - platform: gpio pin: @@ -279,29 +364,45 @@ binary_sensor: - delayed_on: 10ms - delayed_off: 10ms on_press: - - if: - condition: - switch.is_on: Relay_2 - then: - - switch.turn_off: Relay_2 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic2}" - payload: "${mqtt_command_off}" - else: - - switch.turn_on: Relay_2 - - mqtt.publish: - topic: "${mqtt_this_device_command_topic2}" - payload: "${mqtt_command_on}" + - script.execute: mainhallway_nightlights_toggle #:########################################################################################:# # SWITCH # https://esphome.io/components/switch/ #:########################################################################################:# switch: - - platform: gpio + # Exposed Home Assistant control for Main Hallway Lights. This controls the local relay and + # publishes the matching command so linked switches follow. + - platform: template name: "Relay 1: ${switch_1_name}" + id: Relay_1_HA + lambda: |- + return id(Relay_1).state; + turn_on_action: + - script.execute: mainhallway_mainlights_on + turn_off_action: + - script.execute: mainhallway_mainlights_off + + # Exposed Home Assistant control for Main Hallway Nightlights. Use this as the single HA + # control for the nightlights group, provided other devices subscribe to the same command topic. + - platform: template + name: "Relay 2: ${switch_2_name}" + id: Relay_2_HA + lambda: |- + return id(Relay_2).state; + turn_on_action: + - script.execute: mainhallway_nightlights_on + turn_off_action: + - script.execute: mainhallway_nightlights_off + + # Physical Relay 1. Kept internal so HA uses the template switch above. + # Relay callbacks publish retained status only, not commands. + - platform: gpio + name: "Internal Relay 1: ${switch_1_name}" + internal: true pin: GPIO13 id: Relay_1 + restore_mode: ${relay_restore_mode} on_turn_on: - mqtt.publish: topic: "${mqtt_this_device_status_topic1}" @@ -313,10 +414,14 @@ switch: payload: "${mqtt_command_off}" retain: true + # Physical Relay 2. Kept internal so HA uses the template switch above. + # Relay callbacks publish retained status only, not commands. - platform: gpio - name: "Relay 2: ${switch_2_name}" + name: "Internal Relay 2: ${switch_2_name}" + internal: true pin: GPIO12 id: Relay_2 + restore_mode: ${relay_restore_mode} on_turn_on: - mqtt.publish: topic: "${mqtt_this_device_status_topic2}" diff --git a/packages/announcement_test.yaml b/packages/announcement_test.yaml new file mode 100644 index 0000000..300c0f9 --- /dev/null +++ b/packages/announcement_test.yaml @@ -0,0 +1,39 @@ +################################################################################ +# PACKAGE: Announcement Test Button +################################################################################ + +input_button: + announcement_test: + name: Test Announcement + icon: mdi:bullhorn + +automation: + - id: announcement_test_button_pressed + alias: Announcement Test Button Pressed + mode: single + + trigger: + - platform: state + entity_id: input_button.announcement_test + + action: + - action: script.view_road_announcement + data: + channels: "sony_tv_lounge" + title: "View Road Test" + short_announcement: "Test announcement" + long_announcement: "This is a test announcement from the package test button." + payload: "On" + indicator: "" + + #- action: script.view_road_announcement + # data: + # channels: "pushover_zorruno,pushover_kim" + # title: "View Road Test" + # long_announcement: "This is a test through the View Road announcement router." + + - action: script.view_road_announcement + data: + channels: "lounge_google_home_voice" + title: "View Road Test" + long_announcement: "This is a test announcement on the lounge Google Home." diff --git a/packages/bedtime_mode_actions.yaml b/packages/bedtime_mode_actions.yaml new file mode 100644 index 0000000..6d9a4a4 --- /dev/null +++ b/packages/bedtime_mode_actions.yaml @@ -0,0 +1,234 @@ +############################################################################### +# PACKAGE: Bedtime Mode Delayed Shutdown +############################################################################### +# +# VERSION: +# 1.3 - 2026-05-07 +# - Added downstairs lights all off script. +# - Added main hallway nightlights 60 minute bedtime timer. +# - Added timer cancellation if main hallway nightlights are manually turned off. +# +# 1.2 - 2026-05-04 +# - Removed script field selectors to avoid HA selector validation error. +# +# 1.1 - 2026-05-04 +# - Added lounge scene selection to "All Off". +# - Added quiet time activation. +# +# 1.0 - 2026-05-04 +# - Initial package. +# - Triggered by input_button.bedtime_mode or ESPHome lounge hold event. +# - Turns listed entities off after individual delays. +# - Only sends OFF if the entity is currently on/active. +# +# NOTES: +# - Add more entities to bedtime_delayed_off_targets. +# - delay_seconds is counted from the original button press. +# - Delays are not cumulative. +# - switch and remote entities are only turned off if state == "on". +# - climate entities are turned off if they are not already "off". +# - Main hallway nightlights are turned on for 60 minutes when bedtime mode runs. +# - If the main hallway nightlights are turned off manually, the timer is cancelled. +# +############################################################################### + +############################################################################### +# TIMER +############################################################################### + +timer: + main_hallway_nightlights_bedtime: + name: Main Hallway Nightlights Bedtime Timer + duration: "01:00:00" + +############################################################################### +# AUTOMATIONS +############################################################################### + +automation: + - id: bedtime_mode_delayed_shutdown + alias: "Bedtime Mode - Delayed Shutdown" + description: > + Runs bedtime delayed shutdown when the bedtime button is pressed or when + the lounge switch hold ESPHome event is seen. + + trigger: + - platform: state + entity_id: input_button.bedtime_mode + id: bedtime_mode_button + + - platform: event + event_type: esphome.lounge_switch_hold + id: lounge_switch_hold + + variables: + bedtime_delayed_off_targets: + - entity_id: switch.esp_mainkitchenlights_relay_1_main_lights + delay_seconds: 4 + + - entity_id: switch.esp_mainkitchenlights_relay_2_benchtop_lights + delay_seconds: 4 + + - entity_id: switch.esp_entrancelightswitch_relay_1_entrance_lights + delay_seconds: 5 + + - entity_id: switch.esp_garageentrylights_relay_3_garage_lights + delay_seconds: 10 + + - entity_id: switch.esp_garageentrylights_relay_1_corridor_lights + delay_seconds: 10 + + - entity_id: switch.rinnai_neo_gas_heater_heater_operation + delay_seconds: 1 + + - entity_id: climate.lounge + delay_seconds: 1 + + - entity_id: switch.lounge_cupboard_dual_usb_xus09_l2 + delay_seconds: 2 + + - entity_id: switch.tv_surround_amp_power_in_loft_x27pp + delay_seconds: 1 + + - entity_id: remote.lounge_tv + delay_seconds: 0 + + action: + - service: script.downstairs_lights_all_off + + - service: script.lounge_set_scene + data: + scene_name: "All Off" + + - service: input_boolean.turn_on + target: + entity_id: input_boolean.quiet_time + + - service: switch.turn_on + target: + entity_id: switch.main_hallway_nightlights_1_relay_1_main_hallway_nightlights + + - service: timer.start + target: + entity_id: timer.main_hallway_nightlights_bedtime + data: + duration: "01:00:00" + + - repeat: + for_each: "{{ bedtime_delayed_off_targets }}" + sequence: + - service: script.turn_on + target: + entity_id: script.bedtime_mode_turn_entity_off_after_delay + data: + variables: + target_entity: "{{ repeat.item.entity_id }}" + delay_seconds: "{{ repeat.item.delay_seconds | int(0) }}" + + mode: queued + max: 5 + + - id: bedtime_mode_cancel_main_hallway_nightlights_timer + alias: "Bedtime Mode - Cancel Main Hallway Nightlights Timer" + description: > + Cancels the bedtime nightlights timer if something else turns the + main hallway nightlights off. + + trigger: + - platform: state + entity_id: switch.main_hallway_nightlights_1_relay_1_main_hallway_nightlights + to: "off" + + condition: + - condition: state + entity_id: timer.main_hallway_nightlights_bedtime + state: "active" + + action: + - service: timer.cancel + target: + entity_id: timer.main_hallway_nightlights_bedtime + + mode: single + + - id: bedtime_mode_main_hallway_nightlights_timer_finished + alias: "Bedtime Mode - Main Hallway Nightlights Timer Finished" + description: > + Turns the main hallway nightlights off when the bedtime timer finishes. + + trigger: + - platform: event + event_type: timer.finished + event_data: + entity_id: timer.main_hallway_nightlights_bedtime + + condition: + - condition: state + entity_id: switch.main_hallway_nightlights_1_relay_1_main_hallway_nightlights + state: "on" + + action: + - service: switch.turn_off + target: + entity_id: switch.main_hallway_nightlights_1_relay_1_main_hallway_nightlights + + mode: single + +############################################################################### +# SCRIPTS +############################################################################### + +script: + bedtime_mode_turn_entity_off_after_delay: + alias: "Bedtime Mode - Turn Entity Off After Delay" + description: > + Waits for the supplied delay, checks whether the supplied entity is still + on/active, then sends the correct turn_off command for its domain. + + sequence: + - delay: + seconds: "{{ delay_seconds | int(0) }}" + + - variables: + target_domain: "{{ target_entity.split('.')[0] }}" + + - condition: template + value_template: > + {% if target_domain == 'climate' %} + {{ states(target_entity) not in ['off', 'unknown', 'unavailable'] }} + {% else %} + {{ is_state(target_entity, 'on') }} + {% endif %} + + - choose: + - conditions: + - condition: template + value_template: "{{ target_domain == 'switch' }}" + sequence: + - service: switch.turn_off + data: + entity_id: "{{ target_entity }}" + + - conditions: + - condition: template + value_template: "{{ target_domain == 'climate' }}" + sequence: + - service: climate.turn_off + data: + entity_id: "{{ target_entity }}" + + - conditions: + - condition: template + value_template: "{{ target_domain == 'remote' }}" + sequence: + - service: remote.turn_off + data: + entity_id: "{{ target_entity }}" + + default: + - service: homeassistant.turn_off + data: + entity_id: "{{ target_entity }}" + + mode: parallel + max: 50 diff --git a/packages/downstairs_flat_controls.yaml b/packages/downstairs_flat_controls.yaml index 04b3079..feb328a 100644 --- a/packages/downstairs_flat_controls.yaml +++ b/packages/downstairs_flat_controls.yaml @@ -1,96 +1,163 @@ +############################################################################### +# PACKAGE: Downstairs Flat Light Control +############################################################################### +# +# VERSION HISTORY +# +# 2026-05-07 - v1.0.1 +# - Removed group.downstairs_flat_lights from this package to avoid duplicate +# group/name package merge errors. +# - Changed all-on/all-off scripts to use direct entity lists instead. +# +# 2026-05-07 - v1.0.0 +# - Tidied original package. +# - Added package header and comments. +# - Added internal helper script to avoid repeating the same occupancy logic. +# +############################################################################### +# +# OPERATION NOTES +# +# - input_boolean.downstairs_flat_occupied is the safety/lockout helper. +# +# - When downstairs_flat_occupied is ON: +# - All scripts in this package do nothing. +# - This prevents upstairs controls from changing downstairs guest lights. +# +# - When downstairs_flat_occupied is OFF: +# - Individual scripts toggle their matching light switch. +# - downstairs_lights_all_off only ever turns the listed lights OFF. +# - downstairs_light_toggle_all_group turns all listed lights OFF if any are ON. +# - downstairs_light_toggle_all_group turns all listed lights ON if they are all OFF. +# +############################################################################### + +############################################################################### +# INPUT BOOLEANS +############################################################################### + input_boolean: downstairs_flat_occupied: name: Downstairs Guest Occupied - icon: mdi:briefcase-plus-outline + icon: mdi:home-account + +############################################################################### +# SCRIPTS +############################################################################### script: - downstairs_light_toggle_lounge_main: - alias: Downstairs Light Toggle - Lounge Main Lights - mode: queued + downstairs_lights_all_off: + alias: Downstairs Lights - All Off + mode: single sequence: - condition: state entity_id: input_boolean.downstairs_flat_occupied state: "off" - - service: switch.toggle + + - action: homeassistant.turn_off target: - entity_id: switch.esp_downstloungemain_relay_1_main_lights + entity_id: + - switch.esp_downstloungemain_relay_1_main_lights + - switch.esp_downstloungemain_relay_2_back_wall_lights + - switch.esp_downstmasterbedrmlights_relay_1_main_lights + - switch.esp_downstbedrm2lights_relay_1_main_lights + - switch.esp_downstkitchlights_relay_2_kitchen_light + - switch.esp_downstkitchlights_relay_1_dining_light + - switch.esp_downstbathswitch_relay_1_main_lights + - switch.esp_downstbathswitch_relay_2_cabinet_light + + downstairs_light_toggle_entity: + alias: Downstairs Light Toggle - Internal Entity Toggle + mode: queued + max: 10 + fields: + target_switch: + name: Target Switch + description: The downstairs switch entity to toggle. + required: true + selector: + entity: + domain: switch + sequence: + - condition: state + entity_id: input_boolean.downstairs_flat_occupied + state: "off" + + - action: switch.toggle + target: + entity_id: "{{ target_switch }}" + + downstairs_light_toggle_lounge_main: + alias: Downstairs Light Toggle - Lounge Main Lights + mode: queued + max: 10 + sequence: + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstloungemain_relay_1_main_lights downstairs_light_toggle_lounge_back_wall: alias: Downstairs Light Toggle - Lounge Back Wall Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstloungemain_relay_2_back_wall_lights + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstloungemain_relay_2_back_wall_lights downstairs_light_toggle_main_bedroom_main: alias: Downstairs Light Toggle - Main Bedroom Main Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstmasterbedrmlights_relay_1_main_lights + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstmasterbedrmlights_relay_1_main_lights downstairs_light_toggle_small_bedroom_main: - alias: Downstairs Light Toggle - Small Bedroom Room Lights + alias: Downstairs Light Toggle - Small Bedroom Main Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstbedrm2lights_relay_1_main_lights + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstbedrm2lights_relay_1_main_lights downstairs_light_toggle_kitchen: alias: Downstairs Light Toggle - Kitchen Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstkitchlights_relay_2_kitchen_light + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstkitchlights_relay_2_kitchen_light downstairs_light_toggle_dining: alias: Downstairs Light Toggle - Dining Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstkitchlights_relay_1_dining_light + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstkitchlights_relay_1_dining_light downstairs_light_toggle_bathroom_main: alias: Downstairs Light Toggle - Bathroom Main Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstbathswitch_relay_1_main_lights + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstbathswitch_relay_1_main_lights downstairs_light_toggle_bathroom_cabinet: alias: Downstairs Light Toggle - Bathroom Cabinet Lights mode: queued + max: 10 sequence: - - condition: state - entity_id: input_boolean.downstairs_flat_occupied - state: "off" - - service: switch.toggle - target: - entity_id: switch.esp_downstbathswitch_relay_2_cabinet_light + - action: script.downstairs_light_toggle_entity + data: + target_switch: switch.esp_downstbathswitch_relay_2_cabinet_light downstairs_light_toggle_all_group: alias: Downstairs Lights - All On/Off @@ -102,14 +169,40 @@ script: - choose: - conditions: - - condition: state - entity_id: group.downstairs_flat_lights - state: "on" + - condition: template + value_template: > + {{ + is_state('switch.esp_downstloungemain_relay_1_main_lights', 'on') + or is_state('switch.esp_downstloungemain_relay_2_back_wall_lights', 'on') + or is_state('switch.esp_downstmasterbedrmlights_relay_1_main_lights', 'on') + or is_state('switch.esp_downstbedrm2lights_relay_1_main_lights', 'on') + or is_state('switch.esp_downstkitchlights_relay_2_kitchen_light', 'on') + or is_state('switch.esp_downstkitchlights_relay_1_dining_light', 'on') + or is_state('switch.esp_downstbathswitch_relay_1_main_lights', 'on') + or is_state('switch.esp_downstbathswitch_relay_2_cabinet_light', 'on') + }} sequence: - - service: homeassistant.turn_off + - action: homeassistant.turn_off target: - entity_id: group.downstairs_flat_lights + entity_id: + - switch.esp_downstloungemain_relay_1_main_lights + - switch.esp_downstloungemain_relay_2_back_wall_lights + - switch.esp_downstmasterbedrmlights_relay_1_main_lights + - switch.esp_downstbedrm2lights_relay_1_main_lights + - switch.esp_downstkitchlights_relay_2_kitchen_light + - switch.esp_downstkitchlights_relay_1_dining_light + - switch.esp_downstbathswitch_relay_1_main_lights + - switch.esp_downstbathswitch_relay_2_cabinet_light + default: - - service: homeassistant.turn_on + - action: homeassistant.turn_on target: - entity_id: group.downstairs_flat_lights + entity_id: + - switch.esp_downstloungemain_relay_1_main_lights + - switch.esp_downstloungemain_relay_2_back_wall_lights + - switch.esp_downstmasterbedrmlights_relay_1_main_lights + - switch.esp_downstbedrm2lights_relay_1_main_lights + - switch.esp_downstkitchlights_relay_2_kitchen_light + - switch.esp_downstkitchlights_relay_1_dining_light + - switch.esp_downstbathswitch_relay_1_main_lights + - switch.esp_downstbathswitch_relay_2_cabinet_light diff --git a/packages/lounge_ir_sensor_actions.yaml b/packages/lounge_ir_sensor_actions.yaml new file mode 100644 index 0000000..cb892b8 --- /dev/null +++ b/packages/lounge_ir_sensor_actions.yaml @@ -0,0 +1,175 @@ +############################################################################### +# PACKAGE: Lounge IR Remote Functions +# VERSION: 1.0 - 2026-05-05 +# +# PURPOSE: +# - Listen for Tasmota IR receive events over MQTT. +# - Convert known IR hash values into lounge scene commands or toggle actions. +# - Throttle repeated button-hold messages so toggles do not flip repeatedly. +# +# MQTT SOURCE: +# - Topic: tele/tasmo-ytfir-a25e21-lounge-1/RESULT +# - JSON path: IrReceived.Hash +# +# NOTES: +# - The incoming hash is normalised to lowercase before matching. +# - Adjust input_number.lounge_ir_remote_throttle_seconds if button repeats +# are still too fast or feel too slow. +############################################################################### + +input_text: + lounge_ir_remote_last_hash: + name: "Lounge IR Remote Last Hash" + max: 32 + +input_datetime: + lounge_ir_remote_last_seen: + name: "Lounge IR Remote Last Seen" + has_date: true + has_time: true + +input_number: + lounge_ir_remote_throttle_seconds: + name: "Lounge IR Remote Throttle Seconds" + min: 0.2 + max: 10 + step: 0.1 + mode: box + unit_of_measurement: "s" + initial: 1.5 + +automation: + - id: lounge_ir_remote_functions + alias: "Lounge IR Remote Functions" + description: > + Handles lounge IR remote hash commands from the Tasmota IR receiver. + mode: queued + max: 20 + max_exceeded: silent + + triggers: + - trigger: mqtt + topic: "tele/tasmo-ytfir-a25e21-lounge-1/RESULT" + + variables: + ir_hash: >- + {{ trigger.payload_json.get('IrReceived', {}).get('Hash', '') | string | lower }} + scene_map: + "0xe23b4151": "Bright" + "0xce5541e4": "TV General" + "0xc0c52aff": "Movie" + "0x79fb9e54": "Reading On/Off" + toggle_hashes: + - "0x2b4da162" + - "0xc2997ec2" + + conditions: + - condition: template + value_template: "{{ ir_hash in scene_map or ir_hash in toggle_hashes }}" + + actions: + - alias: "Stop repeated button-hold messages" + choose: + - conditions: + - condition: template + value_template: >- + {{ + ir_hash == states('input_text.lounge_ir_remote_last_hash') + and + ( + as_timestamp(now()) + - as_timestamp(states('input_datetime.lounge_ir_remote_last_seen'), 0) + ) + < (states('input_number.lounge_ir_remote_throttle_seconds') | float(1.5)) + }} + sequence: + - stop: "Repeated IR hash ignored by throttle." + + - alias: "Store this IR hash and timestamp for throttle checking" + action: input_text.set_value + target: + entity_id: input_text.lounge_ir_remote_last_hash + data: + value: "{{ ir_hash }}" + + - alias: "Store current timestamp for throttle checking" + action: input_datetime.set_datetime + target: + entity_id: input_datetime.lounge_ir_remote_last_seen + data: + datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}" + + - alias: "Run the matching lounge command" + choose: + - alias: "Scene commands" + conditions: + - condition: template + value_template: "{{ ir_hash in scene_map }}" + sequence: + - action: script.lounge_set_scene + data: + scene_name: "{{ scene_map[ir_hash] }}" + + - alias: "Toggle Rinnai gas heater" + conditions: + - condition: template + value_template: "{{ ir_hash == '0x2b4da162' }}" + sequence: + - variables: + currently_on: "{{ is_state('switch.rinnai_neo_gas_heater_heater_operation', 'on') }}" + - variables: + new_state_text: "{{ 'Off' if currently_on else 'On' }}" + + - choose: + - conditions: + - condition: template + value_template: "{{ currently_on }}" + sequence: + - action: switch.turn_off + target: + entity_id: switch.rinnai_neo_gas_heater_heater_operation + default: + - action: switch.turn_on + target: + entity_id: switch.rinnai_neo_gas_heater_heater_operation + + - action: script.view_road_announcement + data: + channels: "sony_tv_lounge" + title: "View Road" + short_announcement: "Rinnai Gas Heater" + long_announcement: "" + payload: "{{ new_state_text }}" + indicator: "" + + - alias: "Toggle surround amplifier" + conditions: + - condition: template + value_template: "{{ ir_hash == '0xc2997ec2' }}" + sequence: + - variables: + currently_on: "{{ is_state('switch.tv_surround_amp_power_in_loft_x27pp', 'on') }}" + - variables: + new_state_text: "{{ 'Off' if currently_on else 'On' }}" + + - choose: + - conditions: + - condition: template + value_template: "{{ currently_on }}" + sequence: + - action: switch.turn_off + target: + entity_id: switch.tv_surround_amp_power_in_loft_x27pp + default: + - action: switch.turn_on + target: + entity_id: switch.tv_surround_amp_power_in_loft_x27pp + + - action: script.view_road_announcement + data: + channels: "sony_tv_lounge" + title: "View Road" + short_announcement: "Surround Amplifier" + long_announcement: "" + payload: "{{ new_state_text }}" + indicator: "" diff --git a/packages/media_players.yaml b/packages/media_players.yaml.old similarity index 100% rename from packages/media_players.yaml rename to packages/media_players.yaml.old diff --git a/packages/mqtt_statestream.yaml b/packages/mqtt_statestream.yaml deleted file mode 100644 index b606181..0000000 --- a/packages/mqtt_statestream.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#mqtt_statestream: -# base_topic: hamqtt -# publish_attributes: true -# publish_timestamps: true -# include: -# entities: -# - sensor.main_bathroom_humidity_change_rate -# entity_globs: -# - sensor.*_zt* - #exclude: - # entity_globs: - # - sensor.*zoruno* \ No newline at end of file diff --git a/packages/nspanel_keepawake.yaml b/packages/nspanel_keepawake.yaml index 4178906..7770edc 100644 --- a/packages/nspanel_keepawake.yaml +++ b/packages/nspanel_keepawake.yaml @@ -15,9 +15,9 @@ template: light: - platform: group name: "Entities to keep NSPanel Awake" - unique_id: "Entities to keep_nspanel_awake" + unique_id: entities_to_keep_nspanel_awake entities: - - light.inverted_quiet_time_as_light + - light.inverted_quiet_time_as_light_2 - light.master_bedroom_bedside_lamp_arlec_bulb_master_bedroom_bedside_lamp_arlec_bulb - light.tasmo_ifan02_3793_bedrm1_1 - light.tasmo_ks811t_3647_bedrm1_1b diff --git a/packages/openhasp_lounge1_wallplate_backlight.yaml b/packages/openhasp_lounge1_wallplate_backlight.yaml index afca588..4392ebc 100644 --- a/packages/openhasp_lounge1_wallplate_backlight.yaml +++ b/packages/openhasp_lounge1_wallplate_backlight.yaml @@ -6,6 +6,7 @@ # - Keep backlight control separate from the thermostat/heater UI package. # - Avoid using brightness 0 as the main OFF method. # - Wake the panel with "idle off" before applying brightness. +# - Quiet Time overrides everything and forces the backlight OFF. # # OPENHASP NOTES: # - backlight brightness range is 1..255 @@ -35,9 +36,32 @@ input_number: # AUTOMATIONS ############################################################################### automation: + # ------------------------------------------------------------------------- + # Quiet Time override + # - Quiet Time ON -> force backlight OFF + # - Quiet Time OFF -> re-apply the requested backlight state + # ------------------------------------------------------------------------- + - id: openhasp_1_backlight_quiet_time_changed + alias: "OpenHASP 1: backlight quiet time changed" + mode: restart + trigger: + - platform: state + entity_id: input_boolean.quiet_time + action: + - choose: + - conditions: + - condition: state + entity_id: input_boolean.quiet_time + state: "on" + sequence: + - service: script.openhasp_1_backlight_off + + default: + - service: script.openhasp_1_backlight_apply_requested_state + # ------------------------------------------------------------------------- # Backlight enable helper changed - # - ON -> wake panel and apply current brightness level + # - ON -> wake panel and apply current brightness level, unless Quiet Time # - OFF -> tell openHASP to switch the backlight off # ------------------------------------------------------------------------- - id: openhasp_1_backlight_enable_changed @@ -52,6 +76,9 @@ automation: - condition: state entity_id: input_boolean.openhasp_1_backlight_enable state: "on" + - condition: state + entity_id: input_boolean.quiet_time + state: "off" sequence: - service: script.openhasp_1_backlight_apply @@ -60,8 +87,8 @@ automation: # ------------------------------------------------------------------------- # Backlight level helper changed - # - If backlight is enabled, apply the new level immediately - # - If disabled, just store the new level for next time + # - If backlight is enabled and Quiet Time is OFF, apply the new level + # - If disabled or Quiet Time is ON, just store the new level for later # ------------------------------------------------------------------------- - id: openhasp_1_backlight_level_changed alias: "OpenHASP 1: backlight level changed" @@ -73,11 +100,15 @@ automation: - condition: state entity_id: input_boolean.openhasp_1_backlight_enable state: "on" + - condition: state + entity_id: input_boolean.quiet_time + state: "off" action: - service: script.openhasp_1_backlight_apply # ------------------------------------------------------------------------- # Re-apply requested backlight state when Home Assistant starts + # Quiet Time is checked inside the script. # ------------------------------------------------------------------------- - id: openhasp_1_backlight_on_ha_start alias: "OpenHASP 1: apply backlight on HA start" @@ -91,6 +122,7 @@ automation: # ------------------------------------------------------------------------- # Re-apply requested backlight state when the panel reconnects + # Quiet Time is checked inside the script. # ------------------------------------------------------------------------- - id: openhasp_1_backlight_on_panel_online alias: "OpenHASP 1: apply backlight on panel online" @@ -109,8 +141,7 @@ automation: # If openHASP enters idle while HA says the backlight should be enabled, # wake it and re-apply the requested brightness. # - # This is intended to stop the "black until touched" behaviour when the - # plate's own idle state has blanked the display. + # Quiet Time blocks this recovery, so the panel stays dark overnight. # ------------------------------------------------------------------------- - id: openhasp_1_backlight_recover_from_idle alias: "OpenHASP 1: recover backlight from idle" @@ -122,6 +153,9 @@ automation: - condition: state entity_id: input_boolean.openhasp_1_backlight_enable state: "on" + - condition: state + entity_id: input_boolean.quiet_time + state: "off" - condition: template value_template: "{{ trigger.payload | lower != 'off' }}" action: @@ -181,13 +215,25 @@ script: # ------------------------------------------------------------------------- # Apply either ON/current-level or OFF according to helper state. - # Used on HA startup and panel reconnect. + # Used on HA startup, panel reconnect, and Quiet Time changes. + # + # Priority: + # 1. Quiet Time ON -> backlight OFF + # 2. Backlight Enable ON -> apply current level + # 3. Backlight Enable OFF -> backlight OFF # ------------------------------------------------------------------------- openhasp_1_backlight_apply_requested_state: alias: "OpenHASP 1: apply requested backlight state" mode: restart sequence: - choose: + - conditions: + - condition: state + entity_id: input_boolean.quiet_time + state: "on" + sequence: + - service: script.openhasp_1_backlight_off + - conditions: - condition: state entity_id: input_boolean.openhasp_1_backlight_enable diff --git a/packages/view_road_announcement_router.yaml b/packages/view_road_announcement_router.yaml new file mode 100644 index 0000000..5893889 --- /dev/null +++ b/packages/view_road_announcement_router.yaml @@ -0,0 +1,382 @@ +################################################################################ +# PACKAGE: View Road Announcement Router +################################################################################ +# +# Version: 1.2 +# Date: 2026-05-06 +# +# Purpose: +# Central announcement router for general Home Assistant announcements. +# Other scripts and automations can call script.view_road_announcement and pass +# values such as channels, title, short_announcement, long_announcement, +# payload, and indicator. +# +# Changes: +# 1.2: +# - Updated Lounge Google Home voice channel to use working Piper TTS setup. +# - Added Piper voice option en_GB-alba-medium. +# - Removed separate TTS language option from the voice channel. +# +# 1.1: +# - Removed old YAML Pushover notify service setup. +# - Uses existing Pushover integration notify entities. +# - Added quiet time channel blocking. +# - Added Lounge Google Home voice announcement channel. +# +# Notes: +# - Use input_boolean helpers for channel enable/disable control. +# - Binary sensors are read-only, so input_boolean is the correct helper type. +# - Channels with no action block yet intentionally do nothing. +# +################################################################################ + +################################################################################ +# PUSHOVER NOTIFY SERVICES +################################################################################ +# +# Pushover is configured using the Home Assistant Pushover integration. +# +# Expected notify entities: +# +# notify.pushover_zorruno +# notify.pushover_kim +# +# No YAML notify: block is needed in this package. +# +################################################################################ + +################################################################################ +# CHANNEL ENABLE HELPERS +################################################################################ + +input_boolean: + announcement_channel_pushover_zorruno: + name: Announcement Channel - Pushover Zorruno + icon: mdi:cellphone-message + initial: true + + announcement_channel_pushover_kim: + name: Announcement Channel - Pushover Kim + icon: mdi:cellphone-message + initial: true + + announcement_channel_sony_tv_lounge: + name: Announcement Channel - Sony TV Lounge + icon: mdi:television + initial: true + + announcement_channel_lounge_google_home_voice: + name: Announcement Channel - Lounge Google Home Voice + icon: mdi:speaker + initial: true + + announcement_channel_lounge_touchscreen_voice: + name: Announcement Channel - Lounge Touchscreen Voice + icon: mdi:tablet-dashboard + initial: true + + announcement_channel_mqtt_view_rd_feed: + name: Announcement Channel - MQTT View Rd Feed + icon: mdi:message-processing + initial: true + +################################################################################ +# MAIN ANNOUNCEMENT ROUTER SCRIPT +################################################################################ + +script: + view_road_announcement: + alias: View Road Announcement + icon: mdi:bullhorn + mode: parallel + max: 20 + + fields: + channels: + name: Channels + description: Comma separated list of announcement channels to use. + example: "pushover_zorruno, sony_tv_lounge" + selector: + text: + + title: + name: Title + description: Announcement title. + example: "View Road" + selector: + text: + + short_announcement: + name: Short Announcement + description: Short announcement text. + example: "Garage door" + selector: + text: + + long_announcement: + name: Long Announcement + description: Longer announcement text. + example: "The garage door has been opened." + selector: + text: + multiline: true + + payload: + name: Payload + description: Payload value such as On, Off, Open, Closed, etc. + example: "Open" + selector: + text: + + indicator: + name: Indicator + description: Future indicator data such as LED number, colour, or flash pattern. + example: "red, led 2, flash fast" + selector: + text: + + sequence: + ########################################################################## + # DEFAULT VALUES + ########################################################################## + # + # If a value is not passed, the default below is used. + # If a value is passed as "", it clears the default to blank. + # + # quiet_time_blocked_channels: + # Channels in this list will not run while input_boolean.quiet_time is on. + # + ########################################################################## + + - variables: + default_channels: "pushover_zorruno, pushover_kim, sony_tv_lounge, lounge_google_home_voice, lounge_touchscreen_voice, mqtt_view_rd_feed" + default_title: "View Road" + default_short_announcement: "Home automation announcement" + default_long_announcement: "Home automation announcement" + default_payload: "" + default_indicator: "" + + quiet_time_blocked_channels: + - "google_home_voice" + - "lounge_google_home_voice" + - "lounge_touchscreen_voice" + + lounge_google_home_voice_media_player: "media_player.lounge_google_tichome_speaker" + lounge_google_home_voice_tts_entity: "tts.piper" + lounge_google_home_voice_piper_voice: "en_GB-jenny_dioco-medium" + lounge_google_home_voice_volume_level: 0.80 + + ########################################################################## + # RESOLVE PASSED VALUES + ########################################################################## + + - variables: + ann_channels_raw: >- + {% if channels is defined %} + {{ channels }} + {% elif channel is defined %} + {{ channel }} + {% elif Channel is defined %} + {{ Channel }} + {% else %} + {{ default_channels }} + {% endif %} + + ann_title: >- + {% if title is defined %} + {{ title }} + {% elif Title is defined %} + {{ Title }} + {% else %} + {{ default_title }} + {% endif %} + + ann_short_announcement: >- + {% if short_announcement is defined %} + {{ short_announcement }} + {% elif Short_Announcement is defined %} + {{ Short_Announcement }} + {% else %} + {{ default_short_announcement }} + {% endif %} + + ann_long_announcement: >- + {% if long_announcement is defined %} + {{ long_announcement }} + {% elif Long_Announcement is defined %} + {{ Long_Announcement }} + {% else %} + {{ default_long_announcement }} + {% endif %} + + ann_payload: >- + {% if payload is defined %} + {{ payload }} + {% elif Payload is defined %} + {{ Payload }} + {% else %} + {{ default_payload }} + {% endif %} + + ann_indicator: >- + {% if indicator is defined %} + {{ indicator }} + {% elif Indicator is defined %} + {{ Indicator }} + {% else %} + {{ default_indicator }} + {% endif %} + + ########################################################################## + # NORMALISE CHANNEL LISTS AND MESSAGE TEXT + ########################################################################## + + - variables: + ann_channels_normalised: >- + {{ ',' ~ (ann_channels_raw | string | lower | replace(' ', '') | replace('\n', '') | trim(',')) ~ ',' }} + + ann_quiet_time_blocked_channels_normalised: >- + {{ ',' ~ (quiet_time_blocked_channels | join(',') | lower | replace(' ', '') | replace('\n', '') | trim(',')) ~ ',' }} + + ann_sony_tv_message: >- + {% set short_text = ann_short_announcement | string | trim %} + {% set payload_text = ann_payload | string | trim %} + {% if short_text | length > 0 and payload_text | length > 0 %} + {{ short_text }} is {{ payload_text }} + {% elif short_text | length > 0 %} + {{ short_text }} + {% else %} + {{ payload_text }} + {% endif %} + + ann_voice_message: >- + {% set long_text = ann_long_announcement | string | trim %} + {% set short_text = ann_short_announcement | string | trim %} + {% set payload_text = ann_payload | string | trim %} + {% if long_text | length > 0 %} + {{ long_text }} + {% elif short_text | length > 0 and payload_text | length > 0 %} + {{ short_text }} is {{ payload_text }} + {% elif short_text | length > 0 %} + {{ short_text }} + {% else %} + {{ payload_text }} + {% endif %} + + ########################################################################## + # CHANNEL: PUSHOVER ZORRUNO + ########################################################################## + + - if: + - condition: template + value_template: "{{ ',pushover_zorruno,' in ann_channels_normalised }}" + - condition: state + entity_id: input_boolean.announcement_channel_pushover_zorruno + state: "on" + then: + - action: notify.pushover_zorruno + data: + title: "{{ ann_title }}" + message: "{{ ann_long_announcement }}" + + ########################################################################## + # CHANNEL: PUSHOVER KIM + ########################################################################## + + - if: + - condition: template + value_template: "{{ ',pushover_kim,' in ann_channels_normalised }}" + - condition: state + entity_id: input_boolean.announcement_channel_pushover_kim + state: "on" + then: + - action: notify.pushover_kim + data: + title: "{{ ann_title }}" + message: "{{ ann_long_announcement }}" + + ########################################################################## + # CHANNEL: SONY TV LOUNGE + ########################################################################## + + - if: + - condition: template + value_template: "{{ ',sony_tv_lounge,' in ann_channels_normalised }}" + - condition: state + entity_id: input_boolean.announcement_channel_sony_tv_lounge + state: "on" + then: + - action: notify.sony_android_tv_lounge + data: + title: "{{ ann_title }}" + message: "{{ ann_sony_tv_message }}" + + ########################################################################## + # CHANNEL: LOUNGE GOOGLE HOME VOICE + ########################################################################## + # + # Also accepts google_home_voice as an alias channel name. + # + # This channel is blocked during quiet time by default. + # + ########################################################################## + + - if: + - condition: template + value_template: >- + {{ + ',lounge_google_home_voice,' in ann_channels_normalised + or ',google_home_voice,' in ann_channels_normalised + }} + - condition: state + entity_id: input_boolean.announcement_channel_lounge_google_home_voice + state: "on" + - condition: template + value_template: >- + {{ not ( + is_state('input_boolean.quiet_time', 'on') + and ( + ',lounge_google_home_voice,' in ann_quiet_time_blocked_channels_normalised + or ',google_home_voice,' in ann_quiet_time_blocked_channels_normalised + ) + ) }} + - condition: template + value_template: "{{ ann_voice_message | string | trim | length > 0 }}" + then: + - action: media_player.volume_set + data: + entity_id: "{{ lounge_google_home_voice_media_player }}" + volume_level: "{{ lounge_google_home_voice_volume_level | float(0.8) }}" + + - delay: + seconds: 1 + + - action: tts.speak + target: + entity_id: "{{ lounge_google_home_voice_tts_entity }}" + data: + cache: false + media_player_entity_id: "{{ lounge_google_home_voice_media_player }}" + message: "{{ ann_voice_message }}" + options: + voice: "{{ lounge_google_home_voice_piper_voice }}" + preferred_format: mp3 + preferred_sample_rate: 44100 + + ########################################################################## + # CHANNEL: LOUNGE TOUCHSCREEN VOICE + ########################################################################## + # + # Placeholder only. No action yet. + # + # This channel is listed in quiet_time_blocked_channels for future use. + # + ########################################################################## + + ########################################################################## + # CHANNEL: MQTT VIEW RD FEED + ########################################################################## + # + # Placeholder only. No action yet. + # + ##########################################################################