mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-12-13 02:22:27 +00:00
Compare commits
34 Commits
c62e778028
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7b0f58632 | ||
|
|
dbd5f43b19 | ||
|
|
d8d7c553eb | ||
|
|
f977809de7 | ||
|
|
c365a1c233 | ||
|
|
9d6c73fb05 | ||
|
|
8ec5173f4d | ||
|
|
c245c1ca78 | ||
|
|
96e86d6587 | ||
|
|
3345bf3b95 | ||
|
|
a8eca6f4bb | ||
|
|
d900c642dd | ||
|
|
1e490e53f6 | ||
|
|
5892711916 | ||
|
|
1ff1d9d81c | ||
|
|
02a554a793 | ||
|
|
2265f2b282 | ||
|
|
ea8d57393a | ||
|
|
ddda9e6573 | ||
|
|
aec426e602 | ||
|
|
1835b1203f | ||
|
|
75a250ebd3 | ||
|
|
8e743fe26d | ||
|
|
9fab3f0d90 | ||
|
|
41e56f9bb7 | ||
|
|
d609ca851c | ||
|
|
2c25c2b2d8 | ||
|
|
d6c32c9e16 | ||
|
|
eeb988d100 | ||
|
|
124a7bcfd3 | ||
|
|
6f9679cff1 | ||
|
|
44ff4528f1 | ||
|
|
8ee2aff40c | ||
|
|
bea84af5cd |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -62,6 +62,7 @@ llmvision
|
|||||||
backups
|
backups
|
||||||
deps
|
deps
|
||||||
config/backups
|
config/backups
|
||||||
|
panel-notes/
|
||||||
icloud
|
icloud
|
||||||
__pycache__
|
__pycache__
|
||||||
hacs
|
hacs
|
||||||
@@ -74,3 +75,6 @@ tts
|
|||||||
.ssh
|
.ssh
|
||||||
.auth
|
.auth
|
||||||
.nest
|
.nest
|
||||||
|
panel-notes
|
||||||
|
docker_14
|
||||||
|
docker_69
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -52,6 +52,15 @@ Live, personal Home Assistant configuration shared for **browsing and inspiratio
|
|||||||
### Network diagram
|
### Network diagram
|
||||||

|

|
||||||
|
|
||||||
|
**Docker add-ons & utilities**
|
||||||
|
| Container | Repo/Docs | Purpose |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Home Assistant Time Machine | [saihgupr/HomeAssistantTimeMachine](https://github.com/saihgupr/HomeAssistantTimeMachine) | Browse/diff/restore HA YAML (Lovelace, automations, scripts, ESPHome, packages) against existing backups. Blog walkthrough: [Time Machine for dashboards](https://www.vcloudinfo.com/2025/12/home-assistant-time-machine-dashboards.html). |
|
||||||
|
| Duplicati | [duplicati/duplicati](https://github.com/duplicati/duplicati) | Off-box, versioned backups for HA config and media. |
|
||||||
|
| Dozzle | [amir20/dozzle](https://github.com/amir20/dozzle) | Lightweight Docker log viewer (useful for quick tailing across the homelab stacks). |
|
||||||
|
| Cloudflared | [cloudflare/cloudflared](https://hub.docker.com/r/cloudflare/cloudflared) | Secure tunnel/edge access to Home Assistant without opening inbound ports. |
|
||||||
|
| WordPress | [wordpress](https://hub.docker.com/_/wordpress) | Hosts [vCloudInfo.com](https://www.vcloudinfo.com) for docs, how-tos, videos, and long-form writeups that accompany this config. |
|
||||||
|
|
||||||
### Gear tied to real automations (affiliate links)
|
### Gear tied to real automations (affiliate links)
|
||||||
Only listing hardware that appears in active packages/automations here.
|
Only listing hardware that appears in active packages/automations here.
|
||||||
https://amzn.to/48jVzZ3
|
https://amzn.to/48jVzZ3
|
||||||
@@ -88,4 +97,3 @@ https://amzn.to/48jVzZ3
|
|||||||
<a href="https://www.vCloudInfo.com/p/affiliate-disclosure.html">
|
<a href="https://www.vCloudInfo.com/p/affiliate-disclosure.html">
|
||||||
Affiliate Disclosure
|
Affiliate Disclosure
|
||||||
</a></p>
|
</a></p>
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2025.12.0
|
2025.12.2
|
||||||
@@ -1,6 +1,13 @@
|
|||||||
###################################
|
######################################################################
|
||||||
## Tornados are no Joke.
|
# @CCOSTAN - Follow Me on X
|
||||||
###################################
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# High Wind Alerts - Severe wind warnings (push + Activity feed)
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Logs to Activity feed while keeping existing notifications and actions.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
- alias: 'High Wind Speed Notification'
|
- alias: 'High Wind Speed Notification'
|
||||||
id: 5cc158a5-038a-4078-a9fb-c9f9cf9ecd49
|
id: 5cc158a5-038a-4078-a9fb-c9f9cf9ecd49
|
||||||
@@ -17,6 +24,11 @@
|
|||||||
above: 60
|
above: 60
|
||||||
|
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "WEATHER"
|
||||||
|
message: >-
|
||||||
|
Wind speed is {{ states('sensor.pirateweather_wind_speed') | round }} mph (thresholds: 30/40/60).
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
title: 'VERY HIGH WINDS:'
|
title: 'VERY HIGH WINDS:'
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
###################################
|
######################################################################
|
||||||
## Uses IFTTT to notify me of bad logins.
|
# @CCOSTAN - Follow Me on X
|
||||||
###################################
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Bad Login Attempts - Log security events to Activity feed
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Replaces phone push with `script.send_to_logbook` using `sensor.activity_feed`.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
- alias: Login Failure
|
- alias: Login Failure
|
||||||
id: 814c48ea-e2e1-4b75-92b0-581081af5ce5
|
id: 814c48ea-e2e1-4b75-92b0-581081af5ce5
|
||||||
@@ -9,11 +16,7 @@
|
|||||||
value_template: "{{ states('persistent_notification.httplogin') != 'unknown' }}"
|
value_template: "{{ states('persistent_notification.httplogin') != 'unknown' }}"
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
value1: 'Bad Login: '
|
topic: "SYSTEM"
|
||||||
value2: 'There was a Hack attempt!'
|
message: "Bad Login: There was a hack attempt. Check the HA UI for details."
|
||||||
value3: 'Go Check the GUI for details.'
|
|
||||||
who: 'carlo'
|
|
||||||
group: 'information'
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
###################################
|
######################################################################
|
||||||
## Trigger Dump
|
# @CCOSTAN - Follow Me on X
|
||||||
###################################
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Trigger Dump - Log feedreader events to Activity feed
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Writes a Logbook entry and publishes payload to MQTT for debugging.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
- alias: Trigger dump - MQTT
|
- alias: Trigger dump - MQTT
|
||||||
id: 74edd73d-f0a5-45cf-9561-c6a1777236e5
|
id: 74edd73d-f0a5-45cf-9561-c6a1777236e5
|
||||||
@@ -8,12 +15,10 @@
|
|||||||
- platform: event
|
- platform: event
|
||||||
event_type: feedreader
|
event_type: feedreader
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
value1: 'Check the MQTT Dump'
|
topic: "SYSTEM"
|
||||||
value2: '/dump/{{ trigger.platform }}'
|
message: "Check the MQTT dump: /dump/{{ trigger.platform }}"
|
||||||
who: 'carlo'
|
|
||||||
group: 'information'
|
|
||||||
- service: mqtt.publish
|
- service: mqtt.publish
|
||||||
data:
|
data:
|
||||||
topic: '/dump/{{ trigger.platform }}'
|
topic: '/dump/{{ trigger.platform }}'
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
###################################
|
######################################################################
|
||||||
## Start Up Section
|
# @CCOSTAN - Follow Me on X
|
||||||
###################################
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Startup Logbook Entry - Log HA restarts to Activity feed
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Uses `script.send_to_logbook` + `sensor.activity_feed` (no phone push).
|
||||||
|
# Keeps an Alexa announce when daytime.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
- alias: Startup Notification and Shut startup lights
|
- alias: Startup Notification and Shut startup lights
|
||||||
id: f3f0a8d1-6c40-43e0-91e4-827194f78506
|
id: f3f0a8d1-6c40-43e0-91e4-827194f78506
|
||||||
@@ -9,12 +17,10 @@
|
|||||||
- platform: homeassistant
|
- platform: homeassistant
|
||||||
event: start
|
event: start
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
title: 'Home Assistant StartUp'
|
topic: "SYSTEM"
|
||||||
value1: 'Home Assistant is Up and Running!'
|
message: "Home Assistant is Up and Running!"
|
||||||
who: 'carlo'
|
|
||||||
group: 'information'
|
|
||||||
|
|
||||||
- service: homeassistant.turn_off
|
- service: homeassistant.turn_off
|
||||||
entity_id:
|
entity_id:
|
||||||
@@ -35,4 +41,3 @@
|
|||||||
message: "Home Assistant has been restarted."
|
message: "Home Assistant has been restarted."
|
||||||
data:
|
data:
|
||||||
type: announce
|
type: announce
|
||||||
|
|
||||||
|
|||||||
@@ -90,4 +90,4 @@ scene: !include_dir_merge_list scene
|
|||||||
# switch: !include_dir_merge_list switch
|
# switch: !include_dir_merge_list switch
|
||||||
script: !include_dir_merge_named script
|
script: !include_dir_merge_named script
|
||||||
input_boolean: !include_dir_merge_named input_boolean
|
input_boolean: !include_dir_merge_named input_boolean
|
||||||
shell_command: !include_dir_merge_named shell_command
|
|
||||||
|
|||||||
@@ -1,14 +1,19 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# HomeKit Configuration for Home Assistant
|
# @CCOSTAN - Follow Me on X
|
||||||
#
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Description: This file controls the HomeKit integration settings,
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# defining which entities are exposed to Apple HomeKit.
|
# -------------------------------------------------------------------
|
||||||
#
|
# HomeKit Configuration - Multi-bridge for stability + Alexa-friendly streams
|
||||||
# Follow me on https://www.vcloudinfo.com/click-here
|
# Main bridge for lights/locks/climate; cameras/lock split to accessory bridges.
|
||||||
# Original Repository: https://github.com/CCOSTAN/Home-AssistantConfig
|
# Camera streams use go2rtc substreams/restreams for faster Echo Show playback.
|
||||||
##-------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
filter:
|
# Main bridge (everything except cameras + front door lock)
|
||||||
|
- name: Home Assistant Bridge
|
||||||
|
mode: bridge
|
||||||
|
port: 21063
|
||||||
|
filter:
|
||||||
include_domains:
|
include_domains:
|
||||||
- climate
|
- climate
|
||||||
- cover
|
- cover
|
||||||
@@ -18,18 +23,10 @@ filter:
|
|||||||
- media_player
|
- media_player
|
||||||
- sensor
|
- sensor
|
||||||
- script
|
- script
|
||||||
- sensor
|
|
||||||
- switch
|
- switch
|
||||||
- scene
|
- scene
|
||||||
- light
|
- light
|
||||||
include_entities:
|
include_entities:
|
||||||
- camera.bedroomgate
|
|
||||||
- camera.driveway
|
|
||||||
- camera.filtergate
|
|
||||||
- camera.frontdoorbell
|
|
||||||
- camera.poolcam
|
|
||||||
- camera.frontlawn
|
|
||||||
- camera.garagecam
|
|
||||||
- light.bedroom
|
- light.bedroom
|
||||||
- light.bedroom_lights
|
- light.bedroom_lights
|
||||||
- light.den_lights
|
- light.den_lights
|
||||||
@@ -48,28 +45,36 @@ filter:
|
|||||||
- light.sink
|
- light.sink
|
||||||
- switch.lr_amp
|
- switch.lr_amp
|
||||||
exclude_entities:
|
exclude_entities:
|
||||||
- lock.spaceship_door_lock
|
- lock.front_door
|
||||||
- lock.spaceship_charger_door_lock
|
# Cameras in accessory mode (better performance/reliability)
|
||||||
- lock.spaceship_trunk_lock
|
- name: HomeKit Cameras
|
||||||
- lock.spaceship_frunk_lock
|
mode: accessory
|
||||||
- climate.spaceship_hvac_climate_system
|
port: 21064
|
||||||
|
filter:
|
||||||
entity_config:
|
include_entities:
|
||||||
|
- camera.bedroomgate
|
||||||
|
- camera.driveway
|
||||||
|
- camera.filtergate
|
||||||
|
- camera.frontdoorbell
|
||||||
|
- camera.poolcam
|
||||||
|
- camera.frontlawn
|
||||||
|
- camera.garagecam
|
||||||
|
entity_config:
|
||||||
camera.frontdoorbell:
|
camera.frontdoorbell:
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/frontdoorbell?mp4
|
stream_source: rtsp://192.168.10.14:8554/frontdoorbell_alexa
|
||||||
camera.poolcam:
|
camera.poolcam:
|
||||||
linked_motion_sensor: binary_sensor.poolcam_motion_sensor
|
linked_motion_sensor: binary_sensor.poolcam_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/poolcam?mp4
|
stream_source: rtsp://192.168.10.14:8554/poolcam_sub
|
||||||
camera.frontlawn:
|
camera.frontlawn:
|
||||||
linked_motion_sensor: binary_sensor.frontlawn_motion_sensor
|
linked_motion_sensor: binary_sensor.frontlawn_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/frontlawn?mp4
|
stream_source: rtsp://192.168.10.14:8554/frontlawn_sub
|
||||||
camera.garagecam:
|
camera.garagecam:
|
||||||
linked_motion_sensor: binary_sensor.garagecam_motion_sensor
|
linked_motion_sensor: binary_sensor.garagecam_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/garagecam?mp4
|
stream_source: rtsp://192.168.10.14:8554/garagecam_sub
|
||||||
camera.bedroomgate:
|
camera.bedroomgate:
|
||||||
linked_motion_sensor: binary_sensor.bedroomgate_motion_sensor
|
linked_motion_sensor: binary_sensor.bedroomgate_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
@@ -77,8 +82,16 @@ entity_config:
|
|||||||
camera.driveway:
|
camera.driveway:
|
||||||
linked_motion_sensor: binary_sensor.driveway_motion_sensor
|
linked_motion_sensor: binary_sensor.driveway_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/driveway?mp4
|
stream_source: rtsp://192.168.10.14:8554/driveway_sub
|
||||||
camera.filtergate:
|
camera.filtergate:
|
||||||
linked_motion_sensor: binary_sensor.filtergate_motion_sensor
|
linked_motion_sensor: binary_sensor.filtergate_motion_sensor
|
||||||
video_codec: copy
|
video_codec: copy
|
||||||
stream_source: rtsp://192.168.10.14:8554/filtergate?mp4
|
stream_source: rtsp://192.168.10.14:8554/filtergate?mp4
|
||||||
|
|
||||||
|
# Front door lock in accessory mode (keeps lock responsive/available)
|
||||||
|
- name: HomeKit Front Door Lock
|
||||||
|
mode: accessory
|
||||||
|
port: 21065
|
||||||
|
filter:
|
||||||
|
include_entities:
|
||||||
|
- lock.front_door
|
||||||
|
|||||||
@@ -43,9 +43,10 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
|
|||||||
| [august.yaml](august.yaml) | Front-door August smart lock with Alexa Show camera pop-up when unlocked. | `lock.front_door`, media_player actions for front doorbell camera |
|
| [august.yaml](august.yaml) | Front-door August smart lock with Alexa Show camera pop-up when unlocked. | `lock.front_door`, media_player actions for front doorbell camera |
|
||||||
| [holiday.yaml](holiday.yaml) | REST-driven US holiday + flag sensors that color scenes and exterior lighting. | `sensor.holiday`, `sensor.flag`, JSON feed at `config/json_data/holidays.json` |
|
| [holiday.yaml](holiday.yaml) | REST-driven US holiday + flag sensors that color scenes and exterior lighting. | `sensor.holiday`, `sensor.flag`, JSON feed at `config/json_data/holidays.json` |
|
||||||
| [lightning.yaml](lightning.yaml) | Blitzortung lightning counter monitoring with snoozeable push actions. | `sensor.blitzortung_lightning_counter`, `input_boolean.snooze_lightning`, notify engine actions |
|
| [lightning.yaml](lightning.yaml) | Blitzortung lightning counter monitoring with snoozeable push actions. | `sensor.blitzortung_lightning_counter`, `input_boolean.snooze_lightning`, notify engine actions |
|
||||||
| [phynplus.yaml](phynplus.yaml) | Tie the Phyn Plus smart shutoff into HA notifications, automations, and valve overrides. | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `script.notify_engine_two_button` |
|
| [logbook_activity_feed.yaml](logbook_activity_feed.yaml) | Dummy `sensor.activity_feed` + helper to write clean Activity entries (Issue #1550). | `sensor.activity_feed`, `script.send_to_logbook` |
|
||||||
| [powerwall.yaml](powerwall.yaml) | Track Tesla Powerwall grid status and shed loads automatically when off-grid. | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `script.notify_engine` |
|
| [phynplus.yaml](phynplus.yaml) | Phyn shutoff automations with push + Activity feed + Repairs issues for leak events. | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `repairs.create` |
|
||||||
| [vacuum.yaml](vacuum.yaml) | Dreame (ex-Neato) vacuum orchestration with maintenance reminders and reset helpers. | `sensor.l10s_vacuum_task_status`, `sensor.l10s_vacuum_sensor_dirty_left`, `button.l10s_vacuum_reset_sensor` |
|
| [powerwall.yaml](powerwall.yaml) | Track Tesla Powerwall grid status and shed loads automatically when off-grid (alerts include Activity feed + Repairs). | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `repairs.create` |
|
||||||
|
| [vacuum.yaml](vacuum.yaml) | Dreame vacuum orchestration with room tracking, push alerts, Activity feed, and Repairs issues on errors. | `input_select.l10s_vacuum_phase`, `sensor.l10s_vacuum_error`, `repairs.create` |
|
||||||
| [hass_agent_homepc.yaml](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state from HASS.Agent to the office lamp for instant desk presence cues. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `switch.office_lamp_switch` |
|
| [hass_agent_homepc.yaml](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state from HASS.Agent to the office lamp for instant desk presence cues. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `switch.office_lamp_switch` |
|
||||||
| [finance.yaml](finance.yaml) | Yahoo Finance sensor bundle for portfolio glances and Lovelace cards. | `sensor.tsla`, `sensor.aapl`, `sensor.amzn`, `sensor.msft` |
|
| [finance.yaml](finance.yaml) | Yahoo Finance sensor bundle for portfolio glances and Lovelace cards. | `sensor.tsla`, `sensor.aapl`, `sensor.amzn`, `sensor.msft` |
|
||||||
|
|
||||||
@@ -60,8 +61,8 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
|
|||||||

|

|
||||||
|
|
||||||
### Dreame vacuum automations
|
### Dreame vacuum automations
|
||||||
- Logic lives in [vacuum.yaml](vacuum.yaml): weekday sweeping/weekend mopping, room-queue segment cleaning that pauses/docks on arrival, resumes after charging, and per-room notifications/briefing summaries.
|
- Logic lives in [vacuum.yaml](vacuum.yaml): continuous four-phase loop (sweep main, sweep baths, mop main, mop baths) driven by `input_select.l10s_vacuum_phase` and `input_text.l10s_vacuum_room_queue`, with per-room notifications and automatic reseeding between phases.
|
||||||
- Uses the Dreame HACS integration with map-based segments and daily resets to cover the whole house without repeating rooms.
|
- Uses the Dreame HACS integration with segment IDs to enforce bathrooms last in each sweep/mop pass, dock on arrival, and auto-run if idle for 3+ days.
|
||||||

|

|
||||||
|
|
||||||
### Blog & video deep dives
|
### Blog & video deep dives
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
# Alarm Package - Arming helpers, sensors, and alerting.
|
# Alarm Package - Arming helpers, sensors, and alerting.
|
||||||
|
# Related Issue: 1550
|
||||||
# Alarm sensors, customization, and automations for home security.
|
# Alarm sensors, customization, and automations for home security.
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
# Notes: Turns HVAC off when doors/windows are open and restores cool mode after closure.
|
# Notes: Turns HVAC off when doors/windows are open and restores cool mode after closure.
|
||||||
@@ -340,6 +341,10 @@ automation:
|
|||||||
from: 'on'
|
from: 'on'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "SECURITY"
|
||||||
|
message: "Alarm panel door opened."
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
value1: 'Someone has opened up the Alarm Panel Door!'
|
value1: 'Someone has opened up the Alarm Panel Door!'
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
# Neato Support for D7 Connected Botvac - control my [Neato Vacuum](http://amzn.to/2kqnnqu) with Home Assistant.
|
|
||||||
#-------------------------------------------
|
|
||||||
homeassistant:
|
|
||||||
customize_glob:
|
|
||||||
"*.arris_tg1682g_router*":
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------
|
|
||||||
|
|
||||||
group:
|
|
||||||
router:
|
|
||||||
name: Router Stats
|
|
||||||
|
|
||||||
entities:
|
|
||||||
- sensor.arris_tg1682g_router_bytes_received
|
|
||||||
- sensor.arris_tg1682g_router_bytes_sent
|
|
||||||
- sensor.arris_tg1682g_router_kbytesec_received
|
|
||||||
- sensor.arris_tg1682g_router_kbytesec_sent
|
|
||||||
- sensor.arris_tg1682g_router_packets_received
|
|
||||||
- sensor.arris_tg1682g_router_packets_sent
|
|
||||||
- sensor.arris_tg1682g_router_packetssec_received
|
|
||||||
- sensor.arris_tg1682g_router_packetssec_sent
|
|
||||||
@@ -46,6 +46,10 @@ automation:
|
|||||||
title: 'Low Battery'
|
title: 'Low Battery'
|
||||||
value1: 'The August Door lock is at {{ states("sensor.front_door_battery") }}% '
|
value1: 'The August Door lock is at {{ states("sensor.front_door_battery") }}% '
|
||||||
group: 'Battery_Alert'
|
group: 'Battery_Alert'
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "BATTERY"
|
||||||
|
message: "August Door lock battery low: {{ states('sensor.front_door_battery') }}%"
|
||||||
|
|
||||||
- alias: 'FrontDoor Bell Camera on Front Door Lock'
|
- alias: 'FrontDoor Bell Camera on Front Door Lock'
|
||||||
id: Doorbell_camera_front_door
|
id: Doorbell_camera_front_door
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
# Backups - Monitor backup jobs and alert on failures.
|
|
||||||
#-------------------------------------------
|
|
||||||
######################################################################
|
|
||||||
## Duplicati/backup status sensors and notifications.
|
|
||||||
######################################################################
|
|
||||||
# Added Duplicati to HA - https://github.com/CCOSTAN/Home-AssistantConfig/issues/1498
|
|
||||||
automation:
|
|
||||||
- alias: 'Backup Job Failed Notification'
|
|
||||||
id: 5b3a4c89-1234-4567-8901-23456789abcf
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id: sensor.dockerconfigs_backup_error_message
|
|
||||||
from: '-'
|
|
||||||
action:
|
|
||||||
- service: script.notify_engine
|
|
||||||
data:
|
|
||||||
who: 'carlo'
|
|
||||||
value1: 'Backup Job Error!'
|
|
||||||
value2: "Error: {{ states('sensor.dockerconfigs_backup_error_message') }}"
|
|
||||||
|
|
||||||
- alias: 'Backup Size Change Alert'
|
|
||||||
id: 5b3a4c89-1234-4567-8901-23456789abd0
|
|
||||||
trigger:
|
|
||||||
- platform: numeric_state
|
|
||||||
entity_id: sensor.dockerconfigs_backup_target_size
|
|
||||||
above: 10000000000 # Alert if backup size is over 10GB
|
|
||||||
action:
|
|
||||||
- service: script.notify_engine
|
|
||||||
data:
|
|
||||||
who: 'carlo'
|
|
||||||
value1: 'Backup Size Warning'
|
|
||||||
value2: >
|
|
||||||
Backup target size has grown to {{ states('sensor.dockerconfigs_backup_target_size') | float / 1000000000 }} GB.
|
|
||||||
Please verify backup contents and available storage.
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# Fire Tablet Alarm Panel -
|
|
||||||
# https://www.vcloudinfo.com/2017/07/visualizing-smart-home-using-home.html
|
|
||||||
#-------------------------------------------
|
|
||||||
#
|
|
||||||
# homeassistant:
|
|
||||||
# customize_glob:
|
|
||||||
# "sensor.*_alarm_panel*":
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# "binary_sensor.*_alarm_panel*":
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
sensor:
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
low_battery:
|
|
||||||
friendly_name: 'Low Battery'
|
|
||||||
value_template: >
|
|
||||||
{%- set threshold = 15 -%}
|
|
||||||
{%- set domains = ['light', 'switch', 'sensor', 'zwave', 'lock', 'binary_sensor'] -%}
|
|
||||||
{%- for domain in domains -%}
|
|
||||||
{%- for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
|
|
||||||
{{ item.attributes.friendly_name }} (
|
|
||||||
{%- if item.attributes.battery_level is defined -%}
|
|
||||||
{{ item.attributes.battery_level}}
|
|
||||||
{%- else -%}
|
|
||||||
{{item.state}}
|
|
||||||
{%- endif -%}%)
|
|
||||||
{%- if not loop.last -%}
|
|
||||||
{{', '}}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
|
|
||||||
automation:
|
|
||||||
- alias: 'Battery Alert'
|
|
||||||
id: 1a4f06f0-8763-4801-ba6c-55b87d1b0286
|
|
||||||
initial_state: 'on'
|
|
||||||
trigger:
|
|
||||||
- platform: time
|
|
||||||
at: '10:00:00'
|
|
||||||
- platform: time
|
|
||||||
at: '18:00:00'
|
|
||||||
condition:
|
|
||||||
condition: template
|
|
||||||
value_template: "{% if states('sensor.low_battery') %}true{% endif %}"
|
|
||||||
action:
|
|
||||||
- service: script.notify_engine
|
|
||||||
data:
|
|
||||||
value1: "Low battery levels: {{ states('sensor.low_battery') }}"
|
|
||||||
who: 'carlo'
|
|
||||||
apns_id: 'information'
|
|
||||||
@@ -134,6 +134,10 @@ script:
|
|||||||
entity_id: group.family
|
entity_id: group.family
|
||||||
state: 'not_home'
|
state: 'not_home'
|
||||||
sequence:
|
sequence:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "CLIMATE"
|
||||||
|
message: "Downstairs HVAC set to ECO (family not_home)."
|
||||||
- service: climate.set_preset_mode
|
- service: climate.set_preset_mode
|
||||||
data:
|
data:
|
||||||
entity_id: climate.downstairs
|
entity_id: climate.downstairs
|
||||||
@@ -148,6 +152,10 @@ script:
|
|||||||
entity_id: sensor.pirateweather_temperature
|
entity_id: sensor.pirateweather_temperature
|
||||||
above: 92
|
above: 92
|
||||||
sequence:
|
sequence:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "CLIMATE"
|
||||||
|
message: "Downstairs target set to 78F (family home, temp >92F)."
|
||||||
- service: climate.set_hvac_mode
|
- service: climate.set_hvac_mode
|
||||||
data:
|
data:
|
||||||
entity_id: climate.downstairs
|
entity_id: climate.downstairs
|
||||||
@@ -161,6 +169,10 @@ script:
|
|||||||
entity_id: group.family
|
entity_id: group.family
|
||||||
state: 'home'
|
state: 'home'
|
||||||
sequence:
|
sequence:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "CLIMATE"
|
||||||
|
message: "Downstairs target set to 80F (family home)."
|
||||||
- service: climate.set_hvac_mode
|
- service: climate.set_hvac_mode
|
||||||
data:
|
data:
|
||||||
entity_id: climate.downstairs
|
entity_id: climate.downstairs
|
||||||
@@ -183,6 +195,11 @@ automation:
|
|||||||
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
|
entity_id: sensor.downstairs_ac_runtime_since_last_filter_change
|
||||||
above: 800 # hours
|
above: 800 # hours
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "MAINTENANCE"
|
||||||
|
message: >-
|
||||||
|
Downstairs AC filter due (runtime >800h). Last changed {{ ((now() - states.input_datetime.downstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||||
- service: script.notify_engine # <-- keep your existing notify helper
|
- service: script.notify_engine # <-- keep your existing notify helper
|
||||||
data:
|
data:
|
||||||
title: "Home Maintenance Reminder"
|
title: "Home Maintenance Reminder"
|
||||||
@@ -200,6 +217,11 @@ automation:
|
|||||||
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
|
entity_id: sensor.upstairs_ac_runtime_since_last_filter_change
|
||||||
above: 450 # hours
|
above: 450 # hours
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "MAINTENANCE"
|
||||||
|
message: >-
|
||||||
|
Upstairs AC filter due (runtime >450h). Last changed {{ ((now() - states.input_datetime.upstairs_last_filter_change.last_changed).total_seconds() / 86400) | round(0) }} days ago.
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
title: "Home Maintenance Reminder"
|
title: "Home Maintenance Reminder"
|
||||||
@@ -245,6 +267,10 @@ automation:
|
|||||||
data:
|
data:
|
||||||
entity_id: climate.upstairs
|
entity_id: climate.upstairs
|
||||||
temperature: 78
|
temperature: 78
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "CLIMATE"
|
||||||
|
message: "Upstairs target temp corrected to 78F (guardrail)."
|
||||||
|
|
||||||
- alias: Set Downstairs to 77 When Both in Bed
|
- alias: Set Downstairs to 77 When Both in Bed
|
||||||
id: set_downstairs_nest_77_both_in_bed
|
id: set_downstairs_nest_77_both_in_bed
|
||||||
@@ -432,4 +458,3 @@ automation:
|
|||||||
- delay: "00:20:00"
|
- delay: "00:20:00"
|
||||||
- service: script.set_downstairs_target_temp_based_on_conditions
|
- service: script.set_downstairs_target_temp_based_on_conditions
|
||||||
- delay: "02:00:00" # stops it from being triggered again too soon.
|
- delay: "02:00:00" # stops it from being triggered again too soon.
|
||||||
|
|
||||||
|
|||||||
@@ -105,13 +105,10 @@ automation:
|
|||||||
entity_id: input_text.last_person_home
|
entity_id: input_text.last_person_home
|
||||||
data:
|
data:
|
||||||
value: "{{ trigger.to_state.entity_id.split('.')[1] }}"
|
value: "{{ trigger.to_state.entity_id.split('.')[1] }}"
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
who: 'parents'
|
topic: "GARAGE"
|
||||||
value1: "Large Garage has been auto-opened for {{ states('input_text.last_person_home') }}."
|
message: "Large Garage was auto-opened for {{ states('input_text.last_person_home') }}."
|
||||||
title: 'Garage Auto-Opened'
|
|
||||||
group: 'Welcome_Home'
|
|
||||||
camera_entity: camera.garagecam
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
## Entry helper prompt after arrival if auto-open didn’t fire.
|
## Entry helper prompt after arrival if auto-open didn’t fire.
|
||||||
@@ -215,6 +212,10 @@ automation:
|
|||||||
value1: "Unlocking for {{ trigger.to_state.name }} arriving from driving."
|
value1: "Unlocking for {{ trigger.to_state.name }} arriving from driving."
|
||||||
who: "family"
|
who: "family"
|
||||||
group: "Welcome_Home"
|
group: "Welcome_Home"
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "DOORS"
|
||||||
|
message: "Front door auto-unlocked for {{ trigger.to_state.name }} arriving from driving."
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
@@ -413,22 +414,6 @@ automation:
|
|||||||
from: 'home'
|
from: 'home'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- choose:
|
|
||||||
- conditions: "{{ is_state('binary_sensor.sleepnumber_carlo_stacey_is_in_bed','on') }}"
|
|
||||||
sequence:
|
|
||||||
- service: media_player.play_media
|
|
||||||
data:
|
|
||||||
entity_id: media_player.stacey_bedroom
|
|
||||||
media_content_id: 'show garage camera from home assistant'
|
|
||||||
media_content_type: custom
|
|
||||||
- delay: '00:10:00'
|
|
||||||
- service: media_player.play_media
|
|
||||||
data:
|
|
||||||
entity_id: media_player.stacey_bedroom
|
|
||||||
media_content_id: 'hide garage camera'
|
|
||||||
media_content_type: custom
|
|
||||||
|
|
||||||
default:
|
|
||||||
- service: media_player.play_media
|
- service: media_player.play_media
|
||||||
target:
|
target:
|
||||||
entity_id: media_player.kitchen
|
entity_id: media_player.kitchen
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
# More Info : https://www.vcloudinfo.com/
|
|
||||||
#-------------------------------------------
|
|
||||||
|
|
||||||
sensor:
|
|
||||||
- platform: command_line
|
|
||||||
name: "Download Grafana Solar"
|
|
||||||
command: 'curl -s -H "Authorization: Bearer eyJrIjoiZ0UwS1hpRVdCbFVVSTNSdER0Z29maHc4QmVuSXhxalYiLCJuIjoiSEFDYW1lcmEiLCJpZCI6MX0=" "http://192.168.10.10:3000/render/d/h_wosLIik/solar?orgId=1&from=now-1d%2Fd&to=now-1d%2Fd&height=750&width=1920" > /config/www/custom_ui/floorplan/images/branding/solar_readings.png'
|
|
||||||
scan_interval: 3000
|
|
||||||
|
|
||||||
- platform: command_line
|
|
||||||
name: "Download Grafana ATT SpeedTest"
|
|
||||||
command: 'curl -s -H "Authorization: Bearer eyJrIjoiZ0UwS1hpRVdCbFVVSTNSdER0Z29maHc4QmVuSXhxalYiLCJuIjoiSEFDYW1lcmEiLCJpZCI6MX0=" "http://192.168.10.10:3000/render/d/bdR1ZnFZk/att-speedtest?viewPanel=2&orgId=1" > /config/www/custom_ui/floorplan/images/branding/att_speedtest.png'
|
|
||||||
scan_interval: 3000
|
|
||||||
|
|
||||||
camera:
|
|
||||||
- platform: generic
|
|
||||||
name: "Grafana Solar Graph"
|
|
||||||
still_image_url: 'http://192.168.10.10:3000/render/d/h_wosLIik/solar?orgId=1&from=now-1d%2Fd&to=now-1d%2Fd&height=750&width=1920'
|
|
||||||
username: HA
|
|
||||||
password: HA
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
### Automations - Detect when things are not right. Like any Good Watchdog.
|
|
||||||
##############################################################################
|
|
||||||
automation:
|
|
||||||
- alias: 'Tweet Solar Production'
|
|
||||||
id: bd698bd9-780b-4268-bf90-2c7ff6daae99
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
- platform: sun
|
|
||||||
event: sunset
|
|
||||||
offset: '+02:30:00'
|
|
||||||
action:
|
|
||||||
- service: script.tweet_engine_image
|
|
||||||
data:
|
|
||||||
tweet: >-
|
|
||||||
{{ [
|
|
||||||
"I have just finished crunching the numbers and here is the latest #Solar Production graph. "
|
|
||||||
] | random + " #Charts #Tesla "
|
|
||||||
+ [
|
|
||||||
"(https://youtu.be/BartadUzGOA)",
|
|
||||||
"(https://www.vcloudinfo.com/2018/01/going-green-to-save-some-green-in-2018.html)",
|
|
||||||
"(https://www.vcloudinfo.com/2018/09/re-installing-tesla-solar-panels-again.html)"
|
|
||||||
]| random
|
|
||||||
}}
|
|
||||||
image: >-
|
|
||||||
{% set pictures = [
|
|
||||||
"/config/www/custom_ui/floorplan/images/branding/solar_readings.png"
|
|
||||||
] %}
|
|
||||||
{{ pictures|random }}
|
|
||||||
@@ -29,7 +29,7 @@ homeassistant:
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
sensor:
|
sensor:
|
||||||
- platform: rest
|
- platform: rest
|
||||||
resource: https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/json_data/holidays.json
|
resource: http://localhost:8123/local/json_data/holidays.json
|
||||||
name: Holiday
|
name: Holiday
|
||||||
scan_interval: 14400
|
scan_interval: 14400
|
||||||
value_template: >
|
value_template: >
|
||||||
@@ -45,29 +45,22 @@ sensor:
|
|||||||
# Sensor Uses Flag data generated by AI
|
# Sensor Uses Flag data generated by AI
|
||||||
################################################################################
|
################################################################################
|
||||||
- platform: rest
|
- platform: rest
|
||||||
resource: https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/json_data/flag_days.json
|
resource: http://localhost:8123/local/json_data/flag_days.json
|
||||||
name: Flag
|
name: Flag
|
||||||
scan_interval: 14400
|
scan_interval: 14400
|
||||||
value_template: >-
|
value_template: >-
|
||||||
{% set now_string = now().strftime('%m/%d') %}
|
{% set now_string = now().month ~ '/' ~ now().day %}
|
||||||
{% set now_full_string = now().strftime('%m/%d/%Y') %}
|
{% set now_full_string = now().strftime('%m/%d/%Y') %}
|
||||||
{% if value_json is defined and value_json.Flag_Days_US is defined %}
|
{% set flag_data = value_json.Flag_Days_US if value_json is defined and value_json.Flag_Days_US is defined else {} %}
|
||||||
{% set static_days = value_json.Flag_Days_US.static %}
|
{% set static_days = flag_data.static if flag_data.static is defined else {} %}
|
||||||
{% set dynamic_days = value_json.Flag_Days_US.dynamic %}
|
{% set dynamic_days = flag_data.dynamic if flag_data.dynamic is defined else {} %}
|
||||||
{% if static_days is defined and now_string in static_days %}
|
{% if now_string in static_days %}
|
||||||
True
|
True
|
||||||
{% elif dynamic_days is defined %}
|
{% elif now_full_string in dynamic_days %}
|
||||||
{% for day_val in dynamic_days %}
|
|
||||||
{% if day_val.date == now_full_string %}
|
|
||||||
True
|
True
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
{% else %}
|
||||||
False
|
False
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Countdown Sensor using WolfRam Alpha Natural language queries
|
# Countdown Sensor using WolfRam Alpha Natural language queries
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# @CCOSTAN
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Lightning Alerts - Monitor nearby strikes and notify.
|
# -------------------------------------------------------------------
|
||||||
#-------------------------------------------
|
# Lightning Alerts - Nearby strike warnings and snooze workflow
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Keeps push alerts but also logs to Activity feed.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Guide: https://www.vcloudinfo.com/2020/08/adding-a-lightning-sensor-to-home-assistant.html | Existing Issue #392
|
||||||
######################################################################
|
######################################################################
|
||||||
## Lightning sensor integration and alerting.
|
|
||||||
######################################################################
|
|
||||||
# Guide: https://www.vcloudinfo.com/2020/08/adding-a-lightning-sensor-to-home-assistant.html | Issue #392
|
|
||||||
input_boolean:
|
input_boolean:
|
||||||
snooze_lightning:
|
snooze_lightning:
|
||||||
name: Snooze Lightning
|
name: Snooze Lightning
|
||||||
@@ -45,6 +47,11 @@ automation:
|
|||||||
state: 'off'
|
state: 'off'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "WEATHER"
|
||||||
|
message: >-
|
||||||
|
Lightning detected within {{ (states('sensor.blitzortung_lightning_distance') | int / 1.609) | round(1, 'floor') }} miles.
|
||||||
- service: script.notify_engine_two_button
|
- service: script.notify_engine_two_button
|
||||||
data:
|
data:
|
||||||
title: 'Lightning Warning!'
|
title: 'Lightning Warning!'
|
||||||
|
|||||||
96
config/packages/llmvision.yaml
Normal file
96
config/packages/llmvision.yaml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# LLM Vision - Garage Cans X Check - detects reflective X on right wall
|
||||||
|
# Trigger with input_button.llmvision_garbage_check to update garbage_cans_out.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Notes: LLMVision analyzes camera.garagecam; expects strict "on"/"off" output.
|
||||||
|
# Docs: https://llmvision.gitbook.io/getting-started/usage/image-analyzer
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
input_button:
|
||||||
|
llmvision_garbage_check:
|
||||||
|
name: "LLM Vision: Garage cans check"
|
||||||
|
icon: mdi:delete-variant
|
||||||
|
|
||||||
|
input_boolean:
|
||||||
|
garbage_cans_out:
|
||||||
|
name: "Garbage Cans Out"
|
||||||
|
icon: mdi:trash-can
|
||||||
|
|
||||||
|
input_text:
|
||||||
|
llmvision_garbage_last_response:
|
||||||
|
name: "LLM Vision garage response"
|
||||||
|
max: 255
|
||||||
|
llmvision_garbage_last_keyframe:
|
||||||
|
name: "LLM Vision garage key frame"
|
||||||
|
max: 255
|
||||||
|
|
||||||
|
input_datetime:
|
||||||
|
llmvision_garbage_last_run:
|
||||||
|
name: "LLM Vision garage last run"
|
||||||
|
has_date: true
|
||||||
|
has_time: true
|
||||||
|
|
||||||
|
template:
|
||||||
|
- binary_sensor:
|
||||||
|
- name: "Garbage Cans Out"
|
||||||
|
unique_id: llmvision_garbage_cans_out
|
||||||
|
device_class: presence
|
||||||
|
state: "{{ is_state('input_boolean.garbage_cans_out', 'on') }}"
|
||||||
|
attributes:
|
||||||
|
last_run: "{{ states('input_datetime.llmvision_garbage_last_run') }}"
|
||||||
|
last_response: "{{ states('input_text.llmvision_garbage_last_response') }}"
|
||||||
|
last_key_frame: "{{ states('input_text.llmvision_garbage_last_keyframe') }}"
|
||||||
|
source_camera: camera.garagecam
|
||||||
|
|
||||||
|
automation:
|
||||||
|
- alias: LLM Vision - Garbage cans out
|
||||||
|
id: d88a2e6d-78f3-4bb7-9d9f-c4d06e6eb5a9
|
||||||
|
mode: restart
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: input_button.llmvision_garbage_check
|
||||||
|
variables:
|
||||||
|
prompt_text: >
|
||||||
|
Examine the image. I have taped a reflective X on the right wall. Look for the reflective X on the right wall. If you clearly see the X, respond exactly: on. If you cannot see the X, respond exactly: off. No other words.
|
||||||
|
action:
|
||||||
|
- service: llmvision.data_analyzer
|
||||||
|
response_variable: llmvision_result
|
||||||
|
data:
|
||||||
|
provider: !secret llmvision_provider_entry
|
||||||
|
model: gpt-4.1-nano
|
||||||
|
message: "{{ prompt_text }}"
|
||||||
|
sensor_entity: input_boolean.garbage_cans_out
|
||||||
|
image_entity:
|
||||||
|
- camera.garagecam
|
||||||
|
include_filename: false
|
||||||
|
target_width: 1280
|
||||||
|
max_tokens: 16
|
||||||
|
expose_images: true
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_response
|
||||||
|
data:
|
||||||
|
value: "{{ (llmvision_result.response_text | default('unknown'))[:250] }}"
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ llmvision_result is defined and llmvision_result.key_frame is defined }}"
|
||||||
|
sequence:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_keyframe
|
||||||
|
data:
|
||||||
|
value: "{{ llmvision_result.key_frame }}"
|
||||||
|
default:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_keyframe
|
||||||
|
data:
|
||||||
|
value: ""
|
||||||
|
- service: input_datetime.set_datetime
|
||||||
|
target:
|
||||||
|
entity_id: input_datetime.llmvision_garbage_last_run
|
||||||
|
data:
|
||||||
|
datetime: "{{ now() }}"
|
||||||
18
config/packages/logbook_activity_feed.yaml
Normal file
18
config/packages/logbook_activity_feed.yaml
Normal file
@@ -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
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Logbook Activity Feed - Dummy entity for Activity pseudo-filtering
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Provides `sensor.activity_feed` as a stable entity_id for `logbook.log`.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
template:
|
||||||
|
- sensor:
|
||||||
|
- name: Activity Feed
|
||||||
|
unique_id: activity_feed
|
||||||
|
icon: mdi:clipboard-text
|
||||||
|
state: "ready"
|
||||||
|
|
||||||
23
config/packages/n8n.yaml
Normal file
23
config/packages/n8n.yaml
Normal file
@@ -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
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# n8n Discord Router - Route HA events to Discord via JoAnnaBot
|
||||||
|
# Central REST command into n8n's Discord routing webhook
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# <No related GitHub issue>
|
||||||
|
# REST endpoint: n8n webhook /discord-router
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
rest_command:
|
||||||
|
send_to_discord:
|
||||||
|
url: "http://192.168.10.69:5678/webhook/discord-router"
|
||||||
|
method: POST
|
||||||
|
content_type: "application/json"
|
||||||
|
payload: >
|
||||||
|
{
|
||||||
|
"topic": "{{ topic }}",
|
||||||
|
"message": "{{ message }}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# @CCOSTAN
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Phyn Plus Water Shutoff - Leak detection and auto shutoff.
|
# -------------------------------------------------------------------
|
||||||
#-------------------------------------------
|
# Phyn Plus Water Shutoff - Leak detection and auto shutoff
|
||||||
######################################################################
|
# Related Issue: 1550
|
||||||
## Phyn Plus monitoring via custom integration.
|
# Push + Activity feed + Repairs issue while valve is closed.
|
||||||
######################################################################
|
# -------------------------------------------------------------------
|
||||||
# Info: https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html
|
# Info: https://www.vcloudinfo.com/2020/05/phyn-plus-smart-water-shutoff-device.html
|
||||||
# HACS: https://github.com/MizterB/homeassistant-phyn
|
# HACS: https://github.com/MizterB/homeassistant-phyn
|
||||||
## Phyn Plus Water ShutOff - https://amzn.to/2Zy3sbJ
|
# Product: https://amzn.to/2Zy3sbJ
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
automation:
|
automation:
|
||||||
@@ -27,6 +28,22 @@ automation:
|
|||||||
state: 'off'
|
state: 'off'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "WATER"
|
||||||
|
message: "Phyn detected a leak and shut off the water. Please verify."
|
||||||
|
|
||||||
|
- service: repairs.create
|
||||||
|
data:
|
||||||
|
issue_id: "phyn_leak_shutoff"
|
||||||
|
title: "Phyn leak shutoff"
|
||||||
|
severity: "critical"
|
||||||
|
persistent: true
|
||||||
|
description: >-
|
||||||
|
Phyn detected a potential leak and automatically closed the main water valve.
|
||||||
|
|
||||||
|
Verify there are no active leaks before restoring water service.
|
||||||
|
|
||||||
- service: script.notify_engine_two_button
|
- service: script.notify_engine_two_button
|
||||||
data:
|
data:
|
||||||
title: 'Phyn Leak Detection'
|
title: 'Phyn Leak Detection'
|
||||||
@@ -107,8 +124,11 @@ automation:
|
|||||||
entity_id: valve.phyn_shutoff_valve
|
entity_id: valve.phyn_shutoff_valve
|
||||||
to: 'open'
|
to: 'open'
|
||||||
action:
|
action:
|
||||||
|
- service: repairs.remove
|
||||||
|
continue_on_error: true
|
||||||
|
data:
|
||||||
|
issue_id: "phyn_leak_shutoff"
|
||||||
- service: persistent_notification.dismiss
|
- service: persistent_notification.dismiss
|
||||||
data:
|
data:
|
||||||
notification_id: 'phyn_leak_detection'
|
notification_id: 'phyn_leak_detection'
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# @CCOSTAN
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Tesla Powerwall - Monitoring and outage automations.
|
# -------------------------------------------------------------------
|
||||||
#-------------------------------------------
|
# Tesla Powerwall - Monitoring and outage automations
|
||||||
######################################################################
|
# Related Issue: 1550
|
||||||
## Powerwall status sensors and load-shedding helpers.
|
# Powerwall status sensors, outage alerting, and load-shedding helpers.
|
||||||
######################################################################
|
# -------------------------------------------------------------------
|
||||||
# Read more: https://www.vcloudinfo.com/2018/01/going-green-to-save-some-green-in-2018.html | Issue #272
|
# Notes: Read more https://www.vcloudinfo.com/2018/01/going-green-to-save-some-green-in-2018.html | Existing Issue #272
|
||||||
# Tesla Powerwall added via UI Integration
|
# Tesla Powerwall added via UI Integration
|
||||||
# --------------------------------------------------------------
|
######################################################################
|
||||||
# Binary Sensors:
|
# Binary Sensors:
|
||||||
# - binary_sensor.powerwall_charging ............. battery_charging (on=charging)
|
# - binary_sensor.powerwall_charging ............. battery_charging (on=charging)
|
||||||
# - binary_sensor.powerwall_connected_to_tesla ... connectivity (on=connected)
|
# - binary_sensor.powerwall_connected_to_tesla ... connectivity (on=connected)
|
||||||
@@ -54,6 +55,11 @@ automation:
|
|||||||
trigger.from_state.state not in ['unavailable', 'unknown', 'null'] }}
|
trigger.from_state.state not in ['unavailable', 'unknown', 'null'] }}
|
||||||
|
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "POWER"
|
||||||
|
message: >-
|
||||||
|
Grid status is {{ (trigger.to_state.state)|replace('on', 'up')|replace('off', 'down') }}.
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
title: "Electrical Grid Status {{ (trigger.to_state.state)|replace('on', 'up')|replace('off', 'down') }}."
|
title: "Electrical Grid Status {{ (trigger.to_state.state)|replace('on', 'up')|replace('off', 'down') }}."
|
||||||
@@ -124,6 +130,22 @@ automation:
|
|||||||
entity_id: binary_sensor.powerwall_grid_status
|
entity_id: binary_sensor.powerwall_grid_status
|
||||||
state: 'on'
|
state: 'on'
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "POWER"
|
||||||
|
message: "Powerwall charge below 60% for 24h (current: {{ states('sensor.powerwall_charge') }}%)."
|
||||||
|
|
||||||
|
- service: repairs.create
|
||||||
|
data:
|
||||||
|
issue_id: "powerwall_low_charge_60_24h"
|
||||||
|
title: "Powerwall charge low for 24h"
|
||||||
|
severity: "warning"
|
||||||
|
persistent: true
|
||||||
|
description: >-
|
||||||
|
Powerwall has been below 60% for 24 hours while the grid is online.
|
||||||
|
|
||||||
|
Current charge: {{ states('sensor.powerwall_charge') }}%.
|
||||||
|
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
title: "Powerwall Low Charge Alert - Current Charge: {{ states('sensor.powerwall_charge') }}"
|
title: "Powerwall Low Charge Alert - Current Charge: {{ states('sensor.powerwall_charge') }}"
|
||||||
@@ -131,6 +153,29 @@ automation:
|
|||||||
who: 'parents'
|
who: 'parents'
|
||||||
group: 'information'
|
group: 'information'
|
||||||
|
|
||||||
|
- alias: "Powerwall Low Charge Resolved - Clear Repair Issue"
|
||||||
|
id: 5fd1f0b3-0e64-4a4b-bd7a-9f5d5e6b8f90
|
||||||
|
mode: single
|
||||||
|
trigger:
|
||||||
|
- platform: numeric_state
|
||||||
|
entity_id: sensor.powerwall_charge
|
||||||
|
above: 60
|
||||||
|
for:
|
||||||
|
minutes: 10
|
||||||
|
condition:
|
||||||
|
- condition: state
|
||||||
|
entity_id: binary_sensor.powerwall_grid_status
|
||||||
|
state: 'on'
|
||||||
|
action:
|
||||||
|
- service: repairs.remove
|
||||||
|
continue_on_error: true
|
||||||
|
data:
|
||||||
|
issue_id: "powerwall_low_charge_60_24h"
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "POWER"
|
||||||
|
message: "Powerwall charge recovered above 60%. Cleared repair issue."
|
||||||
|
|
||||||
- alias: "Shut down Docker hosts and camera PoE at 75% Powerwall"
|
- alias: "Shut down Docker hosts and camera PoE at 75% Powerwall"
|
||||||
id: 25b3d3d8-92fa-454a-9f1c-6d3fd0f3af58
|
id: 25b3d3d8-92fa-454a-9f1c-6d3fd0f3af58
|
||||||
description: "Protect battery by shutting down non-essentials when Powerwall drops below 75%"
|
description: "Protect battery by shutting down non-essentials when Powerwall drops below 75%"
|
||||||
|
|||||||
@@ -54,5 +54,15 @@ automation:
|
|||||||
data:
|
data:
|
||||||
type: announce
|
type: announce
|
||||||
|
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "PRINTER"
|
||||||
|
message: >
|
||||||
|
{% if trigger.to_state.state == 'idle' %}
|
||||||
|
Printer has powered on and is ready
|
||||||
|
{% else %}
|
||||||
|
Printer is now printing
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------
|
#-------------------------------------------
|
||||||
|
|||||||
@@ -35,6 +35,10 @@ automation:
|
|||||||
value2: "Your harddrive is running out of Space! /dev/root:{{ states.sensor.disk_use_percent.state }}%!"
|
value2: "Your harddrive is running out of Space! /dev/root:{{ states.sensor.disk_use_percent.state }}%!"
|
||||||
value3: 'Attempting to clean'
|
value3: 'Attempting to clean'
|
||||||
who: 'carlo'
|
who: 'carlo'
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "SYSTEM"
|
||||||
|
message: "Disk usage exceeded 80% (/dev/root: {{ states.sensor.disk_use_percent.state }}%). Attempting to clean."
|
||||||
- service: tts.clear_cache
|
- service: tts.clear_cache
|
||||||
|
|
||||||
- alias: "Disk Use Alarm"
|
- alias: "Disk Use Alarm"
|
||||||
@@ -49,3 +53,7 @@ automation:
|
|||||||
value1: 'Hard Drive Monitor:'
|
value1: 'Hard Drive Monitor:'
|
||||||
value2: "Your harddrive is running out of Space! /dev/root:{{ states.sensor.disk_use_percent.state }}%!"
|
value2: "Your harddrive is running out of Space! /dev/root:{{ states.sensor.disk_use_percent.state }}%!"
|
||||||
who: 'carlo'
|
who: 'carlo'
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "SYSTEM"
|
||||||
|
message: "Disk usage exceeded 90% (/dev/root: {{ states.sensor.disk_use_percent.state }}%)."
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ automation:
|
|||||||
- service: button.press
|
- service: button.press
|
||||||
target:
|
target:
|
||||||
entity_id: button.qemu_docker2_101_reboot
|
entity_id: button.qemu_docker2_101_reboot
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "FRIGATE"
|
||||||
|
message: "Frigate server rebooted at 5 AM."
|
||||||
|
|
||||||
- alias: "Proxmox Updates Repair Issues"
|
- alias: "Proxmox Updates Repair Issues"
|
||||||
id: proxmox_updates_repair
|
id: proxmox_updates_repair
|
||||||
@@ -56,3 +60,7 @@ automation:
|
|||||||
- service: repairs.remove
|
- service: repairs.remove
|
||||||
data:
|
data:
|
||||||
issue_id: "{{ issue_id }}"
|
issue_id: "{{ issue_id }}"
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "PROXMOX"
|
||||||
|
message: "{{ node_name }} has been Patched"
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# @CCOSTAN
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Rheem EcoNet Water Heater - Monitoring and control.
|
# -------------------------------------------------------------------
|
||||||
#-------------------------------------------
|
# Rheem EcoNet Water Heater - Monitoring and control
|
||||||
######################################################################
|
# Related Issue: 1550
|
||||||
## Rheem EcoNet sensors/automations. https://amzn.to/36yOSnN
|
# Logs hot-water availability alerts to Activity feed; keeps announcements.
|
||||||
######################################################################
|
# -------------------------------------------------------------------
|
||||||
# Docs: https://www.home-assistant.io/integrations/econet/ | Issue #892
|
# Docs: https://www.home-assistant.io/integrations/econet/ | Existing notes: Issue #892
|
||||||
# Powerwall outage control for Rheem WH lives in config/packages/powerwall.yaml
|
# Powerwall outage control for Rheem WH lives in config/packages/powerwall.yaml
|
||||||
|
######################################################################
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
### Automations
|
### Automations
|
||||||
@@ -51,15 +53,13 @@ automation:
|
|||||||
entity_id: sensor.rheem_wh_available_hot_water
|
entity_id: sensor.rheem_wh_available_hot_water
|
||||||
below: 30 # Alert when available hot water drops below 30%
|
below: 30 # Alert when available hot water drops below 30%
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
title: "Hot Water Alert"
|
topic: "WATER"
|
||||||
value1: "Available hot water is below 30%."
|
message: "Hot water availability is below 30%."
|
||||||
who: 'carlo'
|
|
||||||
group: 'information'
|
|
||||||
- service: script.speech_engine
|
- service: script.speech_engine
|
||||||
data:
|
data:
|
||||||
value1: "Please be aware that the hot water has dropped below 30% availability. Please consider taking a shower at another time. Gallons used today: {{sensor.phyn_daily_water_usage}}"
|
value1: "Please be aware that the hot water has dropped below 30% availability. Gallons used today: {{sensor.phyn_daily_water_usage}}"
|
||||||
|
|
||||||
- service: notify.alexa_media_master_bathroom
|
- service: notify.alexa_media_master_bathroom
|
||||||
data:
|
data:
|
||||||
@@ -97,4 +97,3 @@ automation:
|
|||||||
# water_heater.rheem_wh
|
# water_heater.rheem_wh
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
###################################
|
|
||||||
## [SkyBell HD](https://amzn.to/2dcexIB)
|
|
||||||
###################################
|
|
||||||
|
|
||||||
|
|
||||||
skybell:
|
|
||||||
username: !secret skybell_username
|
|
||||||
password: !secret skybell_password
|
|
||||||
|
|
||||||
camera:
|
|
||||||
- platform: skybell
|
|
||||||
monitored_conditions:
|
|
||||||
- avatar
|
|
||||||
- activity
|
|
||||||
activity_name: "Last Activity"
|
|
||||||
|
|
||||||
binary_sensor:
|
|
||||||
- platform: skybell
|
|
||||||
monitored_conditions:
|
|
||||||
- button
|
|
||||||
- motion
|
|
||||||
|
|
||||||
light:
|
|
||||||
- platform: skybell # Part of the Outdoor Front Lights Group
|
|
||||||
|
|
||||||
sensor:
|
|
||||||
- platform: skybell
|
|
||||||
monitored_conditions:
|
|
||||||
- chime_level
|
|
||||||
|
|
||||||
button:
|
|
||||||
- platform: skybell
|
|
||||||
monitored_conditions:
|
|
||||||
# - do_not_disturb
|
|
||||||
- motion_sensor
|
|
||||||
|
|
||||||
###################################
|
|
||||||
## Automations
|
|
||||||
###################################
|
|
||||||
## Doorbell Press
|
|
||||||
automation:
|
|
||||||
- alias: 'Log SkyBell Pressed Activity'
|
|
||||||
id: 64226512-f35d-4179-bfcb-9de158b8d3f4
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id:
|
|
||||||
- binary_sensor.skybell_front_door_button
|
|
||||||
to: 'on'
|
|
||||||
- platform: event
|
|
||||||
event_type: skybell_pressed
|
|
||||||
|
|
||||||
condition:
|
|
||||||
- condition: template
|
|
||||||
value_template: >
|
|
||||||
{%- if states.binary_sensor.skybell_front_door_button.attributes.last_triggered -%}
|
|
||||||
{{ (as_timestamp(now()) - as_timestamp(states.binary_sensor.skybell_front_door_button.attributes.last_triggered)) > 200 }}
|
|
||||||
{%- else -%}
|
|
||||||
true
|
|
||||||
{%- endif -%}
|
|
||||||
|
|
||||||
action:
|
|
||||||
- service: script.skybell_pressed
|
|
||||||
|
|
||||||
|
|
||||||
# Motion Sensing
|
|
||||||
- alias: 'Log SkyBell Motion detection'
|
|
||||||
id: a22c2cb7-08b2-4bd1-bc82-77201253a000
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
- platform: event
|
|
||||||
event_type: skybell_motion
|
|
||||||
|
|
||||||
action:
|
|
||||||
- service: script.front_house_motion
|
|
||||||
|
|
||||||
# Turn SkyBell Light and Neato Schedule back on if it's turned off. Like any Good Watchdog.
|
|
||||||
|
|
||||||
- alias: Automated Mismatch WatchDog!
|
|
||||||
id: bff434b9-5916-42d1-8620-5723b4b1879d
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id:
|
|
||||||
- light.front_door
|
|
||||||
- switch.carlo_neato_schedule
|
|
||||||
to: 'off'
|
|
||||||
|
|
||||||
#Turn it back on!
|
|
||||||
action:
|
|
||||||
- service: homeassistant.turn_on
|
|
||||||
data:
|
|
||||||
entity_id: "{{ trigger.entity_id }}"
|
|
||||||
@@ -1,17 +1,18 @@
|
|||||||
#-------------------------------------------
|
######################################################################
|
||||||
# @CCOSTAN
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Speedtest Alerts - Notify when internet speeds drop.
|
# -------------------------------------------------------------------
|
||||||
#-------------------------------------------
|
# Speedtest Alerts - Log internet speed drops/restores to Activity feed
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Uses `script.send_to_logbook` + `sensor.activity_feed`.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
######################################################################
|
######################################################################
|
||||||
## Alerts if download/upload fall below thresholds.
|
|
||||||
######################################################################
|
|
||||||
# For more info or questions, visit https://www.vcloudinfo.com/click-here
|
|
||||||
|
|
||||||
automation:
|
automation:
|
||||||
- alias: "Notify Carlo if Internet Speed is Slow"
|
- alias: "Internet Speed is Slow (Logbook)"
|
||||||
id: notify-carlo-slow-internet-speed
|
id: notify-carlo-slow-internet-speed
|
||||||
description: "Sends a notification to Carlo's phone if download or upload speed falls below 400 Mbps."
|
description: "Logs an Activity entry if download or upload speed falls below 300 Mbps."
|
||||||
trigger:
|
trigger:
|
||||||
- platform: numeric_state
|
- platform: numeric_state
|
||||||
entity_id: sensor.speedtest_download
|
entity_id: sensor.speedtest_download
|
||||||
@@ -31,21 +32,18 @@ automation:
|
|||||||
{{ (now - uptime).total_seconds() / 60 >= 10 }}
|
{{ (now - uptime).total_seconds() / 60 >= 10 }}
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
title: "⚠️ Internet Speed Alert"
|
topic: "NETWORK"
|
||||||
value1: >-
|
message: >-
|
||||||
Download: {{ states('sensor.speedtest_download') }} Mbps,
|
Download: {{ states('sensor.speedtest_download') }} Mbps,
|
||||||
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
|
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
|
||||||
value2: "One or both speeds are below 300 Mbps."
|
One or both speeds are below 300 Mbps.
|
||||||
who: "carlo"
|
|
||||||
group: "information"
|
|
||||||
level: "active"
|
|
||||||
mode: single
|
mode: single
|
||||||
|
|
||||||
- alias: "Notify Carlo if Internet Speed is Restored"
|
- alias: "Internet Speed Restored (Logbook)"
|
||||||
id: notify-carlo-internet-speed-restored
|
id: notify-carlo-internet-speed-restored
|
||||||
description: "Sends a notification to Carlo's phone when download and upload speeds are back above 300/300 Mbps."
|
description: "Logs an Activity entry when download and upload speeds are back above 300/300 Mbps."
|
||||||
trigger:
|
trigger:
|
||||||
- platform: numeric_state
|
- platform: numeric_state
|
||||||
entity_id: sensor.speedtest_download
|
entity_id: sensor.speedtest_download
|
||||||
@@ -66,14 +64,11 @@ automation:
|
|||||||
{% set now = now() %}
|
{% set now = now() %}
|
||||||
{{ (now - uptime).total_seconds() / 60 >= 10 }}
|
{{ (now - uptime).total_seconds() / 60 >= 10 }}
|
||||||
action:
|
action:
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
title: "✅ Internet Speed Restored"
|
topic: "NETWORK"
|
||||||
value1: >-
|
message: >-
|
||||||
Download: {{ states('sensor.speedtest_download') }} Mbps,
|
Download: {{ states('sensor.speedtest_download') }} Mbps,
|
||||||
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
|
Upload: {{ states('sensor.speedtest_upload') }} Mbps.
|
||||||
value2: "Internet speeds are back to normal."
|
Internet speeds are back to normal.
|
||||||
who: "parents"
|
|
||||||
group: "information"
|
|
||||||
level: "active"
|
|
||||||
mode: single
|
mode: single
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
# More information : https://github.com/SmilyOrg/screenmqtt
|
|
||||||
#-------------------------------------------
|
|
||||||
homeassistant:
|
|
||||||
customize:
|
|
||||||
switch.computer_screens:
|
|
||||||
friendly_name: 'Computer Screens'
|
|
||||||
icon: mdi:monitor-multiple
|
|
||||||
emulated_hue_
|
|
||||||
|
|
||||||
#-------------------------------------------
|
|
||||||
button:
|
|
||||||
- platform: mqtt
|
|
||||||
name: computer_screens
|
|
||||||
state_topic: 'carlo-ultra/monitor/all/power/state'
|
|
||||||
command_topic: 'carlo-ultra/monitor/all/power/command'
|
|
||||||
|
|
||||||
#-------------------------------------------
|
|
||||||
#group - Added to group.interior_switches
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
#---Sensor Mail and Packages-----------------------------
|
|
||||||
usps:
|
|
||||||
username: !secret myusps_username
|
|
||||||
password: !secret myusps_password
|
|
||||||
|
|
||||||
camera:
|
|
||||||
- platform: usps
|
|
||||||
scan_interval: 5
|
|
||||||
|
|
||||||
group:
|
|
||||||
mail:
|
|
||||||
name: Mailbox Information
|
|
||||||
|
|
||||||
entities:
|
|
||||||
- sensor.usps_mail
|
|
||||||
- sensor.usps_packages
|
|
||||||
- camera.usps_mail
|
|
||||||
@@ -3,8 +3,9 @@
|
|||||||
# For more info visit https://www.vcloudinfo.com/click-here
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
# Dreame Vacuum Orchestration - Room queue, away/on-demand runs
|
# Dreame Vacuum Orchestration - Continuous phased sweep/mop with away/on-demand
|
||||||
# Weekday sweep, weekend mop, bathrooms last, notifications
|
# Related Issue: 1550
|
||||||
|
# Phases: sweep main, sweep baths, mop main, mop baths; notifications + idle auto-start
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
@@ -12,29 +13,31 @@
|
|||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
input_boolean:
|
input_boolean:
|
||||||
l10s_vacuum_weekday_cycle_active:
|
|
||||||
name: L10s Weekday Cleaning Active
|
|
||||||
icon: mdi:robot-vacuum
|
|
||||||
l10s_vacuum_on_demand:
|
l10s_vacuum_on_demand:
|
||||||
name: Dream Clean (On-Demand)
|
name: Dreame Clean (On-Demand)
|
||||||
icon: mdi:rocket-launch
|
icon: mdi:robot-vacuum
|
||||||
|
|
||||||
input_datetime:
|
input_select:
|
||||||
l10s_vacuum_last_weekday_cycle:
|
l10s_vacuum_phase:
|
||||||
name: L10s Last Weekday Cleaning Cycle
|
name: L10s Vacuum Phase
|
||||||
has_date: true
|
options:
|
||||||
has_time: true
|
- sweep_main
|
||||||
|
- sweep_bath
|
||||||
|
- mop_main
|
||||||
|
- mop_bath
|
||||||
|
initial: sweep_main
|
||||||
|
icon: mdi:playlist-check
|
||||||
|
|
||||||
input_text:
|
input_text:
|
||||||
l10s_vacuum_room_queue:
|
l10s_vacuum_room_queue:
|
||||||
name: L10s Vacuum Room Queue
|
name: L10s Vacuum Room Queue
|
||||||
|
# Room order (id:name): 14 Kitchen, 12 Dining, 10 Living, 7 Master Bedroom, 15 Foyer, 9 Stacey Office,
|
||||||
|
# 17 Formal Dining, 13 Hallway, 8 Justin Bedroom, 6 Paige Bedroom, 4 Master Bathroom, 2 Office, 1 Pool Bath, 3 Kids Bathroom.
|
||||||
icon: mdi:format-list-bulleted
|
icon: mdi:format-list-bulleted
|
||||||
max: 255
|
max: 255
|
||||||
l10s_vacuum_room_catalog:
|
l10s_vacuum_room_catalog:
|
||||||
name: L10s Vacuum Room Catalog
|
name: L10s Vacuum Room Catalog
|
||||||
# Room order (id:name): 14 Kitchen, 12 Dining, 10 Living, 7 Master Bedroom, 15 Foyer, 9 Stacey Office,
|
initial: "6,7,8,9,10,12,13,14,15,17,2,4,1,3"
|
||||||
# 17 Formal Dining, 13 Hallway, 8 Justin Bedroom, 6 Paige Bedroom, 4 Master Bathroom, 2 Office, 1 Pool Bath, 3 Kids Bathroom.
|
|
||||||
initial: "14,12,10,7,15,9,17,13,8,6,4,2,1,3"
|
|
||||||
icon: mdi:map
|
icon: mdi:map
|
||||||
max: 255
|
max: 255
|
||||||
l10s_vacuum_rooms_cleaned_today:
|
l10s_vacuum_rooms_cleaned_today:
|
||||||
@@ -52,54 +55,39 @@ script:
|
|||||||
mode: single
|
mode: single
|
||||||
sequence:
|
sequence:
|
||||||
- variables:
|
- variables:
|
||||||
# Weekday runs are sweeping (vacuum only), weekend runs are mopping
|
|
||||||
cleaning_mode: "{{ 'mopping' if now().weekday() in [5, 6] else 'sweeping' }}"
|
|
||||||
catalog_raw: "{{ states('input_text.l10s_vacuum_room_catalog') | default('', true) | string | replace(' ', '') }}"
|
catalog_raw: "{{ states('input_text.l10s_vacuum_room_catalog') | default('', true) | string | replace(' ', '') }}"
|
||||||
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
|
||||||
last_reset_raw: "{{ states('input_datetime.l10s_vacuum_last_weekday_cycle') }}"
|
|
||||||
last_reset_date_str: >
|
|
||||||
{% set dt = as_datetime(last_reset_raw, default=None) %}
|
|
||||||
{{ dt.date().isoformat() if dt is not none else '' }}
|
|
||||||
catalog_ints: "{{ catalog_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
catalog_ints: "{{ catalog_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
|
||||||
# Seed if queue is empty AND last reset was not today
|
|
||||||
can_seed_today: "{{ last_reset_date_str == '' or last_reset_date_str != now().date().isoformat() }}"
|
|
||||||
will_seed: >
|
|
||||||
{% set empty_queue = queue_ints | length == 0 %}
|
|
||||||
{% set on_demand = is_state('input_boolean.l10s_vacuum_on_demand', 'on') %}
|
|
||||||
{{ (empty_queue or (on_demand and queue_ints | length <= 1)) and catalog_ints | length > 0 and (can_seed_today or on_demand) }}
|
|
||||||
seeded_queue_list: "{{ catalog_ints if will_seed else queue_ints }}"
|
|
||||||
valid_queue_list: "{{ seeded_queue_list }}"
|
|
||||||
# Define bathroom IDs for mopping separation
|
|
||||||
bath_ids: [1, 3, 4]
|
bath_ids: [1, 3, 4]
|
||||||
nonbath_list: "{{ valid_queue_list | reject('in', bath_ids) | list }}"
|
main_ids: "{{ catalog_ints | reject('in', bath_ids) | list }}"
|
||||||
bath_list: "{{ valid_queue_list | select('in', bath_ids) | list }}"
|
phase_order: ['sweep_main', 'sweep_bath', 'mop_main', 'mop_bath']
|
||||||
# Prioritize non-bathrooms first, then bathrooms
|
phase_state: "{{ states('input_select.l10s_vacuum_phase') }}"
|
||||||
segments_to_clean: >
|
phase: "{{ phase_state if phase_state in phase_order else 'sweep_main' }}"
|
||||||
{% if nonbath_list | length > 0 %}
|
cleaning_mode: "{{ 'mopping' if 'mop_' in phase else 'sweeping' }}"
|
||||||
{{ nonbath_list }}
|
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
||||||
{% elif bath_list | length > 0 %}
|
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||||
{{ bath_list }}
|
phase_segments: >
|
||||||
|
{% if phase == 'sweep_main' %}
|
||||||
|
{{ main_ids }}
|
||||||
|
{% elif phase == 'sweep_bath' %}
|
||||||
|
{{ bath_ids }}
|
||||||
|
{% elif phase == 'mop_main' %}
|
||||||
|
{{ main_ids }}
|
||||||
{% else %}
|
{% else %}
|
||||||
[]
|
{{ bath_ids }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
segments_to_clean: "{{ queue_ints if queue_ints | length > 0 else phase_segments }}"
|
||||||
|
|
||||||
# 1. Seed the queue if necessary
|
# 1. Seed the queue if necessary
|
||||||
- choose:
|
- choose:
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ will_seed }}"
|
value_template: "{{ queue_ints | length == 0 and phase_segments | length > 0 }}"
|
||||||
sequence:
|
sequence:
|
||||||
- service: input_text.set_value
|
- service: input_text.set_value
|
||||||
target:
|
target:
|
||||||
entity_id: input_text.l10s_vacuum_room_queue
|
entity_id: input_text.l10s_vacuum_room_queue
|
||||||
data:
|
data:
|
||||||
value: "{{ catalog_raw }}"
|
value: "{{ phase_segments | join(',') }}"
|
||||||
- service: input_datetime.set_datetime
|
|
||||||
target:
|
|
||||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
|
||||||
data:
|
|
||||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
|
||||||
default: []
|
default: []
|
||||||
|
|
||||||
# 2. Check if there is anything to clean and stop if not
|
# 2. Check if there is anything to clean and stop if not
|
||||||
@@ -122,9 +110,6 @@ script:
|
|||||||
entity_id: vacuum.l10s_vacuum
|
entity_id: vacuum.l10s_vacuum
|
||||||
data:
|
data:
|
||||||
fan_speed: Standard
|
fan_speed: Standard
|
||||||
- service: input_boolean.turn_on
|
|
||||||
target:
|
|
||||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
|
||||||
- service: dreame_vacuum.vacuum_clean_segment
|
- service: dreame_vacuum.vacuum_clean_segment
|
||||||
target:
|
target:
|
||||||
entity_id: vacuum.l10s_vacuum
|
entity_id: vacuum.l10s_vacuum
|
||||||
@@ -138,36 +123,30 @@ script:
|
|||||||
|
|
||||||
automation:
|
automation:
|
||||||
|
|
||||||
- alias: 'Away Vacuum: Reset Queue (Mon/Sat)'
|
- alias: 'Vacuum: Reset Cleaned List at 5am'
|
||||||
id: 93a6e7dc-9c32-4d53-9f7c-651cd60f4b84
|
id: 18f7b6d3-c02c-4ec1-88b3-0c3b8b4c6f7b
|
||||||
trigger:
|
trigger:
|
||||||
- platform: time
|
- platform: time
|
||||||
at: '08:55:00'
|
at: '05:00:00'
|
||||||
condition:
|
|
||||||
- condition: time
|
|
||||||
weekday:
|
|
||||||
- mon
|
|
||||||
- sat
|
|
||||||
action:
|
action:
|
||||||
- service: input_text.set_value
|
|
||||||
target:
|
|
||||||
entity_id: input_text.l10s_vacuum_room_queue
|
|
||||||
data:
|
|
||||||
value: "{{ states('input_text.l10s_vacuum_room_catalog') }}"
|
|
||||||
- service: input_text.set_value
|
- service: input_text.set_value
|
||||||
target:
|
target:
|
||||||
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
||||||
data:
|
data:
|
||||||
value: ""
|
value: ""
|
||||||
- service: input_boolean.turn_off
|
|
||||||
target:
|
- alias: 'Vacuum: Auto-Start if Idle 3 Days'
|
||||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
id: c6b3f1e8-9a3f-4098-9b9e-1c7f2d6f1d11
|
||||||
- service: input_datetime.set_datetime
|
trigger:
|
||||||
target:
|
- platform: time
|
||||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
at: '16:00:00'
|
||||||
data:
|
condition:
|
||||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
- condition: template
|
||||||
- service: input_boolean.turn_off
|
value_template: >
|
||||||
|
{% set last = state_attr('script.l10s_vacuum_start_next_room','last_triggered') %}
|
||||||
|
{{ last is none or (now() - last).days >= 3 }}
|
||||||
|
action:
|
||||||
|
- service: input_boolean.turn_on
|
||||||
target:
|
target:
|
||||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
|
|
||||||
@@ -190,6 +169,9 @@ automation:
|
|||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
|
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
|
||||||
action:
|
action:
|
||||||
|
- service: input_boolean.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
- service: script.l10s_vacuum_start_next_room
|
- service: script.l10s_vacuum_start_next_room
|
||||||
|
|
||||||
- alias: 'Away Vacuum: Dock When Family Returns'
|
- alias: 'Away Vacuum: Dock When Family Returns'
|
||||||
@@ -202,9 +184,6 @@ automation:
|
|||||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
to: 'off'
|
to: 'off'
|
||||||
condition:
|
condition:
|
||||||
- condition: state
|
|
||||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
|
||||||
state: 'on'
|
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: >
|
value_template: >
|
||||||
{{ is_state('vacuum.l10s_vacuum', 'cleaning') or is_state('vacuum.l10s_vacuum', 'returning') or is_state('vacuum.l10s_vacuum', 'paused') }}
|
{{ is_state('vacuum.l10s_vacuum', 'cleaning') or is_state('vacuum.l10s_vacuum', 'returning') or is_state('vacuum.l10s_vacuum', 'paused') }}
|
||||||
@@ -223,52 +202,50 @@ automation:
|
|||||||
- platform: state
|
- platform: state
|
||||||
entity_id: sensor.l10s_vacuum_current_room
|
entity_id: sensor.l10s_vacuum_current_room
|
||||||
for: '00:03:00'
|
for: '00:03:00'
|
||||||
- platform: state
|
|
||||||
entity_id: vacuum.l10s_vacuum
|
|
||||||
to: 'cleaning'
|
|
||||||
for: '00:03:00'
|
|
||||||
variables:
|
variables:
|
||||||
room_map: {14:'kitchen',12:'dining-room',10:'living room',7:'master-bedroom',15:'foyer',9:'stacey-office',17:'formal-dining',13:'hallway',8:'justin-bedroom',6:'paige-bedroom',4:'master-bathroom',2:'office',1:'pool-bath',3:'kids-bathroom'}
|
room_map: {14:'kitchen',12:'dining-room',10:'living room',7:'master-bedroom',15:'foyer',9:'stacey-office',17:'formal-dining',13:'hallway',8:'justin-bedroom',6:'paige-bedroom',4:'master-bathroom',2:'office',1:'pool-bath',3:'kids-bathroom'}
|
||||||
catalog_raw: "{{ states('input_text.l10s_vacuum_room_catalog') | default('', true) | string | replace(' ', '') }}"
|
|
||||||
catalog_ints: "{{ catalog_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
|
||||||
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
||||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list | default([], true) }}"
|
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | list | default([], true) }}"
|
||||||
working_queue: "{{ queue_ints if queue_ints | length > 0 else catalog_ints }}"
|
|
||||||
current_room_id: "{{ trigger.to_state.attributes.room_id | default(state_attr('sensor.l10s_vacuum_current_room', 'room_id'), true) | int(0) }}"
|
current_room_id: "{{ trigger.to_state.attributes.room_id | default(state_attr('sensor.l10s_vacuum_current_room', 'room_id'), true) | int(0) }}"
|
||||||
matched_room_id: "{{ current_room_id if current_room_id > 0 and current_room_id in (working_queue | default([], true)) else 0 }}"
|
matched_room_id: "{{ current_room_id if current_room_id > 0 and current_room_id in (queue_ints | default([], true)) else 0 }}"
|
||||||
remaining_rooms: "{{ working_queue | reject('equalto', matched_room_id) | list | join(',') }}"
|
remaining_list: >
|
||||||
remaining_value: >
|
{% set rem = [] %}
|
||||||
{% set rem = remaining_rooms | string %}
|
{% set removed = namespace(done=false) %}
|
||||||
{% if rem | length == 0 and working_queue | length > 1 %}
|
{% for r in queue_ints %}
|
||||||
{{ working_queue | join(',') }}
|
{% if not removed.done and r == matched_room_id %}
|
||||||
|
{% set removed.done = true %}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
{% set rem = rem + [r] %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
{{ rem }}
|
{{ rem }}
|
||||||
{% endif %}
|
remaining_rooms: "{{ remaining_list | join(',') }}"
|
||||||
remaining_value_str: >
|
remaining_count: "{{ remaining_list | length }}"
|
||||||
{% set rv = remaining_value %}
|
phase_order: ['sweep_main', 'sweep_bath', 'mop_main', 'mop_bath']
|
||||||
{% if rv is string %}
|
phase_state: "{{ states('input_select.l10s_vacuum_phase') }}"
|
||||||
{{ rv }}
|
phase: "{{ phase_state if phase_state in phase_order else 'sweep_main' }}"
|
||||||
{% elif rv is iterable %}
|
phase_index: "{{ phase_order.index(phase) if phase in phase_order else 0 }}"
|
||||||
{{ rv | map('string') | join(',') }}
|
has_next_phase: "{{ phase_index < (phase_order | length) - 1 }}"
|
||||||
{% else %}
|
next_phase: "{{ phase_order[phase_index + 1] if has_next_phase else '' }}"
|
||||||
{{ rv | string }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
condition:
|
condition:
|
||||||
# Only run if there's actually a queue and a room was successfully matched to the start of the queue
|
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ working_queue | length > 0 }}"
|
value_template: "{{ queue_ints | length > 0 }}"
|
||||||
- condition: template
|
|
||||||
value_template: "{{ matched_room_id != 0 }}"
|
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ matched_room_id != 0 }}"
|
value_template: "{{ matched_room_id != 0 }}"
|
||||||
|
- condition: state
|
||||||
|
entity_id: vacuum.l10s_vacuum
|
||||||
|
state: 'cleaning'
|
||||||
|
- condition: state
|
||||||
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
|
state: 'on'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- service: input_text.set_value
|
- service: input_text.set_value
|
||||||
target:
|
target:
|
||||||
entity_id: input_text.l10s_vacuum_room_queue
|
entity_id: input_text.l10s_vacuum_room_queue
|
||||||
data:
|
data:
|
||||||
value: "{{ remaining_value_str }}"
|
value: "{{ remaining_rooms }}"
|
||||||
- variables:
|
- variables:
|
||||||
cleaned_raw: "{{ states('input_text.l10s_vacuum_rooms_cleaned_today') | default('', true) | string }}"
|
cleaned_raw: "{{ states('input_text.l10s_vacuum_rooms_cleaned_today') | default('', true) | string }}"
|
||||||
cleaned_parts: "{{ cleaned_raw | regex_findall('[^,]+') | map('trim') | reject('equalto','') | list }}"
|
cleaned_parts: "{{ cleaned_raw | regex_findall('[^,]+') | map('trim') | reject('equalto','') | list }}"
|
||||||
@@ -280,65 +257,54 @@ automation:
|
|||||||
{% else %}
|
{% else %}
|
||||||
{{ parts | join(', ') }}
|
{{ parts | join(', ') }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
remaining_count: "{{ remaining_value_str | regex_findall('[^,]+') | length if remaining_value_str | length > 0 else 0 }}"
|
|
||||||
- service: input_text.set_value
|
- service: input_text.set_value
|
||||||
target:
|
target:
|
||||||
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
||||||
data:
|
data:
|
||||||
value: "{{ updated_cleaned }}"
|
value: "{{ updated_cleaned }}"
|
||||||
- service: script.notify_engine
|
- service: script.send_to_logbook
|
||||||
data:
|
data:
|
||||||
title: 'Vacuum Room Cleaned'
|
topic: "VACUUM"
|
||||||
value1: "{{ room_name }} is clean."
|
message: "{{ room_name }} is clean. Remaining: {{ remaining_count }}."
|
||||||
value2: "Remaining: {{ remaining_count }}."
|
|
||||||
ios_category: 'camera'
|
|
||||||
camera_entity: 'camera.l10s_vacuum_map'
|
|
||||||
content_type: 'jpeg'
|
|
||||||
who: 'carlo'
|
|
||||||
group: 'information'
|
|
||||||
- choose:
|
- choose:
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ remaining_rooms | length > 0 }}"
|
value_template: "{{ remaining_count > 0 }}"
|
||||||
sequence:
|
sequence:
|
||||||
- service: script.l10s_vacuum_start_next_room
|
- service: script.l10s_vacuum_start_next_room
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ remaining_rooms | length == 0 }}"
|
value_template: "{{ remaining_count == 0 and has_next_phase }}"
|
||||||
sequence:
|
sequence:
|
||||||
|
- service: input_select.select_option
|
||||||
|
target:
|
||||||
|
entity_id: input_select.l10s_vacuum_phase
|
||||||
|
data:
|
||||||
|
option: "{{ next_phase }}"
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.l10s_vacuum_room_queue
|
||||||
|
data:
|
||||||
|
value: ""
|
||||||
|
- service: script.l10s_vacuum_start_next_room
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ remaining_count == 0 and not has_next_phase }}"
|
||||||
|
sequence:
|
||||||
|
- service: input_select.select_option
|
||||||
|
target:
|
||||||
|
entity_id: input_select.l10s_vacuum_phase
|
||||||
|
data:
|
||||||
|
option: "sweep_main"
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.l10s_vacuum_room_queue
|
||||||
|
data:
|
||||||
|
value: ""
|
||||||
- service: input_boolean.turn_off
|
- service: input_boolean.turn_off
|
||||||
target:
|
target:
|
||||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
- service: input_datetime.set_datetime
|
- service: script.l10s_vacuum_start_next_room
|
||||||
target:
|
|
||||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
|
||||||
data:
|
|
||||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
|
||||||
|
|
||||||
- alias: 'Away Vacuum: Cycle Complete'
|
|
||||||
id: 8fa7779a-957b-49a3-84e7-36ca93c2e0d2
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id: sensor.l10s_vacuum_task_status
|
|
||||||
to: 'completed'
|
|
||||||
- platform: state
|
|
||||||
entity_id: vacuum.l10s_vacuum
|
|
||||||
to: 'docked'
|
|
||||||
for: 00:05:00
|
|
||||||
condition:
|
|
||||||
- condition: template
|
|
||||||
value_template: "{{ is_state('sensor.l10s_vacuum_task_status', 'completed') }}"
|
|
||||||
- condition: template
|
|
||||||
value_template: "{{ (states('input_text.l10s_vacuum_room_queue') | replace(' ', '')) | length == 0 }}"
|
|
||||||
action:
|
|
||||||
- service: input_boolean.turn_off
|
|
||||||
target:
|
|
||||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
|
||||||
- service: input_datetime.set_datetime
|
|
||||||
target:
|
|
||||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
|
||||||
data:
|
|
||||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
|
||||||
|
|
||||||
- alias: 'Vacuum Sensor Cleaning Silencer'
|
- alias: 'Vacuum Sensor Cleaning Silencer'
|
||||||
id: 6548de52-a4a4-4df2-9d66-9c2c15577a7f
|
id: 6548de52-a4a4-4df2-9d66-9c2c15577a7f
|
||||||
@@ -366,6 +332,23 @@ automation:
|
|||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ states('sensor.l10s_vacuum_error') not in ['no_error', 'unavailable'] }}"
|
value_template: "{{ states('sensor.l10s_vacuum_error') not in ['no_error', 'unavailable'] }}"
|
||||||
action:
|
action:
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "VACUUM"
|
||||||
|
message: "{{ states('sensor.l10s_vacuum_error') }} - {{ states('sensor.l10s_vacuum_current_room') }}"
|
||||||
|
|
||||||
|
- service: repairs.create
|
||||||
|
data:
|
||||||
|
issue_id: "vacuum_error"
|
||||||
|
title: "Vacuum needs help"
|
||||||
|
severity: "warning"
|
||||||
|
persistent: true
|
||||||
|
description: >-
|
||||||
|
Vacuum reported an error and needs intervention.
|
||||||
|
|
||||||
|
Error: {{ states('sensor.l10s_vacuum_error') }}
|
||||||
|
Room: {{ states('sensor.l10s_vacuum_current_room') }}
|
||||||
|
|
||||||
- service: script.notify_engine
|
- service: script.notify_engine
|
||||||
data:
|
data:
|
||||||
title: 'Help vacuum'
|
title: 'Help vacuum'
|
||||||
@@ -390,3 +373,20 @@ automation:
|
|||||||
entity_id: vacuum.l10s_vacuum
|
entity_id: vacuum.l10s_vacuum
|
||||||
- delay: 00:20:00
|
- delay: 00:20:00
|
||||||
- event: event_did_someone_help_vacuum_loop
|
- event: event_did_someone_help_vacuum_loop
|
||||||
|
|
||||||
|
- alias: "Vacuum Error Resolved - Clear Repair Issue"
|
||||||
|
id: 2a0b3f7f-2f1e-4d2d-8dd4-0f6e4e34b02b
|
||||||
|
mode: single
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: sensor.l10s_vacuum_error
|
||||||
|
to: 'no_error'
|
||||||
|
action:
|
||||||
|
- service: repairs.remove
|
||||||
|
continue_on_error: true
|
||||||
|
data:
|
||||||
|
issue_id: "vacuum_error"
|
||||||
|
- service: script.send_to_logbook
|
||||||
|
data:
|
||||||
|
topic: "VACUUM"
|
||||||
|
message: "Vacuum error cleared."
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ Reusable scripts that other automations call for notifications, lighting, and sa
|
|||||||
| File | Why it matters |
|
| File | Why it matters |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [notify_engine.yaml](notify_engine.yaml) | Single entrypoint for rich push notifications. |
|
| [notify_engine.yaml](notify_engine.yaml) | Single entrypoint for rich push notifications. |
|
||||||
|
| [send_to_logbook.yaml](send_to_logbook.yaml) | Generic `logbook.log` helper for Activity feed entries (Issue #1550). |
|
||||||
| [speech_engine.yaml](speech_engine.yaml) | TTS/announcement orchestration with templated speech. |
|
| [speech_engine.yaml](speech_engine.yaml) | TTS/announcement orchestration with templated speech. |
|
||||||
| [monthly_color_scene.yaml](monthly_color_scene.yaml) | Seasonal lighting scenes used across automations. |
|
| [monthly_color_scene.yaml](monthly_color_scene.yaml) | Seasonal lighting scenes used across automations. |
|
||||||
| [interior_off.yaml](interior_off.yaml) | One-call <20>all interior lights off<66> helper. |
|
| [interior_off.yaml](interior_off.yaml) | One-call <20>all interior lights off<66> helper. |
|
||||||
|
|||||||
32
config/script/send_to_logbook.yaml
Normal file
32
config/script/send_to_logbook.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Send To Logbook - Generic helper for Activity/logbook entries
|
||||||
|
# Related Issue: 1550
|
||||||
|
# Calls `logbook.log` using `sensor.activity_feed` as the entity_id.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
send_to_logbook:
|
||||||
|
alias: Send To Logbook
|
||||||
|
mode: queued
|
||||||
|
fields:
|
||||||
|
topic:
|
||||||
|
description: Logbook entry name (headline)
|
||||||
|
example: "n8n"
|
||||||
|
message:
|
||||||
|
description: Logbook entry message
|
||||||
|
example: "Webhook received and workflow started."
|
||||||
|
sequence:
|
||||||
|
- condition: template
|
||||||
|
value_template: >-
|
||||||
|
{{ topic is defined and (topic | string | trim) != '' and
|
||||||
|
message is defined and (message | string | trim) != '' }}
|
||||||
|
- service: logbook.log
|
||||||
|
data:
|
||||||
|
name: "{{ topic | string | trim }}"
|
||||||
|
message: "{{ message | string | trim }}"
|
||||||
|
entity_id: sensor.activity_feed
|
||||||
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
|
|
||||||
<h1 align="center">
|
|
||||||
<a name="logo" href="https://www.vCloudInfo.com/tag/iot"><img src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/x_profile.png" alt="Bear Stone Smart Home" width="200"></a>
|
|
||||||
<br>
|
|
||||||
Bear Stone Smart Home Documentation
|
|
||||||
</h1>
|
|
||||||
<h4 align="center">Be sure to :star: my configuration repo so you can keep up to date on any daily progress!</h4>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[](https://x.com/ccostan)
|
|
||||||
[](https://www.youtube.com/vCloudInfo?sub_confirmation=1)
|
|
||||||
[](https://github.com/CCOSTAN) <br>
|
|
||||||
[](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)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Shell commands Home Assistant can call for maintenance or integrations that need a CLI nudge.
|
|
||||||
|
|
||||||
### Quick navigation
|
|
||||||
- [Repo overview](../../README.md) | [Config index](../README.md) | [Shell scripts](../shell_scripts)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Featured files to browse
|
|
||||||
| File | Why it matters |
|
|
||||||
| --- | --- |
|
|
||||||
| [flush_pm2_logs.yaml](flush_pm2_logs.yaml) | Quick cleanup for PM2 log files. |
|
|
||||||
| [restart_homebridge.yaml](restart_homebridge.yaml) | One-shot command to restart Homebridge. |
|
|
||||||
|
|
||||||
### Tips
|
|
||||||
- Keep commands idempotent and fast; HA will run them synchronously.
|
|
||||||
- Store long scripts in `shell_scripts/` and trigger them from here.
|
|
||||||
|
|
||||||
|
|
||||||
**All of my configuration files are tested against the most stable version of home-assistant.**
|
|
||||||
|
|
||||||
<a name="bottom" href="https://github.com/CCOSTAN/Home-AssistantConfig#logo"><img align="right" border="0" src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/www/custom_ui/floorplan/images/branding/up_arrow.png" width="25" ></a>
|
|
||||||
|
|
||||||
**Still have questions on my Config?** <br>
|
|
||||||
**Message me on X :** [](https://www.x.com/ccostan)
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a target="_blank" href="https://www.buymeacoffee.com/vCloudInfo"><img src="https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg" alt="Buy me a coffee"><span style="margin-left:5px">You can buy me a coffee</span></a><a target="_blank" href="https://www.buymeacoffee.com/vCloudInfo"><img src="https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg" alt="Buy me a coffee"></a>
|
|
||||||
<br>
|
|
||||||
<a href="https://eepurl.com/dmXFYz"><img align="center" border="0" src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/www/custom_ui/floorplan/images/branding/email_link.png" height="50" ></a><br>
|
|
||||||
<a href="https://www.vCloudInfo.com/p/affiliate-disclosure.html">
|
|
||||||
Affiliate Disclosure
|
|
||||||
</a></p>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
flush_pm2_logs: >-
|
|
||||||
sudo -u pi -H /usr/bin/pm2 flush
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
restart_homebridge: >-
|
|
||||||
sudo -u pi -H /usr/bin/pm2 restart homebridge
|
|
||||||
@@ -1,23 +1,26 @@
|
|||||||
# - This script is used to update the Home Assistant Docker containers
|
# - This script is used to update the Home Assistant Docker containers
|
||||||
# - It will pull the latest images, check if the image ID has changed, and restart the container if needed
|
# - It will pull the latest images, check if the image ID has changed, and restart the container if needed
|
||||||
# - It will also cleanup unused resources after the update
|
|
||||||
|
|
||||||
# Original Repo: https://github.com/CCOSTAN/Home-AssistantConfig
|
# Original Repo: https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
# Follow me on https://www.vcloudinfo.com/click-here
|
# Follow me on https://www.vcloudinfo.com/click-here
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
# Update system packages
|
# Update system packages
|
||||||
sudo apt-get update && sudo apt-get upgrade -y
|
sudo apt-get update && sudo apt-get upgrade -y
|
||||||
|
|
||||||
|
DC=(docker compose)
|
||||||
|
|
||||||
# Pull the latest images
|
# Pull the latest images
|
||||||
docker-compose pull
|
"${DC[@]}" pull
|
||||||
|
|
||||||
# Get list of services from docker-compose.yml
|
# Get list of services from docker-compose.yml
|
||||||
EXISTING_SERVICES=$(docker-compose config --services)
|
EXISTING_SERVICES=$("${DC[@]}" config --services)
|
||||||
|
|
||||||
# Get list of running service containers
|
# Get list of running service containers
|
||||||
RUNNING_CONTAINERS=$(docker-compose ps --services)
|
RUNNING_CONTAINERS=$("${DC[@]}" ps --services)
|
||||||
|
|
||||||
# Loop through each running service and check if its image has changed
|
# Loop through each running service and check if its image has changed
|
||||||
for service in $RUNNING_CONTAINERS; do
|
for service in $RUNNING_CONTAINERS; do
|
||||||
@@ -25,15 +28,15 @@ for service in $RUNNING_CONTAINERS; do
|
|||||||
# Get the current running image ID (remove sha256: prefix)
|
# Get the current running image ID (remove sha256: prefix)
|
||||||
CURRENT_IMAGE_ID=$(docker inspect --format='{{.Image}}' "$service" 2>/dev/null | sed 's/^sha256://')
|
CURRENT_IMAGE_ID=$(docker inspect --format='{{.Image}}' "$service" 2>/dev/null | sed 's/^sha256://')
|
||||||
|
|
||||||
# Get the latest image ID from docker-compose
|
# Get the latest image ID from docker compose
|
||||||
LATEST_IMAGE_ID=$(docker-compose images -q "$service" 2>/dev/null)
|
LATEST_IMAGE_ID=$("${DC[@]}" images -q "$service" 2>/dev/null)
|
||||||
|
|
||||||
# If the image ID is different, restart the container
|
# If the image ID is different, restart the container
|
||||||
if [ "$CURRENT_IMAGE_ID" != "$LATEST_IMAGE_ID" ] && [ -n "$LATEST_IMAGE_ID" ]; then
|
if [ "$CURRENT_IMAGE_ID" != "$LATEST_IMAGE_ID" ] && [ -n "$LATEST_IMAGE_ID" ]; then
|
||||||
echo "Updating container: $service"
|
echo "Updating container: $service"
|
||||||
docker-compose stop "$service"
|
"${DC[@]}" stop "$service"
|
||||||
docker-compose rm -f "$service"
|
"${DC[@]}" rm -f "$service"
|
||||||
docker-compose up -d "$service"
|
"${DC[@]}" up -d "$service"
|
||||||
else
|
else
|
||||||
echo "No update needed for: $service"
|
echo "No update needed for: $service"
|
||||||
fi
|
fi
|
||||||
@@ -41,8 +44,3 @@ for service in $RUNNING_CONTAINERS; do
|
|||||||
echo "Skipping non-existent service: $service"
|
echo "Skipping non-existent service: $service"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Cleanup unused resources
|
|
||||||
docker container prune -f
|
|
||||||
docker image prune -f
|
|
||||||
docker volume prune -f
|
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
You can use this code to quickly create files from the template editor in HA. I use it mainly for `emulated_hue` and to quickly add in new Customize options to all things HA!
|
|
||||||
|
|
||||||
For the sandbox.
|
|
||||||
{% set trigger = {'entity_id':'sensor.downstairs_thermostat_hvac_state','to_state':'cooling'} %}
|
|
||||||
|
|
||||||
#########################################################
|
|
||||||
Create fast Customize for groups, sensors, covers etc... Just change that first line below 'sensor' to 'group', 'covers' etc..
|
|
||||||
|
|
||||||
{% for state in states.group -%}
|
|
||||||
{% if loop.first %}
|
|
||||||
{% elif loop.last %}
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{{- state.entity_id }}:
|
|
||||||
friendly_name: '{{ state.attributes.friendly_name|replace("_"," ",)|title() if state.attributes.friendly_name is defined else state.name|replace("_"," ",)|title() }}'
|
|
||||||
hidden: {{state.attributes.hidden if state.attributes.hidden is defined else "False"}}
|
|
||||||
homebridge_hidden: {{state.attributes.homebridge_hidden if state.attributes.homebridge_hidden is defined else "true"}}
|
|
||||||
{{'icon: '+ state.attributes.icon if state.attributes.icon is defined}}
|
|
||||||
{{'homebridge_cover_type: '+ state.attributes.homebridge_cover_type if state.attributes.homebridge_cover_type is defined}}
|
|
||||||
{{'assumed_state: '+ state.attributes.assumed_state if state.attributes.assumed_state is defined}}
|
|
||||||
{% endfor -%}
|
|
||||||
|
|
||||||
#########################################################
|
|
||||||
#This code lists out EVERY possible entity and attribute for that entity.
|
|
||||||
# source: https://github.com/skalavala/smarthome/blob/primary/Entities.md
|
|
||||||
#########################################################
|
|
||||||
|
|
||||||
{{ "_".ljust(90, "_") }}
|
|
||||||
{%- set domains = [states.light, states.switch, states.automation, states.device_tracker, states.group, states.media_player, states.proximity, states.script, states.zone, states.zwave, states.sensor, states.calendar ] %}
|
|
||||||
{{ "Entity ID".ljust(50) }}{{ "Entity Name" }}
|
|
||||||
{%- for domain in domains -%}
|
|
||||||
{% for item in domain %}
|
|
||||||
{{ "_".ljust(90, "_") }}
|
|
||||||
{{ item.entity_id.ljust(50) }}{{ item.name }}
|
|
||||||
{% for attrib in item.attributes %}
|
|
||||||
{%- if attrib is defined %}
|
|
||||||
{{attrib.ljust(50)}}: {{ item.attributes[attrib] }}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
{%- endfor %}
|
|
||||||
{%- endfor %}
|
|
||||||
|
|
||||||
#########################################################
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
cd /home/hass/docker_files
|
|
||||||
docker-compose exec home-assistant python -m homeassistant --config /config --script check_config
|
|
||||||
|
|
||||||
cd /home/hass/docker_files/homeassistant
|
|
||||||
git pull origin master
|
|
||||||
|
|
||||||
cd /home/hass/docker_files
|
|
||||||
docker-compose exec home-assistant python -m homeassistant --config /config --script check_config
|
|
||||||
|
|
||||||
cd ~
|
|
||||||
exit
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
cd /home/hass/docker_files
|
|
||||||
docker-compose exec home-assistant python -m homeassistant --config /config --script check_config
|
|
||||||
|
|
||||||
cd /home/hass/docker_files/homeassistant
|
|
||||||
|
|
||||||
git add .
|
|
||||||
git status
|
|
||||||
echo -n "Enter the Description for the Change: [Minor Edit] "
|
|
||||||
read CHANGE_MSG
|
|
||||||
CHANGE_MSG=${CHANGE_MSG:-Minor Edit}
|
|
||||||
git commit -m "${CHANGE_MSG}"
|
|
||||||
git push origin master
|
|
||||||
|
|
||||||
cd ~
|
|
||||||
exit
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
## These scripts are run from /home/pi
|
|
||||||
|
|
||||||
#!/bin/bash
|
|
||||||
cat hassuser
|
|
||||||
|
|
||||||
sudo su -s /bin/bash hass
|
|
||||||
|
|
||||||
# source /srv/hass/hass_venv/bin/activate
|
|
||||||
|
|
||||||
# to Upgrade:
|
|
||||||
|
|
||||||
# pip3 install --upgrade homeassistant - Use HAUpdate.sh script
|
|
||||||
|
|
||||||
# To view The HA logs realtime
|
|
||||||
# sudo journalctl -u home-assistant -f | ccze
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# Restart Homebridge on HASS start
|
|
||||||
# shell_command:
|
|
||||||
# restart_homebridge: 'sudo su pi -c "pm2 restart homebridge"'
|
|
||||||
# start_homebridge: 'sudo su pi -c "pm2 start homebridge"'
|
|
||||||
# stop_homebridge: 'sudo su pi -c "pm2 stop homebridge"'
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# this script uses hard-coded paths
|
|
||||||
# This deletes the readme file and begins rebuilding it..
|
|
||||||
|
|
||||||
cat /home/hass/.homeassistant/script/header.md > /home/hass/.homeassistant/script/README.md
|
|
||||||
|
|
||||||
grep -e '^[a-z]' /home/hass/.homeassistant/script/*.yaml | tr : '\n' > /tmp/scriptnames.txt
|
|
||||||
|
|
||||||
sed -i '/^$/d' /tmp/scriptnames.txt
|
|
||||||
|
|
||||||
|
|
||||||
for item in `cat /tmp/scriptnames.txt`
|
|
||||||
do
|
|
||||||
|
|
||||||
res=`grep -R script.$item /home/hass/.homeassistant/. --include=*.yaml`
|
|
||||||
echo "\n $item \n" | sed 's|/home/hass/\.homeassistant/| https://github\.com/CCOSTAN/Home-AssistantConfig/blob/master/|g'>> /home/hass/.homeassistant/script/README.md
|
|
||||||
echo "\n $res \n" | sed 's|/home/hass/\.homeassistant/\.| https://github\.com/CCOSTAN/Home-AssistantConfig/blob/master|g' >> /home/hass/.homeassistant/script/README.md
|
|
||||||
|
|
||||||
sed -i '/^$/d' /home/hass/.homeassistant/script/README.md
|
|
||||||
|
|
||||||
done
|
|
||||||
cat /home/hass/.homeassistant/script/README.md
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
|
|
||||||
<h1 align="center">
|
|
||||||
<a name="logo" href="https://www.vCloudInfo.com/tag/iot"><img src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/x_profile.png" alt="Bear Stone Smart Home" width="200"></a>
|
|
||||||
<br>
|
|
||||||
Bear Stone Smart Home Documentation
|
|
||||||
</h1>
|
|
||||||
<h4 align="center">Be sure to :star: my configuration repo so you can keep up to date on any daily progress!</h4>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[](https://x.com/ccostan)
|
|
||||||
[](https://www.youtube.com/vCloudInfo?sub_confirmation=1)
|
|
||||||
[](https://github.com/CCOSTAN) <br>
|
|
||||||
[](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)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Standalone switch definitions pulled into automations and dashboards. Keep relays, templates, and rest commands tidy here.
|
|
||||||
|
|
||||||
### Quick navigation
|
|
||||||
- [Repo overview](../../README.md) | [Config index](../README.md) | [Automations](../automation)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Tips
|
|
||||||
- Add new switches here and reference them from packages/automations to stay organized.
|
|
||||||
|
|
||||||
|
|
||||||
**All of my configuration files are tested against the most stable version of home-assistant.**
|
|
||||||
|
|
||||||
<a name="bottom" href="https://github.com/CCOSTAN/Home-AssistantConfig#logo"><img align="right" border="0" src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/www/custom_ui/floorplan/images/branding/up_arrow.png" width="25" ></a>
|
|
||||||
|
|
||||||
**Still have questions on my Config?** <br>
|
|
||||||
**Message me on X :** [](https://www.x.com/ccostan)
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a target="_blank" href="https://www.buymeacoffee.com/vCloudInfo"><img src="https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg" alt="Buy me a coffee"><span style="margin-left:5px">You can buy me a coffee</span></a><a target="_blank" href="https://www.buymeacoffee.com/vCloudInfo"><img src="https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg" alt="Buy me a coffee"></a>
|
|
||||||
<br>
|
|
||||||
<a href="https://eepurl.com/dmXFYz"><img align="center" border="0" src="https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/www/custom_ui/floorplan/images/branding/email_link.png" height="50" ></a><br>
|
|
||||||
<a href="https://www.vCloudInfo.com/p/affiliate-disclosure.html">
|
|
||||||
Affiliate Disclosure
|
|
||||||
</a></p>
|
|
||||||
@@ -35,11 +35,8 @@
|
|||||||
[Here is the current weather outside]
|
[Here is the current weather outside]
|
||||||
{% set aq_description = state_attr('sensor.bear_stone_common_air_quality_index', 'description') | default('') %}
|
{% set aq_description = state_attr('sensor.bear_stone_common_air_quality_index', 'description') | default('') %}
|
||||||
{% set aq_index = states('sensor.bear_stone_common_air_quality_index') | int(0) %}
|
{% set aq_index = states('sensor.bear_stone_common_air_quality_index') | int(0) %}
|
||||||
{% if aq_description %}
|
{% if aq_index >= 50 %}
|
||||||
Air Quality: {{ aq_description }}
|
[Air Quality: {{ aq_description }}]
|
||||||
{% endif %}
|
|
||||||
{% if aq_index >= 150 %}
|
|
||||||
[Air quality is unhealthy; limit outdoor activity]
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% set pirateweather_metrics = states.sensor
|
{% set pirateweather_metrics = states.sensor
|
||||||
| selectattr('entity_id','search','pirateweather')
|
| selectattr('entity_id','search','pirateweather')
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
>-
|
|
||||||
{% set pick = [
|
|
||||||
"ThrowBack", "S01E01", "S01E02","S01E03", "S01E04","S01E05", "S01E06","S01E07", "S01E08","S01E09", "S01E10",
|
|
||||||
"S01E11", "S01E12","S01E13", "S01E14","S01E15", "S01E16","S01E17", "S01E18","S01E19", "S01E20", "S01E21",
|
|
||||||
"S02E01", "S02E02","S02E03", "S02E04","S02E05", "S02E06","S02E07", "S02E08","S02E09", "S02E10",
|
|
||||||
"S02E11", "S02E12","S02E13", "S02E14","S02E15", "S02E16","S02E17", "S02E18","S02E19", "S02E20",
|
|
||||||
"S02E22", "S02E25", "S02E26", "S02E27", "S02E28", "S02E29", "S02E30", "S02E31", "S02E32", "S02E33", "S02E34",
|
|
||||||
"S02E35", "S02E36", "S02E37", "S02E38", "S02E39", "S02E40","S02E41", "Bearnews1", "Bearnews2", "Bearnews3", "Bearnews4",
|
|
||||||
"S03E01", "Bearnews5", "Bearnews6", "Bearnews7", "S03E02", "S03E03", "Logger", "SolarPalmLight", "5TipsToLevelUp", "AlexaMusicCommands",
|
|
||||||
"SolarFountainOKMEE", "NoCloudGaradget", "AlexaGuardMediaPlayer", "LightningSensor", "LEDBackboard", "CuckooClock", "NodeAnchors", "yahoostocks",
|
|
||||||
"AugustBatteries", "Remote_Finder", "VideoProjectionMappingDemo", "FeedTheDog", "AlexaGiftNotifications","iPhoneDuplicates", "NotifyScript", "WeightLossJourney",
|
|
||||||
"SnapPower", "LocalControl", "TossingWink", "EnergyDashboard", "IOSBrokeNoifications", "SolarDriveway", "UPS_Replacement", "VillaNERI", "GardenLED", "RokuOnHA", "RunningAutomationsCard"
|
|
||||||
] %}
|
|
||||||
{{ pick|random }}
|
|
||||||
82
config/www/json_data/flag_days.json
Normal file
82
config/www/json_data/flag_days.json
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"Flag_Days_US": {
|
||||||
|
"static": {
|
||||||
|
"2/12": "Lincoln's Birthday",
|
||||||
|
"5/15": "Peace Officers Memorial Day",
|
||||||
|
"6/14": "Flag Day",
|
||||||
|
"7/4": "Independence Day",
|
||||||
|
"7/27": "National Korean War Veterans Armistice Day",
|
||||||
|
"9/11": "Patriot Day",
|
||||||
|
"9/17": "Constitution Day",
|
||||||
|
"10/27": "Navy Day",
|
||||||
|
"11/11": "Veterans Day",
|
||||||
|
"12/7": "Pearl Harbor Remembrance Day"
|
||||||
|
},
|
||||||
|
"dynamic": {
|
||||||
|
"01/20/2025": "Inauguration Day",
|
||||||
|
"01/16/2023": "Martin Luther King Jr. Day",
|
||||||
|
"01/15/2024": "Martin Luther King Jr. Day",
|
||||||
|
"01/19/2026": "Martin Luther King Jr. Day",
|
||||||
|
"01/18/2027": "Martin Luther King Jr. Day",
|
||||||
|
"01/17/2028": "Martin Luther King Jr. Day",
|
||||||
|
"01/15/2029": "Martin Luther King Jr. Day",
|
||||||
|
"01/21/2030": "Martin Luther King Jr. Day",
|
||||||
|
"02/20/2023": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/19/2024": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/17/2025": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/16/2026": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/15/2027": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/21/2028": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/19/2029": "Washington's Birthday (Presidents Day)",
|
||||||
|
"02/18/2030": "Washington's Birthday (Presidents Day)",
|
||||||
|
"05/20/2023": "Armed Forces Day",
|
||||||
|
"05/18/2024": "Armed Forces Day",
|
||||||
|
"05/17/2025": "Armed Forces Day",
|
||||||
|
"05/16/2026": "Armed Forces Day",
|
||||||
|
"05/15/2027": "Armed Forces Day",
|
||||||
|
"05/20/2028": "Armed Forces Day",
|
||||||
|
"05/19/2029": "Armed Forces Day",
|
||||||
|
"05/18/2030": "Armed Forces Day",
|
||||||
|
"05/29/2023": "Memorial Day",
|
||||||
|
"05/27/2024": "Memorial Day",
|
||||||
|
"05/26/2025": "Memorial Day",
|
||||||
|
"05/25/2026": "Memorial Day",
|
||||||
|
"05/31/2027": "Memorial Day",
|
||||||
|
"05/29/2028": "Memorial Day",
|
||||||
|
"05/28/2029": "Memorial Day",
|
||||||
|
"05/27/2030": "Memorial Day",
|
||||||
|
"09/04/2023": "Labor Day",
|
||||||
|
"09/02/2024": "Labor Day",
|
||||||
|
"09/01/2025": "Labor Day",
|
||||||
|
"09/07/2026": "Labor Day",
|
||||||
|
"09/06/2027": "Labor Day",
|
||||||
|
"09/04/2028": "Labor Day",
|
||||||
|
"09/03/2029": "Labor Day",
|
||||||
|
"09/02/2030": "Labor Day",
|
||||||
|
"09/15/2023": "National POW/MIA Recognition Day",
|
||||||
|
"09/20/2024": "National POW/MIA Recognition Day",
|
||||||
|
"09/19/2025": "National POW/MIA Recognition Day",
|
||||||
|
"09/18/2026": "National POW/MIA Recognition Day",
|
||||||
|
"09/17/2027": "National POW/MIA Recognition Day",
|
||||||
|
"09/15/2028": "National POW/MIA Recognition Day",
|
||||||
|
"09/21/2029": "National POW/MIA Recognition Day",
|
||||||
|
"09/20/2030": "National POW/MIA Recognition Day",
|
||||||
|
"10/09/2023": "Columbus Day",
|
||||||
|
"10/14/2024": "Columbus Day",
|
||||||
|
"10/13/2025": "Columbus Day",
|
||||||
|
"10/12/2026": "Columbus Day",
|
||||||
|
"10/11/2027": "Columbus Day",
|
||||||
|
"10/09/2028": "Columbus Day",
|
||||||
|
"10/08/2029": "Columbus Day",
|
||||||
|
"10/14/2030": "Columbus Day",
|
||||||
|
"11/07/2023": "Election Day",
|
||||||
|
"11/05/2024": "Election Day",
|
||||||
|
"11/04/2025": "Election Day",
|
||||||
|
"11/03/2026": "Election Day",
|
||||||
|
"11/02/2027": "Election Day",
|
||||||
|
"11/07/2028": "Election Day",
|
||||||
|
"11/06/2029": "Election Day",
|
||||||
|
"11/05/2030": "Election Day"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
116
config/www/json_data/holidays.json
Normal file
116
config/www/json_data/holidays.json
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
{
|
||||||
|
"MAJOR_US": {
|
||||||
|
"static": {
|
||||||
|
"1/1": "New Years Day",
|
||||||
|
"2/2": "Groundhog Day",
|
||||||
|
"2/3": "Staceys Birthday",
|
||||||
|
"2/14": "Valentines Day",
|
||||||
|
"3/14": "Pi Day",
|
||||||
|
"3/17": "St. Patricks Day",
|
||||||
|
"3/26": "Justins Birthday",
|
||||||
|
"4/1": "April Fools Day",
|
||||||
|
"4/22": "Earth Day",
|
||||||
|
"5/4": "Star Wars Day",
|
||||||
|
"5/5": "Cinco de Mayo",
|
||||||
|
"6/14": "Flag Day",
|
||||||
|
"7/4": "Independence Day",
|
||||||
|
"8/30": "Paiges Birthday",
|
||||||
|
"9/10": "Mom and Dads Wedding Anniversary",
|
||||||
|
"9/11": "Patriot Day",
|
||||||
|
"10/31": "Halloween",
|
||||||
|
"11/11": "Veterans Day",
|
||||||
|
"11/16": "Carlos Birthday",
|
||||||
|
"12/7": "Pearl Harbor Day",
|
||||||
|
"12/24": "Christmas Eve",
|
||||||
|
"12/25": "Christmas Day",
|
||||||
|
"12/31": "New Years Eve"
|
||||||
|
},
|
||||||
|
"dynamic": {
|
||||||
|
"11/23/2023": "Thanksgiving Day",
|
||||||
|
"01/15/2024": "MLK Day",
|
||||||
|
"02/14/2024": "Ash Wednesday",
|
||||||
|
"02/19/2024": "Presidents Day",
|
||||||
|
"03/24/2024": "Palm Sunday",
|
||||||
|
"03/29/2024": "Good Friday",
|
||||||
|
"03/31/2024": "Easter Sunday",
|
||||||
|
"04/22/2024": "Memorial Day",
|
||||||
|
"05/12/2024": "Mothers Day",
|
||||||
|
"06/16/2024": "Fathers Day",
|
||||||
|
"09/02/2024": "Labor Day",
|
||||||
|
"10/14/2024": "Columbus Day",
|
||||||
|
"11/28/2024": "Thanksgiving Day",
|
||||||
|
"01/20/2025": "MLK Day",
|
||||||
|
"02/17/2025": "Presidents Day",
|
||||||
|
"03/05/2025": "Ash Wednesday",
|
||||||
|
"04/13/2025": "Palm Sunday",
|
||||||
|
"04/18/2025": "Good Friday",
|
||||||
|
"04/20/2025": "Easter Sunday",
|
||||||
|
"04/21/2025": "Memorial Day",
|
||||||
|
"05/11/2025": "Mothers Day",
|
||||||
|
"06/15/2025": "Fathers Day",
|
||||||
|
"09/01/2025": "Labor Day",
|
||||||
|
"10/13/2025": "Columbus Day",
|
||||||
|
"11/27/2025": "Thanksgiving Day",
|
||||||
|
"01/19/2026": "MLK Day",
|
||||||
|
"02/16/2026": "Presidents Day",
|
||||||
|
"02/18/2026": "Ash Wednesday",
|
||||||
|
"03/29/2026": "Palm Sunday",
|
||||||
|
"04/03/2026": "Good Friday",
|
||||||
|
"04/05/2026": "Easter Sunday",
|
||||||
|
"04/20/2026": "Memorial Day",
|
||||||
|
"05/10/2026": "Mothers Day",
|
||||||
|
"06/21/2026": "Fathers Day",
|
||||||
|
"09/07/2026": "Labor Day",
|
||||||
|
"10/12/2026": "Columbus Day",
|
||||||
|
"11/26/2026": "Thanksgiving Day",
|
||||||
|
"01/18/2027": "MLK Day",
|
||||||
|
"02/10/2027": "Ash Wednesday",
|
||||||
|
"02/15/2027": "Presidents Day",
|
||||||
|
"03/21/2027": "Palm Sunday",
|
||||||
|
"03/26/2027": "Good Friday",
|
||||||
|
"03/28/2027": "Easter Sunday",
|
||||||
|
"04/19/2027": "Memorial Day",
|
||||||
|
"05/09/2027": "Mothers Day",
|
||||||
|
"06/20/2027": "Fathers Day",
|
||||||
|
"09/06/2027": "Labor Day",
|
||||||
|
"10/11/2027": "Columbus Day",
|
||||||
|
"11/25/2027": "Thanksgiving Day",
|
||||||
|
"01/17/2028": "MLK Day",
|
||||||
|
"02/21/2028": "Presidents Day",
|
||||||
|
"03/01/2028": "Ash Wednesday",
|
||||||
|
"04/09/2028": "Palm Sunday",
|
||||||
|
"04/14/2028": "Good Friday",
|
||||||
|
"04/16/2028": "Easter Sunday",
|
||||||
|
"04/17/2028": "Memorial Day",
|
||||||
|
"05/14/2028": "Mothers Day",
|
||||||
|
"06/18/2028": "Fathers Day",
|
||||||
|
"09/04/2028": "Labor Day",
|
||||||
|
"10/09/2028": "Columbus Day",
|
||||||
|
"11/23/2028": "Thanksgiving Day",
|
||||||
|
"01/15/2029": "MLK Day",
|
||||||
|
"02/14/2029": "Ash Wednesday",
|
||||||
|
"02/19/2029": "Presidents Day",
|
||||||
|
"03/25/2029": "Palm Sunday",
|
||||||
|
"03/30/2029": "Good Friday",
|
||||||
|
"04/01/2029": "Easter Sunday",
|
||||||
|
"04/23/2029": "Memorial Day",
|
||||||
|
"05/13/2029": "Mothers Day",
|
||||||
|
"06/17/2029": "Fathers Day",
|
||||||
|
"09/03/2029": "Labor Day",
|
||||||
|
"10/08/2029": "Columbus Day",
|
||||||
|
"11/22/2029": "Thanksgiving Day",
|
||||||
|
"01/21/2030": "MLK Day",
|
||||||
|
"02/18/2030": "Presidents Day",
|
||||||
|
"03/06/2030": "Ash Wednesday",
|
||||||
|
"04/14/2030": "Palm Sunday",
|
||||||
|
"04/19/2030": "Good Friday",
|
||||||
|
"04/21/2030": "Easter Sunday",
|
||||||
|
"04/22/2030": "Memorial Day",
|
||||||
|
"05/12/2030": "Mothers Day",
|
||||||
|
"06/16/2030": "Fathers Day",
|
||||||
|
"09/02/2030": "Labor Day",
|
||||||
|
"10/14/2030": "Columbus Day",
|
||||||
|
"11/28/2030": "Thanksgiving Day"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
<svg width="68.5" height="20" viewBox="0 0 685 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="2025.12.0">
|
<svg width="68.5" height="20" viewBox="0 0 685 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="2025.12.2">
|
||||||
<title>2025.12.0</title>
|
<title>2025.12.2</title>
|
||||||
<linearGradient id="PUIvu" x2="0" y2="100%">
|
<linearGradient id="wpDAa" x2="0" y2="100%">
|
||||||
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
|
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
|
||||||
<stop offset="1" stop-opacity=".1"/>
|
<stop offset="1" stop-opacity=".1"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<mask id="PVVTg"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
<mask id="Qipao"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
||||||
<g mask="url(#PVVTg)">
|
<g mask="url(#Qipao)">
|
||||||
<rect width="685" height="200" fill="#08C" x="0"/>
|
<rect width="685" height="200" fill="#08C" x="0"/>
|
||||||
<rect width="685" height="200" fill="url(#PUIvu)"/>
|
<rect width="685" height="200" fill="url(#wpDAa)"/>
|
||||||
</g>
|
</g>
|
||||||
<g aria-hidden="true" fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
|
<g aria-hidden="true" fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
|
||||||
<text x="65" y="148" textLength="570" fill="#000" opacity="0.25">2025.12.0</text>
|
<text x="65" y="148" textLength="570" fill="#000" opacity="0.25">2025.12.2</text>
|
||||||
<text x="55" y="138" textLength="570">2025.12.0</text>
|
<text x="55" y="138" textLength="570">2025.12.2</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 815 B After Width: | Height: | Size: 815 B |
Reference in New Issue
Block a user