[Claude] - Analyze Track Abnormal Plug Activity.yaml file designed to work as automation blueprint for Home Assistant OS. Refactor it improving overall code quality, fix obvious or critical bugs/mistakes, fix spelling if required and add comments that will make the code more easy to read and understand. Let's also change notification message, so it will include friendly name of an entity instead of entity id.

This commit is contained in:
2026-01-22 02:44:11 +03:00
parent 57ed3aaa63
commit 04c2bc1332

View File

@@ -1,79 +1,221 @@
# =============================================================================
# Power Spike Tracker Blueprint
# =============================================================================
# This blueprint monitors power sensors for abnormal consumption spikes that
# might indicate device malfunction or safety concerns.
#
# Features:
# - Monitors multiple power sensors simultaneously
# - Configurable spike detection ratio (e.g., 2x = power doubled)
# - Minimum threshold to ignore normal low-power fluctuations
# - Optional automatic switch turn-off for safety
# - Derives switch entity from sensor naming convention
#
# Naming Convention:
# The blueprint assumes sensors follow the pattern: sensor.<name>_power
# and the corresponding switch is: switch.<name>
# Example: sensor.coffee_maker_power -> switch.coffee_maker
# =============================================================================
blueprint:
name: "Custom: Power Spike Tracker"
description: >
Monitors a list of power sensors and triggers when consumption spikes
beyond a defined ratio compared to the previous reading. Optionally
turns off the associated switch.
Monitors power sensors and triggers when consumption spikes beyond a defined
ratio compared to the previous reading. Optionally turns off the associated
switch for safety. Assumes naming convention: sensor.<name>_power -> switch.<name>
domain: automation
input:
# -------------------------------------------------------------------------
# Sensor Configuration
# -------------------------------------------------------------------------
power_sensors:
name: Power Sensors
description: 'List of power sensors to monitor. Switch entity ids will be calculated by replacing `sensor.` and `_power` substrings. I.e. for `sensor.my_switch_power` switch entity must be `switch.my_switch`.'
description: >
Power sensors to monitor. Switch entities are derived by replacing
"sensor." with "switch." and removing "_power" suffix.
Example: sensor.my_plug_power -> switch.my_plug
selector:
entity:
domain: sensor
device_class: power
multiple: true
# -------------------------------------------------------------------------
# Detection Thresholds
# -------------------------------------------------------------------------
spike_ratio:
name: Power Spike Ratio
description: Ratio threshold (e.g. 2.0 means power doubled)
description: >
Minimum ratio of current/previous power to trigger alert.
Example: 2.0 means power must at least double to trigger.
default: 2.0
selector:
number:
min: 1.0
min: 1.1
max: 10.0
step: 0.1
mode: slider
threshold_value:
name: Minimum Power Threshold
description: Ignore spikes if current power is below this value
description: >
Ignore spikes if current power is below this value.
Prevents false alerts from small fluctuations at low power levels.
default: 5
selector:
number:
min: 0
max: 5000
step: 1
unit_of_measurement: "W"
unit_of_measurement: W
# -------------------------------------------------------------------------
# Actions Configuration
# -------------------------------------------------------------------------
auto_turn_off:
name: Auto Turn Off Switch
description: 'If true, turn off the switch linked to the sensor that spiked'
description: >
Automatically turn off the associated switch when a spike is detected.
Useful for safety when abnormal power draw might indicate a problem.
default: false
selector:
boolean:
# -------------------------------------------------------------------------
# Notification Configuration
# -------------------------------------------------------------------------
notify_target:
name: Notification Target (optional)
description: >
Notify entity to send alerts (e.g., notify.mobile_app_phone).
Leave empty to use the default notify.notify service.
default:
selector:
entity:
domain: notify
# Restart mode ensures rapid state changes are handled with latest values
mode: restart
# =============================================================================
# Trigger
# =============================================================================
trigger:
# Monitor all configured power sensors for state changes
- platform: state
entity_id: !input power_sensors
id: "power_change"
# =============================================================================
# Variables
# =============================================================================
variables:
# Input references
spike_ratio: !input spike_ratio
auto_turn_off: !input auto_turn_off
threshold_value: !input threshold_value
threshold_value: !input threshold_value
notify_target: !input notify_target
# Trigger context
entity: "{{ trigger.entity_id }}"
entity_name: "{{ state_attr(trigger.entity_id, 'friendly_name') | default(trigger.entity_id) }}"
prev: "{{ trigger.from_state.state | float(0) }}"
curr: "{{ trigger.to_state.state | float(0) }}"
# Derive switch name if convention is consistent (sensor.<name>_power → switch.<name>)
# Calculate the actual spike ratio for reporting
actual_ratio: "{{ (curr / prev) | round(2) if prev > 0 else 0 }}"
# Derive switch entity from sensor naming convention
# sensor.<name>_power -> switch.<name>
switch_entity: >
{{ entity | regex_replace('^sensor\\.', 'switch.') | regex_replace('_power$', '') }}
switch_name: "{{ state_attr(switch_entity, 'friendly_name') | default(switch_entity) }}"
# Debug flag - set to true to enable persistent notifications for troubleshooting
is_debug: false
# =============================================================================
# Condition - Only proceed if this is a genuine power spike
# =============================================================================
condition:
- condition: template
value_template: >
{{ curr > threshold_value and prev > 0 and (curr / prev) >= spike_ratio }}
# =============================================================================
# Actions
# =============================================================================
action:
- service: notify.notify
data:
message: >
Power spike detected on {{ entity }}:
{{ prev }}W → {{ curr }}W (ratio {{ (curr/prev) | round(2) }})
# ---------------------------------------------------------------------------
# Debug Logging (optional)
# ---------------------------------------------------------------------------
- choose:
- conditions: "{{ auto_turn_off }}"
- conditions:
- condition: template
value_template: "{{ is_debug }}"
sequence:
- service: persistent_notification.create
data:
title: "Power Spike Debug"
message: >
Entity: {{ entity_name }} ({{ entity }})
Previous: {{ prev }}W
Current: {{ curr }}W
Ratio: {{ actual_ratio }}x
Threshold: {{ threshold_value }}W
Required ratio: {{ spike_ratio }}x
Switch: {{ switch_name }} ({{ switch_entity }})
Auto turn off: {{ auto_turn_off }}
# ---------------------------------------------------------------------------
# Send Notification
# ---------------------------------------------------------------------------
- choose:
# Use configured notify target if provided
- conditions:
- condition: template
value_template: "{{ notify_target is not none }}"
sequence:
- service: notify.send_message
target:
entity_id: "{{ notify_target }}"
data:
title: "Power Spike Detected"
message: >
{{ entity_name }}: {{ prev }}W → {{ curr }}W ({{ actual_ratio }}x increase)
# Fall back to default notify service
default:
- service: notify.notify
data:
title: "Power Spike Detected"
message: >
{{ entity_name }}: {{ prev }}W → {{ curr }}W ({{ actual_ratio }}x increase)
# ---------------------------------------------------------------------------
# Auto Turn Off Switch (if enabled)
# ---------------------------------------------------------------------------
- choose:
- conditions:
- condition: template
value_template: "{{ auto_turn_off }}"
sequence:
- service: switch.turn_off
target:
entity_id: "{{ switch_entity }}"
# Notify that the switch was turned off
- choose:
- conditions:
- condition: template
value_template: "{{ notify_target is not none }}"
sequence:
- service: notify.send_message
target:
entity_id: "{{ notify_target }}"
data:
message: "{{ switch_name }} has been automatically turned off for safety."
default:
- service: notify.notify
data:
message: "{{ switch_name }} has been automatically turned off for safety."