Home Assistant Automation “Duschen erkannt”
Mit einem Raumfeuchtesensor und einem Türkontakt habe ich gemeinsam mit ChatGPT diese Home Assistant Automation erstellt, die mir sehr zuverlässig mitteilt, ob gerade jemand duscht.
Dazu wird jedes Mal, wenn jemand das Duschbad betritt und die Tür schließt, der aktuelle Wert der Raumfeuchte in einer Hilfsvariablen (Startfeuchte) gespeichert.
Steigt dieser Wert bei dauerhaft geschlossener Tür an, wird gerade geduscht. Ab einem Anstieg der Raumfeuchte um 5% wird dann die zweite Hilfsvariable aktiviert, die mir auf einem Dashboard anzeigt, dass und wie lange gerade jemand duscht. Dies wird mir auch als Meldung im Home Assistant angezeigt, zusammen mit der Startzeit und der Raumfeuchte zu diesem Zeitpunkt.
Sobald die Tür zum Duschraum wieder geöffnet wird, wird mir der Duschvorgang als beendet gemeldet. In dieser Meldung werden mir die Endzeit sowie die aktuelle Raumfeuchte zum Zeitpunkt des Türöffnens mitgeteilt.
Durch den Aufbau dieser Automation ist es möglich, dass mehrere Personen nacheinander duschen und dies trotzdem eindeutig erkannt wird, da der Anstieg der Raumfeuchte ausgewertet wird, unabhängig davon, wie hoch diese tatsächlich ist. Natürlich hat das seine Grenzen, aber die wurden bei mir nie erreicht.
In unserer Wohnung befindet sich im Duschbad auch eine Toilette und die ist, solange jemand duscht, nur eingeschränkt oder gar nicht verfügbar. Daher halte ich diese Automatisierung für sinnvoll und gebe sie auf diesem Wege weiter.
Zum ChatGPT ist zu sagen, dass er sehr hilfreich ist, da er viel Tipparbeit abnimmt, aber man muss ihm sehr genau sagen, was man möchte, damit es dann auch funktioniert. Leider verwendet er oft Home Assistant YAML Code, der nicht mehr gültig ist und prüft nicht selbstständig auf HA 2025. Aber das kann man ihm sagen und dann funktioniert es wirklich sehr gut.
alias: Duschen erkannt
description: Erkennt Duschaktivität über Luftfeuchtigkeitsanstieg bei geschlossener Tür
triggers:
- entity_id: sensor.raumfeuchte
trigger: state
- entity_id: binary_sensor.türkontakt
trigger: state
conditions:
- condition: state
entity_id: input_boolean.duschen_aktiv
state: "off"
- condition: state
entity_id: binary_sensor.türkontakt
state: "off"
- condition: template
value_template: >
{% set aktuell = states('sensor.raumfeuchte') |
float(0) %} {% set start =
states('input_number.luftfeuchte_duschen_startwert') | float(0) %} {{
aktuell > start + 5 }}
actions:
- data:
entity_id: input_number.luftfeuchte_duschen_startwert
value: "{{ states('sensor.raumfeuchte') | float(0) }}"
action: input_number.set_value
- data:
entity_id: input_datetime.duschen_startzeit
timestamp: "{{ now().timestamp() }}"
action: input_datetime.set_datetime
- data:
entity_id: input_boolean.duschen_aktiv
action: input_boolean.turn_on
- data:
title: Duschen erkannt
message: >
Es wurde erkannt, dass jemand duscht. Luftfeuchtigkeit: {{
states('sensor.raumfeuchte') }} % Uhrzeit: {{
now().strftime('%H:%M:%S') }}
action: persistent_notification.create
mode: single
Hier die zweite zugehörige Automation:
alias: Duschen beendet (Tür geöffnet)
description: Beendet das Duschen, wenn die Badezimmertür geöffnet wird
triggers:
- entity_id: binary_sensor.türkontakt
from: "off"
to: "on"
trigger: state
conditions:
- condition: state
entity_id: input_boolean.duschen_aktiv
state: "on"
actions:
- target:
entity_id: input_boolean.duschen_aktiv
action: input_boolean.turn_off
data: {}
- data:
title: Duschen beendet
message: >
Das Duschen wurde als beendet erkannt. Tür geöffnet um {{
now().strftime('%H:%M:%S') }}. Aktuelle Luftfeuchtigkeit: {{
states('sensor.raumfeuchte') }} %
action: persistent_notification.create
mode: single
Die Darstellung im Dashboard wurde so realisiert:
type: conditional
conditions:
- entity: input_boolean.duschen_aktiv
state: "on"
card:
type: custom:button-card
entity: sensor.duschdauer_aktuell
name: Duschen läuft
icon: mdi:shower
show_state: true
state_display: |
[[[ return entity.state; ]]]
styles:
card:
- height: 50px
- width: 200px
- border-radius: 12px
- font-size: 14px
- padding: 8px
- background: |
[[[
let time = entity.state.split(':');
let min = parseInt(time[0]) * 60 + parseInt(time[1]);
let color = (min < 10) ? '#4caf50' : (min < 20) ? '#ff9800' : '#f44336';
return `linear-gradient(to right, ${color} ${min*2}%, #ffffff ${min*2}%)`;
]]]
name:
- font-weight: bold
- color: "#000000"
state:
- font-size: 13px
- color: "#000000"
Solange erkannt wird, dass jemand duscht, wird diese Information angezeigt und im Hintergrund der CHIP-Karte läuft ein Balken von links nach rechts. Je nach Dauer des Duschvorgangs färbt sich der Hintergrund erst grün und dann rot.