Guest User

Untitled

a guest
Jan 3rd, 2026
45
0
24 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.79 KB | None | 0 0
  1. ###############################################################################
  2. # Package: humidity_intelligence.yaml
  3. # Versions: v1.0.1
  4. # Humidity Intelligence – core backend
  5. ###############################################################################
  6.  
  7. ########################################
  8. # Helpers
  9. ########################################
  10. input_boolean:
  11. humidity_constellation_expanded:
  12. name: Humidity Constellation Expanded
  13. icon: mdi:chevron-down-circle
  14.  
  15. ########################################
  16. # Statistics – 7-day mean of house humidity
  17. ########################################
  18. sensor:
  19. - platform: statistics
  20. name: House Humidity Mean 7d
  21. entity_id: sensor.house_average_humidity
  22. state_characteristic: mean
  23. max_age:
  24. days: 7
  25.  
  26. ########################################
  27. # Template sensors + binary sensors
  28. ########################################
  29. template:
  30. - sensor:
  31. #########################################################################
  32. # House average humidity
  33. #########################################################################
  34. - name: House Average Humidity
  35. unique_id: humidity_intelligence_house_average
  36. unit_of_measurement: "%"
  37. device_class: humidity
  38. state_class: measurement
  39. state: >
  40. {% set rooms = [
  41. 'sensor.sb_arbeitszimmer_humidity',
  42. 'sensor.tempera_duschbad_humidity',
  43. 'sensor.tepera_prinzessinenbad_humidity',
  44. 'sensor.sb_schlafzimmer_humidity',
  45. 'sensor.sb_wohnzimmer_humidity'
  46. ] %}
  47. {% set vals = expand(rooms)
  48. | map(attribute='state')
  49. | map('float', default='none')
  50. | reject('none')
  51. | list %}
  52. {% if vals | count > 0 %}
  53. {{ (vals | sum / vals | count) | round(1) }}
  54. {% else %}
  55. none
  56. {% endif %}
  57. availability: >
  58. {% set rooms = [
  59. 'sensor.sb_arbeitszimmer_humidity',
  60. 'sensor.tempera_duschbad_humidity',
  61. 'sensor.tepera_prinzessinenbad_humidity',
  62. 'sensor.sb_schlafzimmer_humidity',
  63. 'sensor.sb_wohnzimmer_humidity'
  64. ] %}
  65. {{ expand(rooms) | selectattr('state', 'is_number') | list | count > 0 }}
  66.  
  67. - name: House Humidity Target Low
  68. unique_id: humidity_intelligence_target_low
  69. unit_of_measurement: "%"
  70. state: 45
  71.  
  72. - name: House Humidity Target High
  73. unique_id: humidity_intelligence_target_high
  74. unit_of_measurement: "%"
  75. state: 55
  76.  
  77. #########################################################################
  78. # 7-day drift: current average vs 7-day mean
  79. #########################################################################
  80. - name: House Humidity Drift 7d
  81. unique_id: humidity_intelligence_drift_7d
  82. unit_of_measurement: "%"
  83. state: >
  84. {% set current = states('sensor.house_average_humidity') | float(none) %}
  85. {% set mean = states('sensor.house_humidity_mean_7d') | float(none) %}
  86. {% if current is not none and mean is not none %}
  87. {{ (current - mean) | round(1) }}
  88. {% else %}
  89. none
  90. {% endif %}
  91. availability: >
  92. {{ is_number(states('sensor.house_average_humidity')) and
  93. is_number(states('sensor.house_humidity_mean_7d')) }}
  94.  
  95. #########################################################################
  96. # Worst-room condensation
  97. #########################################################################
  98. - name: Worst Room Condensation
  99. unique_id: humidity_intelligence_worst_condensation_room
  100. state: >
  101. {% set rooms = {
  102. 'Arbeitszimmer': states('sensor.sb_arbeitszimmer_humidity'),
  103. 'Schlafzimmer': states('sensor.sb_schlafzimmer_humidity'),
  104. 'Duschbad': states('sensor.tempera_duschbad_humidity'),
  105. 'Prinzessinenbad': states('sensor.tepera_prinzessinenbad_humidity'),
  106. 'Wohnzimmer': states('sensor.sb_wohnzimmer_humidity')
  107. } %}
  108. {% set ns = namespace(max_val=-1, max_room='Unknown') %}
  109. {% for name, val in rooms.items() if is_number(val) %}
  110. {% if val | float > ns.max_val %}
  111. {% set ns.max_val = val | float %}
  112. {% set ns.max_room = name %}
  113. {% endif %}
  114. {% endfor %}
  115. {{ ns.max_room }}
  116. attributes:
  117. humidity: >
  118. {% set rooms = [
  119. states('sensor.sb_arbeitszimmer_humidity'),
  120. states('sensor.sb_schlafzimmer_humidity'),
  121. states('sensor.tempera_duschbad_humidity'),
  122. states('sensor.tepera_prinzessinenbad_humidity'),
  123. states('sensor.sb_wohnzimmer_humidity')
  124. ] %}
  125. {% set vals = rooms | map('float', default='none') | reject('none') | list %}
  126. {{ vals | max if vals | count > 0 else 0 }}
  127. risk: >
  128. {% set h = state_attr('sensor.worst_room_condensation', 'humidity') | float(0) %}
  129. {% if h >= 80 %} Danger
  130. {% elif h >= 70 %} Risk
  131. {% elif h >= 60 %} Watch
  132. {% else %} Low
  133. {% endif %}
  134.  
  135. - name: Worst Room Condensation Risk
  136. unique_id: humidity_intelligence_worst_condensation_risk
  137. state: >
  138. {{ state_attr('sensor.worst_room_condensation', 'risk') or 'Unknown' }}
  139.  
  140. #########################################################################
  141. # Worst-room mould
  142. #########################################################################
  143. - name: Worst Room Mould
  144. unique_id: humidity_intelligence_worst_mould_room
  145. state: >
  146. {% set rooms = {
  147. 'Arbeitszimmer': states('sensor.sb_arbeitszimmer_humidity'),
  148. 'Schlafzimmer': states('sensor.sb_schlafzimmer_humidity'),
  149. 'Duschbad': states('sensor.tempera_duschbad_humidity'),
  150. 'Prinzessinenbad': states('sensor.tepera_prinzessinenbad_humidity'),
  151. 'Wohnzimmer': states('sensor.sb_wohnzimmer_humidity')
  152. } %}
  153. {% set ns = namespace(max_val=-1, max_room='Unknown') %}
  154. {% for name, val in rooms.items() if is_number(val) %}
  155. {% if val | float > ns.max_val %}
  156. {% set ns.max_val = val | float %}
  157. {% set ns.max_room = name %}
  158. {% endif %}
  159. {% endfor %}
  160. {{ ns.max_room }}
  161. attributes:
  162. humidity: >
  163. {% set rooms = [
  164. states('sensor.sb_arbeitszimmer_humidity'),
  165. states('sensor.sb_schlafzimmer_humidity'),
  166. states('sensor.tempera_duschbad_humidity'),
  167. states('sensor.tepera_prinzessinenbad_humidity'),
  168. states('sensor.sb_wohnzimmer_humidity')
  169. ] %}
  170. {% set vals = rooms | map('float', default='none') | reject('none') | list %}
  171. {{ vals | max if vals | count > 0 else 0 }}
  172. risk: >
  173. {% set h = state_attr('sensor.worst_room_mould', 'humidity') | float(0) %}
  174. {% if h >= 75 %} Danger
  175. {% elif h >= 65 %} Risk
  176. {% elif h >= 55 %} Watch
  177. {% else %} Low
  178. {% endif %}
  179.  
  180. - name: Worst Room Mould Risk
  181. unique_id: humidity_intelligence_worst_mould_risk
  182. state: >
  183. {{ state_attr('sensor.worst_room_mould', 'risk') or 'Unknown' }}
  184.  
  185. - binary_sensor:
  186. - name: Humidity Danger
  187. unique_id: humidity_intelligence_humidity_danger
  188. device_class: problem
  189. state: >
  190. {% set h = states('sensor.house_average_humidity') | float(none) %}
  191. {% set low = states('sensor.house_humidity_target_low') | float(45) %}
  192. {% set high = states('sensor.house_humidity_target_high') | float(55) %}
  193. {% set cond_risk = state_attr('sensor.worst_room_condensation', 'risk') %}
  194. {% set mould_risk = state_attr('sensor.worst_room_mould', 'risk') %}
  195. {% if h is not none %}
  196. {{ (h < low - 10) or (h > high + 10) or cond_risk == 'Danger' or mould_risk == 'Danger' }}
  197. {% else %}
  198. false
  199. {% endif %}
  200.  
  201. - name: Condensation Danger
  202. unique_id: humidity_intelligence_condensation_danger
  203. device_class: problem
  204. state: >
  205. {% set risk = state_attr('sensor.worst_room_condensation', 'risk') %}
  206. {{ risk in ['Risk', 'Danger'] }}
  207.  
  208. - name: Mould Danger
  209. unique_id: humidity_intelligence_mould_danger
  210. device_class: problem
  211. state: >
  212. {% set risk = state_attr('sensor.worst_room_mould', 'risk') %}
  213. {{ risk in ['Risk', 'Danger'] }}
Advertisement
Add Comment
Please, Sign In to add comment