Add humidity-controlled fan blueprint with hysteresis and safety features
Includes support for multiple fans, configurable thresholds with hysteresis to prevent flip-flopping, and runaway prevention mechanisms with max runtime and cooldown periods. Optimized for Zooz ZSE11 and compatible humidity sensors. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
163
humidity-controlled-fan.yaml
Normal file
163
humidity-controlled-fan.yaml
Normal file
@ -0,0 +1,163 @@
|
||||
blueprint:
|
||||
name: Humidity Controlled Fan with Hysteresis
|
||||
description: >
|
||||
Controls fans based on humidity sensor readings with hysteresis to prevent flip-flopping
|
||||
and safety mechanisms to prevent runaway operation. Supports multiple fans and the Zooz ZSE11
|
||||
humidity sensor or any compatible humidity sensor.
|
||||
domain: automation
|
||||
input:
|
||||
fans:
|
||||
name: Fan Entities
|
||||
description: One or more fans to control based on humidity
|
||||
selector:
|
||||
entity:
|
||||
domain: fan
|
||||
multiple: true
|
||||
|
||||
humidity_sensor:
|
||||
name: Humidity Sensor
|
||||
description: Humidity sensor entity (e.g., Zooz ZSE11 or compatible sensor)
|
||||
selector:
|
||||
entity:
|
||||
domain: sensor
|
||||
device_class: humidity
|
||||
|
||||
humidity_threshold:
|
||||
name: Humidity Threshold (%)
|
||||
description: Base humidity percentage threshold
|
||||
default: 60
|
||||
selector:
|
||||
number:
|
||||
min: 30
|
||||
max: 90
|
||||
unit_of_measurement: "%"
|
||||
|
||||
hysteresis_high:
|
||||
name: High Hysteresis (%)
|
||||
description: Amount above threshold to turn fans ON (prevents rapid cycling)
|
||||
default: 5
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 15
|
||||
unit_of_measurement: "%"
|
||||
|
||||
hysteresis_low:
|
||||
name: Low Hysteresis (%)
|
||||
description: Amount below threshold to turn fans OFF (prevents rapid cycling)
|
||||
default: 3
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 15
|
||||
unit_of_measurement: "%"
|
||||
|
||||
turn_on_delay:
|
||||
name: Turn On Delay
|
||||
description: Delay before turning fans on (avoids brief humidity spikes)
|
||||
default: 30
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 300
|
||||
unit_of_measurement: seconds
|
||||
|
||||
max_runtime_minutes:
|
||||
name: Maximum Runtime (minutes)
|
||||
description: Maximum time fans can run continuously before forced shutdown
|
||||
default: 120
|
||||
selector:
|
||||
number:
|
||||
min: 15
|
||||
max: 480
|
||||
unit_of_measurement: minutes
|
||||
|
||||
cooldown_minutes:
|
||||
name: Cooldown Period (minutes)
|
||||
description: Minimum time between fan cycles to prevent runaway operation
|
||||
default: 10
|
||||
selector:
|
||||
number:
|
||||
min: 2
|
||||
max: 60
|
||||
unit_of_measurement: minutes
|
||||
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input humidity_sensor
|
||||
attribute:
|
||||
- platform: state
|
||||
entity_id: !input humidity_sensor
|
||||
|
||||
variables:
|
||||
fans_entities: !input fans
|
||||
humidity_sensor: !input humidity_sensor
|
||||
base_threshold: !input humidity_threshold
|
||||
high_hysteresis: !input hysteresis_high
|
||||
low_hysteresis: !input hysteresis_low
|
||||
turn_on_threshold: "{{ base_threshold + high_hysteresis }}"
|
||||
turn_off_threshold: "{{ base_threshold - low_hysteresis }}"
|
||||
current_humidity: "{{ states(humidity_sensor) | float(0) }}"
|
||||
any_fan_on: >
|
||||
{{ expand(fans_entities) | selectattr('state', 'eq', 'on') | list | length > 0 }}
|
||||
max_runtime_seconds: "{{ (max_runtime_minutes | int) * 60 }}"
|
||||
|
||||
action:
|
||||
- choose:
|
||||
# Turn fans ON when humidity exceeds upper threshold
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ current_humidity > turn_on_threshold }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ not any_fan_on }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states(humidity_sensor) not in ['unavailable', 'unknown'] }}
|
||||
sequence:
|
||||
- delay:
|
||||
seconds: !input turn_on_delay
|
||||
# Re-check humidity after delay
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states(humidity_sensor) | float(0) > turn_on_threshold }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states(humidity_sensor) not in ['unavailable', 'unknown'] }}
|
||||
- service: fan.turn_on
|
||||
target:
|
||||
entity_id: "{{ fans_entities }}"
|
||||
# Set up automatic shutoff timer for runaway prevention
|
||||
- delay:
|
||||
seconds: "{{ max_runtime_seconds }}"
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ expand(fans_entities) | selectattr('state', 'eq', 'on') | list | length > 0 }}
|
||||
- service: fan.turn_off
|
||||
target:
|
||||
entity_id: "{{ fans_entities }}"
|
||||
# Enforce cooldown period
|
||||
- delay:
|
||||
minutes: !input cooldown_minutes
|
||||
|
||||
# Turn fans OFF when humidity drops below lower threshold
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ current_humidity < turn_off_threshold }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ any_fan_on }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states(humidity_sensor) not in ['unavailable', 'unknown'] }}
|
||||
sequence:
|
||||
- service: fan.turn_off
|
||||
target:
|
||||
entity_id: "{{ fans_entities }}"
|
||||
# Enforce cooldown period
|
||||
- delay:
|
||||
minutes: !input cooldown_minutes
|
Reference in New Issue
Block a user