From bbe1dbe218832171c879a0bb7f4f5f78537543b0 Mon Sep 17 00:00:00 2001
From: Carlo Costanzo
Date: Sat, 7 Feb 2026 17:20:22 -0500
Subject: [PATCH 1/4] Add YAML dashboards and enable Lovelace YAML mode
---
config/README.md | 3 +-
config/configuration.yaml | 30 ++
config/dashboards/README.md | 50 ++
config/dashboards/SCRATCHPAD.md | 9 +
.../infrastructure/card_mod/.gitkeep | 0
.../infrastructure/card_mod/infra_card.yaml | 17 +
.../infrastructure/card_mod/infra_panel.yaml | 18 +
.../dashboards/infrastructure/cards/.gitkeep | 0
.../dashboards/infrastructure/dashboard.yaml | 13 +
.../infrastructure/partials/.gitkeep | 0
.../docker_container_restart_include.yaml | 451 ++++++++++++++++++
.../docker_container_rows_include.yaml | 407 ++++++++++++++++
.../partials/docker_containers_sections.yaml | 82 ++++
.../partials/home_sections.yaml | 339 +++++++++++++
.../partials/mariadb_sections.yaml | 146 ++++++
.../partials/pi_hole_cards.yaml | 15 +
.../partials/proxmox_badges.yaml | 37 ++
.../partials/proxmox_sections.yaml | 187 ++++++++
.../partials/vacuum_badges.yaml | 16 +
.../partials/vacuum_sections.yaml | 344 +++++++++++++
.../infrastructure/partials/view_cards.yaml | 15 +
.../dashboards/infrastructure/popups/.gitkeep | 0
.../templates/button_card_templates.yaml | 304 ++++++++++++
.../infrastructure/views/01_home.yaml | 19 +
.../infrastructure/views/02_proxmox.yaml | 19 +
.../infrastructure/views/03_pi_hole.yaml | 18 +
.../infrastructure/views/04_vacuum.yaml | 23 +
.../views/05_activity_feed.yaml | 16 +
.../infrastructure/views/06_mariadb.yaml | 18 +
.../views/07_docker_containers.yaml | 18 +
config/dashboards/kiosk/card_mod/.gitkeep | 0
config/dashboards/kiosk/cards/.gitkeep | 0
config/dashboards/kiosk/dashboard.yaml | 12 +
config/dashboards/kiosk/partials/.gitkeep | 0
.../kiosk/partials/kiosk_oveview_badges.yaml | 20 +
.../partials/kiosk_oveview_sections.yaml | 73 +++
.../kiosk/partials/locator_sections.yaml | 134 ++++++
config/dashboards/kiosk/popups/.gitkeep | 0
.../kiosk/views/01_kiosk_oveview.yaml | 33 ++
config/dashboards/kiosk/views/02_locator.yaml | 29 ++
config/dashboards/overview/card_mod/.gitkeep | 0
config/dashboards/overview/cards/.gitkeep | 0
config/dashboards/overview/dashboard.yaml | 13 +
config/dashboards/overview/partials/.gitkeep | 0
.../overview/partials/admin_sections.yaml | 61 +++
.../overview/partials/camera_badges.yaml | 29 ++
.../overview/partials/camera_sections.yaml | 54 +++
.../overview/partials/cameras_cards.yaml | 51 ++
.../partials/family_locator_cards.yaml | 36 ++
.../overview/partials/home_badges.yaml | 21 +
.../overview/partials/home_sections.yaml | 412 ++++++++++++++++
.../overview/partials/vacuum_badges.yaml | 16 +
.../overview/partials/vacuum_sections.yaml | 352 ++++++++++++++
.../overview/partials/water_sections.yaml | 117 +++++
config/dashboards/overview/popups/.gitkeep | 0
config/dashboards/overview/views/01_home.yaml | 29 ++
.../overview/views/02_family_locator.yaml | 17 +
.../dashboards/overview/views/03_camera.yaml | 18 +
.../dashboards/overview/views/04_cameras.yaml | 17 +
.../dashboards/overview/views/05_vacuum.yaml | 23 +
.../dashboards/overview/views/06_water.yaml | 23 +
.../dashboards/overview/views/07_admin.yaml | 18 +
config/dashboards/resources.yaml | 49 ++
config/dashboards/shared/card_mod/.gitkeep | 0
config/dashboards/shared/partials/.gitkeep | 0
config/dashboards/shared/popups/.gitkeep | 0
config/dashboards/shared/views/.gitkeep | 0
config/packages/vacuum.yaml | 27 +-
68 files changed, 4287 insertions(+), 11 deletions(-)
create mode 100644 config/dashboards/README.md
create mode 100644 config/dashboards/SCRATCHPAD.md
create mode 100644 config/dashboards/infrastructure/card_mod/.gitkeep
create mode 100644 config/dashboards/infrastructure/card_mod/infra_card.yaml
create mode 100644 config/dashboards/infrastructure/card_mod/infra_panel.yaml
create mode 100644 config/dashboards/infrastructure/cards/.gitkeep
create mode 100644 config/dashboards/infrastructure/dashboard.yaml
create mode 100644 config/dashboards/infrastructure/partials/.gitkeep
create mode 100644 config/dashboards/infrastructure/partials/docker_container_restart_include.yaml
create mode 100644 config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
create mode 100644 config/dashboards/infrastructure/partials/docker_containers_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/home_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/mariadb_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/pi_hole_cards.yaml
create mode 100644 config/dashboards/infrastructure/partials/proxmox_badges.yaml
create mode 100644 config/dashboards/infrastructure/partials/proxmox_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/vacuum_badges.yaml
create mode 100644 config/dashboards/infrastructure/partials/vacuum_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/view_cards.yaml
create mode 100644 config/dashboards/infrastructure/popups/.gitkeep
create mode 100644 config/dashboards/infrastructure/templates/button_card_templates.yaml
create mode 100644 config/dashboards/infrastructure/views/01_home.yaml
create mode 100644 config/dashboards/infrastructure/views/02_proxmox.yaml
create mode 100644 config/dashboards/infrastructure/views/03_pi_hole.yaml
create mode 100644 config/dashboards/infrastructure/views/04_vacuum.yaml
create mode 100644 config/dashboards/infrastructure/views/05_activity_feed.yaml
create mode 100644 config/dashboards/infrastructure/views/06_mariadb.yaml
create mode 100644 config/dashboards/infrastructure/views/07_docker_containers.yaml
create mode 100644 config/dashboards/kiosk/card_mod/.gitkeep
create mode 100644 config/dashboards/kiosk/cards/.gitkeep
create mode 100644 config/dashboards/kiosk/dashboard.yaml
create mode 100644 config/dashboards/kiosk/partials/.gitkeep
create mode 100644 config/dashboards/kiosk/partials/kiosk_oveview_badges.yaml
create mode 100644 config/dashboards/kiosk/partials/kiosk_oveview_sections.yaml
create mode 100644 config/dashboards/kiosk/partials/locator_sections.yaml
create mode 100644 config/dashboards/kiosk/popups/.gitkeep
create mode 100644 config/dashboards/kiosk/views/01_kiosk_oveview.yaml
create mode 100644 config/dashboards/kiosk/views/02_locator.yaml
create mode 100644 config/dashboards/overview/card_mod/.gitkeep
create mode 100644 config/dashboards/overview/cards/.gitkeep
create mode 100644 config/dashboards/overview/dashboard.yaml
create mode 100644 config/dashboards/overview/partials/.gitkeep
create mode 100644 config/dashboards/overview/partials/admin_sections.yaml
create mode 100644 config/dashboards/overview/partials/camera_badges.yaml
create mode 100644 config/dashboards/overview/partials/camera_sections.yaml
create mode 100644 config/dashboards/overview/partials/cameras_cards.yaml
create mode 100644 config/dashboards/overview/partials/family_locator_cards.yaml
create mode 100644 config/dashboards/overview/partials/home_badges.yaml
create mode 100644 config/dashboards/overview/partials/home_sections.yaml
create mode 100644 config/dashboards/overview/partials/vacuum_badges.yaml
create mode 100644 config/dashboards/overview/partials/vacuum_sections.yaml
create mode 100644 config/dashboards/overview/partials/water_sections.yaml
create mode 100644 config/dashboards/overview/popups/.gitkeep
create mode 100644 config/dashboards/overview/views/01_home.yaml
create mode 100644 config/dashboards/overview/views/02_family_locator.yaml
create mode 100644 config/dashboards/overview/views/03_camera.yaml
create mode 100644 config/dashboards/overview/views/04_cameras.yaml
create mode 100644 config/dashboards/overview/views/05_vacuum.yaml
create mode 100644 config/dashboards/overview/views/06_water.yaml
create mode 100644 config/dashboards/overview/views/07_admin.yaml
create mode 100644 config/dashboards/resources.yaml
create mode 100644 config/dashboards/shared/card_mod/.gitkeep
create mode 100644 config/dashboards/shared/partials/.gitkeep
create mode 100644 config/dashboards/shared/popups/.gitkeep
create mode 100644 config/dashboards/shared/views/.gitkeep
diff --git a/config/README.md b/config/README.md
index ec5a1656..f303f98a 100755
--- a/config/README.md
+++ b/config/README.md
@@ -21,7 +21,7 @@ Live view of the `config/` directory my production Home Assistant instance loads
### Quick navigation
- You are here: `config/` (configuration root)
- [Repo overview](../README.md) | [Blog](https://www.vcloudinfo.com) | [Issues](https://github.com/CCOSTAN/Home-AssistantConfig/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [Diagram](config/www/custom_ui/floorplan/images/branding/Bear-Stone-Docker-Diagram.jpg) | [YouTube](https://youtube.com/vCloudInfo)
-- Directory highlights: [packages](packages), [automation](automation), [script](script), [scene](scene), [templates](templates), [www](www), [custom_components](custom_components)
+- Directory highlights: [packages](packages), [automation](automation), [script](script), [scene](scene), [templates](templates), [dashboards](dashboards), [www](www), [custom_components](custom_components)

@@ -36,6 +36,7 @@ Live view of the `config/` directory my production Home Assistant instance loads
- **Automations (`automation/`)** – event-driven YAML broken out by area or device; the legacy `automations.yaml` remains for UI-created flows.
- **Scripts & scenes (`script/`, `scene/`)** – curated lighting and ambiance logic used by presence, holiday, and seasonal routines.
- **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.
### Featured automations by section
diff --git a/config/configuration.yaml b/config/configuration.yaml
index 8845aca4..23203d8c 100755
--- a/config/configuration.yaml
+++ b/config/configuration.yaml
@@ -24,6 +24,36 @@ homeassistant:
default_config:
+# -------------------------------------------------------------------
+# Lovelace (YAML dashboards/resources)
+# Dashboard YAML lives under config/dashboards. Do not edit config/.storage.
+# -------------------------------------------------------------------
+lovelace:
+ resource_mode: yaml
+ resources: !include dashboards/resources.yaml
+ dashboards:
+ lovelace:
+ mode: yaml
+ title: "Overview"
+ icon: mdi:home
+ show_in_sidebar: true
+ require_admin: false
+ filename: dashboards/overview/dashboard.yaml
+ dashboard-infrastructure:
+ mode: yaml
+ title: "Infrastructure"
+ icon: mdi:server-network
+ show_in_sidebar: true
+ require_admin: true
+ filename: dashboards/infrastructure/dashboard.yaml
+ dashboard-kiosk:
+ mode: yaml
+ title: "KIOSK"
+ icon: mdi:tablet-dashboard
+ show_in_sidebar: true
+ require_admin: false
+ filename: dashboards/kiosk/dashboard.yaml
+
config:
cloud:
diff --git a/config/dashboards/README.md b/config/dashboards/README.md
new file mode 100644
index 00000000..b67264a3
--- /dev/null
+++ b/config/dashboards/README.md
@@ -0,0 +1,50 @@
+
+ Dashboards (Lovelace YAML)
+
+
+This folder holds YAML-managed Home Assistant Lovelace dashboards and UI resources.
+
+### Why this exists
+- Home Assistant stores dashboards and resources in `config/.storage/` by default (runtime state).
+- YAML dashboards make the UI version-controllable and editable by automation tools (including Codex).
+
+### What is in here
+- `resources.yaml`
+ - Lovelace JS resources used by custom cards (HACS and local resources).
+ - This is used when `lovelace.resource_mode: yaml` is enabled.
+- `SCRATCHPAD.md`
+ - Parking lot for multi-step dashboard work and patterns.
+- `/`
+ - One folder per dashboard (example: `overview/`, `infrastructure/`, `kiosk/`).
+ - `dashboard.yaml` is the dashboard entrypoint.
+ - `views/` contains one YAML file per view.
+ - `partials/` is reusable card lists included into views.
+ - `popups/` is reusable popup stacks (typically `bubble-card`) included into views.
+ - `card_mod/` is CSS overrides (use only when card-native options are insufficient).
+- `shared/`
+ - Cross-dashboard reuse only. If something is only used by one dashboard, keep it in that dashboard folder.
+
+### How it is wired into Home Assistant
+This folder is referenced from `config/configuration.yaml` via:
+- `lovelace.resource_mode: yaml`
+- `lovelace.resources: !include dashboards/resources.yaml`
+- `lovelace.dashboards: ... filename: dashboards//dashboard.yaml`
+
+### Migration / Cutover Notes
+- During migration you may have both storage dashboards (from the UI) and YAML dashboards (from this folder) at the same time.
+- Do not try to create YAML dashboards with the same dashboard ID/key as an existing storage dashboard; remove/disable the storage version first in the UI.
+- Once you confirm the YAML dashboards render correctly:
+ - Hide or delete the old storage dashboards in **Settings -> Dashboards**.
+ - Keep strategies/dynamic dashboards in storage (Map, Areas, etc.) unless you intentionally export them.
+
+### Conventions
+- 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.).
+- 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`.
+
+### Notes
+- Do not edit `config/.storage` by hand. Export once, then maintain the YAML files here.
+- It is safe to restart Home Assistant after dashboard changes as long as a configuration check passes first.
diff --git a/config/dashboards/SCRATCHPAD.md b/config/dashboards/SCRATCHPAD.md
new file mode 100644
index 00000000..d4696573
--- /dev/null
+++ b/config/dashboards/SCRATCHPAD.md
@@ -0,0 +1,9 @@
+# Dashboards Scratchpad
+
+## Current Working Items
+
+- (empty)
+
+## Patterns / Notes
+
+- (empty)
diff --git a/config/dashboards/infrastructure/card_mod/.gitkeep b/config/dashboards/infrastructure/card_mod/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/infrastructure/card_mod/infra_card.yaml b/config/dashboards/infrastructure/card_mod/infra_card.yaml
new file mode 100644
index 00000000..66beb975
--- /dev/null
+++ b/config/dashboards/infrastructure/card_mod/infra_card.yaml
@@ -0,0 +1,17 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure card_mod - Base card polish
+# Shared card_mod style block used across Infrastructure views.
+# -------------------------------------------------------------------
+# Notes: card_mod style is YAML scalar (multi-line string) so it can be `!include`d.
+######################################################################
+
+|
+ ha-card {
+ border-radius: 18px;
+ border: 1px solid rgba(0,0,0,0.06);
+ box-shadow: none;
+ }
diff --git a/config/dashboards/infrastructure/card_mod/infra_panel.yaml b/config/dashboards/infrastructure/card_mod/infra_panel.yaml
new file mode 100644
index 00000000..f779b063
--- /dev/null
+++ b/config/dashboards/infrastructure/card_mod/infra_panel.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure card_mod - Panel container
+# Wrapper style for multi-row panels (Stitch-inspired).
+# -------------------------------------------------------------------
+# Notes: card_mod style is YAML scalar (multi-line string) so it can be `!include`d.
+######################################################################
+
+|
+ ha-card {
+ border-radius: 18px;
+ border: 1px solid rgba(0,0,0,0.06);
+ box-shadow: none;
+ padding: 12px;
+ }
diff --git a/config/dashboards/infrastructure/cards/.gitkeep b/config/dashboards/infrastructure/cards/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/infrastructure/dashboard.yaml b/config/dashboards/infrastructure/dashboard.yaml
new file mode 100644
index 00000000..159b6606
--- /dev/null
+++ b/config/dashboards/infrastructure/dashboard.yaml
@@ -0,0 +1,13 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# 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).
+# -------------------------------------------------------------------
+# Notes: Entry point for dashboard key `dashboard-infrastructure`. Views are loaded from /config/dashboards/infrastructure/views.
+######################################################################
+
+button_card_templates: !include /config/dashboards/infrastructure/templates/button_card_templates.yaml
+views: !include_dir_list /config/dashboards/infrastructure/views
diff --git a/config/dashboards/infrastructure/partials/.gitkeep b/config/dashboards/infrastructure/partials/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/infrastructure/partials/docker_container_restart_include.yaml b/config/dashboards/infrastructure/partials/docker_container_restart_include.yaml
new file mode 100644
index 00000000..38a38afe
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/docker_container_restart_include.yaml
@@ -0,0 +1,451 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure Include - Docker container restart buttons
+# Auto-entities include list for Portainer container restart buttons (button.*_restart_container).
+# -------------------------------------------------------------------
+# Notes: Generated from core.entity_registry (platform: portainer).
+######################################################################
+
+- entity_id: button.91aca40203c0_portainer_agent_restart_container
+ options:
+ type: tile
+ name: 91aca40203c0_portainer_agent
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.91aca40203c0_portainer_agent_restart_container
+- entity_id: button.cloudflared_kch_restart_container
+ options:
+ type: tile
+ name: cloudflared_kch
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.cloudflared_kch_restart_container
+- entity_id: button.cloudflared_wp_restart_container
+ options:
+ type: tile
+ name: cloudflared_wp
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.cloudflared_wp_restart_container
+- entity_id: button.codex_appliance_restart_container
+ options:
+ type: tile
+ name: codex_appliance
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.codex_appliance_restart_container
+- entity_id: button.college_budget_app_restart_container
+ options:
+ type: tile
+ name: college_budget_app
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.college_budget_app_restart_container
+- entity_id: button.cruise_tracker_restart_container
+ options:
+ type: tile
+ name: cruise_tracker
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.cruise_tracker_restart_container
+- entity_id: button.dashy_restart_container
+ options:
+ type: tile
+ name: dashy
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.dashy_restart_container
+- entity_id: button.dozzle_agent_10_restart_container
+ options:
+ type: tile
+ name: dozzle_agent_10
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.dozzle_agent_10_restart_container
+- entity_id: button.dozzle_agent_14_restart_container
+ options:
+ type: tile
+ name: dozzle_agent_14
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.dozzle_agent_14_restart_container
+- entity_id: button.dozzle_restart_container
+ options:
+ type: tile
+ name: dozzle
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.dozzle_restart_container
+- entity_id: button.duplicati_restart_container
+ options:
+ type: tile
+ name: duplicati
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.duplicati_restart_container
+- entity_id: button.esphome_restart_container
+ options:
+ type: tile
+ name: esphome
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.esphome_restart_container
+- entity_id: button.foodie_tracker_restart_container
+ options:
+ type: tile
+ name: foodie_tracker
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.foodie_tracker_restart_container
+- entity_id: button.frigate_restart_container
+ options:
+ type: tile
+ name: frigate
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.frigate_restart_container
+- entity_id: button.games_hub_restart_container
+ options:
+ type: tile
+ name: games_hub
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.games_hub_restart_container
+- entity_id: button.home_assistant_restart_container
+ options:
+ type: tile
+ name: home-assistant
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.home_assistant_restart_container
+- entity_id: button.imposter_restart_container
+ options:
+ type: tile
+ name: imposter
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.imposter_restart_container
+- entity_id: button.infra_info_restart_container
+ options:
+ type: tile
+ name: infra_info
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.infra_info_restart_container
+- entity_id: button.kingcrafthomes_restart_container
+ options:
+ type: tile
+ name: kingcrafthomes
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.kingcrafthomes_restart_container
+- entity_id: button.mariadb_backup_restart_container
+ options:
+ type: tile
+ name: mariadb-backup
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.mariadb_backup_restart_container
+- entity_id: button.mariadb_restart_container
+ options:
+ type: tile
+ name: mariadb
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.mariadb_restart_container
+- entity_id: button.matter_server_restart_container
+ options:
+ type: tile
+ name: matter-server
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.matter_server_restart_container
+- entity_id: button.mqtt_restart_container
+ options:
+ type: tile
+ name: mqtt
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.mqtt_restart_container
+- entity_id: button.nebula_sync_restart_container
+ options:
+ type: tile
+ name: nebula_sync
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.nebula_sync_restart_container
+- entity_id: button.panel_notes_restart_container
+ options:
+ type: tile
+ name: panel_notes
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.panel_notes_restart_container
+- entity_id: button.pihole_restart_container
+ options:
+ type: tile
+ name: pihole
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.pihole_restart_container
+- entity_id: button.pihole_secondary_restart_container
+ options:
+ type: tile
+ name: pihole_secondary
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.pihole_secondary_restart_container
+- entity_id: button.poker_tracker_restart_container
+ options:
+ type: tile
+ name: poker_tracker
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.poker_tracker_restart_container
+- entity_id: button.portainer_agent_restart_container
+ options:
+ type: tile
+ name: portainer_agent
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.portainer_agent_restart_container
+- entity_id: button.portainer_restart_container
+ options:
+ type: tile
+ name: portainer
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.portainer_restart_container
+- entity_id: button.postgres_webhooks_engine_restart_container
+ options:
+ type: tile
+ name: postgres_webhooks_engine
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.postgres_webhooks_engine_restart_container
+- entity_id: button.rc_price_checker_restart_container
+ options:
+ type: tile
+ name: rc_price_checker
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.rc_price_checker_restart_container
+- entity_id: button.redis_webhooks_engine_restart_container
+ options:
+ type: tile
+ name: redis_webhooks_engine
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.redis_webhooks_engine_restart_container
+- entity_id: button.rvtools_ppt_web_restart_container
+ options:
+ type: tile
+ name: rvtools_ppt_web
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.rvtools_ppt_web_restart_container
+- entity_id: button.steelesharing_home_restart_container
+ options:
+ type: tile
+ name: steelesharing_home
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.steelesharing_home_restart_container
+- entity_id: button.tapple_restart_container
+ options:
+ type: tile
+ name: tapple
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.tapple_restart_container
+- entity_id: button.tugtainer_agent_restart_container
+ options:
+ type: tile
+ name: tugtainer-agent
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.tugtainer_agent_restart_container
+- entity_id: button.tugtainer_restart_container
+ options:
+ type: tile
+ name: tugtainer
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.tugtainer_restart_container
+- entity_id: button.tugtainer_socket_proxy_restart_container
+ options:
+ type: tile
+ name: tugtainer_socket_proxy
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.tugtainer_socket_proxy_restart_container
+- entity_id: button.unifi_restart_container
+ options:
+ type: tile
+ name: unifi
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.unifi_restart_container
+- entity_id: button.webhooks_engine_restart_container
+ options:
+ type: tile
+ name: webhooks_engine
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.webhooks_engine_restart_container
+- entity_id: button.wordpress_db_restart_container
+ options:
+ type: tile
+ name: wordpress_db
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.wordpress_db_restart_container
+- entity_id: button.wordpress_wp_restart_container
+ options:
+ type: tile
+ name: wordpress_wp
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.wordpress_wp_restart_container
+- entity_id: button.wyze_bridge_restart_container
+ options:
+ type: tile
+ name: wyze-bridge
+ hide_state: true
+ tap_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: button.wyze_bridge_restart_container
diff --git a/config/dashboards/infrastructure/partials/docker_container_rows_include.yaml b/config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
new file mode 100644
index 00000000..df118656
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
@@ -0,0 +1,407 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure Include - Docker container rows
+# Auto-entities include list mapping Portainer status -> restart button.
+# -------------------------------------------------------------------
+# Notes: Generated from core.entity_registry + button restart entities.
+######################################################################
+
+- entity_id: binary_sensor.91aca40203c0_portainer_agent_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: 91aca40203c0_portainer_agent
+ icon: mdi:docker
+ variables:
+ restart_button: button.91aca40203c0_portainer_agent_restart_container
+ name: 91aca40203c0_portainer_agent
+- entity_id: binary_sensor.cloudflared_kch_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: cloudflared_kch
+ icon: mdi:docker
+ variables:
+ restart_button: button.cloudflared_kch_restart_container
+ name: cloudflared_kch
+- entity_id: binary_sensor.cloudflared_wp_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: cloudflared_wp
+ icon: mdi:docker
+ variables:
+ restart_button: button.cloudflared_wp_restart_container
+ name: cloudflared_wp
+- entity_id: binary_sensor.codex_appliance_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: codex_appliance
+ icon: mdi:docker
+ variables:
+ restart_button: button.codex_appliance_restart_container
+ name: codex_appliance
+- entity_id: binary_sensor.college_budget_app_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: college_budget_app
+ icon: mdi:docker
+ variables:
+ restart_button: button.college_budget_app_restart_container
+ name: college_budget_app
+- entity_id: binary_sensor.cruise_tracker_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: cruise_tracker
+ icon: mdi:docker
+ variables:
+ restart_button: button.cruise_tracker_restart_container
+ name: cruise_tracker
+- entity_id: binary_sensor.dashy_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: dashy
+ icon: mdi:docker
+ variables:
+ restart_button: button.dashy_restart_container
+ name: dashy
+- entity_id: binary_sensor.dozzle_agent_10_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: dozzle_agent_10
+ icon: mdi:docker
+ variables:
+ restart_button: button.dozzle_agent_10_restart_container
+ name: dozzle_agent_10
+- entity_id: binary_sensor.dozzle_agent_14_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: dozzle_agent_14
+ icon: mdi:docker
+ variables:
+ restart_button: button.dozzle_agent_14_restart_container
+ name: dozzle_agent_14
+- entity_id: binary_sensor.dozzle_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: dozzle
+ icon: mdi:docker
+ variables:
+ restart_button: button.dozzle_restart_container
+ name: dozzle
+- entity_id: binary_sensor.duplicati_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: duplicati
+ icon: mdi:docker
+ variables:
+ restart_button: button.duplicati_restart_container
+ name: duplicati
+- entity_id: binary_sensor.esphome_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: esphome
+ icon: mdi:docker
+ variables:
+ restart_button: button.esphome_restart_container
+ name: esphome
+- entity_id: binary_sensor.foodie_tracker_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: foodie_tracker
+ icon: mdi:docker
+ variables:
+ restart_button: button.foodie_tracker_restart_container
+ name: foodie_tracker
+- entity_id: binary_sensor.frigate_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: frigate
+ icon: mdi:docker
+ variables:
+ restart_button: button.frigate_restart_container
+ name: frigate
+- entity_id: binary_sensor.games_hub_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: games_hub
+ icon: mdi:docker
+ variables:
+ restart_button: button.games_hub_restart_container
+ name: games_hub
+- entity_id: binary_sensor.home_assistant_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: home-assistant
+ icon: mdi:docker
+ variables:
+ restart_button: button.home_assistant_restart_container
+ name: home-assistant
+- entity_id: binary_sensor.imposter_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: imposter
+ icon: mdi:docker
+ variables:
+ restart_button: button.imposter_restart_container
+ name: imposter
+- entity_id: binary_sensor.infra_info_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: infra_info
+ icon: mdi:docker
+ variables:
+ restart_button: button.infra_info_restart_container
+ name: infra_info
+- entity_id: binary_sensor.kingcrafthomes_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: kingcrafthomes
+ icon: mdi:docker
+ variables:
+ restart_button: button.kingcrafthomes_restart_container
+ name: kingcrafthomes
+- entity_id: binary_sensor.mariadb_backup_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: mariadb-backup
+ icon: mdi:docker
+ variables:
+ restart_button: button.mariadb_backup_restart_container
+ name: mariadb-backup
+- entity_id: binary_sensor.mariadb_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: mariadb
+ icon: mdi:docker
+ variables:
+ restart_button: button.mariadb_restart_container
+ name: mariadb
+- entity_id: binary_sensor.matter_server_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: matter-server
+ icon: mdi:docker
+ variables:
+ restart_button: button.matter_server_restart_container
+ name: matter-server
+- entity_id: binary_sensor.mqtt_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: mqtt
+ icon: mdi:docker
+ variables:
+ restart_button: button.mqtt_restart_container
+ name: mqtt
+- entity_id: binary_sensor.nebula_sync_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: nebula_sync
+ icon: mdi:docker
+ variables:
+ restart_button: button.nebula_sync_restart_container
+ name: nebula_sync
+- entity_id: binary_sensor.panel_notes_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: panel_notes
+ icon: mdi:docker
+ variables:
+ restart_button: button.panel_notes_restart_container
+ name: panel_notes
+- entity_id: binary_sensor.pihole_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: pihole
+ icon: mdi:docker
+ variables:
+ restart_button: button.pihole_restart_container
+ name: pihole
+- entity_id: binary_sensor.pihole_secondary_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: pihole_secondary
+ icon: mdi:docker
+ variables:
+ restart_button: button.pihole_secondary_restart_container
+ name: pihole_secondary
+- entity_id: binary_sensor.poker_tracker_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: poker_tracker
+ icon: mdi:docker
+ variables:
+ restart_button: button.poker_tracker_restart_container
+ name: poker_tracker
+- entity_id: binary_sensor.portainer_agent_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: portainer_agent
+ icon: mdi:docker
+ variables:
+ restart_button: button.portainer_agent_restart_container
+ name: portainer_agent
+- entity_id: binary_sensor.portainer_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: portainer
+ icon: mdi:docker
+ variables:
+ restart_button: button.portainer_restart_container
+ name: portainer
+- entity_id: binary_sensor.postgres_webhooks_engine_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: postgres_webhooks_engine
+ icon: mdi:docker
+ variables:
+ restart_button: button.postgres_webhooks_engine_restart_container
+ name: postgres_webhooks_engine
+- entity_id: binary_sensor.rc_price_checker_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: rc_price_checker
+ icon: mdi:docker
+ variables:
+ restart_button: button.rc_price_checker_restart_container
+ name: rc_price_checker
+- entity_id: binary_sensor.redis_webhooks_engine_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: redis_webhooks_engine
+ icon: mdi:docker
+ variables:
+ restart_button: button.redis_webhooks_engine_restart_container
+ name: redis_webhooks_engine
+- entity_id: binary_sensor.rvtools_ppt_web_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: rvtools_ppt_web
+ icon: mdi:docker
+ variables:
+ restart_button: button.rvtools_ppt_web_restart_container
+ name: rvtools_ppt_web
+- entity_id: binary_sensor.steelesharing_home_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: steelesharing_home
+ icon: mdi:docker
+ variables:
+ restart_button: button.steelesharing_home_restart_container
+ name: steelesharing_home
+- entity_id: binary_sensor.tapple_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: tapple
+ icon: mdi:docker
+ variables:
+ restart_button: button.tapple_restart_container
+ name: tapple
+- entity_id: binary_sensor.tugtainer_agent_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: tugtainer-agent
+ icon: mdi:docker
+ variables:
+ restart_button: button.tugtainer_agent_restart_container
+ name: tugtainer-agent
+- entity_id: binary_sensor.tugtainer_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: tugtainer
+ icon: mdi:docker
+ variables:
+ restart_button: button.tugtainer_restart_container
+ name: tugtainer
+- entity_id: binary_sensor.tugtainer_socket_proxy_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: tugtainer_socket_proxy
+ icon: mdi:docker
+ variables:
+ restart_button: button.tugtainer_socket_proxy_restart_container
+ name: tugtainer_socket_proxy
+- entity_id: binary_sensor.unifi_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: unifi
+ icon: mdi:docker
+ variables:
+ restart_button: button.unifi_restart_container
+ name: unifi
+- entity_id: binary_sensor.webhooks_engine_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: webhooks_engine
+ icon: mdi:docker
+ variables:
+ restart_button: button.webhooks_engine_restart_container
+ name: webhooks_engine
+- entity_id: binary_sensor.wordpress_db_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: wordpress_db
+ icon: mdi:docker
+ variables:
+ restart_button: button.wordpress_db_restart_container
+ name: wordpress_db
+- entity_id: binary_sensor.wordpress_wp_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: wordpress_wp
+ icon: mdi:docker
+ variables:
+ restart_button: button.wordpress_wp_restart_container
+ name: wordpress_wp
+- entity_id: binary_sensor.wyze_bridge_status
+ options:
+ type: custom:button-card
+ template: bearstone_infra_container_row
+ name: wyze-bridge
+ icon: mdi:docker
+ variables:
+ restart_button: button.wyze_bridge_restart_container
+ name: wyze-bridge
diff --git a/config/dashboards/infrastructure/partials/docker_containers_sections.yaml b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml
new file mode 100644
index 00000000..7d4b4b8c
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml
@@ -0,0 +1,82 @@
+######################################################################
+# @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 - Docker containers sections
+# Sections layout for the Docker containers view.
+# -------------------------------------------------------------------
+# Notes: Uses Portainer entities (`binary_sensor.*_status`, `button.*_restart_container`).
+######################################################################
+
+- type: grid
+ column_span: 4
+ columns: 4
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox1_updates_packages
+ name: Proxmox01
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox02_updates_packages
+ name: Proxmox02
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.garage_ups_status
+ name: Garage UPS
+ icon: mdi:transmission-tower
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.vcloudinfo_com
+ name: vCloudinfo
+ icon: mdi:microsoft-internet-explorer
+
+- type: grid
+ column_span: 4
+ columns: 1
+ square: false
+ cards:
+ - type: custom:auto-entities
+ show_empty: true
+ grid_options:
+ columns: full
+ card:
+ type: grid
+ title: Docker Containers
+ columns: 4
+ square: false
+ card_param: cards
+ filter:
+ include: !include /config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
+ exclude:
+ - state: unavailable
+ sort:
+ method: name
+
+- type: grid
+ column_span: 4
+ columns: 1
+ square: false
+ cards:
+ - type: markdown
+ grid_options:
+ columns: full
+ content: |-
+ **Tip:** Hold a container row to restart it (confirmation required).
+ card_mod:
+ style: |
+ ha-card {
+ background: transparent;
+ border: none;
+ box-shadow: none;
+ text-align: center;
+ color: var(--secondary-text-color);
+ }
diff --git a/config/dashboards/infrastructure/partials/home_sections.yaml b/config/dashboards/infrastructure/partials/home_sections.yaml
new file mode 100644
index 00000000..09b7402f
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/home_sections.yaml
@@ -0,0 +1,339 @@
+######################################################################
+# @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 - Home sections
+# Rebuilt homepage layout (Stitch-inspired).
+# -------------------------------------------------------------------
+# Notes: Standardized on `custom:button-card` + `custom:mini-graph-card` with `card_mod` polish.
+######################################################################
+
+- type: grid
+ column_span: 4
+ columns: 4
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox1_updates_packages
+ name: Proxmox01
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox02_updates_packages
+ name: Proxmox02
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.garage_ups_status
+ name: Garage UPS
+ icon: mdi:transmission-tower
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.vcloudinfo_com
+ name: vCloudinfo
+ icon: mdi:microsoft-internet-explorer
+
+- type: grid
+ column_span: 3
+ columns: 2
+ square: false
+ cards:
+ - type: vertical-stack
+ cards:
+ - type: custom:mini-graph-card
+ name: Proxmox01
+ icon: mdi:server
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: true
+ legend: true
+ icon: true
+ name: true
+ state: true
+ entities:
+ - entity: sensor.node_proxmox1_cpu_used
+ name: CPU
+ - entity: sensor.node_proxmox1_memory_used_percentage
+ name: Memory
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_docker69_169_status
+ name: Docker69
+ icon: mdi:docker
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_docker69_169_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_docker69_169_reboot
+ name: Docker69
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_carlo_hass_105_status
+ name: HASS
+ icon: mdi:home-assistant
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_carlo_hass_105_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_carlo_hass_105_reboot
+ name: HASS
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_wireguard_104_status
+ name: WireGuard
+ icon: mdi:vpn
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_wireguard_104_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_wireguard_104_reboot
+ name: WireGuard
+
+ - type: vertical-stack
+ cards:
+ - type: custom:mini-graph-card
+ name: Proxmox02
+ icon: mdi:server
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: true
+ legend: true
+ icon: true
+ name: true
+ state: true
+ entities:
+ - entity: sensor.node_proxmox02_cpu_used
+ name: CPU
+ - entity: sensor.node_proxmox02_memory_used_percentage
+ name: Memory
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_docker2_101_status
+ name: Frigate
+ icon: mdi:video
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_docker2_101_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_docker2_101_reboot
+ name: Frigate
+
+- type: grid
+ column_span: 1
+ columns: 1
+ square: false
+ cards:
+ - type: custom:mini-graph-card
+ entities:
+ - entity: sensor.proxmox_garage_average_temperature
+ name: Garage
+ - entity: sensor.pirateweather_temperature
+ name: Outside
+ name: Garage Temp
+ hours_to_show: 96
+ color_thresholds:
+ - value: 50
+ color: '#f39c12'
+ - value: 120
+ color: '#d35400'
+ - value: 145
+ color: '#c0392b'
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: custom:mini-graph-card
+ name: Garage UPS Load
+ icon: mdi:transmission-tower
+ entities:
+ - entity: sensor.garage_ups_load
+ name: Load
+ unit: '%'
+ hours_to_show: 24
+ points_per_hour: 4
+ line_width: 2
+ animate: true
+ color_thresholds:
+ - value: 20
+ color: '#43a047'
+ - value: 50
+ color: '#ffa000'
+ - value: 80
+ color: '#e53935'
+ show:
+ fill: true
+ icon: true
+ name: true
+ state: true
+ graph: line
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+
+- type: grid
+ column_span: 2
+ columns: 2
+ square: true
+ cards:
+ - type: custom:flex-horseshoe-card
+ entities:
+ - entity: sensor.carlo_nvr_volume_1_volume_used
+ name: NVR Video
+ decimals: 1
+ unit: '%'
+ - entity: sensor.carlo_nvr_volume_1_total_size
+ name: Total
+ decimals: 2
+ unit: TiB
+ show:
+ horseshoe_style: colorstopgradient
+ horseshoe_scale:
+ min: 0
+ max: 100
+ color_stops:
+ '0': '#43a047'
+ '50': '#fbc02d'
+ '80': '#e53935'
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: custom:flex-horseshoe-card
+ entities:
+ - entity: sensor.carlo_nas01_volume_1_volume_used
+ name: NAS Storage
+ decimals: 1
+ unit: '%'
+ - entity: sensor.carlo_nas01_volume_1_total_size
+ name: Total
+ decimals: 2
+ unit: TiB
+ show:
+ horseshoe_style: colorstopgradient
+ horseshoe_scale:
+ min: 0
+ max: 100
+ color_stops:
+ '0': '#43a047'
+ '50': '#fbc02d'
+ '80': '#e53935'
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+
+- type: grid
+ column_span: 2
+ columns: 1
+ square: false
+ cards:
+ - type: custom:mini-graph-card
+ name: Wi-Fi Overview
+ icon: mdi:wifi
+ hours_to_show: 24
+ line_width: 2
+ points_per_hour: 1
+ smoothing: true
+ show:
+ graph: line
+ legend: true
+ labels: false
+ name: true
+ icon: true
+ state: true
+ entities:
+ - entity: sensor.total_wifi_clients
+ name: Total
+ show_state: true
+ show_graph: false
+ show_line: false
+ show_points: false
+ show_fill: false
+ show_legend: false
+ - entity: sensor.unifi_ap_office_clients
+ name: Office AP
+ show_state: true
+ - entity: sensor.unifi_ap_study_clients
+ name: Study AP
+ show_state: true
+ - entity: sensor.unifi_ap_garage_clients
+ name: Garage AP
+ show_state: true
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+
+- type: grid
+ column_span: 4
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Garage AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_garage_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_garage_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_garage_restart
+ name: Garage AP
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Office AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_office_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_office_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_office_restart
+ name: Office AP
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Study AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_study_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_study_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_study_restart
+ name: Study AP
+
+- type: grid
+ column_span: 4
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_10
+ icon: mdi:server
+ entity: sensor.docker_10_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_10_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_10_apt_reboot_status']?.state ?? ''); ]]]
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_69
+ icon: mdi:server
+ entity: sensor.docker_69_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_69_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_69_apt_reboot_status']?.state ?? ''); ]]]
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_14
+ icon: mdi:server
+ entity: sensor.docker_14_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_14_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_14_apt_reboot_status']?.state ?? ''); ]]]
diff --git a/config/dashboards/infrastructure/partials/mariadb_sections.yaml b/config/dashboards/infrastructure/partials/mariadb_sections.yaml
new file mode 100644
index 00000000..d749f138
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/mariadb_sections.yaml
@@ -0,0 +1,146 @@
+######################################################################
+# @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 - mariadb sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Stitch-inspired MariaDB layout (3 panel columns).
+######################################################################
+
+- column_span: 1
+ 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: Database Statistics
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.database_size
+ name: Database Size
+ icon: mdi:database
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.database_tables_count
+ name: Number of Tables
+ icon: mdi:table
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.database_total_records
+ name: Total Records
+ icon: mdi:counter
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.database_records_per_day
+ name: Records per Day
+ icon: mdi:chart-line
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.database_oldest_record
+ name: Oldest Record
+ icon: mdi:clock-start
+
+- column_span: 1
+ 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: MariaDB Status
+ - type: custom:button-card
+ template: bearstone_infra_list_row_running
+ entity: sensor.mariadb_status
+ name: Server Status
+ icon: mdi:database
+ state_display: >
+ [[[
+ if (entity.state === 'unknown') return 'Unknown';
+ return String(entity.state).toUpperCase();
+ ]]]
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.mariadb_version
+ name: Version
+ icon: mdi:information-outline
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.mariadb_performance
+ name: Performance
+ icon: mdi:chart-line
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.mariadb_uptime
+ name: Uptime
+ icon: mdi:timer-outline
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.mariadb_connections
+ name: Active Connections
+ icon: mdi:lan-connect
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.mariadb_questions
+ name: Total Queries
+ icon: mdi:database-search
+
+- column_span: 1
+ 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: MariaDB Tuning
+ - type: grid
+ columns: 2
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_buffer_pool_size
+ name: InnoDB Buffer
+ icon: mdi:memory
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_max_connections
+ name: Max Conn.
+ icon: mdi:account-multiple
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_log_file_size
+ name: Log File
+ icon: mdi:file
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_tmp_table_size
+ name: Temp Size
+ icon: mdi:table
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_io_capacity
+ name: IO Capacity
+ icon: mdi:speedometer
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_io_threads
+ name: IO Threads
+ icon: mdi:developer-board
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_table_cache
+ name: Table Cache
+ icon: mdi:cached
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_buffer_sizes
+ name: Sort/Join
+ icon: mdi:code-brackets
+
+
diff --git a/config/dashboards/infrastructure/partials/pi_hole_cards.yaml b/config/dashboards/infrastructure/partials/pi_hole_cards.yaml
new file mode 100644
index 00000000..b74a17eb
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/pi_hole_cards.yaml
@@ -0,0 +1,15 @@
+######################################################################
+# @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 - pi_hole cards
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/infrastructure/views/02_pi_hole.yaml key `cards`.
+######################################################################
+
+- type: custom:pi-hole
+ device_id: d69637da16f7d7f3626070582be59808
+ grid_options:
+ columns: full
diff --git a/config/dashboards/infrastructure/partials/proxmox_badges.yaml b/config/dashboards/infrastructure/partials/proxmox_badges.yaml
new file mode 100644
index 00000000..d34fdbec
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/proxmox_badges.yaml
@@ -0,0 +1,37 @@
+######################################################################
+# @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 - proxmox badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/infrastructure/views/01_proxmox.yaml key `badges`.
+######################################################################
+
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: binary_sensor.node_proxmox1_updates_packages
+ name: ProxMox1
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: binary_sensor.node_proxmox02_updates_packages
+ name: Proxmox02
+- type: entity
+ icon: mdi:transmission-tower
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: sensor.garage_ups_status
+ name: Garage UPS
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ icon: mdi:microsoft-internet-explorer
+ entity: sensor.vcloudinfo_com
+ name: vCloudinfo
diff --git a/config/dashboards/infrastructure/partials/proxmox_sections.yaml b/config/dashboards/infrastructure/partials/proxmox_sections.yaml
new file mode 100644
index 00000000..ae4a2fc5
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/proxmox_sections.yaml
@@ -0,0 +1,187 @@
+######################################################################
+# @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 - proxmox sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Standardized on `custom:button-card` + `custom:mini-graph-card` with `card_mod` polish.
+######################################################################
+
+- type: grid
+ column_span: 4
+ columns: 4
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox1_updates_packages
+ name: Proxmox01
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox02_updates_packages
+ name: Proxmox02
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.garage_ups_status
+ name: Garage UPS
+ icon: mdi:transmission-tower
+ - type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.vcloudinfo_com
+ name: vCloudinfo
+ icon: mdi:microsoft-internet-explorer
+
+- type: grid
+ column_span: 4
+ columns: 2
+ square: false
+ cards:
+ - type: vertical-stack
+ cards:
+ - type: custom:mini-graph-card
+ name: Proxmox01
+ icon: mdi:server
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: true
+ legend: true
+ icon: true
+ name: true
+ state: true
+ entities:
+ - entity: sensor.node_proxmox1_cpu_used
+ name: CPU
+ - entity: sensor.node_proxmox1_memory_used_percentage
+ name: Memory
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: custom:mini-graph-card
+ name: Proxmox01 VMs (CPU / MEM)
+ icon: mdi:chart-line
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: false
+ legend: true
+ icon: true
+ name: true
+ state: false
+ entities:
+ - entity: sensor.qemu_docker69_169_cpu_used
+ name: Docker69 CPU
+ - entity: sensor.qemu_docker69_169_memory_used_percentage
+ name: Docker69 MEM
+ - entity: sensor.qemu_carlo_hass_105_cpu_used
+ name: HASS CPU
+ - entity: sensor.qemu_carlo_hass_105_memory_used_percentage
+ name: HASS MEM
+ - entity: sensor.qemu_wireguard_104_cpu_used
+ name: WireGuard CPU
+ - entity: sensor.qemu_wireguard_104_memory_used_percentage
+ name: WireGuard MEM
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_docker69_169_status
+ name: Docker69
+ icon: mdi:docker
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_docker69_169_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_docker69_169_reboot
+ name: Docker69
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_carlo_hass_105_status
+ name: HASS
+ icon: mdi:home-assistant
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_carlo_hass_105_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_carlo_hass_105_reboot
+ name: HASS
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_wireguard_104_status
+ name: WireGuard
+ icon: mdi:vpn
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_wireguard_104_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_wireguard_104_reboot
+ name: WireGuard
+
+ - type: vertical-stack
+ cards:
+ - type: custom:mini-graph-card
+ name: Proxmox02
+ icon: mdi:server
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: true
+ legend: true
+ icon: true
+ name: true
+ state: true
+ entities:
+ - entity: sensor.node_proxmox02_cpu_used
+ name: CPU
+ - 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: Frigate VM (CPU / MEM)
+ icon: mdi:video
+ hours_to_show: 24
+ points_per_hour: 2
+ line_width: 2
+ animate: true
+ show:
+ fill: false
+ legend: true
+ icon: true
+ name: true
+ state: false
+ entities:
+ - entity: sensor.qemu_docker2_101_cpu_used
+ name: CPU
+ - entity: sensor.qemu_docker2_101_memory_used_percentage
+ name: MEM
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ entity: sensor.qemu_docker2_101_status
+ name: Frigate
+ icon: mdi:video
+ label: >
+ [[[ return "Last boot: " + (states['sensor.qemu_docker2_101_last_boot']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.qemu_docker2_101_reboot
+ name: Frigate
diff --git a/config/dashboards/infrastructure/partials/vacuum_badges.yaml b/config/dashboards/infrastructure/partials/vacuum_badges.yaml
new file mode 100644
index 00000000..755ff304
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/vacuum_badges.yaml
@@ -0,0 +1,16 @@
+######################################################################
+# @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 - vacuum badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/infrastructure/views/03_vacuum.yaml key `badges`.
+######################################################################
+
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: input_boolean.l10s_vacuum_on_demand
diff --git a/config/dashboards/infrastructure/partials/vacuum_sections.yaml b/config/dashboards/infrastructure/partials/vacuum_sections.yaml
new file mode 100644
index 00000000..eda04a2d
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/vacuum_sections.yaml
@@ -0,0 +1,344 @@
+######################################################################
+# @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 - vacuum sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/infrastructure/views/03_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: grid
+ cards:
+ - type: custom:xiaomi-vacuum-map-card
+ map_source:
+ camera: camera.l10s_vacuum_map
+ calibration_source:
+ camera: true
+ entity: vacuum.l10s_vacuum
+ vacuum_platform: Tasshack/dreame-vacuum
+ map_modes:
+ - template: vacuum_clean_zone
+ - template: vacuum_clean_point
+ - template: vacuum_clean_segment
+ predefined_selections:
+ - id: '1'
+ icon:
+ name: mdi:home-outline
+ x: -8100
+ y: 12400
+ label:
+ text: Pool-Bath
+ x: -8100
+ y: 12400
+ offset_y: 35
+ outline:
+ - - -9950
+ - 11350
+ - - -6650
+ - 11350
+ - - -6650
+ - 12900
+ - - -9950
+ - 12900
+ - id: '2'
+ icon:
+ name: mdi:monitor-shimmer
+ x: -4650
+ y: 10900
+ label:
+ text: Office
+ x: -4650
+ y: 10900
+ offset_y: 35
+ outline:
+ - - -6650
+ - 7400
+ - - -2800
+ - 7400
+ - - -2800
+ - 12850
+ - - -6650
+ - 12850
+ - id: '3'
+ icon:
+ name: mdi:home-outline
+ x: -5600
+ y: 5250
+ label:
+ text: Kids-Bathroom
+ x: -5600
+ y: 5250
+ offset_y: 35
+ outline:
+ - - -6450
+ - 4250
+ - - -4750
+ - 4250
+ - - -4750
+ - 6150
+ - - -6450
+ - 6150
+ - id: '4'
+ icon:
+ name: mdi:home-outline
+ x: 7300
+ y: 4100
+ label:
+ text: Master-Bathroom
+ x: 7300
+ y: 4100
+ offset_y: 35
+ outline:
+ - - 5450
+ - 250
+ - - 9400
+ - 250
+ - - 9400
+ - 7850
+ - - 5450
+ - 7850
+ - id: '6'
+ icon:
+ name: mdi:home-outline
+ x: -8450
+ y: 4200
+ label:
+ text: Paige-Bedroom
+ x: -8450
+ y: 4200
+ offset_y: 35
+ outline:
+ - - -9900
+ - 1600
+ - - -6600
+ - 1600
+ - - -6600
+ - 6100
+ - - -9900
+ - 6100
+ - id: '7'
+ icon:
+ name: mdi:home-outline
+ x: 6450
+ y: 10400
+ label:
+ text: Master-Bedroom
+ x: 6450
+ y: 10400
+ offset_y: 35
+ outline:
+ - - 3450
+ - 7850
+ - - 9550
+ - 7850
+ - - 9550
+ - 12850
+ - - 3450
+ - 12850
+ - id: '8'
+ icon:
+ name: mdi:home-outline
+ x: -8300
+ y: 9300
+ label:
+ text: Justin-Bedroom
+ x: -8300
+ y: 9300
+ offset_y: 35
+ outline:
+ - - -9950
+ - 6250
+ - - -6650
+ - 6250
+ - - -6650
+ - 11150
+ - - -9950
+ - 11150
+ - id: '9'
+ icon:
+ name: mdi:home-outline
+ x: 7250
+ y: -2200
+ label:
+ text: Stacey-Office
+ x: 7250
+ y: -2200
+ offset_y: 35
+ outline:
+ - - 5450
+ - -4700
+ - - 9450
+ - -4700
+ - - 9450
+ - 350
+ - - 5450
+ - 350
+ - id: '10'
+ icon:
+ name: mdi:sofa-outline
+ x: 2500
+ y: 4800
+ label:
+ text: Living Room
+ x: 2500
+ y: 4800
+ offset_y: 35
+ outline:
+ - - -650
+ - 750
+ - - 5300
+ - 750
+ - - 5300
+ - 8800
+ - - -650
+ - 8800
+ - id: '11'
+ icon:
+ name: mdi:home-outline
+ x: -5350
+ y: 2600
+ label:
+ text: Garage-Hallway
+ x: -5350
+ y: 2600
+ offset_y: 35
+ outline:
+ - - -6600
+ - 1100
+ - - -4050
+ - 1100
+ - - -4050
+ - 4200
+ - - -6600
+ - 4200
+ - id: '12'
+ icon:
+ name: mdi:home-outline
+ x: 700
+ y: 8900
+ label:
+ text: Dining-Room
+ x: 700
+ y: 8900
+ offset_y: 35
+ outline:
+ - - -4350
+ - 6000
+ - - 2650
+ - 6000
+ - - 2650
+ - 12650
+ - - -4350
+ - 12650
+ - id: '13'
+ icon:
+ name: mdi:home-outline
+ x: -6200
+ y: 6800
+ label:
+ text: Hallway
+ x: -6200
+ y: 6800
+ offset_y: 35
+ outline:
+ - - -7550
+ - 6100
+ - - -4350
+ - 6100
+ - - -4350
+ - 7700
+ - - -7550
+ - 7700
+ - id: '14'
+ icon:
+ name: mdi:chef-hat
+ x: -1700
+ y: 3350
+ label:
+ text: Kitchen
+ x: -1700
+ y: 3350
+ offset_y: 35
+ outline:
+ - - -4200
+ - 950
+ - - -300
+ - 950
+ - - -300
+ - 6100
+ - - -4200
+ - 6100
+ - id: '15'
+ icon:
+ name: mdi:home-outline
+ x: 4050
+ y: -1350
+ label:
+ text: Foyer
+ x: 4050
+ y: -1350
+ offset_y: 35
+ outline:
+ - - 2850
+ - -3500
+ - - 5450
+ - -3500
+ - - 5450
+ - 800
+ - - 2850
+ - 800
+ - id: '17'
+ icon:
+ name: mdi:home-outline
+ x: 750
+ y: -1250
+ label:
+ text: Formal-Dining
+ x: 750
+ y: -1250
+ offset_y: 35
+ outline:
+ - - -1500
+ - -3500
+ - - 2950
+ - -3500
+ - - 2950
+ - 950
+ - - -1500
+ - 950
+ map_locked: true
+ two_finger_pan: true
diff --git a/config/dashboards/infrastructure/partials/view_cards.yaml b/config/dashboards/infrastructure/partials/view_cards.yaml
new file mode 100644
index 00000000..8c3a4abc
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/view_cards.yaml
@@ -0,0 +1,15 @@
+######################################################################
+# @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 - view cards
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/infrastructure/views/04_view.yaml key `cards`.
+######################################################################
+
+- type: logbook
+ target:
+ entity_id:
+ - sensor.activity_feed
diff --git a/config/dashboards/infrastructure/popups/.gitkeep b/config/dashboards/infrastructure/popups/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/infrastructure/templates/button_card_templates.yaml b/config/dashboards/infrastructure/templates/button_card_templates.yaml
new file mode 100644
index 00000000..3a2dc973
--- /dev/null
+++ b/config/dashboards/infrastructure/templates/button_card_templates.yaml
@@ -0,0 +1,304 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure Templates - custom:button-card
+# Shared `button_card_templates` used across Infrastructure views.
+# -------------------------------------------------------------------
+# Notes: Keep templates generic; view-specific tuning stays in the view partials.
+######################################################################
+
+bearstone_infra_base:
+ show_icon: true
+ show_name: true
+ show_state: true
+ tap_action:
+ action: more-info
+ styles:
+ card:
+ - border-radius: 18px
+ - padding: 14px
+ - box-shadow: none
+ - background: var(--ha-card-background, var(--card-background-color))
+ - border: 1px solid rgba(0,0,0,0.06)
+ - overflow: hidden
+ grid:
+ - grid-template-areas: "\"i n\" \"i s\""
+ - grid-template-columns: 40px 1fr
+ - grid-template-rows: min-content min-content
+ icon:
+ - width: 22px
+ - color: var(--primary-text-color)
+ name:
+ - font-weight: 700
+ - font-size: 14px
+ - justify-self: start
+ - padding-bottom: 2px
+ state:
+ - font-size: 12px
+ - opacity: 0.75
+ - justify-self: start
+
+bearstone_infra_chip:
+ template: bearstone_infra_base
+ show_state: true
+ styles:
+ card:
+ - border-radius: 999px
+ - padding: 10px 12px
+ - border: 1px solid rgba(0,0,0,0.06)
+ - background: rgba(255,255,255,0.75)
+ - backdrop-filter: blur(6px)
+ - -webkit-backdrop-filter: blur(6px)
+ grid:
+ - grid-template-areas: "\"i n\" \"i s\""
+ - grid-template-columns: 28px 1fr
+ icon:
+ - width: 18px
+ name:
+ - font-weight: 700
+ - font-size: 12px
+ state:
+ - font-size: 11px
+ - opacity: 0.7
+
+bearstone_infra_chip_running:
+ template: bearstone_infra_chip
+ state:
+ - value: 'on'
+ styles:
+ card:
+ - border-color: rgba(67,160,71,0.45)
+ - background: rgba(232,245,233,0.85)
+ icon:
+ - color: rgba(46,125,50,1)
+ - value: 'off'
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+ - value: unavailable
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+
+bearstone_infra_tile:
+ template: bearstone_infra_base
+ show_label: true
+ label: '[[[ return variables.label ? variables.label : "" ]]]'
+ styles:
+ grid:
+ - grid-template-areas: "\"i n\" \"i l\""
+ - grid-template-rows: min-content min-content
+ label:
+ - font-size: 12px
+ - opacity: 0.8
+ - justify-self: start
+ state:
+ - value: unavailable
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+
+bearstone_infra_reboot:
+ template: bearstone_infra_tile
+ show_state: false
+ icon: mdi:restart
+ label: '[[[ return variables.subtitle ? variables.subtitle : "Hold to reboot" ]]]'
+ hold_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: '[[[ return variables.button_entity ]]]'
+ confirmation:
+ text: '[[[ return "Reboot " + (variables.name ? variables.name : "device") + "?" ]]]'
+ styles:
+ icon:
+ - color: var(--secondary-text-color)
+
+bearstone_infra_device_tile:
+ template: bearstone_infra_tile
+ show_state: true
+ label: '[[[ return variables.subtitle ? variables.subtitle : "" ]]]'
+ hold_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: '[[[ return variables.button_entity ]]]'
+ confirmation:
+ text: '[[[ return "Restart " + (variables.name ? variables.name : "device") + "?" ]]]'
+ styles:
+ state:
+ - font-weight: 700
+
+bearstone_infra_container_row:
+ template: bearstone_infra_list_row_running
+ show_label: false
+ tap_action:
+ action: none
+ hold_action:
+ action: call-service
+ service: button.press
+ service_data:
+ entity_id: '[[[ return variables.restart_button ]]]'
+ confirmation:
+ text: '[[[ return "Restart container " + entity.attributes.friendly_name + "?" ]]]'
+ icon: mdi:docker
+
+bearstone_infra_panel_header:
+ show_icon: false
+ show_state: false
+ show_label: false
+ tap_action:
+ action: none
+ styles:
+ card:
+ - background: transparent
+ - border: none
+ - box-shadow: none
+ - padding: 6px 2px 10px 2px
+ name:
+ - font-size: 18px
+ - font-weight: 800
+ - justify-self: start
+
+bearstone_infra_list_row:
+ show_icon: true
+ show_name: true
+ show_state: true
+ show_label: false
+ tap_action:
+ action: more-info
+ styles:
+ card:
+ - border-radius: 14px
+ - padding: 12px 12px
+ - box-shadow: none
+ - border: 1px solid rgba(0,0,0,0.03)
+ - background: rgba(0,0,0,0.02)
+ - width: 100%
+ - box-sizing: border-box
+ grid:
+ - grid-template-areas: "\"i n s\""
+ - grid-template-columns: 24px 1fr auto
+ - align-items: center
+ - column-gap: 10px
+ icon:
+ - width: 18px
+ - color: var(--primary-color)
+ name:
+ - font-weight: 700
+ - font-size: 14px
+ - justify-self: start
+ - opacity: 0.95
+ - min-width: 0
+ - overflow: hidden
+ - text-overflow: ellipsis
+ - white-space: nowrap
+ state:
+ - justify-self: end
+ - font-weight: 700
+ - font-size: 13px
+ - opacity: 0.8
+ - padding-left: 8px
+ - white-space: nowrap
+
+bearstone_infra_list_row_running:
+ template: bearstone_infra_list_row
+ state:
+ - value: 'on'
+ styles:
+ card:
+ - border-color: rgba(67,160,71,0.45)
+ - background: rgba(232,245,233,0.85)
+ icon:
+ - color: rgba(46,125,50,1)
+ state:
+ - color: rgba(46,125,50,1)
+ - opacity: 1
+ - value: 'off'
+ 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
+ - value: Running
+ styles:
+ icon:
+ - color: rgba(46,125,50,1)
+ state:
+ - color: rgba(46,125,50,1)
+ - opacity: 1
+ - value: running
+ styles:
+ icon:
+ - color: rgba(46,125,50,1)
+ state:
+ - color: rgba(46,125,50,1)
+ - opacity: 1
+ - value: Stopped
+ styles:
+ icon:
+ - color: rgba(198,40,40,1)
+ state:
+ - color: rgba(198,40,40,1)
+ - opacity: 1
+ - value: stopped
+ styles:
+ icon:
+ - color: rgba(198,40,40,1)
+ state:
+ - color: rgba(198,40,40,1)
+ - opacity: 1
+ - value: unavailable
+ styles:
+ icon:
+ - color: rgba(198,40,40,1)
+ state:
+ - color: rgba(198,40,40,1)
+ - opacity: 1
+
+bearstone_infra_kpi:
+ show_icon: true
+ show_name: true
+ show_state: true
+ show_label: false
+ tap_action:
+ action: more-info
+ styles:
+ card:
+ - border-radius: 14px
+ - padding: 12px
+ - box-shadow: none
+ - border: 1px solid rgba(0,0,0,0.03)
+ - background: rgba(0,0,0,0.02)
+ grid:
+ - grid-template-areas: "\"i\" \"n\" \"s\""
+ - grid-template-rows: 22px min-content min-content
+ - row-gap: 6px
+ - justify-items: center
+ icon:
+ - width: 18px
+ - color: var(--primary-color)
+ name:
+ - font-size: 11px
+ - font-weight: 800
+ - opacity: 0.65
+ - text-transform: uppercase
+ - text-align: center
+ - letter-spacing: 0.6px
+ state:
+ - font-size: 16px
+ - font-weight: 800
+ - opacity: 0.9
diff --git a/config/dashboards/infrastructure/views/01_home.yaml b/config/dashboards/infrastructure/views/01_home.yaml
new file mode 100644
index 00000000..d5ea1d7d
--- /dev/null
+++ b/config/dashboards/infrastructure/views/01_home.yaml
@@ -0,0 +1,19 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - Home
+# Clean layout inspired by Stitch wireframe (hosts, right-rail trends, storage, wifi, apt).
+# -------------------------------------------------------------------
+# Notes: Uses existing Infrastructure entities from Proxmox/UniFi/UPS/Docker hosts.
+######################################################################
+
+title: Infrastructure
+path: home
+type: sections
+icon: mdi:view-dashboard-variant
+max_columns: 4
+badges: []
+sections: !include /config/dashboards/infrastructure/partials/home_sections.yaml
+cards: []
diff --git a/config/dashboards/infrastructure/views/02_proxmox.yaml b/config/dashboards/infrastructure/views/02_proxmox.yaml
new file mode 100644
index 00000000..90ff8120
--- /dev/null
+++ b/config/dashboards/infrastructure/views/02_proxmox.yaml
@@ -0,0 +1,19 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - ProxMox
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 1.
+######################################################################
+
+title: ProxMox
+path: proxmox
+cards: []
+type: sections
+icon: mdi:server
+badges: []
+sections: !include /config/dashboards/infrastructure/partials/proxmox_sections.yaml
+max_columns: 4
diff --git a/config/dashboards/infrastructure/views/03_pi_hole.yaml b/config/dashboards/infrastructure/views/03_pi_hole.yaml
new file mode 100644
index 00000000..14cf420c
--- /dev/null
+++ b/config/dashboards/infrastructure/views/03_pi_hole.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - Pi-Hole
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 2.
+######################################################################
+
+type: panel
+path: pi-hole
+title: Pi-Hole
+icon: mdi:pi-hole
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+cards: !include /config/dashboards/infrastructure/partials/pi_hole_cards.yaml
diff --git a/config/dashboards/infrastructure/views/04_vacuum.yaml b/config/dashboards/infrastructure/views/04_vacuum.yaml
new file mode 100644
index 00000000..bae82707
--- /dev/null
+++ b/config/dashboards/infrastructure/views/04_vacuum.yaml
@@ -0,0 +1,23 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - Vacuum
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 3.
+######################################################################
+
+title: Vacuum
+icon: mdi:robot-vacuum
+type: sections
+cards: []
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 46a8d15eb20e4a1daf2d1d1f63180ec5
+- user: 8fc5ba22cb32430a9143beb4df70541b
+- user: 19970706e7e4492c844ea2fc94a4599a
+sections: !include /config/dashboards/infrastructure/partials/vacuum_sections.yaml
+max_columns: 2
+badges: !include /config/dashboards/infrastructure/partials/vacuum_badges.yaml
diff --git a/config/dashboards/infrastructure/views/05_activity_feed.yaml b/config/dashboards/infrastructure/views/05_activity_feed.yaml
new file mode 100644
index 00000000..ec4b5286
--- /dev/null
+++ b/config/dashboards/infrastructure/views/05_activity_feed.yaml
@@ -0,0 +1,16 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - Untitled
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 4.
+######################################################################
+
+type: panel
+icon: mdi:clipboard-text-outline
+title: Activity
+path: activity
+cards: !include /config/dashboards/infrastructure/partials/view_cards.yaml
diff --git a/config/dashboards/infrastructure/views/06_mariadb.yaml b/config/dashboards/infrastructure/views/06_mariadb.yaml
new file mode 100644
index 00000000..84e79f06
--- /dev/null
+++ b/config/dashboards/infrastructure/views/06_mariadb.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - MariaDB
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 5.
+######################################################################
+
+type: sections
+title: MariaDB
+path: mariadb
+max_columns: 3
+icon: mdi:database
+sections: !include /config/dashboards/infrastructure/partials/mariadb_sections.yaml
+cards: []
diff --git a/config/dashboards/infrastructure/views/07_docker_containers.yaml b/config/dashboards/infrastructure/views/07_docker_containers.yaml
new file mode 100644
index 00000000..4e0cac14
--- /dev/null
+++ b/config/dashboards/infrastructure/views/07_docker_containers.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Infrastructure View - Docker containers
+# Container status + restart controls (Portainer integration).
+# -------------------------------------------------------------------
+# Notes: Uses `binary_sensor.*_status` and `button.*_restart_container` entities (Portainer integration).
+######################################################################
+
+title: Docker
+path: docker
+type: sections
+icon: mdi:docker
+badges: []
+sections: !include /config/dashboards/infrastructure/partials/docker_containers_sections.yaml
+max_columns: 4
diff --git a/config/dashboards/kiosk/card_mod/.gitkeep b/config/dashboards/kiosk/card_mod/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/kiosk/cards/.gitkeep b/config/dashboards/kiosk/cards/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/kiosk/dashboard.yaml b/config/dashboards/kiosk/dashboard.yaml
new file mode 100644
index 00000000..99e6dddc
--- /dev/null
+++ b/config/dashboards/kiosk/dashboard.yaml
@@ -0,0 +1,12 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# KIOSK Dashboard - YAML entrypoint
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Entry point for dashboard key `dashboard-kiosk`. Views are loaded from /config/dashboards/kiosk/views.
+######################################################################
+
+views: !include_dir_list /config/dashboards/kiosk/views
diff --git a/config/dashboards/kiosk/partials/.gitkeep b/config/dashboards/kiosk/partials/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/kiosk/partials/kiosk_oveview_badges.yaml b/config/dashboards/kiosk/partials/kiosk_oveview_badges.yaml
new file mode 100644
index 00000000..1bbea1c9
--- /dev/null
+++ b/config/dashboards/kiosk/partials/kiosk_oveview_badges.yaml
@@ -0,0 +1,20 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Kiosk Partial - kiosk_oveview badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/kiosk/views/01_kiosk_oveview.yaml key `badges`.
+######################################################################
+
+- type: entity
+ show_name: true
+ show_state: false
+ show_icon: true
+ entity: switch.alarm_panel_1_screensaver
+ tap_action:
+ action: toggle
+ show_entity_picture: false
+ name: Turn On ScreenSaver
diff --git a/config/dashboards/kiosk/partials/kiosk_oveview_sections.yaml b/config/dashboards/kiosk/partials/kiosk_oveview_sections.yaml
new file mode 100644
index 00000000..57af6b63
--- /dev/null
+++ b/config/dashboards/kiosk/partials/kiosk_oveview_sections.yaml
@@ -0,0 +1,73 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Kiosk Partial - kiosk_oveview sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/kiosk/views/01_kiosk_oveview.yaml key `sections`.
+######################################################################
+
+- type: grid
+ cards:
+ - type: picture-glance
+ camera_image: camera.frontdoorbell
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 12
+ rows: auto
+ column_span: 1
+- type: grid
+ column_span: 1
+ cards:
+ - type: picture-glance
+ camera_image: camera.garagecam
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.driveway
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.kidsgate
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.frontlawn
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.bedroomgate
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.filtergate
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
+ - type: picture-glance
+ camera_image: camera.poolcam
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 6
+ rows: auto
diff --git a/config/dashboards/kiosk/partials/locator_sections.yaml b/config/dashboards/kiosk/partials/locator_sections.yaml
new file mode 100644
index 00000000..f82a6db9
--- /dev/null
+++ b/config/dashboards/kiosk/partials/locator_sections.yaml
@@ -0,0 +1,134 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Kiosk Partial - locator sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/kiosk/views/02_locator.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%)
+ - type: picture-entity
+ entity: person.stacey
+ name: Stacey (Mom)
+ show_state: false
+ show_name: false
+ state_filter:
+ home: none
+ not_home: grayscale(100%) opacity(50%)
+ - type: picture-entity
+ entity: person.justin
+ name: Justin (Son)
+ show_state: false
+ show_name: false
+ state_filter:
+ home: none
+ not_home: grayscale(100%) opacity(50%)
+ - type: picture-entity
+ entity: person.paige
+ name: Paige (Daughter)
+ show_state: false
+ show_name: false
+ state_filter:
+ home: none
+ not_home: grayscale(100%) opacity(50%)
+ columns: 4
+ - type: entities
+ entities:
+ - type: conditional
+ conditions:
+ - entity: person.carlo
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.carlo_place
+ name: Carlo Location
+ - type: conditional
+ conditions:
+ - entity: person.stacey
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.stacey_place
+ attribute: place_name
+ name: Stacey Location
+ - type: conditional
+ conditions:
+ - entity: person.justin
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.justin_place
+ attribute: place_name
+ name: Justin Location
+ - type: conditional
+ conditions:
+ - entity: person.paige
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.paige_place
+ attribute: place_name
+ name: Paige Location
+ - show_state: true
+ show_name: true
+ camera_view: live
+ type: picture-entity
+ entity: camera.birdseye
+ column_span: 1
+- type: grid
+ cards:
+ - type: custom:mushroom-template-card
+ primary: Family 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
+ - type: map
+ entities:
+ - person.justin
+ - person.paige
+ hours_to_show: 48
+ aspect_ratio: '4:3'
+ theme_mode: auto
+ card_mod:
+ 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"
+ - show_current: true
+ show_forecast: true
+ type: weather-forecast
+ entity: weather.pirateweather
+ forecast_type: daily
+ secondary_info_attribute: humidity
diff --git a/config/dashboards/kiosk/popups/.gitkeep b/config/dashboards/kiosk/popups/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/kiosk/views/01_kiosk_oveview.yaml b/config/dashboards/kiosk/views/01_kiosk_oveview.yaml
new file mode 100644
index 00000000..23f30fd9
--- /dev/null
+++ b/config/dashboards/kiosk/views/01_kiosk_oveview.yaml
@@ -0,0 +1,33 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# KIOSK View - Overview
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_kiosk view index 1.
+######################################################################
+
+title: Overview
+path: kiosk_oveview
+icon: mdi:cctv
+type: sections
+max_columns: 2
+sections: !include /config/dashboards/kiosk/partials/kiosk_oveview_sections.yaml
+badges: !include /config/dashboards/kiosk/partials/kiosk_oveview_badges.yaml
+cards: []
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 9543feb5402742a0ab90f301f09f1c0e
+dense_section_placement: true
+background:
+ opacity: 100
+ alignment: center
+ size: cover
+ repeat: no-repeat
+ attachment: fixed
+ image: /api/image/serve/caf7862354abd804ef658f899fb3218b/original
+header:
+ layout: center
+ badges_position: top
diff --git a/config/dashboards/kiosk/views/02_locator.yaml b/config/dashboards/kiosk/views/02_locator.yaml
new file mode 100644
index 00000000..7f6d3009
--- /dev/null
+++ b/config/dashboards/kiosk/views/02_locator.yaml
@@ -0,0 +1,29 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# KIOSK View - Locator
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.dashboard_kiosk view index 2.
+######################################################################
+
+type: sections
+max_columns: 3
+title: Locator
+path: locator
+icon: mdi:map-marker-radius-outline
+dense_section_placement: true
+background:
+ opacity: 100
+ alignment: center
+ size: cover
+ repeat: no-repeat
+ attachment: fixed
+ image: /api/image/serve/caf7862354abd804ef658f899fb3218b/original
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 9543feb5402742a0ab90f301f09f1c0e
+sections: !include /config/dashboards/kiosk/partials/locator_sections.yaml
+cards: []
diff --git a/config/dashboards/overview/card_mod/.gitkeep b/config/dashboards/overview/card_mod/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/overview/cards/.gitkeep b/config/dashboards/overview/cards/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/overview/dashboard.yaml b/config/dashboards/overview/dashboard.yaml
new file mode 100644
index 00000000..fb5ca1b2
--- /dev/null
+++ b/config/dashboards/overview/dashboard.yaml
@@ -0,0 +1,13 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Overview Dashboard - YAML entrypoint
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Entry point for dashboard key `lovelace`. Views are loaded from /config/dashboards/overview/views.
+######################################################################
+
+title: Bear Stone
+views: !include_dir_list /config/dashboards/overview/views
diff --git a/config/dashboards/overview/partials/.gitkeep b/config/dashboards/overview/partials/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/overview/partials/admin_sections.yaml b/config/dashboards/overview/partials/admin_sections.yaml
new file mode 100644
index 00000000..16be50ea
--- /dev/null
+++ b/config/dashboards/overview/partials/admin_sections.yaml
@@ -0,0 +1,61 @@
+######################################################################
+# @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 - admin sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/07_admin.yaml key `sections`.
+######################################################################
+
+- type: grid
+ cards:
+ - type: tile
+ entity: automation.llm_vision_garage_cans_upper_right
+ - type: tile
+ entity: input_text.llmvision_garbage_last_keyframe
+ - type: tile
+ entity: input_datetime.llmvision_garbage_last_run
+ - type: tile
+ entity: input_text.llmvision_garbage_last_response
+ - type: tile
+ entity: calendar.llm_vision_timeline
+ - type: tile
+ entity: update.llm_vision_update
+ - type: tile
+ entity: input_button.llmvision_garbage_check
+- type: grid
+ cards:
+ - type: markdown
+ title: AI Diagnostics
+ content: '**OpenAI Response:**
+
+
+ {{ state_attr(''sensor.openai_response'', ''response'') }}
+
+ '
+ - type: markdown
+ title: AI Diagnostics
+ content: '**OpenAI Instructions:**
+
+
+ {{ state_attr(''sensor.openai_instructions'', ''instructions'') }}
+
+ '
+- type: grid
+ cards:
+ - camera_view: auto
+ type: picture-glance
+ title: Bedroom Tablet
+ image: https://demo.home-assistant.io/stub_config/kitchen.png
+ entities:
+ - entity: switch.alarm_panel_1_screensaver
+ image_entity: image.alarm_panel_1_screenshot
+ - camera_view: auto
+ type: picture-glance
+ title: Bedroom Tablet
+ image: https://demo.home-assistant.io/stub_config/kitchen.png
+ entities:
+ - entity: sensor.alarm_panel_1_battery
+ camera_image: camera.alarm_panel_1
diff --git a/config/dashboards/overview/partials/camera_badges.yaml b/config/dashboards/overview/partials/camera_badges.yaml
new file mode 100644
index 00000000..0e852ed7
--- /dev/null
+++ b/config/dashboards/overview/partials/camera_badges.yaml
@@ -0,0 +1,29 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Overview Partial - camera badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/03_camera.yaml key `badges`.
+######################################################################
+
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: cover.large_garage_door
+ color: ''
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: cover.small_garage_door
+ color: ''
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: lock.front_door
+ color: ''
diff --git a/config/dashboards/overview/partials/camera_sections.yaml b/config/dashboards/overview/partials/camera_sections.yaml
new file mode 100644
index 00000000..8947677f
--- /dev/null
+++ b/config/dashboards/overview/partials/camera_sections.yaml
@@ -0,0 +1,54 @@
+######################################################################
+# @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 sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/03_camera.yaml key `sections`.
+######################################################################
+
+- type: grid
+ cards:
+ - type: picture-glance
+ camera_image: camera.frontdoorbell
+ camera_view: auto
+ entities: []
+ grid_options:
+ columns: 12
+ rows: 7
+ - type: picture-glance
+ camera_image: camera.poolcam
+ camera_view: auto
+ entities: []
+- type: grid
+ column_span: 3
+ cards:
+ - type: picture-glance
+ camera_image: camera.garagecam
+ camera_view: auto
+ entities: []
+ - type: picture-glance
+ camera_image: camera.frontlawn
+ camera_view: auto
+ entities: []
+ - type: picture-glance
+ camera_image: camera.driveway
+ camera_view: auto
+ entities: []
+ - type: picture-glance
+ camera_image: camera.kidsgate
+ camera_view: auto
+ entities: []
+ - type: picture-glance
+ camera_image: camera.bedroomgate
+ camera_view: auto
+ entities: []
+ - type: picture-glance
+ camera_image: camera.filtergate
+ camera_view: auto
+ entities: []
+ - type: custom:frigate-events-card
+ frigate_client_id: frigate
+ event_count: 3
diff --git a/config/dashboards/overview/partials/cameras_cards.yaml b/config/dashboards/overview/partials/cameras_cards.yaml
new file mode 100644
index 00000000..f44d075b
--- /dev/null
+++ b/config/dashboards/overview/partials/cameras_cards.yaml
@@ -0,0 +1,51 @@
+######################################################################
+# @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 - cameras cards
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/04_cameras.yaml key `cards`.
+######################################################################
+
+- type: custom:frigate-card
+ cameras:
+ - camera_entity: camera.frontdoorbell
+ dependencies:
+ all_cameras: true
+ cameras:
+ - camera.bedroomgate
+ - camera.filtergate
+ - camera.driveway
+ - camera_entity: camera.bedroomgate
+ - camera_entity: camera.filtergate
+ - camera_entity: camera.driveway
+ - camera_entity: camera.poolcam
+ live_provider: auto
+ - camera_entity: camera.blink1
+ live_provider: auto
+ - camera_entity: camera.frontlawn
+ live_provider: auto
+ - camera_entity: camera.kidsgate
+ - camera_entity: camera.garagecam
+ view:
+ default: snapshots
+ update_cycle_camera: true
+ scan:
+ enabled: true
+ menu:
+ style: outside
+ media_gallery:
+ controls:
+ thumbnails:
+ size: 175
+ show_favorite_control: false
+ show_details: false
+ dimensions:
+ min_height: '500'
+ aspect_ratio: '16:9'
+ aspect_ratio_mode: unconstrained
+ media_viewer:
+ layout:
+ fit: cover
diff --git a/config/dashboards/overview/partials/family_locator_cards.yaml b/config/dashboards/overview/partials/family_locator_cards.yaml
new file mode 100644
index 00000000..331d3197
--- /dev/null
+++ b/config/dashboards/overview/partials/family_locator_cards.yaml
@@ -0,0 +1,36 @@
+######################################################################
+# @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 - family_locator cards
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/02_family_locator.yaml key `cards`.
+######################################################################
+
+- type: map
+ entities:
+ - person.carlo
+ - person.stacey
+ - person.justin
+ - person.paige
+ hours_to_show: 48
+ aspect_ratio: '4:3'
+ theme_mode: auto
+ card_mod:
+ 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"
diff --git a/config/dashboards/overview/partials/home_badges.yaml b/config/dashboards/overview/partials/home_badges.yaml
new file mode 100644
index 00000000..09f08854
--- /dev/null
+++ b/config/dashboards/overview/partials/home_badges.yaml
@@ -0,0 +1,21 @@
+######################################################################
+# @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 badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/01_home.yaml key `badges`.
+######################################################################
+
+- 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
diff --git a/config/dashboards/overview/partials/home_sections.yaml b/config/dashboards/overview/partials/home_sections.yaml
new file mode 100644
index 00000000..b4673fcb
--- /dev/null
+++ b/config/dashboards/overview/partials/home_sections.yaml
@@ -0,0 +1,412 @@
+######################################################################
+# @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.
+# -------------------------------------------------------------------
+# 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%)
+ 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%)
+ 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 Dorm: grayscale(10%) 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 Dorm: grayscale(10%) 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:
+ type: attribute
+ entity: sensor.carlo_place
+ attribute: formatted_place
+ name: Carlo Location
+ - type: conditional
+ conditions:
+ - entity: person.stacey
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.stacey_place
+ attribute: formatted_place
+ name: Stacey Location
+ - type: conditional
+ conditions:
+ - entity: person.justin
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.justin_place
+ attribute: formatted_place
+ name: Justin Location
+ - type: conditional
+ conditions:
+ - entity: person.paige
+ state_not: home
+ row:
+ type: attribute
+ entity: sensor.paige_place
+ attribute: formatted_place
+ 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
+ - type: map
+ entities:
+ - person.justin
+ - person.paige
+ hours_to_show: 48
+ aspect_ratio: '4:3'
+ theme_mode: auto
+ card_mod:
+ 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.carlo
+ - person.stacey
+ hours_to_show: 48
+ aspect_ratio: '4:3'
+ theme_mode: auto
+ card_mod:
+ 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"
+ 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: tile
+ entity: climate.upstairs
+ show_entity_picture: false
+ hide_state: false
+ state_content:
+ - current_temperature
+ - temperature
+ vertical: false
+ features_position: bottom
+ - type: custom:search-card
+ max_results: 10
+ - 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: '#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: '#lights-popup'
+ button_action:
+ tap_action:
+ action: navigate
+ navigation_path: '#lights-popup'
+ 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: vertical-stack
+ cards:
+ - type: custom:bubble-card
+ card_type: pop-up
+ hash: '#living_room'
+ button_type: slider
+ entity: light.living_room_lights
+ name: Living Room Lights
+ icon: mdi:sofa
+ show_attribute: false
+ slide_to_close_distance: '100000'
+ trigger: []
+ bg_opacity: '35'
+ show_state: true
+ show_last_changed: true
+ tap_action:
+ action: toggle
+ - type: custom:bubble-card
+ card_type: button
+ button_type: slider
+ entity: light.m1_front_left
+ name: Front Left
+ icon: mdi:light-recessed
+ show_state: true
+ show_attribute: false
+ show_last_changed: true
+ sub_button: []
+ grid_options:
+ columns: 6
+ rows: 1
+ columns: 2
+ - type: custom:bubble-card
+ card_type: button
+ button_type: slider
+ entity: light.m1_front_right
+ name: Front Right
+ icon: mdi:light-recessed
+ show_state: true
+ show_attribute: false
+ show_last_changed: true
+ sub_button: []
+ grid_options:
+ columns: 6
+ rows: 1
+ - type: custom:bubble-card
+ card_type: button
+ button_type: slider
+ entity: light.m1_back_left
+ name: Back Left
+ icon: mdi:light-recessed
+ show_state: true
+ show_attribute: false
+ show_last_changed: true
+ sub_button: []
+ grid_options:
+ columns: 6
+ rows: 1
+ - type: custom:bubble-card
+ card_type: button
+ button_type: slider
+ entity: light.m1_back_right
+ name: Back Right
+ icon: mdi:light-recessed
+ show_state: true
+ show_attribute: false
+ show_last_changed: true
+ sub_button: []
+ grid_options:
+ columns: 6
+ rows: 1
+ grid_options:
+ columns: 12
+ rows: auto
+ - 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
+ - type: vertical-stack
+ cards:
+ - type: custom:bubble-card
+ card_type: pop-up
+ hash: '#lights-popup'
+ name: Lights Control
+ icon: mdi:lightbulb-group
+ width_desktop: 500px
+ show_header: true
+ entity: sensor.number_of_lights_on
+ button_type: name
+ - type: custom:auto-entities
+ filter:
+ include:
+ - domain: light
+ exclude:
+ - state: 'off'
+ - state: unavailable
+ - hidden_by: user
+ show_empty: true
+ entity: sensor.number_of_lights_on
+ button_type: state
+ show_name: true
+ card:
+ type: custom:auto-entities
+ card:
+ type: entities
+ filter:
+ include: []
+ exclude: []
+- cards:
+ - type: custom:frigate-events-card
+ frigate_client_id: frigate
+ event_count: 5
+ - show_state: true
+ show_name: true
+ camera_view: live
+ type: picture-entity
+ entity: camera.birdseye
+ tap_action:
+ action: navigate
+ navigation_path: /lovelace/camera
+ - type: vertical-stack
+ cards:
+ - type: weather-forecast
+ show_current: true
+ show_forecast: true
+ entity: weather.pirateweather
+ forecast_type: hourly
+ secondary_info_attribute: humidity
+ - type: custom:clock-weather-card
+ entity: weather.pirateweather
+ sun_entity: sun.sun
+ temperature_sensor: sensor.pirateweather_temperature
+ humidity_sensor: sensor.pirateweather_humidity
+ weather_icon_type: fill
+ animated_icon: true
+ forecast_rows: 5
+ locale: en-GB
+ time_pattern: HH:mm
+ time_format: 12
+ date_pattern: DDDD
+ hide_today_section: true
+ hide_forecast_section: false
+ show_humidity: true
+ hide_clock: false
+ hide_date: true
+ hourly_forecast: false
+ use_browser_time: false
+ time_zone: null
+ show_decimal: false
+ aqi_sensor: sensor.bear_stone_common_air_quality_index
+ apparent_sensor: null
diff --git a/config/dashboards/overview/partials/vacuum_badges.yaml b/config/dashboards/overview/partials/vacuum_badges.yaml
new file mode 100644
index 00000000..8f3d031c
--- /dev/null
+++ b/config/dashboards/overview/partials/vacuum_badges.yaml
@@ -0,0 +1,16 @@
+######################################################################
+# @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 badges
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/05_vacuum.yaml key `badges`.
+######################################################################
+
+- type: entity
+ show_name: true
+ show_state: true
+ show_icon: true
+ entity: input_boolean.l10s_vacuum_on_demand
diff --git a/config/dashboards/overview/partials/vacuum_sections.yaml b/config/dashboards/overview/partials/vacuum_sections.yaml
new file mode 100644
index 00000000..3bf97663
--- /dev/null
+++ b/config/dashboards/overview/partials/vacuum_sections.yaml
@@ -0,0 +1,352 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Overview Partial - vacuum sections
+# Reusable list extracted from a view for smaller diffs and safer edits.
+# -------------------------------------------------------------------
+# Notes: Extracted from config/dashboards/overview/views/05_vacuum.yaml key `sections`.
+######################################################################
+
+- type: grid
+ cards:
+ - type: tile
+ entity: input_text.l10s_vacuum_room_catalog
+ vertical: false
+ features_position: bottom
+ grid_options:
+ columns: full
+ - type: tile
+ entity: input_text.l10s_vacuum_room_queue
+ vertical: false
+ features_position: bottom
+ grid_options:
+ columns: full
+ - type: tile
+ entity: input_text.l10s_vacuum_rooms_cleaned_today
+ vertical: false
+ features_position: bottom
+ grid_options:
+ columns: full
+ - type: tile
+ grid_options:
+ columns: full
+ entity: sensor.l10s_vacuum_current_room
+ state_content:
+ - state
+ - room_id
+ - last_changed
+ vertical: false
+ features_position: bottom
+ - type: tile
+ entity: input_select.l10s_vacuum_phase
+ - type: tile
+ entity: sensor.l10s_vacuum_status
+ - type: markdown
+ content: " 14 \u2013 Kitchen \n 12 \u2013 Dining \n 10 \u2013 Living \n 7 \u2013 Master Bedroom \n 15 \u2013\
+ \ Foyer \n 9 \u2013 Stacey Office \n 17 \u2013 Formal Dining \n 13 \u2013 Hallway \n 8 \u2013 Justin Bedroom\
+ \ \n 6 \u2013 Paige Bedroom \n 4 \u2013 Master Bathroom \n 2 \u2013 Office \n 1 \u2013 Pool Bath \n 3 \u2013\
+ \ Kids Bathroom\n"
+ title: Room Legend
+- type: grid
+ cards:
+ - type: custom:xiaomi-vacuum-map-card
+ map_source:
+ camera: camera.l10s_vacuum_map
+ calibration_source:
+ camera: true
+ entity: vacuum.l10s_vacuum
+ vacuum_platform: Tasshack/dreame-vacuum
+ map_modes:
+ - template: vacuum_clean_zone
+ - template: vacuum_clean_point
+ - template: vacuum_clean_segment
+ predefined_selections:
+ - id: '1'
+ icon:
+ name: mdi:home-outline
+ x: -8100
+ y: 12400
+ label:
+ text: Pool-Bath
+ x: -8100
+ y: 12400
+ offset_y: 35
+ outline:
+ - - -9950
+ - 11350
+ - - -6650
+ - 11350
+ - - -6650
+ - 12900
+ - - -9950
+ - 12900
+ - id: '2'
+ icon:
+ name: mdi:monitor-shimmer
+ x: -4650
+ y: 10900
+ label:
+ text: Office
+ x: -4650
+ y: 10900
+ offset_y: 35
+ outline:
+ - - -6650
+ - 7400
+ - - -2800
+ - 7400
+ - - -2800
+ - 12850
+ - - -6650
+ - 12850
+ - id: '3'
+ icon:
+ name: mdi:home-outline
+ x: -5600
+ y: 5250
+ label:
+ text: Kids-Bathroom
+ x: -5600
+ y: 5250
+ offset_y: 35
+ outline:
+ - - -6450
+ - 4250
+ - - -4750
+ - 4250
+ - - -4750
+ - 6150
+ - - -6450
+ - 6150
+ - id: '4'
+ icon:
+ name: mdi:home-outline
+ x: 7300
+ y: 4100
+ label:
+ text: Master-Bathroom
+ x: 7300
+ y: 4100
+ offset_y: 35
+ outline:
+ - - 5450
+ - 250
+ - - 9400
+ - 250
+ - - 9400
+ - 7850
+ - - 5450
+ - 7850
+ - id: '6'
+ icon:
+ name: mdi:home-outline
+ x: -8450
+ y: 4200
+ label:
+ text: Paige-Bedroom
+ x: -8450
+ y: 4200
+ offset_y: 35
+ outline:
+ - - -9900
+ - 1600
+ - - -6600
+ - 1600
+ - - -6600
+ - 6100
+ - - -9900
+ - 6100
+ - id: '7'
+ icon:
+ name: mdi:home-outline
+ x: 6450
+ y: 10400
+ label:
+ text: Master-Bedroom
+ x: 6450
+ y: 10400
+ offset_y: 35
+ outline:
+ - - 3450
+ - 7850
+ - - 9550
+ - 7850
+ - - 9550
+ - 12850
+ - - 3450
+ - 12850
+ - id: '8'
+ icon:
+ name: mdi:home-outline
+ x: -8300
+ y: 9300
+ label:
+ text: Justin-Bedroom
+ x: -8300
+ y: 9300
+ offset_y: 35
+ outline:
+ - - -9950
+ - 6250
+ - - -6650
+ - 6250
+ - - -6650
+ - 11150
+ - - -9950
+ - 11150
+ - id: '9'
+ icon:
+ name: mdi:home-outline
+ x: 7250
+ y: -2200
+ label:
+ text: Stacey-Office
+ x: 7250
+ y: -2200
+ offset_y: 35
+ outline:
+ - - 5450
+ - -4700
+ - - 9450
+ - -4700
+ - - 9450
+ - 350
+ - - 5450
+ - 350
+ - id: '10'
+ icon:
+ name: mdi:sofa-outline
+ x: 2500
+ y: 4800
+ label:
+ text: Living Room
+ x: 2500
+ y: 4800
+ offset_y: 35
+ outline:
+ - - -650
+ - 750
+ - - 5300
+ - 750
+ - - 5300
+ - 8800
+ - - -650
+ - 8800
+ - id: '11'
+ icon:
+ name: mdi:home-outline
+ x: -5350
+ y: 2600
+ label:
+ text: Garage-Hallway
+ x: -5350
+ y: 2600
+ offset_y: 35
+ outline:
+ - - -6600
+ - 1100
+ - - -4050
+ - 1100
+ - - -4050
+ - 4200
+ - - -6600
+ - 4200
+ - id: '12'
+ icon:
+ name: mdi:home-outline
+ x: 700
+ y: 8900
+ label:
+ text: Dining-Room
+ x: 700
+ y: 8900
+ offset_y: 35
+ outline:
+ - - -4350
+ - 6000
+ - - 2650
+ - 6000
+ - - 2650
+ - 12650
+ - - -4350
+ - 12650
+ - id: '13'
+ icon:
+ name: mdi:home-outline
+ x: -6200
+ y: 6800
+ label:
+ text: Hallway
+ x: -6200
+ y: 6800
+ offset_y: 35
+ outline:
+ - - -7550
+ - 6100
+ - - -4350
+ - 6100
+ - - -4350
+ - 7700
+ - - -7550
+ - 7700
+ - id: '14'
+ icon:
+ name: mdi:chef-hat
+ x: -1700
+ y: 3350
+ label:
+ text: Kitchen
+ x: -1700
+ y: 3350
+ offset_y: 35
+ outline:
+ - - -4200
+ - 950
+ - - -300
+ - 950
+ - - -300
+ - 6100
+ - - -4200
+ - 6100
+ - id: '15'
+ icon:
+ name: mdi:home-outline
+ x: 4050
+ y: -1350
+ label:
+ text: Foyer
+ x: 4050
+ y: -1350
+ offset_y: 35
+ outline:
+ - - 2850
+ - -3500
+ - - 5450
+ - -3500
+ - - 5450
+ - 800
+ - - 2850
+ - 800
+ - id: '17'
+ icon:
+ name: mdi:home-outline
+ x: 750
+ y: -1250
+ label:
+ text: Formal-Dining
+ x: 750
+ y: -1250
+ offset_y: 35
+ outline:
+ - - -1500
+ - -3500
+ - - 2950
+ - -3500
+ - - 2950
+ - 950
+ - - -1500
+ - 950
+ map_locked: true
+ two_finger_pan: true
diff --git a/config/dashboards/overview/partials/water_sections.yaml b/config/dashboards/overview/partials/water_sections.yaml
new file mode 100644
index 00000000..9ef79e94
--- /dev/null
+++ b/config/dashboards/overview/partials/water_sections.yaml
@@ -0,0 +1,117 @@
+######################################################################
+# @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/06_water.yaml key `sections`.
+######################################################################
+
+- 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
+ - type: tile
+ entity: input_datetime.upstairs_last_filter_change
+ - 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
+ - type: energy-water-graph
diff --git a/config/dashboards/overview/popups/.gitkeep b/config/dashboards/overview/popups/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/overview/views/01_home.yaml b/config/dashboards/overview/views/01_home.yaml
new file mode 100644
index 00000000..2ef555c9
--- /dev/null
+++ b/config/dashboards/overview/views/01_home.yaml
@@ -0,0 +1,29 @@
+######################################################################
+# @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
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 1.
+######################################################################
+
+path: 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
+cards: []
+header:
+ layout: center
+ badges_position: bottom
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 46a8d15eb20e4a1daf2d1d1f63180ec5
+- user: 8fc5ba22cb32430a9143beb4df70541b
+- user: 19970706e7e4492c844ea2fc94a4599a
diff --git a/config/dashboards/overview/views/02_family_locator.yaml b/config/dashboards/overview/views/02_family_locator.yaml
new file mode 100644
index 00000000..95a082ad
--- /dev/null
+++ b/config/dashboards/overview/views/02_family_locator.yaml
@@ -0,0 +1,17 @@
+######################################################################
+# @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 - Family Locator
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 2.
+######################################################################
+
+type: panel
+path: family_locator
+subview: true
+cards: !include /config/dashboards/overview/partials/family_locator_cards.yaml
+icon: mdi:map-marker-radius
+title: Family Locator
diff --git a/config/dashboards/overview/views/03_camera.yaml b/config/dashboards/overview/views/03_camera.yaml
new file mode 100644
index 00000000..535a9d1f
--- /dev/null
+++ b/config/dashboards/overview/views/03_camera.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @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 - Camera
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 3.
+######################################################################
+
+title: Camera
+path: camera
+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
diff --git a/config/dashboards/overview/views/04_cameras.yaml b/config/dashboards/overview/views/04_cameras.yaml
new file mode 100644
index 00000000..234a26a1
--- /dev/null
+++ b/config/dashboards/overview/views/04_cameras.yaml
@@ -0,0 +1,17 @@
+######################################################################
+# @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 - Camera View
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 4.
+######################################################################
+
+title: Camera View
+path: cameras
+icon: mdi:camera
+theme: Backend-selected
+type: panel
+cards: !include /config/dashboards/overview/partials/cameras_cards.yaml
diff --git a/config/dashboards/overview/views/05_vacuum.yaml b/config/dashboards/overview/views/05_vacuum.yaml
new file mode 100644
index 00000000..e0ad116c
--- /dev/null
+++ b/config/dashboards/overview/views/05_vacuum.yaml
@@ -0,0 +1,23 @@
+######################################################################
+# @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 - Vacuum
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 5.
+######################################################################
+
+title: Vacuum
+icon: mdi:robot-vacuum
+type: sections
+cards: []
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 46a8d15eb20e4a1daf2d1d1f63180ec5
+- user: 8fc5ba22cb32430a9143beb4df70541b
+- user: 19970706e7e4492c844ea2fc94a4599a
+sections: !include /config/dashboards/overview/partials/vacuum_sections.yaml
+max_columns: 2
+badges: !include /config/dashboards/overview/partials/vacuum_badges.yaml
diff --git a/config/dashboards/overview/views/06_water.yaml b/config/dashboards/overview/views/06_water.yaml
new file mode 100644
index 00000000..463f7cef
--- /dev/null
+++ b/config/dashboards/overview/views/06_water.yaml
@@ -0,0 +1,23 @@
+######################################################################
+# @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 - Utilities
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 6.
+######################################################################
+
+title: Utilities
+path: water
+icon: mdi:home-lightning-bolt
+type: sections
+max_columns: 3
+sections: !include /config/dashboards/overview/partials/water_sections.yaml
+cards: []
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+- user: 46a8d15eb20e4a1daf2d1d1f63180ec5
+- user: 8fc5ba22cb32430a9143beb4df70541b
+- user: 19970706e7e4492c844ea2fc94a4599a
diff --git a/config/dashboards/overview/views/07_admin.yaml b/config/dashboards/overview/views/07_admin.yaml
new file mode 100644
index 00000000..0ddf6be3
--- /dev/null
+++ b/config/dashboards/overview/views/07_admin.yaml
@@ -0,0 +1,18 @@
+######################################################################
+# @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 - Admin
+# YAML-exported Lovelace dashboard (split into view files).
+# -------------------------------------------------------------------
+# Notes: Exported from config/.storage/lovelace.lovelace view index 7.
+######################################################################
+
+title: Admin
+icon: mdi:security
+visible:
+- user: be280a93c9d7416e98d25d0470f414be
+cards: []
+type: sections
+sections: !include /config/dashboards/overview/partials/admin_sections.yaml
diff --git a/config/dashboards/resources.yaml b/config/dashboards/resources.yaml
new file mode 100644
index 00000000..c9fed94a
--- /dev/null
+++ b/config/dashboards/resources.yaml
@@ -0,0 +1,49 @@
+######################################################################
+# @CCOSTAN - Follow Me on X
+# For more info visit https://www.vcloudinfo.com/click-here
+# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
+# -------------------------------------------------------------------
+# Lovelace Resources - Custom card JS resources
+# YAML-managed Lovelace resources (resource_mode: yaml).
+# -------------------------------------------------------------------
+# Notes: Generated from config/.storage/lovelace_resources. Edit here after migration; do not edit .storage.
+######################################################################
+
+- type: module
+ url: /hacsfiles/lovelace-card-tools/card-tools.js?hacstag=16140332811
+- type: module
+ url: /hacsfiles/lovelace-auto-entities/auto-entities.js?hacstag=1677445841161
+- type: module
+ url: /hacsfiles/button-card/button-card.js?hacstag=146194325701
+- type: module
+ url: /hacsfiles/frigate-hass-card/frigate-hass-card.js?hacstag=394082552651
+- type: module
+ url: /hacsfiles/lovelace-xiaomi-vacuum-map-card/xiaomi-vacuum-map-card.js?hacstag=193372044232
+- type: module
+ url: /hacsfiles/lovelace-mushroom/mushroom.js?hacstag=4443503755010
+- type: module
+ url: /hacsfiles/clock-weather-card/clock-weather-card.js?hacstag=522634019292
+- type: module
+ url: /hacsfiles/lovelace-card-mod/card-mod.js?hacstag=190927524420
+- type: module
+ url: /hacsfiles/Bubble-Card/bubble-card.js?hacstag=680112919311
+- type: module
+ url: /hacsfiles/power-flow-card-plus/power-flow-card-plus.js?hacstag=618081815026
+- type: module
+ url: /hacsfiles/mini-graph-card/mini-graph-card-bundle.js?hacstag=1512800620130
+- type: module
+ url: /hacsfiles/advanced-camera-card/advanced-camera-card.js?hacstag=3940825527260
+- type: module
+ url: /hacsfiles/search-card/search-card.js?hacstag=19775918002
+- type: module
+ url: /hacsfiles/apexcharts-card/apexcharts-card.js?hacstag=331701152223
+- type: module
+ url: /hacsfiles/pi-hole-card/pi-hole-card.js?hacstag=9776750790250
+- type: module
+ url: /hacsfiles/flex-horseshoe-card/flex-horseshoe-card.js?hacstag=20729272512
+- type: module
+ url: /hacsfiles/vertical-stack-in-card/vertical-stack-in-card.js?hacstag=142051833101
+- type: module
+ url: /hacsfiles/lovelace-layout-card/layout-card.js?hacstag=156434866247
+- type: module
+ url: /hacsfiles/frigate-events-card/frigate-events-card.js?hacstag=1111882479100
diff --git a/config/dashboards/shared/card_mod/.gitkeep b/config/dashboards/shared/card_mod/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/shared/partials/.gitkeep b/config/dashboards/shared/partials/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/shared/popups/.gitkeep b/config/dashboards/shared/popups/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/dashboards/shared/views/.gitkeep b/config/dashboards/shared/views/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/config/packages/vacuum.yaml b/config/packages/vacuum.yaml
index 3d4c7090..7afcf2b0 100755
--- a/config/packages/vacuum.yaml
+++ b/config/packages/vacuum.yaml
@@ -10,7 +10,7 @@
# Notes:
# - `sensor.l10s_vacuum_current_room` can change during transit; require a dwell (`for:`) before dequeuing.
# - Treat 2+ minutes in a room as "being cleaned" and dequeue immediately (queue = remaining rooms).
-# - Phase changes happen when the queue is reseeded after the queue hits zero and the vacuum is not actively cleaning (queue is the source of truth).
+# - Phase changes happen when the queue is reseeded after the queue hits zero (queue is the source of truth).
# - Avoid reissuing `dreame_vacuum.vacuum_clean_segment` while already cleaning; only send a new segment job when starting/resuming or switching phases.
# - Jinja2 loop scoping: use a `namespace` when building lists (otherwise the queue can appear empty and get cleared).
# - Docked + task complete only logs queue state; no auto-clearing.
@@ -128,7 +128,7 @@ script:
vac_state: "{{ states('vacuum.l10s_vacuum') | default('', true) | string | lower }}"
vac_is_cleaning: "{{ vac_state == 'cleaning' }}"
phase_ready: "{{ is_state('input_boolean.l10s_vacuum_phase_ready', 'on') }}"
- advance_phase: "{{ queue_ints | length == 0 and phase_ready and not vac_is_cleaning }}"
+ advance_phase: "{{ queue_ints | length == 0 and phase_ready }}"
reset_cycle: "{{ advance_phase and not has_next_phase }}"
phase_for_seed: "{{ next_phase if advance_phase and has_next_phase else phase }}"
cleaning_mode: "{{ 'sweeping_and_mopping' if 'mop_' in phase_for_seed else 'sweeping' }}"
@@ -206,7 +206,20 @@ script:
- stop: 'No rooms left to clean today.'
default: []
- # 3. Start cleaning
+ # 3. Start cleaning (but don't clobber an active job)
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: "{{ vac_is_cleaning }}"
+ sequence:
+ - service: script.send_to_logbook
+ data:
+ topic: "VACUUM"
+ message: "Vacuum is already cleaning; queue/phase updated but not issuing a new segment job."
+ - stop: "Already cleaning."
+ default: []
+
+ # 4. Start cleaning
- service: select.select_option
target:
entity_id: select.l10s_vacuum_cleaning_mode
@@ -394,12 +407,6 @@ automation:
- condition: state
entity_id: input_boolean.guest_mode
state: 'off'
- - condition: template
- value_template: >
- {{ is_state('input_boolean.l10s_vacuum_on_demand', 'on') or is_state('group.family', 'not_home') }}
- - condition: template
- value_template: >
- true
- condition: template
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
action:
@@ -555,7 +562,7 @@ automation:
- service: script.send_to_logbook
data:
topic: "VACUUM"
- message: "Queue empty for phase {{ phase }}; waiting for task completion to advance."
+ message: "Queue empty for phase {{ phase }}; phase advance armed for next reseed."
default: []
default: []
From 525ac7756ec53d38de597dfe0c25ccea92b7dd3a Mon Sep 17 00:00:00 2001
From: Carlo Costanzo
Date: Sun, 8 Feb 2026 00:43:05 -0500
Subject: [PATCH 2/4] Update README files across various config directories to
remove unnecessary blank lines and enhance formatting consistency. Add
branding and navigation details to the dashboards README.
---
config/automation/README.md | 2 -
config/automation/Speech/README.md | 2 -
config/automation/System/README.md | 4 +-
config/automation/Timed_Triggers/README.md | 2 -
config/dashboards/README.md | 33 +++++++++
config/group/README.md | 2 -
config/input_boolean/README.md | 2 -
config/packages/triggers/README.md | 2 -
config/scene/README.md | 2 -
config/script/README.md | 2 -
config/sensor/README.md | 4 --
config/shell_scripts/README.md | 2 -
config/sounds/README.md | 2 -
config/sounds/custom/README.md | 2 -
config/sounds/gf_clock/README.md | 4 +-
config/sounds/speechcons/README.md | 2 -
.../floorplan/images/branding/README.md | 70 +++++++------------
17 files changed, 61 insertions(+), 78 deletions(-)
diff --git a/config/automation/README.md b/config/automation/README.md
index 8c70b583..a563ba0c 100755
--- a/config/automation/README.md
+++ b/config/automation/README.md
@@ -1,4 +1,3 @@
-
@@ -37,7 +36,6 @@ Event-driven automations that sit outside the self-contained packages. These tie
- Use these as patterns if you are migrating UI-created automations out of `automations.yaml`.
- Most automations expose helpers (input booleans, scenes) so you can extend them without editing IDs.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/automation/Speech/README.md b/config/automation/Speech/README.md
index 7d6d8b48..1b0c173f 100755
--- a/config/automation/Speech/README.md
+++ b/config/automation/Speech/README.md
@@ -1,4 +1,3 @@
-
@@ -36,7 +35,6 @@ Speech-first automations: contextual announcements, stats briefings, guest mode
- Pairs with `script/speech_engine.yaml` and `templates/speech/briefing.yaml` for reusable phrasing.
- Keep announcements short; most are triggered off sensor changes or scheduled briefings.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/automation/System/README.md b/config/automation/System/README.md
index 8ab57a67..fc70ff40 100755
--- a/config/automation/System/README.md
+++ b/config/automation/System/README.md
@@ -1,4 +1,3 @@
-
@@ -17,7 +16,7 @@
-Meta automations that keep Home Assistant healthy—watchdogs, diagnostics, and recovery tasks for the stack itself.
+Meta automations that keep Home Assistant healthy�watchdogs, diagnostics, and recovery tasks for the stack itself.
### Quick navigation
- [Repo overview](../../../README.md) | [Config index](../../README.md) | [Automation home](..) | [Packages](../../packages)
@@ -36,7 +35,6 @@ Meta automations that keep Home Assistant healthy
- Great place to drop temporary diagnostics without touching user-facing automations.
- When cloning, change `id:` fields to avoid UUID collisions.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/automation/Timed_Triggers/README.md b/config/automation/Timed_Triggers/README.md
index ab5c7e40..cd6481dc 100755
--- a/config/automation/Timed_Triggers/README.md
+++ b/config/automation/Timed_Triggers/README.md
@@ -1,4 +1,3 @@
-
@@ -36,7 +35,6 @@ Time-based routines for wake/sleep cycles, sunrise/sunset shifts, and nightly wa
- If you add new timed routines, keep names numeric or descriptive for easy sorting.
- Template your conditions to respect holidays/guests before firing loud routines.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/dashboards/README.md b/config/dashboards/README.md
index b67264a3..208ecc1c 100644
--- a/config/dashboards/README.md
+++ b/config/dashboards/README.md
@@ -1,3 +1,21 @@
+
+
+
+ Bear Stone Smart Home Documentation
+
+Be sure to :star: my configuration repo so you can keep up to date on any daily progress!
+
+
+
+[](https://x.com/ccostan)
+[](https://www.youtube.com/vCloudInfo?sub_confirmation=1)
+[](https://github.com/CCOSTAN)
+[](https://github.com/CCOSTAN/Home-AssistantConfig/blob/master/config/.HA_VERSION)
+[](https://github.com/CCOSTAN/Home-AssistantConfig/commits/master)
+[](https://github.com/CCOSTAN/Home-AssistantConfig/commits/master)
+
+
+
Dashboards (Lovelace YAML)
@@ -48,3 +66,18 @@ This folder is referenced from `config/configuration.yaml` via:
### Notes
- Do not edit `config/.storage` by hand. Export once, then maintain the YAML files here.
- It is safe to restart Home Assistant after dashboard changes as long as a configuration check passes first.
+
+**All of my configuration files are tested against the most stable version of home-assistant.**
+
+
+
+**Still have questions on my Config?**
+**Message me on X :** [](https://www.x.com/ccostan)
+
+
+
You can buy me a coffee
+
+
+
+Affiliate Disclosure
+
diff --git a/config/group/README.md b/config/group/README.md
index 8038609a..5810f151 100755
--- a/config/group/README.md
+++ b/config/group/README.md
@@ -1,4 +1,3 @@
-
@@ -35,7 +34,6 @@ Logical groupings (doors, locks, media, motion, switches) that make automations
- Use groups in conditions to reduce repetitive entity lists.
- Name groups after their purpose (alerts, climate, lights) for clarity.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/input_boolean/README.md b/config/input_boolean/README.md
index 5eab7217..c575f586 100755
--- a/config/input_boolean/README.md
+++ b/config/input_boolean/README.md
@@ -1,4 +1,3 @@
-
@@ -35,7 +34,6 @@ Mode and trigger toggles that drive automations (guest mode, parties, presence o
- Flip booleans in the UI or via scripts to steer automations without edits.
- Prefix experimental toggles with the feature name to keep them organized.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/packages/triggers/README.md b/config/packages/triggers/README.md
index 1fa33e0e..77b4eaf2 100755
--- a/config/packages/triggers/README.md
+++ b/config/packages/triggers/README.md
@@ -1,4 +1,3 @@
-
@@ -36,7 +35,6 @@ Small, reusable trigger packages�button presses, state trackers, and helper fl
- Drop these alongside your packages to keep repeated patterns DRY.
- Most helpers expose booleans/entities you can hook into without editing their logic.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/scene/README.md b/config/scene/README.md
index 2c2e6984..dcb2e833 100755
--- a/config/scene/README.md
+++ b/config/scene/README.md
@@ -1,4 +1,3 @@
-
@@ -60,7 +59,6 @@ Reusable lighting and ambiance presets. Automations and scripts call these scene
- Adjust scenes once and let all dependent automations inherit the change.
- Pair with `script/monthly_color_scene.yaml` for dynamic monthly palettes.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/script/README.md b/config/script/README.md
index c404aeaf..886a8711 100755
--- a/config/script/README.md
+++ b/config/script/README.md
@@ -1,4 +1,3 @@
-
@@ -38,7 +37,6 @@ Reusable scripts that other automations call for notifications, lighting, and sa
- Keep scripts generic�route data via `data:`/`variables:` and reuse everywhere.
- If you copy a script, rename any `alias` and `id` fields to avoid duplicates.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/sensor/README.md b/config/sensor/README.md
index b628fcee..b7b68009 100755
--- a/config/sensor/README.md
+++ b/config/sensor/README.md
@@ -1,4 +1,3 @@
-
@@ -34,7 +33,6 @@ Standalone sensors that aren't bundled in packages - time/utility helpers and MQ
- Great place for lightweight utility sensors you want everywhere.
- Fold frequently used sensors into packages when they grow.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
@@ -49,5 +47,3 @@ Standalone sensors that aren't bundled in packages - time/utility helpers and MQ
Affiliate Disclosure
-
-
diff --git a/config/shell_scripts/README.md b/config/shell_scripts/README.md
index 3599d1ad..1ea04354 100755
--- a/config/shell_scripts/README.md
+++ b/config/shell_scripts/README.md
@@ -1,4 +1,3 @@
-
@@ -36,7 +35,6 @@ Longer-running shell helpers referenced by automations, packages, or cron. Anyth
- Make scripts executable and test them manually before wiring into HA.
- Document expected env vars or secrets at the top of each script.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/sounds/README.md b/config/sounds/README.md
index f75c3989..618f05b0 100755
--- a/config/sounds/README.md
+++ b/config/sounds/README.md
@@ -1,4 +1,3 @@
-
@@ -30,7 +29,6 @@ Audio assets (alert tones, chimes, TTS snippets) used by automations and scripts
- Subfolders hold themed or device-specific sounds.
- Seasonal cuckoo clock uses `october-clock` (Halloween) and `december-clock` (Christmas) variants, falling back to `cuckoo-clock`.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/sounds/custom/README.md b/config/sounds/custom/README.md
index 1f21799e..66f800ab 100755
--- a/config/sounds/custom/README.md
+++ b/config/sounds/custom/README.md
@@ -1,4 +1,3 @@
-
@@ -28,7 +27,6 @@ Custom/recorded sounds for bespoke automations (alarms, alerts, gags).
- Note volume expectations in the automation that plays each file.
- Store lossless masters elsewhere; keep deployment files compressed.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/sounds/gf_clock/README.md b/config/sounds/gf_clock/README.md
index 1ba0932d..27da883f 100755
--- a/config/sounds/gf_clock/README.md
+++ b/config/sounds/gf_clock/README.md
@@ -1,4 +1,3 @@
-
@@ -26,8 +25,7 @@ Grandfather clock chimes and cues used for hourly or themed announcements.
### Tips
- Pair with `automation/Timed_Triggers/` routines for on-the-hour cues.
-- Normalize levels so chimes don’t spike TTS volume.
-
+- Normalize levels so chimes don�t spike TTS volume.
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/sounds/speechcons/README.md b/config/sounds/speechcons/README.md
index ec19cb63..0caeb744 100755
--- a/config/sounds/speechcons/README.md
+++ b/config/sounds/speechcons/README.md
@@ -1,4 +1,3 @@
-
@@ -28,7 +27,6 @@ Speechcon/SSML-friendly sound snippets sprinkled into the speech engine for vari
- Use sparingly; novelty wears off fast if played too often.
- Keep filenames aligned with the SSML tags you reference.
-
**All of my configuration files are tested against the most stable version of home-assistant.**
diff --git a/config/www/custom_ui/floorplan/images/branding/README.md b/config/www/custom_ui/floorplan/images/branding/README.md
index f7b1c337..b40d3c44 100755
--- a/config/www/custom_ui/floorplan/images/branding/README.md
+++ b/config/www/custom_ui/floorplan/images/branding/README.md
@@ -1,60 +1,42 @@
-
+
Bear Stone Smart Home Documentation
Be sure to :star: my configuration repo so you can keep up to date on any daily progress!
+
[](https://x.com/ccostan)
[](https://www.youtube.com/vCloudInfo?sub_confirmation=1)
-[](https://github.com/CCOSTAN)
+[](https://github.com/CCOSTAN)
[](https://github.com/CCOSTAN/Home-AssistantConfig/blob/master/config/.HA_VERSION)
-
-
-
-
+[](https://github.com/CCOSTAN/Home-AssistantConfig/commits/master)
+[](https://github.com/CCOSTAN/Home-AssistantConfig/commits/master)
+
-

-
-
+
+Branding assets used across dashboards, floorplan, and documentation (logos, badges, and helper images).
+
+### Quick navigation
+- You are here: `config/www/custom_ui/floorplan/images/branding/`
+- [Repo overview](../../../../../../README.md) | [Config index](../../../../../../config/README.md) | [Dashboards](../../../../../../config/dashboards/README.md)
+
+### Notes
+- These are static images referenced by Lovelace/floorplan YAML and various READMEs.
+- Keep filenames stable to avoid breaking links in older posts and docs.
+
+**All of my configuration files are tested against the most stable version of home-assistant.**

**Still have questions on my Config?**
**Message me on X :** [](https://www.x.com/ccostan)
-
-

.
-
+
+
+
You can buy me a coffee
+
+
+
+Affiliate Disclosure
+
From 247741ac12c105ee98ef8656af391727b658b101 Mon Sep 17 00:00:00 2001
From: Carlo Costanzo
Date: Sun, 8 Feb 2026 16:50:26 -0500
Subject: [PATCH 3/4] Enhance dashboard configurations by updating card styles
to use `var(--divider-color)` for borders, improving consistency across
various YAML files. Remove deprecated Pi-hole card section and streamline
infrastructure views by including top chip sections for better organization.
Update README to clarify Lovelace resource loading and migration notes.
---
.../homeassistant/motion_light.yaml | 58 ++
.../homeassistant/notify_leaving_zone.yaml | 50 ++
.../confirmable_notification.yaml | 86 +++
config/dashboards/README.md | 3 +
.../infrastructure/card_mod/infra_card.yaml | 2 +-
.../infrastructure/card_mod/infra_panel.yaml | 2 +-
.../partials/activity_sections.yaml | 31 +
.../partials/docker_containers_sections.yaml | 86 +--
.../partials/home_sections.yaml | 339 +++++----
.../partials/infra_top_chips_section.yaml | 41 ++
.../partials/mariadb_sections.yaml | 59 +-
.../partials/proxmox_sections.yaml | 76 +-
.../partials/vacuum_sections.yaml | 683 +++++++++---------
.../templates/button_card_templates.yaml | 124 +++-
.../infrastructure/views/01_home.yaml | 1 +
.../infrastructure/views/02_proxmox.yaml | 1 +
.../infrastructure/views/04_vacuum.yaml | 3 +-
.../views/05_activity_feed.yaml | 8 +-
.../infrastructure/views/06_mariadb.yaml | 4 +-
.../views/07_docker_containers.yaml | 1 +
config/dashboards/overview/dashboard.yaml | 2 +-
config/dashboards/resources.yaml | 1 +
.../resources.yaml} | 12 +-
.../03_pi_hole.yaml => ui-lovelace.yaml} | 14 +-
tools/ha_ui_smoke.ps1 | 69 ++
25 files changed, 1129 insertions(+), 627 deletions(-)
create mode 100644 config/blueprints/automation/homeassistant/motion_light.yaml
create mode 100644 config/blueprints/automation/homeassistant/notify_leaving_zone.yaml
create mode 100644 config/blueprints/script/homeassistant/confirmable_notification.yaml
create mode 100644 config/dashboards/infrastructure/partials/activity_sections.yaml
create mode 100644 config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
rename config/{dashboards/infrastructure/partials/pi_hole_cards.yaml => lovelace/resources.yaml} (58%)
rename config/{dashboards/infrastructure/views/03_pi_hole.yaml => ui-lovelace.yaml} (54%)
create mode 100644 tools/ha_ui_smoke.ps1
diff --git a/config/blueprints/automation/homeassistant/motion_light.yaml b/config/blueprints/automation/homeassistant/motion_light.yaml
new file mode 100644
index 00000000..11900708
--- /dev/null
+++ b/config/blueprints/automation/homeassistant/motion_light.yaml
@@ -0,0 +1,58 @@
+blueprint:
+ name: Motion-activated Light
+ description: Turn on a light when motion is detected.
+ domain: automation
+ source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml
+ author: Home Assistant
+ input:
+ motion_entity:
+ name: Motion Sensor
+ selector:
+ entity:
+ filter:
+ - device_class: occupancy
+ domain: binary_sensor
+ - device_class: motion
+ domain: binary_sensor
+ light_target:
+ name: Light
+ selector:
+ target:
+ entity:
+ domain: light
+ no_motion_wait:
+ name: Wait time
+ description: Time to leave the light on after last motion is detected.
+ default: 120
+ selector:
+ number:
+ min: 0
+ max: 3600
+ unit_of_measurement: seconds
+
+# If motion is detected within the delay,
+# we restart the script.
+mode: restart
+max_exceeded: silent
+
+triggers:
+ trigger: state
+ entity_id: !input motion_entity
+ from: "off"
+ to: "on"
+
+actions:
+ - alias: "Turn on the light"
+ action: light.turn_on
+ target: !input light_target
+ - alias: "Wait until there is no motion from device"
+ wait_for_trigger:
+ trigger: state
+ entity_id: !input motion_entity
+ from: "on"
+ to: "off"
+ - alias: "Wait the number of seconds that has been set"
+ delay: !input no_motion_wait
+ - alias: "Turn off the light"
+ action: light.turn_off
+ target: !input light_target
diff --git a/config/blueprints/automation/homeassistant/notify_leaving_zone.yaml b/config/blueprints/automation/homeassistant/notify_leaving_zone.yaml
new file mode 100644
index 00000000..e072aad2
--- /dev/null
+++ b/config/blueprints/automation/homeassistant/notify_leaving_zone.yaml
@@ -0,0 +1,50 @@
+blueprint:
+ name: Zone Notification
+ description: Send a notification to a device when a person leaves a specific zone.
+ domain: automation
+ source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/notify_leaving_zone.yaml
+ author: Home Assistant
+ input:
+ person_entity:
+ name: Person
+ selector:
+ entity:
+ filter:
+ domain: person
+ zone_entity:
+ name: Zone
+ selector:
+ entity:
+ filter:
+ domain: zone
+ notify_device:
+ name: Device to notify
+ description: Device needs to run the official Home Assistant app to receive notifications.
+ selector:
+ device:
+ filter:
+ integration: mobile_app
+
+triggers:
+ trigger: state
+ entity_id: !input person_entity
+
+variables:
+ zone_entity: !input zone_entity
+ # This is the state of the person when it's in this zone.
+ zone_state: "{{ states[zone_entity].name }}"
+ person_entity: !input person_entity
+ person_name: "{{ states[person_entity].name }}"
+
+conditions:
+ condition: template
+ # The first case handles leaving the Home zone which has a special state when zoning called 'home'.
+ # The second case handles leaving all other zones.
+ value_template: "{{ zone_entity == 'zone.home' and trigger.from_state.state == 'home' and trigger.to_state.state != 'home' or trigger.from_state.state == zone_state and trigger.to_state.state != zone_state }}"
+
+actions:
+ - alias: "Notify that a person has left the zone"
+ domain: mobile_app
+ type: notify
+ device_id: !input notify_device
+ message: "{{ person_name }} has left {{ zone_state }}"
diff --git a/config/blueprints/script/homeassistant/confirmable_notification.yaml b/config/blueprints/script/homeassistant/confirmable_notification.yaml
new file mode 100644
index 00000000..0106a4e1
--- /dev/null
+++ b/config/blueprints/script/homeassistant/confirmable_notification.yaml
@@ -0,0 +1,86 @@
+blueprint:
+ name: Confirmable Notification
+ description: >-
+ A script that sends an actionable notification with a confirmation before
+ running the specified action.
+ domain: script
+ source_url: https://github.com/home-assistant/core/blob/master/homeassistant/components/script/blueprints/confirmable_notification.yaml
+ author: Home Assistant
+ input:
+ notify_device:
+ name: Device to notify
+ description: Device needs to run the official Home Assistant app to receive notifications.
+ selector:
+ device:
+ filter:
+ integration: mobile_app
+ title:
+ name: "Title"
+ description: "The title of the button shown in the notification."
+ default: ""
+ selector:
+ text:
+ message:
+ name: "Message"
+ description: "The message body"
+ selector:
+ text:
+ confirm_text:
+ name: "Confirmation Text"
+ description: "Text to show on the confirmation button"
+ default: "Confirm"
+ selector:
+ text:
+ confirm_action:
+ name: "Confirmation Action"
+ description: "Action to run when notification is confirmed"
+ default: []
+ selector:
+ action:
+ dismiss_text:
+ name: "Dismiss Text"
+ description: "Text to show on the dismiss button"
+ default: "Dismiss"
+ selector:
+ text:
+ dismiss_action:
+ name: "Dismiss Action"
+ description: "Action to run when notification is dismissed"
+ default: []
+ selector:
+ action:
+
+mode: restart
+
+sequence:
+ - alias: "Set up variables"
+ variables:
+ action_confirm: "{{ 'CONFIRM_' ~ context.id }}"
+ action_dismiss: "{{ 'DISMISS_' ~ context.id }}"
+ - alias: "Send notification"
+ domain: mobile_app
+ type: notify
+ device_id: !input notify_device
+ title: !input title
+ message: !input message
+ data:
+ actions:
+ - action: "{{ action_confirm }}"
+ title: !input confirm_text
+ - action: "{{ action_dismiss }}"
+ title: !input dismiss_text
+ - alias: "Awaiting response"
+ wait_for_trigger:
+ - trigger: event
+ event_type: mobile_app_notification_action
+ event_data:
+ action: "{{ action_confirm }}"
+ - trigger: event
+ event_type: mobile_app_notification_action
+ event_data:
+ action: "{{ action_dismiss }}"
+ - choose:
+ - conditions: "{{ wait.trigger.event.data.action == action_confirm }}"
+ sequence: !input confirm_action
+ - conditions: "{{ wait.trigger.event.data.action == action_dismiss }}"
+ sequence: !input dismiss_action
diff --git a/config/dashboards/README.md b/config/dashboards/README.md
index 208ecc1c..19b964b1 100644
--- a/config/dashboards/README.md
+++ b/config/dashboards/README.md
@@ -48,6 +48,9 @@ This folder is referenced from `config/configuration.yaml` via:
- `lovelace.resources: !include dashboards/resources.yaml`
- `lovelace.dashboards: ... filename: dashboards//dashboard.yaml`
+Lovelace resources are loaded from:
+- `config/dashboards/resources.yaml` (referenced by `lovelace.resources`)
+
### Migration / Cutover Notes
- During migration you may have both storage dashboards (from the UI) and YAML dashboards (from this folder) at the same time.
- Do not try to create YAML dashboards with the same dashboard ID/key as an existing storage dashboard; remove/disable the storage version first in the UI.
diff --git a/config/dashboards/infrastructure/card_mod/infra_card.yaml b/config/dashboards/infrastructure/card_mod/infra_card.yaml
index 66beb975..dc5407b6 100644
--- a/config/dashboards/infrastructure/card_mod/infra_card.yaml
+++ b/config/dashboards/infrastructure/card_mod/infra_card.yaml
@@ -12,6 +12,6 @@
|
ha-card {
border-radius: 18px;
- border: 1px solid rgba(0,0,0,0.06);
+ border: 1px solid var(--divider-color);
box-shadow: none;
}
diff --git a/config/dashboards/infrastructure/card_mod/infra_panel.yaml b/config/dashboards/infrastructure/card_mod/infra_panel.yaml
index f779b063..f0f6bfcb 100644
--- a/config/dashboards/infrastructure/card_mod/infra_panel.yaml
+++ b/config/dashboards/infrastructure/card_mod/infra_panel.yaml
@@ -12,7 +12,7 @@
|
ha-card {
border-radius: 18px;
- border: 1px solid rgba(0,0,0,0.06);
+ border: 1px solid var(--divider-color);
box-shadow: none;
padding: 12px;
}
diff --git a/config/dashboards/infrastructure/partials/activity_sections.yaml b/config/dashboards/infrastructure/partials/activity_sections.yaml
new file mode 100644
index 00000000..c61bf413
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/activity_sections.yaml
@@ -0,0 +1,31 @@
+######################################################################
+# @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 - Activity sections
+# Activity feed wrapped in the standard Infrastructure layout.
+# -------------------------------------------------------------------
+# Notes: Uses Logbook card targeted at `sensor.activity_feed`.
+######################################################################
+
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
+
+- type: grid
+ column_span: 4
+ columns: 1
+ square: false
+ 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: Activity Feed
+ - type: logbook
+ target:
+ entity_id:
+ - sensor.activity_feed
+ grid_options:
+ columns: full
diff --git a/config/dashboards/infrastructure/partials/docker_containers_sections.yaml b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml
index 7d4b4b8c..f53196f4 100644
--- a/config/dashboards/infrastructure/partials/docker_containers_sections.yaml
+++ b/config/dashboards/infrastructure/partials/docker_containers_sections.yaml
@@ -9,74 +9,32 @@
# Notes: Uses Portainer entities (`binary_sensor.*_status`, `button.*_restart_container`).
######################################################################
-- type: grid
- column_span: 4
- columns: 4
- square: false
- cards:
- - type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox1_updates_packages
- name: Proxmox01
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
- - type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox02_updates_packages
- name: Proxmox02
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
- - type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.garage_ups_status
- name: Garage UPS
- icon: mdi:transmission-tower
- - type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.vcloudinfo_com
- name: vCloudinfo
- icon: mdi:microsoft-internet-explorer
-
-- type: grid
- column_span: 4
- columns: 1
- square: false
- cards:
- - type: custom:auto-entities
- show_empty: true
- grid_options:
- columns: full
- card:
- type: grid
- title: Docker Containers
- columns: 4
- square: false
- card_param: cards
- filter:
- include: !include /config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
- exclude:
- - state: unavailable
- sort:
- method: name
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
- type: grid
column_span: 4
columns: 1
square: false
cards:
- - type: markdown
- grid_options:
- columns: full
- content: |-
- **Tip:** Hold a container row to restart it (confirmation required).
+ - type: custom:vertical-stack-in-card
card_mod:
- style: |
- ha-card {
- background: transparent;
- border: none;
- box-shadow: none;
- text-align: center;
- color: var(--secondary-text-color);
- }
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
+ name: Docker Containers
+ - type: custom:auto-entities
+ show_empty: true
+ grid_options:
+ columns: full
+ card:
+ type: grid
+ columns: 4
+ square: false
+ card_param: cards
+ filter:
+ include: !include /config/dashboards/infrastructure/partials/docker_container_rows_include.yaml
+ exclude:
+ - state: unavailable
+ sort:
+ method: name
diff --git a/config/dashboards/infrastructure/partials/home_sections.yaml b/config/dashboards/infrastructure/partials/home_sections.yaml
index 09b7402f..cc2aec81 100644
--- a/config/dashboards/infrastructure/partials/home_sections.yaml
+++ b/config/dashboards/infrastructure/partials/home_sections.yaml
@@ -9,45 +9,48 @@
# Notes: Standardized on `custom:button-card` + `custom:mini-graph-card` with `card_mod` polish.
######################################################################
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
+
- type: grid
column_span: 4
columns: 4
square: false
cards:
- type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox1_updates_packages
- name: Proxmox01
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ template: bearstone_infra_kpi
+ entity: sensor.total_wifi_clients
+ name: Wi-Fi Clients
+ icon: mdi:wifi
- type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox02_updates_packages
- name: Proxmox02
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ template: bearstone_infra_kpi
+ entity: sensor.garage_ups_load
+ name: UPS Load
+ icon: mdi:battery-charging-60
- type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.garage_ups_status
- name: Garage UPS
- icon: mdi:transmission-tower
+ template: bearstone_infra_kpi
+ entity: sensor.carlo_nvr_volume_1_volume_used
+ name: NVR Used
+ icon: mdi:harddisk
- type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.vcloudinfo_com
- name: vCloudinfo
- icon: mdi:microsoft-internet-explorer
+ template: bearstone_infra_kpi
+ entity: sensor.carlo_nas01_volume_1_volume_used
+ name: NAS Used
+ icon: mdi:nas
- type: grid
column_span: 3
- columns: 2
+ columns: 3
square: false
cards:
- - type: vertical-stack
+ - type: custom:vertical-stack-in-card
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- - type: custom:mini-graph-card
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
name: Proxmox01
+ - type: custom:mini-graph-card
+ name: CPU / Memory
icon: mdi:server
hours_to_show: 24
points_per_hour: 2
@@ -55,7 +58,7 @@
animate: true
show:
fill: true
- legend: true
+ legend: false
icon: true
name: true
state: true
@@ -64,8 +67,6 @@
name: CPU
- entity: sensor.node_proxmox1_memory_used_percentage
name: Memory
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type: grid
columns: 3
square: false
@@ -101,10 +102,15 @@
button_entity: button.qemu_wireguard_104_reboot
name: WireGuard
- - type: vertical-stack
+ - type: custom:vertical-stack-in-card
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- - type: custom:mini-graph-card
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
name: Proxmox02
+ - type: custom:mini-graph-card
+ name: CPU / Memory
icon: mdi:server
hours_to_show: 24
points_per_hour: 2
@@ -112,7 +118,7 @@
animate: true
show:
fill: true
- legend: true
+ legend: false
icon: true
name: true
state: true
@@ -121,10 +127,8 @@
name: CPU
- entity: sensor.node_proxmox02_memory_used_percentage
name: Memory
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type: grid
- columns: 3
+ columns: 1
square: false
cards:
- type: custom:button-card
@@ -138,9 +142,21 @@
button_entity: button.qemu_docker2_101_reboot
name: Frigate
+ - 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: Pi-hole
+ - type: custom:pi-hole
+ device_id: d69637da16f7d7f3626070582be59808
+ grid_options:
+ columns: full
+
- type: grid
- column_span: 1
- columns: 1
+ column_span: 4
+ columns: 4
square: false
cards:
- type: custom:mini-graph-card
@@ -186,22 +202,37 @@
graph: line
card_mod:
style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
-
-- type: grid
- column_span: 2
- columns: 2
- square: true
- cards:
- type: custom:flex-horseshoe-card
entities:
- entity: sensor.carlo_nvr_volume_1_volume_used
- name: NVR Video
+ name: NVR Used
decimals: 1
unit: '%'
- entity: sensor.carlo_nvr_volume_1_total_size
name: Total
decimals: 2
unit: TiB
+ layout:
+ names:
+ - entity_index: 0
+ xpos: 50
+ ypos: 22
+ styles:
+ - font-size: 0.9em;
+ - opacity: 0.75;
+ states:
+ - entity_index: 0
+ xpos: 50
+ ypos: 54
+ styles:
+ - font-size: 2.2em;
+ - font-weight: 800;
+ - entity_index: 1
+ xpos: 50
+ ypos: 76
+ styles:
+ - font-size: 0.95em;
+ - opacity: 0.75;
show:
horseshoe_style: colorstopgradient
horseshoe_scale:
@@ -216,13 +247,34 @@
- type: custom:flex-horseshoe-card
entities:
- entity: sensor.carlo_nas01_volume_1_volume_used
- name: NAS Storage
+ name: NAS Used
decimals: 1
unit: '%'
- entity: sensor.carlo_nas01_volume_1_total_size
name: Total
decimals: 2
unit: TiB
+ layout:
+ names:
+ - entity_index: 0
+ xpos: 50
+ ypos: 22
+ styles:
+ - font-size: 0.9em;
+ - opacity: 0.75;
+ states:
+ - entity_index: 0
+ xpos: 50
+ ypos: 54
+ styles:
+ - font-size: 2.2em;
+ - font-weight: 800;
+ - entity_index: 1
+ xpos: 50
+ ypos: 76
+ styles:
+ - font-size: 0.95em;
+ - opacity: 0.75;
show:
horseshoe_style: colorstopgradient
horseshoe_scale:
@@ -235,105 +287,114 @@
card_mod:
style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
-- type: grid
- column_span: 2
- columns: 1
- square: false
- cards:
- - type: custom:mini-graph-card
- name: Wi-Fi Overview
- icon: mdi:wifi
- hours_to_show: 24
- line_width: 2
- points_per_hour: 1
- smoothing: true
- show:
- graph: line
- legend: true
- labels: false
- name: true
- icon: true
- state: true
- entities:
- - entity: sensor.total_wifi_clients
- name: Total
- show_state: true
- show_graph: false
- show_line: false
- show_points: false
- show_fill: false
- show_legend: false
- - entity: sensor.unifi_ap_office_clients
- name: Office AP
- show_state: true
- - entity: sensor.unifi_ap_study_clients
- name: Study AP
- show_state: true
- - entity: sensor.unifi_ap_garage_clients
- name: Garage AP
- show_state: true
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
-
- type: grid
column_span: 4
- columns: 3
+ columns: 2
square: false
cards:
- - type: custom:button-card
- template: bearstone_infra_device_tile
- name: Garage AP
- icon: mdi:access-point
- entity: sensor.unifi_ap_garage_clients
- label: >
- [[[ return "Uptime: " + (states['sensor.unifi_ap_garage_uptime']?.state ?? 'unknown'); ]]]
- variables:
- button_entity: button.unifi_ap_garage_restart
- name: Garage AP
- - type: custom:button-card
- template: bearstone_infra_device_tile
- name: Office AP
- icon: mdi:access-point
- entity: sensor.unifi_ap_office_clients
- label: >
- [[[ return "Uptime: " + (states['sensor.unifi_ap_office_uptime']?.state ?? 'unknown'); ]]]
- variables:
- button_entity: button.unifi_ap_office_restart
- name: Office AP
- - type: custom:button-card
- template: bearstone_infra_device_tile
- name: Study AP
- icon: mdi:access-point
- entity: sensor.unifi_ap_study_clients
- label: >
- [[[ return "Uptime: " + (states['sensor.unifi_ap_study_uptime']?.state ?? 'unknown'); ]]]
- variables:
- button_entity: button.unifi_ap_study_restart
- name: Study AP
+ - 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: Wi-Fi Overview
+ - type: custom:mini-graph-card
+ name: Clients
+ icon: mdi:wifi
+ hours_to_show: 24
+ line_width: 2
+ points_per_hour: 1
+ smoothing: true
+ show:
+ graph: line
+ legend: false
+ labels: false
+ name: true
+ icon: true
+ state: true
+ entities:
+ - entity: sensor.total_wifi_clients
+ name: Total
+ show_state: true
+ show_graph: false
+ show_line: false
+ show_points: false
+ show_fill: false
+ show_legend: false
+ - entity: sensor.unifi_ap_office_clients
+ name: Office AP
+ show_state: true
+ - entity: sensor.unifi_ap_study_clients
+ name: Study AP
+ show_state: true
+ - entity: sensor.unifi_ap_garage_clients
+ name: Garage AP
+ show_state: true
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Garage AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_garage_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_garage_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_garage_restart
+ name: Garage AP
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Office AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_office_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_office_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_office_restart
+ name: Office AP
+ - type: custom:button-card
+ template: bearstone_infra_device_tile
+ name: Study AP
+ icon: mdi:access-point
+ entity: sensor.unifi_ap_study_clients
+ label: >
+ [[[ return "Uptime: " + (states['sensor.unifi_ap_study_uptime']?.state ?? 'unknown'); ]]]
+ variables:
+ button_entity: button.unifi_ap_study_restart
+ name: Study AP
-- type: grid
- column_span: 4
- columns: 3
- square: false
- cards:
- - type: custom:button-card
- template: bearstone_infra_tile
- name: docker_10
- icon: mdi:server
- entity: sensor.docker_10_apt_status
- label: >
- [[[ return "Last update: " + (states['sensor.docker_10_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_10_apt_reboot_status']?.state ?? ''); ]]]
- - type: custom:button-card
- template: bearstone_infra_tile
- name: docker_69
- icon: mdi:server
- entity: sensor.docker_69_apt_status
- label: >
- [[[ return "Last update: " + (states['sensor.docker_69_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_69_apt_reboot_status']?.state ?? ''); ]]]
- - type: custom:button-card
- template: bearstone_infra_tile
- name: docker_14
- icon: mdi:server
- entity: sensor.docker_14_apt_status
- label: >
- [[[ return "Last update: " + (states['sensor.docker_14_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_14_apt_reboot_status']?.state ?? ''); ]]]
+ - 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: APT Status
+ - type: grid
+ columns: 3
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_10
+ icon: mdi:server
+ entity: sensor.docker_10_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_10_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_10_apt_reboot_status']?.state ?? ''); ]]]
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_69
+ icon: mdi:server
+ entity: sensor.docker_69_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_69_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_69_apt_reboot_status']?.state ?? ''); ]]]
+ - type: custom:button-card
+ template: bearstone_infra_tile
+ name: docker_14
+ icon: mdi:server
+ entity: sensor.docker_14_apt_status
+ label: >
+ [[[ return "Last update: " + (states['sensor.docker_14_apt_last_update']?.state ?? 'unknown') + " | " + (states['sensor.docker_14_apt_reboot_status']?.state ?? ''); ]]]
diff --git a/config/dashboards/infrastructure/partials/infra_top_chips_section.yaml b/config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
new file mode 100644
index 00000000..a3175442
--- /dev/null
+++ b/config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
@@ -0,0 +1,41 @@
+######################################################################
+# @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 - Top status chips (shared)
+# Common "chips row" used across Infrastructure views.
+# -------------------------------------------------------------------
+# Notes: Keep this lightweight; it should render fast on every view.
+######################################################################
+
+type: grid
+column_span: 4
+columns: 4
+square: false
+cards:
+- type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox1_updates_packages
+ name: Proxmox01
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+- type: custom:button-card
+ template: bearstone_infra_chip
+ entity: binary_sensor.node_proxmox02_updates_packages
+ name: Proxmox02
+ icon: mdi:server
+ state_display: >
+ [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+- type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.garage_ups_status
+ name: Garage UPS
+ icon: mdi:transmission-tower
+- type: custom:button-card
+ template: bearstone_infra_chip
+ entity: sensor.vcloudinfo_com
+ name: vCloudinfo
+ icon: mdi:microsoft-internet-explorer
+
diff --git a/config/dashboards/infrastructure/partials/mariadb_sections.yaml b/config/dashboards/infrastructure/partials/mariadb_sections.yaml
index d749f138..f7cf94a2 100644
--- a/config/dashboards/infrastructure/partials/mariadb_sections.yaml
+++ b/config/dashboards/infrastructure/partials/mariadb_sections.yaml
@@ -6,10 +6,41 @@
# Infrastructure Partial - mariadb sections
# Reusable list extracted from a view for smaller diffs and safer edits.
# -------------------------------------------------------------------
-# Notes: Stitch-inspired MariaDB layout (3 panel columns).
+# Notes: Stitch-inspired MariaDB layout (KPI strip + 3 panel columns).
######################################################################
-- column_span: 1
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
+
+- type: grid
+ column_span: 4
+ columns: 4
+ square: false
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.database_size
+ name: DB Size
+ icon: mdi:database
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.database_tables_count
+ name: Tables
+ icon: mdi:table
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_connections
+ name: Conn.
+ icon: mdi:lan-connect
+ - type: custom:button-card
+ template: bearstone_infra_kpi
+ entity: sensor.mariadb_uptime
+ name: Uptime
+ icon: mdi:timer-outline
+
+- type: grid
+ column_span: 4
+ columns: 3
+ square: false
cards:
- type: custom:vertical-stack-in-card
card_mod:
@@ -18,16 +49,6 @@
- type: custom:button-card
template: bearstone_infra_panel_header
name: Database Statistics
- - type: custom:button-card
- template: bearstone_infra_list_row
- entity: sensor.database_size
- name: Database Size
- icon: mdi:database
- - type: custom:button-card
- template: bearstone_infra_list_row
- entity: sensor.database_tables_count
- name: Number of Tables
- icon: mdi:table
- type: custom:button-card
template: bearstone_infra_list_row
entity: sensor.database_total_records
@@ -44,8 +65,6 @@
name: Oldest Record
icon: mdi:clock-start
-- column_span: 1
- cards:
- type: custom:vertical-stack-in-card
card_mod:
style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
@@ -73,24 +92,12 @@
entity: sensor.mariadb_performance
name: Performance
icon: mdi:chart-line
- - type: custom:button-card
- template: bearstone_infra_list_row
- entity: sensor.mariadb_uptime
- name: Uptime
- icon: mdi:timer-outline
- - type: custom:button-card
- template: bearstone_infra_list_row
- entity: sensor.mariadb_connections
- name: Active Connections
- icon: mdi:lan-connect
- type: custom:button-card
template: bearstone_infra_list_row
entity: sensor.mariadb_questions
name: Total Queries
icon: mdi:database-search
-- column_span: 1
- cards:
- type: custom:vertical-stack-in-card
card_mod:
style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
diff --git a/config/dashboards/infrastructure/partials/proxmox_sections.yaml b/config/dashboards/infrastructure/partials/proxmox_sections.yaml
index ae4a2fc5..a3d098b8 100644
--- a/config/dashboards/infrastructure/partials/proxmox_sections.yaml
+++ b/config/dashboards/infrastructure/partials/proxmox_sections.yaml
@@ -9,45 +9,48 @@
# Notes: Standardized on `custom:button-card` + `custom:mini-graph-card` with `card_mod` polish.
######################################################################
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
+
- type: grid
column_span: 4
columns: 4
square: false
cards:
- type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox1_updates_packages
- name: Proxmox01
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ template: bearstone_infra_kpi
+ entity: sensor.node_proxmox1_cpu_used
+ name: P1 CPU
+ icon: mdi:cpu-64-bit
- type: custom:button-card
- template: bearstone_infra_chip
- entity: binary_sensor.node_proxmox02_updates_packages
- name: Proxmox02
- icon: mdi:server
- state_display: >
- [[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
+ template: bearstone_infra_kpi
+ entity: sensor.node_proxmox1_memory_used_percentage
+ name: P1 MEM
+ icon: mdi:memory
- type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.garage_ups_status
- name: Garage UPS
- icon: mdi:transmission-tower
+ template: bearstone_infra_kpi
+ entity: sensor.node_proxmox02_cpu_used
+ name: P2 CPU
+ icon: mdi:cpu-64-bit
- type: custom:button-card
- template: bearstone_infra_chip
- entity: sensor.vcloudinfo_com
- name: vCloudinfo
- icon: mdi:microsoft-internet-explorer
+ template: bearstone_infra_kpi
+ entity: sensor.node_proxmox02_memory_used_percentage
+ name: P2 MEM
+ icon: mdi:memory
- type: grid
column_span: 4
columns: 2
square: false
cards:
- - type: vertical-stack
+ - type: custom:vertical-stack-in-card
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- - type: custom:mini-graph-card
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
name: Proxmox01
+ - type: custom:mini-graph-card
+ name: Host CPU / Memory
icon: mdi:server
hours_to_show: 24
points_per_hour: 2
@@ -55,7 +58,7 @@
animate: true
show:
fill: true
- legend: true
+ legend: false
icon: true
name: true
state: true
@@ -64,10 +67,8 @@
name: CPU
- entity: sensor.node_proxmox1_memory_used_percentage
name: Memory
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type: custom:mini-graph-card
- name: Proxmox01 VMs (CPU / MEM)
+ name: VMs CPU / Memory
icon: mdi:chart-line
hours_to_show: 24
points_per_hour: 2
@@ -75,7 +76,7 @@
animate: true
show:
fill: false
- legend: true
+ legend: false
icon: true
name: true
state: false
@@ -92,8 +93,6 @@
name: WireGuard CPU
- entity: sensor.qemu_wireguard_104_memory_used_percentage
name: WireGuard MEM
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type: grid
columns: 3
square: false
@@ -129,10 +128,15 @@
button_entity: button.qemu_wireguard_104_reboot
name: WireGuard
- - type: vertical-stack
+ - type: custom:vertical-stack-in-card
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- - type: custom:mini-graph-card
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
name: Proxmox02
+ - type: custom:mini-graph-card
+ name: Host CPU / Memory
icon: mdi:server
hours_to_show: 24
points_per_hour: 2
@@ -140,7 +144,7 @@
animate: true
show:
fill: true
- legend: true
+ legend: false
icon: true
name: true
state: true
@@ -149,10 +153,8 @@
name: CPU
- 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: Frigate VM (CPU / MEM)
+ name: Frigate VM CPU / Memory
icon: mdi:video
hours_to_show: 24
points_per_hour: 2
@@ -160,7 +162,7 @@
animate: true
show:
fill: false
- legend: true
+ legend: false
icon: true
name: true
state: false
@@ -169,8 +171,6 @@
name: CPU
- entity: sensor.qemu_docker2_101_memory_used_percentage
name: MEM
- card_mod:
- style: !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type: grid
columns: 3
square: false
diff --git a/config/dashboards/infrastructure/partials/vacuum_sections.yaml b/config/dashboards/infrastructure/partials/vacuum_sections.yaml
index eda04a2d..36e48c2a 100644
--- a/config/dashboards/infrastructure/partials/vacuum_sections.yaml
+++ b/config/dashboards/infrastructure/partials/vacuum_sections.yaml
@@ -6,339 +6,362 @@
# Infrastructure Partial - vacuum sections
# Reusable list extracted from a view for smaller diffs and safer edits.
# -------------------------------------------------------------------
-# Notes: Extracted from config/dashboards/infrastructure/views/03_vacuum.yaml key `sections`.
+# Notes: Extracted from config/dashboards/infrastructure/views/04_vacuum.yaml key `sections`.
######################################################################
+- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
+
- type: grid
+ column_span: 4
+ columns: 4
+ square: false
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
+ - type: custom:vertical-stack-in-card
grid_options:
- columns: full
- - type: tile
+ columns: 2
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
+ name: Vacuum
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: vacuum.l10s_vacuum
+ name: L10s
+ icon: mdi:robot-vacuum
+ state_display: >
+ [[[ return String(entity.state || 'unknown').toUpperCase(); ]]]
+ - type: tile
+ entity: input_select.l10s_vacuum_phase
+ vertical: false
+ features_position: bottom
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: sensor.l10s_vacuum_current_room
+ name: Current Room
+ icon: mdi:map-marker
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: input_text.l10s_vacuum_rooms_cleaned_today
+ name: Rooms Cleaned (Today)
+ icon: mdi:check-circle-outline
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: input_text.l10s_vacuum_room_queue
+ name: Room Queue
+ icon: mdi:format-list-bulleted
+ - type: custom:button-card
+ template: bearstone_infra_list_row
+ entity: input_text.l10s_vacuum_room_catalog
+ name: Room Catalog
+ icon: mdi:book-open-variant
+
+ - type: custom:vertical-stack-in-card
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: 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
+ columns: 2
+ card_mod:
+ style: !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
+ cards:
+ - type: custom:button-card
+ template: bearstone_infra_panel_header
+ name: Map
+ - type: custom:xiaomi-vacuum-map-card
+ map_source:
+ camera: camera.l10s_vacuum_map
+ calibration_source:
+ camera: true
+ entity: vacuum.l10s_vacuum
+ vacuum_platform: Tasshack/dreame-vacuum
+ map_modes:
+ - template: vacuum_clean_zone
+ - template: vacuum_clean_point
+ - template: vacuum_clean_segment
+ predefined_selections:
+ - id: '1'
+ icon:
+ name: mdi:home-outline
+ x: -8100
+ y: 12400
+ label:
+ text: Pool-Bath
+ x: -8100
+ y: 12400
+ offset_y: 35
+ outline:
+ - - -9950
+ - 11350
+ - - -6650
+ - 11350
+ - - -6650
+ - 12900
+ - - -9950
+ - 12900
+ - id: '2'
+ icon:
+ name: mdi:monitor-shimmer
+ x: -4650
+ y: 10900
+ label:
+ text: Office
+ x: -4650
+ y: 10900
+ offset_y: 35
+ outline:
+ - - -6650
+ - 7400
+ - - -2800
+ - 7400
+ - - -2800
+ - 12850
+ - - -6650
+ - 12850
+ - id: '3'
+ icon:
+ name: mdi:home-outline
+ x: -5600
+ y: 5250
+ label:
+ text: Kids-Bathroom
+ x: -5600
+ y: 5250
+ offset_y: 35
+ outline:
+ - - -6450
+ - 4250
+ - - -4750
+ - 4250
+ - - -4750
+ - 6150
+ - - -6450
+ - 6150
+ - id: '4'
+ icon:
+ name: mdi:home-outline
+ x: 7300
+ y: 4100
+ label:
+ text: Master-Bathroom
+ x: 7300
+ y: 4100
+ offset_y: 35
+ outline:
+ - - 5450
+ - 250
+ - - 9400
+ - 250
+ - - 9400
+ - 7850
+ - - 5450
+ - 7850
+ - id: '6'
+ icon:
+ name: mdi:home-outline
+ x: -8450
+ y: 4200
+ label:
+ text: Paige-Bedroom
+ x: -8450
+ y: 4200
+ offset_y: 35
+ outline:
+ - - -9900
+ - 1600
+ - - -6600
+ - 1600
+ - - -6600
+ - 6100
+ - - -9900
+ - 6100
+ - id: '7'
+ icon:
+ name: mdi:home-outline
+ x: 6450
+ y: 10400
+ label:
+ text: Master-Bedroom
+ x: 6450
+ y: 10400
+ offset_y: 35
+ outline:
+ - - 3450
+ - 7850
+ - - 9550
+ - 7850
+ - - 9550
+ - 12850
+ - - 3450
+ - 12850
+ - id: '8'
+ icon:
+ name: mdi:home-outline
+ x: -8300
+ y: 9300
+ label:
+ text: Justin-Bedroom
+ x: -8300
+ y: 9300
+ offset_y: 35
+ outline:
+ - - -9950
+ - 6250
+ - - -6650
+ - 6250
+ - - -6650
+ - 11150
+ - - -9950
+ - 11150
+ - id: '9'
+ icon:
+ name: mdi:home-outline
+ x: 7250
+ y: -2200
+ label:
+ text: Stacey-Office
+ x: 7250
+ y: -2200
+ offset_y: 35
+ outline:
+ - - 5450
+ - -4700
+ - - 9450
+ - -4700
+ - - 9450
+ - 350
+ - - 5450
+ - 350
+ - id: '10'
+ icon:
+ name: mdi:sofa-outline
+ x: 2500
+ y: 4800
+ label:
+ text: Living Room
+ x: 2500
+ y: 4800
+ offset_y: 35
+ outline:
+ - - -650
+ - 750
+ - - 5300
+ - 750
+ - - 5300
+ - 8800
+ - - -650
+ - 8800
+ - id: '11'
+ icon:
+ name: mdi:home-outline
+ x: -5350
+ y: 2600
+ label:
+ text: Garage-Hallway
+ x: -5350
+ y: 2600
+ offset_y: 35
+ outline:
+ - - -6600
+ - 1100
+ - - -4050
+ - 1100
+ - - -4050
+ - 4200
+ - - -6600
+ - 4200
+ - id: '12'
+ icon:
+ name: mdi:home-outline
+ x: 700
+ y: 8900
+ label:
+ text: Dining-Room
+ x: 700
+ y: 8900
+ offset_y: 35
+ outline:
+ - - -4350
+ - 6000
+ - - 2650
+ - 6000
+ - - 2650
+ - 12650
+ - - -4350
+ - 12650
+ - id: '13'
+ icon:
+ name: mdi:home-outline
+ x: -6200
+ y: 6800
+ label:
+ text: Hallway
+ x: -6200
+ y: 6800
+ offset_y: 35
+ outline:
+ - - -7550
+ - 6100
+ - - -4350
+ - 6100
+ - - -4350
+ - 7700
+ - - -7550
+ - 7700
+ - id: '14'
+ icon:
+ name: mdi:chef-hat
+ x: -1700
+ y: 3350
+ label:
+ text: Kitchen
+ x: -1700
+ y: 3350
+ offset_y: 35
+ outline:
+ - - -4200
+ - 950
+ - - -300
+ - 950
+ - - -300
+ - 6100
+ - - -4200
+ - 6100
+ - id: '15'
+ icon:
+ name: mdi:home-outline
+ x: 4050
+ y: -1350
+ label:
+ text: Foyer
+ x: 4050
+ y: -1350
+ offset_y: 35
+ outline:
+ - - 2850
+ - -3500
+ - - 5450
+ - -3500
+ - - 5450
+ - 800
+ - - 2850
+ - 800
+ - id: '17'
+ icon:
+ name: mdi:home-outline
+ x: 750
+ y: -1250
+ label:
+ text: Formal-Dining
+ x: 750
+ y: -1250
+ offset_y: 35
+ outline:
+ - - -1500
+ - -3500
+ - - 2950
+ - -3500
+ - - 2950
+ - 950
+ - - -1500
+ - 950
+ map_locked: true
+ two_finger_pan: true
diff --git a/config/dashboards/infrastructure/templates/button_card_templates.yaml b/config/dashboards/infrastructure/templates/button_card_templates.yaml
index 3a2dc973..f9f59c4d 100644
--- a/config/dashboards/infrastructure/templates/button_card_templates.yaml
+++ b/config/dashboards/infrastructure/templates/button_card_templates.yaml
@@ -21,7 +21,7 @@ bearstone_infra_base:
- padding: 14px
- box-shadow: none
- background: var(--ha-card-background, var(--card-background-color))
- - border: 1px solid rgba(0,0,0,0.06)
+ - border: 1px solid var(--divider-color)
- overflow: hidden
grid:
- grid-template-areas: "\"i n\" \"i s\""
@@ -47,10 +47,8 @@ bearstone_infra_chip:
card:
- border-radius: 999px
- padding: 10px 12px
- - border: 1px solid rgba(0,0,0,0.06)
- - background: rgba(255,255,255,0.75)
- - backdrop-filter: blur(6px)
- - -webkit-backdrop-filter: blur(6px)
+ - border: 1px solid var(--divider-color)
+ - background: var(--ha-card-background, var(--card-background-color))
grid:
- grid-template-areas: "\"i n\" \"i s\""
- grid-template-columns: 28px 1fr
@@ -139,8 +137,9 @@ bearstone_infra_device_tile:
- font-weight: 700
bearstone_infra_container_row:
- template: bearstone_infra_list_row_running
+ template: bearstone_infra_list_row
show_label: false
+ show_state: false
tap_action:
action: none
hold_action:
@@ -151,6 +150,117 @@ bearstone_infra_container_row:
confirmation:
text: '[[[ return "Restart container " + entity.attributes.friendly_name + "?" ]]]'
icon: mdi:docker
+ custom_fields:
+ status: >
+ [[[
+ const s = String(entity.state || '').toLowerCase();
+ if (s === 'on' || s === 'running') return 'RUNNING';
+ if (s === 'off' || s === 'stopped') return 'STOPPED';
+ if (s === 'unavailable') return 'OFFLINE';
+ if (s === 'unknown' || s === '') return 'UNKNOWN';
+ return String(entity.state).toUpperCase();
+ ]]]
+ styles:
+ grid:
+ - grid-template-areas: "\"i n status\""
+ - grid-template-columns: 24px 1fr auto
+ - align-items: center
+ - column-gap: 12px
+ name:
+ - min-width: 0
+ - overflow: hidden
+ - text-overflow: ellipsis
+ - white-space: nowrap
+ custom_fields:
+ status:
+ - justify-self: end
+ - align-self: center
+ - font-weight: 900
+ - font-size: 12px
+ - letter-spacing: 0.04em
+ - padding: 4px 10px
+ - border-radius: 999px
+ - background: rgba(0,0,0,0.06)
+ - color: var(--secondary-text-color)
+ - line-height: 1.1
+ state:
+ - value: 'on'
+ styles:
+ card:
+ - border-color: rgba(67,160,71,0.45)
+ - background: rgba(232,245,233,0.85)
+ icon:
+ - color: rgba(46,125,50,1)
+ custom_fields:
+ status:
+ - background: rgba(46,125,50,0.12)
+ - color: rgba(46,125,50,1)
+ - value: 'off'
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+ custom_fields:
+ status:
+ - background: rgba(198,40,40,0.10)
+ - color: rgba(198,40,40,1)
+ - value: Running
+ styles:
+ card:
+ - border-color: rgba(67,160,71,0.45)
+ - background: rgba(232,245,233,0.85)
+ icon:
+ - color: rgba(46,125,50,1)
+ custom_fields:
+ status:
+ - background: rgba(46,125,50,0.12)
+ - color: rgba(46,125,50,1)
+ - value: running
+ styles:
+ card:
+ - border-color: rgba(67,160,71,0.45)
+ - background: rgba(232,245,233,0.85)
+ icon:
+ - color: rgba(46,125,50,1)
+ custom_fields:
+ status:
+ - background: rgba(46,125,50,0.12)
+ - color: rgba(46,125,50,1)
+ - value: Stopped
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+ custom_fields:
+ status:
+ - background: rgba(198,40,40,0.10)
+ - color: rgba(198,40,40,1)
+ - value: stopped
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+ custom_fields:
+ status:
+ - background: rgba(198,40,40,0.10)
+ - color: rgba(198,40,40,1)
+ - value: unavailable
+ styles:
+ card:
+ - border-color: rgba(229,57,53,0.35)
+ - background: rgba(255,235,238,0.85)
+ icon:
+ - color: rgba(198,40,40,1)
+ custom_fields:
+ status:
+ - background: rgba(198,40,40,0.10)
+ - color: rgba(198,40,40,1)
bearstone_infra_panel_header:
show_icon: false
@@ -167,6 +277,8 @@ bearstone_infra_panel_header:
name:
- font-size: 18px
- font-weight: 800
+ - letter-spacing: 0.04em
+ - text-transform: uppercase
- justify-self: start
bearstone_infra_list_row:
diff --git a/config/dashboards/infrastructure/views/01_home.yaml b/config/dashboards/infrastructure/views/01_home.yaml
index d5ea1d7d..7c22b5a0 100644
--- a/config/dashboards/infrastructure/views/01_home.yaml
+++ b/config/dashboards/infrastructure/views/01_home.yaml
@@ -13,6 +13,7 @@ title: Infrastructure
path: home
type: sections
icon: mdi:view-dashboard-variant
+theme: default
max_columns: 4
badges: []
sections: !include /config/dashboards/infrastructure/partials/home_sections.yaml
diff --git a/config/dashboards/infrastructure/views/02_proxmox.yaml b/config/dashboards/infrastructure/views/02_proxmox.yaml
index 90ff8120..e8fd3fe5 100644
--- a/config/dashboards/infrastructure/views/02_proxmox.yaml
+++ b/config/dashboards/infrastructure/views/02_proxmox.yaml
@@ -14,6 +14,7 @@ path: proxmox
cards: []
type: sections
icon: mdi:server
+theme: default
badges: []
sections: !include /config/dashboards/infrastructure/partials/proxmox_sections.yaml
max_columns: 4
diff --git a/config/dashboards/infrastructure/views/04_vacuum.yaml b/config/dashboards/infrastructure/views/04_vacuum.yaml
index bae82707..5f567369 100644
--- a/config/dashboards/infrastructure/views/04_vacuum.yaml
+++ b/config/dashboards/infrastructure/views/04_vacuum.yaml
@@ -11,6 +11,7 @@
title: Vacuum
icon: mdi:robot-vacuum
+theme: default
type: sections
cards: []
visible:
@@ -19,5 +20,5 @@ visible:
- user: 8fc5ba22cb32430a9143beb4df70541b
- user: 19970706e7e4492c844ea2fc94a4599a
sections: !include /config/dashboards/infrastructure/partials/vacuum_sections.yaml
-max_columns: 2
+max_columns: 4
badges: !include /config/dashboards/infrastructure/partials/vacuum_badges.yaml
diff --git a/config/dashboards/infrastructure/views/05_activity_feed.yaml b/config/dashboards/infrastructure/views/05_activity_feed.yaml
index ec4b5286..046ae0de 100644
--- a/config/dashboards/infrastructure/views/05_activity_feed.yaml
+++ b/config/dashboards/infrastructure/views/05_activity_feed.yaml
@@ -9,8 +9,12 @@
# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 4.
######################################################################
-type: panel
icon: mdi:clipboard-text-outline
title: Activity
path: activity
-cards: !include /config/dashboards/infrastructure/partials/view_cards.yaml
+type: sections
+theme: default
+max_columns: 4
+badges: []
+cards: []
+sections: !include /config/dashboards/infrastructure/partials/activity_sections.yaml
diff --git a/config/dashboards/infrastructure/views/06_mariadb.yaml b/config/dashboards/infrastructure/views/06_mariadb.yaml
index 84e79f06..f53bbe6c 100644
--- a/config/dashboards/infrastructure/views/06_mariadb.yaml
+++ b/config/dashboards/infrastructure/views/06_mariadb.yaml
@@ -12,7 +12,9 @@
type: sections
title: MariaDB
path: mariadb
-max_columns: 3
+max_columns: 4
icon: mdi:database
+theme: default
+badges: []
sections: !include /config/dashboards/infrastructure/partials/mariadb_sections.yaml
cards: []
diff --git a/config/dashboards/infrastructure/views/07_docker_containers.yaml b/config/dashboards/infrastructure/views/07_docker_containers.yaml
index 4e0cac14..e68a78cb 100644
--- a/config/dashboards/infrastructure/views/07_docker_containers.yaml
+++ b/config/dashboards/infrastructure/views/07_docker_containers.yaml
@@ -13,6 +13,7 @@ title: Docker
path: docker
type: sections
icon: mdi:docker
+theme: default
badges: []
sections: !include /config/dashboards/infrastructure/partials/docker_containers_sections.yaml
max_columns: 4
diff --git a/config/dashboards/overview/dashboard.yaml b/config/dashboards/overview/dashboard.yaml
index fb5ca1b2..6bb4a8a0 100644
--- a/config/dashboards/overview/dashboard.yaml
+++ b/config/dashboards/overview/dashboard.yaml
@@ -6,7 +6,7 @@
# Overview Dashboard - YAML entrypoint
# YAML-exported Lovelace dashboard (split into view files).
# -------------------------------------------------------------------
-# Notes: Entry point for dashboard key `lovelace`. Views are loaded from /config/dashboards/overview/views.
+# Notes: Used by `/config/ui-lovelace.yaml` (main Lovelace UI). Views are loaded from /config/dashboards/overview/views.
######################################################################
title: Bear Stone
diff --git a/config/dashboards/resources.yaml b/config/dashboards/resources.yaml
index c9fed94a..46ae47be 100644
--- a/config/dashboards/resources.yaml
+++ b/config/dashboards/resources.yaml
@@ -7,6 +7,7 @@
# YAML-managed Lovelace resources (resource_mode: yaml).
# -------------------------------------------------------------------
# Notes: Generated from config/.storage/lovelace_resources. Edit here after migration; do not edit .storage.
+# Loaded by Home Assistant via `config/lovelace/resources.yaml`.
######################################################################
- type: module
diff --git a/config/dashboards/infrastructure/partials/pi_hole_cards.yaml b/config/lovelace/resources.yaml
similarity index 58%
rename from config/dashboards/infrastructure/partials/pi_hole_cards.yaml
rename to config/lovelace/resources.yaml
index b74a17eb..e345720b 100644
--- a/config/dashboards/infrastructure/partials/pi_hole_cards.yaml
+++ b/config/lovelace/resources.yaml
@@ -3,13 +3,11 @@
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
-# Infrastructure Partial - pi_hole cards
-# Reusable list extracted from a view for smaller diffs and safer edits.
+# Lovelace Resources - Custom card JS resources
+# YAML-managed Lovelace resources (resource_mode: yaml).
# -------------------------------------------------------------------
-# Notes: Extracted from config/dashboards/infrastructure/views/02_pi_hole.yaml key `cards`.
+# Notes: This file is NOT used in this repo's wiring.
+# Resources are loaded via `lovelace.resources: !include dashboards/resources.yaml` in `configuration.yaml`.
######################################################################
-- type: custom:pi-hole
- device_id: d69637da16f7d7f3626070582be59808
- grid_options:
- columns: full
+# (Intentionally empty)
diff --git a/config/dashboards/infrastructure/views/03_pi_hole.yaml b/config/ui-lovelace.yaml
similarity index 54%
rename from config/dashboards/infrastructure/views/03_pi_hole.yaml
rename to config/ui-lovelace.yaml
index 14cf420c..cfd5a351 100644
--- a/config/dashboards/infrastructure/views/03_pi_hole.yaml
+++ b/config/ui-lovelace.yaml
@@ -3,16 +3,10 @@
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
-# Infrastructure View - Pi-Hole
-# YAML-exported Lovelace dashboard (split into view files).
+# Lovelace UI - Overview dashboard (YAML mode)
+# Main Lovelace UI entrypoint (defined as a YAML dashboard in `configuration.yaml`).
# -------------------------------------------------------------------
-# Notes: Exported from config/.storage/lovelace.dashboard_infrastructure view index 2.
+# Notes: Delegates to `/config/dashboards/overview/dashboard.yaml`.
######################################################################
-type: panel
-path: pi-hole
-title: Pi-Hole
-icon: mdi:pi-hole
-visible:
-- user: be280a93c9d7416e98d25d0470f414be
-cards: !include /config/dashboards/infrastructure/partials/pi_hole_cards.yaml
+!include /config/dashboards/overview/dashboard.yaml
diff --git a/tools/ha_ui_smoke.ps1 b/tools/ha_ui_smoke.ps1
new file mode 100644
index 00000000..b1a11505
--- /dev/null
+++ b/tools/ha_ui_smoke.ps1
@@ -0,0 +1,69 @@
+param(
+ [string]$BaseUrl = $env:HASS_PLAYWRIGHT_BASE_URL
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = 'Stop'
+
+if ([string]::IsNullOrWhiteSpace($BaseUrl)) {
+ # Canonical LAN URL for agent automation (trusted_networks bypass).
+ $BaseUrl = 'http://192.168.10.10:8123'
+}
+
+$BaseUrl = $BaseUrl.TrimEnd('/')
+
+function Get-EffectiveUrlAndStatus {
+ param(
+ [Parameter(Mandatory = $true)]
+ [string]$Url
+ )
+
+ # Use curl.exe (not Invoke-WebRequest alias) so we can reliably see redirects.
+ $curl = (Get-Command curl.exe -ErrorAction Stop).Source
+
+ # Follow redirects; return final URL + status code.
+ $out = & $curl -sS -L -o NUL -w "%{url_effective} %{http_code}" $Url 2>$null
+ if (-not $out) { throw "curl produced no output for $Url" }
+ $parts = $out -split ' '
+ if ($parts.Count -lt 2) { throw "Unexpected curl output: $out" }
+
+ [pscustomobject]@{
+ EffectiveUrl = $parts[0]
+ StatusCode = [int]$parts[1]
+ }
+}
+
+$targets = @(
+ '/',
+ '/profile',
+ '/dashboard-infrastructure',
+ '/dashboard-infrastructure/docker',
+ '/dashboard-infrastructure/mariadb',
+ '/dashboard-kiosk'
+)
+
+$failed = $false
+foreach ($path in $targets) {
+ $url = "$BaseUrl$path"
+ $r = Get-EffectiveUrlAndStatus -Url $url
+
+ $isLogin = $r.EffectiveUrl -match '/(login|auth/authorize)\b'
+ $statusOk = $r.StatusCode -ge 200 -and $r.StatusCode -lt 400
+
+ if ($isLogin -or -not $statusOk) {
+ $failed = $true
+ Write-Host ("FAIL {0} -> {1} ({2})" -f $url, $r.EffectiveUrl, $r.StatusCode)
+ } else {
+ Write-Host ("OK {0} -> {1} ({2})" -f $url, $r.EffectiveUrl, $r.StatusCode)
+ }
+}
+
+if ($failed) {
+ Write-Host ''
+ Write-Host 'Likely causes:'
+ Write-Host '- Base URL is external (Cloudflared/Nabu Casa) instead of LAN.'
+ Write-Host '- Home Assistant does not see the request IP as trusted; check `homeassistant.auth_providers.trusted_networks`.'
+ exit 1
+}
+
+exit 0
From 699e03a22a0da0573f454f9d95106ff41e7af681 Mon Sep 17 00:00:00 2001
From: Carlo Costanzo
Date: Mon, 9 Feb 2026 00:13:59 -0500
Subject: [PATCH 4/4] Dashboards: HA 2026.8 Lovelace wiring + validation
---
config/configuration.yaml | 4 +-
config/dashboards/README.md | 7 +-
config/dashboards/SCRATCHPAD.md | 10 +-
.../overview/partials/home_sections.yaml | 2 +-
tools/ha_ui_smoke.ps1 | 8 +-
tools/validate_dashboards.ps1 | 13 ++
tools/validate_dashboards.py | 200 ++++++++++++++++++
7 files changed, 233 insertions(+), 11 deletions(-)
create mode 100644 tools/validate_dashboards.ps1
create mode 100644 tools/validate_dashboards.py
diff --git a/config/configuration.yaml b/config/configuration.yaml
index 23203d8c..197e2508 100755
--- a/config/configuration.yaml
+++ b/config/configuration.yaml
@@ -35,10 +35,10 @@ lovelace:
lovelace:
mode: yaml
title: "Overview"
- icon: mdi:home
+ icon: mdi:view-dashboard
show_in_sidebar: true
require_admin: false
- filename: dashboards/overview/dashboard.yaml
+ filename: ui-lovelace.yaml
dashboard-infrastructure:
mode: yaml
title: "Infrastructure"
diff --git a/config/dashboards/README.md b/config/dashboards/README.md
index 19b964b1..a01c6946 100644
--- a/config/dashboards/README.md
+++ b/config/dashboards/README.md
@@ -46,7 +46,12 @@ This folder holds YAML-managed Home Assistant Lovelace dashboards and UI resourc
This folder is referenced from `config/configuration.yaml` via:
- `lovelace.resource_mode: yaml`
- `lovelace.resources: !include dashboards/resources.yaml`
-- `lovelace.dashboards: ... filename: dashboards//dashboard.yaml`
+- `lovelace.dashboards: ...`
+ - Default Overview YAML dashboard: `lovelace.dashboards.lovelace.filename: ui-lovelace.yaml`
+ - Additional YAML dashboards: `filename: dashboards//dashboard.yaml`
+
+Note:
+- Do not use legacy `lovelace.mode: yaml` (removed in Home Assistant 2026.8).
Lovelace resources are loaded from:
- `config/dashboards/resources.yaml` (referenced by `lovelace.resources`)
diff --git a/config/dashboards/SCRATCHPAD.md b/config/dashboards/SCRATCHPAD.md
index d4696573..a007a8a9 100644
--- a/config/dashboards/SCRATCHPAD.md
+++ b/config/dashboards/SCRATCHPAD.md
@@ -1,9 +1,9 @@
# Dashboards Scratchpad
-## Current Working Items
+Current working items:
+- Keep YAML dashboards rendering (no missing includes/resources).
+- Validate dashboards before restarting Home Assistant.
-- (empty)
+Patterns/notes:
+- If a view looks like a centered skinny column, avoid `max_columns: 1`. Prefer `max_columns: 4` with a single section/card using `columns: 1`.
-## Patterns / Notes
-
-- (empty)
diff --git a/config/dashboards/overview/partials/home_sections.yaml b/config/dashboards/overview/partials/home_sections.yaml
index b4673fcb..c52b8a51 100644
--- a/config/dashboards/overview/partials/home_sections.yaml
+++ b/config/dashboards/overview/partials/home_sections.yaml
@@ -378,7 +378,7 @@
entity: camera.birdseye
tap_action:
action: navigate
- navigation_path: /lovelace/camera
+ navigation_path: /lovelace/cameras
- type: vertical-stack
cards:
- type: weather-forecast
diff --git a/tools/ha_ui_smoke.ps1 b/tools/ha_ui_smoke.ps1
index b1a11505..0f897f47 100644
--- a/tools/ha_ui_smoke.ps1
+++ b/tools/ha_ui_smoke.ps1
@@ -35,10 +35,14 @@ function Get-EffectiveUrlAndStatus {
$targets = @(
'/',
+ '/lovelace',
+ '/lovelace/cameras',
'/profile',
'/dashboard-infrastructure',
+ '/dashboard-infrastructure/home',
+ '/dashboard-infrastructure/activity',
'/dashboard-infrastructure/docker',
- '/dashboard-infrastructure/mariadb',
+ '/dashboard-infrastructure/vacuum',
'/dashboard-kiosk'
)
@@ -47,7 +51,7 @@ foreach ($path in $targets) {
$url = "$BaseUrl$path"
$r = Get-EffectiveUrlAndStatus -Url $url
- $isLogin = $r.EffectiveUrl -match '/(login|auth/authorize)\b'
+ $isLogin = $r.EffectiveUrl -match '/(login|auth/authorize)\\b'
$statusOk = $r.StatusCode -ge 200 -and $r.StatusCode -lt 400
if ($isLogin -or -not $statusOk) {
diff --git a/tools/validate_dashboards.ps1 b/tools/validate_dashboards.ps1
new file mode 100644
index 00000000..d39f0b7b
--- /dev/null
+++ b/tools/validate_dashboards.ps1
@@ -0,0 +1,13 @@
+param()
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = 'Stop'
+
+$repoRoot = Split-Path -Parent $PSScriptRoot
+$py = Get-Command py -ErrorAction SilentlyContinue
+if (-not $py) {
+ throw "Python launcher 'py' not found. Install Python 3 or run tools/validate_dashboards.py with your python."
+}
+
+py -3 "$repoRoot\tools\validate_dashboards.py"
+
diff --git a/tools/validate_dashboards.py b/tools/validate_dashboards.py
new file mode 100644
index 00000000..9b5853b1
--- /dev/null
+++ b/tools/validate_dashboards.py
@@ -0,0 +1,200 @@
+#!/usr/bin/env python3
+"""
+Fast local validation for YAML-managed Lovelace dashboards.
+
+Goals:
+- Catch missing include targets (most common cause of "Unknown error" in UI).
+- Catch missing dashboard entrypoints referenced by configuration.yaml.
+- Encourage a repeatable workflow before restarting Home Assistant.
+"""
+
+from __future__ import annotations
+
+import os
+import re
+import sys
+from pathlib import Path
+
+
+RE_INCLUDE = re.compile(r"!\s*(include(?:_dir_(?:list|merge_list|named|merge_named))?)\s+([^\s#]+)")
+RE_TOP_LEVEL_KEY = re.compile(r"^[A-Za-z0-9_]+:\s*$")
+
+
+def repo_root() -> Path:
+ return Path(__file__).resolve().parents[1]
+
+
+def to_local_path(root: Path, config_path: str) -> Path:
+ # Lovelace includes in this repo should use /config/... paths.
+ if config_path.startswith("/config/"):
+ rel = config_path[len("/config/") :]
+ return root / "config" / rel
+ # Allow relative includes (rare). Resolve from repo root.
+ return (root / config_path).resolve()
+
+
+def iter_yaml_files(root: Path) -> list[Path]:
+ return sorted((root / "config" / "dashboards").rglob("*.yaml"))
+
+def extract_top_level_block(text: str, key: str) -> str | None:
+ lines = text.splitlines()
+ start = None
+ for i, line in enumerate(lines):
+ if re.match(rf"^{re.escape(key)}:\s*$", line):
+ start = i
+ break
+ if start is None:
+ return None
+
+ end = len(lines)
+ for j in range(start + 1, len(lines)):
+ line = lines[j]
+ if not line or line.lstrip().startswith("#"):
+ continue
+ if line.startswith(" "):
+ continue
+ if RE_TOP_LEVEL_KEY.match(line):
+ end = j
+ break
+
+ # Return block content excluding the ":" line itself.
+ return "\n".join(lines[start + 1 : end]) + "\n"
+
+
+def validate_headers(yaml_files: list[Path]) -> list[str]:
+ errs: list[str] = []
+ for p in yaml_files:
+ try:
+ head = p.read_text(encoding="utf-8", errors="replace").splitlines()[:3]
+ except OSError as e:
+ errs.append(f"ERROR: cannot read {p}: {e}")
+ continue
+ joined = "\n".join(head)
+ if "######################################################################" not in joined:
+ errs.append(f"ERROR: missing @CCOSTAN header block: {p}")
+ return errs
+
+
+def validate_includes(root: Path, yaml_files: list[Path]) -> list[str]:
+ errs: list[str] = []
+ for p in yaml_files:
+ try:
+ text = p.read_text(encoding="utf-8", errors="replace")
+ except OSError as e:
+ errs.append(f"ERROR: cannot read {p}: {e}")
+ continue
+
+ for m in RE_INCLUDE.finditer(text):
+ tag = m.group(1)
+ target = m.group(2).strip().strip("'\"")
+ local = to_local_path(root, target)
+ if tag.startswith("include_dir_"):
+ if not local.exists():
+ errs.append(f"ERROR: include dir missing ({tag}): {p} -> {target}")
+ elif not local.is_dir():
+ errs.append(f"ERROR: include dir is not a directory ({tag}): {p} -> {target}")
+ else:
+ # For include_dir_list, ensure there is at least one yaml.
+ if tag == "include_dir_list":
+ found = list(Path(local).glob("*.yaml"))
+ if not found:
+ errs.append(f"ERROR: include_dir_list empty: {p} -> {target}")
+ else:
+ if not local.exists():
+ errs.append(f"ERROR: include file missing ({tag}): {p} -> {target}")
+ elif not local.is_file():
+ errs.append(f"ERROR: include file is not a file ({tag}): {p} -> {target}")
+ return errs
+
+
+def validate_configuration_wiring(root: Path) -> list[str]:
+ errs: list[str] = []
+ cfg = root / "config" / "configuration.yaml"
+ if not cfg.exists():
+ return [f"ERROR: missing {cfg}"]
+
+ text = cfg.read_text(encoding="utf-8", errors="replace")
+ if "\nlovelace:" not in text:
+ errs.append("ERROR: config/configuration.yaml missing `lovelace:` block (YAML dashboards wiring).")
+ lovelace_block = extract_top_level_block(text, "lovelace")
+ if lovelace_block is None:
+ errs.append("ERROR: config/configuration.yaml missing `lovelace:` block (YAML dashboards wiring).")
+ return errs
+
+ # Legacy (pre-2026.8) style was `lovelace: { mode: yaml }`. This must not exist.
+ if re.search(r"(?m)^\s{2}mode:\s*yaml\s*$", lovelace_block):
+ errs.append(
+ "ERROR: config/configuration.yaml uses legacy `lovelace.mode: yaml` (removed in HA 2026.8). "
+ "Define the YAML Overview as a `lovelace.dashboards.lovelace` entry instead."
+ )
+
+ # New (2026.8+) style: YAML Overview is declared as a dashboard pointing at ui-lovelace.yaml.
+ ll_lines = lovelace_block.splitlines()
+ dash_i = next((i for i, l in enumerate(ll_lines) if re.match(r"^\s{2}dashboards:\s*$", l)), None)
+ if dash_i is None:
+ errs.append("ERROR: config/configuration.yaml missing `lovelace.dashboards:` block.")
+ else:
+ lov_i = next((i for i in range(dash_i + 1, len(ll_lines)) if re.match(r"^\s{4}lovelace:\s*$", ll_lines[i])), None)
+ if lov_i is None:
+ errs.append("ERROR: config/configuration.yaml missing `lovelace.dashboards.lovelace:` entry.")
+ else:
+ entry: list[str] = []
+ for j in range(lov_i + 1, len(ll_lines)):
+ line = ll_lines[j]
+ if not line or line.lstrip().startswith("#"):
+ entry.append(line)
+ continue
+ # Next dashboard entry (same indent) or end of dashboards block.
+ if re.match(r"^\s{4}[A-Za-z0-9_-]+:\s*$", line):
+ break
+ if re.match(r"^\s{2}[A-Za-z0-9_-]+:\s*$", line):
+ break
+ entry.append(line)
+
+ entry_text = "\n".join(entry) + "\n"
+ if not re.search(r"(?m)^\s{6}mode:\s*yaml\s*$", entry_text):
+ errs.append("ERROR: config/configuration.yaml missing `lovelace.dashboards.lovelace.mode: yaml`.")
+ if not re.search(r"(?m)^\s{6}filename:\s*ui-lovelace\.yaml\s*$", entry_text):
+ errs.append("ERROR: config/configuration.yaml missing `lovelace.dashboards.lovelace.filename: ui-lovelace.yaml`.")
+
+ ui = root / "config" / "ui-lovelace.yaml"
+ if not ui.exists():
+ errs.append("ERROR: missing config/ui-lovelace.yaml (YAML Overview entrypoint).")
+
+ required_paths = [
+ root / "config" / "dashboards" / "resources.yaml",
+ root / "config" / "dashboards" / "overview" / "dashboard.yaml",
+ root / "config" / "dashboards" / "infrastructure" / "dashboard.yaml",
+ root / "config" / "dashboards" / "kiosk" / "dashboard.yaml",
+ ]
+ for rp in required_paths:
+ if not rp.exists():
+ errs.append(f"ERROR: missing required dashboard file: {rp}")
+ return errs
+
+
+def main() -> int:
+ root = repo_root()
+ dashboards_dir = root / "config" / "dashboards"
+ if not dashboards_dir.exists():
+ print(f"ERROR: missing dashboards dir: {dashboards_dir}")
+ return 2
+
+ yaml_files = iter_yaml_files(root)
+ errs: list[str] = []
+ errs.extend(validate_configuration_wiring(root))
+ errs.extend(validate_headers(yaml_files))
+ errs.extend(validate_includes(root, yaml_files))
+
+ if errs:
+ for e in errs:
+ print(e)
+ print(f"FAIL ({len(errs)} issues)")
+ return 2
+
+ print(f"OK: validated {len(yaml_files)} dashboard YAML files")
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())