Ahoi,
schon vor einigen Monaten habe ich mein „Smart Home“ zu Home Assistant migriert und im Zuge dessen ein paar Automationen geschrieben, wovon ich heute eine zeigen möchte.
Seit nun mehr 10 Jahren halte ich Riesenschlangen, genau gesagt Boa c. c., Boa c. i., Python regius und Kornnattern. Je nach Art variiert das optimale Klima stark, weswegen eine durchgehende Überwachung der Temperatur, Luftfeuchtigkeit und Stunden an Tageslicht wichtig für das artgerechte Halten dieser Exoten ist.
Relativ normal sind programmierbare Steckdosen inkl. Thermometer.

Quelle: https://www.ms-reptilien.de/zubehoer/technik/messen-regeln/12930/m-s-reptile-control-v3-pro-thermostat-mit-dimmung-zeitschaltuhr-weee-regnr.-82392108?c=480
Je nach Lage des Geldbeutels kann man bis zu 3 Steckdosen auf einmal programmieren. Ich hatte aber das Glück, dass meine erste Steuerung nach 8 Jahren immer noch tadellos funktioniert. Das einzige Manko ist jedoch, dass diese nur eine Steckdose, abhängig von der aktuellen Temperatur und/oder Helligkeit steuern kann.
Zu dem Zeitpunkt hatte ich bereits ein rudimentäres „Smart Home“ aufgebaut, dass mir aber in vielen Punkten nicht richtig gefallen hat. Hauptsächlich aber durch Einschränkungen von Alexa und Google Home. Es war also an der Zeit, die Sachen in die eigenen Hände zu nehmen und es selbst zu machen.
Aufgrund der Popularität entschied ich mich für Home Assistant.
Dieselbe Funktionalität zur Steuerung/Überwachung eines Terrariums ließ sich aber leider nicht durch das Webinterface abbilden. Da die Dokumentation ziemlicher Mist ist, spare ich mir eine Verlinkung. Am schnellsten geht es wohl, wenn man sich den Code von anderen Automatisierungen anschaut, um ein tieferes Verständnis zu entwickeln.
Home Assistant setzt dabei auf die Verwendung von .yaml Dateien für die Beschreibung einer eigenen Automation. Die Automationen sind in vier Blöcke aufgeteilt:
1. input: Welche Sensoren werden verwendet?
input:
heating_socket:
name: The socket that controlls the heating bulb/element
default: switch.terrarium_heizung
selector:
entity:
domain: switch
multiple: false
temperature_sensor:
name: The temperature sensor
default: sensor.temperature_humidity_sensor_outdoor_temperature
selector:
entity:
domain: sensor
temperature_min_day:
name: Minimum temperature during day
description: Temperature which triggers to start heating during day
default: 28
selector:
number:
min: 20.0
max: 40.0
step: 0.5
mode: slider
temperature_max_day:
name: Maximum temperature during day
description: Temperature which triggers to stop heating during day
default: 31
selector:
number:
min: 20.0
max: 40.0
step: 0.5
mode: slider
temperature_min_night:
name: Minimum temperature at night
description: Temperature which triggers to start heating at night
default: 24
selector:
number:
min: 20.0
max: 40.0
step: 0.5
mode: slider
temperature_max_night:
name: Maximum temperature at night
description: Temperature which triggers to stop heating at night
default: 26
selector:
number:
min: 20.0
max: 40.0
step: 0.5
mode: slider
day_time_start:
name: The time at which a day starts
default: "07:00:00"
selector:
time: {}
night_time_start:
name: The time at which the night starts
default: "22:00:00"
selector:
time: {}
2. trigger: Wie wird die Automation ausgelöst?
trigger:
- platform: time_pattern
minutes: /15
id: temperature_changed
3. variable: Variablen und Benutzereingaben
variables:
day_time_start: !input 'day_time_start'
night_time_start: !input 'night_time_start'
is_day: '{{ (now() >= today_at(day_time_start)) and (now() <= today_at(night_time_start)) }}'
is_night: '{{ is_day == false }}'
current_temp: '{{ states("sensor.temperature_humidity_sensor_outdoor_temperature") }}'
action: Was soll passieren?
action:
- choose:
- conditions:
- condition: trigger
id: temperature_changed
- condition: template
alias: "Ist Tag"
value_template: '{{ is_day }}'
- condition: numeric_state
entity_id: !input 'temperature_sensor'
below: !input 'temperature_min_day'
sequence:
- service: homeassistant.turn_on
data:
entity_id: !input 'heating_socket'
- conditions:
- condition: trigger
id: temperature_changed
- condition: template
alias: "Ist Nacht"
value_template: '{{ is_night }}'
- condition: numeric_state
entity_id: !input 'temperature_sensor'
below: !input 'temperature_min_night'
sequence:
- service: homeassistant.turn_on
data:
entity_id: !input 'heating_socket'
- conditions:
- condition: trigger
id: temperature_changed
- condition: template
alias: "Ist Tag"
value_template: '{{ is_day }}'
- condition: numeric_state
entity_id: !input 'temperature_sensor'
above: !input 'temperature_max_day'
sequence:
- service: homeassistant.turn_off
data:
entity_id: !input 'heating_socket'
- conditions:
- condition: trigger
id: temperature_changed
- condition: template
alias: "Ist Nacht"
value_template: '{{ is_night }}'
- condition: numeric_state
entity_id: !input 'temperature_sensor'
above: !input 'temperature_max_night'
sequence:
- service: homeassistant.turn_off
data:
entity_id: !input 'heating_socket'
mode: restart
max_exceeded: silent
Die Automation geht dabei relativ simple vor:
- Prüfe alle 15min
- Ob Tag oder Nacht ist
- Tag
- Ist Temperatur-Soll unterschritten?
- Schalte Heizung ein
- Ist Temperatur-Soll überschritten?
- Schalte Heizung aus
- Ist Temperatur-Soll unterschritten?
- Nacht
- Ist Temperatur-Soll unterschritten?
- Schalte Heizung ein
- Ist Temperatur-Soll überschritten?
- Schalte Heizung aus
- Ist Temperatur-Soll unterschritten?
- Tag
- Ob Tag oder Nacht ist
Da man die Tages-/Nacht Min-/Max-Temperatur einzeln einstellen kann, lässt sich ein Gefälle in den Temperaturverlauf einbauen und dadurch auch ein wenig Stromkosten sparen.
Die Automation sieht nach einem Neustart von Home Assistant so aus:

Für eine Darstellung im Dashboard habe ich eine neue Seite erstellt, welche mir alle Infos rund um mein aktuell einziges Terrarium (von ehemals 6) zusammenfasst.

Hier sieht man schön, wann geheizt wurde und wie sich der Temperaturverlauf innerhalb der letzten 12 Stunden verhalten hat.