various package updates
This commit is contained in:
+1
-1
@@ -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}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
@@ -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) }}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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 }}
|
|
||||||
|
|||||||
-26
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
- service: mqtt.publish
|
||||||
- condition: state
|
data:
|
||||||
entity_id: switch.rinnai_neo_gas_heater_heater_operation
|
topic: "hasp/openhasp_1/command/p1b6.text_color"
|
||||||
state: "on"
|
payload: "#C0C0C0"
|
||||||
- condition: state
|
- service: mqtt.publish
|
||||||
entity_id: switch.rinnai_neo_gas_heater_rinnai_neo_gas_heater_activate_flame
|
data:
|
||||||
state: "on"
|
topic: "hasp/openhasp_1/command/p1b6.bg_color"
|
||||||
sequence:
|
payload: "#2F3240"
|
||||||
- service: mqtt.publish
|
- service: mqtt.publish
|
||||||
data:
|
data:
|
||||||
topic: "hasp/openhasp_1/command/p1b6.text_color"
|
topic: "hasp/openhasp_1/command/p1b6.bg_grad_color"
|
||||||
payload: "#FF3030"
|
payload: "#2F3240"
|
||||||
- service: mqtt.publish
|
- service: mqtt.publish
|
||||||
data:
|
data:
|
||||||
topic: "hasp/openhasp_1/command/p1b6.bg_color"
|
topic: "hasp/openhasp_1/command/p1b6.border_color"
|
||||||
payload: "#0095D9"
|
payload: "#2F3240"
|
||||||
- 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"
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# Style centre row info buttons as text panels
|
# Style centre row info buttons as text panels
|
||||||
|
|||||||
@@ -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 }}"
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
#
|
||||||
|
##################################################################
|
||||||
Reference in New Issue
Block a user