Compare commits
9 Commits
eeb2413f8a
...
main
Author | SHA1 | Date | |
---|---|---|---|
fbecc55c8f | |||
a7274f6053 | |||
0a2381e91b | |||
93441c06e8 | |||
d57df68cb5 | |||
7495cb1f25 | |||
28a69cd3d2 | |||
99220e5db5 | |||
b68e9ec3d2 |
75
battery-monitor.yaml
Normal file
75
battery-monitor.yaml
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Battery Monitor
|
||||||
|
description: Monitors battery levels of selected entities and exposes a low battery summary
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
battery_sensors:
|
||||||
|
name: Battery Sensors
|
||||||
|
description: List of battery level sensors to monitor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
multiple: true
|
||||||
|
threshold:
|
||||||
|
name: Low Battery Threshold
|
||||||
|
description: Battery percentage threshold to consider "low"
|
||||||
|
default: 20
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 1
|
||||||
|
max: 100
|
||||||
|
step: 1
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
notify_service:
|
||||||
|
name: Notification Service (Optional)
|
||||||
|
description: Service to call if any battery is low (e.g., notify.mobile_app_pixel)
|
||||||
|
default: ""
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
mode: single
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: time_pattern
|
||||||
|
minutes: "/30" # Check every 30 minutes
|
||||||
|
|
||||||
|
variables:
|
||||||
|
threshold: !input threshold
|
||||||
|
battery_sensors: !input battery_sensors
|
||||||
|
notify_service: !input notify_service
|
||||||
|
|
||||||
|
condition: []
|
||||||
|
|
||||||
|
action:
|
||||||
|
- variables:
|
||||||
|
low_batteries: >
|
||||||
|
{% set low = namespace(devices=[]) %}
|
||||||
|
{% for entity_id in battery_sensors %}
|
||||||
|
{% set level = states(entity_id) | int(100) %}
|
||||||
|
{% if level <= threshold %}
|
||||||
|
{% set name = state_attr(entity_id, 'friendly_name') or entity_id %}
|
||||||
|
{% set low.devices = low.devices + [name ~ ' (' ~ level ~ '%)'] %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{{ low.devices }}
|
||||||
|
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ low_batteries | length > 0 }}"
|
||||||
|
sequence:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.devices_with_low_battery
|
||||||
|
data:
|
||||||
|
value: "{{ low_batteries | join(', ') }}"
|
||||||
|
- condition: "{{ notify_service != '' }}"
|
||||||
|
- service: "{{ notify_service }}"
|
||||||
|
data:
|
||||||
|
message: >
|
||||||
|
Low battery detected: {{ low_batteries | join(', ') }}
|
||||||
|
default:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.devices_with_low_battery
|
||||||
|
data:
|
||||||
|
value: "All batteries healthy"
|
||||||
|
|
69
fan-cadence.yaml
Normal file
69
fan-cadence.yaml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Fan Cadence with Light Check
|
||||||
|
description: >
|
||||||
|
Turns a fan on every X minutes for Y seconds, but only turns it off if none of the specified lights are on.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
fan_entity:
|
||||||
|
name: Fan Entity
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: fan
|
||||||
|
|
||||||
|
interval_minutes:
|
||||||
|
name: Interval Between Fan Cycles (minutes)
|
||||||
|
default: 15
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 1
|
||||||
|
max: 1440
|
||||||
|
unit_of_measurement: minutes
|
||||||
|
|
||||||
|
duration_seconds:
|
||||||
|
name: Fan On Duration (seconds)
|
||||||
|
default: 60
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 5
|
||||||
|
max: 3600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
|
override_lights:
|
||||||
|
name: Override Lights
|
||||||
|
description: Fan will not turn off if any of these lights are on
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: light
|
||||||
|
multiple: true
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: homeassistant
|
||||||
|
event: start
|
||||||
|
|
||||||
|
variables:
|
||||||
|
fan: !input fan_entity
|
||||||
|
lights: !input override_lights
|
||||||
|
interval: !input interval_minutes
|
||||||
|
duration: !input duration_seconds
|
||||||
|
|
||||||
|
condition: []
|
||||||
|
|
||||||
|
action:
|
||||||
|
- repeat:
|
||||||
|
while: []
|
||||||
|
sequence:
|
||||||
|
- service: fan.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: "{{ fan }}"
|
||||||
|
- delay:
|
||||||
|
seconds: "{{ duration }}"
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ expand(lights) | map(attribute='state') | select('eq', 'on') | list | length == 0 }}
|
||||||
|
- service: fan.turn_off
|
||||||
|
target:
|
||||||
|
entity_id: "{{ fan }}"
|
||||||
|
- delay:
|
||||||
|
minutes: "{{ interval }}"
|
||||||
|
|
||||||
|
mode: restart
|
77
fan-management.yaml
Normal file
77
fan-management.yaml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Bathroom Fan Manager
|
||||||
|
description: >
|
||||||
|
Turns fan on with bathroom lights (after optional delay), keeps it on while any light is on, and turns it off after all lights are off and a timeout.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
fan:
|
||||||
|
name: Fan Entity
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: fan
|
||||||
|
|
||||||
|
lights:
|
||||||
|
name: Bathroom Light Entities
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: light
|
||||||
|
multiple: true
|
||||||
|
|
||||||
|
delay_before_fan_on:
|
||||||
|
name: Delay Before Turning Fan On
|
||||||
|
description: Time to wait after any light turns on before turning on the fan.
|
||||||
|
default: 0
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 0
|
||||||
|
max: 300
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
|
time_fan_stays_on_after_lights_off:
|
||||||
|
name: Time Fan Stays On After All Lights Are Off
|
||||||
|
description: Time to keep the fan running after all lights are off.
|
||||||
|
default: 300
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 0
|
||||||
|
max: 3600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
|
mode: restart
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: !input lights
|
||||||
|
to:
|
||||||
|
- "on"
|
||||||
|
- "off"
|
||||||
|
|
||||||
|
variables:
|
||||||
|
fan_entity: !input fan
|
||||||
|
lights: !input lights
|
||||||
|
|
||||||
|
action:
|
||||||
|
- choose:
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ expand(lights) | selectattr('state', 'eq', 'on') | list | count > 0 }}
|
||||||
|
sequence:
|
||||||
|
- delay:
|
||||||
|
seconds: !input delay_before_fan_on
|
||||||
|
- service: fan.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: "{{ fan_entity }}"
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ expand(lights) | selectattr('state', 'eq', 'on') | list | count == 0 }}
|
||||||
|
sequence:
|
||||||
|
- delay:
|
||||||
|
seconds: !input time_fan_stays_on_after_lights_off
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ expand(lights) | selectattr('state', 'eq', 'on') | list | count == 0 }}
|
||||||
|
- service: fan.turn_off
|
||||||
|
target:
|
||||||
|
entity_id: "{{ fan_entity }}"
|
165
hvac-failure-monitor.yaml
Normal file
165
hvac-failure-monitor.yaml
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
blueprint:
|
||||||
|
name: HVAC Failure Monitor
|
||||||
|
description: >
|
||||||
|
Detects HVAC underperformance and hard failure by monitoring temperature trends when heating or cooling is active.
|
||||||
|
Uses differential between setpoint and outdoor temp to dynamically adjust expectations.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
thermostat:
|
||||||
|
name: Thermostat
|
||||||
|
description: The climate entity to monitor (must support hvac_action and setpoint attributes).
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: climate
|
||||||
|
|
||||||
|
heating_temp_sensors:
|
||||||
|
name: Heating Temperature Sensors
|
||||||
|
description: One or more temperature sensors to monitor during heating (e.g. upstairs).
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
device_class: temperature
|
||||||
|
|
||||||
|
cooling_temp_sensors:
|
||||||
|
name: Cooling Temperature Sensors
|
||||||
|
description: One or more temperature sensors to monitor during cooling (e.g. downstairs).
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
device_class: temperature
|
||||||
|
|
||||||
|
outdoor_sensor:
|
||||||
|
name: Outdoor Temperature Source
|
||||||
|
description: Outdoor temperature source (e.g. from a weather entity).
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: weather
|
||||||
|
|
||||||
|
monitoring_interval:
|
||||||
|
name: Monitoring Interval (minutes)
|
||||||
|
description: How long after HVAC starts to evaluate temperature change.
|
||||||
|
default: 20
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 5
|
||||||
|
max: 120
|
||||||
|
unit_of_measurement: minutes
|
||||||
|
mode: slider
|
||||||
|
|
||||||
|
notify_target:
|
||||||
|
name: Notification Target
|
||||||
|
description: Who to notify on potential HVAC failure (e.g. mobile app).
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: notify
|
||||||
|
|
||||||
|
mode: single
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: !input thermostat
|
||||||
|
attribute: hvac_action
|
||||||
|
to:
|
||||||
|
- heating
|
||||||
|
- cooling
|
||||||
|
|
||||||
|
variables:
|
||||||
|
thermostat: !input thermostat
|
||||||
|
heating_temp_sensors: !input heating_temp_sensors
|
||||||
|
cooling_temp_sensors: !input cooling_temp_sensors
|
||||||
|
outdoor_sensor: !input outdoor_sensor
|
||||||
|
interval: !input monitoring_interval
|
||||||
|
hvac_action: "{{ state_attr(thermostat, 'hvac_action') }}"
|
||||||
|
direction: >
|
||||||
|
{{ 'rising' if hvac_action == 'heating' else 'falling' }}
|
||||||
|
selected_sensors: >
|
||||||
|
{{ heating_temp_sensors if hvac_action == 'heating' else cooling_temp_sensors }}
|
||||||
|
|
||||||
|
condition: []
|
||||||
|
|
||||||
|
action:
|
||||||
|
- variables:
|
||||||
|
indoor_start: >
|
||||||
|
{{ expand(selected_sensors) | map(attribute='state') | map('float') | select('defined') | list | average }}
|
||||||
|
|
||||||
|
- delay:
|
||||||
|
minutes: "{{ interval }}"
|
||||||
|
|
||||||
|
- variables:
|
||||||
|
indoor_now: >
|
||||||
|
{{ expand(selected_sensors) | map(attribute='state') | map('float') | select('defined') | list | average }}
|
||||||
|
outdoor_now: >
|
||||||
|
{{ state_attr(outdoor_sensor, 'temperature') | float }}
|
||||||
|
setpoint: >
|
||||||
|
{{ state_attr(thermostat, 'temperature') | float }}
|
||||||
|
delta: >
|
||||||
|
{{ abs(setpoint - outdoor_now) }}
|
||||||
|
required_rate: >
|
||||||
|
{% set d = delta %}
|
||||||
|
{{ [0.01, [0.10, 0.10 - (d * 0.004)] | min] | max }}
|
||||||
|
observed_rate: >
|
||||||
|
{{ ((indoor_now - indoor_start) / interval) | round(3) }}
|
||||||
|
trend_ok: >
|
||||||
|
{% if direction == 'rising' %}
|
||||||
|
{{ observed_rate >= required_rate }}
|
||||||
|
{% else %}
|
||||||
|
{{ observed_rate <= -required_rate }}
|
||||||
|
{% endif %}
|
||||||
|
hard_failure: >
|
||||||
|
{% if direction == 'rising' %}
|
||||||
|
{{ observed_rate < 0 }}
|
||||||
|
{% else %}
|
||||||
|
{{ observed_rate > 0 }}
|
||||||
|
{% endif %}
|
||||||
|
hvac_state_icon: >
|
||||||
|
{% if hard_failure %}
|
||||||
|
mdi:close-circle-outline
|
||||||
|
{% elif not trend_ok %}
|
||||||
|
mdi:alert-circle-outline
|
||||||
|
{% else %}
|
||||||
|
mdi:check-circle-outline
|
||||||
|
{% endif %}
|
||||||
|
hvac_state_text: >
|
||||||
|
{% if hard_failure %}
|
||||||
|
HVAC Failure
|
||||||
|
{% elif not trend_ok %}
|
||||||
|
Possible HVAC underperformance
|
||||||
|
{% else %}
|
||||||
|
Normal operation
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ not trend_ok }}"
|
||||||
|
sequence:
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ notify_target | length > 0 }}"
|
||||||
|
sequence:
|
||||||
|
- service: notify.{{ notify_target }}
|
||||||
|
data:
|
||||||
|
message: >
|
||||||
|
HVAC '{{ hvac_action }}' action for {{ interval }} minutes showed ineffective operation.
|
||||||
|
Indoor temp started at: {{ indoor_start }}°, now: {{ indoor_now }}°
|
||||||
|
Outdoor temp: {{ outdoor_now }}°
|
||||||
|
Setpoint: {{ setpoint }}°
|
||||||
|
Required rate: {{ required_rate }}°/min
|
||||||
|
Observed rate: {{ observed_rate }}°/min
|
||||||
|
Status: {{ hvac_state_text }} {{ hvac_state_icon }}
|
||||||
|
default:
|
||||||
|
- service: persistent_notification.create
|
||||||
|
data:
|
||||||
|
title: HVAC Alert
|
||||||
|
message: >
|
||||||
|
HVAC '{{ hvac_action }}' action for {{ interval }} minutes showed ineffective operation.
|
||||||
|
Indoor temp started at: {{ indoor_start }}°, now: {{ indoor_now }}°
|
||||||
|
Outdoor temp: {{ outdoor_now }}°
|
||||||
|
Setpoint: {{ setpoint }}°
|
||||||
|
Required rate: {{ required_rate }}°/min
|
||||||
|
Observed rate: {{ observed_rate }}°/min
|
||||||
|
Status: {{ hvac_state_text }} {{ hvac_state_icon }}
|
||||||
|
|
119
indication.yaml
Normal file
119
indication.yaml
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
blueprint:
|
||||||
|
name: HS-WD200+ LED State Indicator
|
||||||
|
description: Set a specific LED on a HomeSeer WD200+ dimmer based on entity state.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
target_device:
|
||||||
|
name: HS-WD200+ Device
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
integration: zwave_js
|
||||||
|
|
||||||
|
monitored_entity:
|
||||||
|
name: Entity to Monitor
|
||||||
|
selector:
|
||||||
|
entity: {}
|
||||||
|
|
||||||
|
expected_state:
|
||||||
|
name: State to Match
|
||||||
|
description: Select a common state or enter a custom one below.
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
options:
|
||||||
|
- "on"
|
||||||
|
- "off"
|
||||||
|
- "home"
|
||||||
|
- "away"
|
||||||
|
- "cool"
|
||||||
|
- "heat"
|
||||||
|
- "idle"
|
||||||
|
- "open"
|
||||||
|
- "closed"
|
||||||
|
- "locked"
|
||||||
|
- "unlocked"
|
||||||
|
|
||||||
|
custom_expected_state:
|
||||||
|
name: Custom State (optional)
|
||||||
|
description: Use this if the expected state is not in the list above.
|
||||||
|
default: ""
|
||||||
|
selector:
|
||||||
|
text: {}
|
||||||
|
|
||||||
|
led_number:
|
||||||
|
name: LED Number
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
options:
|
||||||
|
- label: "LED 1 (Top)"
|
||||||
|
value: "1"
|
||||||
|
- label: "LED 2"
|
||||||
|
value: "2"
|
||||||
|
- label: "LED 3"
|
||||||
|
value: "3"
|
||||||
|
- label: "LED 4"
|
||||||
|
value: "4"
|
||||||
|
- label: "LED 5"
|
||||||
|
value: "5"
|
||||||
|
- label: "LED 6"
|
||||||
|
value: "6"
|
||||||
|
- label: "LED 7 (Bottom)"
|
||||||
|
value: "7"
|
||||||
|
|
||||||
|
led_color:
|
||||||
|
name: LED Color
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
options:
|
||||||
|
- label: "Off"
|
||||||
|
value: "0"
|
||||||
|
- label: "Red"
|
||||||
|
value: "1"
|
||||||
|
- label: "Green"
|
||||||
|
value: "2"
|
||||||
|
- label: "Blue"
|
||||||
|
value: "3"
|
||||||
|
- label: "Magenta"
|
||||||
|
value: "4"
|
||||||
|
- label: "Yellow"
|
||||||
|
value: "5"
|
||||||
|
- label: "Cyan"
|
||||||
|
value: "6"
|
||||||
|
- label: "White"
|
||||||
|
value: "7"
|
||||||
|
|
||||||
|
blink_mode:
|
||||||
|
name: Blink Mode
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
options:
|
||||||
|
- label: "Solid"
|
||||||
|
value: "0"
|
||||||
|
- label: "Fast Blink"
|
||||||
|
value: "1"
|
||||||
|
- label: "Slow Blink"
|
||||||
|
value: "2"
|
||||||
|
|
||||||
|
mode: single
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: !input monitored_entity
|
||||||
|
|
||||||
|
action:
|
||||||
|
- variables:
|
||||||
|
actual_state: "{{ states[ (input.monitored_entity) ].state }}"
|
||||||
|
target_state: >
|
||||||
|
{{ iif(input.custom_expected_state | length > 0, input.custom_expected_state, input.expected_state) }}
|
||||||
|
matched: "{{ actual_state == target_state }}"
|
||||||
|
- variables:
|
||||||
|
color: "{{ iif(matched, (input.led_color | int(0)), 0) }}"
|
||||||
|
blink: "{{ iif(matched, (input.blink_mode | int(0)), 0) }}"
|
||||||
|
led_value: "{{ (color * 16) + blink }}"
|
||||||
|
led_param: "{{ 20 + (input.led_number | int(1)) }}"
|
||||||
|
- service: zwave_js.set_config_parameter
|
||||||
|
target:
|
||||||
|
device_id: !input target_device
|
||||||
|
data:
|
||||||
|
parameter: "{{ led_param }}"
|
||||||
|
value: "{{ led_value }}"
|
||||||
|
|
90
multi-tap-automation-homeseer-and-zooz.yaml
Normal file
90
multi-tap-automation-homeseer-and-zooz.yaml
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Multi-Tap Scene Controller (Zooz & HomeSeer)
|
||||||
|
description: >
|
||||||
|
Control lights or switches based on single, double, or triple tap
|
||||||
|
up/down events from a Z-Wave switch (e.g., Zooz or HomeSeer).
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
master_device:
|
||||||
|
name: Master Device(s)
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
multiple: true
|
||||||
|
|
||||||
|
slave_entities:
|
||||||
|
name: Slave Lights or Switches
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain:
|
||||||
|
- light
|
||||||
|
- switch
|
||||||
|
|
||||||
|
tap_types:
|
||||||
|
name: Tap Type(s)
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- KeyPressed
|
||||||
|
- KeyPressed2x
|
||||||
|
- KeyPressed3x
|
||||||
|
|
||||||
|
tap_up:
|
||||||
|
name: Trigger on Tap Up?
|
||||||
|
default: true
|
||||||
|
selector:
|
||||||
|
boolean: {}
|
||||||
|
|
||||||
|
tap_down:
|
||||||
|
name: Trigger on Tap Down?
|
||||||
|
default: true
|
||||||
|
selector:
|
||||||
|
boolean: {}
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: zwave_js_value_notification
|
||||||
|
|
||||||
|
variables:
|
||||||
|
tap_types: !input tap_types
|
||||||
|
tap_up: !input tap_up
|
||||||
|
tap_down: !input tap_down
|
||||||
|
master_device_ids: !input master_device
|
||||||
|
|
||||||
|
condition:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{% set evt = trigger.event.data %}
|
||||||
|
{{ evt.command_class_name == 'Central Scene' and
|
||||||
|
evt.value in tap_types and
|
||||||
|
(
|
||||||
|
(tap_up and evt.property_key == 0) or
|
||||||
|
(tap_down and evt.property_key == 1)
|
||||||
|
) and
|
||||||
|
evt.device_id in master_device_ids }}
|
||||||
|
|
||||||
|
action:
|
||||||
|
- choose:
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ trigger.event.data.property_key == 0 }}"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_on
|
||||||
|
target: !input slave_entities
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ trigger.event.data.property_key == 1 }}"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_off
|
||||||
|
target: !input slave_entities
|
||||||
|
|
||||||
|
# Optional: Log the event data for troubleshooting
|
||||||
|
- service: system_log.write
|
||||||
|
data:
|
||||||
|
message: >
|
||||||
|
Multi-Tap Triggered: {{ trigger.event.data }}
|
||||||
|
level: info
|
||||||
|
|
||||||
|
mode: single
|
||||||
|
|
83
multi-tap-automation.yaml
Normal file
83
multi-tap-automation.yaml
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Multi-Tap Scene Controller
|
||||||
|
description: >
|
||||||
|
Control lights or switches based on single, double, or triple tap
|
||||||
|
up/down events from a Z-Wave switch (e.g., Zooz or HomeSeer).
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
master_device:
|
||||||
|
name: Master Device(s)
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
multiple: true
|
||||||
|
|
||||||
|
slave_entities:
|
||||||
|
name: Slave Lights or Switches
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain:
|
||||||
|
- light
|
||||||
|
- switch
|
||||||
|
|
||||||
|
tap_types:
|
||||||
|
name: Tap Type(s)
|
||||||
|
selector:
|
||||||
|
select:
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- KeyPressed
|
||||||
|
- KeyPressed2x
|
||||||
|
- KeyPressed3x
|
||||||
|
|
||||||
|
tap_up:
|
||||||
|
name: Trigger on Tap Up?
|
||||||
|
default: true
|
||||||
|
selector:
|
||||||
|
boolean: {}
|
||||||
|
|
||||||
|
tap_down:
|
||||||
|
name: Trigger on Tap Down?
|
||||||
|
default: true
|
||||||
|
selector:
|
||||||
|
boolean: {}
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: zwave_js_value_notification
|
||||||
|
|
||||||
|
variables:
|
||||||
|
tap_types: !input tap_types
|
||||||
|
tap_up: !input tap_up
|
||||||
|
tap_down: !input tap_down
|
||||||
|
master_device_ids: !input master_device
|
||||||
|
|
||||||
|
condition:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{% set evt = trigger.event.data %}
|
||||||
|
{{ evt.command_class_name == 'Central Scene' and
|
||||||
|
evt.value in tap_types and
|
||||||
|
(
|
||||||
|
(tap_up and evt.property_key_name == '001') or
|
||||||
|
(tap_down and evt.property_key_name == '002')
|
||||||
|
) and
|
||||||
|
evt.device_id in master_device_ids }}
|
||||||
|
|
||||||
|
action:
|
||||||
|
- choose:
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ trigger.event.data.property_key_name == '001' }}"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_on
|
||||||
|
target: !input slave_entities
|
||||||
|
- conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ trigger.event.data.property_key_name == '002' }}"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_off
|
||||||
|
target: !input slave_entities
|
||||||
|
|
||||||
|
mode: single
|
||||||
|
|
80
power-monitoring.yaml
Normal file
80
power-monitoring.yaml
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Power Spike Logger
|
||||||
|
description: >
|
||||||
|
Logs significant power spikes (positive or negative) from an energy meter, typically used to identify when major appliances are turned on or off.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
phase1_power:
|
||||||
|
name: Phase 1 Power Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
phase2_power:
|
||||||
|
name: Phase 2 Power Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
total_power:
|
||||||
|
name: Total Power Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
delta_power:
|
||||||
|
name: Power Delta Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: sensor
|
||||||
|
spike_threshold:
|
||||||
|
name: Spike Threshold (W)
|
||||||
|
description: Minimum power change (positive or negative) to trigger logging
|
||||||
|
default: 1500
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 100
|
||||||
|
max: 10000
|
||||||
|
unit_of_measurement: W
|
||||||
|
mode: box
|
||||||
|
log_target:
|
||||||
|
name: Notification or Log Target
|
||||||
|
description: Where to send spike logs (e.g., notify.persistent_notification)
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: notify
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: numeric_state
|
||||||
|
entity_id: !input delta_power
|
||||||
|
above: !input spike_threshold
|
||||||
|
- platform: template
|
||||||
|
value_template: >
|
||||||
|
{% set threshold = states('input_number.spike_threshold') | float(1500) %}
|
||||||
|
{% set delta = states(input('delta_power')) | float(0) %}
|
||||||
|
{{ delta < (0 - threshold) }}
|
||||||
|
|
||||||
|
condition:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ states(input('total_power')) | float(0) > 1000 }}
|
||||||
|
|
||||||
|
variables:
|
||||||
|
phase1: "{{ states(input('phase1_power')) }}"
|
||||||
|
phase2: "{{ states(input('phase2_power')) }}"
|
||||||
|
total: "{{ states(input('total_power')) }}"
|
||||||
|
delta: "{{ states(input('delta_power')) }}"
|
||||||
|
time: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||||
|
|
||||||
|
action:
|
||||||
|
- service: notify.persistent_notification
|
||||||
|
data:
|
||||||
|
title: "Power Spike Detected"
|
||||||
|
message: >
|
||||||
|
Power spike at {{ time }}:\n
|
||||||
|
Phase 1: {{ phase1 }} W\n
|
||||||
|
Phase 2: {{ phase2 }} W\n
|
||||||
|
Total: {{ total }} W\n
|
||||||
|
Δ: {{ delta }} W
|
||||||
|
|
||||||
|
mode: queued
|
||||||
|
|
77
simulated-presence.yaml
Normal file
77
simulated-presence.yaml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Simulated Presence - Random Lights
|
||||||
|
description: >
|
||||||
|
Randomly toggles lights when a thermostat attribute equals a specified value
|
||||||
|
and it's nighttime (sun below horizon).
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
lights:
|
||||||
|
name: Light Entities
|
||||||
|
description: Select the lights to simulate presence
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: light
|
||||||
|
multiple: true
|
||||||
|
|
||||||
|
thermostat:
|
||||||
|
name: Thermostat Entity
|
||||||
|
description: The climate entity to check for the specified attribute
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: climate
|
||||||
|
|
||||||
|
attribute_name:
|
||||||
|
name: Thermostat Attribute
|
||||||
|
description: Attribute of the thermostat to check (e.g., preset_mode)
|
||||||
|
default: preset_mode
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
expected_value:
|
||||||
|
name: Expected Attribute Value
|
||||||
|
description: The value that triggers this automation (e.g., away_indefinitely)
|
||||||
|
default: away_indefinitely
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
|
||||||
|
interval:
|
||||||
|
name: Randomization Interval (minutes)
|
||||||
|
description: How often to randomly toggle lights
|
||||||
|
default: 10
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 1
|
||||||
|
max: 60
|
||||||
|
unit_of_measurement: minutes
|
||||||
|
|
||||||
|
mode: restart
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: sun.sun
|
||||||
|
to: "below_horizon"
|
||||||
|
|
||||||
|
condition:
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ state_attr(thermostat, attribute_name) == expected_value }}
|
||||||
|
|
||||||
|
action:
|
||||||
|
- repeat:
|
||||||
|
while:
|
||||||
|
- condition: state
|
||||||
|
entity_id: sun.sun
|
||||||
|
state: "below_horizon"
|
||||||
|
- condition: template
|
||||||
|
value_template: >
|
||||||
|
{{ state_attr(thermostat, attribute_name) == expected_value }}
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
selected_lights: "{{ lights | random }}"
|
||||||
|
- service: >
|
||||||
|
{{ ['light.turn_on', 'light.turn_off'] | random }}
|
||||||
|
target:
|
||||||
|
entity_id: "{{ selected_lights }}"
|
||||||
|
- delay:
|
||||||
|
minutes: !input interval
|
||||||
|
|
75
state-opposite.yaml
Normal file
75
state-opposite.yaml
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Opposite State Synchronizer
|
||||||
|
description: >
|
||||||
|
Keeps two entities in opposite states. If entity 1 turns on, entity 2 turns off, and vice versa.
|
||||||
|
domain: automation
|
||||||
|
input:
|
||||||
|
entity_1:
|
||||||
|
name: Entity 1
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain:
|
||||||
|
- light
|
||||||
|
- switch
|
||||||
|
entity_2:
|
||||||
|
name: Entity 2
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain:
|
||||||
|
- light
|
||||||
|
- switch
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: !input entity_1
|
||||||
|
id: entity_1
|
||||||
|
- platform: state
|
||||||
|
entity_id: !input entity_2
|
||||||
|
id: entity_2
|
||||||
|
|
||||||
|
condition: []
|
||||||
|
|
||||||
|
action:
|
||||||
|
- choose:
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: entity_1
|
||||||
|
- condition: state
|
||||||
|
entity_id: !input entity_1
|
||||||
|
state: "on"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_off
|
||||||
|
target:
|
||||||
|
entity_id: !input entity_2
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: entity_1
|
||||||
|
- condition: state
|
||||||
|
entity_id: !input entity_1
|
||||||
|
state: "off"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: !input entity_2
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: entity_2
|
||||||
|
- condition: state
|
||||||
|
entity_id: !input entity_2
|
||||||
|
state: "on"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_off
|
||||||
|
target:
|
||||||
|
entity_id: !input entity_1
|
||||||
|
- conditions:
|
||||||
|
- condition: trigger
|
||||||
|
id: entity_2
|
||||||
|
- condition: state
|
||||||
|
entity_id: !input entity_2
|
||||||
|
state: "off"
|
||||||
|
sequence:
|
||||||
|
- service: homeassistant.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: !input entity_1
|
||||||
|
mode: single
|
||||||
|
|
Reference in New Issue
Block a user