Refactor Home Assistant dashboard layouts and references

master
Carlo Costanzo 5 days ago
parent 6aa91cabd6
commit fc7ce35e04

@ -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) |

@ -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) |

@ -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

@ -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>/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`.

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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'; ]]]

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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: []

@ -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

@ -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

@ -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: []

@ -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:

@ -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:

@ -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

@ -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

@ -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: ''

@ -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

@ -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

@ -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?

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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: []

@ -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: []

@ -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

@ -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) |

@ -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

@ -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'

Loading…
Cancel
Save

Powered by TurnKey Linux.