various tidyups
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
##############################################################
|
||||
|
||||
@@ -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 }}"
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user