various package updates

This commit is contained in:
zorruno
2026-06-19 11:38:07 +12:00
parent d4f123600c
commit 79597fb021
17 changed files with 2540 additions and 397 deletions
+1 -1
View File
@@ -1 +1 @@
{"pid": 71, "version": 1, "ha_version": "2026.6.0", "start_ts": 1780535631.6044178} {"pid": 73, "version": 1, "ha_version": "2026.6.3", "start_ts": 1781782769.6367064}
+235 -3
View File
@@ -295,9 +295,6 @@
"esp-bedrm2ceilingfan.yaml": { "esp-bedrm2ceilingfan.yaml": {
"board_id": "d1-mini" "board_id": "d1-mini"
}, },
"_remote_build": {
"dashboard_id": "vhamVDnWEnx-FvAa24uVv49Wsddurh84"
},
"esp-entbtproxy copy.yaml": { "esp-entbtproxy copy.yaml": {
"board_id": "generic-esp32" "board_id": "generic-esp32"
}, },
@@ -306,6 +303,231 @@
"mac_address": "88:13:BF:68:39:2C" "mac_address": "88:13:BF:68:39:2C"
}, },
"_firmware_jobs": [ "_firmware_jobs": [
{
"job_id": "dfabed27adf5",
"configuration": "esp-masterbdrmwest.yaml",
"job_type": "upload",
"status": "completed",
"created_at": "2026-06-12T10:19:14.926585+00:00",
"started_at": "2026-06-12T10:22:25.692593+00:00",
"completed_at": "2026-06-12T10:22:49.018883+00:00",
"exit_code": 0,
"error": null,
"port": "OTA",
"new_name": "",
"depends_on": "b03c87e5954e",
"dependency_released": true,
"progress": 100,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "b03c87e5954e",
"configuration": "esp-masterbdrmwest.yaml",
"job_type": "compile",
"status": "completed",
"created_at": "2026-06-12T10:19:14.926538+00:00",
"started_at": "2026-06-12T10:20:08.467305+00:00",
"completed_at": "2026-06-12T10:22:25.683155+00:00",
"exit_code": 0,
"error": null,
"port": "",
"new_name": "",
"depends_on": "",
"dependency_released": false,
"progress": null,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "0dc6aca98f76",
"configuration": "esp-masterbdrmsouth.yaml",
"job_type": "upload",
"status": "completed",
"created_at": "2026-06-12T10:17:56.852471+00:00",
"started_at": "2026-06-12T10:20:08.462596+00:00",
"completed_at": "2026-06-12T10:20:24.266523+00:00",
"exit_code": 0,
"error": null,
"port": "OTA",
"new_name": "",
"depends_on": "b299a38f73d6",
"dependency_released": true,
"progress": 100,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "b299a38f73d6",
"configuration": "esp-masterbdrmsouth.yaml",
"job_type": "compile",
"status": "completed",
"created_at": "2026-06-12T10:17:56.852426+00:00",
"started_at": "2026-06-12T10:17:56.853172+00:00",
"completed_at": "2026-06-12T10:20:08.461368+00:00",
"exit_code": 0,
"error": null,
"port": "",
"new_name": "",
"depends_on": "",
"dependency_released": false,
"progress": null,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "0a4602631e6e",
"configuration": "esp-nspanel1masterbdrm.yaml",
"job_type": "compile",
"status": "cancelled",
"created_at": "2026-06-12T08:31:00.645286+00:00",
"started_at": "2026-06-12T08:31:00.645530+00:00",
"completed_at": "2026-06-12T08:31:07.627462+00:00",
"exit_code": -15,
"error": null,
"port": "",
"new_name": "",
"depends_on": "",
"dependency_released": false,
"progress": null,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "0b7b51e5af2a",
"configuration": "esp-gasheater.yaml",
"job_type": "upload",
"status": "completed",
"created_at": "2026-06-12T05:37:12.378996+00:00",
"started_at": "2026-06-12T05:40:20.938981+00:00",
"completed_at": "2026-06-12T05:40:40.151165+00:00",
"exit_code": 0,
"error": null,
"port": "OTA",
"new_name": "",
"depends_on": "4bb434e78efe",
"dependency_released": true,
"progress": 100,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "4bb434e78efe",
"configuration": "esp-gasheater.yaml",
"job_type": "compile",
"status": "completed",
"created_at": "2026-06-12T05:37:12.378923+00:00",
"started_at": "2026-06-12T05:37:12.379876+00:00",
"completed_at": "2026-06-12T05:40:20.934723+00:00",
"exit_code": 0,
"error": null,
"port": "",
"new_name": "",
"depends_on": "",
"dependency_released": false,
"progress": null,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "6f388364d3b9",
"configuration": "esp-loungeenvironment.yaml",
"job_type": "upload",
"status": "completed",
"created_at": "2026-06-10T08:58:25.598581+00:00",
"started_at": "2026-06-10T09:04:32.328122+00:00",
"completed_at": "2026-06-10T09:04:56.870002+00:00",
"exit_code": 0,
"error": null,
"port": "OTA",
"new_name": "",
"depends_on": "42c6b98c9a18",
"dependency_released": true,
"progress": 100,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{
"job_id": "42c6b98c9a18",
"configuration": "esp-loungeenvironment.yaml",
"job_type": "compile",
"status": "completed",
"created_at": "2026-06-10T08:58:25.598449+00:00",
"started_at": "2026-06-10T08:58:25.599111+00:00",
"completed_at": "2026-06-10T09:04:32.319499+00:00",
"exit_code": 0,
"error": null,
"port": "",
"new_name": "",
"depends_on": "",
"dependency_released": false,
"progress": null,
"remote_peer": "",
"remote_job_id": "",
"remote_peer_label": "",
"device_name": "",
"device_friendly_name": "",
"source": "local",
"source_pin_sha256": "",
"source_label": "",
"source_esphome_version": ""
},
{ {
"job_id": "06e53abdd6ff", "job_id": "06e53abdd6ff",
"configuration": "esp-3dprinterpow.yaml", "configuration": "esp-3dprinterpow.yaml",
@@ -2750,5 +2972,15 @@
"esp-ledmatrix1 copy.yaml": { "esp-ledmatrix1 copy.yaml": {
"board_id": "generic-esp32c3", "board_id": "generic-esp32c3",
"mac_address": "64:E8:33:84:FD:C8" "mac_address": "64:E8:33:84:FD:C8"
},
"esp-masterbdrmwest.yaml": {
"mac_address": "84:F3:EB:EC:6E:3F"
},
"esp-masterbdrmsouth.yaml": {
"mac_address": "84:F3:EB:EC:6E:60"
},
"_board_id_user_set_migrated": true,
"_dashboard_identity": {
"dashboard_id": "vhamVDnWEnx-FvAa24uVv49Wsddurh84"
} }
} }
File diff suppressed because it is too large Load Diff
+23 -3
View File
@@ -113,11 +113,12 @@ automation:
power_entity: "sensor.esp_laundrywashpow_load_power" power_entity: "sensor.esp_laundrywashpow_load_power"
icon: "mdi:washing-machine" icon: "mdi:washing-machine"
short_announcement: "/s/sWashing complete" short_announcement: "/s/sWashing complete"
# long_announcement: # Created by the processor
matrix_indicator: "wash,1,15,10,6,5,1,0" matrix_indicator: "wash,1,15,10,6,5,1,0"
# Optional washing-machine-specific overrides # Optional washing-machine-specific overrides
resolution: 5 resolution: 5
standby_power: 3 standby_power: 3
operating_power_min: 20 operating_power_min: 10
announcement_channels: "pushover_zorruno" announcement_channels: "pushover_zorruno"
- appliance_id: dryer - appliance_id: dryer
@@ -126,11 +127,12 @@ automation:
power_entity: "sensor.esp_laundrydrypow_load_power" power_entity: "sensor.esp_laundrydrypow_load_power"
icon: "mdi:tumble-dryer" icon: "mdi:tumble-dryer"
short_announcement: "/s/sDryer complete" short_announcement: "/s/sDryer complete"
# long_announcement: # Created by the processor
matrix_indicator: "dry,1,15,10,6,5,1,0" matrix_indicator: "dry,1,15,10,6,5,1,0"
# Optional dryer-specific overrides # Optional dryer-specific overrides
resolution: 4 resolution: 4
standby_power: 3 standby_power: 3
operating_power_min: 20 operating_power_min: 10
announcement_channels: "pushover_zorruno" announcement_channels: "pushover_zorruno"
- appliance_id: main_dishwasher - appliance_id: main_dishwasher
@@ -139,8 +141,23 @@ automation:
power_entity: "sensor.esp_maindishwasherpower_power" power_entity: "sensor.esp_maindishwasherpower_power"
icon: "mdi:dishwasher" icon: "mdi:dishwasher"
short_announcement: "/sDishwasher complete" short_announcement: "/sDishwasher complete"
# long_announcement: # Created by the processor
matrix_indicator: "dish,1,15,10,6,5,1,0" matrix_indicator: "dish,1,15,10,6,5,1,0"
- appliance_id: evcharger_32a
appliance_name: "EV Charger (32A)"
appliance_action: "EV charging (32A)"
power_entity: "sensor.main_house_3_phase_power_monitor_32a_wallcharger_power"
monitor_sensor: "sensor.appliance_monitor_ev_charger_32a_monitor"
icon: "mdi:ev-plug-type2"
short_announcement: "/s/s32A EV Charging complete"
# long_announcement: # Created by the processor
matrix_indicator: "ev32a,1,15,10,6,5,1,0"
resolution: 6
standby_power: 3
operating_power_min: 50
announcement_channels: "pushover_zorruno"
action: action:
########################################################################## ##########################################################################
# PUBLISH / REFRESH MQTT DISCOVERY CONFIG # PUBLISH / REFRESH MQTT DISCOVERY CONFIG
@@ -203,7 +220,10 @@ automation:
{{ mqtt_local_status_topic }}/{{ mqtt_device_name }}/{{ repeat.item.appliance_id }}/state {{ mqtt_local_status_topic }}/{{ mqtt_device_name }}/{{ repeat.item.appliance_id }}/state
am_monitor_sensor: >- am_monitor_sensor: >-
sensor.{{ mqtt_device_name }}_{{ repeat.item.appliance_id }}_monitor {{
repeat.item.monitor_sensor
| default('sensor.' ~ mqtt_device_name ~ '_' ~ repeat.item.appliance_id ~ '_monitor', true)
}}
am_title: >- am_title: >-
{{ repeat.item.title | default(repeat.item.appliance_name ~ ' Notification', true) }} {{ repeat.item.title | default(repeat.item.appliance_name ~ ' Notification', true) }}
+35 -23
View File
@@ -4,14 +4,21 @@
# DESCRIPTION: # DESCRIPTION:
# Replaces the Node-RED automation for the underhouse storage lights. # Replaces the Node-RED automation for the underhouse storage lights.
# Doors, PIR sensors, a remote switch, and local relay changes can start or # Doors, PIR sensors, a remote switch, and local relay changes can start or
# extend a 1 hour lighting timer. # extend the storage lighting timer.
# #
# VERSION: # VERSION:
# V1.1 2026-06-14
# - Door-open trigger now watches each real door contact individually.
# - This means any door changing from closed to open turns the lights on
# immediately, even if another door is already open.
# - All doors closed now turns the lights off immediately.
# - PIR occupancy can still start/restart the motion timer after that.
#
# V1.0 2026-05-12 # V1.0 2026-05-12
# - Initial Home Assistant package version. # - Initial Home Assistant package version.
# #
# EDIT NOTES: # EDIT NOTES:
# - Add future door contacts in BOTH places marked FUTURE DOOR. # - Add future door contacts in all places marked FUTURE DOOR.
# - Add future PIR sensors in the PIR group marked FUTURE PIR. # - Add future PIR sensors in the PIR group marked FUTURE PIR.
# - The generated group entities used below should be: # - The generated group entities used below should be:
# binary_sensor.underhouse_storage_door_contacts # binary_sensor.underhouse_storage_door_contacts
@@ -27,8 +34,7 @@ binary_sensor:
entities: entities:
- binary_sensor.underhouse_stealth_door_x07rs_contact - binary_sensor.underhouse_stealth_door_x07rs_contact
- binary_sensor.underhouse_north_door_door - binary_sensor.underhouse_north_door_door
# FUTURE DOOR: add the next underhouse storage door contact here. - binary_sensor.under_house_underhouse_east_stealth_door_door
# - binary_sensor.underhouse_future_door_contact
- platform: group - platform: group
name: Underhouse Storage PIR Presence name: Underhouse Storage PIR Presence
@@ -38,8 +44,8 @@ binary_sensor:
entities: entities:
- binary_sensor.underhouse_pir_sensor_south_occupancy - binary_sensor.underhouse_pir_sensor_south_occupancy
- binary_sensor.underhouse_pir_sensor_north_occupancy - binary_sensor.underhouse_pir_sensor_north_occupancy
# FUTURE PIR: uncomment this when the north PIR exists. # FUTURE PIR: add any extra PIR sensors here.
# - binary_sensor.underhouse_pir_sensor_north_occupancy # - binary_sensor.underhouse_future_pir_occupancy
timer: timer:
underhouse_storage_lights_runtime: underhouse_storage_lights_runtime:
@@ -67,7 +73,7 @@ script:
target: target:
entity_id: timer.underhouse_storage_lights_runtime entity_id: timer.underhouse_storage_lights_runtime
data: data:
duration: "0:20:00" duration: "00:20:00"
underhouse_storage_lights_stop_runtime: underhouse_storage_lights_stop_runtime:
alias: Underhouse Storage Lights - Stop Runtime alias: Underhouse Storage Lights - Stop Runtime
@@ -97,19 +103,28 @@ automation:
- id: underhouse_storage_lights_start_extend_runtime - id: underhouse_storage_lights_start_extend_runtime
alias: Underhouse Storage Lights - Start Or Extend Runtime alias: Underhouse Storage Lights - Start Or Extend Runtime
description: >- description: >-
Turns the storage lights on and starts or restarts the 1 hour timer when Turns the storage lights on and starts or restarts the timer when
a door opens, PIR detects occupancy, or the remote switch is pressed. an individual door opens, PIR detects occupancy, or the remote switch
is pressed.
mode: restart mode: restart
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.underhouse_storage_door_contacts entity_id:
- binary_sensor.underhouse_stealth_door_x07rs_contact
- binary_sensor.underhouse_north_door_door
# FUTURE DOOR: replace this with the actual third underhouse storage door contact.
#- binary_sensor.underhouse_future_door_contact
from: "off"
to: "on" to: "on"
- platform: state - platform: state
entity_id: binary_sensor.underhouse_storage_pir_presence entity_id: binary_sensor.underhouse_storage_pir_presence
to: "on" to: "on"
- platform: state - platform: state
entity_id: binary_sensor.esp_underhouselights_underhouse_storage_lights_remote_switch entity_id: binary_sensor.esp_underhouselights_underhouse_storage_lights_remote_switch
to: "on" to: "on"
action: action:
- action: script.underhouse_storage_lights_start_runtime - action: script.underhouse_storage_lights_start_runtime
@@ -174,35 +189,32 @@ automation:
- id: underhouse_storage_lights_all_doors_closed - id: underhouse_storage_lights_all_doors_closed
alias: Underhouse Storage Lights - All Doors Closed alias: Underhouse Storage Lights - All Doors Closed
description: >- description: >-
When all door contacts are closed, turn the lights off immediately if no When all door contacts are closed, turn the lights off immediately.
PIR occupancy is active. If PIR is still active, the PIR clear automation PIR occupancy can still turn the lights back on again afterwards.
below will turn them off after 60 seconds without occupancy.
mode: restart mode: restart
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.underhouse_storage_door_contacts entity_id: binary_sensor.underhouse_storage_door_contacts
from: "on" from: "on"
to: "off" to: "off"
condition:
- condition: state
entity_id: binary_sensor.underhouse_storage_pir_presence
state: "off"
action: action:
- action: script.underhouse_storage_lights_stop_runtime - action: script.underhouse_storage_lights_stop_runtime
- id: underhouse_storage_lights_individual_door_closed_check - id: underhouse_storage_lights_individual_door_closed_check
alias: Underhouse Storage Lights - Individual Door Closed No Motion Check alias: Underhouse Storage Lights - Individual Door Closed Safety Check
description: >- description: >-
When a real door contact closes, wait 60 seconds and then turn the relay Safety cleanup. When a real door contact closes, wait 60 seconds and then
off only if all doors are closed and there is no PIR occupancy. ensure the relay is off only if all doors are closed and there is no PIR
occupancy. The normal all-doors-closed automation above should usually
turn the lights off immediately first.
mode: restart mode: restart
trigger: trigger:
- platform: state - platform: state
entity_id: entity_id:
- binary_sensor.underhouse_stealth_door_x07rs_contact - binary_sensor.underhouse_stealth_door_x07rs_contact
- binary_sensor.underhouse_north_door_door - binary_sensor.underhouse_north_door_door
# FUTURE DOOR: add the next underhouse storage door contact here too. # FUTURE DOOR: replace this with the actual third underhouse storage door contact.
# - binary_sensor.underhouse_future_door_contact #- binary_sensor.underhouse_future_door_contact
from: "on" from: "on"
to: "off" to: "off"
action: action:
@@ -222,7 +234,7 @@ automation:
alias: Underhouse Storage Lights - PIR Clear After Doors Closed alias: Underhouse Storage Lights - PIR Clear After Doors Closed
description: >- description: >-
If the doors are closed and PIR occupancy clears for 60 seconds, turn the If the doors are closed and PIR occupancy clears for 60 seconds, turn the
storage lights off. storage lights off. This is mainly a cleanup path for PIR-triggered use.
mode: restart mode: restart
trigger: trigger:
- platform: state - platform: state
+170
View File
@@ -0,0 +1,170 @@
#:########################################################################################:#
# Package: BYD Charging Schedule At Home
# File: byd_charging_schedule_athome.yaml
# Version: v1.0.1
# Date: 2026-06-19
#
# Purpose:
# Enables the BYD Atto 3 charging schedule when the car arrives home.
# Disables the schedule only after the car has been confirmed away for a
# configurable delay, to avoid rapid toggling from uncertain presence detection.
#
# Behaviour:
# - Confirmed arrival home:
# Turns ON switch.atto_3_schedule_enabled,
# but only if the car had previously been confirmed away.
#
# - Confirmed away:
# After away_confirm_minutes, turns OFF switch.atto_3_schedule_enabled.
#
# - Manual control:
# If the car is already home and the user or another HA automation turns
# the schedule OFF manually, this package will not turn it back ON unless
# the car is later confirmed away and then arrives home again.
#
# Notes:
# - Home Assistant usually stores the device_tracker home state as "home",
# even if the UI displays "At Home".
# - Change away_confirm_minutes below if you want a longer/shorter debounce.
#:########################################################################################:#
input_boolean:
byd_atto3_charging_schedule_confirmed_away:
name: "BYD Atto 3 Charging Schedule - Confirmed Away"
icon: mdi:car-off
automation:
#:######################################################################################:#
# ARRIVAL - Turn schedule ON only after a confirmed away period
#:######################################################################################:#
- id: byd_atto3_charging_schedule_arrival_enable
alias: "BYD Atto 3 Charging Schedule - Arrival Enable"
description: >
Turns the BYD charging schedule ON when the car arrives home, but only if
it was previously confirmed away. This prevents brief away/home glitches
from undoing a manual OFF while the car is actually still at home.
mode: single
variables: &byd_charging_schedule_vars
tracker_entity: device_tracker.byd_atto3_ibeacon_bur4c2a_bermuda_tracker
schedule_switch_entity: switch.atto_3_schedule_enabled
# HA normally stores "At Home" as "home".
home_state: "home"
# Adjustable YAML-only delay before the car is treated as truly away.
away_confirm_minutes: 15
# These states will not be treated as confirmed away.
ignored_tracker_states:
- "unknown"
- "unavailable"
triggers:
- trigger: state
entity_id: device_tracker.byd_atto3_ibeacon_bur4c2a_bermuda_tracker
conditions:
- condition: template
value_template: >-
{{ trigger.to_state is not none
and trigger.from_state is not none
and trigger.to_state.state == home_state
and trigger.from_state.state != home_state }}
actions:
- choose:
- conditions:
- condition: state
entity_id: input_boolean.byd_atto3_charging_schedule_confirmed_away
state: "on"
sequence:
- action: switch.turn_on
target:
entity_id: "{{ schedule_switch_entity }}"
- action: input_boolean.turn_off
target:
entity_id: input_boolean.byd_atto3_charging_schedule_confirmed_away
#:######################################################################################:#
# DEPARTURE - Turn schedule OFF only after confirmed away timeout
#:######################################################################################:#
- id: byd_atto3_charging_schedule_departure_disable_after_timeout
alias: "BYD Atto 3 Charging Schedule - Departure Disable After Timeout"
description: >
When the car leaves home, waits for the configured away timeout. If the car
is still away after that delay, turns the BYD charging schedule OFF and
marks the car as confirmed away.
mode: restart
variables: *byd_charging_schedule_vars
triggers:
- trigger: state
entity_id: device_tracker.byd_atto3_ibeacon_bur4c2a_bermuda_tracker
conditions:
- condition: template
value_template: >-
{% set new_state = trigger.to_state.state if trigger.to_state is not none else '' %}
{{ new_state != home_state
and new_state not in ignored_tracker_states }}
actions:
- delay:
minutes: "{{ away_confirm_minutes | int(15) }}"
- condition: template
value_template: >-
{% set current_state = states(tracker_entity) %}
{{ current_state != home_state
and current_state not in ignored_tracker_states }}
- action: switch.turn_off
target:
entity_id: "{{ schedule_switch_entity }}"
- action: input_boolean.turn_on
target:
entity_id: input_boolean.byd_atto3_charging_schedule_confirmed_away
#:######################################################################################:#
# STARTUP SAFETY - If HA restarts while the car is away, re-arm arrival logic
#:######################################################################################:#
- id: byd_atto3_charging_schedule_startup_away_check
alias: "BYD Atto 3 Charging Schedule - Startup Away Check"
description: >
On Home Assistant startup, if the car is already away and remains away
beyond the configured timeout, turn the schedule OFF and mark the car as
confirmed away so that the next confirmed arrival can enable the schedule.
mode: single
variables: *byd_charging_schedule_vars
triggers:
- trigger: homeassistant
event: start
actions:
- delay: "00:01:00"
- condition: template
value_template: >-
{% set current_state = states(tracker_entity) %}
{{ current_state != home_state
and current_state not in ignored_tracker_states }}
- delay:
minutes: "{{ away_confirm_minutes | int(15) }}"
- condition: template
value_template: >-
{% set current_state = states(tracker_entity) %}
{{ current_state != home_state
and current_state not in ignored_tracker_states }}
- action: switch.turn_off
target:
entity_id: "{{ schedule_switch_entity }}"
- action: input_boolean.turn_on
target:
entity_id: input_boolean.byd_atto3_charging_schedule_confirmed_away
+270 -127
View File
@@ -1,32 +1,35 @@
# ===================================================================== # =====================================================================
# Home Assistant Summary - package (ESPHome, Tasmota, ZHA, Zigbee2MQTT) # Home Assistant Summary - package
# Robust Z2M detection using device identifiers containing "zigbee2mqtt". #
# Counts:
# - Total devices/entities/broken entities
# - Cameras, areas, scenes, scripts, automations
# - ESPHome devices/entities
# - Tasmota devices/entities
# - Zigbee ZHA devices/entities
# - Zigbee2MQTT devices/entities
# - Matter devices/entities
# - Matter Wi-Fi/Ethernet devices/entities - best effort
# - Matter Thread devices/entities - best effort
# - Matter unclassified devices/entities
# - Cloud-ish devices/entities
# - Supervisor add-ons - approximate
# - Updates available
#
# Important:
# - This uses only modern template: syntax.
# - There must be no root-level:
# sensor:
# - platform: template
# in this package.
# ===================================================================== # =====================================================================
template: template:
- trigger: - sensor:
- platform: event
event_type: homeassistant_started
- platform: event
event_type: entity_registry_updated
- platform: event
event_type: device_registry_updated
- platform: event
event_type: area_registry_updated
- platform: event
event_type: core_config_updated
- platform: time_pattern
minutes: "/5"
sensor:
# ---------- Totals and basics ---------- # ---------- Totals and basics ----------
- name: HA Summary - entities total
unique_id: ha_summary_entities_total
state: "{{ states | list | length }}"
unit_of_measurement: "entities"
- name: HA Summary - devices total - name: HA Summary - devices total
unique_id: ha_summary_devices_total unique_id: ha_summary_devices_total
unit_of_measurement: "devices"
state: >- state: >-
{% set ids = namespace(v=[]) %} {% set ids = namespace(v=[]) %}
{% for s in states %} {% for s in states %}
@@ -36,23 +39,27 @@ template:
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{{ ids.v | length }} {{ ids.v | length }}
unit_of_measurement: "devices"
- name: HA Summary - entities total
unique_id: ha_summary_entities_total
unit_of_measurement: "entities"
state: "{{ states | list | length }}"
- name: HA Summary - entities broken - name: HA Summary - entities broken
unique_id: ha_summary_entities_broken unique_id: ha_summary_entities_broken
unit_of_measurement: "entities"
state: >- state: >-
{{ states | selectattr('state','in',['unavailable','unknown']) | list | length }} {{ states | selectattr('state','in',['unavailable','unknown']) | list | length }}
unit_of_measurement: "entities"
- name: HA Summary - cameras - name: HA Summary - cameras
unique_id: ha_summary_cameras unique_id: ha_summary_cameras
state: "{{ states.camera | list | length }}"
unit_of_measurement: "cameras" unit_of_measurement: "cameras"
state: "{{ states.camera | list | length }}"
- name: HA Summary - areas - name: HA Summary - areas
unique_id: ha_summary_areas unique_id: ha_summary_areas
state: "{{ areas() | list | length }}"
unit_of_measurement: "areas" unit_of_measurement: "areas"
state: "{{ areas() | list | length }}"
- name: HA Summary - scenes - name: HA Summary - scenes
unique_id: ha_summary_scenes unique_id: ha_summary_scenes
@@ -66,13 +73,41 @@ template:
unique_id: ha_summary_automations unique_id: ha_summary_automations
state: "{{ states.automation | list | length }}" state: "{{ states.automation | list | length }}"
# ---------- ESPHome ---------- # ---------- Add-ons and updates ----------
- name: HA Summary - esphome entities - name: HA Summary - addons
unique_id: ha_summary_esphome_entities unique_id: ha_summary_addons
state: "{{ integration_entities('esphome') | list | length }}" icon: mdi:puzzle
state: >-
{% set hassio_entities = integration_entities('hassio') | list %}
{% set skip = [
'update.home_assistant_core_update',
'update.home_assistant_supervisor_update',
'update.home_assistant_operating_system_update'
] %}
{% set count = namespace(v=0) %}
{% for u in states.update %}
{% if u.entity_id in hassio_entities and u.entity_id not in skip %}
{% set count.v = count.v + 1 %}
{% endif %}
{% endfor %}
{{ count.v }}
- name: HA Summary - hacs updates
unique_id: ha_summary_hacs_updates
icon: mdi:download
state: >-
{% set count = namespace(v=0) %}
{% for u in states.update %}
{% if u.state == 'on' and not (u.attributes.in_progress | default(false)) %}
{% set count.v = count.v + 1 %}
{% endif %}
{% endfor %}
{{ count.v }}
# ---------- ESPHome ----------
- name: HA Summary - esphome devices - name: HA Summary - esphome devices
unique_id: ha_summary_esphome_devices unique_id: ha_summary_esphome_devices
unit_of_measurement: "devices"
state: >- state: >-
{% set ids = namespace(v=[]) %} {% set ids = namespace(v=[]) %}
{% for e in integration_entities('esphome') %} {% for e in integration_entities('esphome') %}
@@ -83,13 +118,15 @@ template:
{% endfor %} {% endfor %}
{{ ids.v | length }} {{ ids.v | length }}
# ---------- Tasmota ---------- - name: HA Summary - esphome entities
- name: HA Summary - tasmota entities unique_id: ha_summary_esphome_entities
unique_id: ha_summary_tasmota_entities unit_of_measurement: "entities"
state: "{{ integration_entities('tasmota') | list | length }}" state: "{{ integration_entities('esphome') | list | length }}"
# ---------- Tasmota ----------
- name: HA Summary - tasmota devices - name: HA Summary - tasmota devices
unique_id: ha_summary_tasmota_devices unique_id: ha_summary_tasmota_devices
unit_of_measurement: "devices"
state: >- state: >-
{% set ids = namespace(v=[]) %} {% set ids = namespace(v=[]) %}
{% for e in integration_entities('tasmota') %} {% for e in integration_entities('tasmota') %}
@@ -100,13 +137,15 @@ template:
{% endfor %} {% endfor %}
{{ ids.v | length }} {{ ids.v | length }}
# ---------- Zigbee via ZHA ---------- - name: HA Summary - tasmota entities
- name: HA Summary - zha entities unique_id: ha_summary_tasmota_entities
unique_id: ha_summary_zha_entities unit_of_measurement: "entities"
state: "{{ integration_entities('zha') | list | length }}" state: "{{ integration_entities('tasmota') | list | length }}"
- name: HA Summary - zha devices # ---------- Zigbee via ZHA ----------
unique_id: ha_summary_zha_devices - name: HA Summary - zigbee zha devices
unique_id: ha_summary_zigbee_zha_devices
unit_of_measurement: "devices"
state: >- state: >-
{% set ids = namespace(v=[]) %} {% set ids = namespace(v=[]) %}
{% for e in integration_entities('zha') %} {% for e in integration_entities('zha') %}
@@ -117,77 +156,191 @@ template:
{% endfor %} {% endfor %}
{{ ids.v | length }} {{ ids.v | length }}
# ---------- Zigbee via Zigbee2MQTT (robust) ---------- - name: HA Summary - zigbee zha entities
# Match if device identifiers mention "zigbee2mqtt". unique_id: ha_summary_zigbee_zha_entities
# Fallbacks: entity_id or unique_id contains "zigbee2mqtt" or ".z2m_". unit_of_measurement: "entities"
- name: HA Summary - z2m entities state: "{{ integration_entities('zha') | list | length }}"
unique_id: ha_summary_z2m_entities
state: >-
{% set ent = namespace(v=[]) %}
{% for s in states %}
{% set eid = s.entity_id %}
{% set did = device_id(eid) %}
{% set match = false %}
{% if did %}
{% set ident = device_attr(did,'identifiers') | default([], true) %}
{% if (ident | string | lower) | regex_search('zigbee2mqtt') %}
{% set match = true %}
{% endif %}
{% endif %}
{% if not match %}
{% set uid = state_attr(eid,'unique_id') | default('', true) | string | lower %}
{% if 'zigbee2mqtt' in eid or '.z2m_' in eid or 'zigbee2mqtt' in uid %}
{% set match = true %}
{% endif %}
{% endif %}
{% if match %}
{% set ent.v = ent.v + [eid] %}
{% endif %}
{% endfor %}
{{ ent.v | unique | list | length }}
- name: HA Summary - z2m devices # ---------- Zigbee via Zigbee2MQTT ----------
unique_id: ha_summary_z2m_devices # This counts MQTT entities whose Home Assistant device identifiers
# include "zigbee2mqtt". This should catch devices with clean entity IDs
# like sensor.lounge_blind_b_xbl12_battery.
- name: HA Summary - zigbee z2m devices
unique_id: ha_summary_zigbee_z2m_devices
unit_of_measurement: "devices"
state: >- state: >-
{% set dids = namespace(v=[]) %} {% set dids = namespace(v=[]) %}
{% for s in states %} {% for e in integration_entities('mqtt') | list %}
{% set eid = s.entity_id %} {% set did = device_id(e) %}
{% set did = device_id(eid) %}
{% if did and did not in dids.v %} {% if did and did not in dids.v %}
{% set ident = device_attr(did,'identifiers') | default([], true) %} {% set txt = (
{% set uid = state_attr(eid,'unique_id') | default('', true) | string | lower %} ((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
{% if (ident | string | lower) | regex_search('zigbee2mqtt') or ((device_attr(did, 'connections') or []) | string) ~ ' ' ~
'zigbee2mqtt' in eid or '.z2m_' in eid or 'zigbee2mqtt' in uid %} ((device_attr(did, 'name') or '') | string) ~ ' ' ~
((device_attr(did, 'model') or '') | string) ~ ' ' ~
((device_attr(did, 'manufacturer') or '') | string)
) | lower %}
{% if 'zigbee2mqtt' in txt %}
{% set dids.v = dids.v + [did] %} {% set dids.v = dids.v + [did] %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{{ dids.v | length }} {{ dids.v | length }}
# ---------- Cloud devices/entities (edit list as desired) ---------- - name: HA Summary - zigbee z2m entities
- name: HA Summary - cloud entities unique_id: ha_summary_zigbee_z2m_entities
unique_id: ha_summary_cloud_entities unit_of_measurement: "entities"
state: >- state: >-
{% set list_all = {% set ent = namespace(v=[]) %}
integration_entities('tuya') + {% for e in integration_entities('mqtt') | list %}
integration_entities('ewelink') + {% set did = device_id(e) %}
integration_entities('meross_cloud') + {% if did %}
integration_entities('tapo') + {% set txt = (
integration_entities('tplink') + ((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
integration_entities('nest') + ((device_attr(did, 'connections') or []) | string) ~ ' ' ~
integration_entities('ring') + ((device_attr(did, 'name') or '') | string) ~ ' ' ~
integration_entities('arlo') + ((device_attr(did, 'model') or '') | string) ~ ' ' ~
integration_entities('wyze') + ((device_attr(did, 'manufacturer') or '') | string)
integration_entities('myq') + ) | lower %}
integration_entities('nuki') + {% if 'zigbee2mqtt' in txt %}
integration_entities('august') + {% set ent.v = ent.v + [e] %}
integration_entities('switchbot') + {% endif %}
integration_entities('icloud') {% endif %}
%} {% endfor %}
{{ list_all | unique | list | length }} {{ ent.v | unique | list | length }}
# ---------- Matter total ----------
- name: HA Summary - matter devices
unique_id: ha_summary_matter_devices
unit_of_measurement: "devices"
state: >-
{% set ids = namespace(v=[]) %}
{% for e in integration_entities('matter') %}
{% set did = device_id(e) %}
{% if did and did not in ids.v %}
{% set ids.v = ids.v + [did] %}
{% endif %}
{% endfor %}
{{ ids.v | length }}
- name: HA Summary - matter entities
unique_id: ha_summary_matter_entities
unit_of_measurement: "entities"
state: "{{ integration_entities('matter') | list | length }}"
# ---------- Matter over Wi-Fi / Ethernet - best effort ----------
- name: HA Summary - matter wifi devices
unique_id: ha_summary_matter_wifi_devices
unit_of_measurement: "devices"
state: >-
{% set dids = namespace(v=[]) %}
{% for e in integration_entities('matter') %}
{% set did = device_id(e) %}
{% if did and did not in dids.v %}
{% set txt = (
((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
((device_attr(did, 'connections') or []) | string) ~ ' ' ~
((device_attr(did, 'name') or '') | string) ~ ' ' ~
((device_attr(did, 'model') or '') | string) ~ ' ' ~
((device_attr(did, 'manufacturer') or '') | string)
) | lower %}
{% if 'wifi' in txt or 'wi-fi' in txt or 'wlan' in txt or 'ethernet' in txt %}
{% set dids.v = dids.v + [did] %}
{% endif %}
{% endif %}
{% endfor %}
{{ dids.v | length }}
- name: HA Summary - matter wifi entities
unique_id: ha_summary_matter_wifi_entities
unit_of_measurement: "entities"
state: >-
{% set ent = namespace(v=[]) %}
{% for e in integration_entities('matter') %}
{% set did = device_id(e) %}
{% if did %}
{% set txt = (
((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
((device_attr(did, 'connections') or []) | string) ~ ' ' ~
((device_attr(did, 'name') or '') | string) ~ ' ' ~
((device_attr(did, 'model') or '') | string) ~ ' ' ~
((device_attr(did, 'manufacturer') or '') | string)
) | lower %}
{% if 'wifi' in txt or 'wi-fi' in txt or 'wlan' in txt or 'ethernet' in txt %}
{% set ent.v = ent.v + [e] %}
{% endif %}
{% endif %}
{% endfor %}
{{ ent.v | unique | list | length }}
# ---------- Matter over Thread - best effort ----------
- name: HA Summary - matter thread devices
unique_id: ha_summary_matter_thread_devices
unit_of_measurement: "devices"
state: >-
{% set dids = namespace(v=[]) %}
{% for e in integration_entities('matter') %}
{% set did = device_id(e) %}
{% if did and did not in dids.v %}
{% set txt = (
((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
((device_attr(did, 'connections') or []) | string) ~ ' ' ~
((device_attr(did, 'name') or '') | string) ~ ' ' ~
((device_attr(did, 'model') or '') | string) ~ ' ' ~
((device_attr(did, 'manufacturer') or '') | string)
) | lower %}
{% if 'thread' in txt or 'openthread' in txt or 'otbr' in txt or 'border router' in txt or 'border-router' in txt or '802.15.4' in txt %}
{% set dids.v = dids.v + [did] %}
{% endif %}
{% endif %}
{% endfor %}
{{ dids.v | length }}
- name: HA Summary - matter thread entities
unique_id: ha_summary_matter_thread_entities
unit_of_measurement: "entities"
state: >-
{% set ent = namespace(v=[]) %}
{% for e in integration_entities('matter') %}
{% set did = device_id(e) %}
{% if did %}
{% set txt = (
((device_attr(did, 'identifiers') or []) | string) ~ ' ' ~
((device_attr(did, 'connections') or []) | string) ~ ' ' ~
((device_attr(did, 'name') or '') | string) ~ ' ' ~
((device_attr(did, 'model') or '') | string) ~ ' ' ~
((device_attr(did, 'manufacturer') or '') | string)
) | lower %}
{% if 'thread' in txt or 'openthread' in txt or 'otbr' in txt or 'border router' in txt or 'border-router' in txt or '802.15.4' in txt %}
{% set ent.v = ent.v + [e] %}
{% endif %}
{% endif %}
{% endfor %}
{{ ent.v | unique | list | length }}
# ---------- Matter unclassified ----------
- name: HA Summary - matter unclassified devices
unique_id: ha_summary_matter_unclassified_devices
unit_of_measurement: "devices"
state: >-
{% set total = states('sensor.ha_summary_matter_devices') | int(0) %}
{% set wifi = states('sensor.ha_summary_matter_wifi_devices') | int(0) %}
{% set thread = states('sensor.ha_summary_matter_thread_devices') | int(0) %}
{{ [total - wifi - thread, 0] | max }}
- name: HA Summary - matter unclassified entities
unique_id: ha_summary_matter_unclassified_entities
unit_of_measurement: "entities"
state: >-
{% set total = states('sensor.ha_summary_matter_entities') | int(0) %}
{% set wifi = states('sensor.ha_summary_matter_wifi_entities') | int(0) %}
{% set thread = states('sensor.ha_summary_matter_thread_entities') | int(0) %}
{{ [total - wifi - thread, 0] | max }}
# ---------- Cloud devices/entities ----------
- name: HA Summary - cloud devices - name: HA Summary - cloud devices
unique_id: ha_summary_cloud_devices unique_id: ha_summary_cloud_devices
unit_of_measurement: "devices"
state: >- state: >-
{% set dids = namespace(v=[]) %} {% set dids = namespace(v=[]) %}
{% for e in ( {% for e in (
@@ -213,34 +366,24 @@ template:
{% endfor %} {% endfor %}
{{ dids.v | length }} {{ dids.v | length }}
# ---------- Supervisor add-ons (approximate) ---------- - name: HA Summary - cloud entities
# Union of: update entities in hassio integration + updates attributed to Supervisor. unique_id: ha_summary_cloud_entities
- name: HA Summary - addons unit_of_measurement: "entities"
unique_id: ha_summary_addons
icon: mdi:puzzle
state: >- state: >-
{% set hassio_updates = (integration_entities('hassio') | list) %} {% set list_all =
{% set a = states.update integration_entities('tuya') +
| selectattr('entity_id','in', hassio_updates) integration_entities('ewelink') +
| map(attribute='entity_id') integration_entities('meross_cloud') +
| list %} integration_entities('tapo') +
{% set b = states.update integration_entities('tplink') +
| selectattr('attributes.attribution','defined') integration_entities('nest') +
| selectattr('attributes.attribution','search','Supervisor') integration_entities('ring') +
| map(attribute='entity_id') integration_entities('arlo') +
| list %} integration_entities('wyze') +
{% set ids = (a + b) integration_entities('myq') +
| unique integration_entities('nuki') +
| reject('search','^update\\.home_assistant_(core|supervisor|operating_system)_update$') integration_entities('august') +
| list %} integration_entities('switchbot') +
{{ ids | length }} integration_entities('icloud')
%}
# ---------- HACS updates available (proxy only) ---------- {{ list_all | unique | list | length }}
- name: HA Summary - hacs updates
unique_id: ha_summary_hacs_updates
icon: mdi:download
state: >-
{{ states.update
| selectattr('state','eq','on')
| rejectattr('attributes.in_progress','true')
| list | length }}
@@ -1,30 +1,4 @@
automation: automation:
# Two lights and two switches for these corridor lights
- id: garage_entry_outside_2way_sync
alias: Garage Entry & Outside Light 2-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
- switch.esp_garageentrylights_relay_1_corridor_lights
- switch.esp_loungesouthleftswitch_relay_2_outside_light_1
sync_on_start: true
startup_delay: 5
# Internal Garage Lights (Light controller is sonoff basic in cupboard)
- id: garage_lights_2way_sync
alias: Garage Lights 2-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
- switch.esp_garageentrylights_relay_3_garage_lights
- switch.esp_garagelights_garage_lights
sync_on_start: true
startup_delay: 5
# Stair Lights Top # Stair Lights Top
- id: stair_lights_top_2way_sync - id: stair_lights_top_2way_sync
alias: Stair lights Top Lights 2-Way Sync alias: Stair lights Top Lights 2-Way Sync
@@ -0,0 +1,26 @@
automation:
# Two lights and two switches for these corridor lights
- id: garage_entry_outside_2way_sync
alias: Garage Entry & Outside Light 2-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
- switch.esp_garageentrylights_relay_1_corridor_lights
- switch.esp_loungesouthleftswitch_relay_2_outside_light_1
sync_on_start: true
startup_delay: 5
# Internal Garage Lights (Light controller is sonoff basic in cupboard)
- id: garage_lights_2way_sync
alias: Garage Lights 2-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
- switch.esp_garageentrylights_relay_3_garage_lights
- switch.esp_garagelights_garage_lights
sync_on_start: true
startup_delay: 5
@@ -0,0 +1,64 @@
################################################################################
# PACKAGE: Master Bedroom Main Lights Switch Sync
################################################################################
#
# Version: 1.3
# Date: 2026-06-12
#
# Purpose:
# Home Assistant fast-path sync for the two Master Bedroom Zemismart switches.
#
# Confirmed wiring/logic after live checks:
# - North Lights real controller:
# light.tasmo_ifan02_3793_bedrm1_1
# - South Lights real physical load:
# WEST switch Relay 2
# - Relay 1 on both switches:
# North Lights virtual/mirror/control
# - Relay 2 on both switches:
# South Lights control/mirror; WEST Relay 2 is the real physical load
#
# NOTE:
# Entity IDs may retain their old names in HA after the ESPHome friendly-name change.
# Confirm the final entity IDs in HA after flashing.
################################################################################
automation:
##############################################################################
# Master Bedroom North Lights Sync
##############################################################################
- id: master_bedroom_north_lights_3way_sync
alias: Master Bedroom North Lights 3-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
# SOUTH switch virtual North Lights control/mirror.
- switch.master_bedroom_master_bedroom_main_lights_south_relay_1_master_bedroom_north_lights
# WEST switch virtual North Lights control/mirror.
- switch.master_bedroom_master_bedroom_main_lights_west_relay_1_master_bedroom_north_lights
# Actual North Lights controller.
- light.tasmo_ifan02_3793_bedrm1_1
sync_on_start: false
startup_delay: 5
##############################################################################
# Master Bedroom South Lights Sync
##############################################################################
- id: master_bedroom_south_lights_2way_sync
alias: Master Bedroom South Lights 2-Way Sync
initial_state: true
use_blueprint:
path: zorruno/two_three_way_sync.yaml
input:
members:
# SOUTH switch virtual South Lights control/mirror.
- switch.master_bedroom_master_bedroom_main_lights_south_relay_2_master_bedroom_south_lights
# WEST switch physical South Lights relay.
- switch.master_bedroom_master_bedroom_main_lights_west_relay_2_master_bedroom_south_lights
sync_on_start: false
startup_delay: 5
+7 -7
View File
@@ -135,7 +135,7 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 100 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 100
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 100 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 100
input_number.openhasp_1_backlight_level: 255 input_number.openhasp_1_backlight_level: 100
number.lounge_nspanel_touchscreen_display_brightness: 100 number.lounge_nspanel_touchscreen_display_brightness: 100
TV General: TV General:
@@ -156,8 +156,8 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 60 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 60
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 60 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 60
input_number.openhasp_1_backlight_level: 120 input_number.openhasp_1_backlight_level: 30
number.lounge_nspanel_touchscreen_display_brightness: 80 number.lounge_nspanel_touchscreen_display_brightness: 210
Balanced: Balanced:
light.esp_lounge6chdimmer_couch_spots_left: 40 light.esp_lounge6chdimmer_couch_spots_left: 40
@@ -177,7 +177,7 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 50 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 50
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 50 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 50
input_number.openhasp_1_backlight_level: 100 input_number.openhasp_1_backlight_level: 30
number.lounge_nspanel_touchscreen_display_brightness: 80 number.lounge_nspanel_touchscreen_display_brightness: 80
Movie: Movie:
@@ -198,7 +198,7 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 40 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 40
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 40 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 40
input_number.openhasp_1_backlight_level: 15 input_number.openhasp_1_backlight_level: 10
switch.esp_mainkitchenlights_relay_1_main_lights: "off" switch.esp_mainkitchenlights_relay_1_main_lights: "off"
switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off" switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off"
number.lounge_nspanel_touchscreen_display_brightness: 40 number.lounge_nspanel_touchscreen_display_brightness: 40
@@ -238,7 +238,7 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 5 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 5
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 5 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 5
input_number.openhasp_1_backlight_level: 10 input_number.openhasp_1_backlight_level: 6
number.lounge_nspanel_touchscreen_display_brightness: 30 number.lounge_nspanel_touchscreen_display_brightness: 30
Warm Cozy: Warm Cozy:
@@ -278,7 +278,7 @@ script:
#switch.esp_loungenorthswitch_relay_1_main_lights: "on" #switch.esp_loungenorthswitch_relay_1_main_lights: "on"
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 0 number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 0
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 0 number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 0
#input_number.openhasp_1_backlight_level: 100 input_number.openhasp_1_backlight_level: 60
#switch.esp_mainkitchenlights_relay_1_main_lights: "off" #switch.esp_mainkitchenlights_relay_1_main_lights: "off"
#switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off" #switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off"
number.lounge_nspanel_touchscreen_display_brightness: 80 number.lounge_nspanel_touchscreen_display_brightness: 80
+160 -142
View File
@@ -1,15 +1,24 @@
############################################################################### ###############################################################################
# PACKAGE: OpenHASP Thermostat / Gas Heater Control # PACKAGE: OpenHASP Thermostat / Gas Heater Control
# VERSION: v1.1 (2026-06-18)
# NODE/TOPIC ROOT: hasp/openhasp_1/ # NODE/TOPIC ROOT: hasp/openhasp_1/
# #
# PAGE OBJECTS USED # PAGE OBJECTS USED
# - p1b1 = main temperature display # - p1b1 = main temperature display
# - p1b2 = setpoint display # - p1b2 = setpoint icon/value display
# - p1b3 = setpoint down # - p1b3 = setpoint down
# - p1b4 = setpoint up # - p1b4 = setpoint up
# - p1b5 = heater status text # - p1b5 = heater status text
# - p1b6 = heater operation / flame button # - p1b6 = heater operation / flame button
# - p1b7 = humidity display # - p1b7 = humidity icon/value display
#
# NOTES:
# - The HASP flame button toggles the ESPHome Heater Operation switch.
# - Heater Operation ON = ESPHome Mode AUTO.
# - Heater Operation OFF = ESPHome Mode OFF.
# - BYPASS (Remote Only) is only shown when that ESPHome mode is selected.
# - p1b2 and p1b7 include their icons in the MQTT text payload so HA updates
# do not overwrite the icons loaded from pages.jsonl.
############################################################################### ###############################################################################
############################################################################### ###############################################################################
@@ -41,6 +50,7 @@ automation:
# Main temperature display # Main temperature display
# - Shows normal lounge temperature # - Shows normal lounge temperature
# - Normalises values so we do not get duplicated °C or long float strings # - Normalises values so we do not get duplicated °C or long float strings
# - No space is used before °C
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_temp_to_btn_text - id: hasp_temp_to_btn_text
alias: "HASP: update temp (p1b1.text)" alias: "HASP: update temp (p1b1.text)"
@@ -60,31 +70,32 @@ automation:
| replace('C', '') | replace('C', '')
| trim %} | trim %}
{% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %}
{{ cleaned | float(0) | round(1) }} °C {{ cleaned | float(0) | round(1) }}°C
{% else %} {% else %}
-- °C --°C
{% endif %} {% endif %}
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Heater status text at bottom of screen # Heater status text at bottom of screen
# - Shows OFF when ESPHome Mode is OFF
# - Shows BYPASS only when ESPHome Mode is BYPASS (Remote Only)
# - Otherwise mirrors the ESPHome status text, now normally Auto (...)
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_heater_status_to_btn_text - id: hasp_heater_status_to_btn_text
alias: "HASP: update heater status (p1b5.text)" alias: "HASP: update heater status (p1b5.text)"
mode: queued mode: queued
trigger: trigger:
- platform: state - platform: state
entity_id: sensor.rinnai_neo_gas_heater_rinnai_neo_gas_heater_status_text entity_id:
- sensor.rinnai_neo_gas_heater_rinnai_neo_gas_heater_status_text
- select.rinnai_neo_gas_heater_mode
action: action:
- service: mqtt.publish - service: script.hasp_publish_heater_status_text
data:
topic: "hasp/openhasp_1/command/p1b5.text"
payload: >
{% set s = states('sensor.rinnai_neo_gas_heater_rinnai_neo_gas_heater_status_text') %}
{{ s if s not in ['unknown', 'unavailable', ''] else 'HEATER --' }}
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Setpoint display on left side of centre row # Setpoint display on left side of centre row
# - Strips any existing units so only one °C is shown # - Strips any existing units so only one °C is shown
# - Includes thermometer icon so HA updates do not remove it
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_setpoint_to_btn_text - id: hasp_setpoint_to_btn_text
alias: "HASP: update setpoint (p1b2.text)" alias: "HASP: update setpoint (p1b2.text)"
@@ -104,13 +115,14 @@ automation:
| replace('C', '') | replace('C', '')
| trim %} | trim %}
{% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %}
Set: {{ cleaned | float(0) | round(1) }}°C {{ '\uE50F' }} {{ cleaned | float(0) | round(1) }}°C
{% else %} {% else %}
Set: -- °C {{ '\uE50F' }} --°C
{% endif %} {% endif %}
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Humidity display on right side of centre row # Humidity display on right side of centre row
# - Includes water/drop icon so HA updates do not remove it
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_humidity_to_btn_text - id: hasp_humidity_to_btn_text
alias: "HASP: update humidity (p1b7.text)" alias: "HASP: update humidity (p1b7.text)"
@@ -126,9 +138,9 @@ automation:
{% set raw = states('sensor.lounge_environment_humidity_mqtt') %} {% set raw = states('sensor.lounge_environment_humidity_mqtt') %}
{% set cleaned = raw | replace('%', '') | trim %} {% set cleaned = raw | replace('%', '') | trim %}
{% if cleaned in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned in ['unknown', 'unavailable', '', 'none', 'None'] %}
Hum: Unknown {{ '\uE58C' }} --%
{% else %} {% else %}
Hum: {{ cleaned }}% {{ '\uE58C' }} {{ cleaned }}%
{% endif %} {% endif %}
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
@@ -165,7 +177,9 @@ automation:
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Middle flame button # Middle flame button
# - Tap toggles heater operation # - Tap toggles Heater Operation, which maps AUTO <-> OFF in ESPHome
# - If Mode is BYPASS (Remote Only), tapping this will turn Heater Operation ON
# and therefore return the ESPHome controller to AUTO.
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_btn_heat_toggle - id: hasp_btn_heat_toggle
alias: "HASP: p1b6 up -> heater operation toggle" alias: "HASP: p1b6 up -> heater operation toggle"
@@ -183,9 +197,10 @@ automation:
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Flame button appearance # Flame button appearance
# - Operation OFF: dark grey background, light grey flame # - OFF: dark grey background, light grey flame
# - Operation ON, Activate Flame OFF: theme blue background, white flame # - BYPASS: dark grey background, amber flame
# - Operation ON, Activate Flame ON: theme blue background, solid red flame # - AUTO, flame OFF: theme blue background, white flame
# - AUTO, flame ON: theme blue background, solid red flame
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
- id: hasp_heat_button_state - id: hasp_heat_button_state
alias: "HASP: update heat button state (p1b6)" alias: "HASP: update heat button state (p1b6)"
@@ -193,102 +208,11 @@ automation:
trigger: trigger:
- platform: state - platform: state
entity_id: entity_id:
- select.rinnai_neo_gas_heater_mode
- switch.rinnai_neo_gas_heater_heater_operation - switch.rinnai_neo_gas_heater_heater_operation
- switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame - switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
action: action:
- choose: - service: script.hasp_apply_heat_button_state
# Heater Operation OFF -> dark grey button, light grey flame
- conditions:
- condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation
state: "off"
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text"
payload: "\uE238"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#C0C0C0"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#2F3240"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#2F3240"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#2F3240"
# Heater Operation ON, flame OFF -> blue button, white flame
- conditions:
- condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation
state: "on"
- condition: state
entity_id: switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
state: "off"
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text"
payload: "\uE238"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#FFFFFF"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#0095D9"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#00B6FF"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#0095D9"
# Heater Operation ON, flame ON -> blue button, red flame
- conditions:
- condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation
state: "on"
- condition: state
entity_id: switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
state: "on"
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text"
payload: "\uE238"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#FF3030"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#0095D9"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#00B6FF"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#0095D9"
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Start / restart display when HA starts # Start / restart display when HA starts
@@ -342,17 +266,12 @@ script:
| replace('C', '') | replace('C', '')
| trim %} | trim %}
{% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %}
{{ cleaned | float(0) | round(1) }} °C {{ cleaned | float(0) | round(1) }}°C
{% else %} {% else %}
-- °C --°C
{% endif %} {% endif %}
- service: mqtt.publish - service: script.hasp_publish_heater_status_text
data:
topic: "hasp/openhasp_1/command/p1b5.text"
payload: >
{% set s = states('sensor.rinnai_neo_gas_heater_rinnai_neo_gas_heater_status_text') %}
{{ s if s not in ['unknown', 'unavailable', ''] else 'HEATER --' }}
- service: mqtt.publish - service: mqtt.publish
data: data:
@@ -365,9 +284,9 @@ script:
| replace('C', '') | replace('C', '')
| trim %} | trim %}
{% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned not in ['unknown', 'unavailable', '', 'none', 'None'] %}
Set: {{ cleaned | float(0) | round(1) }}°C {{ '\uE50F' }} {{ cleaned | float(0) | round(1) }}°C
{% else %} {% else %}
Set: -- °C {{ '\uE50F' }} --°C
{% endif %} {% endif %}
- service: mqtt.publish - service: mqtt.publish
@@ -377,23 +296,104 @@ script:
{% set raw = states('sensor.lounge_environment_humidity_mqtt') %} {% set raw = states('sensor.lounge_environment_humidity_mqtt') %}
{% set cleaned = raw | replace('%', '') | trim %} {% set cleaned = raw | replace('%', '') | trim %}
{% if cleaned in ['unknown', 'unavailable', '', 'none', 'None'] %} {% if cleaned in ['unknown', 'unavailable', '', 'none', 'None'] %}
Hum: Unknown {{ '\uE58C' }} --%
{% else %} {% else %}
Hum: {{ cleaned }}% {{ '\uE58C' }} {{ cleaned }}%
{% endif %} {% endif %}
# Push middle flame button state - service: script.hasp_apply_heat_button_state
# -------------------------------------------------------------------------
# Publish heater status text to p1b5
# Keeps OFF/BYPASS display based on ESPHome Mode, not just the operation switch.
#
# Display behaviour:
# - OFF -> Off
# - BYPASS (Remote Only) -> Bypass (Remote Only)
# - Auto but flame OFF -> Auto (Up to Temp)
# - Auto (Level 1) -> Auto 🔥
# - Auto (Level 2) -> Auto 🔥🔥
# - Auto (Level 3) -> Auto 🔥🔥🔥
# - Auto (Level 4) -> Auto 🔥🔥🔥🔥
#
# The flame is the openHASP/Material icon \uE238, not an emoji.
# -------------------------------------------------------------------------
hasp_publish_heater_status_text:
alias: "HASP: publish heater status text"
mode: queued
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b5.text"
payload: >
{% set mode = states('select.rinnai_neo_gas_heater_mode') %}
{% set op = states('switch.rinnai_neo_gas_heater_heater_operation') %}
{% set flame_on = is_state('switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame', 'on') %}
{% set s = states('sensor.rinnai_neo_gas_heater_rinnai_neo_gas_heater_status_text') %}
{% set flame = '\uE238' %}
{% if mode == 'OFF' %}
Off
{% elif mode == 'BYPASS (Remote Only)' %}
Bypass (Remote Only)
{% elif op == 'on' and not flame_on %}
Auto
{% elif s not in ['unknown', 'unavailable', '', 'none', 'None'] %}
{% set matches = s | regex_findall('Level ([0-9]+)', ignorecase=True) %}
{% set level = matches[0] | int(0) if matches | count > 0 else 0 %}
{% if level > 0 %}
Auto {{ flame * level }}
{% else %}
{{ s }}
{% endif %}
{% elif mode not in ['unknown', 'unavailable', '', 'none', 'None'] %}
{{ mode }}
{% else %}
HEATER --
{% endif %}
# -------------------------------------------------------------------------
# Publish middle flame button icon and colours to p1b6
# -------------------------------------------------------------------------
hasp_apply_heat_button_state:
alias: "HASP: apply heat button state"
mode: queued
sequence:
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: "hasp/openhasp_1/command/p1b6.text" topic: "hasp/openhasp_1/command/p1b6.text"
payload: "\uE238" payload: "\uE238"
- choose: - choose:
# Heater Operation OFF -> dark grey button, light grey flame # BYPASS (Remote Only) -> dark button, amber flame so it is visibly different
# from ordinary OFF, but still looks inactive.
- conditions: - conditions:
- condition: state - condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation entity_id: select.rinnai_neo_gas_heater_mode
state: "off" state: "BYPASS (Remote Only)"
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#FFB000"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#2F3240"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#2F3240"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#2F3240"
# OFF -> dark grey button, light grey flame
- conditions:
- condition: state
entity_id: select.rinnai_neo_gas_heater_mode
state: "OFF"
sequence: sequence:
- service: mqtt.publish - service: mqtt.publish
data: data:
@@ -412,7 +412,33 @@ script:
topic: "hasp/openhasp_1/command/p1b6.border_color" topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#2F3240" payload: "#2F3240"
# Heater Operation ON, flame OFF -> blue button, white flame # AUTO, flame ON -> blue button, red flame
- conditions:
- condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation
state: "on"
- condition: state
entity_id: switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
state: "on"
sequence:
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#FF3030"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#0095D9"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#00B6FF"
- service: mqtt.publish
data:
topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#0095D9"
# AUTO, flame OFF -> blue button, white flame
- conditions: - conditions:
- condition: state - condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation entity_id: switch.rinnai_neo_gas_heater_heater_operation
@@ -438,31 +464,23 @@ script:
topic: "hasp/openhasp_1/command/p1b6.border_color" topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#0095D9" payload: "#0095D9"
# Heater Operation ON, flame ON -> blue button, red flame default:
- conditions:
- condition: state
entity_id: switch.rinnai_neo_gas_heater_heater_operation
state: "on"
- condition: state
entity_id: switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
state: "on"
sequence:
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: "hasp/openhasp_1/command/p1b6.text_color" topic: "hasp/openhasp_1/command/p1b6.text_color"
payload: "#FF3030" payload: "#C0C0C0"
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: "hasp/openhasp_1/command/p1b6.bg_color" topic: "hasp/openhasp_1/command/p1b6.bg_color"
payload: "#0095D9" payload: "#2F3240"
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color" topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
payload: "#00B6FF" payload: "#2F3240"
- service: mqtt.publish - service: mqtt.publish
data: data:
topic: "hasp/openhasp_1/command/p1b6.border_color" topic: "hasp/openhasp_1/command/p1b6.border_color"
payload: "#0095D9" payload: "#2F3240"
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Style centre row info buttons as text panels # Style centre row info buttons as text panels
+5 -53
View File
@@ -50,7 +50,7 @@
# #
# MQTT STATUS: # MQTT STATUS:
# - Topic: # - Topic:
# viewroad-status/homeassistant/quiet-time # viewroad-status/quiet-time
# - Payload: # - Payload:
# on # on
# off # off
@@ -126,22 +126,11 @@ automation:
target: target:
entity_id: input_boolean.quiet_time entity_id: input_boolean.quiet_time
- id: quiet_time_state_change_actions_and_mqtt - id: quiet_time_mqtt
alias: "Quiet Time - State Change Actions and MQTT" alias: "Quiet Time - State to MQTT"
description: "Publishes the Quiet Time state to MQTT and runs the configured start/stop entity actions." description: "Publishes the Quiet Time state to MQTT"
mode: single mode: single
variables:
quiet_time_start_turn_off_entities:
- light.led_matrix_display_led_matrix_display_display
quiet_time_start_turn_on_entities: []
quiet_time_stop_turn_off_entities: []
quiet_time_stop_turn_on_entities:
- light.led_matrix_display_led_matrix_display_display
triggers: triggers:
- trigger: state - trigger: state
entity_id: input_boolean.quiet_time entity_id: input_boolean.quiet_time
@@ -155,42 +144,5 @@ automation:
actions: actions:
- action: mqtt.publish - action: mqtt.publish
data: data:
topic: viewroad-status/homeassistant/quiet-time topic: viewroad-status/quiet-time
payload: "{{ trigger.to_state.state }}" payload: "{{ trigger.to_state.state }}"
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'on' }}"
sequence:
- repeat:
for_each: "{{ quiet_time_start_turn_off_entities }}"
sequence:
- action: homeassistant.turn_off
target:
entity_id: "{{ repeat.item }}"
- repeat:
for_each: "{{ quiet_time_start_turn_on_entities }}"
sequence:
- action: homeassistant.turn_on
target:
entity_id: "{{ repeat.item }}"
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'off' }}"
sequence:
- repeat:
for_each: "{{ quiet_time_stop_turn_off_entities }}"
sequence:
- action: homeassistant.turn_off
target:
entity_id: "{{ repeat.item }}"
- repeat:
for_each: "{{ quiet_time_stop_turn_on_entities }}"
sequence:
- action: homeassistant.turn_on
target:
entity_id: "{{ repeat.item }}"
+190
View File
@@ -0,0 +1,190 @@
################################################################################
# Quiet Time On / Off Actions Package
################################################################################
#
# TITLE:
# Quiet Time On / Off Actions
#
# FILE:
# quiet_time_on_off_actions.yaml
#
# VERSION:
# V1.1 2026-06-15
#
# VERSION HISTORY:
# V1.1 2026-06-15
# - Added separate Quiet Time ON and Quiet Time OFF action sections.
# - Added support for non-binary Quiet Time OFF actions.
# - Sets input_number.openhasp_1_backlight_level to 200 when Quiet Time ends.
#
# V1.0 2026-06-15
# - Initial standalone package split out from the main Quiet Time package.
# - Turns selected entities on/off when input_boolean.quiet_time changes.
#
# PURPOSE:
# Runs local Home Assistant actions when Quiet Time is turned ON or OFF.
#
# The main Quiet Time package should continue to own:
# - input_boolean.quiet_time
# - daily reset behaviour
# - MQTT quiet_time state publishing
#
# This package only handles extra local actions that should happen when
# Quiet Time starts or ends.
#
# EDITING NOTES:
# - Add normal on/off entities to the relevant entity lists.
# - Empty lists are fine and will simply do nothing.
# - Use the "Other Quiet Time OFF Actions" section for things that are not
# simple on/off actions, such as setting input_numbers, selects, scenes,
# scripts, or custom service calls.
#
################################################################################
################################################################################
# AUTOMATIONS
################################################################################
automation:
- id: quiet_time_state_change_actions
alias: "Quiet Time - State Change Actions"
description: "Runs configured Home Assistant actions when Quiet Time is turned on or off."
mode: single
variables:
##########################################################################
# QUIET TIME ON ACTION LISTS
##########################################################################
#
# These actions run when input_boolean.quiet_time changes to "on".
#
quiet_time_on_turn_off_entities:
- light.led_matrix_display_led_matrix_display_display
quiet_time_on_turn_on_entities: []
##########################################################################
# QUIET TIME OFF ACTION LISTS
##########################################################################
#
# These actions run when input_boolean.quiet_time changes to "off".
#
quiet_time_off_turn_off_entities: []
quiet_time_off_turn_on_entities:
- light.led_matrix_display_led_matrix_display_display
##########################################################################
# OTHER QUIET TIME OFF ACTION VALUES
##########################################################################
#
# Use this list for input_number helpers that should be set when Quiet Time
# ends.
#
# Format:
# - entity_id: input_number.some_helper
# value: 123
#
quiet_time_off_input_number_values:
- entity_id: input_number.openhasp_1_backlight_level
value: 200
triggers:
- trigger: state
entity_id: input_boolean.quiet_time
from:
- "on"
- "off"
to:
- "on"
- "off"
actions:
- choose:
######################################################################
# QUIET TIME ON ACTIONS
######################################################################
#
# Runs when Quiet Time starts.
#
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'on' }}"
sequence:
- repeat:
for_each: "{{ quiet_time_on_turn_off_entities }}"
sequence:
- action: homeassistant.turn_off
target:
entity_id: "{{ repeat.item }}"
- repeat:
for_each: "{{ quiet_time_on_turn_on_entities }}"
sequence:
- action: homeassistant.turn_on
target:
entity_id: "{{ repeat.item }}"
######################################################################
# QUIET TIME OFF ACTIONS
######################################################################
#
# Runs when Quiet Time ends.
#
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'off' }}"
sequence:
##################################################################
# Quiet Time OFF - binary/entity actions
##################################################################
- repeat:
for_each: "{{ quiet_time_off_turn_off_entities }}"
sequence:
- action: homeassistant.turn_off
target:
entity_id: "{{ repeat.item }}"
- repeat:
for_each: "{{ quiet_time_off_turn_on_entities }}"
sequence:
- action: homeassistant.turn_on
target:
entity_id: "{{ repeat.item }}"
##################################################################
# Quiet Time OFF - input_number set actions
##################################################################
- repeat:
for_each: "{{ quiet_time_off_input_number_values }}"
sequence:
- action: input_number.set_value
target:
entity_id: "{{ repeat.item.entity_id }}"
data:
value: "{{ repeat.item.value | float }}"
##################################################################
# Quiet Time OFF - other custom actions
##################################################################
#
# Add any extra non-binary service calls here later.
#
# Examples:
#
# - action: script.some_script
#
# - action: select.select_option
# target:
# entity_id: select.some_select
# data:
# option: "Some Option"
#
##################################################################