diff --git a/README.md b/README.md index 99e74895..3f271cde 100755 --- a/README.md +++ b/README.md @@ -18,10 +18,10 @@ Live, personal Home Assistant configuration shared for **browsing and inspiration**. This is not a turnkey clone-and-run setup; borrow ideas, adapt entity IDs/secrets, and test in your own environment. -### Latest video: Using Codex to Clean Up Home Assistant Entities -[![Using Codex to Clean Up Home Assistant Entities](https://www.vcloudinfo.com/wp-content/uploads/2026/07/home-assistant-codex-entity-cleanup-thumbnail-scaled.png)](https://youtu.be/aceV7ObKJVA) +### Latest video: Home Assistant Sprinkler Automation: Rachio and Beyond +[![Home Assistant Sprinkler Automation: Rachio and Beyond](https://www.vcloudinfo.com/wp-content/uploads/2026/07/home-assistant-sprinkler-automation-rachio-thumbnail-scaled.png)](https://youtu.be/a--1iTDWhSo) -Codex compared the Home Assistant entity registry with Proxmox, Docker, and repository references before removing stale Portainer entities or renaming active Glances sensors. The cleanup also rebuilt recorder and logbook exclusions while preserving aggregate Docker outage history. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/aceV7ObKJVA) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/using-codex-clean-up-home-assistant-entities.html). Browse [![YAML source: docker_infrastructure](https://img.shields.io/static/v1?label=YAML&message=docker_infrastructure&color=lightgrey&logo=github&logoColor=181717)](config/packages/docker_infrastructure.yaml), [![YAML source: infrastructure](https://img.shields.io/static/v1?label=YAML&message=infrastructure&color=lightgrey&logo=github&logoColor=181717)](config/packages/infrastructure.yaml), [recorder](config/recorder.yaml), and [logbook](config/logbook.yaml). +The Rachio package reads native integration entities first, derives controller and active-zone summaries, captures per-zone run duration on each on-to-off transition, and feeds an overview tile plus a detailed sprinkler dashboard. The same five-capability model can be adapted to Rain Bird, Hydrawise, OpenSprinkler, and other controllers. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html). Browse [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/views/10_sprinklers.yaml), and [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/partials/home_water_sections.yaml). ### Quick navigation - You are here: `/` (root repo guide) @@ -53,7 +53,7 @@ Codex compared the Home Assistant entity registry with Proxmox, Docker, and repo - Codex reset-credit tracking: [![YAML source: bearclaw](https://img.shields.io/static/v1?label=YAML&message=bearclaw&color=lightgrey&logo=github&logoColor=181717)](config/packages/bearclaw.yaml), [config/dashboards/infrastructure](config/dashboards/infrastructure), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/7wKhtrvtyiI) - Water leak response loop: [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](config/packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI) - Water softener salt maintenance: [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](config/packages/maintenance_log.yaml), [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/09_salt_trends.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html), [issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816) -- Sprinkler status and last-run dashboard: [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml) +- Sprinkler status and last-run dashboard: [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/views/10_sprinklers.yaml), [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/partials/home_water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html) - Bedroom camera kiosk tablet: [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](config/packages/kiosk_tablet.yaml), [config/dashboards/kiosk](config/dashboards/kiosk), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc) - Holiday/front-of-house color scenes: [![YAML source: monthly_colors](https://img.shields.io/static/v1?label=YAML&message=monthly_colors&color=lightgrey&logo=github&logoColor=181717)](config/scene/monthly_colors.yaml), [![YAML source: monthly_color_scene](https://img.shields.io/static/v1?label=YAML&message=monthly_color_scene&color=lightgrey&logo=github&logoColor=181717)](config/script/monthly_color_scene.yaml) - Dash-button triggers for quick actions: [![YAML source: dash_buttons](https://img.shields.io/static/v1?label=YAML&message=dash_buttons&color=lightgrey&logo=github&logoColor=181717)](config/automation/dash_buttons.yaml) @@ -90,7 +90,7 @@ https://amzn.to/48jVzZ3 | Garadget garage door controller | Garage doors: open/close, arrival helpers, wind alerts, and nighttime reminders - [![YAML source: garadget](https://img.shields.io/static/v1?label=YAML&message=garadget&color=lightgrey&logo=github&logoColor=181717)](config/packages/garadget.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/wFO0H5zgnzk), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html) | [![Buy](https://img.shields.io/badge/Buy-Garadget-orange?logo=amazon)](https://amzn.to/2jQLpVQ) | | August smart lock | Front-door lock control + status - [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) | | Phyn Plus water shutoff | Leak detection + auto shutoff - [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](config/packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) | -| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls - [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | +| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls - [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/views/10_sprinklers.yaml), [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/infrastructure/partials/home_water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | | Tesla Powerwall 2 | Grid-outage alerts, charging watchdog, and load-shed automations - [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](config/packages/powerwall.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/tesla-powerwall-home-assistant-watchdog.html) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) | | Google Nest thermostat | HVAC schedules plus runtime-based filter reminders and condenser-line cleanout tracking - [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](config/packages/climate.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) | | NodeMCU motion sensor | Office motion lighting - [![YAML source: office_motion](https://img.shields.io/static/v1?label=YAML&message=office_motion&color=lightgrey&logo=github&logoColor=181717)](config/packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) | diff --git a/config/README.md b/config/README.md index 5c293787..d39e49a7 100755 --- a/config/README.md +++ b/config/README.md @@ -39,7 +39,7 @@ Live view of the `config/` directory my production Home Assistant instance loads - **Templates (`templates/`)** – Jinja helpers and speech templates reused by the notify/speech engines. - **Dashboards (`dashboards/`)** – YAML-managed Lovelace dashboards and UI resources (generated from storage, then maintained as code). - **www/ + custom components** – branding assets, floorplans, and any custom components the core install depends on. -- **Custom Sidebar** – `www/custom-sidebar-config.yaml` controls the bottom Developer Tools shortcut; HACS owns the plugin files under `www/community/custom-sidebar`. +- **Custom Sidebar** – `www/custom-sidebar-config.yaml` pins Overview/Systems, hides Calendar/Media, and controls the bottom Developer Tools shortcut; HACS owns the plugin files under `www/community/custom-sidebar`. ### Featured automations by section | Section | Why start here | Featured automation(s) | @@ -64,9 +64,9 @@ Only including devices that have active references in the files above or an open | August smart lock | Front-door lock status + remote control – [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) | | Amazon Echo Show | Pops up the front doorbell camera when the August lock unlocks – [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) | | Phyn Plus water shutoff | Leak detection + auto shutoff - [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) | -| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls – [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | +| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls - [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](dashboards/infrastructure/views/10_sprinklers.yaml), [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/infrastructure/partials/home_water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | | Tesla Powerwall 2 | Grid-outage alerts, charging watchdog, and load-shed automations - [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/tesla-powerwall-home-assistant-watchdog.html) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) | -| Google Nest thermostat | HVAC schedules plus runtime-based filter reminders and condenser-line cleanout tracking - [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](packages/climate.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) | +| Google Nest thermostat | HVAC schedules plus runtime-based filter reminders and condenser-line cleanout tracking - [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](packages/climate.yaml), [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/infrastructure/partials/home_water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) | | NodeMCU motion sensor | Office motion lighting + comfort scenes – [![YAML source: office_motion](https://img.shields.io/static/v1?label=YAML&message=office_motion&color=lightgrey&logo=github&logoColor=181717)](packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) | | Raspberry Pi 3 + Aeon Z-Wave stick | Z-Wave backbone for door/hall sensors - [![YAML source: garage_entry_light](https://img.shields.io/static/v1?label=YAML&message=garage_entry_light&color=lightgrey&logo=github&logoColor=181717)](automation/garage_entry_light.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/wFO0H5zgnzk) | [![Pi](https://img.shields.io/badge/Buy-Pi%203-orange?logo=raspberrypi)](https://amzn.to/2e3DOBY) [![Z-Wave](https://img.shields.io/badge/Buy-Z--Wave%20Stick-orange?logo=zwave)](https://amzn.to/2eAiAP0) | | Roku streaming device | TV presence -> scenes/lighting – [![YAML source: roku](https://img.shields.io/static/v1?label=YAML&message=roku&color=lightgrey&logo=github&logoColor=181717)](packages/roku.yaml) | [![Buy](https://img.shields.io/badge/Buy-Roku-orange?logo=roku)](https://amzn.to/2Ctp8cr) | diff --git a/config/configuration.yaml b/config/configuration.yaml index 9bad6e4d..bb4baef2 100755 --- a/config/configuration.yaml +++ b/config/configuration.yaml @@ -35,7 +35,7 @@ additional_ca: frontend: extra_module_url: - - /hacsfiles/custom-sidebar/custom-sidebar-plugin.js + - /hacsfiles/custom-sidebar/custom-sidebar-plugin.js?v=16.0.0 # ------------------------------------------------------------------- # Lovelace (YAML dashboards/resources) @@ -54,7 +54,7 @@ lovelace: filename: ui-lovelace.yaml dashboard-infrastructure: mode: yaml - title: "Infrastructure" + title: "Systems" icon: mdi:server-network show_in_sidebar: true require_admin: true diff --git a/config/dashboards/README.md b/config/dashboards/README.md index 57b5eeb1..a146f49a 100644 --- a/config/dashboards/README.md +++ b/config/dashboards/README.md @@ -60,6 +60,8 @@ This folder is referenced from `config/configuration.yaml` via: - `lovelace.dashboards: ...` - Default Overview YAML dashboard: `lovelace.dashboards.lovelace.filename: ui-lovelace.yaml` - Additional YAML dashboards: `filename: dashboards//dashboard.yaml` + - Overview Home uses ordered production sections under `overview/sections/`; approved pilot edits now apply directly there. + - `dashboard-infrastructure` is presented as **Systems** while retaining its stable URL; it owns Home Water, Vacuum, network, compute, storage, and service drill-downs, including hidden WAN/Pi-hole/website detail views. Note: - Do not use legacy `lovelace.mode: yaml` (removed in Home Assistant 2026.8). @@ -78,10 +80,15 @@ Lovelace resources are loaded from: - Include paths in Lovelace YAML should use absolute container paths starting with `/config/`. - Example: `!include /config/dashboards/overview/partials/some_cards.yaml` - Views are loaded using `!include_dir_list` and ordered by filename (prefix with `01_`, `02_`, etc.). -- Infrastructure views are desktop-first and dense by default: use `type: sections`, `max_columns: 4`, and `dense_section_placement: true` on every standard view. +- Systems views are desktop-first and dense by default: use `type: sections`, `max_columns: 4`, and `dense_section_placement: true` on every standard view. - Use responsive `layout-card` grids with `min-content` rows inside full-width section wrappers so panels pack tightly without fixed-height gaps. - Keep related panels similar in height, avoid spacer cards, and verify both desktop and single-column mobile layouts. - Keep WAN telemetry, compact dual Pi-hole controls, and current website health together on the Network view; reserve hidden subviews for detailed Pi-hole analytics and domain/monitor telemetry. + - Use primary KPI tiles as the canonical drill-down entry point instead of repeating navigation rows at the bottom of a view. + - Treat NAS long-term statistics as the Docker capacity source of truth; keep host cleanup controls in full-width, single-column maintenance popups. +- Major Overview redesigns use a hidden `-staging` dashboard for review and keep production view paths unchanged until explicit promotion approval. +- Overview is the daily home page: preserve people, climate, lighting, cameras, weather, and frequently used controls while bubbling up a compact mix of actionable system state and key household context. +- Home Water and Vacuum live under Systems; personal Health remains under Overview. Detailed Salt Trends, Sprinklers, and Vacuum Map views are Systems subviews. - Prefer card-native styling; treat `card_mod` as a last resort. - Prefer CSS variables (`var(--*)`) over hardcoded hex colors. - When using the Stitch MCP for inspiration, generation may exceed the tool timeout; wait and then fetch results via `stitch/list_screens` and `stitch/get_screen`. diff --git a/config/dashboards/infrastructure/dashboard.yaml b/config/dashboards/infrastructure/dashboard.yaml index 3f298b6f..cf41c3d9 100644 --- a/config/dashboards/infrastructure/dashboard.yaml +++ b/config/dashboards/infrastructure/dashboard.yaml @@ -3,12 +3,13 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Infrastructure Dashboard - YAML entrypoint -# YAML-exported Lovelace dashboard (split into view files). +# Systems Dashboard - YAML entrypoint +# Operational drill-downs for house utilities, appliances, and infrastructure. # ------------------------------------------------------------------- -# Notes: Entry point for dashboard key `dashboard-infrastructure`. Views are loaded from /config/dashboards/infrastructure/views. +# Notes: Stable dashboard key/path remains `dashboard-infrastructure`; the user-facing name is Systems. +# Notes: Home Water and Vacuum are promoted production views; Health remains on Overview. # Notes: Joanna dispatch telemetry view is available at `/dashboard-infrastructure/joanna`. -# Notes: Network combines WAN, dual Pi-hole, and website health; `/pihole` and `/website-health` are detail subviews. +# Notes: Network combines WAN, dual Pi-hole, and website health; `/wan`, `/pihole`, and `/website-health` are detail subviews. ###################################################################### button_card_templates: !include /config/dashboards/infrastructure/templates/button_card_templates.yaml diff --git a/config/dashboards/infrastructure/partials/docker_containers_sections.yaml b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml index bcd4650c..bac303f2 100644 --- a/config/dashboards/infrastructure/partials/docker_containers_sections.yaml +++ b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml @@ -4,10 +4,12 @@ # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- # Infrastructure Partial - Docker operations -# Host health, updates, volumes, active exceptions, and inventory drill-down. +# Host health, updates, NAS capacity, active exceptions, and inventory drill-down. # ------------------------------------------------------------------- # Notes: Healthy stacks and containers live in the hidden Docker Inventory subview. # Notes: Host maintenance controls remain in the existing confirmed popups. +# Notes: Synology NAS/NVR temperatures stay with their storage telemetry, not household temperature cards. +# Notes: Storage Health includes the persisted nightly Duplicati verification result and last successful backup time. ###################################################################### # ------------------------------------------------------------------- @@ -38,13 +40,10 @@ name: Monitored icon: mdi:docker state_display: > - [[[ - const ids = states['sensor.docker_monitored_switch_inventory']?.attributes?.entity_id; - const unique = Array.isArray(ids) - ? ids.filter(id => !String(id).endsWith('_container_2')).length - : entity.state; - return `${unique} workloads`; - ]]] + [[[ return `${entity.state} workloads`; ]]] + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/docker-inventory - type: custom:button-card template: bearstone_infra_status_kpi @@ -77,7 +76,7 @@ icon: mdi:nas # ------------------------------------------------------------------- -# Host maintenance signals and volume telemetry +# Host maintenance signals and durable NAS capacity history # ------------------------------------------------------------------- - type: grid column_span: 4 @@ -144,49 +143,66 @@ cards: - type: custom:button-card template: bearstone_infra_panel_header - name: Docker Volumes + name: Storage Health - - type: custom:button-card - template: bearstone_infra_docker_volume_row - entity: sensor.carlo_hass_volume_disk_usage_total_size - name: docker_10 - variables: - total_entity: sensor.carlo_hass_volume_disk_usage_total_size + - type: grid + columns: 2 + square: false + cards: + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.carlo_nas01_temperature + name: NAS Temperature + icon: mdi:nas - - type: custom:button-card - template: bearstone_infra_docker_volume_row - entity: button.docker2_prune_unused_volumes - name: docker_14 - variables: - not_instrumented: true + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.carlo_nvr_temperature + name: NVR Temperature + icon: mdi:video-box - type: custom:button-card - template: bearstone_infra_docker_volume_row - entity: button.docker17_prune_unused_volumes - name: docker_17 + template: bearstone_infra_status_kpi + entity: input_text.infra_duplicati_backup_verification_status + name: Docker Config Backup + icon: mdi:backup-restore variables: - volume_entities: - - sensor.17214906eee4a16eed521e2904730a8272958bb32209c8b204fef3914a85006f_volume_size - - sensor.17e04b7a1a6902f3192bd825b497c5a7a920c64c88a216968cf1700da94d10f0_volume_size - - sensor.31a30aacc34d2988cbedbd8aa82d29066a7630ad8e51ce3d55ea0d785c5e8dbc_volume_size - - sensor.8c8b88aa16230a391d2e61e75fcc62a57ee569416d7c55ab4e8cd7487813b5dd_volume_size - - sensor.9bfb74e2a728618f9c3c1a363d2ccb3bba6e0580a14b3ca6f32afa4dea827b25_volume_size - - sensor.a5f10bca01c2cdda3915951e27eef9fcd39a7eae695e3e9b21850550d7d91e29_volume_size - - sensor.a5f10bca01c2cdda3915951e27eef9fcd39a7eae695e3e9b21850550d7d91e29c_volume_size - - sensor.a6fd445f48ed6892eb26e97814cb7720758588101a441e6b3ffe117cb55f612c_volume_size - - sensor.dc429dc8845534e799ea6170bb3a9fb79db3dbb08db6ed198a396f2aadaa1a85_volume_size - - sensor.de3d33e1a75cb2d24f5f7f27f4d9bb1f814d72ef9229000a2bf9372e421dfaaf_volume_size - - sensor.deaf7fea946c0cd1a40d161ab66367fddc1f99c2a5aae7bf4ad99b47fe25283c_volume_size - - sensor.openrecord_local_openrecord_next_cache_volume_size - - sensor.openrecord_local_openrecord_scrapers_node_modules_volume_size - - sensor.openrecord_local_openrecord_web_node_modules_volume_size + ok_state: verified + state_display: > + [[[ + const status = String(entity?.state ?? 'unverified').toLowerCase(); + const raw = String(states['input_datetime.infra_duplicati_backup_last_success']?.state ?? ''); + const parsed = raw ? new Date(raw.replace(' ', 'T')) : null; + const when = parsed instanceof Date && !Number.isNaN(parsed.getTime()) + ? parsed.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit' + }).toUpperCase() + : 'NO SUCCESS TIME'; + if (status === 'verified') return `SUCCESS · ${when}`; + if (status === 'failed') return `FAILED · LAST SUCCESS ${when}`; + return `UNVERIFIED · LAST SUCCESS ${when}`; + ]]] - - type: custom:button-card - template: bearstone_infra_docker_volume_row - entity: sensor.docker69_volume_disk_usage_total_size - name: docker_69 - variables: - total_entity: sensor.docker69_volume_disk_usage_total_size + # Core statistics-graph is required because mini-graph-card can only read + # the 180-day recorder window, while long-term statistics retain 12 months. + - type: statistics-graph + title: NAS + NVR Used Space - 12 Months + chart_type: line + days_to_show: 365 + period: month + stat_types: + - mean + - max + entities: + - entity: sensor.carlo_nas01_volume_1_used_space + name: NAS Used Space + - entity: sensor.carlo_nvr_volume_1_used_space + name: NVR Used Space + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml # ------------------------------------------------------------------- # Exceptions only; full inventory is a hidden subview @@ -216,10 +232,7 @@ state_display: > [[[ const unavailable = states['sensor.docker_monitored_unavailable_count']?.state ?? '0'; - const ids = states['sensor.docker_monitored_switch_inventory']?.attributes?.entity_id; - const total = Array.isArray(ids) - ? ids.filter(id => !String(id).endsWith('_container_2')).length - : (states['sensor.docker_monitored_container_count']?.state ?? '0'); + const total = states['sensor.docker_monitored_container_count']?.state ?? '0'; return `${unavailable}/${total} unavailable`; ]]] @@ -278,23 +291,6 @@ sort: method: name - - type: custom:button-card - template: bearstone_infra_list_row - entity: sensor.docker_monitored_container_count - name: Open Full Docker Inventory - icon: mdi:format-list-bulleted-square - state_display: > - [[[ - const ids = states['sensor.docker_monitored_switch_inventory']?.attributes?.entity_id; - const unique = Array.isArray(ids) - ? ids.filter(id => !String(id).endsWith('_container_2')).length - : entity.state; - return `${unique} monitored workloads`; - ]]] - tap_action: - action: navigate - navigation_path: /dashboard-infrastructure/docker-inventory - # Existing confirmed host maintenance popups are intentionally reused. - type: grid column_span: 4 diff --git a/config/dashboards/infrastructure/partials/docker_inventory_sections.yaml b/config/dashboards/infrastructure/partials/docker_inventory_sections.yaml index 990210a8..6881dd83 100644 --- a/config/dashboards/infrastructure/partials/docker_inventory_sections.yaml +++ b/config/dashboards/infrastructure/partials/docker_inventory_sections.yaml @@ -37,13 +37,7 @@ name: Back to Docker Operations icon: mdi:arrow-left state_display: > - [[[ - const ids = states['sensor.docker_monitored_switch_inventory']?.attributes?.entity_id; - const unique = Array.isArray(ids) - ? ids.filter(id => !String(id).endsWith('_container_2')).length - : entity.state; - return `${unique} monitored workloads`; - ]]] + [[[ return `${entity.state} monitored workloads`; ]]] tap_action: action: navigate navigation_path: /dashboard-infrastructure/docker diff --git a/config/dashboards/infrastructure/partials/home_sections.yaml b/config/dashboards/infrastructure/partials/home_sections.yaml index 83705436..f939fa68 100644 --- a/config/dashboards/infrastructure/partials/home_sections.yaml +++ b/config/dashboards/infrastructure/partials/home_sections.yaml @@ -3,10 +3,10 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Infrastructure Partial - operations summary -# Exception-first health strip, active issues, datacenter, and network trends. +# Systems Partial - operations summary +# House-system health strip, active issues, datacenter, and network trends. # ------------------------------------------------------------------- -# Notes: Six category tiles replace the mostly empty production status panel. +# Notes: Infrastructure, Water, and Vacuum provide the operational roll-up for Systems. # Notes: All overview trends use a 24-hour window with visible series labels. ###################################################################### @@ -23,7 +23,7 @@ columns: full layout_type: custom:grid-layout layout: - grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-template-columns: repeat(8, minmax(0, 1fr)) grid-auto-flow: row grid-auto-rows: min-content grid-gap: 12px @@ -35,7 +35,7 @@ - type: custom:button-card template: bearstone_infra_status_kpi entity: sensor.infra_dashboard_active_issue_count - name: Overall + name: Infrastructure icon: mdi:shield-check-outline variables: ok_state: '0' @@ -94,6 +94,31 @@ action: navigate navigation_path: /dashboard-infrastructure/network + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: binary_sensor.garage_phyn_leak_alert + name: Water + icon: mdi:shield-water-outline + variables: + ok_state: 'off' + healthy_text: CLEAR + alert_text: LEAK + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/home-water + + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: sensor.l10s_vacuum_error + name: Vacuum + icon: mdi:robot-vacuum + variables: + ok_state: no_error + healthy_text: READY + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/vacuum + # ------------------------------------------------------------------- # Active exceptions and datacenter # ------------------------------------------------------------------- @@ -124,18 +149,6 @@ template: bearstone_infra_panel_header name: Active Exceptions - - type: custom:button-card - template: bearstone_infra_list_row - entity: sensor.infra_dashboard_active_issue_count - name: Operations Summary - icon: mdi:shield-search - state_display: > - [[[ - const count = Number(entity?.state); - if (!Number.isFinite(count)) return 'NO DATA'; - return count === 0 ? 'NO ACTIVE EXCEPTIONS' : `${count} CATEGORIES NEED ATTENTION`; - ]]] - - type: custom:button-card template: bearstone_infra_alert_row entity: binary_sensor.infra_wan_quality_degraded @@ -158,6 +171,29 @@ action: navigate navigation_path: /dashboard-infrastructure/network + - type: custom:button-card + template: bearstone_infra_alert_row + entity: binary_sensor.garage_phyn_leak_alert + name: Active water leak + icon: mdi:pipe-leak + variables: + alert_kind: binary_on + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/home-water + + - type: custom:button-card + template: bearstone_infra_alert_row + entity: sensor.l10s_vacuum_error + name: Vacuum needs attention + icon: mdi:robot-vacuum-alert + variables: + alert_kind: state_not + ok_state: no_error + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/vacuum + - type: custom:button-card template: bearstone_infra_alert_row entity: binary_sensor.proxmox1_runtime_healthy @@ -257,52 +293,52 @@ name: Network Trends - type: custom:mini-graph-card - name: Wi-Fi Clients - icon: mdi:wifi + name: Internet Throughput + icon: mdi:speedometer hours_to_show: 24 points_per_hour: 1 line_width: 2 smoothing: true show: + fill: false legend: true labels: false name: true icon: true - state: true + state: false entities: - - entity: sensor.total_wifi_clients - name: Total - show_graph: false - - entity: sensor.unifi_ap_office_clients - name: Office - - entity: sensor.unifi_ap_study_clients - name: Study - - entity: sensor.unifi_ap_garage_clients - name: Garage + - entity: sensor.speedtest_download + name: Download + show_legend_state: true + - entity: sensor.speedtest_upload + name: Upload + show_legend_state: true card_mod: style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - type: custom:mini-graph-card - name: Internet Throughput - icon: mdi:speedometer + name: Wi-Fi Clients + icon: mdi:wifi hours_to_show: 24 points_per_hour: 1 line_width: 2 smoothing: true show: - fill: false legend: true labels: false name: true icon: true - state: false + state: true entities: - - entity: sensor.speedtest_download - name: Download - show_legend_state: true - - entity: sensor.speedtest_upload - name: Upload - show_legend_state: true + - entity: sensor.total_wifi_clients + name: Total + show_graph: false + - entity: sensor.unifi_ap_office_clients + name: Office + - entity: sensor.unifi_ap_study_clients + name: Study + - entity: sensor.unifi_ap_garage_clients + name: Garage card_mod: style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml diff --git a/config/dashboards/infrastructure/partials/home_water_sections.yaml b/config/dashboards/infrastructure/partials/home_water_sections.yaml new file mode 100644 index 00000000..7828f8f5 --- /dev/null +++ b/config/dashboards/infrastructure/partials/home_water_sections.yaml @@ -0,0 +1,462 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Systems Partial - Home Water +# Protection, live use, hot water, maintenance, outdoor water, and trends. +# ------------------------------------------------------------------- +# Notes: NAS, NVR, and unrelated house-temperature cards are omitted; refrigerator temperature stays with home safety. +# Notes: Maintenance rows reuse existing reset scripts through safe more-info flows. +# Notes: Active Phyn leak alerts are shown; the integration's stale latest-test leak flag is not an operator alert. +# Notes: Daily usage uses change on the same sum-only statistic configured in Energy. +###################################################################### + +# ------------------------------------------------------------------- +# Water health strip (mandatory first full-width wrapper) +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: switch.phyn_autoshutoff_enabled + name: Auto Shutoff + icon: mdi:shield-water-outline + variables: + ok_state: 'on' + healthy_text: ACTIVE + alert_text: 'OFF' + + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: binary_sensor.garage_phyn_leak_alert + name: Active Leak + icon: mdi:pipe-leak + variables: + ok_state: 'off' + healthy_text: CLEAR + alert_text: LEAK + + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: valve.phyn_shutoff_valve + name: Main Valve + icon: mdi:valve + variables: + ok_state: open + healthy_text: OPEN + alert_text: CLOSED + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.phyn_average_water_flow_rate + name: Flow Rate + icon: mdi:waves-arrow-right + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.rheem_wh_available_hot_water + name: Hot Water + icon: mdi:water-thermometer + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.phyn_daily_water_usage + name: Used Today + icon: mdi:water-outline + +# ------------------------------------------------------------------- +# Home maintenance and outdoor water +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(3, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Home Maintenance + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.blink_blink1_temperature + name: Refrigerator Temperature + icon: mdi:fridge-outline + state: + - operator: '>' + value: 60 + styles: + card: + - border-color: rgba(229,57,53,0.35) + - background: rgba(255,235,238,0.85) + icon: + - color: rgba(198,40,40,1) + state: + - color: rgba(198,40,40,1) + - opacity: 1 + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.downstairs_ac_runtime_since_last_filter_change + name: Downstairs Filter Runtime + icon: mdi:air-filter + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(0)} / 350 h` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_datetime.downstairs_last_filter_change + name: Downstairs Filter Changed + icon: mdi:calendar-check-outline + tap_action: + action: more-info + entity: script.reset_downstairs_filter + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.upstairs_ac_runtime_since_last_filter_change + name: Upstairs Filter Runtime + icon: mdi:air-filter + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(0)} / 450 h` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_datetime.upstairs_last_filter_change + name: Upstairs Filter Changed + icon: mdi:calendar-check-outline + tap_action: + action: more-info + entity: script.reset_upstairs_filter + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.hvac_condenser_lines_days_since_cleaned + name: Condenser Lines + icon: mdi:pipe-wrench + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(0)} / 360 DAYS` : 'NO DATA'; + ]]] + tap_action: + action: more-info + entity: script.reset_hvac_condenser_lines_cleaned + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Water Delivery & Softener + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.water_softener_salt_last_summary + name: Last Salt Refill + icon: mdi:shaker + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.water_softener_salt_average_days_between_refills + name: Typical Salt Interval + icon: mdi:calendar-sync-outline + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/salt-trends + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_datetime.water_delivery_date + name: Next Water Delivery + icon: mdi:truck-delivery-outline + state_display: > + [[[ + const raw = String(entity?.state ?? ''); + const value = raw ? new Date(`${raw}T00:00:00`) : null; + if (!(value instanceof Date) || Number.isNaN(value.getTime())) return 'NO DATE'; + const today = new Date(); + today.setHours(0, 0, 0, 0); + const formatted = value.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }).toUpperCase(); + return value < today ? `OVERDUE · ${formatted}` : formatted; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + name: Manage ReadyRefresh + icon: mdi:open-in-new + show_state: false + tap_action: + action: url + url_path: https://www.readyrefresh.com/en/login + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Outdoor Water + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rachio_controller_status + name: Sprinkler Controller + icon: mdi:sprinkler-variant + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/sprinklers + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rachio_active_zone + name: Active Zone + icon: mdi:sprinkler + + - type: custom:button-card + template: bearstone_infra_list_row + entity: switch.carlo_rachio_rain_delay + name: Rain Delay + icon: mdi:weather-rainy + tap_action: + action: more-info + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rachio_last_run_summary + name: Last Sprinkler Run + icon: mdi:history + +# ------------------------------------------------------------------- +# Water protection and hot water +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Water Protection + + - type: custom:button-card + template: bearstone_infra_list_row + entity: valve.phyn_shutoff_valve + name: Main Shutoff Valve + icon: mdi:valve + + - type: custom:button-card + template: bearstone_infra_list_row_running + entity: switch.phyn_autoshutoff_enabled + name: Automatic Shutoff + icon: mdi:shield-water-outline + tap_action: + action: more-info + + - type: custom:button-card + template: bearstone_infra_list_row + entity: switch.phyn_scheduled_leak_test_enabled + name: Scheduled Leak Tests + icon: mdi:calendar-search + state_display: > + [[[ + return entity?.state === 'on' ? 'ENABLED' : 'OFF'; + ]]] + tap_action: + action: more-info + + - type: custom:button-card + template: bearstone_infra_list_row + entity: binary_sensor.phyn_leak_test_running + name: Leak Test Activity + icon: mdi:water-search + state_display: > + [[[ + return entity?.state === 'on' ? 'RUNNING' : 'IDLE'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.phyn_average_water_flow_rate + name: Current Flow Rate + icon: mdi:water-pump + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.phyn_current_water_pressure + name: Water Pressure + icon: mdi:gauge + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.phyn_average_water_temperature + name: Supply Temperature + icon: mdi:thermometer-water + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Hot Water System + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rheem_wh_available_hot_water + name: Available Hot Water + icon: mdi:water-percent + + - type: custom:button-card + template: bearstone_infra_list_row + entity: binary_sensor.rheem_wh_running + name: Heat Pump + icon: mdi:heat-pump-outline + state_display: > + [[[ + return entity?.state === 'on' ? 'RUNNING' : 'IDLE'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rheem_wh_running_state + name: Operating State + icon: mdi:state-machine + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rheem_wh_tank_health + name: Tank Health + icon: mdi:shield-check-outline + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.rheem_wh_alert_count + name: Active Alerts + icon: mdi:alert-circle-outline + + - type: custom:button-card + template: bearstone_infra_list_row + entity: water_heater.rheem_wh + name: Water Heater Controls + icon: mdi:water-boiler + +# ------------------------------------------------------------------- +# Thirty-day water trends +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Daily Water Use - 30 Days + + # Fallback card: change uses the same sum-only long-term statistic as Energy. + - type: statistics-graph + chart_type: bar + days_to_show: 30 + period: day + stat_types: + - change + entities: + - entity: sensor.phyn_daily_water_usage + name: Daily Usage + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Lowest Hot Water - 30 Days + + # Fallback card: daily minimum shows whether household demand is outrunning recovery. + - type: statistics-graph + chart_type: line + days_to_show: 30 + period: day + stat_types: + - min + entities: + - entity: sensor.rheem_wh_available_hot_water + name: Available Hot Water diff --git a/config/dashboards/infrastructure/partials/network_sections.yaml b/config/dashboards/infrastructure/partials/network_sections.yaml index 18edde56..5264e37c 100644 --- a/config/dashboards/infrastructure/partials/network_sections.yaml +++ b/config/dashboards/infrastructure/partials/network_sections.yaml @@ -7,7 +7,9 @@ # Current WAN telemetry, dual Pi-hole operations, and website health. # ------------------------------------------------------------------- # Notes: Pi-hole blocking controls are mirrored by pihole_ha.yaml. -# Notes: Detailed Pi-hole and website telemetry live in hidden drill-down views. +# Notes: Detailed WAN, Pi-hole, and website telemetry live in hidden drill-down views. +# Notes: The ribbon is status-only; Internet metrics remain in the trend panel. +# Notes: WAN throughput uses a 7-day window so transient and sustained patterns are distinguishable. ###################################################################### # ------------------------------------------------------------------- @@ -23,7 +25,7 @@ columns: full layout_type: custom:grid-layout layout: - grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-template-columns: repeat(3, minmax(0, 1fr)) grid-auto-flow: row grid-auto-rows: min-content grid-gap: 12px @@ -39,42 +41,9 @@ icon: mdi:wan variables: ok_state: 'off' - - - type: custom:button-card - template: bearstone_infra_kpi - entity: sensor.speedtest_download - name: Download - icon: mdi:download-network-outline - state_display: > - [[[ - const value = Number(entity?.state); - const unit = entity?.attributes?.unit_of_measurement ?? 'Mbit/s'; - return Number.isFinite(value) ? `${value.toFixed(0)} ${unit}` : 'NO DATA'; - ]]] - - - type: custom:button-card - template: bearstone_infra_kpi - entity: sensor.speedtest_upload - name: Upload - icon: mdi:upload-network-outline - state_display: > - [[[ - const value = Number(entity?.state); - const unit = entity?.attributes?.unit_of_measurement ?? 'Mbit/s'; - return Number.isFinite(value) ? `${value.toFixed(0)} ${unit}` : 'NO DATA'; - ]]] - - - type: custom:button-card - template: bearstone_infra_kpi - entity: sensor.speedtest_ping - name: Latency - icon: mdi:timer-outline - state_display: > - [[[ - const value = Number(entity?.state); - const unit = entity?.attributes?.unit_of_measurement ?? 'ms'; - return Number.isFinite(value) ? `${value.toFixed(1)} ${unit}` : 'NO DATA'; - ]]] + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/wan - type: custom:button-card template: bearstone_infra_status_kpi @@ -85,6 +54,9 @@ ok_state: 'on' healthy_text: RUNNING alert_text: DOWN + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/pihole - type: custom:button-card template: bearstone_infra_status_kpi @@ -95,6 +67,9 @@ ok_state: 'on' healthy_text: RUNNING alert_text: DOWN + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/pihole # ------------------------------------------------------------------- # Trends, Pi-hole controls, and website health @@ -131,7 +106,7 @@ - type: custom:mini-graph-card name: Internet Throughput icon: mdi:speedometer - hours_to_show: 24 + hours_to_show: 168 points_per_hour: 1 line_width: 2 smoothing: true @@ -163,6 +138,9 @@ const unit = entity?.attributes?.unit_of_measurement ?? 'ms'; return Number.isFinite(value) ? `${value.toFixed(1)} ${unit}` : 'NO DATA'; ]]] + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/wan - type: custom:vertical-stack-in-card card_mod: @@ -179,6 +157,9 @@ icon: mdi:dns state_display: > [[[ return entity?.state === 'on' ? 'RUNNING' : 'DOWN'; ]]] + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/pihole - type: custom:button-card template: bearstone_infra_list_row_running @@ -199,6 +180,9 @@ icon: mdi:dns state_display: > [[[ return entity?.state === 'on' ? 'RUNNING' : 'DOWN'; ]]] + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/pihole - type: custom:button-card template: bearstone_infra_list_row_running @@ -223,7 +207,7 @@ - type: custom:button-card template: bearstone_infra_list_row entity: binary_sensor.infra_dns_pihole_degraded - name: Open Detailed Pi-hole Analytics + name: Open Pi-hole Controls icon: mdi:chart-box-outline state_display: > [[[ return 'OPEN'; ]]] diff --git a/config/dashboards/infrastructure/partials/proxmox_sections.yaml b/config/dashboards/infrastructure/partials/proxmox_sections.yaml index 789441df..d4653b78 100644 --- a/config/dashboards/infrastructure/partials/proxmox_sections.yaml +++ b/config/dashboards/infrastructure/partials/proxmox_sections.yaml @@ -4,9 +4,10 @@ # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- # Infrastructure Partial - Proxmox -# Runtime/update status with one-metric host, VM, and temperature trends. +# Runtime/update status with compact one-metric host and VM trends. # ------------------------------------------------------------------- # Notes: All graphs use 24-hour windows and explicit threshold colors. +# Notes: Host graphs use a compact three-column, 70px plot grid; VM graphs retain their larger detail view. # Notes: Pending updates remain windowed maintenance signals, not runtime failures. ###################################################################### @@ -85,193 +86,183 @@ columns: full layout_type: custom:grid-layout layout: - grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-template-columns: repeat(3, minmax(0, 1fr)) grid-auto-flow: dense grid-auto-rows: min-content grid-gap: 12px margin: 0 mediaquery: "(max-width: 900px)": - grid-template-columns: repeat(1, minmax(0, 1fr)) + grid-template-columns: repeat(2, minmax(0, 1fr)) cards: - - type: custom:vertical-stack-in-card + - type: custom:mini-graph-card + name: Proxmox01 CPU + icon: mdi:cpu-64-bit + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 60 + color: '#f39c12' + - value: 85 + color: '#c0392b' + entities: + - entity: sensor.node_proxmox1_cpu_used + name: CPU card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml - cards: - - type: custom:button-card - template: bearstone_infra_panel_header - name: Proxmox01 - - - type: custom:mini-graph-card - name: CPU Utilization - icon: mdi:cpu-64-bit - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 60 - color: '#f39c12' - - value: 85 - color: '#c0392b' - entities: - - entity: sensor.node_proxmox1_cpu_used - name: CPU - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - - type: custom:mini-graph-card - name: Memory Utilization - icon: mdi:memory - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 70 - color: '#f39c12' - - value: 90 - color: '#c0392b' - entities: - - entity: sensor.node_proxmox1_memory_used_percentage - name: Memory - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - type: custom:mini-graph-card - name: Disk Utilization - icon: mdi:harddisk - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 70 - color: '#f39c12' - - value: 85 - color: '#c0392b' - entities: - - entity: sensor.proxmox1_disk_used_percentage - name: Disk - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + - type: custom:mini-graph-card + name: Proxmox01 Memory + icon: mdi:memory + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 70 + color: '#f39c12' + - value: 90 + color: '#c0392b' + entities: + - entity: sensor.node_proxmox1_memory_used_percentage + name: Memory + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - type: custom:vertical-stack-in-card + - type: custom:mini-graph-card + name: Proxmox01 Disk + icon: mdi:harddisk + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 70 + color: '#f39c12' + - value: 85 + color: '#c0392b' + entities: + - entity: sensor.proxmox1_disk_used_percentage + name: Disk card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml - cards: - - type: custom:button-card - template: bearstone_infra_panel_header - name: Proxmox02 + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - type: custom:mini-graph-card - name: CPU Utilization - icon: mdi:cpu-64-bit - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 60 - color: '#f39c12' - - value: 85 - color: '#c0392b' - entities: - - entity: sensor.node_proxmox02_cpu_used - name: CPU - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + - type: custom:mini-graph-card + name: Proxmox02 CPU + icon: mdi:cpu-64-bit + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 60 + color: '#f39c12' + - value: 85 + color: '#c0392b' + entities: + - entity: sensor.node_proxmox02_cpu_used + name: CPU + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - type: custom:mini-graph-card - name: Memory Utilization - icon: mdi:memory - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 70 - color: '#f39c12' - - value: 90 - color: '#c0392b' - entities: - - entity: sensor.node_proxmox02_memory_used_percentage - name: Memory - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + - type: custom:mini-graph-card + name: Proxmox02 Memory + icon: mdi:memory + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 70 + color: '#f39c12' + - value: 90 + color: '#c0392b' + entities: + - entity: sensor.node_proxmox02_memory_used_percentage + name: Memory + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - type: custom:mini-graph-card - name: Disk Utilization - icon: mdi:harddisk - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: false - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 0 - color: '#43a047' - - value: 70 - color: '#f39c12' - - value: 85 - color: '#c0392b' - entities: - - entity: sensor.proxmox02_disk_used_percentage - name: Disk - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + - type: custom:mini-graph-card + name: Proxmox02 Disk + icon: mdi:harddisk + hours_to_show: 24 + points_per_hour: 2 + line_width: 2 + smoothing: true + height: 70 + show: + legend: false + labels: false + name: true + icon: true + state: true + color_thresholds: + - value: 0 + color: '#43a047' + - value: 70 + color: '#f39c12' + - value: 85 + color: '#c0392b' + entities: + - entity: sensor.proxmox02_disk_used_percentage + name: Disk + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml # ------------------------------------------------------------------- -# VM and thermal trends (same-unit series only) +# VM trends (same-unit series only) # ------------------------------------------------------------------- - type: grid column_span: 4 - columns: 3 + columns: 2 square: false cards: - type: custom:mini-graph-card @@ -319,31 +310,3 @@ name: Frigate card_mod: style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml - - - type: custom:mini-graph-card - name: Garage Temperature - icon: mdi:thermometer - hours_to_show: 24 - points_per_hour: 2 - line_width: 2 - smoothing: true - show: - legend: true - labels: false - name: true - icon: true - state: true - color_thresholds: - - value: 80 - color: '#43a047' - - value: 135 - color: '#f39c12' - - value: 145 - color: '#c0392b' - entities: - - entity: sensor.proxmox_garage_average_temperature - name: Garage - - entity: sensor.pirateweather_temperature - name: Outside - card_mod: - style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml diff --git a/config/dashboards/infrastructure/partials/vacuum_sections.yaml b/config/dashboards/infrastructure/partials/vacuum_sections.yaml new file mode 100644 index 00000000..df0707d2 --- /dev/null +++ b/config/dashboards/infrastructure/partials/vacuum_sections.yaml @@ -0,0 +1,383 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Systems Partial - Vacuum +# Current state, today's cleaning plan, controls, and maintenance health. +# ------------------------------------------------------------------- +# Notes: Full interactive map remains available as a production drill-down. +# Notes: Monotonic cleaning totals are shown as facts, not misleading trends. +# Notes: Consumable rows require a confirmed hold before the native reset button is pressed. +###################################################################### + +# ------------------------------------------------------------------- +# Current cleaning strip (mandatory first full-width wrapper) +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_infra_kpi + entity: vacuum.l10s_vacuum + name: Robot + icon: mdi:robot-vacuum + state_display: > + [[[ + return String(entity?.state ?? 'NO DATA').replaceAll('_', ' ').toUpperCase(); + ]]] + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.l10s_vacuum_battery_level + name: Battery + icon: mdi:battery + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.l10s_vacuum_current_room + name: Current Room + icon: mdi:map-marker-radius-outline + state_display: > + [[[ + const raw = String(entity?.state ?? 'NO DATA'); + return ['unknown', 'unavailable', 'none', ''].includes(raw.toLowerCase()) + ? 'NO DATA' + : raw.replaceAll('-', ' '); + ]]] + + - type: custom:button-card + template: bearstone_infra_kpi + entity: input_text.l10s_vacuum_room_queue + name: Remaining + icon: mdi:playlist-play + state_display: > + [[[ + const ids = String(entity?.state ?? '').match(/\d+/g) ?? []; + return ids.length ? `${ids.length} ROOMS` : 'COMPLETE'; + ]]] + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.l10s_vacuum_error + name: Error + icon: mdi:robot-vacuum-alert + state_display: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + if (['no_error', 'no error', 'none'].includes(raw)) return 'CLEAR'; + if (['unknown', 'unavailable', ''].includes(raw)) return 'NO DATA'; + return raw.replaceAll('_', ' ').toUpperCase(); + ]]] + + - type: custom:button-card + template: bearstone_infra_kpi + entity: sensor.l10s_vacuum_low_water_warning + name: Mop Water + icon: mdi:water-check-outline + state_display: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + if (['no_warning', 'no warning', 'none'].includes(raw)) return 'READY'; + if (['unknown', 'unavailable', ''].includes(raw)) return 'NO DATA'; + return raw.replaceAll('_', ' ').toUpperCase(); + ]]] + +# ------------------------------------------------------------------- +# Today's plan and native device controls +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Today's Cleaning + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_boolean.l10s_vacuum_on_demand + name: On-Demand Cycle + icon: mdi:play-circle-outline + state_display: > + [[[ + return entity?.state === 'on' ? 'ACTIVE' : 'OFF'; + ]]] + tap_action: + action: toggle + confirmation: + text: Start or stop the on-demand cleaning cycle? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_select.l10s_vacuum_phase + name: Current Phase + icon: mdi:playlist-check + state_display: > + [[[ + return String(entity?.state ?? 'NO DATA').replaceAll('_', ' ').toUpperCase(); + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_text.l10s_vacuum_room_queue + name: Rooms Remaining + icon: mdi:format-list-numbered + state_display: > + [[[ + const roomNames = { + '1': 'Pool Bath', '2': 'Office', '3': 'Kids Bath', '4': 'Primary Bath', + '6': 'Paige', '7': 'Primary Bed', '8': 'Justin', '9': 'Stacey Office', + '10': 'Living', '12': 'Dining', '13': 'Hallway', '14': 'Kitchen', + '15': 'Foyer', '17': 'Formal Dining' + }; + const ids = String(entity?.state ?? '').match(/\d+/g) ?? []; + if (!ids.length) return 'COMPLETE'; + const names = ids.map((id) => roomNames[id] ?? id); + return names.length > 3 ? `${names.slice(0, 3).join(', ')} +${names.length - 3}` : names.join(', '); + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: input_text.l10s_vacuum_rooms_cleaned_today + name: Cleaned Today + icon: mdi:check-all + state_display: > + [[[ + const rooms = String(entity?.state ?? '').split(',').map((value) => value.trim()).filter(Boolean); + return rooms.length ? `${rooms.length} ROOMS` : 'NONE YET'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: camera.l10s_vacuum_map + name: Open Full Vacuum Map + icon: mdi:map-outline + state_display: OPEN + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/vacuum-map + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Vacuum Controls + + # Fallback card: native entities preserve safe vacuum and select controls. + - type: entities + show_header_toggle: false + entities: + - entity: vacuum.l10s_vacuum + name: Vacuum + - entity: select.l10s_vacuum_cleaning_mode + name: Cleaning Mode + - entity: select.l10s_vacuum_suction_level + name: Suction + - entity: select.l10s_vacuum_mop_pad_humidity + name: Mop Moisture + - entity: select.l10s_vacuum_auto_empty_frequency + name: Auto-Empty + - entity: switch.l10s_vacuum_auto_dust_collecting + name: Auto Dust Collection + +# ------------------------------------------------------------------- +# Consumables and last-run evidence +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Consumables - Hold a Row to Reset + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_filter_left + name: Filter + icon: mdi:air-filter + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_filter + confirmation: + text: Reset the vacuum filter life to 100%? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_main_brush_left + name: Main Brush + icon: mdi:brush + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_main_brush + confirmation: + text: Reset the main brush life to 100%? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_side_brush_left + name: Side Brush + icon: mdi:brush-variant + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_side_brush + confirmation: + text: Reset the side brush life to 100%? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_sensor_dirty_left + name: Sensors + icon: mdi:radar + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_sensor + confirmation: + text: Reset the vacuum sensor-cleaning life to 100%? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_mop_pad_left + name: Mop Pads + icon: mdi:water-sync + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_mop_pad + confirmation: + text: Reset the mop pad life to 100%? + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_detergent_left + name: Detergent + icon: mdi:bottle-tonic-outline + tap_action: + action: more-info + hold_action: + action: call-service + service: button.press + service_data: + entity_id: button.l10s_vacuum_reset_detergent + confirmation: + text: Reset the detergent life to 100%? + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Cleaning Evidence + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_cleaning_count + name: Completed Runs + icon: mdi:counter + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_total_cleaned_area + name: Lifetime Area + icon: mdi:ruler-square + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_cleaning_history + name: Last Cleaning Record + icon: mdi:history + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_dust_collection + name: Dust Collection + icon: mdi:delete-sweep-outline + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_task_status + name: Last Task Status + icon: mdi:clipboard-check-outline + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.l10s_vacuum_error + name: Current Error + icon: mdi:alert-circle-outline diff --git a/config/dashboards/infrastructure/partials/wan_detail_sections.yaml b/config/dashboards/infrastructure/partials/wan_detail_sections.yaml new file mode 100644 index 00000000..ef12bdf6 --- /dev/null +++ b/config/dashboards/infrastructure/partials/wan_detail_sections.yaml @@ -0,0 +1,352 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Infrastructure Partial - WAN Detail +# Immediate outage detection, sustained degradation, and 14-day trends. +# ------------------------------------------------------------------- +# Notes: Near-zero throughput or 90% packet loss alerts immediately. +# Notes: Other threshold breaches must remain continuous for 6 hours. +###################################################################### + +# ------------------------------------------------------------------- +# WAN evaluation ribbon +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(4, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: binary_sensor.infra_wan_quality_degraded + name: WAN + icon: mdi:wan + variables: + ok_state: 'off' + + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: binary_sensor.infra_wan_outage + name: Immediate Outage + icon: mdi:lan-disconnect + variables: + ok_state: 'off' + healthy_text: CLEAR + alert_text: OUTAGE + + - type: custom:button-card + template: bearstone_infra_status_kpi + entity: binary_sensor.infra_wan_sustained_degradation + name: Sustained Performance + icon: mdi:timer-alert-outline + variables: + ok_state: 'off' + healthy_text: CLEAR + alert_text: DEGRADED + state_display: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + if (['unknown', 'unavailable', 'none', ''].includes(raw)) return 'OBSERVING'; + return raw === 'on' ? 'DEGRADED' : 'CLEAR'; + ]]] + + - type: custom:button-card + template: bearstone_infra_kpi + entity: binary_sensor.infra_wan_sustained_degradation + name: Evaluation Window + icon: mdi:timer-sand + state_display: > + [[[ return '6 HOURS'; ]]] + +# ------------------------------------------------------------------- +# Current values and explicit alert rules +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Current WAN Signals + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.speedtest_download + name: Download + icon: mdi:download-network-outline + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(1)} Mbit/s` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.speedtest_upload + name: Upload + icon: mdi:upload-network-outline + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(1)} Mbit/s` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.speedtest_ping + name: Speedtest Latency + icon: mdi:speedometer + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(1)} ms` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.infra_wan_latency_ms + name: Continuous Latency + icon: mdi:wan + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(1)} ms` : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.infra_wan_packet_loss + name: Packet Loss + icon: mdi:chart-bell-curve-cumulative + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? `${value.toFixed(1)}%` : 'NO DATA'; + ]]] + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Why WAN Would Alert + + - type: custom:button-card + template: bearstone_infra_list_row + entity: binary_sensor.infra_wan_quality_degraded + name: Current Threshold Breach + icon: mdi:alert-decagram-outline + state_display: > + [[[ + const invalid = (value) => ['unknown', 'unavailable', 'none', ''].includes(String(value ?? '').toLowerCase()); + const numeric = (id) => invalid(states[id]?.state) ? null : Number(states[id]?.state); + const download = numeric('sensor.speedtest_download'); + const upload = numeric('sensor.speedtest_upload'); + const latency = numeric('sensor.infra_wan_latency_ms'); + const loss = numeric('sensor.infra_wan_packet_loss'); + const reasons = []; + if ([download, upload, latency, loss].some((value) => value === null || !Number.isFinite(value))) reasons.push('NO DATA'); + if (download !== null && download < 300) reasons.push('DOWNLOAD'); + if (upload !== null && upload < 300) reasons.push('UPLOAD'); + if (latency !== null && latency > 80) reasons.push('LATENCY'); + if (loss !== null && loss > 5) reasons.push('PACKET LOSS'); + return reasons.length ? reasons.join(' · ') : 'NONE'; + ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: binary_sensor.infra_wan_outage + name: Immediate Outage Rule + icon: mdi:lan-disconnect + state_display: > + [[[ return '≤1 Mbit/s OR ≥90% LOSS'; ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: binary_sensor.infra_wan_sustained_degradation + name: Performance Persistence + icon: mdi:timer-alert-outline + state_display: > + [[[ return '6 CONTINUOUS HOURS'; ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.speedtest_download + name: Throughput Rule + icon: mdi:speedometer-slow + state_display: > + [[[ return '<300 / 300 Mbit/s'; ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.infra_wan_latency_ms + name: Latency Rule + icon: mdi:timer-outline + state_display: > + [[[ return '>80 ms'; ]]] + + - type: custom:button-card + template: bearstone_infra_list_row + entity: sensor.infra_wan_packet_loss + name: Packet Loss Rule + icon: mdi:chart-bell-curve-cumulative + state_display: > + [[[ return '>5%'; ]]] + +# ------------------------------------------------------------------- +# Multi-day trend and alert history +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:vertical-stack-in-card + grid_options: + columns: full + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: WAN Trends - 7 Days + + - type: custom:layout-card + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) + cards: + - type: custom:mini-graph-card + name: Download - 7 Days + icon: mdi:download-network-outline + entities: + - entity: sensor.speedtest_download + name: Download + hours_to_show: 168 + points_per_hour: 1 + line_width: 2 + smoothing: true + show: + fill: false + legend: false + labels: false + name: true + icon: true + state: true + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + + - type: custom:mini-graph-card + name: Upload - 7 Days + icon: mdi:upload-network-outline + entities: + - entity: sensor.speedtest_upload + name: Upload + hours_to_show: 168 + points_per_hour: 1 + line_width: 2 + smoothing: true + show: + fill: false + legend: false + labels: false + name: true + icon: true + state: true + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + + - type: custom:mini-graph-card + name: Continuous Latency - 7 Days + icon: mdi:wan + entities: + - entity: sensor.infra_wan_latency_ms + name: Latency + hours_to_show: 168 + points_per_hour: 1 + line_width: 2 + smoothing: true + show: + fill: false + legend: false + labels: false + name: true + icon: true + state: true + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + + - type: custom:mini-graph-card + name: Packet Loss - 7 Days + icon: mdi:chart-bell-curve-cumulative + entities: + - entity: sensor.infra_wan_packet_loss + name: Packet Loss + hours_to_show: 168 + points_per_hour: 1 + line_width: 2 + smoothing: false + show: + fill: false + legend: false + labels: false + name: true + icon: true + state: true + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml + + # Core history-graph is required for binary outage/degradation timelines. + - type: history-graph + title: WAN Alert Timeline - 14 Days + hours_to_show: 336 + entities: + - entity: binary_sensor.infra_wan_outage + name: Immediate Outage + - entity: binary_sensor.infra_wan_sustained_degradation + name: Sustained Degradation + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml diff --git a/config/dashboards/infrastructure/popups/docker_10_maintenance.yaml b/config/dashboards/infrastructure/popups/docker_10_maintenance.yaml index fb4a1149..bc610984 100644 --- a/config/dashboards/infrastructure/popups/docker_10_maintenance.yaml +++ b/config/dashboards/infrastructure/popups/docker_10_maintenance.yaml @@ -8,6 +8,7 @@ # ------------------------------------------------------------------- # Related Issue: 1560, 1725 # Notes: Reuses existing Infrastructure button-card templates inside the popup. +# Notes: Maintenance controls use one full-width column for reliable desktop and touch interaction. # Notes: Volume prune is destructive; keep it hold-to-act with an explicit confirmation. ###################################################################### @@ -24,7 +25,7 @@ width_desktop: 520px bg_opacity: '35' cards: - type: grid - columns: 2 + columns: 1 square: false cards: - type: custom:button-card diff --git a/config/dashboards/infrastructure/popups/docker_14_maintenance.yaml b/config/dashboards/infrastructure/popups/docker_14_maintenance.yaml index ee8319f4..0de110e9 100644 --- a/config/dashboards/infrastructure/popups/docker_14_maintenance.yaml +++ b/config/dashboards/infrastructure/popups/docker_14_maintenance.yaml @@ -8,6 +8,7 @@ # ------------------------------------------------------------------- # Related Issue: 1560, 1725 # Notes: Reuses existing Infrastructure button-card templates inside the popup. +# Notes: Maintenance controls use one full-width column for reliable desktop and touch interaction. # Notes: Volume prune is destructive; keep it hold-to-act with an explicit confirmation. ###################################################################### @@ -24,7 +25,7 @@ width_desktop: 520px bg_opacity: '35' cards: - type: grid - columns: 2 + columns: 1 square: false cards: - type: custom:button-card diff --git a/config/dashboards/infrastructure/popups/docker_17_maintenance.yaml b/config/dashboards/infrastructure/popups/docker_17_maintenance.yaml index 97fd2e81..cdfa00d1 100644 --- a/config/dashboards/infrastructure/popups/docker_17_maintenance.yaml +++ b/config/dashboards/infrastructure/popups/docker_17_maintenance.yaml @@ -8,6 +8,7 @@ # ------------------------------------------------------------------- # Related Issue: 1560, 1725 # Notes: Reuses existing Infrastructure button-card templates inside the popup. +# Notes: Maintenance controls use one full-width column for reliable desktop and touch interaction. # Notes: Volume prune is destructive; keep it hold-to-act with an explicit confirmation. ###################################################################### @@ -24,7 +25,7 @@ width_desktop: 520px bg_opacity: '35' cards: - type: grid - columns: 2 + columns: 1 square: false cards: - type: custom:button-card diff --git a/config/dashboards/infrastructure/popups/docker_69_maintenance.yaml b/config/dashboards/infrastructure/popups/docker_69_maintenance.yaml index 2ff23cc0..01267f10 100644 --- a/config/dashboards/infrastructure/popups/docker_69_maintenance.yaml +++ b/config/dashboards/infrastructure/popups/docker_69_maintenance.yaml @@ -8,6 +8,7 @@ # ------------------------------------------------------------------- # Related Issue: 1560, 1725 # Notes: Reuses existing Infrastructure button-card templates inside the popup. +# Notes: Maintenance controls use one full-width column for reliable desktop and touch interaction. # Notes: Volume prune is destructive; keep it hold-to-act with an explicit confirmation. ###################################################################### @@ -24,7 +25,7 @@ width_desktop: 520px bg_opacity: '35' cards: - type: grid - columns: 2 + columns: 1 square: false cards: - type: custom:button-card diff --git a/config/dashboards/infrastructure/templates/button_card_templates.yaml b/config/dashboards/infrastructure/templates/button_card_templates.yaml index b1766b61..b11afb1c 100644 --- a/config/dashboards/infrastructure/templates/button_card_templates.yaml +++ b/config/dashboards/infrastructure/templates/button_card_templates.yaml @@ -8,6 +8,7 @@ # Shared `button_card_templates` used across Infrastructure views. # ------------------------------------------------------------------- # Notes: Keep templates generic; view-specific tuning stays in the view partials. +# Notes: The compact ribbon template supports Overview status and daily controls. ###################################################################### bearstone_infra_base: @@ -707,58 +708,6 @@ bearstone_infra_list_row: - padding-left: 8px - white-space: nowrap -bearstone_infra_docker_volume_row: - template: bearstone_infra_list_row - icon: mdi:database - state_display: > - [[[ - const toMiB = (raw, unitRaw) => { - const value = Number(raw); - if (!Number.isFinite(value)) return null; - const unit = String(unitRaw || 'MiB').trim().toLowerCase(); - if (unit === 'b' || unit === 'byte' || unit === 'bytes') return value / 1048576; - if (unit === 'kib' || unit === 'kb') return value / 1024; - if (unit === 'gib' || unit === 'gb') return value * 1024; - if (unit === 'tib' || unit === 'tb') return value * 1048576; - return value; - }; - const formatMiB = (value) => { - if (!Number.isFinite(value)) return 'No telemetry'; - if (value >= 1048576) return `${(value / 1048576).toFixed(1)} TiB`; - if (value >= 1024) return `${(value / 1024).toFixed(1)} GiB`; - if (value > 0 && value < 1) return `${(value * 1024).toFixed(1)} KiB`; - const precision = value >= 10 ? 1 : 2; - return `${value.toFixed(precision)} MiB`; - }; - - if (variables?.not_instrumented === true) return 'Not instrumented'; - - const totalEntity = variables && variables.total_entity - ? states[variables.total_entity] - : entity; - const total = totalEntity - ? toMiB(totalEntity.state, totalEntity.attributes?.unit_of_measurement) - : null; - if (Number.isFinite(total)) return formatMiB(total); - - const volumeEntities = Array.isArray(variables?.volume_entities) - ? variables.volume_entities - : []; - let sum = 0; - let seen = 0; - for (const entityId of volumeEntities) { - const volume = states[entityId]; - const value = volume - ? toMiB(volume.state, volume.attributes?.unit_of_measurement) - : null; - if (Number.isFinite(value)) { - sum += value; - seen += 1; - } - } - return seen > 0 ? `${formatMiB(sum)} | ${seen} vols` : 'No telemetry'; - ]]] - bearstone_infra_alert_row: template: bearstone_infra_list_row # Home view only. Uses JS visibility checks to keep Home "exceptions-only". @@ -785,6 +734,10 @@ bearstone_infra_alert_row: let show = false; if (kind === 'binary_on') show = (stateStr === 'on'); else if (kind === 'binary_off') show = (stateStr === 'off'); + else if (kind === 'state_not') { + const okState = String(variables?.ok_state ?? '').toLowerCase(); + show = stateStr.toLowerCase() !== okState; + } else if (kind === 'ap_zero') show = (stateStr === '0' && ageS >= minAge); else if (kind === 'disk_high' || kind === 'numeric_high') { const v = parseFloat(stateStr); @@ -939,6 +892,139 @@ bearstone_infra_status_kpi: ]]] - opacity: 1 +bearstone_overview_ribbon_control: + template: bearstone_infra_chip + variables: + ok_states: [] + active_states: [] + warning_states: [] + state_labels: {} + raw_suffix: '' + display_mode: state + humidity_entity: '' + state_display: > + [[[ + const raw = String(entity?.state ?? 'unknown').toLowerCase(); + if (variables?.display_mode === 'climate') { + const current = Number(entity?.attributes?.current_temperature); + const target = Number(entity?.attributes?.temperature); + const humidityEntity = String(variables?.humidity_entity ?? '').trim(); + const humidity = humidityEntity ? Number(states[humidityEntity]?.state) : Number.NaN; + const currentText = Number.isFinite(current) ? `${Math.round(current)}°` : 'n/a'; + const targetText = Number.isFinite(target) ? `${Math.round(target)}°` : 'n/a'; + const humidityText = Number.isFinite(humidity) ? ` · ${Math.round(humidity)}%` : ''; + return `${currentText} / ${targetText}${humidityText}`; + } + const labels = variables?.state_labels || {}; + if (Object.prototype.hasOwnProperty.call(labels, raw)) return labels[raw]; + const suffix = String(variables?.raw_suffix ?? '').trim(); + const display = raw.replaceAll('_', ' ').toUpperCase(); + return suffix ? `${display} ${suffix}` : display; + ]]] + styles: + card: + - border-color: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; + const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; + const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; + if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,0.45)'; + if (active.includes(raw)) return 'rgba(30,136,229,0.45)'; + return ok.includes(raw) ? 'rgba(67,160,71,0.45)' : 'rgba(229,57,53,0.40)'; + ]]] + - background: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; + const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; + const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; + if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(255,243,224,0.85)'; + if (active.includes(raw)) return 'rgba(227,242,253,0.90)'; + return ok.includes(raw) ? 'rgba(232,245,233,0.85)' : 'rgba(255,235,238,0.85)'; + ]]] + icon: + - color: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; + const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; + const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; + if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(245,124,0,1)'; + if (active.includes(raw)) return 'rgba(25,118,210,1)'; + return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)'; + ]]] + name: + - font-size: 13px + - font-weight: 900 + - opacity: 1 + state: + - color: > + [[[ + const raw = String(entity?.state ?? '').toLowerCase(); + const ok = Array.isArray(variables?.ok_states) ? variables.ok_states.map(String) : []; + const active = Array.isArray(variables?.active_states) ? variables.active_states.map(String) : []; + const warning = Array.isArray(variables?.warning_states) ? variables.warning_states.map(String) : []; + if (['unknown', 'unavailable', 'none', ''].includes(raw) || warning.includes(raw)) return 'rgba(230,81,0,1)'; + if (active.includes(raw)) return 'rgba(25,118,210,1)'; + return ok.includes(raw) ? 'rgba(46,125,50,1)' : 'rgba(198,40,40,1)'; + ]]] + - font-size: 12px + - font-weight: 900 + - opacity: 1 + +bearstone_overview_sleep_summary: + template: bearstone_infra_kpi + show_icon: false + show_label: true + variables: + score_attribute: '' + green_threshold: 88 + amber_threshold: 65 + styles: + card: + - min-height: 62px + - padding: 8px 12px + grid: + - grid-template-areas: '"n" "s" "l"' + - grid-template-rows: min-content min-content 14px + - row-gap: 1px + name: + - font-size: 12px + - font-weight: 900 + - opacity: 0.75 + state: + - font-size: 26px + - font-weight: 900 + - opacity: 1 + - color: > + [[[ + const attribute = String(variables?.score_attribute ?? '').trim(); + const score = Number(attribute ? entity?.attributes?.[attribute] : entity?.state); + const greenThreshold = Number(variables?.green_threshold ?? 88); + const amberThreshold = Number(variables?.amber_threshold ?? 65); + if (!Number.isFinite(score)) return 'var(--secondary-text-color)'; + if (score >= greenThreshold) return '#2e7d32'; + if (score >= amberThreshold) return '#f9a825'; + return '#c62828'; + ]]] + label: + - font-size: 11px + - font-weight: 700 + - line-height: 14px + +bearstone_health_kpi: + template: bearstone_infra_kpi + styles: + name: + - font-size: 12px + - font-weight: 900 + - opacity: 0.8 + state: + - font-size: 17px + - font-weight: 900 + - opacity: 1 + bearstone_infra_update_row: template: bearstone_infra_list_row icon: mdi:package-up diff --git a/config/dashboards/infrastructure/views/01_home.yaml b/config/dashboards/infrastructure/views/01_home.yaml index b0868577..dc616435 100644 --- a/config/dashboards/infrastructure/views/01_home.yaml +++ b/config/dashboards/infrastructure/views/01_home.yaml @@ -3,13 +3,13 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Infrastructure View - operations summary -# Compact category health, active exceptions, datacenter, and network trends. +# Systems View - operations summary +# Compact house-system health, active exceptions, datacenter, and network trends. # ------------------------------------------------------------------- -# Notes: Production exception-first Infrastructure home view. +# Notes: Production Systems landing view; stable path remains `/dashboard-infrastructure/home`. ###################################################################### -title: Infrastructure +title: Systems path: home type: sections icon: mdi:view-dashboard-variant diff --git a/config/dashboards/overview/partials/home_badges.yaml b/config/dashboards/infrastructure/views/01_home_water.yaml similarity index 50% rename from config/dashboards/overview/partials/home_badges.yaml rename to config/dashboards/infrastructure/views/01_home_water.yaml index 09f08854..33d7daa6 100644 --- a/config/dashboards/overview/partials/home_badges.yaml +++ b/config/dashboards/infrastructure/views/01_home_water.yaml @@ -3,19 +3,19 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview Partial - home badges -# Reusable list extracted from a view for smaller diffs and safer edits. +# Systems View - Home Water +# Leak protection, current use, hot water, maintenance, and trends. # ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/01_home.yaml key `badges`. +# Notes: Promoted from the approved Home Water pilot. ###################################################################### -- type: entity - entity: cover.large_garage_door - display_type: complete - show_entity_picture: false -- type: entity - entity: cover.small_garage_door - display_type: complete -- type: entity - entity: lock.front_door - display_type: complete +title: Home Water +path: home-water +type: sections +icon: mdi:home-flood +theme: default +max_columns: 4 +dense_section_placement: true +badges: [] +sections: !include /config/dashboards/infrastructure/partials/home_water_sections.yaml +cards: [] diff --git a/config/dashboards/overview/views/05_vacuum.yaml b/config/dashboards/infrastructure/views/01_vacuum.yaml similarity index 50% rename from config/dashboards/overview/views/05_vacuum.yaml rename to config/dashboards/infrastructure/views/01_vacuum.yaml index e0ad116c..536e6d42 100644 --- a/config/dashboards/overview/views/05_vacuum.yaml +++ b/config/dashboards/infrastructure/views/01_vacuum.yaml @@ -3,21 +3,19 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview View - Vacuum -# YAML-exported Lovelace dashboard (split into view files). +# Systems View - Vacuum +# Action-first cleaning status, plan, controls, and maintenance health. # ------------------------------------------------------------------- -# Notes: Exported from config/.storage/lovelace.lovelace view index 5. +# Notes: Promoted from the approved Vacuum pilot. ###################################################################### title: Vacuum -icon: mdi:robot-vacuum +path: vacuum type: sections +icon: mdi:robot-vacuum +theme: default +max_columns: 4 +dense_section_placement: true +badges: [] +sections: !include /config/dashboards/infrastructure/partials/vacuum_sections.yaml cards: [] -visible: -- user: be280a93c9d7416e98d25d0470f414be -- user: 46a8d15eb20e4a1daf2d1d1f63180ec5 -- user: 8fc5ba22cb32430a9143beb4df70541b -- user: 19970706e7e4492c844ea2fc94a4599a -sections: !include /config/dashboards/overview/partials/vacuum_sections.yaml -max_columns: 2 -badges: !include /config/dashboards/overview/partials/vacuum_badges.yaml diff --git a/config/dashboards/infrastructure/views/04_network.yaml b/config/dashboards/infrastructure/views/04_network.yaml index 9414e97e..9ef5d10c 100644 --- a/config/dashboards/infrastructure/views/04_network.yaml +++ b/config/dashboards/infrastructure/views/04_network.yaml @@ -6,7 +6,7 @@ # Infrastructure View - Network and External Services # Combined WAN telemetry, dual Pi-hole operations, and website health. # ------------------------------------------------------------------- -# Notes: Detailed Pi-hole and website telemetry use hidden drill-down subviews. +# Notes: Detailed WAN, Pi-hole, and website telemetry use hidden drill-down subviews. ###################################################################### title: Network diff --git a/config/dashboards/infrastructure/views/04_wan.yaml b/config/dashboards/infrastructure/views/04_wan.yaml new file mode 100644 index 00000000..48bbab46 --- /dev/null +++ b/config/dashboards/infrastructure/views/04_wan.yaml @@ -0,0 +1,22 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Infrastructure Subview - WAN Detail +# Current diagnostics, alert rules, and multi-day internet trends. +# ------------------------------------------------------------------- +# Notes: Hidden drill-down reached from the combined Network view. +###################################################################### + +title: WAN Details +path: wan +type: sections +subview: true +back_path: /dashboard-infrastructure/network +theme: default +max_columns: 4 +dense_section_placement: true +badges: [] +sections: !include /config/dashboards/infrastructure/partials/wan_detail_sections.yaml +cards: [] diff --git a/config/dashboards/overview/views/09_salt_trends.yaml b/config/dashboards/infrastructure/views/09_salt_trends.yaml similarity index 96% rename from config/dashboards/overview/views/09_salt_trends.yaml rename to config/dashboards/infrastructure/views/09_salt_trends.yaml index 8447bf7a..bf50971c 100644 --- a/config/dashboards/overview/views/09_salt_trends.yaml +++ b/config/dashboards/infrastructure/views/09_salt_trends.yaml @@ -3,7 +3,7 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview Subview - Salt Trends +# Systems Subview - Salt Trends # Year-scale water softener salt maintenance history. # ------------------------------------------------------------------- # Video: https://youtu.be/_OqTv9i-jAs @@ -15,7 +15,7 @@ title: Salt Trends path: salt-trends subview: true -back_path: /lovelace/water +back_path: /dashboard-infrastructure/home-water type: sections max_columns: 2 sections: diff --git a/config/dashboards/overview/views/10_sprinklers.yaml b/config/dashboards/infrastructure/views/10_sprinklers.yaml similarity index 98% rename from config/dashboards/overview/views/10_sprinklers.yaml rename to config/dashboards/infrastructure/views/10_sprinklers.yaml index 33f8e27b..c6a59745 100644 --- a/config/dashboards/overview/views/10_sprinklers.yaml +++ b/config/dashboards/infrastructure/views/10_sprinklers.yaml @@ -3,17 +3,19 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview Subview - Sprinklers +# Systems Subview - Sprinklers # Rachio-backed sprinkler status, zone history, and watering controls. # ------------------------------------------------------------------- # Notes: Linked from the Home Maintenance water view sprinkler tiles. # Notes: Zone last-run values come from trigger-based template sensors in config/packages/rachio.yaml. +# Video: https://youtu.be/a--1iTDWhSo +# Blog: https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html ###################################################################### title: Sprinklers path: sprinklers subview: true -back_path: /lovelace/water +back_path: /dashboard-infrastructure/home-water type: sections max_columns: 3 sections: diff --git a/config/dashboards/infrastructure/views/11_vacuum_map.yaml b/config/dashboards/infrastructure/views/11_vacuum_map.yaml new file mode 100644 index 00000000..f0fec3b0 --- /dev/null +++ b/config/dashboards/infrastructure/views/11_vacuum_map.yaml @@ -0,0 +1,34 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Systems Subview - Vacuum Map +# Full interactive Dreame map for zone, point, and room cleaning. +# ------------------------------------------------------------------- +# Notes: Specialized map card is retained because native cards do not expose interactive vacuum-map cleaning. +# Notes: Panel view is intentional so the single interactive map can use the full available canvas. +###################################################################### + +title: Vacuum Map +path: vacuum-map +subview: true +back_path: /dashboard-infrastructure/vacuum +type: panel +icon: mdi:map-outline +theme: default +cards: +# Fallback card: the installed vacuum map card provides device-specific interactive map controls. +- type: custom:xiaomi-vacuum-map-card + grid_options: + columns: full + map_source: + camera: camera.l10s_vacuum_map + calibration_source: + camera: true + entity: vacuum.l10s_vacuum + vacuum_platform: Tasshack/dreame-vacuum + map_modes: + - template: vacuum_clean_zone + - template: vacuum_clean_point + - template: vacuum_clean_segment diff --git a/config/dashboards/overview/dashboard.yaml b/config/dashboards/overview/dashboard.yaml index 6bb4a8a0..c6fa4c2a 100644 --- a/config/dashboards/overview/dashboard.yaml +++ b/config/dashboards/overview/dashboard.yaml @@ -7,7 +7,9 @@ # YAML-exported Lovelace dashboard (split into view files). # ------------------------------------------------------------------- # Notes: Used by `/config/ui-lovelace.yaml` (main Lovelace UI). Views are loaded from /config/dashboards/overview/views. +# Notes: Overview reuses the Systems button-card templates for its compact house-status ribbon and Health view. ###################################################################### title: Bear Stone +button_card_templates: !include /config/dashboards/infrastructure/templates/button_card_templates.yaml views: !include_dir_list /config/dashboards/overview/views diff --git a/config/dashboards/overview/partials/camera_badges.yaml b/config/dashboards/overview/partials/camera_badges.yaml deleted file mode 100644 index 0e852ed7..00000000 --- a/config/dashboards/overview/partials/camera_badges.yaml +++ /dev/null @@ -1,29 +0,0 @@ -###################################################################### -# @CCOSTAN - Follow Me on X -# For more info visit https://www.vcloudinfo.com/click-here -# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig -# ------------------------------------------------------------------- -# Overview Partial - camera badges -# Reusable list extracted from a view for smaller diffs and safer edits. -# ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/03_camera.yaml key `badges`. -###################################################################### - -- type: entity - show_name: true - show_state: true - show_icon: true - entity: cover.large_garage_door - color: '' -- type: entity - show_name: true - show_state: true - show_icon: true - entity: cover.small_garage_door - color: '' -- type: entity - show_name: true - show_state: true - show_icon: true - entity: lock.front_door - color: '' diff --git a/config/dashboards/overview/partials/camera_sections.yaml b/config/dashboards/overview/partials/camera_sections.yaml index 7ebc4c08..885c65a6 100644 --- a/config/dashboards/overview/partials/camera_sections.yaml +++ b/config/dashboards/overview/partials/camera_sections.yaml @@ -4,11 +4,64 @@ # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- # Overview Partial - camera sections -# Reusable list extracted from a view for smaller diffs and safer edits. +# Standardized access ribbon followed by live exterior cameras. # ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/03_camera.yaml key `sections`. +# Notes: Entry controls reuse the same shared template as the Home ribbon. ###################################################################### +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(3, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + align-items: center + grid-gap: 10px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: cover.large_garage_door + name: Large Garage + icon: mdi:garage + variables: + ok_states: + - closed + warning_states: + - opening + - closing + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: cover.small_garage_door + name: Small Garage + icon: mdi:garage + variables: + ok_states: + - closed + warning_states: + - opening + - closing + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: lock.front_door + name: Front Door + icon: mdi:door-closed-lock + variables: + ok_states: + - locked + - type: grid cards: - type: picture-glance diff --git a/config/dashboards/overview/partials/vacuum_badges.yaml b/config/dashboards/overview/partials/entity_search.yaml similarity index 58% rename from config/dashboards/overview/partials/vacuum_badges.yaml rename to config/dashboards/overview/partials/entity_search.yaml index 8f3d031c..ac26dc9d 100644 --- a/config/dashboards/overview/partials/vacuum_badges.yaml +++ b/config/dashboards/overview/partials/entity_search.yaml @@ -3,14 +3,11 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview Partial - vacuum badges -# Reusable list extracted from a view for smaller diffs and safer edits. +# Overview Entity Search - responsive auto-entity lookup +# Shared by mobile family context and desktop comfort placement. # ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/05_vacuum.yaml key `badges`. +# Notes: Screen-conditional wrappers determine its responsive Home position. ###################################################################### -- type: entity - show_name: true - show_state: true - show_icon: true - entity: input_boolean.l10s_vacuum_on_demand +type: custom:search-card +max_results: 10 diff --git a/config/dashboards/overview/partials/health_sections.yaml b/config/dashboards/overview/partials/health_sections.yaml index a48da5c8..345c35ae 100644 --- a/config/dashboards/overview/partials/health_sections.yaml +++ b/config/dashboards/overview/partials/health_sections.yaml @@ -3,323 +3,287 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview Partial - health sections -# SleepIQ score/recovery trends plus bed controls. +# Overview Partial - Health +# Current SleepIQ state, paired nightly trends, and native bed controls. # ------------------------------------------------------------------- -# Related Issue: 1584 -# Notes: Uses direct SleepIQ integration entities (no helper template sensors). +# Notes: Daily maximum statistics suppress SleepIQ's between-session zero states. +# Notes: Direct integration entities are reused; no dashboard helper state is added. +# Notes: The ribbon prioritizes occupancy, firmness, and current session duration. ###################################################################### +# ------------------------------------------------------------------- +# Current sleep strip (mandatory first full-width wrapper) +# ------------------------------------------------------------------- - type: grid column_span: 4 - columns: 2 + columns: 1 square: false cards: - - type: entities - title: Carlo Bed Controls - show_header_toggle: false - entities: - - entity: number.sleepnumber_carlo_carlo_firmness - name: Firmness - - entity: number.sleepnumber_carlo_right_head_position_2 - name: Head Position - - entity: number.sleepnumber_carlo_right_foot_position_2 - name: Foot Position - - entity: select.sleepnumber_carlo_foundation_preset_right - name: Preset - - entity: binary_sensor.sleepnumber_carlo_carlo_is_in_bed - name: In Bed - - type: entities - title: Stacey Bed Controls - show_header_toggle: false - entities: - - entity: number.sleepnumber_carlo_stacey_firmness - name: Firmness - - entity: number.sleepnumber_carlo_left_head_position_2 - name: Head Position - - entity: select.sleepnumber_carlo_foundation_preset_left - name: Preset - - entity: binary_sensor.sleepnumber_carlo_stacey_is_in_bed - name: In Bed + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_health_kpi + entity: binary_sensor.sleepnumber_carlo_carlo_is_in_bed + name: Carlo + icon: mdi:bed + state_display: > + [[[ + return entity?.state === 'on' ? 'IN BED' : 'OUT OF BED'; + ]]] + + - type: custom:button-card + template: bearstone_health_kpi + entity: number.sleepnumber_carlo_carlo_firmness + name: Carlo Firmness + icon: mdi:bed-outline + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? value.toFixed(0) : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_health_kpi + entity: sensor.sleepnumber_carlo_carlo_sleep_duration + name: Carlo Slept + icon: mdi:timer-sand + state_display: > + [[[ + const value = Number(entity?.state); + const inBed = states['binary_sensor.sleepnumber_carlo_carlo_is_in_bed']?.state === 'on'; + if (inBed && (!Number.isFinite(value) || value <= 0)) return 'IN PROGRESS'; + if (!Number.isFinite(value)) return 'NO DATA'; + return `${Math.floor(value)}h ${Math.round((value % 1) * 60)}m`; + ]]] + + - type: custom:button-card + template: bearstone_health_kpi + entity: binary_sensor.sleepnumber_carlo_stacey_is_in_bed + name: Stacey + icon: mdi:bed-double-outline + state_display: > + [[[ + return entity?.state === 'on' ? 'IN BED' : 'OUT OF BED'; + ]]] + - type: custom:button-card + template: bearstone_health_kpi + entity: number.sleepnumber_carlo_stacey_firmness + name: Stacey Firmness + icon: mdi:bed-outline + state_display: > + [[[ + const value = Number(entity?.state); + return Number.isFinite(value) ? value.toFixed(0) : 'NO DATA'; + ]]] + + - type: custom:button-card + template: bearstone_health_kpi + entity: sensor.sleepnumber_carlo_stacey_sleep_duration + name: Stacey Slept + icon: mdi:timer-sand + state_display: > + [[[ + const value = Number(entity?.state); + const inBed = states['binary_sensor.sleepnumber_carlo_stacey_is_in_bed']?.state === 'on'; + if (inBed && (!Number.isFinite(value) || value <= 0)) return 'IN PROGRESS'; + if (!Number.isFinite(value)) return 'NO DATA'; + return `${Math.floor(value)}h ${Math.round((value % 1) * 60)}m`; + ]]] + +# ------------------------------------------------------------------- +# Fourteen-night paired trends +# ------------------------------------------------------------------- - type: grid column_span: 4 - columns: 2 + columns: 1 square: false cards: - - type: vertical-stack + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) cards: - - type: markdown - content: | - ## Carlo Health - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_sleep_score - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_sleep_score - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_sleep_score - state_not: none - card: - type: custom:mini-graph-card - name: Sleep Score - icon: mdi:sleep + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Sleep Score - 14 Nights + + # Fallback card: daily statistics remove integration zero placeholders. + - type: statistics-graph + chart_type: line + days_to_show: 14 + period: day + stat_types: + - max entities: - entity: sensor.sleepnumber_carlo_carlo_sleep_score - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_sleep_duration - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_sleep_duration - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_sleep_duration - state_not: none - card: - type: custom:mini-graph-card - name: Sleep Duration - icon: mdi:timer-sand + name: Carlo + - entity: sensor.sleepnumber_carlo_stacey_sleep_score + name: Stacey + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Sleep Duration - 14 Nights + + # Fallback card: daily statistics remove integration zero placeholders. + - type: statistics-graph + chart_type: line + days_to_show: 14 + period: day + stat_types: + - max entities: - entity: sensor.sleepnumber_carlo_carlo_sleep_duration - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_average - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_average - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_average - state_not: none - card: - type: custom:mini-graph-card - name: Heart Rate Average - icon: mdi:heart-pulse + name: Carlo + - entity: sensor.sleepnumber_carlo_stacey_sleep_duration + name: Stacey + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Heart Rate - 14 Nights + + # Fallback card: daily statistics remove integration zero placeholders. + - type: statistics-graph + chart_type: line + days_to_show: 14 + period: day + stat_types: + - max entities: - entity: sensor.sleepnumber_carlo_carlo_heart_rate_average - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_respiratory_rate_average - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_respiratory_rate_average - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_respiratory_rate_average - state_not: none - card: - type: custom:mini-graph-card - name: Respiratory Rate Average - icon: mdi:lungs + name: Carlo + - entity: sensor.sleepnumber_carlo_stacey_heart_rate_average + name: Stacey + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Respiratory Rate - 14 Nights + + # Fallback card: daily statistics remove integration zero placeholders. + - type: statistics-graph + chart_type: line + days_to_show: 14 + period: day + stat_types: + - max entities: - entity: sensor.sleepnumber_carlo_carlo_respiratory_rate_average - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_variability - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_variability - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_heart_rate_variability - state_not: none - card: - type: custom:mini-graph-card - name: Heart Rate Variability - icon: mdi:chart-bell-curve-cumulative + name: Carlo + - entity: sensor.sleepnumber_carlo_stacey_respiratory_rate_average + name: Stacey + + - type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Heart Rate Variability - 14 Nights + + # Fallback card: daily statistics remove integration zero placeholders. + - type: statistics-graph + chart_type: line + days_to_show: 14 + period: day + stat_types: + - max entities: - entity: sensor.sleepnumber_carlo_carlo_heart_rate_variability - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_carlo_pressure - state_not: unknown - - entity: sensor.sleepnumber_carlo_carlo_pressure - state_not: unavailable - - entity: sensor.sleepnumber_carlo_carlo_pressure - state_not: none - card: - type: custom:mini-graph-card - name: Pressure - icon: mdi:gauge - entities: - - entity: sensor.sleepnumber_carlo_carlo_pressure - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true + name: Carlo + - entity: sensor.sleepnumber_carlo_stacey_heart_rate_variability + name: Stacey - - type: vertical-stack +# ------------------------------------------------------------------- +# Native foundation controls +# ------------------------------------------------------------------- +- type: grid + column_span: 4 + columns: 1 + square: false + cards: + - type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(2, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + grid-gap: 12px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(1, minmax(0, 1fr)) cards: - - type: markdown - content: | - ## Stacey Health - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_sleep_score - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_sleep_score - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_sleep_score - state_not: none - card: - type: custom:mini-graph-card - name: Sleep Score - icon: mdi:sleep - entities: - - entity: sensor.sleepnumber_carlo_stacey_sleep_score - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_sleep_duration - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_sleep_duration - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_sleep_duration - state_not: none - card: - type: custom:mini-graph-card - name: Sleep Duration - icon: mdi:timer-sand - entities: - - entity: sensor.sleepnumber_carlo_stacey_sleep_duration - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_average - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_average - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_average - state_not: none - card: - type: custom:mini-graph-card - name: Heart Rate Average - icon: mdi:heart-pulse - entities: - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_average - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_respiratory_rate_average - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_respiratory_rate_average - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_respiratory_rate_average - state_not: none - card: - type: custom:mini-graph-card - name: Respiratory Rate Average - icon: mdi:lungs - entities: - - entity: sensor.sleepnumber_carlo_stacey_respiratory_rate_average - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_variability - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_variability - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_variability - state_not: none - card: - type: custom:mini-graph-card - name: Heart Rate Variability - icon: mdi:chart-bell-curve-cumulative - entities: - - entity: sensor.sleepnumber_carlo_stacey_heart_rate_variability - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true - - type: conditional - conditions: - - entity: sensor.sleepnumber_carlo_stacey_pressure - state_not: unknown - - entity: sensor.sleepnumber_carlo_stacey_pressure - state_not: unavailable - - entity: sensor.sleepnumber_carlo_stacey_pressure - state_not: none - card: - type: custom:mini-graph-card - name: Pressure - icon: mdi:gauge - entities: - - entity: sensor.sleepnumber_carlo_stacey_pressure - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - show: - fill: false - points: false - extrema: true + # Fallback cards: native number/select rows retain sliders and presets. + - type: entities + title: Carlo Bed Controls + show_header_toggle: false + entities: + - entity: number.sleepnumber_carlo_carlo_firmness + name: Firmness + - entity: number.sleepnumber_carlo_right_head_position_2 + name: Head Position + - entity: number.sleepnumber_carlo_right_foot_position_2 + name: Foot Position + - entity: select.sleepnumber_carlo_foundation_preset_right + name: Preset + - entity: binary_sensor.sleepnumber_carlo_carlo_is_in_bed + name: In Bed + - type: entities + title: Stacey Bed Controls + show_header_toggle: false + entities: + - entity: number.sleepnumber_carlo_stacey_firmness + name: Firmness + - entity: number.sleepnumber_carlo_left_head_position_2 + name: Head Position + - entity: select.sleepnumber_carlo_foundation_preset_left + name: Preset + - entity: binary_sensor.sleepnumber_carlo_stacey_is_in_bed + name: In Bed + - entity: input_boolean.carlo_snore + name: Carlo Snore Mode + icon: mdi:sleep-off + tap_action: + action: toggle + confirmation: + text: Toggle Carlo's snore preset automation? diff --git a/config/dashboards/overview/partials/home_sections.yaml b/config/dashboards/overview/partials/home_sections.yaml deleted file mode 100644 index 10fd34d6..00000000 --- a/config/dashboards/overview/partials/home_sections.yaml +++ /dev/null @@ -1,359 +0,0 @@ -###################################################################### -# @CCOSTAN - Follow Me on X -# For more info visit https://www.vcloudinfo.com/click-here -# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig -# ------------------------------------------------------------------- -# Overview Partial - home sections -# Reusable list extracted from a view for smaller diffs and safer edits. -# ------------------------------------------------------------------- -# Related Issue: 1584 -# Notes: Extracted from config/dashboards/overview/views/01_home.yaml key `sections`. -###################################################################### - -- cards: - - square: true - type: grid - cards: - - type: picture-entity - entity: person.carlo - name: Carlo - show_state: false - show_name: false - state_filter: - home: none - not_home: grayscale(100%) opacity(50%) - Justin Dorm: grayscale(10%) opacity(50%) - Paige Home: grayscale(10%) opacity(50%) - Joyce Home: grayscale(100%) opacity(50%) - driving: grayscale(100%) opacity(50%) - - type: picture-entity - entity: person.stacey - name: Stacey - show_state: false - show_name: false - state_filter: - home: none - not_home: grayscale(100%) opacity(50%) - Justin Dorm: grayscale(10%) opacity(50%) - Paige Home: grayscale(10%) opacity(50%) - Joyce Home: grayscale(100%) opacity(50%) - gym: grayscale(100%) opacity(50%) - driving: grayscale(100%) opacity(50%) - - type: picture-entity - entity: person.justin - name: Justin - show_state: false - show_name: false - state_filter: - home: none - not_home: grayscale(100%) opacity(50%) - Justin Dorm: grayscale(10%) opacity(50%) - Paige Home: grayscale(10%) opacity(50%) - Joyce Home: grayscale(100%) opacity(50%) - gym: grayscale(100%) opacity(50%) - driving: grayscale(100%) opacity(50%) - - type: picture-entity - entity: person.paige - name: Paige - show_state: false - show_name: false - state_filter: - home: none - not_home: grayscale(100%) opacity(50%) - paige_work: grayscale(100%) opacity(50%) - Justin Dorm: grayscale(10%) opacity(50%) - Paige Home: grayscale(10%) opacity(50%) - Joyce Home: grayscale(100%) opacity(50%) - gym: grayscale(100%) opacity(50%) - driving: grayscale(100%) opacity(50%) - columns: 4 - - type: entities - entities: - - type: conditional - conditions: - - entity: person.carlo - state_not: home - row: - entity: sensor.carlo_location_display - name: Carlo Location - - type: conditional - conditions: - - entity: person.stacey - state_not: home - row: - entity: sensor.stacey_location_display - name: Stacey Location - - type: conditional - conditions: - - entity: person.justin - state_not: home - row: - entity: sensor.justin_location_display - name: Justin Location - - type: conditional - conditions: - - entity: person.paige - state_not: home - row: - entity: sensor.paige_location_display - name: Paige Location - state_color: false - - type: custom:mushroom-template-card - primary: Zoom Map - icon: mdi:map-marker - tap_action: - action: navigate - navigation_path: /lovelace/family_locator - hold_action: - action: none - double_tap_action: - action: none - layout: horizontal - fill_container: true - # Core map cards are required to show each person's location history. - - type: map - entities: - - person.justin - hours_to_show: 48 - aspect_ratio: '4:3' - theme_mode: auto - card_mod: &person_location_map_style - style: null - ha-map $ ha-entity-marker $: ".marker { \n /* Style person marker & adjust position to avoid blocking waypoints */\ - \ \n border: 3px solid var(\u2014state-person) !important; \n border-radius: 50% 50% 50% 0px !important; \n transform:\ - \ rotate(-45deg) translate(50%, -50%); \n overflow: visible !important;\n} \n.entity-picture { \n /* Correct orientation\ - \ of person avatar / \n transform: rotate(45deg); \n border-radius: 50%; \n} \n" - ha-map $: "path:first-child { \n / Style accuracy radius / \n stroke: var(\u2014state-person); \n fill: color-mix(in\ - \ srgb, var(\u2014state-person) 50%, transparent); \n stroke-width: 0px; } \npath:nth-child(even) { \n / Styling\ - \ for waypoints / \n stroke: var(\u2014purple-color);\n stroke-width: 4px; \n} \npath:nth-child(odd):not(:first-child)\ - \ { \n / Styling for lines */ \n stroke: var(\u2014purple-color);\n stroke-width: 4px; \n}\n:host { \n /* Define\ - \ Person State colors. Can be added to theme / \n \u2014state-person-home: var(\u2014green-color); \n \u2014state-person-not-home:\ - \ var(\u2014red-color); \n \u2014state-person-zone: var(\u2014blue-color); \n \u2014state-person-unknown: var(\u2014\ - grey-color); \n / Set person state color */ \n \u2014state-person: \n {% if is_state(config.entities[0].entity,\ - \ [\u2018home\u2019, \u2018not_home\u2019, \u2018unknown\u2019]) %} \n var(\u2014state-person-{{ states(config.entities[0].entity)\ - \ | replace(\u2018_\u2019, \u2018-\u2018) }}) \n {% else %} \n var(\u2014state-person-zone) \n {% endif\ - \ %}; \n}\n" - - type: map - entities: - - person.paige - hours_to_show: 48 - aspect_ratio: '4:3' - theme_mode: auto - card_mod: *person_location_map_style - - type: map - entities: - - person.carlo - - person.stacey - hours_to_show: 48 - aspect_ratio: '4:3' - theme_mode: auto - card_mod: *person_location_map_style - column_span: 1 -- cards: - - type: custom:mushroom-vacuum-card - entity: vacuum.l10s_vacuum - icon_animation: true - commands: - - return_home - - start_pause - - locate - double_tap_action: - action: none - tap_action: - action: navigate - navigation_path: /lovelace/vacuum - visibility: - - condition: state - entity: vacuum.l10s_vacuum - state_not: docked - primary_info: name - fill_container: true - grid_options: - rows: 1 - columns: full - layout: horizontal - - type: tile - entity: climate.downstairs - state_content: - - current_temperature - - temperature - vertical: false - features_position: bottom - - type: custom:mushroom-template-card - entity: climate.upstairs - primary: Upstairs - secondary: >- - {% set current = state_attr('climate.upstairs', 'current_temperature') %} - {% set target = state_attr('climate.upstairs', 'temperature') %} - {% set humidity = states('sensor.upstairs_humidity') %} - {% set current_text = ((current | float) | round(0) | int) ~ ' °F' if current is number else 'Current n/a' %} - {% set target_text = ((target | float) | round(0) | int) ~ ' °F' if target is number else 'Target n/a' %} - {% set humidity_text = ((humidity | float) | round(0) | int) ~ '% humidity' if is_number(humidity) else 'Humidity n/a' %} - {{ current_text }} · {{ target_text }} · {{ humidity_text }} - icon: mdi:thermostat - icon_color: >- - {% set mode = states('climate.upstairs') %} - {% if mode == 'cool' %}blue{% elif mode == 'heat' %}orange{% elif mode == 'off' %}grey{% else %}green{% endif %} - tap_action: - action: more-info - hold_action: - action: more-info - double_tap_action: - action: none - multiline_secondary: false - - type: custom:search-card - max_results: 10 - - type: custom:mini-graph-card - name: Sleep Score Trend - icon: mdi:heart-pulse - entities: - - entity: sensor.sleepnumber_carlo_carlo_sleep_score - name: Carlo - show_state: true - - entity: sensor.sleepnumber_carlo_stacey_sleep_score - name: Stacey - show_state: true - hours_to_show: 168 - points_per_hour: 1 - line_width: 3 - graph: line - smoothing: true - lower_bound: 0 - upper_bound: 100 - show: - graph: line - name: true - icon: true - state: true - fill: false - points: false - legend: false - labels: false - height: 90 - tap_action: - action: navigate - navigation_path: /lovelace/health - hold_action: - action: navigate - navigation_path: /lovelace/health - grid_options: - columns: full - rows: 3 - - type: custom:bubble-card - card_type: button - button_type: slider - entity: light.living_room_lights - name: Living Room Lights - icon: mdi:sofa - show_state: true - show_attribute: false - show_last_changed: true - tap_action: - action: navigate - navigation_path: '#ovw-living-room' - button_action: - tap_action: - action: navigate - navigation_path: '#ovw-living-room' - grid_options: - columns: 6 - rows: 1 - card_layout: large - - type: custom:bubble-card - card_type: button - name: Lights On - icon: mdi:lightbulb-on-outline - show_state: true - tap_action: - action: navigate - navigation_path: '#ovw-lights' - button_action: - tap_action: - action: navigate - navigation_path: '#ovw-lights' - grid_options: - columns: 6 - rows: 1 - card_layout: large - button_type: switch - show_name: true - show_attribute: false - attribute: icon - entity: sensor.number_of_lights_on - - type: custom:bubble-card - card_type: button - button_type: switch - entity: group.interior_switches - name: Interior Switches - icon: mdi:lightning-bolt - show_state: true - show_attribute: false - show_last_changed: false - button_action: - tap_action: - action: more-info - grid_options: - columns: 6 - rows: 1 - tap_action: - action: toggle - card_layout: large - - type: custom:bubble-card - card_type: button - button_type: state - entity: group.exterior_lights - name: Exterior Lights - icon: mdi:palm-tree - show_state: true - show_attribute: false - show_last_changed: true - grid_options: - columns: 6 - rows: 1 - - !include /config/dashboards/overview/popups/living_room.yaml - - !include /config/dashboards/overview/popups/lights.yaml -- cards: - - type: custom:frigate-events-card - frigate_client_id: frigate - event_count: 5 - video: true - video_on_hover: true - - show_state: true - show_name: true - camera_view: live - type: picture-entity - entity: camera.birdseye - tap_action: - action: navigate - navigation_path: /lovelace/cameras - - type: vertical-stack - cards: - - type: weather-forecast - show_current: true - show_forecast: true - entity: weather.pirateweather - forecast_type: hourly - secondary_info_attribute: humidity - - type: custom:clock-weather-card - entity: weather.pirateweather - sun_entity: sun.sun - temperature_sensor: sensor.pirateweather_temperature - humidity_sensor: sensor.pirateweather_humidity - weather_icon_type: fill - animated_icon: true - forecast_rows: 5 - locale: en-GB - time_pattern: HH:mm - time_format: 12 - date_pattern: DDDD - hide_today_section: true - hide_forecast_section: false - show_humidity: true - hide_clock: false - hide_date: true - hourly_forecast: false - use_browser_time: false - time_zone: null - show_decimal: false - aqi_sensor: sensor.bear_stone_common_air_quality_index - apparent_sensor: null diff --git a/config/dashboards/overview/partials/vacuum_sections.yaml b/config/dashboards/overview/partials/vacuum_sections.yaml deleted file mode 100644 index 3bf97663..00000000 --- a/config/dashboards/overview/partials/vacuum_sections.yaml +++ /dev/null @@ -1,352 +0,0 @@ -###################################################################### -# @CCOSTAN - Follow Me on X -# For more info visit https://www.vcloudinfo.com/click-here -# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig -# ------------------------------------------------------------------- -# Overview Partial - vacuum sections -# Reusable list extracted from a view for smaller diffs and safer edits. -# ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/05_vacuum.yaml key `sections`. -###################################################################### - -- type: grid - cards: - - type: tile - entity: input_text.l10s_vacuum_room_catalog - vertical: false - features_position: bottom - grid_options: - columns: full - - type: tile - entity: input_text.l10s_vacuum_room_queue - vertical: false - features_position: bottom - grid_options: - columns: full - - type: tile - entity: input_text.l10s_vacuum_rooms_cleaned_today - vertical: false - features_position: bottom - grid_options: - columns: full - - type: tile - grid_options: - columns: full - entity: sensor.l10s_vacuum_current_room - state_content: - - state - - room_id - - last_changed - vertical: false - features_position: bottom - - type: tile - entity: input_select.l10s_vacuum_phase - - type: tile - entity: sensor.l10s_vacuum_status - - type: markdown - content: " 14 \u2013 Kitchen \n 12 \u2013 Dining \n 10 \u2013 Living \n 7 \u2013 Master Bedroom \n 15 \u2013\ - \ Foyer \n 9 \u2013 Stacey Office \n 17 \u2013 Formal Dining \n 13 \u2013 Hallway \n 8 \u2013 Justin Bedroom\ - \ \n 6 \u2013 Paige Bedroom \n 4 \u2013 Master Bathroom \n 2 \u2013 Office \n 1 \u2013 Pool Bath \n 3 \u2013\ - \ Kids Bathroom\n" - title: Room Legend -- type: grid - cards: - - type: custom:xiaomi-vacuum-map-card - map_source: - camera: camera.l10s_vacuum_map - calibration_source: - camera: true - entity: vacuum.l10s_vacuum - vacuum_platform: Tasshack/dreame-vacuum - map_modes: - - template: vacuum_clean_zone - - template: vacuum_clean_point - - template: vacuum_clean_segment - predefined_selections: - - id: '1' - icon: - name: mdi:home-outline - x: -8100 - y: 12400 - label: - text: Pool-Bath - x: -8100 - y: 12400 - offset_y: 35 - outline: - - - -9950 - - 11350 - - - -6650 - - 11350 - - - -6650 - - 12900 - - - -9950 - - 12900 - - id: '2' - icon: - name: mdi:monitor-shimmer - x: -4650 - y: 10900 - label: - text: Office - x: -4650 - y: 10900 - offset_y: 35 - outline: - - - -6650 - - 7400 - - - -2800 - - 7400 - - - -2800 - - 12850 - - - -6650 - - 12850 - - id: '3' - icon: - name: mdi:home-outline - x: -5600 - y: 5250 - label: - text: Kids-Bathroom - x: -5600 - y: 5250 - offset_y: 35 - outline: - - - -6450 - - 4250 - - - -4750 - - 4250 - - - -4750 - - 6150 - - - -6450 - - 6150 - - id: '4' - icon: - name: mdi:home-outline - x: 7300 - y: 4100 - label: - text: Master-Bathroom - x: 7300 - y: 4100 - offset_y: 35 - outline: - - - 5450 - - 250 - - - 9400 - - 250 - - - 9400 - - 7850 - - - 5450 - - 7850 - - id: '6' - icon: - name: mdi:home-outline - x: -8450 - y: 4200 - label: - text: Paige-Bedroom - x: -8450 - y: 4200 - offset_y: 35 - outline: - - - -9900 - - 1600 - - - -6600 - - 1600 - - - -6600 - - 6100 - - - -9900 - - 6100 - - id: '7' - icon: - name: mdi:home-outline - x: 6450 - y: 10400 - label: - text: Master-Bedroom - x: 6450 - y: 10400 - offset_y: 35 - outline: - - - 3450 - - 7850 - - - 9550 - - 7850 - - - 9550 - - 12850 - - - 3450 - - 12850 - - id: '8' - icon: - name: mdi:home-outline - x: -8300 - y: 9300 - label: - text: Justin-Bedroom - x: -8300 - y: 9300 - offset_y: 35 - outline: - - - -9950 - - 6250 - - - -6650 - - 6250 - - - -6650 - - 11150 - - - -9950 - - 11150 - - id: '9' - icon: - name: mdi:home-outline - x: 7250 - y: -2200 - label: - text: Stacey-Office - x: 7250 - y: -2200 - offset_y: 35 - outline: - - - 5450 - - -4700 - - - 9450 - - -4700 - - - 9450 - - 350 - - - 5450 - - 350 - - id: '10' - icon: - name: mdi:sofa-outline - x: 2500 - y: 4800 - label: - text: Living Room - x: 2500 - y: 4800 - offset_y: 35 - outline: - - - -650 - - 750 - - - 5300 - - 750 - - - 5300 - - 8800 - - - -650 - - 8800 - - id: '11' - icon: - name: mdi:home-outline - x: -5350 - y: 2600 - label: - text: Garage-Hallway - x: -5350 - y: 2600 - offset_y: 35 - outline: - - - -6600 - - 1100 - - - -4050 - - 1100 - - - -4050 - - 4200 - - - -6600 - - 4200 - - id: '12' - icon: - name: mdi:home-outline - x: 700 - y: 8900 - label: - text: Dining-Room - x: 700 - y: 8900 - offset_y: 35 - outline: - - - -4350 - - 6000 - - - 2650 - - 6000 - - - 2650 - - 12650 - - - -4350 - - 12650 - - id: '13' - icon: - name: mdi:home-outline - x: -6200 - y: 6800 - label: - text: Hallway - x: -6200 - y: 6800 - offset_y: 35 - outline: - - - -7550 - - 6100 - - - -4350 - - 6100 - - - -4350 - - 7700 - - - -7550 - - 7700 - - id: '14' - icon: - name: mdi:chef-hat - x: -1700 - y: 3350 - label: - text: Kitchen - x: -1700 - y: 3350 - offset_y: 35 - outline: - - - -4200 - - 950 - - - -300 - - 950 - - - -300 - - 6100 - - - -4200 - - 6100 - - id: '15' - icon: - name: mdi:home-outline - x: 4050 - y: -1350 - label: - text: Foyer - x: 4050 - y: -1350 - offset_y: 35 - outline: - - - 2850 - - -3500 - - - 5450 - - -3500 - - - 5450 - - 800 - - - 2850 - - 800 - - id: '17' - icon: - name: mdi:home-outline - x: 750 - y: -1250 - label: - text: Formal-Dining - x: 750 - y: -1250 - offset_y: 35 - outline: - - - -1500 - - -3500 - - - 2950 - - -3500 - - - 2950 - - 950 - - - -1500 - - 950 - map_locked: true - two_finger_pan: true diff --git a/config/dashboards/overview/partials/water_sections.yaml b/config/dashboards/overview/partials/water_sections.yaml deleted file mode 100644 index 79e17989..00000000 --- a/config/dashboards/overview/partials/water_sections.yaml +++ /dev/null @@ -1,228 +0,0 @@ -###################################################################### -# @CCOSTAN - Follow Me on X -# For more info visit https://www.vcloudinfo.com/click-here -# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig -# ------------------------------------------------------------------- -# Overview Partial - water sections -# Reusable list extracted from a view for smaller diffs and safer edits. -# ------------------------------------------------------------------- -# Notes: Extracted from config/dashboards/overview/views/07_water.yaml key `sections`. -# Notes: Includes water and home utility telemetry (filters, power, hot water). -# Video: HVAC maintenance dashboard - https://youtu.be/nScl2JxYSB8 -# Video: Water softener salt tracking - https://youtu.be/_OqTv9i-jAs -# Blog: https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html -# Notes: Sprinkler overview links to config/dashboards/overview/views/10_sprinklers.yaml. -###################################################################### - -- cards: - - type: tile - entity: sensor.downstairs_ac_runtime_since_last_filter_change - - type: tile - entity: sensor.upstairs_ac_runtime_since_last_filter_change - - type: tile - entity: input_datetime.downstairs_last_filter_change - tap_action: - action: more-info - entity: script.reset_downstairs_filter - - type: tile - entity: input_datetime.upstairs_last_filter_change - tap_action: - action: more-info - entity: script.reset_upstairs_filter - - type: custom:mushroom-template-card - primary: HVAC Condenser Lines - secondary: >- - {% set days = states('sensor.hvac_condenser_lines_days_since_cleaned') | int(0) -%} - {% set raw = states('input_datetime.hvac_condenser_lines_last_cleaned') -%} - {%- set when = as_datetime(raw).strftime('%b %d, %Y') | replace(' 0', ' ') if raw not in ['unknown', 'unavailable', 'none', ''] else 'unknown' -%} - {%- if days < 1 -%}Cleaned today{%- elif days == 1 -%}1 day since {{ when }}{%- else -%}{{ days }} days since {{ when }}{%- endif -%} - icon: mdi:calendar-clock - entity: input_datetime.hvac_condenser_lines_last_cleaned - icon_color: blue - tap_action: - action: more-info - entity: script.reset_hvac_condenser_lines_cleaned - hold_action: - action: none - double_tap_action: - action: none - layout: horizontal - fill_container: true - - type: custom:power-flow-card-plus - entities: - battery: - state_of_charge: sensor.powerwall_charge - entity: sensor.powerwall_battery_power - use_metadata: false - invert_state: false - state_of_charge_unit_white_space: true - show_state_of_charge: true - grid: - secondary_info: {} - entity: sensor.powerwall_site_power - solar: - display_zero_state: true - secondary_info: {} - entity: sensor.powerwall_solar_power - icon: mdi:white-balance-sunny - color_icon: true - home: - secondary_info: {} - entity: sensor.powerwall_load_power - clickable_entities: true - display_zero_lines: - mode: grey_out - transparency: 50 - grey_color: - - 189 - - 189 - - 189 - use_new_flow_rate_model: true - w_decimals: 0 - kw_decimals: 1 - min_flow_rate: 0.75 - max_flow_rate: 4 - max_expected_power: 2000 - min_expected_power: 0.01 - watt_threshold: 1000 - transparency_zero_lines: 0 - grid_options: - columns: full - rows: auto - - type: energy-solar-graph - column_span: 1 -- type: grid - cards: - - type: tile - entity: sensor.blink_blink1_temperature - - type: tile - entity: sensor.carlo_nas01_temperature - - type: tile - entity: sensor.carlo_nvr_temperature - - type: custom:mini-graph-card - entities: - - entity: sensor.upstairs_temperature - name: Upstairs - - entity: sensor.downstairs_temperature - name: Downstairs - name: House - hours_to_show: 24 - points_per_hour: 1 -- type: grid - cards: - - type: custom:mushroom-template-card - primary: "{{ states('sensor.rheem_wh_available_hot_water') }}% - {{ state_attr('water_heater.rheem_wh', 'temperature')\ - \ }}\xB0F\n" - secondary: Hot Water Available - icon: mdi:water-alert - entity: sensor.rheem_wh_available_hot_water - icon_color: red - tap_action: - action: more-info - hold_action: - action: none - double_tap_action: - action: none - - type: tile - entity: sensor.phyn_daily_water_usage - - type: tile - entity: sensor.phyn_average_water_temperature - - type: tile - entity: sensor.rheem_wh_water_usage_today - - type: tile - entity: input_datetime.water_delivery_date - - type: custom:mushroom-template-card - primary: ReadyRefresh Login - secondary: Manage water delivery - icon: mdi:water - tap_action: - action: url - url_path: https://www.readyrefresh.com/en/login - hold_action: - action: none - double_tap_action: - action: none - layout: horizontal - fill_container: true - # Fallback card: Mushroom matches the existing Home Maintenance overview tile style. - - type: custom:mushroom-template-card - primary: >- - {% set status = states('sensor.rachio_controller_status') %} - {% set active = states('sensor.rachio_active_zone') %} - {% if status == 'watering' %} - Sprinklers: {{ active }} - {% elif status == 'rain_delay' %} - Sprinklers: rain delay - {% elif status == 'standby' %} - Sprinklers: standby - {% elif status == 'unavailable' %} - Sprinklers: unavailable - {% else %} - Sprinklers: ready - {% endif %} - secondary: >- - {% set zone = states('sensor.rachio_last_run_summary') %} - {% set completed = state_attr('sensor.rachio_last_run_summary', 'completed_at') %} - {% set duration = state_attr('sensor.rachio_last_run_summary', 'duration_min') %} - {% if zone not in ['unknown', 'unavailable', 'none', ''] and completed not in ['unknown', 'unavailable', 'none', '', none] %} - {% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %} - Last run: {{ zone }}{% if duration not in ['unknown', 'unavailable', 'none', '', none] %}, {{ duration }} min{% endif %} at {{ when }} - {% else %} - {{ state_attr('sensor.rachio_controller_status', 'schedule_summary') | default('No completed run captured yet.', true) }} - {% endif %} - icon: mdi:sprinkler-variant - entity: sensor.rachio_controller_status - icon_color: >- - {% set status = states('sensor.rachio_controller_status') %} - {% if status == 'watering' %} - green - {% elif status in ['rain_delay', 'standby'] %} - blue - {% elif status == 'unavailable' %} - red - {% else %} - teal - {% endif %} - tap_action: - action: navigate - navigation_path: /lovelace/sprinklers - hold_action: - action: more-info - double_tap_action: - action: none - layout: horizontal - fill_container: true - - type: tile - entity: switch.carlo_rachio_rain_delay - name: Sprinkler rain delay - tap_action: - action: navigate - navigation_path: /lovelace/sprinklers - hold_action: - action: more-info - - type: custom:mushroom-template-card - primary: >- - {% set days = states('sensor.water_softener_salt_days_since_last_add') | float(0) -%} - {%- if days < 1 -%}Last refill: today{%- elif days == 1 -%}Last refill: 1 day ago{%- else -%}Last refill: {{ days | round(1) }} days ago{%- endif -%} - secondary: "{{ states('sensor.water_softener_salt_last_summary') }}" - icon: mdi:shaker - entity: sensor.water_softener_salt_days_since_last_add - icon_color: blue - tap_action: - action: navigate - navigation_path: /lovelace/salt-trends - hold_action: - action: more-info - double_tap_action: - action: none - layout: horizontal - fill_container: true - - type: tile - entity: sensor.water_softener_salt_average_days_between_refills - name: Salt typically lasts - tap_action: - action: navigate - navigation_path: /lovelace/salt-trends - hold_action: - action: more-info - - type: energy-water-graph diff --git a/config/dashboards/overview/sections/00_summary.yaml b/config/dashboards/overview/sections/00_summary.yaml new file mode 100644 index 00000000..f34094f4 --- /dev/null +++ b/config/dashboards/overview/sections/00_summary.yaml @@ -0,0 +1,118 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Overview Section - priority ribbon and daily controls +# Systems first, then frequent doors, climate, and vacuum access. +# ------------------------------------------------------------------- +# Notes: Equal-width pills keep the whole ribbon compact and consistent. +###################################################################### + +type: grid +column_span: 4 +columns: 1 +square: false +cards: +- type: custom:layout-card + grid_options: + columns: full + layout_type: custom:grid-layout + layout: + grid-template-columns: repeat(6, minmax(0, 1fr)) + grid-auto-flow: row + grid-auto-rows: min-content + align-items: center + grid-gap: 10px + margin: 0 + mediaquery: + "(max-width: 900px)": + grid-template-columns: repeat(2, minmax(0, 1fr)) + cards: + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: sensor.infra_dashboard_active_issue_count + name: Systems + icon: mdi:home-cog-outline + variables: + ok_states: + - '0' + state_labels: + '0': ALL CLEAR + raw_suffix: ACTIVE + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/home + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: cover.large_garage_door + name: Large Garage + icon: mdi:garage + variables: + ok_states: + - closed + warning_states: + - opening + - closing + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: lock.front_door + name: Front Door + icon: mdi:door-closed-lock + variables: + ok_states: + - locked + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: climate.downstairs + name: Downstairs + icon: mdi:thermostat + variables: + display_mode: climate + humidity_entity: sensor.downstairs_humidity + ok_states: + - auto + - cool + - dry + - fan_only + - heat + - heat_cool + - 'off' + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: climate.upstairs + name: Upstairs + icon: mdi:thermostat + variables: + display_mode: climate + humidity_entity: sensor.upstairs_humidity + ok_states: + - auto + - cool + - dry + - fan_only + - heat + - heat_cool + - 'off' + + - type: custom:button-card + template: bearstone_overview_ribbon_control + entity: vacuum.l10s_vacuum + name: Vacuum + icon: mdi:robot-vacuum + variables: + ok_states: + - docked + active_states: + - cleaning + - paused + - returning + state_labels: + docked: READY + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/vacuum diff --git a/config/dashboards/overview/sections/10_family.yaml b/config/dashboards/overview/sections/10_family.yaml new file mode 100644 index 00000000..cde64d7d --- /dev/null +++ b/config/dashboards/overview/sections/10_family.yaml @@ -0,0 +1,216 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Overview Section - family presence and compact maps +# Special-home overlays stay visible while Bear Stone home stays clean. +# ------------------------------------------------------------------- +# Notes: Core picture and map cards preserve person images and route history. +# Notes: Mobile search sits before maps so entity lookup remains near the top. +###################################################################### + +cards: +# Fallback card: picture-entity provides native person images and state filters. +- square: true + type: grid + columns: 4 + cards: + - type: picture-entity + entity: person.carlo + name: Carlo + show_state: false + show_name: false + state_filter: + home: none + not_home: grayscale(100%) opacity(50%) + Justin Dorm: grayscale(10%) opacity(50%) + Paige Home: grayscale(10%) opacity(50%) + Joyce Home: grayscale(100%) opacity(50%) + driving: grayscale(100%) opacity(50%) + + - type: picture-entity + entity: person.stacey + name: Stacey + show_state: false + show_name: false + state_filter: + home: none + not_home: grayscale(100%) opacity(50%) + Justin Dorm: grayscale(10%) opacity(50%) + Paige Home: grayscale(10%) opacity(50%) + Joyce Home: grayscale(100%) opacity(50%) + gym: grayscale(100%) opacity(50%) + driving: grayscale(100%) opacity(50%) + + - type: picture-entity + entity: person.justin + name: Justin + show_state: true + show_name: false + card_mod: + style: | + .footer { + display: {% if is_state('person.justin', 'Justin Dorm') %}block{% else %}none{% endif %}; + padding: 4px 2px !important; + font-size: 11px !important; + line-height: 14px !important; + } + state_filter: + home: none + not_home: grayscale(100%) opacity(50%) + Justin Dorm: grayscale(10%) opacity(50%) + Paige Home: grayscale(10%) opacity(50%) + Joyce Home: grayscale(100%) opacity(50%) + gym: grayscale(100%) opacity(50%) + driving: grayscale(100%) opacity(50%) + + - type: picture-entity + entity: person.paige + name: Paige + show_state: true + show_name: false + card_mod: + style: | + .footer { + display: {% if is_state('person.paige', 'Paige Home') %}block{% else %}none{% endif %}; + padding: 4px 2px !important; + font-size: 11px !important; + line-height: 14px !important; + } + state_filter: + home: none + not_home: grayscale(100%) opacity(50%) + paige_work: grayscale(100%) opacity(50%) + Justin Dorm: grayscale(10%) opacity(50%) + Paige Home: grayscale(10%) opacity(50%) + Joyce Home: grayscale(100%) opacity(50%) + gym: grayscale(100%) opacity(50%) + driving: grayscale(100%) opacity(50%) + +# Fallback card: conditional rows explain away locations and collapse when empty. +- type: conditional + conditions: + - condition: or + conditions: + - condition: state + entity: person.carlo + state_not: home + - condition: state + entity: person.stacey + state_not: home + - condition: and + conditions: + - condition: state + entity: person.justin + state_not: home + - condition: state + entity: person.justin + state_not: Justin Dorm + - condition: and + conditions: + - condition: state + entity: person.paige + state_not: home + - condition: state + entity: person.paige + state_not: Paige Home + card: + type: entities + state_color: false + entities: + - type: conditional + conditions: + - entity: person.carlo + state_not: home + row: + entity: sensor.carlo_location_display + name: Carlo Location + - type: conditional + conditions: + - entity: person.stacey + state_not: home + row: + entity: sensor.stacey_location_display + name: Stacey Location + - type: conditional + conditions: + - entity: person.justin + state_not: home + - entity: person.justin + state_not: Justin Dorm + row: + entity: sensor.justin_location_display + name: Justin Location + - type: conditional + conditions: + - entity: person.paige + state_not: home + - entity: person.paige + state_not: Paige Home + row: + entity: sensor.paige_location_display + name: Paige Location + +# Fallback card: screen condition moves shared search ahead of maps on mobile. +- type: conditional + conditions: + - condition: screen + media_query: "(max-width: 900px)" + card: !include /config/dashboards/overview/partials/entity_search.yaml + +- type: custom:mushroom-template-card + primary: Zoom Map + icon: mdi:map-marker + fill_container: true + layout: horizontal + grid_options: + columns: full + rows: 1 + tap_action: + action: navigate + navigation_path: /lovelace/family_locator + hold_action: + action: none + double_tap_action: + action: none + +# Fallback cards: map preserves each person's 24-hour location path. +- type: map + entities: + - person.justin + hours_to_show: 24 + aspect_ratio: '16:9' + theme_mode: auto + card_mod: &person_location_map_style + style: + ha-map $ ha-entity-marker $: | + .marker { + border: 3px solid var(--primary-color) !important; + border-radius: 50% 50% 50% 0 !important; + transform: rotate(-45deg) translate(50%, -50%); + overflow: visible !important; + } + .entity-picture { + transform: rotate(45deg); + border-radius: 50%; + } + +- type: map + entities: + - person.paige + hours_to_show: 24 + aspect_ratio: '16:9' + theme_mode: auto + card_mod: *person_location_map_style + +- type: map + entities: + - person.carlo + - person.stacey + hours_to_show: 24 + aspect_ratio: '16:9' + theme_mode: auto + card_mod: *person_location_map_style + +column_span: 1 diff --git a/config/dashboards/overview/sections/20_comfort.yaml b/config/dashboards/overview/sections/20_comfort.yaml new file mode 100644 index 00000000..fca996ad --- /dev/null +++ b/config/dashboards/overview/sections/20_comfort.yaml @@ -0,0 +1,177 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Overview Section - search, sleep, and frequent lighting +# Puts entity search first for fast mobile access, then daily controls. +# ------------------------------------------------------------------- +# Notes: The strong SQL-backed summary links to detailed Health trends. +###################################################################### + +cards: +# Fallback card: screen condition keeps shared search atop desktop column two. +- type: conditional + conditions: + - condition: screen + media_query: "(min-width: 901px)" + card: !include /config/dashboards/overview/partials/entity_search.yaml + +- type: custom:mushroom-vacuum-card + entity: vacuum.l10s_vacuum + icon_animation: true + commands: + - return_home + - start_pause + - locate + double_tap_action: + action: none + tap_action: + action: navigate + navigation_path: /dashboard-infrastructure/vacuum + visibility: + - condition: state + entity: vacuum.l10s_vacuum + state_not: docked + primary_info: name + fill_container: true + grid_options: + rows: 1 + columns: full + layout: horizontal + +- type: custom:vertical-stack-in-card + card_mod: + style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml + cards: + - type: custom:button-card + template: bearstone_infra_panel_header + name: Sleep Score - 14-Day Average + - type: grid + columns: 2 + square: false + cards: + - type: custom:button-card + template: bearstone_overview_sleep_summary + entity: sensor.sleep_score_14_day_averages + name: Carlo + state_display: > + [[[ + const score = Number(entity?.state); + return Number.isFinite(score) ? score.toFixed(1) : 'n/a'; + ]]] + label: > + [[[ + const nights = Number(entity?.attributes?.carlo_nights ?? 0); + return `${nights} ${nights === 1 ? 'night' : 'nights'}`; + ]]] + tap_action: + action: navigate + navigation_path: /lovelace/health + hold_action: + action: navigate + navigation_path: /lovelace/health + - type: custom:button-card + template: bearstone_overview_sleep_summary + entity: sensor.sleep_score_14_day_averages + name: Stacey + variables: + score_attribute: stacey + state_display: > + [[[ + const score = Number(entity?.attributes?.stacey); + return Number.isFinite(score) ? score.toFixed(1) : 'n/a'; + ]]] + label: > + [[[ + const nights = Number(entity?.attributes?.stacey_nights ?? 0); + return `${nights} ${nights === 1 ? 'night' : 'nights'}`; + ]]] + tap_action: + action: navigate + navigation_path: /lovelace/health + hold_action: + action: navigate + navigation_path: /lovelace/health + grid_options: + columns: full + rows: 3 + +- type: custom:bubble-card + card_type: button + button_type: slider + entity: light.living_room_lights + name: Living Room Lights + icon: mdi:sofa + show_state: true + show_attribute: false + show_last_changed: true + tap_action: + action: navigate + navigation_path: '#ovw-living-room' + button_action: + tap_action: + action: navigate + navigation_path: '#ovw-living-room' + grid_options: + columns: 6 + rows: 1 + card_layout: large + +- type: custom:bubble-card + card_type: button + button_type: switch + entity: sensor.number_of_lights_on + name: Lights On + icon: mdi:lightbulb-on-outline + show_state: true + show_name: true + show_attribute: false + tap_action: + action: navigate + navigation_path: '#ovw-lights' + button_action: + tap_action: + action: navigate + navigation_path: '#ovw-lights' + grid_options: + columns: 6 + rows: 1 + card_layout: large + +- type: custom:bubble-card + card_type: button + button_type: switch + entity: group.interior_switches + name: Interior Switches + icon: mdi:lightning-bolt + show_state: true + show_attribute: false + show_last_changed: false + button_action: + tap_action: + action: more-info + grid_options: + columns: 6 + rows: 1 + tap_action: + action: toggle + card_layout: large + +- type: custom:bubble-card + card_type: button + button_type: state + entity: group.exterior_lights + name: Exterior Lights + icon: mdi:palm-tree + show_state: true + show_attribute: false + show_last_changed: true + grid_options: + columns: 6 + rows: 1 + +- !include /config/dashboards/overview/popups/living_room.yaml +- !include /config/dashboards/overview/popups/lights.yaml + +column_span: 1 diff --git a/config/dashboards/overview/sections/30_cameras.yaml b/config/dashboards/overview/sections/30_cameras.yaml new file mode 100644 index 00000000..81ec8735 --- /dev/null +++ b/config/dashboards/overview/sections/30_cameras.yaml @@ -0,0 +1,60 @@ +###################################################################### +# @CCOSTAN - Follow Me on X +# For more info visit https://www.vcloudinfo.com/click-here +# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig +# ------------------------------------------------------------------- +# Overview Section - camera and weather awareness +# Keeps security views and outdoor context together in one column. +# ------------------------------------------------------------------- +# Notes: Camera cards retain existing navigation and live behavior. +# Notes: Hourly and daily forecasts remain complementary at a glance. +###################################################################### + +cards: +- type: custom:frigate-events-card + frigate_client_id: frigate + event_count: 5 + video: true + video_on_hover: true + +- type: picture-entity + entity: camera.birdseye + show_state: true + show_name: true + camera_view: live + tap_action: + action: navigate + navigation_path: /lovelace/cameras + +- type: weather-forecast + show_current: true + show_forecast: true + entity: weather.pirateweather + forecast_type: hourly + secondary_info_attribute: humidity + +- type: custom:clock-weather-card + entity: weather.pirateweather + sun_entity: sun.sun + temperature_sensor: sensor.pirateweather_temperature + humidity_sensor: sensor.pirateweather_humidity + weather_icon_type: fill + animated_icon: true + forecast_rows: 5 + locale: en-GB + time_pattern: HH:mm + time_format: 12 + date_pattern: DDDD + hide_today_section: true + hide_forecast_section: false + show_humidity: true + hide_clock: false + hide_date: true + hourly_forecast: false + use_browser_time: false + time_zone: null + show_decimal: false + aqi_sensor: sensor.bear_stone_common_air_quality_index + apparent_sensor: null + +column_span: 1 diff --git a/config/dashboards/overview/views/01_home.yaml b/config/dashboards/overview/views/01_home.yaml index 2ef555c9..57cd555c 100644 --- a/config/dashboards/overview/views/01_home.yaml +++ b/config/dashboards/overview/views/01_home.yaml @@ -3,25 +3,21 @@ # For more info visit https://www.vcloudinfo.com/click-here # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- -# Overview View - home -# YAML-exported Lovelace dashboard (split into view files). +# Overview View - Home +# Three-column household status, controls, family, and awareness. # ------------------------------------------------------------------- -# Notes: Exported from config/.storage/lovelace.lovelace view index 1. +# Notes: Promoted from the approved Overview pilot; edits now apply live. ###################################################################### path: home +title: Home +icon: mdi:home theme: Backend-selected -layout: - max_columns: 4 -badges: !include /config/dashboards/overview/partials/home_badges.yaml -sections: !include /config/dashboards/overview/partials/home_sections.yaml type: sections -max_columns: 4 -icon: mdi:home +max_columns: 3 +badges: [] +sections: !include_dir_list /config/dashboards/overview/sections cards: [] -header: - layout: center - badges_position: bottom visible: - user: be280a93c9d7416e98d25d0470f414be - user: 46a8d15eb20e4a1daf2d1d1f63180ec5 diff --git a/config/dashboards/overview/views/03_camera.yaml b/config/dashboards/overview/views/03_camera.yaml index 535a9d1f..581e2751 100644 --- a/config/dashboards/overview/views/03_camera.yaml +++ b/config/dashboards/overview/views/03_camera.yaml @@ -4,9 +4,9 @@ # Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig # ------------------------------------------------------------------- # Overview View - Camera -# YAML-exported Lovelace dashboard (split into view files). +# Standardized access controls above the live camera grid. # ------------------------------------------------------------------- -# Notes: Exported from config/.storage/lovelace.lovelace view index 3. +# Notes: Uses the shared Overview ribbon template for entry controls. ###################################################################### title: Camera @@ -15,4 +15,4 @@ icon: mdi:cctv type: sections max_columns: 4 sections: !include /config/dashboards/overview/partials/camera_sections.yaml -badges: !include /config/dashboards/overview/partials/camera_badges.yaml +badges: [] diff --git a/config/dashboards/overview/views/06_health.yaml b/config/dashboards/overview/views/06_health.yaml index a765cd63..920834b2 100644 --- a/config/dashboards/overview/views/06_health.yaml +++ b/config/dashboards/overview/views/06_health.yaml @@ -7,15 +7,16 @@ # SleepIQ health metrics view for Carlo and Stacey. # ------------------------------------------------------------------- # Related Issue: 1584 -# Notes: Dedicated health view keeps Overview Home compact. +# Notes: Promoted from the approved Health pilot; personal health remains with Overview. ###################################################################### title: Health path: health type: sections icon: mdi:heart-pulse -theme: Backend-selected +theme: default max_columns: 4 +dense_section_placement: true badges: [] sections: !include /config/dashboards/overview/partials/health_sections.yaml cards: [] diff --git a/config/dashboards/overview/views/07_water.yaml b/config/dashboards/overview/views/07_water.yaml deleted file mode 100644 index 02eaef2f..00000000 --- a/config/dashboards/overview/views/07_water.yaml +++ /dev/null @@ -1,24 +0,0 @@ -###################################################################### -# @CCOSTAN - Follow Me on X -# For more info visit https://www.vcloudinfo.com/click-here -# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig -# ------------------------------------------------------------------- -# Overview View - Home Maintenance -# YAML-exported Lovelace dashboard (split into view files). -# ------------------------------------------------------------------- -# Notes: Exported from config/.storage/lovelace.lovelace view index 7. -# Notes: Keep path as `water` to preserve existing links and automations. -###################################################################### - -title: Home Maintenance -path: water -icon: mdi:home-lightning-bolt -type: sections -max_columns: 3 -sections: !include /config/dashboards/overview/partials/water_sections.yaml -cards: [] -visible: -- user: be280a93c9d7416e98d25d0470f414be -- user: 46a8d15eb20e4a1daf2d1d1f63180ec5 -- user: 8fc5ba22cb32430a9143beb4df70541b -- user: 19970706e7e4492c844ea2fc94a4599a diff --git a/config/packages/README.md b/config/packages/README.md index 37005497..c93291fc 100755 --- a/config/packages/README.md +++ b/config/packages/README.md @@ -63,7 +63,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this | [![YAML source: telegram_bot](https://img.shields.io/static/v1?label=YAML&message=telegram_bot&color=lightgrey&logo=github&logoColor=181717)](telegram_bot.yaml) | Legacy Telegram transport marker for BearClaw; the shared `joanna_send_telegram` helper now forwards through the codex_appliance direct Telegram API. | `rest_command.bearclaw_telegram_send`, `script.joanna_send_telegram` | | [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](phynplus.yaml) | Phyn shutoff automations with leak-test guard, Activity Feed context, Repairs tracking, and critical push recovery when the valve closes. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI) | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `script.phyn_send_actionable_leak_notification`, `repairs.create` | | [![YAML source: water_delivery](https://img.shields.io/static/v1?label=YAML&message=water_delivery&color=lightgrey&logo=github&logoColor=181717)](water_delivery.yaml) | ReadyRefresh delivery date helper with Joanna email-triage updates, night-before plus day-before garage door Alexa reminders, helper-change audit logging, and Telegram confirmations. | `input_datetime.water_delivery_date`, `script.send_to_logbook`, `script.joanna_send_telegram`, `notify.alexa_media_garage` | -| [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/10_sprinklers.yaml) | Rachio sprinkler status with active-zone summaries, trigger-derived last-run duration sensors, dashboard controls, and Activity Feed audit logging without input_* helpers. | `sensor.rachio_controller_status`, `sensor.rachio_last_run_summary`, `sensor.rachio_*_last_run`, `script.rachio_*`, `automation.rachio_activity_feed` | +| [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/views/10_sprinklers.yaml) | Rachio sprinkler status with active-zone summaries, trigger-derived last-run duration sensors, dashboard controls, and Activity Feed audit logging without input_* helpers. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html) | `sensor.rachio_controller_status`, `sensor.rachio_last_run_summary`, `sensor.rachio_*_last_run`, `script.rachio_*`, `automation.rachio_activity_feed` | | [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](vacation_mode.yaml) | Auto-enable vacation mode after 24 hours away or no bed use, track sitter analytics/secure-house checks, stale-visit timeout protection, deliver sitter-facing briefings, and send 10 AM/10 PM house digests with Powerwall/security/backup status plus Joanna review. | `input_boolean.vacation_mode`, `input_boolean.house_sitter_present`, `input_datetime.vacation_house_sitter_*`, `input_datetime.vacation_house_status_digest_last_sent`, `sensor.vacation_house_sitter_*`, `binary_sensor.powerwall_grid_status`, `sensor.powerwall_charge`, `group.garage_doors`, `lock.front_door`, `script.vacation_house_sitter_clear_presence`, `script.vacation_house_status_digest`, `script.notify_engine`, `rest_command.bearclaw_command`, `script.joanna_send_telegram` | | [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) | Webhook-based water softener salt maintenance logging with idempotent event handling, Activity Feed logging, parser-safe refill cadence history, and dashboard-ready template sensors. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html) | `automation.maintenance_log_joanna_webhook_ingest`, `sensor.water_softener_salt_average_days_between_refills`, `sensor.water_softener_salt_refill_count`, `sensor.water_softener_salt_total_added` | | [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](kiosk_tablet.yaml) | Keeps the bedroom Fully Kiosk Fire tablet pinned to the dedicated camera kiosk dashboard when the page or foreground app drifts; normal wake events only restore brightness/focus. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc) | `sensor.alarm_panel_1_current_page`, `sensor.alarm_panel_1_foreground_app`, `button.alarm_panel_1_bring_to_foreground`, `button.alarm_panel_1_load_start_url` | @@ -71,7 +71,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this | [![YAML source: tesla_model_y](https://img.shields.io/static/v1?label=YAML&message=tesla_model_y&color=lightgrey&logo=github&logoColor=181717)](tesla_model_y.yaml) | Remind the garage and parents to plug in the Model Y after the large garage door closes with a low battery, charging still off, both parents home, and a 24-hour mobile snooze available from the push reminder. | `sensor.spaceship_battery_level`, `switch.spaceship_charge`, `person.carlo`, `person.stacey`, `cover.large_garage_door`, `input_datetime.tesla_model_y_last_garage_close`, `input_datetime.tesla_model_y_plug_in_snooze_until`, `notify.alexa_media_garage`, `script.notify_engine_two_button` | | [![YAML source: vacuum](https://img.shields.io/static/v1?label=YAML&message=vacuum&color=lightgrey&logo=github&logoColor=181717)](vacuum.yaml) | Dreame vacuum orchestration with room tracking, push alerts, Activity feed, Repairs issues on errors, and Alexa one-off room-clean switches. | `input_select.l10s_vacuum_phase`, `sensor.l10s_vacuum_error`, `repairs.create` | | [![YAML source: hass_agent_homepc](https://img.shields.io/static/v1?label=YAML&message=hass_agent_homepc&color=lightgrey&logo=github&logoColor=181717)](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state to the office lamp and wakes `CARLO-HOMEPC` on workday morning bed exits. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `button.carlo_home`, `switch.office_lamp_switch` | -| [![YAML source: sleepiq](https://img.shields.io/static/v1?label=YAML&message=sleepiq&color=lightgrey&logo=github&logoColor=181717)](sleepiq.yaml) | Sleep Number presence/snore automations; Overview Health consumes direct SleepIQ integration entities for scores, vitals, pressure, and bed controls. | `group.bed`, `binary_sensor.sleepnumber_carlo_carlo_is_in_bed`, `binary_sensor.sleepnumber_carlo_stacey_is_in_bed`, `sensor.sleepnumber_carlo_carlo_sleep_score`, `sensor.sleepnumber_carlo_stacey_sleep_score`, `number.sleepnumber_carlo_carlo_firmness`, `select.sleepnumber_carlo_foundation_preset_right` | +| [![YAML source: sleepiq](https://img.shields.io/static/v1?label=YAML&message=sleepiq&color=lightgrey&logo=github&logoColor=181717)](sleepiq.yaml) | Sleep Number presence/snore automations plus a zero-filtered 14-day score summary; Overview Health keeps the detailed scores, vitals, pressure, and bed controls. | `group.bed`, `binary_sensor.sleepnumber_carlo_carlo_is_in_bed`, `binary_sensor.sleepnumber_carlo_stacey_is_in_bed`, `sensor.sleepnumber_carlo_carlo_sleep_score`, `sensor.sleepnumber_carlo_stacey_sleep_score`, `sensor.sleep_score_14_day_averages`, `number.sleepnumber_carlo_carlo_firmness`, `select.sleepnumber_carlo_foundation_preset_right` | | [![YAML source: finance](https://img.shields.io/static/v1?label=YAML&message=finance&color=lightgrey&logo=github&logoColor=181717)](finance.yaml) | Yahoo Finance sensor bundle for portfolio glances and Lovelace cards. | `sensor.tsla`, `sensor.aapl`, `sensor.amzn`, `sensor.msft` | ### Garadget automations @@ -108,8 +108,8 @@ When a package has a dedicated blog post or video, I link it right inside the YA | [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](kiosk_tablet.yaml) + [dashboards/kiosk](../dashboards/kiosk) | Fire tablet camera kiosk with a purpose-built dashboard, Fully Kiosk recovery, bedtime dimming, and screensaver watchdog behavior. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2017/08/project-update-visualization-of-home.html) | | [![YAML source: tesla_model_y](https://img.shields.io/static/v1?label=YAML&message=tesla_model_y&color=lightgrey&logo=github&logoColor=181717)](tesla_model_y.yaml) | Garage-close timestamp used as a physical arrival signal for low-battery plug-in reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/wFO0H5zgnzk) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html) | | [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](llmvision.yaml) | LLM Vision package reminder flow that turns a front-door camera event into a stored package-present state and phone alert. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nAhCezFetvI) | -| [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) + [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/09_salt_trends.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | Water softener salt maintenance flow with a reusable webhook, duplicate protection, helper-backed history, template sensors, and Salt Trends dashboard views. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html) · [Issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816) | -| [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | HVAC blower-failure evidence, runtime-based AC filter reminders, reset actions, and 360-day condenser-line cleanout reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) · [Issue #273](https://github.com/CCOSTAN/Home-AssistantConfig/issues/273) | +| [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) + [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/views/09_salt_trends.yaml) + [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/partials/home_water_sections.yaml) | Water softener salt maintenance flow with a reusable webhook, duplicate protection, helper-backed history, template sensors, and Salt Trends dashboard views. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html) · [Issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816) | +| [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) + [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/partials/home_water_sections.yaml) | HVAC blower-failure evidence, runtime-based AC filter reminders, reset actions, and 360-day condenser-line cleanout reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) · [Issue #273](https://github.com/CCOSTAN/Home-AssistantConfig/issues/273) | | [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) + [![YAML source: printer](https://img.shields.io/static/v1?label=YAML&message=printer&color=lightgrey&logo=github&logoColor=181717)](printer.yaml) + [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](vacation_mode.yaml) | Snoozeable Home Assistant mobile notifications for AC filters, printer ink, and Vacation Mode missed-visit reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/y47KSflS1aw) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-notification-snooze-buttons.html) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/11/home-assistant-ios-actionable-notifications-example.html) | | [![YAML source: holiday](https://img.shields.io/static/v1?label=YAML&message=holiday&color=lightgrey&logo=github&logoColor=181717)](holiday.yaml) | How the holiday/flag sensor works and drives lighting playlists. | [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2019/02/breaking-down-the-flag-sensor-in-home-assistant.html) | | [![YAML source: lightning](https://img.shields.io/static/v1?label=YAML&message=lightning&color=lightgrey&logo=github&logoColor=181717)](lightning.yaml) | Blitzortung detector wiring, strike alerts, and snooze workflow. | [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/08/adding-a-lightning-sensor-to-home-assistant.html) | @@ -132,7 +132,7 @@ These are the devices that power the packages above, plus tracked hardware imple | Amazon Echo Show | Pops up the front doorbell camera when the August lock unlocks. | [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) | | Amazon Echo Glow | [![GitHub issue: 1827](https://img.shields.io/static/v1?label=Issue&message=%231827&color=lightgrey&logo=github&logoColor=181717)](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1827) | Visual notification light candidate for Home Assistant status cues. | [![Buy](https://img.shields.io/badge/Buy-Echo%20Glow-orange?logo=amazon)](https://amzn.to/4wsGUoU) | | Phyn Plus water shutoff | [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](phynplus.yaml) | Leak events trigger valve closes + critical push notifications. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI) and [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html). | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) | -| Rachio sprinkler controller | [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/10_sprinklers.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | Rain skips, active-zone status, trigger-derived last-run history, and dashboard controls. | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | +| Rachio sprinkler controller | [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/views/10_sprinklers.yaml) + [![YAML source: home_water_sections](https://img.shields.io/static/v1?label=YAML&message=home_water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/infrastructure/partials/home_water_sections.yaml) | Rain skips, active-zone status, trigger-derived last-run history, and dashboard controls. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/a--1iTDWhSo) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-sprinkler-automation-rachio.html) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) | | Tesla Powerwall 2 | [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](powerwall.yaml) | Grid outages kick off status pings, load-shed scripts, and low-charge charging watchdog alerts. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) | | Google Nest thermostat | [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) | Presence/weather/grid-aware cooling targets, humidity pulses, runtime filter reminders, and condenser-line cleanout tracking. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) | | Dreame/Neato vacuum | [![YAML source: vacuum](https://img.shields.io/static/v1?label=YAML&message=vacuum&color=lightgrey&logo=github&logoColor=181717)](vacuum.yaml) | Away-only room queues, sweep/mop phases, Alexa room cleans, rescue notifications, and voice callouts. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/KKOWSKuF5jA) and [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-vacuum-automations-dreame-2026.html). | [![Buy](https://img.shields.io/badge/Buy-Vacuum-orange?logo=amazon)](https://amzn.to/4f7NpFP) | diff --git a/config/www/custom-sidebar-config.yaml b/config/www/custom-sidebar-config.yaml index bae7f9f2..7f4796c6 100644 --- a/config/www/custom-sidebar-config.yaml +++ b/config/www/custom-sidebar-config.yaml @@ -5,12 +5,28 @@ # ------------------------------------------------------------------- # Custom Sidebar - Sidebar shortcut configuration # Related Issue: 1572 -# Adds a bottom-fixed Developer Tools link through elchininet/custom-sidebar. +# Pins core views, hides low-use panels, and fixes Developer Tools at the bottom. # ------------------------------------------------------------------- # Served as /local/custom-sidebar-config.yaml; plugin loads via HACS. ###################################################################### order: + - item: Overview + exact: true + icon: mdi:view-dashboard + + - item: Systems + exact: true + icon: mdi:server-network + + - item: Calendar + exact: true + hide: true + + - item: Media + exact: true + hide: true + - new_item: true item: developer_tools name: Developer Tools diff --git a/tools/ha_ui_smoke.ps1 b/tools/ha_ui_smoke.ps1 index 45e623d0..0f664299 100644 --- a/tools/ha_ui_smoke.ps1 +++ b/tools/ha_ui_smoke.ps1 @@ -36,10 +36,16 @@ function Get-EffectiveUrlAndStatus { $targets = @( '/', '/lovelace', + '/lovelace/home', + '/lovelace/health', '/lovelace/cameras', '/profile', '/dashboard-infrastructure', '/dashboard-infrastructure/home', + '/dashboard-infrastructure/home-water', + '/dashboard-infrastructure/vacuum', + '/dashboard-infrastructure/network', + '/dashboard-infrastructure/wan', '/dashboard-infrastructure/joanna', '/dashboard-infrastructure/docker', '/dashboard-kiosk'