Terrarium mit Home Assistant steuern und überwachen

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.

Copyright: M&S Reptilien
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
      • Nacht
        • Ist Temperatur-Soll unterschritten?
          • Schalte Heizung ein
        • Ist Temperatur-Soll überschritten?
          • Schalte Heizung aus

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.