various tidyups

This commit is contained in:
zorruno
2026-07-29 23:18:11 +12:00
parent adb533d6a3
commit dd13f52feb
22 changed files with 6837 additions and 4057 deletions
+21 -1
View File
@@ -8,6 +8,10 @@
# packages/16a_ev_charging_controls.yaml
#
# VERSION:
# V1.3 2026-07-24
# - Added startup catch-up to offpeak_end: when HA starts outside the
# offpeak window in Normal mode, the relay is turned off immediately.
#
# V1.2 2026-07-20
# - Added structured mode, timing, and restart behavior documentation.
#
@@ -56,7 +60,8 @@
#
# OPERATION NOTES:
# - Normal offpeak start and end use exact-time triggers.
# - There is no startup catch-up if Home Assistant is offline at either time.
# - The offpeak_end automation includes a startup trigger: if HA restarts
# outside the offpeak window in Normal mode, the relay turns off immediately.
#
# PACKAGE SETTINGS:
# Car display name:
@@ -168,12 +173,27 @@ automation:
triggers:
- trigger: time
at: input_datetime.ev_16a_offpeak_end
- trigger: homeassistant
event: start
conditions:
- condition: state
entity_id: input_select.ev_16a_charge_mode
state: "Normal (Offpeak)"
- condition: template
value_template: >
{% set start = states('input_datetime.ev_16a_offpeak_start') %}
{% set end = states('input_datetime.ev_16a_offpeak_end') %}
{% set now_time = now().strftime('%H:%M:%S') %}
{% if start == end %}
{{ false }}
{% elif start < end %}
{{ not (start <= now_time < end) }}
{% else %}
{{ not (now_time >= start or now_time < end) }}
{% endif %}
actions:
- action: switch.turn_off
target:
@@ -2,8 +2,8 @@
# PACKAGE: Appliance Monitor Processor
################################################################################
#
# Version: 1.3
# Date: 2026-07-11
# Version: 1.5
# Date: 2026-07-26
#
# Purpose:
# Shared appliance power monitoring processor.
@@ -41,6 +41,15 @@
# Finished
#
# Notes:
# Version 1.5:
# - Standardized Sony TV and Pushover appliance notification titles as
# "Appliance Notification".
#
# Version 1.4:
# - Added power_available field and state machine guard.
# - Prevents false Operating→Finished transitions when power sensor is
# unavailable (e.g. during Home Assistant startup).
#
# Version 1.3:
# - Updated completion announcements to support all current View Road
# announcement router channels.
@@ -213,6 +222,12 @@ script:
selector:
text:
power_available:
name: Power Available
description: Whether the power sensor reported a valid numeric state.
selector:
boolean:
sequence:
##########################################################################
# CORE DEFAULTS AND PASSED VALUES
@@ -239,6 +254,8 @@ script:
am_max_sample_gap_seconds: "{{ max_sample_gap_seconds | default(900, true) | int(900) }}"
am_min_cycle_notify_seconds: "{{ min_cycle_notify_seconds | default(300, true) | int(300) }}"
am_power_available: "{{ power_available | default(true, true) | bool(true) }}"
##########################################################################
# ANNOUNCEMENT DEFAULTS AND PASSED VALUES
##########################################################################
@@ -280,7 +297,7 @@ script:
{{ long_announcement | default('', true) | string }}
am_announcement_title: >-
{{ title | default(am_appliance_name ~ ' Notification', true) | string }}
Appliance Notification
am_announcement_payload: >-
{% if announcement_payload is defined %}
@@ -394,7 +411,9 @@ script:
{% set standby = am_standby_power | float(2) %}
{% set operate = am_operating_power_min | float(12) %}
{% set prev = am_previous_state | string %}
{% if prev == 'Operating' and avg < operate %}
{% if prev == 'Operating' and not am_power_available %}
{{ prev }}
{% elif prev == 'Operating' and avg < operate %}
Finished
{% elif avg < standby %}
Off
@@ -51,6 +51,10 @@
# matrix_indicator.
#
# VERSION HISTORY:
# V1.6 2026-07-24
# - Added startup delay guard to prevent false completion announcements.
# - Added power_available field for the processor availability check.
#
# V1.5 2026-07-11
# - Added full View Road announcement router parameter support.
# - Added per-appliance announcement_enabled.
@@ -421,6 +425,15 @@ automation:
mqtt_feed: "3d_printer"
action:
# On startup, wait for power sensors to report real values before processing.
- choose:
- conditions:
- condition: trigger
id:
- ha_start
sequence:
- delay: "00:01:00"
#:####################################################################################:#
# PUBLISH / REFRESH MQTT DISCOVERY CONFIG #
#:####################################################################################:#
@@ -574,6 +587,9 @@ automation:
am_power_w: >-
{{ states(repeat.item.power_entity) | float(0) }}
am_power_available: >-
{{ states(repeat.item.power_entity) not in ['unknown', 'unavailable'] }}
- action: script.appliance_monitor_process_sample
data:
appliance_id: "{{ repeat.item.appliance_id }}"
@@ -581,6 +597,7 @@ automation:
appliance_action: "{{ repeat.item.appliance_action }}"
power_w: "{{ am_power_w }}"
power_available: "{{ am_power_available }}"
monitor_sensor: "{{ am_monitor_sensor }}"
state_topic: "{{ am_state_topic }}"
@@ -113,13 +113,12 @@ automation:
# Re-apply when the openHASP display comes online
##########################################################################
- trigger: mqtt
topic: hasp/openhasp_1/status
payload: online
topic: "hasp/openhasp_1/LWT"
actions:
- if:
- condition: template
value_template: "{{ trigger.platform in ['homeassistant', 'mqtt'] }}"
value_template: "{{ trigger.platform == 'homeassistant' or (trigger.platform == 'mqtt' and trigger.payload == 'online') }}"
then:
- delay: "00:00:02"
+2 -2
View File
@@ -17,8 +17,8 @@ group:
basement_lights:
name: "Basement Lights"
entities:
- switch.esp_officelights_relay_1_nighttime_lights
- switch.esp_officelights_relay_2_daytime_lights
- switch.office_office_main_lightswitch_3_relay_1_bunker_lights
- switch.office_office_main_lightswitch_3_relay_2_overhead_lights
- switch.esp_underhouselights_underhouse_entrance_lights
- switch.esp_underhouselights_underhouse_storage_lights
- switch.esp_laundrylights_relay_1_laundry_lights
+642
View File
@@ -0,0 +1,642 @@
#:########################################################################################:#
# Flounder Kiosk Package #
#:########################################################################################:#
#
# TITLE:
# Flounder Kiosk
#
# FILE:
# flounder_kiosk.yaml
#
# VERSION:
# V2.0 - 2026-07-28
#
# PURPOSE:
# Provides Home Assistant controls and status entities for the Flounder portrait
# touchscreen kiosk.
#
# DISPLAY CONTROL MODEL:
# A single MQTT select sets one persistent display mode:
# - Screen Lock
# - Screen Off
# - Screensaver
# - Screen On
#
# The selected display mode is separate from the actual physical screen and
# screensaver states. For example, Screen Off remains selected while a touch
# temporarily wakes the physical display.
#
# MQTT DEVICE:
# Name: Flounder Kiosk
# Identifier: flounder_kiosk
# Manufacturer: Dell
# Model: Portrait Touchscreen Kiosk
# Suggested Area: Lounge
#
# ENTITIES:
# select.flounder_kiosk_display_mode
# number.flounder_kiosk_brightness
# number.flounder_kiosk_presence_brightness
# sensor.flounder_kiosk_actual_brightness
# number.flounder_kiosk_presence_timeout
# binary_sensor.flounder_kiosk_presence_active
# switch.flounder_kiosk_motion_wake
# number.flounder_kiosk_volume
# switch.flounder_kiosk_mute
# binary_sensor.flounder_kiosk_screen_on
# binary_sensor.flounder_kiosk_screensaver_active
# binary_sensor.flounder_kiosk_motion
#
# REPLACED ENTITIES:
# The following writable entities from V1.7 are removed:
# - switch.flounder_kiosk_screen
# - switch.flounder_kiosk_screensaver
#
# They are replaced by:
# - select.flounder_kiosk_display_mode
# - binary_sensor.flounder_kiosk_screen_on
# - binary_sensor.flounder_kiosk_screensaver_active
#
# MQTT COMMAND TOPICS:
# viewroad-commands/flounder/display_mode/set
# viewroad-commands/flounder/brightness/set
# viewroad-commands/flounder/brightness/presence/set
# viewroad-commands/flounder/presence/timeout/set
# viewroad-commands/flounder/motion_wake/set
# viewroad-commands/flounder/audio/volume/set
# viewroad-commands/flounder/audio/mute/set
#
# MQTT STATE TOPICS:
# viewroad-status/flounder/display_mode/state
# viewroad-status/flounder/screen/state
# viewroad-status/flounder/screensaver/state
# viewroad-status/flounder/brightness/state
# viewroad-status/flounder/brightness/actual/state
# viewroad-status/flounder/brightness/presence/state
# viewroad-status/flounder/presence/state
# viewroad-status/flounder/presence/timeout/state
# viewroad-status/flounder/motion_wake/state
# viewroad-status/flounder/audio/volume/state
# viewroad-status/flounder/audio/mute/state
# viewroad-status/flounder/motion/state
#
# MQTT AVAILABILITY TOPIC:
# viewroad-status/flounder/availability
#
# DISPLAY MODES:
# Screen Lock:
# - Stops XScreenSaver.
# - Disables touchscreen input.
# - Keeps the physical panel off.
# - Ignores camera motion even when Motion Wake is enabled.
# - Camera motion detection and reporting continue in the background.
#
# Screen Off:
# - Keeps the physical panel off while activity is inactive.
# - Keeps the touchscreen enabled.
# - Touch always wakes the panel temporarily.
# - Camera motion wakes it when Motion Wake is enabled.
# - Activity applies Presence Brightness.
# - The panel returns to Screen Off after the shared Presence Timeout.
#
# Screensaver:
# - Turns the panel on at Current Brightness.
# - Starts XScreenSaver immediately.
# - Touch stops XScreenSaver and applies Presence Brightness.
# - Camera motion does the same when Motion Wake is enabled.
# - XScreenSaver restarts after the shared Presence Timeout.
#
# Screen On:
# - Keeps the panel on at Current Brightness while activity is inactive.
# - Touch applies Presence Brightness.
# - Camera motion does the same when Motion Wake is enabled.
# - The panel returns to Current Brightness after the Presence Timeout.
#
# PRESENCE AND TOUCH OPERATION:
# - Touch and camera motion use the same Presence Timeout.
# - Touch is active in every mode except Screen Lock.
# - Motion Wake controls camera motion only and does not disable touch wake.
# - Qualifying activity immediately applies Presence Brightness.
# - Camera motion holds presence active until the Motion entity returns to OFF.
# - A touch starts or restarts the ten-step brightness ramp immediately unless
# qualifying camera motion is currently holding presence active.
# - Presence Timeout is the total duration of the ten-step brightness ramp.
# - The final ramp step applies the latest Current Brightness.
# - The selected display mode is then restored automatically.
#
# DIAGNOSTIC STATE MEANING:
# - Screen On reports the real Linux DPMS panel state.
# - Screensaver Active reports whether XScreenSaver is running.
# - Presence Active reports whether temporary activity behaviour is active.
# - Actual Brightness reports the physical backlight percentage.
#
# VERSION HISTORY:
# V2.0 - 2026-07-28
# - Replaced the separate Screen and Screensaver switches with one persistent
# four-option Display Mode select.
# - Added Screen Lock, Screen Off, Screensaver, and Screen On modes.
# - Added shared touchscreen and camera-presence behaviour.
# - Added automatic return to the selected mode after the presence ramp.
# - Replaced writable Screen and Screensaver entities with diagnostics.
#
# V1.7 - 2026-07-27
# - Re-enabled DPMS after XScreenSaver activation.
# - Corrected Screen state reporting while XScreenSaver was running.
#
# V1.6 - 2026-07-27
# - Grouped all MQTT entities under one Flounder Kiosk device.
#
# V1.5 - 2026-07-27
# - Added Motion Wake control.
#
# V1.4 - 2026-07-27
# - Added the ten-step presence-brightness fade.
#
# V1.3 - 2026-07-27
# - Added presence brightness, timeout, and diagnostic entities.
#
# V1.2 - 2026-07-27
# - Added XScreenSaver control.
#
# V1.1 - 2026-07-27
# - Added MQTT availability monitoring.
#
# V1.0 - 2026-07-26
# - Initial package.
#
#:########################################################################################:#
# MQTT Entities #
#:########################################################################################:#
mqtt:
#:########################################################################################:#
# Flounder Kiosk Display Mode #
#:########################################################################################:#
#
# Selects the persistent display operating mode.
#
# The selected mode remains unchanged while touch or camera activity temporarily
# changes the real panel or screensaver state.
#
- select:
name: "Display Mode"
unique_id: flounder_kiosk_display_mode
default_entity_id: select.flounder_kiosk_display_mode
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
command_topic: "viewroad-commands/flounder/display_mode/set"
state_topic: "viewroad-status/flounder/display_mode/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
options:
- "Screen Lock"
- "Screen Off"
- "Screensaver"
- "Screen On"
optimistic: false
retain: false
icon: mdi:monitor-dashboard
#:########################################################################################:#
# Flounder Kiosk Current Brightness #
#:########################################################################################:#
#
# Stores the normal inactive brightness from 1 to 100 percent.
#
# In Screensaver and Screen On modes it is the normal visible brightness.
# In Screen Off mode it is the final ramp target before the panel powers off.
# In Screen Lock mode it is stored for the next unlocked mode.
#
- number:
name: "Brightness"
unique_id: flounder_kiosk_brightness
default_entity_id: number.flounder_kiosk_brightness
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
command_topic: "viewroad-commands/flounder/brightness/set"
state_topic: "viewroad-status/flounder/brightness/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
min: 1
max: 100
step: 1
mode: slider
unit_of_measurement: "%"
optimistic: false
retain: false
icon: mdi:brightness-6
#:########################################################################################:#
# Flounder Kiosk Presence Brightness #
#:########################################################################################:#
#
# Sets the temporary brightness used after touch or qualifying camera motion.
#
# Changing it while Presence Active is ON immediately updates the physical
# backlight.
#
- number:
name: "Presence Brightness"
unique_id: flounder_kiosk_presence_brightness
default_entity_id: number.flounder_kiosk_presence_brightness
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: config
command_topic: "viewroad-commands/flounder/brightness/presence/set"
state_topic: "viewroad-status/flounder/brightness/presence/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
min: 1
max: 100
step: 1
mode: slider
unit_of_measurement: "%"
optimistic: false
retain: false
icon: mdi:brightness-7
#:########################################################################################:#
# Flounder Kiosk Actual Brightness #
#:########################################################################################:#
#
# Reports the physical display backlight percentage.
#
# This may differ from Current Brightness while temporary activity is active or
# while the ten-step brightness ramp is running.
#
- sensor:
name: "Actual Brightness"
unique_id: flounder_kiosk_actual_brightness
default_entity_id: sensor.flounder_kiosk_actual_brightness
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: diagnostic
state_topic: "viewroad-status/flounder/brightness/actual/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
unit_of_measurement: "%"
state_class: measurement
icon: mdi:brightness-percent
#:########################################################################################:#
# Flounder Kiosk Presence Timeout #
#:########################################################################################:#
#
# Sets the shared touch and camera-presence timeout.
#
# The value is the total duration of the ten-step brightness ramp. Home Assistant
# displays whole minutes while MQTT stores and transfers seconds.
#
- number:
name: "Presence Timeout"
unique_id: flounder_kiosk_presence_timeout
default_entity_id: number.flounder_kiosk_presence_timeout
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: config
command_topic: "viewroad-commands/flounder/presence/timeout/set"
state_topic: "viewroad-status/flounder/presence/timeout/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
command_template: >-
{{ (value | float(1) * 60) | round(0) | int }}
value_template: >-
{{ (value | float(60) / 60) | round(0) | int }}
min: 1
max: 1440
step: 1
mode: box
unit_of_measurement: "min"
optimistic: false
retain: false
icon: mdi:timer-outline
#:########################################################################################:#
# Flounder Kiosk Presence Active #
#:########################################################################################:#
#
# Reports whether temporary touch or camera-presence behaviour is active.
#
# It remains ON through the brightness ramp and returns to OFF when the selected
# display mode has been restored.
#
- binary_sensor:
name: "Presence Active"
unique_id: flounder_kiosk_presence_active
default_entity_id: binary_sensor.flounder_kiosk_presence_active
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: diagnostic
state_topic: "viewroad-status/flounder/presence/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
icon: mdi:account-eye
#:########################################################################################:#
# Flounder Kiosk Motion Wake #
#:########################################################################################:#
#
# Controls whether camera motion counts as display activity.
#
# Motion Wake does not affect touchscreen activity. Screen Lock ignores camera
# motion regardless of this switch while motion detection continues reporting.
#
- switch:
name: "Motion Wake"
unique_id: flounder_kiosk_motion_wake
default_entity_id: switch.flounder_kiosk_motion_wake
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: config
command_topic: "viewroad-commands/flounder/motion_wake/set"
state_topic: "viewroad-status/flounder/motion_wake/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
optimistic: false
retain: false
icon: mdi:motion-sensor
#:########################################################################################:#
# Flounder Kiosk Volume #
#:########################################################################################:#
#
# Controls the active PipeWire audio-sink volume from 0 to 100 percent.
#
- number:
name: "Volume"
unique_id: flounder_kiosk_volume
default_entity_id: number.flounder_kiosk_volume
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
command_topic: "viewroad-commands/flounder/audio/volume/set"
state_topic: "viewroad-status/flounder/audio/volume/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
min: 0
max: 100
step: 1
mode: slider
unit_of_measurement: "%"
optimistic: false
retain: false
icon: mdi:volume-high
#:########################################################################################:#
# Flounder Kiosk Mute #
#:########################################################################################:#
#
# Controls the mute state of the active PipeWire audio sink.
#
- switch:
name: "Mute"
unique_id: flounder_kiosk_mute
default_entity_id: switch.flounder_kiosk_mute
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
command_topic: "viewroad-commands/flounder/audio/mute/set"
state_topic: "viewroad-status/flounder/audio/mute/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
optimistic: false
retain: false
icon: mdi:volume-mute
#:########################################################################################:#
# Flounder Kiosk Screen On #
#:########################################################################################:#
#
# Reports the real physical panel state from Linux DPMS.
#
# This can report ON while Display Mode remains Screen Off because touch or
# qualifying camera motion has temporarily woken the panel.
#
- binary_sensor:
name: "Screen On"
unique_id: flounder_kiosk_screen_on
default_entity_id: binary_sensor.flounder_kiosk_screen_on
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: diagnostic
state_topic: "viewroad-status/flounder/screen/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
device_class: power
icon: mdi:monitor
#:########################################################################################:#
# Flounder Kiosk Screensaver Active #
#:########################################################################################:#
#
# Reports whether XScreenSaver is currently running.
#
# In Screensaver mode it normally reports ON, but temporarily reports OFF while
# touch or qualifying camera motion displays the Home Assistant kiosk.
#
- binary_sensor:
name: "Screensaver Active"
unique_id: flounder_kiosk_screensaver_active
default_entity_id: binary_sensor.flounder_kiosk_screensaver_active
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
entity_category: diagnostic
state_topic: "viewroad-status/flounder/screensaver/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
icon: mdi:monitor-shimmer
#:########################################################################################:#
# Flounder Kiosk Motion #
#:########################################################################################:#
#
# Reports raw movement detected by the local Motion camera service.
#
# Motion continues reporting in Screen Lock and while Motion Wake is OFF. It only
# affects display activity when Motion Wake is ON and Display Mode is not
# Screen Lock.
#
- binary_sensor:
name: "Motion"
unique_id: flounder_kiosk_motion
default_entity_id: binary_sensor.flounder_kiosk_motion
device:
identifiers:
- flounder_kiosk
name: "Flounder Kiosk"
manufacturer: "Dell"
model: "Portrait Touchscreen Kiosk"
suggested_area: "Lounge"
state_topic: "viewroad-status/flounder/motion/state"
availability_topic: "viewroad-status/flounder/availability"
payload_available: "ON"
payload_not_available: "OFF"
payload_on: "ON"
payload_off: "OFF"
device_class: motion
+11
View File
@@ -2,6 +2,11 @@
# PACKAGE: Free Power Time Automation #
#:########################################################################################:#
# VERSION:
# 1.2.0 - 2026-07-24
# - Added startup catch-up to end_actions: when HA starts outside the
# free power window, the end actions (chargers off, dehumidifier off)
# are applied immediately.
#
# 1.1.0 - 2026-06-24
# - Changed gas-to-heatpump handover so the heat pump setpoint is offset from
# the gas heater setpoint.
@@ -316,5 +321,11 @@ automation:
triggers:
- trigger: time
at: input_datetime.free_power_end_time
- trigger: homeassistant
event: start
conditions:
- condition: state
entity_id: binary_sensor.free_power_time_active
state: "off"
actions:
- action: script.free_power_end_actions
@@ -9,9 +9,14 @@
# packages/heat_pump_master_bedroom_schedules.yaml
#
# VERSION:
# V1.1 2026-07-20
# V1.2 2026-07-24
#
# VERSION HISTORY:
# V1.2 2026-07-24
# - Added startup catch-up to midnight_off: when HA starts between
# midnight and 21:00 with the Midnight Off or Night Power toggle on,
# the heat pump is turned off immediately.
#
# V1.1 2026-07-20
# - Added structured documentation for schedules, boost, and helper behavior.
#
@@ -50,7 +55,9 @@
#
# OPERATION NOTES:
# - The 21:00 and midnight schedules use exact-time triggers.
# - There is no startup catch-up if Home Assistant is offline at either time.
# - The midnight_off automation includes a startup trigger: if HA restarts
# between midnight and 21:00 with the Midnight Off or Night Power toggle
# on, the heat pump is turned off immediately.
#
##########################################################################################
@@ -214,6 +221,11 @@ automation:
trigger:
- platform: time
at: "00:00:00"
- platform: homeassistant
event: start
condition:
- condition: template
value_template: "{{ now().hour < 21 }}"
action:
- choose:
- conditions:
+7 -7
View File
@@ -126,7 +126,7 @@ script:
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "on"
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "on" # non dimmable pair
light.esp_breakfastbarleds_breakfast_bar_leds: 90
light.esp_loungecabinetleds_lounge_cabinet_leds: 90
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 100
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 90
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "on"
@@ -146,7 +146,7 @@ script:
light.esp_lounge6chdimmer_lounge_downlights_south: 60
light.esp_lounge6chdimmer_lounge_rafter_buttons: 40
light.esp_breakfastbarleds_breakfast_bar_leds: 60
light.esp_loungecabinetleds_lounge_cabinet_leds: 60
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 66
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 60
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
@@ -167,7 +167,7 @@ script:
light.esp_lounge6chdimmer_lounge_downlights_south: 40
light.esp_lounge6chdimmer_lounge_rafter_buttons: 30
light.esp_breakfastbarleds_breakfast_bar_leds: 50
light.esp_loungecabinetleds_lounge_cabinet_leds: 50
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 55
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 50
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
@@ -188,7 +188,7 @@ script:
light.esp_lounge6chdimmer_lounge_downlights_south: 30
light.esp_lounge6chdimmer_lounge_rafter_buttons: 0
light.esp_breakfastbarleds_breakfast_bar_leds: 40
light.esp_loungecabinetleds_lounge_cabinet_leds: 40
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 44
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 40
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
@@ -228,7 +228,7 @@ script:
light.esp_lounge6chdimmer_lounge_downlights_south: 0
light.esp_lounge6chdimmer_lounge_rafter_buttons: 0
light.esp_breakfastbarleds_breakfast_bar_leds: 5
light.esp_loungecabinetleds_lounge_cabinet_leds: 5
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 4
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 5
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
@@ -246,7 +246,7 @@ script:
light.esp_lounge6chdimmer_couch_spots_right: 20
light.esp_lounge6chdimmer_lounge_rafter_buttons: 15
light.esp_breakfastbarleds_breakfast_bar_leds: 25
light.esp_loungecabinetleds_lounge_cabinet_leds: 30
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 33
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 30
#light.tasmo_h801_loungeled1_6180_a: 25
#light.tasmo_h801_loungeled1_6180_b: 25
@@ -270,7 +270,7 @@ script:
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
light.esp_breakfastbarleds_breakfast_bar_leds: 0
light.esp_loungecabinetleds_lounge_cabinet_leds: 0
number.esp_loungecabinetleds_lounge_cabinet_leds_output_set_0_100: 0
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 0
switch.lounge_cupboard_dual_usb_xus09_l2: "off"
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
@@ -1,8 +1,12 @@
################################################################################
# PACKAGE: Office Lights And Power Backup Occupancy Automation
# PACKAGE: Office Power Backup Occupancy Automation
################################################################################
#
# Version:
# - 1.1 - 2026-07-25
# - Stripped light control (now handled by direct MQTT)
# - Retains power supply backup control only
#
# - 1.0 - 2026-04-25
# - Initial package version.
# - Backup automation for Office lights and Office power.
@@ -10,19 +14,18 @@
# - Uses Office spare button / relay as a backup manual master.
#
# Operation:
# - Turns Office lights and power on when the Office mmWave occupancy sensor
# - Turns Office power supplies on when the Office mmWave occupancy sensor
# detects occupancy or movement.
#
# - Turns Office lights and power off after the Office mmWave occupancy sensor
# - Turns Office power supplies off after the Office mmWave occupancy sensor
# has been clear for the configured delay period.
#
# - Provides a backup manual control path using the Office spare button.
# This is useful if the occupancy sensor is offline.
#
# Notes:
# - This is treated as a BACKUP automation.
# - The standard method should still be the direct ESPHome/MQTT control path.
# - This HA automation provides a fallback path using HA entity states.
# - This is treated as a BACKUP automation for POWER SUPPLIES ONLY.
# - Light control is handled by direct ESPHome/MQTT (see device YAMLs).
# - The physical spare button is read using:
# binary_sensor.esp_officelights_button_3_spare
# - The spare relay is used as the manual master/latch state:
@@ -36,7 +39,7 @@
input_number:
office_lights_backup_clear_delay_seconds:
name: "Office Lights Backup Clear Delay Seconds"
name: "Office Power Backup Clear Delay Seconds"
min: 0
max: 3600
step: 1
@@ -50,13 +53,14 @@ input_number:
################################################################################
automation:
- id: office_lights_power_backup_occupancy_control
alias: "Office Lights And Power - Backup Occupancy Control"
- id: office_power_backup_occupancy_control
alias: "Office Power - Backup Occupancy Control"
description: >
Backup automation for Office lights and power. Turns required devices on
when Office mmWave occupancy or movement is detected. Turns them off after
the occupancy sensor is clear for the configured delay period. Also allows
Backup automation for Office power supplies. Turns power on when Office
mmWave occupancy or movement is detected. Turns power off after the
occupancy sensor is clear for the configured delay period. Also allows
manual backup toggling using the Office spare button and spare relay.
Light control is handled by direct ESPHome/MQTT sync.
mode: restart
triggers:
##########################################################################
@@ -79,8 +83,8 @@ automation:
# Manual backup button press.
#
# The spare relay state is used as the master/latch:
# - If spare relay is OFF when the button is pressed, turn everything ON.
# - If spare relay is ON when the button is pressed, turn everything OFF.
# - If spare relay is OFF when the button is pressed, turn power ON.
# - If spare relay is ON when the button is pressed, turn power OFF.
##########################################################################
- trigger: state
entity_id: binary_sensor.esp_officelights_button_3_spare
@@ -102,15 +106,15 @@ automation:
- choose:
######################################################################
# ON LOGIC:
# Occupancy detected - turn everything on.
# Occupancy detected - turn power supplies on.
######################################################################
- alias: "Occupancy detected - turn Office lights and power on"
- alias: "Occupancy detected - turn Office power on"
conditions:
- condition: trigger
id: occupancy_detected
sequence:
##############################################################
# Power first.
# Power supplies.
##############################################################
- alias: "Turn on Office ELV power supply if needed"
if:
@@ -132,59 +136,6 @@ automation:
target:
entity_id: switch.esp_officedeskrightgpo_office_right_hand_gpo
#- alias: "Turn on Office USB Hub if needed"
# if:
# - condition: state
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
# state: "off"
# then:
# - action: switch.turn_on
# target:
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
##############################################################
# Lights.
##############################################################
- alias: "Turn on Office right hand bunker light if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
state: "off"
then:
- action: light.turn_on
target:
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
- alias: "Turn on Office cool white overhead lights if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
state: "off"
then:
- action: light.turn_on
target:
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
- alias: "Turn on Office nighttime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_1_nighttime_lights
state: "off"
then:
- action: switch.turn_on
target:
entity_id: switch.esp_officelights_relay_1_nighttime_lights
- alias: "Turn on Office daytime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_2_daytime_lights
state: "off"
then:
- action: switch.turn_on
target:
entity_id: switch.esp_officelights_relay_2_daytime_lights
##############################################################
# Manual master/latch relay.
##############################################################
@@ -200,9 +151,9 @@ automation:
######################################################################
# OFF LOGIC:
# Occupancy clear - wait, re-check, then turn everything off.
# Occupancy clear - wait, re-check, then turn power supplies off.
######################################################################
- alias: "Occupancy clear - wait, re-check, then turn Office lights and power off"
- alias: "Occupancy clear - wait, re-check, then turn Office power off"
conditions:
- condition: template
value_template: >
@@ -229,50 +180,7 @@ automation:
state: "off"
##############################################################
# Lights off first.
##############################################################
- alias: "Turn off Office right hand bunker light if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
state: "on"
then:
- action: light.turn_off
target:
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
- alias: "Turn off Office cool white overhead lights if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
state: "on"
then:
- action: light.turn_off
target:
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
- alias: "Turn off Office nighttime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_1_nighttime_lights
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.esp_officelights_relay_1_nighttime_lights
- alias: "Turn off Office daytime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_2_daytime_lights
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.esp_officelights_relay_2_daytime_lights
##############################################################
# Power off after lights.
# Power off.
##############################################################
- alias: "Turn off Office right hand GPO if needed"
if:
@@ -294,16 +202,6 @@ automation:
target:
entity_id: switch.esp_officeelvcontrol_office_elv_power_supply
#- alias: "Turn off Office USB Hub power supply if needed"
# if:
# - condition: state
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
# state: "on"
# then:
# - action: switch.turn_off
# target:
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
##############################################################
# Manual master/latch relay off last.
##############################################################
@@ -319,9 +217,9 @@ automation:
######################################################################
# MANUAL BACKUP LOGIC:
# Button pressed while spare relay master is ON - turn everything OFF.
# Button pressed while spare relay master is ON - turn power off.
######################################################################
- alias: "Backup button pressed - spare relay on, turn everything off"
- alias: "Backup button pressed - spare relay on, turn power off"
conditions:
- condition: trigger
id: backup_button_pressed
@@ -330,50 +228,7 @@ automation:
state: "on"
sequence:
##############################################################
# Lights off first.
##############################################################
- alias: "Turn off Office right hand bunker light if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
state: "on"
then:
- action: light.turn_off
target:
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
- alias: "Turn off Office cool white overhead lights if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
state: "on"
then:
- action: light.turn_off
target:
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
- alias: "Turn off Office nighttime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_1_nighttime_lights
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.esp_officelights_relay_1_nighttime_lights
- alias: "Turn off Office daytime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_2_daytime_lights
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.esp_officelights_relay_2_daytime_lights
##############################################################
# Power off after lights.
# Power off.
##############################################################
- alias: "Turn off Office right hand GPO if needed"
if:
@@ -395,16 +250,6 @@ automation:
target:
entity_id: switch.esp_officeelvcontrol_office_elv_power_supply
#- alias: "Turn off Office USB Hub power supply if needed"
# if:
# - condition: state
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
# state: "on"
# then:
# - action: switch.turn_off
# target:
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
##############################################################
# Manual master/latch relay off last.
##############################################################
@@ -420,12 +265,12 @@ automation:
######################################################################
# MANUAL BACKUP LOGIC:
# Button pressed while spare relay master is OFF - turn everything ON.
# Button pressed while spare relay master is OFF - turn power on.
#
# No off timer is started from this manual press. If the occupancy
# sensor later changes to clear, the normal clear-delay logic will run.
######################################################################
- alias: "Backup button pressed - spare relay off, turn everything on"
- alias: "Backup button pressed - spare relay off, turn power on"
conditions:
- condition: trigger
id: backup_button_pressed
@@ -434,7 +279,7 @@ automation:
state: "off"
sequence:
##############################################################
# Power first.
# Power supplies.
##############################################################
- alias: "Turn on Office ELV power supply if needed"
if:
@@ -456,59 +301,6 @@ automation:
target:
entity_id: switch.esp_officedeskrightgpo_office_right_hand_gpo
# alias: "Turn on Office USB Hub power supply if needed"
# if:
# - condition: state
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
# state: "off"
# then:
# - action: switch.turn_on
# target:
# entity_id: switch.esp_officeusbhubpower_usb_hub_power_supply
##############################################################
# Lights.
##############################################################
- alias: "Turn on Office right hand bunker light if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
state: "off"
then:
- action: light.turn_on
target:
entity_id: light.esp_officeduallights_light_1_right_hand_bunker_light
- alias: "Turn on Office cool white overhead lights if needed"
if:
- condition: state
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
state: "off"
then:
- action: light.turn_on
target:
entity_id: light.esp_officeduallights_light_2_cool_white_overhead_lights
- alias: "Turn on Office nighttime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_1_nighttime_lights
state: "off"
then:
- action: switch.turn_on
target:
entity_id: switch.esp_officelights_relay_1_nighttime_lights
- alias: "Turn on Office daytime lights relay if needed"
if:
- condition: state
entity_id: switch.esp_officelights_relay_2_daytime_lights
state: "off"
then:
- action: switch.turn_on
target:
entity_id: switch.esp_officelights_relay_2_daytime_lights
##############################################################
# Manual master/latch relay.
##############################################################
+139 -2
View File
@@ -1,12 +1,14 @@
#:########################################################################################:#
# Package: Pet Feeding and Jobs Timing
# File: pet_feeding_and_jobs.yaml
# Version: v1.1.0
# Date: 2026-07-21
# Version: v1.4.0
# Date: 2026-07-26
#
# Purpose:
# Provides legacy MQTT pet activity sensors and Jobs-derived timing sensors for
# the Lounge dog-feeding and depooping gauges.
# v1.2.0: Added input_datetime helpers and automations so the View Road Events
# home-feed-card shows correct X minutes ago after HA restart.
#
# Behaviour:
# - Dog feeding reports the newest valid morning or evening completion time.
@@ -15,6 +17,12 @@
# instead of exposing a numeric sentinel value.
#
# Version History:
# - v1.4.0 (2026-07-26): Announce four physical job completions on the Sony
# lounge TV and both Pushover devices.
# - v1.3.0 (2026-07-26): Restore retained dog-fed and jobs-done activity
# feed publishing when physical completion events are received.
# - v1.2.0 (2026-07-24): Added persistent input_datetime timestamps for
# home-feed-card so time-ago survives HA restart.
# - v1.1.0 (2026-07-21): Reject invalid Jobs timing attributes and remove the
# 999999-hour fallback from the dog-feeding gauge source.
# - v1.0.0 (2026-07-21): Added Jobs-derived dog timing sensors for P010.
@@ -90,3 +98,132 @@ template:
state: >-
{% set hours = state_attr('sensor.jobs_tracker_dog_depooping', 'hours_since_completed') %}
{{ hours | float(0) if is_number(hours) else none }}
#:######################################################################################:#
# PERSISTENT EVENT TIMESTAMPS (survive HA restart)
#:######################################################################################:#
# These input_datetime entities store the actual wall-clock time of the most recent
# event. The home-feed-card uses last_changed for "X minutes ago".
# Since input_datetime state is restored from the database after restart,
# last_changed reflects the actual event time, not the restart time.
# input_datetime entities created via HA API (not in YAML)
#:######################################################################################:#
# AUTOMATIONS: Update timestamps on event
#:######################################################################################:#
automation:
- id: timestamp_dog_fed
alias: "Timestamp - Dog Fed"
mode: single
triggers:
- trigger: state
entity_id: event.jobs_dog_fed_button_x14bt_action
conditions:
- condition: template
value_template: >-
{{ trigger.to_state.state not in ['unknown', 'unavailable'] }}
actions:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.dog_last_fed
data:
timestamp: "{{ as_timestamp(now()) }}"
- action: mqtt.publish
data:
topic: "viewroad-status/activityfeed/dogfed"
payload: "{{ now().strftime('%H:%M') }}"
qos: 0
retain: true
- id: timestamp_dog_depooped
alias: "Timestamp - Dog Depooped"
mode: single
triggers:
- trigger: state
entity_id: event.jobs_dog_depooped_button_x15bt_action
conditions:
- condition: template
value_template: >-
{{ trigger.to_state.state not in ['unknown', 'unavailable'] }}
actions:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.dog_last_depooped
data:
timestamp: "{{ as_timestamp(now()) }}"
- id: timestamp_jobs_done
alias: "Timestamp - Any Job Completed"
description: >-
Updates the jobs-done timestamp whenever any tracked job completion
event fires. This keeps the "Jobs Done" entry in the home-feed-card
showing the time of the most recent job completion.
mode: single
triggers:
- trigger: state
entity_id:
- event.jobs_dog_fed_button_x14bt_action
- event.jobs_dog_depooped_button_x15bt_action
- event.kitchen_jobs_kitchen_completed_buttons_button_1
- event.kitchen_jobs_kitchen_completed_buttons_button_2
conditions:
- condition: template
value_template: >-
{{ trigger.to_state.state not in ['unknown', 'unavailable'] }}
actions:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.last_jobs_done
data:
timestamp: "{{ as_timestamp(now()) }}"
- action: mqtt.publish
data:
topic: "viewroad-status/activityfeed/jobsdone"
payload: "{{ now().strftime('%-I:%M %p') }}"
qos: 0
retain: true
- id: jobs_completion_announcements
alias: "Jobs - Completion Announcements"
description: >-
Announces physical dog feeding, dog depooping, dishwasher and rubbish
completion events on the lounge Sony TV and both Pushover devices.
mode: queued
max: 10
triggers:
- trigger: state
entity_id:
- event.jobs_dog_fed_button_x14bt_action
- event.jobs_dog_depooped_button_x15bt_action
- event.kitchen_jobs_kitchen_completed_buttons_button_1
- event.kitchen_jobs_kitchen_completed_buttons_button_2
conditions:
- condition: template
value_template: >-
{% set valid_state = trigger.to_state is not none
and trigger.to_state.state not in ['unknown', 'unavailable'] %}
{% set event_ts = as_timestamp(trigger.to_state.state, 0)
if valid_state else 0 %}
{% set event_age = as_timestamp(now()) - event_ts %}
{{ valid_state and event_ts > 0 and event_age >= 0 and event_age <= 30 }}
actions:
- variables:
completion_message: >-
{% if trigger.entity_id == 'event.jobs_dog_fed_button_x14bt_action' %}
Zorro has been fed
{% elif trigger.entity_id == 'event.jobs_dog_depooped_button_x15bt_action' %}
Zorro has been depooped
{% elif trigger.entity_id == 'event.kitchen_jobs_kitchen_completed_buttons_button_1' %}
Dishwasher has been emptied
{% elif trigger.entity_id == 'event.kitchen_jobs_kitchen_completed_buttons_button_2' %}
Rubbish has been removed
{% else %}
Job has been completed
{% endif %}
- action: script.view_road_announcement
data:
channels: "sony_tv_lounge, pushover_zorruno, pushover_kim"
title: "Jobs Announcement"
short_announcement: "{{ completion_message }}"
long_announcement: "{{ completion_message }}"
+97
View File
@@ -0,0 +1,97 @@
#:########################################################################################:#
# PACKAGE: Zorro Evening Feeding Reminder (P017-S013)
# FILE: packages/p017_s013_zorro_feeding_reminder.yaml
# VERSION: v1.0.1 2026-07-26
#:########################################################################################:#
# PURPOSE:
# Remind to feed Zorro (evening feeding) if not completed.
# LED matrix shows "Feed Zorro" every 30 min from 5pm to 10pm.
# Voice says "Zorro has not been fed this afternoon" every 30 min from 5pm to 8pm.
# Each announcement has a random delay of 0-10 min for natural variation.
# Clears LED matrix immediately when evening feeding is completed.
#:########################################################################################:#
# DEPENDENCIES:
# - packages/view_road_announcement_router.yaml for LED/voice announcements
# - packages/Job_Chore_Tracking/jobs_tracker_jobs.yaml for evening feeding sensor
# - ESPHome LED matrix for cancel_id MQTT topic
#:########################################################################################:#
input_boolean:
zorro_feeding_reminder_enabled:
name: Zorro Feeding Reminder
icon: mdi:dog
initial: true
automation:
##############################################################################
# EVENING FEEDING REMINDER
##############################################################################
- id: zorro_evening_feeding_reminder
alias: "Zorro - Evening Feeding Reminder"
mode: single
trigger:
- trigger: time_pattern
minutes: "/30"
- trigger: homeassistant
event: start
condition:
- condition: state
entity_id: input_boolean.zorro_feeding_reminder_enabled
state: "on"
- condition: template
value_template: >
{{ now().hour >= 17 and now().hour < 22 }}
- condition: template
value_template: >
{{ states('sensor.jobs_tracker_dog_feeding_evening') != 'Complete' }}
action:
- variables:
voice_hours: "{{ now().hour < 20 }}"
quiet_time: "{{ is_state('input_boolean.quiet_time', 'on') }}"
- delay:
seconds: "{{ range(0, 601) | random | int }}"
- action: script.view_road_announcement
data:
channels: "led_matrix_1, sony_tv_lounge"
title: "Zorro"
short_announcement: "Feed Zorro"
indicator: "zorro,1,15,10,6,5,0,0"
- if:
- condition: template
value_template: "{{ voice_hours and not quiet_time }}"
then:
- action: script.view_road_announcement
data:
channels: "lounge_google_home_voice"
title: "Zorro"
short_announcement: "Zorro has not been fed this afternoon"
##############################################################################
# CLEAR LED MATRIX WHEN FED
##############################################################################
- id: zorro_clear_led_when_fed
alias: "Zorro - Clear LED Matrix When Fed"
mode: single
trigger:
- trigger: state
entity_id: sensor.jobs_tracker_dog_feeding_evening
to: "Complete"
action:
- action: mqtt.publish
data:
topic: "viewroad-commands/ledmatrix1/cancel_id"
payload: "zorro"
qos: 0
retain: false
+188
View File
@@ -0,0 +1,188 @@
#:########################################################################################:#
# PACKAGE: Potplant Moisture Alerts
# FILE: packages/potplant_moisture_alerts.yaml
# VERSION: v1.1.0 2026-07-29
# - Preserve user-selected thresholds and master enable state across restarts.
#:########################################################################################:#
# PURPOSE:
# Alert when potplant soil moisture drops below a configurable threshold.
# Displays on the Lounge LED matrix and announces via Lounge Google Home voice.
#:########################################################################################:#
# SETTINGS:
# - input_number.*_moisture_threshold: per-plant dry threshold (default 30%)
# - input_boolean.potplant_alert_enabled: master enable toggle
#:########################################################################################:#
# DEPENDENCIES:
# - packages/view_road_announcement_router.yaml for script.view_road_announcement
# - sensor.table_plant_soil_moisture
# - sensor.tv_plant_soil_moisture
#:########################################################################################:#
input_number:
table_plant_moisture_threshold:
name: Table Plant Moisture Threshold
min: 0
max: 100
step: 5
unit_of_measurement: "%"
icon: mdi:water-percent
tv_plant_moisture_threshold:
name: TV Plant Moisture Threshold
min: 0
max: 100
step: 5
unit_of_measurement: "%"
icon: mdi:water-percent
input_boolean:
potplant_alert_enabled:
name: Potplant Moisture Alerts
icon: mdi:sprout
template:
- binary_sensor:
- name: "Table Plant Needs Water"
unique_id: table_plant_needs_water
icon: mdi:flower
state: >-
{{ (states('sensor.table_plant_soil_moisture') | float(100)) <
(states('input_number.table_plant_moisture_threshold') | float(30)) }}
- name: "TV Plant Needs Water"
unique_id: tv_plant_needs_water
icon: mdi:flower
state: >-
{{ (states('sensor.tv_plant_soil_moisture') | float(100)) <
(states('input_number.tv_plant_moisture_threshold') | float(30)) }}
automation:
##############################################################################
# TABLE PLANT
##############################################################################
- id: potplant_table_plant_alert
alias: "Potplant - Table Plant Needs Water"
mode: single
trigger:
- trigger: state
entity_id: binary_sensor.table_plant_needs_water
to: "on"
- trigger: time_pattern
hours: "/2"
- trigger: homeassistant
event: start
condition:
- condition: state
entity_id: input_boolean.potplant_alert_enabled
state: "on"
- condition: state
entity_id: input_boolean.quiet_time
state: "off"
- condition: state
entity_id: binary_sensor.table_plant_needs_water
state: "on"
action:
- action: script.view_road_announcement
data:
channels: "led_matrix_1"
title: "Plants"
short_announcement: "Water Table Plant"
indicator: "table,1,15,10,6,5,0,0"
- action: script.view_road_announcement
data:
channels: "lounge_google_home_voice"
title: "Plants"
short_announcement: "Table plant needs water"
- action: script.view_road_announcement
data:
channels: "sony_tv_lounge"
title: "Plants Announcement"
short_announcement: "Table plant needs water"
- id: potplant_table_clear_led
alias: "Potplant - Clear Table Plant LED"
mode: single
trigger:
- trigger: state
entity_id: binary_sensor.table_plant_needs_water
to: "off"
action:
- action: mqtt.publish
data:
topic: "viewroad-commands/ledmatrix1/cancel_id"
payload: "table"
qos: 0
retain: false
##############################################################################
# TV PLANT
##############################################################################
- id: potplant_tv_plant_alert
alias: "Potplant - TV Plant Needs Water"
mode: single
trigger:
- trigger: state
entity_id: binary_sensor.tv_plant_needs_water
to: "on"
- trigger: time_pattern
hours: "/2"
- trigger: homeassistant
event: start
condition:
- condition: state
entity_id: input_boolean.potplant_alert_enabled
state: "on"
- condition: state
entity_id: input_boolean.quiet_time
state: "off"
- condition: state
entity_id: binary_sensor.tv_plant_needs_water
state: "on"
action:
- action: script.view_road_announcement
data:
channels: "led_matrix_1"
title: "Plants"
short_announcement: "Water TV Plant"
indicator: "tvplant,1,15,10,6,5,0,0"
- action: script.view_road_announcement
data:
channels: "lounge_google_home_voice"
title: "Plants"
short_announcement: "TV plant needs water"
- action: script.view_road_announcement
data:
channels: "sony_tv_lounge"
title: "Plants Announcement"
short_announcement: "TV plant needs water"
- id: potplant_tv_clear_led
alias: "Potplant - Clear TV Plant LED"
mode: single
trigger:
- trigger: state
entity_id: binary_sensor.tv_plant_needs_water
to: "off"
action:
- action: mqtt.publish
data:
topic: "viewroad-commands/ledmatrix1/cancel_id"
payload: "tvplant"
qos: 0
retain: false
+10 -2
View File
@@ -1,8 +1,8 @@
#:########################################################################################:#
# Package: Recorder Configuration
# File: recorder.yaml
# Version: v1.1.0
# Date: 2026-07-23
# Version: v1.2.0
# Date: 2026-07-24
#
# Purpose:
# Enables Home Assistant Recorder with targeted exclusions for high-frequency
@@ -12,6 +12,8 @@
# - ESPHome uptime sensors.
# - Home Assistant summary v2 sensors.
# - Jobs Tracker summary sensor.
# - Fisher & Paykel oven temperature sensors reporting Fahrenheit as Celsius.
# - Creality K1C static hardware-limit max-temp sensors.
#
# Notes:
# - Excluded entities remain available for current-state use.
@@ -19,6 +21,7 @@
# defaults unless configured elsewhere.
#
# Version History:
# - v1.2.0 (2026-07-24): Added GE Home oven F→C bogus sensor exclusions for F043 and 3D printer static max-temp exclusions for F044.
# - v1.1.0 (2026-07-23): Added targeted exclusions during P013-F010 cleanup.
# - v1.0.0 (2022-10-11): Initial Recorder package.
#:########################################################################################:#
@@ -30,3 +33,8 @@ recorder:
- sensor.ha_summary_v2_*
entities:
- sensor.jobs_tracker_summary
- sensor.ulv316566_user_temp_offset
- sensor.ulv316566_raw_temperature
- sensor.ulv316566_probe_display_temp
- sensor.under_house_creality_k1c_eff9_max_nozzle_temperature
- sensor.under_house_creality_k1c_eff9_max_bed_temperature
+369
View File
@@ -0,0 +1,369 @@
#:########################################################################################:#
# Package: Security Notifications
# File: security_notifications.yaml
# Version: v1.0.0
# Date: 2026-07-25
#
# Purpose:
# Sends security alerts through the View Road announcement router when doors
# and access points open or close. Includes a startup gate to suppress false
# alerts after HA or Zigbee coordinator restarts, and a garage-door reminder
# loop for prolonged-open warnings.
#
# Channels used per sensor:
# Kitchen Top Cupboard → pushover_zorruno
# Key Cupboard → pushover_zorruno
# Loft Hatch → pushover_zorruno, sony_tv_lounge
# Underhouse Stealth Door → pushover_zorruno
# Garage Roller Door → pushover_zorruno, sony_tv_lounge
#
# Startup gate:
# Every automation checks:
# 1. HA core uptime > 120 s (blocks false alerts after HA restart)
# 2. Previous state != unavailable/unknown (blocks false alerts after
# Zigbee coordinator restart devices briefly go unavailable then
# re-report their last state)
#
# Garage reminder:
# When opened: immediate alert + 1-hour timer started
# Timer fires: door still open → reminder + restart (max 24 times)
# Door closed: timer cancelled, reminder count reset
#
# Dependencies:
# - packages/view_road_announcement_router.yaml (script.view_road_announcement)
#
# Version History:
# - v1.0.0 (2026-07-25): Created from Node-RED Security Alerts tab.
#:########################################################################################:#
###########################################################################################
# HELPERS
###########################################################################################
input_number:
garage_door_reminder_count:
name: Garage Door Reminder Count
icon: mdi:counter
min: 0
max: 24
step: 1
mode: box
timer:
garage_door_open_reminder:
name: Garage Door Open Reminder
duration: "01:00:00"
icon: mdi:timer-outline
###########################################################################################
# STARTUP GATE common condition template
###########################################################################################
#
# Every automation below includes these two conditions:
#
# 1. HA has been running > 120 s
# "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
#
# 2. Entity was not unavailable/unknown before this transition
# "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
#
# These are inlined so the package is self-contained and each automation
# remains easy to read, disable, or override individually.
#
###########################################################################################
###########################################################################################
# KITCHEN TOP CUPBOARD
###########################################################################################
automation:
- id: security_kitchen_cupboard_opened
alias: "Security Kitchen Top Cupboard Opened"
description: "Notify via Pushover when the kitchen top cupboard is opened."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.kitchen_top_cupboard_x04rs_contact
from: "off"
to: "on"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Kitchen cupboard opened"
long_announcement: "The kitchen top cupboard has been opened."
- id: security_kitchen_cupboard_closed
alias: "Security Kitchen Top Cupboard Closed"
description: "Notify via Pushover when the kitchen top cupboard is closed."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.kitchen_top_cupboard_x04rs_contact
from: "on"
to: "off"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Kitchen cupboard closed"
long_announcement: "The kitchen top cupboard is now closed."
###########################################################################################
# KEY CUPBOARD
###########################################################################################
- id: security_key_cupboard_opened
alias: "Security Key Cupboard Opened"
description: "Notify via Pushover when the key cupboard is opened."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.key_cupboard_zrs06
from: "off"
to: "on"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Key cupboard opened"
long_announcement: "The key cupboard has been opened."
- id: security_key_cupboard_closed
alias: "Security Key Cupboard Closed"
description: "Notify via Pushover when the key cupboard is closed."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.key_cupboard_zrs06
from: "on"
to: "off"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Key cupboard closed"
long_announcement: "The key cupboard is now closed."
###########################################################################################
# LOFT HATCH
###########################################################################################
- id: security_loft_hatch_opened
alias: "Security Loft Hatch Opened"
description: "Notify via Pushover and Sony TV when the loft hatch is opened."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.upstairs_loft_hatch_x02rs_contact
from: "off"
to: "on"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno, sony_tv_lounge"
title: "Security Alert"
short_announcement: "Loft hatch opened"
long_announcement: "The upstairs loft hatch has been opened."
- id: security_loft_hatch_closed
alias: "Security Loft Hatch Closed"
description: "Notify via Pushover and Sony TV when the loft hatch is closed."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.upstairs_loft_hatch_x02rs_contact
from: "on"
to: "off"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno, sony_tv_lounge"
title: "Security Alert"
short_announcement: "Loft hatch closed"
long_announcement: "The upstairs loft hatch is now closed."
###########################################################################################
# UNDERHOUSE STEALTH DOOR
###########################################################################################
- id: security_underhouse_stealth_door_opened
alias: "Security Underhouse Stealth Door Opened"
description: "Notify via Pushover when the underhouse stealth door is opened."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.underhouse_stealth_door_x07rs_contact
from: "off"
to: "on"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Stealth door opened"
long_announcement: "The underhouse stealth door has been opened."
- id: security_underhouse_stealth_door_closed
alias: "Security Underhouse Stealth Door Closed"
description: "Notify via Pushover when the underhouse stealth door is closed."
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.underhouse_stealth_door_x07rs_contact
from: "on"
to: "off"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno"
title: "Security Alert"
short_announcement: "Stealth door closed"
long_announcement: "The underhouse stealth door is now closed."
###########################################################################################
# GARAGE ROLLER DOOR
###########################################################################################
- id: security_garage_door_opened
alias: "Security Garage Roller Door Opened"
description: >
Notify via Pushover and Sony TV when the garage roller door opens.
Also starts the 1-hour reminder timer so a follow-up alert is sent
if the door stays open.
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.garage_roller_door_x18rs_contact
from: "off"
to: "on"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: script.view_road_announcement
data:
channels: "pushover_zorruno, sony_tv_lounge"
title: "Security Alert"
short_announcement: "Garage door opened"
long_announcement: "The garage roller door has been opened."
- action: input_number.set_value
data:
entity_id: input_number.garage_door_reminder_count
value: 0
- action: timer.start
data:
entity_id: timer.garage_door_open_reminder
duration: "01:00:00"
- id: security_garage_door_closed
alias: "Security Garage Roller Door Closed"
description: >
Notify via Pushover and Sony TV when the garage roller door closes.
Cancels the reminder timer and resets the reminder counter.
mode: single
triggers:
- trigger: state
entity_id: binary_sensor.garage_roller_door_x18rs_contact
from: "on"
to: "off"
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: template
value_template: "{{ trigger.from_state is not none and trigger.from_state.state not in ['unavailable', 'unknown'] }}"
actions:
- action: timer.cancel
data:
entity_id: timer.garage_door_open_reminder
- action: input_number.set_value
data:
entity_id: input_number.garage_door_reminder_count
value: 0
- action: script.view_road_announcement
data:
channels: "pushover_zorruno, sony_tv_lounge"
title: "Security Alert"
short_announcement: "Garage door closed"
long_announcement: "The garage roller door is now closed."
- id: security_garage_door_reminder
alias: "Security Garage Roller Door Reminder"
description: >
Fires when the reminder timer finishes. If the door is still open and
the reminder has fired fewer than 24 times, send another reminder and
restart the timer.
mode: single
triggers:
- trigger: event
event_type: timer.finished
event_data:
entity_id: timer.garage_door_open_reminder
conditions:
- condition: template
value_template: "{{ states('sensor.home_assistant_core_uptime') | int(0) > 120 }}"
- condition: state
entity_id: binary_sensor.garage_roller_door_x18rs_contact
state: "on"
- condition: template
value_template: "{{ states('input_number.garage_door_reminder_count') | int(0) < 24 }}"
actions:
- action: input_number.increment
data:
entity_id: input_number.garage_door_reminder_count
- action: script.view_road_announcement
data:
channels: "pushover_zorruno, sony_tv_lounge"
title: "Security Alert"
short_announcement: "Garage door still open"
long_announcement: "A reminder, the garage roller door is still open."
- action: timer.start
data:
entity_id: timer.garage_door_open_reminder
duration: "01:00:00"
+12 -2
View File
@@ -1,7 +1,7 @@
#:########################################################################################:#
# Package: Away-Light Security Simulation
# File: simulation_lights.yaml
# Version: v1.0.0
# Version: v1.1.0
# Date: 2026-07-24
#
# Purpose:
@@ -10,6 +10,9 @@
# automation selects a configured entity and operates it for a random period.
#
# Version History:
# - v1.1.0 (2026-07-24): Replaced stale group.downstairs_flat_lights member with direct
# entity IDs so downstairs flat lights participate in away simulation.
#
# - v1.0.0 (2026-07-24): Consolidated the simulation groups, away automation, and timed helper
# script into one feature package.
# - Preserved the existing automation ID, group keys, and script key.
@@ -33,7 +36,14 @@ group:
simulation_lights_all:
name: "Simulation Lights (All)"
entities:
- group.downstairs_flat_lights
- switch.esp_downstloungemain_relay_1_main_lights
- switch.esp_downstloungemain_relay_2_back_wall_lights
- switch.esp_downstmasterbedrmlights_relay_1_main_lights
- switch.esp_downstbedrm2lights_relay_1_main_lights
- switch.esp_downstkitchlights_relay_2_kitchen_light
- switch.esp_downstkitchlights_relay_1_dining_light
- switch.esp_downstbathswitch_relay_1_main_lights
- switch.esp_downstbathswitch_relay_2_cabinet_light
- switch.esp_centralstairs_top_relay_2_stair_footer_lights
- switch.esp_centralstairs_bottom_relay_1_main_stair_lights_lower
- switch.esp_entrancebathrmlights_relay_1_main_lights
+15 -3
View File
@@ -1,11 +1,13 @@
#:########################################################################################:#
# Package: Vehicle Announcements
# File: vehicle_announcements.yaml
# Version: v1.0.0
# Date: 2026-07-23
# Version: v1.1.0
# Date: 2026-07-26
#
# Purpose:
# Sends vehicle arrival announcements through the View Road announcement router.
# Requires the vehicle to have been continuously away for 20 minutes before
# announcing, suppressing short Bluetooth range dropouts while parked at home.
#:########################################################################################:#
automation:
@@ -13,13 +15,23 @@ automation:
alias: "BYD Atto 3 - Arrival Announcement"
description: >
Sends a Pushover notification to the Zorruno phone when the BYD Atto 3
Bermuda tracker arrives home.
Bermuda tracker arrives home after at least 20 minutes away.
mode: single
variables:
minimum_away_minutes: 20
triggers:
- trigger: state
entity_id: device_tracker.byd_atto3_ibeacon_bur4c2a_bermuda_tracker
from: "not_home"
to: "home"
conditions:
- condition: template
value_template: >-
{% set away_started = as_timestamp(trigger.from_state.last_changed, 0) %}
{% set arrived = as_timestamp(trigger.to_state.last_changed, 0) %}
{{ away_started > 0
and arrived > away_started
and (arrived - away_started) >= (minimum_away_minutes * 60) }}
actions:
- action: script.view_road_announcement
data:
+39 -7
View File
@@ -1,6 +1,16 @@
################################################################################
# PACKAGE: View Road Announcement Router
################################################################################
# 1.10: Date: 2026-07-24
# - Added 2s delay before TTS speak to separate the cast chime from
# the voice announcement.
#
# 1.9: Date: 2026-07-24
# - Added continue_on_error to all 7 channel blocks so a single channel
# failure does not block remaining channels.
# - Google Home voice channel now saves and restores the previous volume
# level after TTS completes.
#
# 1.8: Date: 2026-07-11
# - Added MQTT View Rd Feed announcement channel.
# - Added mqtt_feed script field.
@@ -483,7 +493,8 @@ script:
# CHANNEL: PUSHOVER ZORRUNO
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',pushover_zorruno,' in ann_channels_normalised }}"
- condition: state
@@ -499,7 +510,8 @@ script:
# CHANNEL: PUSHOVER KIM
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',pushover_kim,' in ann_channels_normalised }}"
- condition: state
@@ -515,7 +527,8 @@ script:
# CHANNEL: SONY TV LOUNGE
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',sony_tv_lounge,' in ann_channels_normalised }}"
- condition: state
@@ -539,7 +552,8 @@ script:
#
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: >-
{{
@@ -561,6 +575,9 @@ script:
- condition: template
value_template: "{{ ann_voice_message | string | trim | length > 0 }}"
then:
- variables:
previous_volume: >-
{{ state_attr(lounge_google_home_voice_media_player, 'volume_level') | float(-1) }}
- choose:
- conditions:
- condition: template
@@ -594,6 +611,9 @@ script:
- delay:
seconds: 1
- delay:
seconds: 2
- action: tts.speak
target:
entity_id: "{{ lounge_google_home_voice_tts_entity }}"
@@ -606,6 +626,15 @@ script:
preferred_format: mp3
preferred_sample_rate: 44100
- if:
- condition: template
value_template: "{{ previous_volume >= 0 }}"
then:
- action: media_player.volume_set
data:
entity_id: "{{ lounge_google_home_voice_media_player }}"
volume_level: "{{ previous_volume }}"
##########################################################################
# CHANNEL: LOUNGE TOUCHSCREEN VOICE
##########################################################################
@@ -640,7 +669,8 @@ script:
#
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',mqtt_view_rd_feed,' in ann_channels_normalised }}"
- condition: state
@@ -679,7 +709,8 @@ script:
#
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',led_matrix_1,' in ann_channels_normalised }}"
- condition: state
@@ -716,7 +747,8 @@ script:
#
##########################################################################
- if:
- continue_on_error: true
if:
- condition: template
value_template: "{{ ',led_matrix_2,' in ann_channels_normalised }}"
- condition: state