Kühlschranküberwachung

Posted on So 16 Mai 2021 in Computer & Electronics

Meine Frau ist Kinderärztin und hat in ihrer Praxis diverse Medikamente, wie z.B. Impfstoffe vorrätig – die müssen bei ca. 2-8°C gelagert werden und da ist es wichtig, die Kühlschränke regelmäßig zu kontrollieren, damit keiner unbemerkt ausfällt. Und so sind diese mit Thermometern ausgestattet, die täglich abgelesen und protokolliert werden. Das ist lästig und hilft natürlich auch nicht, wenn mal am Wochenende was schiefgehen sollte.

Das geht doch auch automatisch!

Und so kam der Wunsch nach einer automatischen Kühlschranküberwachung auf. Sowas gibt's kommerziell – z.B. von Liebherr, die auch Medikamentenkühlschränke herstellen. Allerdings haben diese Systeme auch medizinische Preise und da dachte ich mir: Das kann man doch selbst bauen!

Also kurz nachgedacht, ein bisschen im Netz recherchiert und schon hatte ich einen Plan:

  • Als Sensor nehmen wir einen ZigBee Temperatur/Luftfeuchtesensor, wie z.B. den von Aquara.
  • Um mit dem Sensor reden zu können, brauchen wir ein ZigBee Gateway. Die Wahl fiel auf den Conbee 2 von Phoscon bzw. Dresden Elektronik.
  • Zuguterletzt brauchen wir noch einen Computer. Ein Raspberry PI wäre eine gute Möglichkeit, aber ich hatte noch einen alten Thin Client rumliegen (HP T610) und so hab ich den genommen.

Als erstes mal ein Debian netinst image besorgen und installieren.

deCONZ

Als nächstes brauchen wir Software/Treiber für den Conbee 2. Die vom Hersteller heißt deCONZ und es gibt sogar ein ein deb Repository, so dass sie leicht zu installieren ist. Und auch eine systemd Integration kommt mit. Allerdings bietet deCONZ keine eigene Möglichkeit, Daten zu loggen, oder einen Alarm zu konfigurieren. D.h. wir brauchen zusätzlich Homeassistant (oder etwas ähnliches), um diese Funktionen zu realisieren. Homeassistant hat eine deCONZ Integration, aber es geht auch ohne. Und deshalb sparen wir uns ein Element in der Software-Kette und installieren deCONZ nicht.

Homeassistant

Homeassistant bietet alle Funktionen, die mir so vorschweben. Um die Sache möglichst einfach und gut wartbar zu halten verwende ich das Docker-Image.

Erstmal Docker installieren:

sudo apt install docker.io docker-compose

... ein docker-compose.yml file für den Homeassistant bauen

version: '3'
services:
    homeassistant:
        container_name: home-assistant
        image: homeassistant/home-assistant:stable
        volumes:
            - ~/.config/homeassistant:/config
        devices:
            - /dev/ttyACM0:/dev/ttyACM0
        environment:
            - TZ=Europe/Berlin
        restart: always
        network_mode: host

Der Conbee 2 wird auf meinem Rechner als /dev/ttyACM0 eingebunden. D.h. wir müssen zum einen sicherstellen, dass unser user auch die nötigen permissions hat (sudo gpasswd -a phil dialout) und das device im Container eingebunden wird (s.o.).

Nun können wir das Ganze starten:

docker-compose up

Auf Port 8123 des Thinclients findet sich nun der Homeassistant.

Dort unter Configuration > Integrations > Add Integration nach "Zigbee" suchen und die Integration "Zigbee Home Automation" installieren und im nächsten Dialog das richtige Device (/dev/ttyACM0 – ConBee II, ... auswählen und schon haben wir ihn:

Um den Sensor zu verbinden müssen wir nun auf "1 device" gehen und dort auf den einzigen Eintrag "Zigbee coordinator".

Hier nun "Add devices via this device". Nun müssen wir den kleinen Knopf am Sensor ein paar Sekunden gedrückt halten, bis die LED dreimal blinkt. Dadurch schaltet er in den Pairing Mode und verbindet sich auch unmittelbar mit unserem Conbee:

Noch den Sensornamen editieren, damit er netter aussieht, das Ganze ins Dashboard integrieren und wir haben eine Temperaturanzeige:

Sehr schön!

Beim Einrichten des Dashboard haben wir auch herausgefunden, dass der Temperatursensor sensor.lumi_lumi_weather_753be063_temperature heißt und der Batterie-level sensor.lumi_lumi_weather_753be063_power. Das merken wir uns, weil wir es gleich benötigen.

Big brother

Nun fehlt noch die automatische Überwachung, denn es wäre doch ideal, wenn man automatisch eine Email bekäme, sobald die Temperatur aus dem Sollbereich geht. Und ein Battery-low Alarm wäre ebenfalls schön. Dazu brauchen wir mehrere Mechanismen, die Homeassistant zur Verfügung stellt.

Wie im docker-compose File konfiguriert, exportiert der Docker Container seinen config folder unter .config/homeassistant/ und dort spielt sich das Folgende ab.

Als erstes konfigurieren wir eine email notification. Und dazu schreiben wir dieses notifications.yaml file:

- name: email_alert
  platform: smtp
  server: smtp.yourprovider.com
  port: 587
  timeout: 15
  sender_name: "Kuehlschrankueberwachung"
  sender: !secret smtp_user
  encryption: starttls
  username: !secret smtp_user
  password: !secret smtp_pass
  recipient:
    - yourname@yourprovider.com

Und wenn Ihr Euch viel Frust sparen wollt, dann verwendet Ihr im sender_name keine Umlaute oder sowas – das Problem zu debuggen hat mich Stunden gekostet...

Den SMTP User und Passwort haben wir hier in die Datei secrets.yaml ausgelagert:

smtp_user: fridge@yourprovider.com
smtp_pass: ajfdsoi23h;oih;oicjw90213    # or whatever your password is.

Die Notification könnt Ihr im User-Interface testen: Unter Developer Tools/Services wählt Ihr notify.email_alert aus und drückt mal auf Call Service. Wenn alles korrekt ist, solltet Ihr nun eine Email bekommen.

Um nun einen Temperatur-Alarm zu bekommen, brauchen wir noch einen binary_sensor, dessen Status von der Temperatur abhängt und einen alert, der von diesem Sensor ausgelöst wird und den email_alert verwendet. All das kommt in configuration.yaml:

binary_sensor:
  - platform: template
    sensors:
      fridge_temp:
        value_template: "{{ not ( 2.0 <= states('sensor.lumi_lumi_weather_753be063_temperature')|float <= 8.0 ) }}" 
      fridge_battery:
        value_template: "{{ states('sensor.lumi_lumi_weather_753be063_power')|float < 30 }}"

alert:
  fridge_temp:
    name: "Kühlschrank-Alarm"
    entity_id: binary_sensor.fridge_temp
    repeat:
      - 15
      - 30
      - 60
    skip_first: false
    title: "Temperatur-Alarm"
    message: "Kühlschrank-Alarm!\n\nMedikamentenkühlschrank: {{ states('sensor.lumi_lumi_weather_753be063_temperature') }} C."
    done_message: "Kühlschrank wieder im Normbereich.\n\nMedikamentenkühlschrank: {{ states(sensor.lumi_lumi_weather_753be063_temperature'') }} C."
    notifiers:
      - email_alert
 fridge_battery:
    name: "Batterie-Alarm"
    entity_id: binary_sensor.fridge_battery
    repeat:
      - 1440
    skip_first: false
    title: "Batterie-Alarm"
    message: "Batterie-Alarm!\n\nMedikamentenkühlschrank: Batterie {{ states('sensor.lumi_lumi_weather_753be063_power') }} %."
    notifiers:
      - email_alert

Den Temperatur-Alarm bekommen wir also sobald der Sollbereich verlassen wird und dann erneut nach 15 Minuten, dann nach weiteren 30 Minuten und dann alle 60 Minuten. Und wenn wieder alles in Ordnung ist gibt's Entwarnung.

Für den Batterie-Alarm reicht eine Benachrichtigung pro Tag und wir brauchen auch keine Entwarnung.

Außerdem müssen wir noch sicherstellen, dass unsere notification auch eingebunden wird. Dazu diese Zeile in das configuration.yaml:

notify: !include notifications.yaml

Mit den Sensoren für die anderen Kühlschränke können wir nun analog verfahren.

Backup

Soweit funktioniert nun alles und da wäre es schade, wenn uns die Ganze Mühe verloren ginge, wenn der Thinclient abraucht oder ähnliches. Also basteln wir noch schnell ein kleines

Skript, das die ganze Konfiguration in ein TAR Archiv verpackt, so dass wir diese leicht aufbewahren können, falls irgendwann man eine Neuinstallation ansteht:

#!/bin/sh
apt-mark showmanual > manual-packages.txt
sudo tar -czf backup.tgz \
    backup.sh \
    docker-compose.yml \
    .config/homeassistant/ \
    .ssh/ \
    /etc/ssh/sshd_config \
    /etc/apt/sources.list \
    manual-packages.txt

Und passt das alles nun problemlos auf den alten Thinclient? Ja - problemlos:

$ df -h /dev/sda*
Filesystem      Size  Used Avail Use% Mounted on
udev            1.7G     0  1.7G   0% /dev
/dev/sda1       511M  5.2M  506M   2% /boot/efi
/dev/sda2        14G  4.6G  8.0G  37% /

Das ist halt ein ein Minimalsystem, ohne grafische Oberfläche und so Gedöns...

Fertig?

Im Grunde bin ich nun zufrieden, aber es gibt noch zwei Dinge, die ich auf die Dauer nachrüsten will:

  1. Einen Wochenreport, der den Temperaturverlauf der vergangenen Woche darstellt, damit man zeigen kann, dass der Kühlschrank die ganze Zeit ok war.
  2. Ein GSM-Modem, damit im Falle eines Stromausfalls noch ein Notruf abgesetzt werden kann. Dazu braucht es dann entweder eine USV, oder ich ziehe das Ganze auf ein altes Laptop um – das hat die Batterie schon inklusive.

Aber für heute sind wir erstmal fertig.