Add water maintenance and sprinkler dashboard updates

master
Carlo Costanzo 2 weeks ago
parent 74e0ba7fc9
commit d54cb224ff

@ -18,10 +18,10 @@
Live, personal Home Assistant configuration shared for **browsing and inspiration**. This is not a turnkey clone-and-run setup; borrow ideas, adapt entity IDs/secrets, and test in your own environment.
### Latest video: Home Assistant Caught My HVAC Failure
[![Home Assistant Caught My HVAC Failure](https://www.vcloudinfo.com/wp-content/uploads/2026/06/home-assistant-hvac-maintenance-thumbnail.png)](https://youtu.be/nScl2JxYSB8)
### Latest video: Water Softener Salt, Tracked By Home Assistant
[![Water Softener Salt, Tracked By Home Assistant](https://www.vcloudinfo.com/wp-content/uploads/2026/07/water-softener-thumbnail.jpg)](https://youtu.be/_OqTv9i-jAs)
This walkthrough shows the Home Assistant evidence trail from a failed HVAC blower: cooling was active while the downstairs temperature kept climbing, then the maintenance dashboard turned the repair into runtime-based filter reminders, reset actions, and a 360-day condenser-line cleanout reminder. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8). Browse the YAML in [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](config/packages/climate.yaml) and [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml), and follow the background in [issue #273](https://github.com/CCOSTAN/Home-AssistantConfig/issues/273).
Start with the automation: one Home Assistant webhook records each water softener salt refill, ignores duplicate event IDs, updates helper state, writes Activity Feed history, and exposes template sensors for refill cadence, totals, and days since last add. The webhook can be fired by an agent, NFC tag, QR code, dashboard button, or any other trusted trigger. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html). Browse the YAML in [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](config/packages/maintenance_log.yaml), [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/09_salt_trends.yaml), and [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml); the NFC/tag follow-up is tracked in [issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816).
### Quick navigation
- You are here: `/` (root repo guide)
@ -50,6 +50,8 @@ This walkthrough shows the Home Assistant evidence trail from a failed HVAC blow
- LLM Vision package reminders: [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](config/packages/llmvision.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nAhCezFetvI)
- Codex reset-credit tracking: [![YAML source: bearclaw](https://img.shields.io/static/v1?label=YAML&message=bearclaw&color=lightgrey&logo=github&logoColor=181717)](config/packages/bearclaw.yaml), [config/dashboards/infrastructure](config/dashboards/infrastructure), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/7wKhtrvtyiI)
- Water leak response loop: [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](config/packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI)
- Water softener salt maintenance: [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](config/packages/maintenance_log.yaml), [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/09_salt_trends.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html), [issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816)
- Sprinkler status and last-run dashboard: [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml)
- Bedroom camera kiosk tablet: [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](config/packages/kiosk_tablet.yaml), [config/dashboards/kiosk](config/dashboards/kiosk), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc)
- Holiday/front-of-house color scenes: [![YAML source: monthly_colors](https://img.shields.io/static/v1?label=YAML&message=monthly_colors&color=lightgrey&logo=github&logoColor=181717)](config/scene/monthly_colors.yaml), [![YAML source: monthly_color_scene](https://img.shields.io/static/v1?label=YAML&message=monthly_color_scene&color=lightgrey&logo=github&logoColor=181717)](config/script/monthly_color_scene.yaml)
- Dash-button triggers for quick actions: [![YAML source: dash_buttons](https://img.shields.io/static/v1?label=YAML&message=dash_buttons&color=lightgrey&logo=github&logoColor=181717)](config/automation/dash_buttons.yaml)
@ -87,7 +89,7 @@ https://amzn.to/48jVzZ3
| Garadget garage door controller | Garage doors: open/close, arrival helpers, wind alerts, and nighttime reminders - [![YAML source: garadget](https://img.shields.io/static/v1?label=YAML&message=garadget&color=lightgrey&logo=github&logoColor=181717)](config/packages/garadget.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/wFO0H5zgnzk), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html) | [![Buy](https://img.shields.io/badge/Buy-Garadget-orange?logo=amazon)](https://amzn.to/2jQLpVQ) |
| August smart lock | Front-door lock control + status - [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](config/packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) |
| Phyn Plus water shutoff | Leak detection + auto shutoff - [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](config/packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) |
| Rachio sprinkler controller | Rain-skips and seasonal watering - [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls - [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](config/packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Tesla Powerwall 2 | Grid-outage alerts, charging watchdog, and load-shed automations - [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](config/packages/powerwall.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/tesla-powerwall-home-assistant-watchdog.html) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) |
| Google Nest thermostat | HVAC schedules plus runtime-based filter reminders and condenser-line cleanout tracking - [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](config/packages/climate.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](config/dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) |
| NodeMCU motion sensor | Office motion lighting - [![YAML source: office_motion](https://img.shields.io/static/v1?label=YAML&message=office_motion&color=lightgrey&logo=github&logoColor=181717)](config/packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) |

@ -43,7 +43,7 @@ Live view of the `config/` directory my production Home Assistant instance loads
### Featured automations by section
| Section | Why start here | Featured automation(s) |
| --- | --- | --- |
| Packages | Self-contained subsystems that highlight patterns like combined alerts + actions. | [![YAML source: alarm](https://img.shields.io/static/v1?label=YAML&message=alarm&color=lightgrey&logo=github&logoColor=181717)](packages/alarm.yaml), [![YAML source: garadget](https://img.shields.io/static/v1?label=YAML&message=garadget&color=lightgrey&logo=github&logoColor=181717)](packages/garadget.yaml), [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](packages/llmvision.yaml), [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](packages/kiosk_tablet.yaml), [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](packages/vacation_mode.yaml), [![YAML source: vacuum](https://img.shields.io/static/v1?label=YAML&message=vacuum&color=lightgrey&logo=github&logoColor=181717)](packages/vacuum.yaml), [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml) |
| Packages | Self-contained subsystems that highlight patterns like combined alerts + actions. | [![YAML source: alarm](https://img.shields.io/static/v1?label=YAML&message=alarm&color=lightgrey&logo=github&logoColor=181717)](packages/alarm.yaml), [![YAML source: garadget](https://img.shields.io/static/v1?label=YAML&message=garadget&color=lightgrey&logo=github&logoColor=181717)](packages/garadget.yaml), [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](packages/llmvision.yaml), [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](packages/maintenance_log.yaml), [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](packages/rachio.yaml), [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](packages/kiosk_tablet.yaml), [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](packages/vacation_mode.yaml), [![YAML source: vacuum](https://img.shields.io/static/v1?label=YAML&message=vacuum&color=lightgrey&logo=github&logoColor=181717)](packages/vacuum.yaml), [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml) |
| Automations | Real-world triggers that tie Zwave, MQTT, and REST sensors into the rest of the house. | [![YAML source: garage_entry_light](https://img.shields.io/static/v1?label=YAML&message=garage_entry_light&color=lightgrey&logo=github&logoColor=181717)](automation/garage_entry_light.yaml), [![YAML source: dark_rainy_day](https://img.shields.io/static/v1?label=YAML&message=dark_rainy_day&color=lightgrey&logo=github&logoColor=181717)](automation/dark_rainy_day.yaml), [![YAML source: dash_buttons](https://img.shields.io/static/v1?label=YAML&message=dash_buttons&color=lightgrey&logo=github&logoColor=181717)](automation/dash_buttons.yaml) |
| Scripts | Reusable building blocks for lighting, notifications, safety responses, and Joanna/BearClaw remediation dispatch. | [![YAML source: joanna_dispatch](https://img.shields.io/static/v1?label=YAML&message=joanna_dispatch&color=lightgrey&logo=github&logoColor=181717)](script/joanna_dispatch.yaml), [![YAML source: notify_engine](https://img.shields.io/static/v1?label=YAML&message=notify_engine&color=lightgrey&logo=github&logoColor=181717)](script/notify_engine.yaml), [![YAML source: speech_engine](https://img.shields.io/static/v1?label=YAML&message=speech_engine&color=lightgrey&logo=github&logoColor=181717)](script/speech_engine.yaml) |
| Scenes | Seasonal and ambiance presets that the scripts and automations call into. | [![YAML source: monthly_colors](https://img.shields.io/static/v1?label=YAML&message=monthly_colors&color=lightgrey&logo=github&logoColor=181717)](scene/monthly_colors.yaml), [![YAML source: living_room](https://img.shields.io/static/v1?label=YAML&message=living_room&color=lightgrey&logo=github&logoColor=181717)](scene/living_room.yaml) |
@ -51,7 +51,7 @@ Live view of the `config/` directory my production Home Assistant instance loads
| Dashboards & Media | UI chrome, floorplans, sound bites, and automation assets. | [dashboards/kiosk](dashboards/kiosk), [topology diagram](../README.md#network-diagram), [media/](media) |
| Seasonal Audio | Cuckoo clock with Halloween and Christmas sound packs. | [![YAML source: CucKoo_Clock](https://img.shields.io/static/v1?label=YAML&message=CucKoo_Clock&color=lightgrey&logo=github&logoColor=181717)](automation/System/CucKoo_Clock.yaml) |
The latest walkthrough shows the HVAC maintenance loop in Home Assistant. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8). YAML lives in [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](packages/climate.yaml) and [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml), with background in [issue #273](https://github.com/CCOSTAN/Home-AssistantConfig/issues/273). The earlier Powerwall, Codex reset-credit, leak-detection, kiosk, and LLM Vision walkthroughs are still available with examples in [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml), [![YAML source: bearclaw](https://img.shields.io/static/v1?label=YAML&message=bearclaw&color=lightgrey&logo=github&logoColor=181717)](packages/bearclaw.yaml), [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](packages/kiosk_tablet.yaml), and [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](packages/llmvision.yaml).
The latest walkthrough shows a water softener salt maintenance automation built around a reusable Home Assistant webhook, duplicate-safe helper updates, Activity Feed logging, and dashboard-ready template sensors. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html). YAML lives in [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](packages/maintenance_log.yaml), [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/views/09_salt_trends.yaml), and [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml). The earlier HVAC, Powerwall, Codex reset-credit, leak-detection, kiosk, and LLM Vision walkthroughs are still available with examples in [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](packages/climate.yaml), [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml), [![YAML source: bearclaw](https://img.shields.io/static/v1?label=YAML&message=bearclaw&color=lightgrey&logo=github&logoColor=181717)](packages/bearclaw.yaml), [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](packages/kiosk_tablet.yaml), and [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](packages/llmvision.yaml).
### Gear tied to these automations (affiliate links)
Only including devices that have active references in the files above or an open implementation issue.
@ -63,7 +63,7 @@ Only including devices that have active references in the files above or an open
| August smart lock | Front-door lock status + remote control [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-August%20Lock-orange?logo=amazon)](https://amzn.to/48jVzZ3) |
| Amazon Echo Show | Pops up the front doorbell camera when the August lock unlocks [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](packages/august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) |
| Phyn Plus water shutoff | Leak detection + auto shutoff - [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](packages/phynplus.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html) | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) |
| Rachio sprinkler controller | Rain-skips and seasonal watering [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](packages/rachio.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Rachio sprinkler controller | Rain-skips, active-zone status, trigger-derived last-run history, and dashboard controls [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](packages/rachio.yaml), [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/views/10_sprinklers.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml) | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Tesla Powerwall 2 | Grid-outage alerts, charging watchdog, and load-shed automations - [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](packages/powerwall.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA), [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/tesla-powerwall-home-assistant-watchdog.html) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) |
| Google Nest thermostat | HVAC schedules plus runtime-based filter reminders and condenser-line cleanout tracking - [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](packages/climate.yaml), [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](dashboards/overview/partials/water_sections.yaml), [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) |
| NodeMCU motion sensor | Office motion lighting + comfort scenes [![YAML source: office_motion](https://img.shields.io/static/v1?label=YAML&message=office_motion&color=lightgrey&logo=github&logoColor=181717)](packages/office_motion.yaml) | [![Buy](https://img.shields.io/badge/Buy-Motion%20Node-orange?logo=amazon)](https://amzn.to/2oUgj5i) |

@ -8,7 +8,10 @@
# -------------------------------------------------------------------
# Notes: Extracted from config/dashboards/overview/views/07_water.yaml key `sections`.
# Notes: Includes water and home utility telemetry (filters, power, hot water).
# Video: https://youtu.be/nScl2JxYSB8
# Video: HVAC maintenance dashboard - https://youtu.be/nScl2JxYSB8
# Video: Water softener salt tracking - https://youtu.be/_OqTv9i-jAs
# Blog: https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html
# Notes: Sprinkler overview links to config/dashboards/overview/views/10_sprinklers.yaml.
######################################################################
- cards:
@ -141,6 +144,62 @@
action: none
layout: horizontal
fill_container: true
# Fallback card: Mushroom matches the existing Home Maintenance overview tile style.
- type: custom:mushroom-template-card
primary: >-
{% set status = states('sensor.rachio_controller_status') %}
{% set active = states('sensor.rachio_active_zone') %}
{% if status == 'watering' %}
Sprinklers: {{ active }}
{% elif status == 'rain_delay' %}
Sprinklers: rain delay
{% elif status == 'standby' %}
Sprinklers: standby
{% elif status == 'unavailable' %}
Sprinklers: unavailable
{% else %}
Sprinklers: ready
{% endif %}
secondary: >-
{% set zone = states('sensor.rachio_last_run_summary') %}
{% set completed = state_attr('sensor.rachio_last_run_summary', 'completed_at') %}
{% set duration = state_attr('sensor.rachio_last_run_summary', 'duration_min') %}
{% if zone not in ['unknown', 'unavailable', 'none', ''] and completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ zone }}{% if duration not in ['unknown', 'unavailable', 'none', '', none] %}, {{ duration }} min{% endif %} at {{ when }}
{% else %}
{{ state_attr('sensor.rachio_controller_status', 'schedule_summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: sensor.rachio_controller_status
icon_color: >-
{% set status = states('sensor.rachio_controller_status') %}
{% if status == 'watering' %}
green
{% elif status in ['rain_delay', 'standby'] %}
blue
{% elif status == 'unavailable' %}
red
{% else %}
teal
{% endif %}
tap_action:
action: navigate
navigation_path: /lovelace/sprinklers
hold_action:
action: more-info
double_tap_action:
action: none
layout: horizontal
fill_container: true
- type: tile
entity: switch.carlo_rachio_rain_delay
name: Sprinkler rain delay
tap_action:
action: navigate
navigation_path: /lovelace/sprinklers
hold_action:
action: more-info
- type: custom:mushroom-template-card
primary: >-
{% set days = states('sensor.water_softener_salt_days_since_last_add') | float(0) -%}

@ -6,6 +6,8 @@
# Overview Subview - Salt Trends
# Year-scale water softener salt maintenance history.
# -------------------------------------------------------------------
# Video: https://youtu.be/_OqTv9i-jAs
# Blog: https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html
# Notes: Linked from the Home Maintenance water view salt tiles.
# Notes: Uses native history graph cards because more-info dialogs do not expose a configurable default time window.
######################################################################

@ -0,0 +1,255 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Overview Subview - Sprinklers
# Rachio-backed sprinkler status, zone history, and watering controls.
# -------------------------------------------------------------------
# Notes: Linked from the Home Maintenance water view sprinkler tiles.
# Notes: Zone last-run values come from trigger-based template sensors in config/packages/rachio.yaml.
######################################################################
title: Sprinklers
path: sprinklers
subview: true
back_path: /lovelace/water
type: sections
max_columns: 3
sections:
- type: grid
column_span: 3
cards:
- type: heading
heading: Sprinklers
heading_style: title
# Fallback card: Mushroom is already the established Home Maintenance summary style.
- type: custom:mushroom-template-card
primary: >-
{% set status = states('sensor.rachio_controller_status') %}
{% set active = states('sensor.rachio_active_zone') %}
{% if status == 'watering' %}
Watering {{ active }}
{% elif status == 'rain_delay' %}
Rain delay is active
{% elif status == 'standby' %}
Controller is in standby
{% elif status == 'unavailable' %}
Sprinklers are unavailable
{% else %}
Sprinklers are ready
{% endif %}
secondary: >-
{% set last = states('sensor.rachio_last_run_summary') %}
{% set completed = state_attr('sensor.rachio_last_run_summary', 'completed_at') %}
{% set duration = state_attr('sensor.rachio_last_run_summary', 'duration_min') %}
{% if last not in ['unknown', 'unavailable', 'none', ''] and completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ last }} for {{ duration }} min at {{ when }}
{% else %}
{{ state_attr('sensor.rachio_controller_status', 'schedule_summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: sensor.rachio_controller_status
icon_color: >-
{% set status = states('sensor.rachio_controller_status') %}
{% if status == 'watering' %}
green
{% elif status in ['rain_delay', 'standby'] %}
blue
{% elif status == 'unavailable' %}
red
{% else %}
teal
{% endif %}
tap_action:
action: more-info
hold_action:
action: none
double_tap_action:
action: none
layout: horizontal
fill_container: true
- type: tile
entity: switch.daily_flex_watering_schedule
name: Flex watering schedule
hold_action:
action: more-info
- type: tile
entity: switch.carlo_rachio_rain_delay
name: Rain delay
hold_action:
action: more-info
- type: tile
entity: switch.carlo_rachio_in_standby_mode
name: Standby mode
hold_action:
action: more-info
- type: tile
entity: script.rachio_pause_watering_30
name: Pause 30 minutes
icon: mdi:pause-circle
tap_action:
action: call-service
service: script.rachio_pause_watering_30
- type: tile
entity: script.rachio_resume_watering
name: Resume watering
icon: mdi:play-circle
tap_action:
action: call-service
service: script.rachio_resume_watering
- type: tile
entity: script.rachio_stop_watering
name: Stop watering
icon: mdi:stop-circle
tap_action:
action: call-service
service: script.rachio_stop_watering
- type: grid
column_span: 3
cards:
- type: heading
heading: Zones
heading_style: subtitle
# Fallback card: Mushroom template card combines live zone state and the paired last-run sensor in one compact tile.
- type: custom:mushroom-template-card
primary: Front Lawn
secondary: >-
{% set completed = state_attr('sensor.rachio_front_lawn_last_run', 'completed_at') %}
{% set minutes = states('sensor.rachio_front_lawn_last_run') %}
{% if is_state('switch.front_lawn', 'on') %}
{{ state_attr('switch.front_lawn', 'Summary') | default('Watering now', true) }}
{% elif completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ when }} for {{ minutes }} min
{% else %}
{{ state_attr('switch.front_lawn', 'Summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: switch.front_lawn
icon_color: "{% if is_state('switch.front_lawn', 'on') %}green{% elif is_state('switch.front_lawn', 'unavailable') %}red{% else %}blue{% endif %}"
tap_action:
action: more-info
hold_action:
action: more-info
entity: sensor.rachio_front_lawn_last_run
double_tap_action:
action: none
layout: horizontal
fill_container: true
# Fallback card: same compact zone-state and last-run pairing for this zone.
- type: custom:mushroom-template-card
primary: Front Hedges
secondary: >-
{% set completed = state_attr('sensor.rachio_front_hedges_last_run', 'completed_at') %}
{% set minutes = states('sensor.rachio_front_hedges_last_run') %}
{% if is_state('switch.front_hedges_right_side_house', 'on') %}
{{ state_attr('switch.front_hedges_right_side_house', 'Summary') | default('Watering now', true) }}
{% elif completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ when }} for {{ minutes }} min
{% else %}
{{ state_attr('switch.front_hedges_right_side_house', 'Summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: switch.front_hedges_right_side_house
icon_color: "{% if is_state('switch.front_hedges_right_side_house', 'on') %}green{% elif is_state('switch.front_hedges_right_side_house', 'unavailable') %}red{% else %}blue{% endif %}"
tap_action:
action: more-info
hold_action:
action: more-info
entity: sensor.rachio_front_hedges_last_run
double_tap_action:
action: none
layout: horizontal
fill_container: true
# Fallback card: same compact zone-state and last-run pairing for this zone.
- type: custom:mushroom-template-card
primary: Left Side House
secondary: >-
{% set completed = state_attr('sensor.rachio_left_side_house_last_run', 'completed_at') %}
{% set minutes = states('sensor.rachio_left_side_house_last_run') %}
{% if is_state('switch.left_side_house', 'on') %}
{{ state_attr('switch.left_side_house', 'Summary') | default('Watering now', true) }}
{% elif completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ when }} for {{ minutes }} min
{% else %}
{{ state_attr('switch.left_side_house', 'Summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: switch.left_side_house
icon_color: "{% if is_state('switch.left_side_house', 'on') %}green{% elif is_state('switch.left_side_house', 'unavailable') %}red{% else %}blue{% endif %}"
tap_action:
action: more-info
hold_action:
action: more-info
entity: sensor.rachio_left_side_house_last_run
double_tap_action:
action: none
layout: horizontal
fill_container: true
# Fallback card: same compact zone-state and last-run pairing for this zone.
- type: custom:mushroom-template-card
primary: Backyard Shrubs
secondary: >-
{% set completed = state_attr('sensor.rachio_backyard_shrubs_last_run', 'completed_at') %}
{% set minutes = states('sensor.rachio_backyard_shrubs_last_run') %}
{% if is_state('switch.backyard_shrubs', 'on') %}
{{ state_attr('switch.backyard_shrubs', 'Summary') | default('Watering now', true) }}
{% elif completed not in ['unknown', 'unavailable', 'none', '', none] %}
{% set when = as_datetime(completed).strftime('%b %d, %I:%M %p') | replace(' 0', ' ') %}
Last run: {{ when }} for {{ minutes }} min
{% else %}
{{ state_attr('switch.backyard_shrubs', 'Summary') | default('No completed run captured yet.', true) }}
{% endif %}
icon: mdi:sprinkler-variant
entity: switch.backyard_shrubs
icon_color: "{% if is_state('switch.backyard_shrubs', 'on') %}green{% elif is_state('switch.backyard_shrubs', 'unavailable') %}red{% else %}blue{% endif %}"
tap_action:
action: more-info
hold_action:
action: more-info
entity: sensor.rachio_backyard_shrubs_last_run
double_tap_action:
action: none
layout: horizontal
fill_container: true
- type: grid
column_span: 3
cards:
- type: heading
heading: Last Run History
heading_style: subtitle
# Fallback card: native entities card exposes attributes without adding more template helpers.
- type: entities
title: Last Completed Run
entities:
- entity: sensor.rachio_last_run_summary
name: Zone
- type: attribute
entity: sensor.rachio_last_run_summary
attribute: duration_min
name: Duration
suffix: min
- type: attribute
entity: sensor.rachio_last_run_summary
attribute: completed_at
name: Completed
- entity: sensor.rachio_active_zone
name: Active zone
# Fallback card: native history graph gives sparse duration history without another custom graph template.
- type: history-graph
title: Zone Run Durations - Last 90 Days
hours_to_show: 2160
entities:
- entity: sensor.rachio_front_lawn_last_run
name: Front Lawn
- entity: sensor.rachio_front_hedges_last_run
name: Front Hedges
- entity: sensor.rachio_left_side_house_last_run
name: Left Side House
- entity: sensor.rachio_backyard_shrubs_last_run
name: Backyard Shrubs
cards: []

@ -63,8 +63,9 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
| [![YAML source: telegram_bot](https://img.shields.io/static/v1?label=YAML&message=telegram_bot&color=lightgrey&logo=github&logoColor=181717)](telegram_bot.yaml) | Legacy Telegram transport marker for BearClaw; the shared `joanna_send_telegram` helper now forwards through the codex_appliance direct Telegram API. | `rest_command.bearclaw_telegram_send`, `script.joanna_send_telegram` |
| [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](phynplus.yaml) | Phyn shutoff automations with leak-test guard, Activity Feed context, Repairs tracking, and critical push recovery when the valve closes. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI) | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `script.phyn_send_actionable_leak_notification`, `repairs.create` |
| [![YAML source: water_delivery](https://img.shields.io/static/v1?label=YAML&message=water_delivery&color=lightgrey&logo=github&logoColor=181717)](water_delivery.yaml) | ReadyRefresh delivery date helper with night-before plus day-before garage door Alexa reminders, helper-change audit logging, and Telegram confirmations. | `input_datetime.water_delivery_date`, `script.send_to_logbook`, `script.joanna_send_telegram`, `notify.alexa_media_garage` |
| [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/10_sprinklers.yaml) | Rachio sprinkler status with active-zone summaries, trigger-derived last-run duration sensors, dashboard controls, and Activity Feed audit logging without input_* helpers. | `sensor.rachio_controller_status`, `sensor.rachio_last_run_summary`, `sensor.rachio_*_last_run`, `script.rachio_*`, `automation.rachio_activity_feed` |
| [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](vacation_mode.yaml) | Auto-enable vacation mode after 24 hours away or no bed use, track sitter analytics/secure-house checks, stale-visit timeout protection, deliver sitter-facing briefings, and send 10 AM/10 PM house digests with Powerwall/security/backup status plus Joanna review. | `input_boolean.vacation_mode`, `input_boolean.house_sitter_present`, `input_datetime.vacation_house_sitter_*`, `input_datetime.vacation_house_status_digest_last_sent`, `sensor.vacation_house_sitter_*`, `binary_sensor.powerwall_grid_status`, `sensor.powerwall_charge`, `group.garage_doors`, `lock.front_door`, `script.vacation_house_sitter_clear_presence`, `script.vacation_house_status_digest`, `script.notify_engine`, `rest_command.bearclaw_command`, `script.joanna_send_telegram` |
| [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) | Joanna maintenance webhook ingest for water softener salt with idempotent event handling, Activity feed logging, and parser-safe refill cadence history. | `automation.maintenance_log_joanna_webhook_ingest`, `sensor.water_softener_salt_average_days_between_refills`, `sensor.water_softener_salt_refill_count`, `sensor.water_softener_salt_total_added` |
| [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) | Webhook-based water softener salt maintenance logging with idempotent event handling, Activity Feed logging, parser-safe refill cadence history, and dashboard-ready template sensors. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html) | `automation.maintenance_log_joanna_webhook_ingest`, `sensor.water_softener_salt_average_days_between_refills`, `sensor.water_softener_salt_refill_count`, `sensor.water_softener_salt_total_added` |
| [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](kiosk_tablet.yaml) | Keeps the bedroom Fully Kiosk Fire tablet pinned to the dedicated camera kiosk dashboard when the page or foreground app drifts; normal wake events only restore brightness/focus. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc) | `sensor.alarm_panel_1_current_page`, `sensor.alarm_panel_1_foreground_app`, `button.alarm_panel_1_bring_to_foreground`, `button.alarm_panel_1_load_start_url` |
| [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](powerwall.yaml) | Track Tesla Powerwall grid status, push live outage tracking to mobile targets, shed loads automatically when off-grid, and alert if the Powerwall stays low after grid power returns. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA) [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/tesla-powerwall-home-assistant-watchdog.html) | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `script.notify_live_activity`, `repairs.create` |
| [![YAML source: tesla_model_y](https://img.shields.io/static/v1?label=YAML&message=tesla_model_y&color=lightgrey&logo=github&logoColor=181717)](tesla_model_y.yaml) | Remind the garage and parents to plug in the Model Y after the large garage door closes with a low battery, charging still off, both parents home, and a 24-hour mobile snooze available from the push reminder. | `sensor.spaceship_battery_level`, `switch.spaceship_charge`, `person.carlo`, `person.stacey`, `cover.large_garage_door`, `input_datetime.tesla_model_y_last_garage_close`, `input_datetime.tesla_model_y_plug_in_snooze_until`, `notify.alexa_media_garage`, `script.notify_engine_two_button` |
@ -107,6 +108,7 @@ When a package has a dedicated blog post or video, I link it right inside the YA
| [![YAML source: kiosk_tablet](https://img.shields.io/static/v1?label=YAML&message=kiosk_tablet&color=lightgrey&logo=github&logoColor=181717)](kiosk_tablet.yaml) + [dashboards/kiosk](../dashboards/kiosk) | Fire tablet camera kiosk with a purpose-built dashboard, Fully Kiosk recovery, bedtime dimming, and screensaver watchdog behavior. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/ChgEu0IDWzc) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2017/08/project-update-visualization-of-home.html) |
| [![YAML source: tesla_model_y](https://img.shields.io/static/v1?label=YAML&message=tesla_model_y&color=lightgrey&logo=github&logoColor=181717)](tesla_model_y.yaml) | Garage-close timestamp used as a physical arrival signal for low-battery plug-in reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/wFO0H5zgnzk) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-garage-automations-arrival-alerts-tesla.html) |
| [![YAML source: llmvision](https://img.shields.io/static/v1?label=YAML&message=llmvision&color=lightgrey&logo=github&logoColor=181717)](llmvision.yaml) | LLM Vision package reminder flow that turns a front-door camera event into a stored package-present state and phone alert. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nAhCezFetvI) |
| [![YAML source: maintenance_log](https://img.shields.io/static/v1?label=YAML&message=maintenance_log&color=lightgrey&logo=github&logoColor=181717)](maintenance_log.yaml) + [![YAML source: 09_salt_trends](https://img.shields.io/static/v1?label=YAML&message=09_salt_trends&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/09_salt_trends.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | Water softener salt maintenance flow with a reusable webhook, duplicate protection, helper-backed history, template sensors, and Salt Trends dashboard views. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/_OqTv9i-jAs) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html) · [Issue #1816](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1816) |
| [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | HVAC blower-failure evidence, runtime-based AC filter reminders, reset actions, and 360-day condenser-line cleanout reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) · [Issue #273](https://github.com/CCOSTAN/Home-AssistantConfig/issues/273) |
| [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) + [![YAML source: printer](https://img.shields.io/static/v1?label=YAML&message=printer&color=lightgrey&logo=github&logoColor=181717)](printer.yaml) + [![YAML source: vacation_mode](https://img.shields.io/static/v1?label=YAML&message=vacation_mode&color=lightgrey&logo=github&logoColor=181717)](vacation_mode.yaml) | Snoozeable Home Assistant mobile notifications for AC filters, printer ink, and Vacation Mode missed-visit reminders. | [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/y47KSflS1aw) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-notification-snooze-buttons.html) · [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2020/11/home-assistant-ios-actionable-notifications-example.html) |
| [![YAML source: holiday](https://img.shields.io/static/v1?label=YAML&message=holiday&color=lightgrey&logo=github&logoColor=181717)](holiday.yaml) | How the holiday/flag sensor works and drives lighting playlists. | [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2019/02/breaking-down-the-flag-sensor-in-home-assistant.html) |
@ -130,7 +132,7 @@ These are the devices that power the packages above, plus tracked hardware imple
| Amazon Echo Show | Pops up the front doorbell camera when the August lock unlocks. | [![YAML source: august](https://img.shields.io/static/v1?label=YAML&message=august&color=lightgrey&logo=github&logoColor=181717)](august.yaml) | [![Buy](https://img.shields.io/badge/Buy-Echo%20Show-orange?logo=amazon)](https://amzn.to/4ptA3YO) |
| Amazon Echo Glow | [![GitHub issue: 1827](https://img.shields.io/static/v1?label=Issue&message=%231827&color=lightgrey&logo=github&logoColor=181717)](https://github.com/CCOSTAN/Home-AssistantConfig/issues/1827) | Visual notification light candidate for Home Assistant status cues. | [![Buy](https://img.shields.io/badge/Buy-Echo%20Glow-orange?logo=amazon)](https://amzn.to/4wsGUoU) |
| Phyn Plus water shutoff | [![YAML source: phynplus](https://img.shields.io/static/v1?label=YAML&message=phynplus&color=lightgrey&logo=github&logoColor=181717)](phynplus.yaml) | Leak events trigger valve closes + critical push notifications. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/xbhgWnomFYI) and [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/06/home-assistant-leak-detection-automations.html). | [![Buy](https://img.shields.io/badge/Buy-Phyn%20Plus-orange?logo=amazon)](https://amzn.to/2Zy3sbJ) |
| Rachio sprinkler controller | [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) | Rain skips and seasonal watering adjustments happen automatically. | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Rachio sprinkler controller | [![YAML source: rachio](https://img.shields.io/static/v1?label=YAML&message=rachio&color=lightgrey&logo=github&logoColor=181717)](rachio.yaml) + [![YAML source: 10_sprinklers](https://img.shields.io/static/v1?label=YAML&message=10_sprinklers&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/views/10_sprinklers.yaml) + [![YAML source: water_sections](https://img.shields.io/static/v1?label=YAML&message=water_sections&color=lightgrey&logo=github&logoColor=181717)](../dashboards/overview/partials/water_sections.yaml) | Rain skips, active-zone status, trigger-derived last-run history, and dashboard controls. | [![Buy](https://img.shields.io/badge/Buy-Rachio-orange?logo=amazon)](https://amzn.to/2eoPKBW) |
| Tesla Powerwall 2 | [![YAML source: powerwall](https://img.shields.io/static/v1?label=YAML&message=powerwall&color=lightgrey&logo=github&logoColor=181717)](powerwall.yaml) | Grid outages kick off status pings, load-shed scripts, and low-charge charging watchdog alerts. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/hR_0lFEE2bA) | [![Buy](https://img.shields.io/badge/Buy-Powerwall-orange?logo=tesla)](https://amzn.to/3UM4BZ5) |
| Google Nest thermostat | [![YAML source: climate](https://img.shields.io/static/v1?label=YAML&message=climate&color=lightgrey&logo=github&logoColor=181717)](climate.yaml) | Presence/weather/grid-aware cooling targets, humidity pulses, runtime filter reminders, and condenser-line cleanout tracking. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/nScl2JxYSB8) | [![Buy](https://img.shields.io/badge/Buy-Nest%20Thermostat-orange?logo=google)](https://amzn.to/4olpINw) |
| Dreame/Neato vacuum | [![YAML source: vacuum](https://img.shields.io/static/v1?label=YAML&message=vacuum&color=lightgrey&logo=github&logoColor=181717)](vacuum.yaml) | Away-only room queues, sweep/mop phases, Alexa room cleans, rescue notifications, and voice callouts. [![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?logo=youtube&logoColor=white)](https://youtu.be/KKOWSKuF5jA) and [![vCloudInfo Blog Post](https://img.shields.io/static/v1?label=vCloudInfo&message=Blog%20Post&color=21759B&logo=wordpress&logoColor=white)](https://www.vcloudinfo.com/2026/05/home-assistant-vacuum-automations-dreame-2026.html). | [![Buy](https://img.shields.io/badge/Buy-Vacuum-orange?logo=amazon)](https://amzn.to/4f7NpFP) |

@ -3,10 +3,12 @@
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Maintenance Logging - Joanna webhook ingest + graphable HA history
# Maintenance Logging - webhook ingest + graphable HA history
# Stores water softener salt maintenance events in recorder-backed helpers.
# -------------------------------------------------------------------
# Notes: Webhook id is bearclaw_maintenance_log_v1 (Joanna -> HA contract).
# Video: https://youtu.be/_OqTv9i-jAs
# Blog: https://www.vcloudinfo.com/2026/07/home-assistant-water-softener-salt-automation.html
# Notes: Webhook id is bearclaw_maintenance_log_v1; payloads can come from agents, NFC tags, QR codes, or dashboard buttons.
# Notes: Duplicate event_id values are ignored to prevent double-count totals.
# Notes: Recent event history string format is "YYYY-MM-DD HH:MM:SS|amount|note||...".
# Notes: Long-term stats live on template sensors; helpers are internal state for restore/calculation.

@ -3,13 +3,358 @@
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Rachio Sprinkler - Rain skips and seasonal scheduling - Smart sprinkler controller via Rachio. https://amzn.to/2eoPKBW.
# Centralizes the Rachio Sprinkler - Rain skips and seasonal scheduling package configuration and helpers.
# Rachio Sprinkler - dashboard state, run history, and watering controls - Smart sprinkler controller via Rachio. https://amzn.to/2eoPKBW.
# Builds a reusable sprinkler dashboard pattern around native Rachio zone switches and controller actions.
# -------------------------------------------------------------------
# Notes: Attribute audit found native zone metadata and active-run summaries, but no durable off-state last-run/duration attributes.
# Notes: Last-run sensors are trigger-based template sensors derived from zone on->off transitions; no input_* helpers are used.
######################################################################
#
# sensor:
# - platform: mqtt
# state_topic: "ifttt/rachio/watering_time"
# name: "Rachio_watering_time"
template:
- binary_sensor:
- name: Rachio Watering Now
unique_id: rachio_watering_now
icon: mdi:sprinkler-variant
state: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{{ expand(zones) | selectattr('state', 'eq', 'on') | list | count > 0 }}
attributes:
active_zones: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{{ active | map(attribute='name') | map('replace', 'Carlo-Rachio ', '') | list | join(', ') }}
active_zone_entities: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{{ active | map(attribute='entity_id') | list | join(', ') }}
sensor:
- name: Rachio Active Zone
unique_id: rachio_active_zone
icon: mdi:sprinkler-variant
state: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{% if not is_state('binary_sensor.carlo_rachio', 'on') %}
Unavailable
{% elif active | count > 0 %}
{{ active | map(attribute='name') | map('replace', 'Carlo-Rachio ', '') | list | join(', ') }}
{% else %}
Idle
{% endif %}
attributes:
active_zone_entities: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{{ active | map(attribute='entity_id') | list | join(', ') }}
schedule_state: "{{ states('switch.daily_flex_watering_schedule') }}"
- name: Rachio Controller Status
unique_id: rachio_controller_status
icon: mdi:sprinkler-variant
state: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{% if not is_state('binary_sensor.carlo_rachio', 'on') %}
unavailable
{% elif active | count > 0 %}
watering
{% elif is_state('switch.carlo_rachio_rain_delay', 'on') %}
rain_delay
{% elif is_state('switch.carlo_rachio_in_standby_mode', 'on') %}
standby
{% else %}
ready
{% endif %}
attributes:
controller_online: "{{ states('binary_sensor.carlo_rachio') }}"
rain_sensor: "{{ states('binary_sensor.carlo_rachio_rain_sensor') }}"
rain_delay: "{{ states('switch.carlo_rachio_rain_delay') }}"
standby: "{{ states('switch.carlo_rachio_in_standby_mode') }}"
active_zones: >-
{% set zones = [
'switch.front_lawn',
'switch.front_hedges_right_side_house',
'switch.left_side_house',
'switch.backyard_shrubs'
] %}
{% set active = expand(zones) | selectattr('state', 'eq', 'on') | list %}
{{ active | map(attribute='name') | map('replace', 'Carlo-Rachio ', '') | list | join(', ') }}
schedule_summary: "{{ state_attr('switch.daily_flex_watering_schedule', 'Summary') }}"
schedule_duration: "{{ state_attr('switch.daily_flex_watering_schedule', 'Duration') }}"
schedule_type: "{{ state_attr('switch.daily_flex_watering_schedule', 'Type') }}"
- trigger:
- platform: state
entity_id:
- switch.front_lawn
- switch.front_hedges_right_side_house
- switch.left_side_house
- switch.backyard_shrubs
from: "on"
to: "off"
sensor:
- name: Rachio Last Run Summary
unique_id: rachio_last_run_summary
icon: mdi:sprinkler-variant
state: "{{ trigger.from_state.name | replace('Carlo-Rachio ', '') }}"
attributes:
zone_entity: "{{ trigger.entity_id }}"
started_at: "{{ trigger.from_state.last_changed.isoformat() }}"
completed_at: "{{ trigger.to_state.last_changed.isoformat() }}"
duration_min: >-
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
source_summary: "{{ trigger.to_state.attributes.get('Summary', '') }}"
- trigger:
- platform: state
entity_id: switch.front_lawn
from: "on"
to: "off"
sensor:
- name: Rachio Front Lawn Last Run
unique_id: rachio_front_lawn_last_run
icon: mdi:sprinkler-variant
unit_of_measurement: min
state_class: measurement
state: >-
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
attributes:
zone_entity: switch.front_lawn
zone_name: "{{ trigger.from_state.name | replace('Carlo-Rachio ', '') }}"
started_at: "{{ trigger.from_state.last_changed.isoformat() }}"
completed_at: "{{ trigger.to_state.last_changed.isoformat() }}"
source_summary: "{{ trigger.to_state.attributes.get('Summary', '') }}"
- trigger:
- platform: state
entity_id: switch.front_hedges_right_side_house
from: "on"
to: "off"
sensor:
- name: Rachio Front Hedges Last Run
unique_id: rachio_front_hedges_last_run
icon: mdi:sprinkler-variant
unit_of_measurement: min
state_class: measurement
state: >-
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
attributes:
zone_entity: switch.front_hedges_right_side_house
zone_name: "{{ trigger.from_state.name | replace('Carlo-Rachio ', '') }}"
started_at: "{{ trigger.from_state.last_changed.isoformat() }}"
completed_at: "{{ trigger.to_state.last_changed.isoformat() }}"
source_summary: "{{ trigger.to_state.attributes.get('Summary', '') }}"
- trigger:
- platform: state
entity_id: switch.left_side_house
from: "on"
to: "off"
sensor:
- name: Rachio Left Side House Last Run
unique_id: rachio_left_side_house_last_run
icon: mdi:sprinkler-variant
unit_of_measurement: min
state_class: measurement
state: >-
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
attributes:
zone_entity: switch.left_side_house
zone_name: "{{ trigger.from_state.name | replace('Carlo-Rachio ', '') }}"
started_at: "{{ trigger.from_state.last_changed.isoformat() }}"
completed_at: "{{ trigger.to_state.last_changed.isoformat() }}"
source_summary: "{{ trigger.to_state.attributes.get('Summary', '') }}"
- trigger:
- platform: state
entity_id: switch.backyard_shrubs
from: "on"
to: "off"
sensor:
- name: Rachio Backyard Shrubs Last Run
unique_id: rachio_backyard_shrubs_last_run
icon: mdi:sprinkler-variant
unit_of_measurement: min
state_class: measurement
state: >-
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
attributes:
zone_entity: switch.backyard_shrubs
zone_name: "{{ trigger.from_state.name | replace('Carlo-Rachio ', '') }}"
started_at: "{{ trigger.from_state.last_changed.isoformat() }}"
completed_at: "{{ trigger.to_state.last_changed.isoformat() }}"
source_summary: "{{ trigger.to_state.attributes.get('Summary', '') }}"
script:
rachio_stop_watering:
alias: Rachio Stop Watering
icon: mdi:stop-circle
mode: single
sequence:
- service: rachio.stop_watering
data:
devices: Carlo-Rachio
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: Stop watering requested from Home Assistant.
rachio_pause_watering_30:
alias: Rachio Pause Watering 30 Minutes
icon: mdi:pause-circle
mode: single
sequence:
- service: rachio.pause_watering
data:
devices: Carlo-Rachio
duration: 30
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: Watering pause requested from Home Assistant for 30 minutes.
rachio_resume_watering:
alias: Rachio Resume Watering
icon: mdi:play-circle
mode: single
sequence:
- service: rachio.resume_watering
data:
devices: Carlo-Rachio
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: Resume watering requested from Home Assistant.
automation:
- id: 4df26960-17cd-4a3b-9f29-9189d6ad1d73
alias: Rachio - Activity Feed
mode: queued
trigger:
- platform: state
entity_id:
- switch.front_lawn
- switch.front_hedges_right_side_house
- switch.left_side_house
- switch.backyard_shrubs
from: "off"
to: "on"
id: zone_started
- platform: state
entity_id:
- switch.front_lawn
- switch.front_hedges_right_side_house
- switch.left_side_house
- switch.backyard_shrubs
from: "on"
to: "off"
id: zone_finished
- platform: state
entity_id: switch.carlo_rachio_rain_delay
id: rain_delay_changed
- platform: state
entity_id: switch.carlo_rachio_in_standby_mode
id: standby_changed
action:
- variables:
zone_name: "{{ trigger.to_state.name | replace('Carlo-Rachio ', '') if trigger.to_state is defined else '' }}"
summary: "{{ trigger.to_state.attributes.get('Summary', '') if trigger.to_state is defined else '' }}"
duration_min: >-
{% if trigger.from_state is defined and trigger.to_state is defined %}
{% set start = as_timestamp(trigger.from_state.last_changed, default=none) %}
{% set stop = as_timestamp(trigger.to_state.last_changed, default=none) %}
{% if start is not none and stop is not none and stop >= start %}
{{ ((stop - start) / 60) | round(1) }}
{% else %}
unknown
{% endif %}
{% else %}
unknown
{% endif %}
- choose:
- conditions:
- condition: trigger
id: zone_started
sequence:
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: >-
{{ zone_name }} started watering{% if summary %}: {{ summary }}{% else %}.{% endif %}
- conditions:
- condition: trigger
id: zone_finished
sequence:
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: >-
{{ zone_name }} finished watering{% if duration_min not in ['unknown', 'unavailable', 'none', ''] %} after {{ duration_min }} minutes{% endif %}{% if summary %}: {{ summary }}{% else %}.{% endif %}
- conditions:
- condition: trigger
id: rain_delay_changed
sequence:
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: "Rain delay turned {{ trigger.to_state.state }}."
- conditions:
- condition: trigger
id: standby_changed
sequence:
- service: script.send_to_logbook
data:
topic: SPRINKLERS
message: "Standby mode turned {{ trigger.to_state.state }}."

Loading…
Cancel
Save

Powered by TurnKey Linux.