Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###############################################################################
- # Package: humidity_intelligence.yaml
- # Versions: v1.0.1
- # Humidity Intelligence – core backend
- ###############################################################################
- ########################################
- # Helpers
- ########################################
- input_boolean:
- humidity_constellation_expanded:
- name: Humidity Constellation Expanded
- icon: mdi:chevron-down-circle
- ########################################
- # Statistics – 7-day mean of house humidity
- ########################################
- sensor:
- - platform: statistics
- name: House Humidity Mean 7d
- entity_id: sensor.house_average_humidity
- state_characteristic: mean
- max_age:
- days: 7
- ########################################
- # Template sensors + binary sensors
- ########################################
- template:
- - sensor:
- #########################################################################
- # House average humidity
- #########################################################################
- - name: House Average Humidity
- unique_id: humidity_intelligence_house_average
- unit_of_measurement: "%"
- device_class: humidity
- state_class: measurement
- state: >
- {% set rooms = [
- 'sensor.sb_arbeitszimmer_humidity',
- 'sensor.tempera_duschbad_humidity',
- 'sensor.tepera_prinzessinenbad_humidity',
- 'sensor.sb_schlafzimmer_humidity',
- 'sensor.sb_wohnzimmer_humidity'
- ] %}
- {% set vals = expand(rooms)
- | map(attribute='state')
- | map('float', default='none')
- | reject('none')
- | list %}
- {% if vals | count > 0 %}
- {{ (vals | sum / vals | count) | round(1) }}
- {% else %}
- none
- {% endif %}
- availability: >
- {% set rooms = [
- 'sensor.sb_arbeitszimmer_humidity',
- 'sensor.tempera_duschbad_humidity',
- 'sensor.tepera_prinzessinenbad_humidity',
- 'sensor.sb_schlafzimmer_humidity',
- 'sensor.sb_wohnzimmer_humidity'
- ] %}
- {{ expand(rooms) | selectattr('state', 'is_number') | list | count > 0 }}
- - name: House Humidity Target Low
- unique_id: humidity_intelligence_target_low
- unit_of_measurement: "%"
- state: 45
- - name: House Humidity Target High
- unique_id: humidity_intelligence_target_high
- unit_of_measurement: "%"
- state: 55
- #########################################################################
- # 7-day drift: current average vs 7-day mean
- #########################################################################
- - name: House Humidity Drift 7d
- unique_id: humidity_intelligence_drift_7d
- unit_of_measurement: "%"
- state: >
- {% set current = states('sensor.house_average_humidity') | float(none) %}
- {% set mean = states('sensor.house_humidity_mean_7d') | float(none) %}
- {% if current is not none and mean is not none %}
- {{ (current - mean) | round(1) }}
- {% else %}
- none
- {% endif %}
- availability: >
- {{ is_number(states('sensor.house_average_humidity')) and
- is_number(states('sensor.house_humidity_mean_7d')) }}
- #########################################################################
- # Worst-room condensation
- #########################################################################
- - name: Worst Room Condensation
- unique_id: humidity_intelligence_worst_condensation_room
- state: >
- {% set rooms = {
- 'Arbeitszimmer': states('sensor.sb_arbeitszimmer_humidity'),
- 'Schlafzimmer': states('sensor.sb_schlafzimmer_humidity'),
- 'Duschbad': states('sensor.tempera_duschbad_humidity'),
- 'Prinzessinenbad': states('sensor.tepera_prinzessinenbad_humidity'),
- 'Wohnzimmer': states('sensor.sb_wohnzimmer_humidity')
- } %}
- {% set ns = namespace(max_val=-1, max_room='Unknown') %}
- {% for name, val in rooms.items() if is_number(val) %}
- {% if val | float > ns.max_val %}
- {% set ns.max_val = val | float %}
- {% set ns.max_room = name %}
- {% endif %}
- {% endfor %}
- {{ ns.max_room }}
- attributes:
- humidity: >
- {% set rooms = [
- states('sensor.sb_arbeitszimmer_humidity'),
- states('sensor.sb_schlafzimmer_humidity'),
- states('sensor.tempera_duschbad_humidity'),
- states('sensor.tepera_prinzessinenbad_humidity'),
- states('sensor.sb_wohnzimmer_humidity')
- ] %}
- {% set vals = rooms | map('float', default='none') | reject('none') | list %}
- {{ vals | max if vals | count > 0 else 0 }}
- risk: >
- {% set h = state_attr('sensor.worst_room_condensation', 'humidity') | float(0) %}
- {% if h >= 80 %} Danger
- {% elif h >= 70 %} Risk
- {% elif h >= 60 %} Watch
- {% else %} Low
- {% endif %}
- - name: Worst Room Condensation Risk
- unique_id: humidity_intelligence_worst_condensation_risk
- state: >
- {{ state_attr('sensor.worst_room_condensation', 'risk') or 'Unknown' }}
- #########################################################################
- # Worst-room mould
- #########################################################################
- - name: Worst Room Mould
- unique_id: humidity_intelligence_worst_mould_room
- state: >
- {% set rooms = {
- 'Arbeitszimmer': states('sensor.sb_arbeitszimmer_humidity'),
- 'Schlafzimmer': states('sensor.sb_schlafzimmer_humidity'),
- 'Duschbad': states('sensor.tempera_duschbad_humidity'),
- 'Prinzessinenbad': states('sensor.tepera_prinzessinenbad_humidity'),
- 'Wohnzimmer': states('sensor.sb_wohnzimmer_humidity')
- } %}
- {% set ns = namespace(max_val=-1, max_room='Unknown') %}
- {% for name, val in rooms.items() if is_number(val) %}
- {% if val | float > ns.max_val %}
- {% set ns.max_val = val | float %}
- {% set ns.max_room = name %}
- {% endif %}
- {% endfor %}
- {{ ns.max_room }}
- attributes:
- humidity: >
- {% set rooms = [
- states('sensor.sb_arbeitszimmer_humidity'),
- states('sensor.sb_schlafzimmer_humidity'),
- states('sensor.tempera_duschbad_humidity'),
- states('sensor.tepera_prinzessinenbad_humidity'),
- states('sensor.sb_wohnzimmer_humidity')
- ] %}
- {% set vals = rooms | map('float', default='none') | reject('none') | list %}
- {{ vals | max if vals | count > 0 else 0 }}
- risk: >
- {% set h = state_attr('sensor.worst_room_mould', 'humidity') | float(0) %}
- {% if h >= 75 %} Danger
- {% elif h >= 65 %} Risk
- {% elif h >= 55 %} Watch
- {% else %} Low
- {% endif %}
- - name: Worst Room Mould Risk
- unique_id: humidity_intelligence_worst_mould_risk
- state: >
- {{ state_attr('sensor.worst_room_mould', 'risk') or 'Unknown' }}
- - binary_sensor:
- - name: Humidity Danger
- unique_id: humidity_intelligence_humidity_danger
- device_class: problem
- state: >
- {% set h = states('sensor.house_average_humidity') | float(none) %}
- {% set low = states('sensor.house_humidity_target_low') | float(45) %}
- {% set high = states('sensor.house_humidity_target_high') | float(55) %}
- {% set cond_risk = state_attr('sensor.worst_room_condensation', 'risk') %}
- {% set mould_risk = state_attr('sensor.worst_room_mould', 'risk') %}
- {% if h is not none %}
- {{ (h < low - 10) or (h > high + 10) or cond_risk == 'Danger' or mould_risk == 'Danger' }}
- {% else %}
- false
- {% endif %}
- - name: Condensation Danger
- unique_id: humidity_intelligence_condensation_danger
- device_class: problem
- state: >
- {% set risk = state_attr('sensor.worst_room_condensation', 'risk') %}
- {{ risk in ['Risk', 'Danger'] }}
- - name: Mould Danger
- unique_id: humidity_intelligence_mould_danger
- device_class: problem
- state: >
- {% set risk = state_attr('sensor.worst_room_mould', 'risk') %}
- {{ risk in ['Risk', 'Danger'] }}
Advertisement
Add Comment
Please, Sign In to add comment