Aktuell bastle ich an einer Vogelhauskamera und möchte dort gerne auch die Temperatur messen mit dem Pi Zero und MotionEyeOS. MotionEyeOS ist eine kleine Linux-Distribution, die speziell für die Verwendung als Betriebssystem zur Kameraüberwachung ausgelegt ist. Egal ob USB-Kamera oder Pi-Kamera MotionEyeOS erkennt sie sofort und bietet Features wie Bewegungserkennung, automatische Aufzeichnung und Datenübertragung per FTP oder Samba.
Ich hatte noch einen alten DHT22 Temperatursensor in der Schublade und den wollte ich dazu nutzen die Temperatur und die Luftfeuchtigkeit im Bild als Overlay einzublenden. Durchsucht man das Internet nach Lösungen, finden sich zahlreiche Ansätze, die GPIO-Python Bibliotheken verwenden oder auf WiringPi bzw. CircuitPython basieren. Leider bringt MotionEyeOS keine Entwicklungsumgebung mit Compiler mit, weil es eben eine Mininmaldistribution ist. Wer mutig ist, kann versuchen per Cross-Compile die nötigen Bibliotheken und Module zu übersetzen, aber der Aufwand ist enorm.
Glücklicherweise gibt es auch noch alte Bibliotheken als vorkompilierte Programm im Netz und so kam ich auf Adafriut-DHT22. Eine Bibliothek mit Beispielprogramm, die es für die amr6vl Architektur des PI Zero fertig kompiliert zum runter laden gibt.
Das Beispielprogramm liest recht zuverlässig die Daten des DHT22 aus. Das Skript zum Einspielen in das Kamera-Overlay war dann das kleinere Problem.
Jetzt aber vor vorne und zum ausprobieren, die detaillierte Beschreibung zum Temperatur messen mit dem Pi Zero und MotionEyeOS :
Welche Hardware wird benötigt?
- Raspberry Pi Zero oder Zero W mit installiertem MotionEyeOs
- DHT22 Temperatursensor (sollte auch mit dem DHT11 funktionieren)
- 10kOhm Widerstand
- Drei Steckkabel
Wie wird der DHT22 angeschlossen?
Der DHT22 wird mit drei von den vier Anschlüssen mit dem Pi Zero verbunden.
Die rote Verbindung versorgt den DHT22 mit +3.3Volt. Die schwarze Verbindung legt den DHT22 gegen Masse und die blaue Verbindung ist die Datenleitung. Darüber werden die Messwerte ausgelesen.
Soweit so gut. Damit ist der Hardware-Teil bereits fertig. Jetzt müssen wir nur noch an die Messwerte kommen und sie im Overlay der Kamera einbinden.
Wie werden die Messwerte des DHT22 ausgelesen?
Das war wirklich das größte Problem, weil sich eben die neuen Python-Module oder Programme nicht ohne Weiteres unter MotionEyeOS übersetzen lassen. Nach längerer Suche fand ich das als deprecated gekennzeichnete Archiv bei Adafruit und siehe da das funktioniert ohne Probleme.
Zuerst lädt man sich aus dem Git-Repository das Binary Adafriut_DHT herunter. Um die Datei dann auf den Pi Zero zu übertragen verwendet man scp und macht die Datei ausführbar.
scp Downloads/Adafruit_DHT root@192.168.2.x:/data/usr/Adafriut_DHT
chmod +x Adafriut_DHT
Der Aufruf benötigt zwei Parameter. Den Typ des Temperatursensors und die Nummer des Datenpins an der GPIO Schnittstelle. In meinem Fall also:
[root@birdcam usr]# /data/usr/Adafriut_DHT 22 4 Using pin #4 Data (40): 0x2 0x76 0x0 0xe4 0x5c Temp = 22.8 *C, Hum = 63.0 %
Jetzt fehlt nur noch das Einblenden im Overlay.
Wie wird die Temperatur im Overlay der MotionEyeOS Kamera eingeblendet?
MotionEyeOS kommt mit einem Webfrontend zur Administration und eben das machen wir uns zu nutzen, um das Overlay zu verändern. Dazu habe ich ein kleines Shellskript geschrieben, das zunächst die Messwerte vom DHT22 holt, diese aufbereitet und dann per URl-Aufruf die Werte in das Overlay bzw. die Konfiguration der Kamera schreibt.
#!/bin/sh # get Cameraname CAM_CONFIG_FILE="/data/etc/camera-1.conf" CAM_NAME='' if [ -f $CAM_CONFIG_FILE ]; then CAM_NAME=`grep text_left $CAM_CONFIG_FILE | cut -f2 -d' '` fi # read temperature MVAL=`/data/usr/Adafriut_DHT 22 4` # remove trailing hex MVAL1=`echo $MVAL|cut -d= -f2-` # get temp and hum TEMP=`echo $MVAL1|cut -f1 -d" "` HUM=`echo $MVAL1|cut -f5 -d" "` OVERLAYTEXT="${CAM_NAME}\nTemp: ${TEMP} - Hum:${HUM}%" echo $OVERLAYTEXT curl -G "http://localhost:7999/1/config/set" --data-urlencode "text_left=$OVERLAYTEXT"
Dieses Skript wird unter /data/usr/send_temp_to_cam_overlay.sh gespeichert. Als letzten Schritt lasse ich dieses Skript alle 10 Minuten per cron ausführen, so dass die Temperatur und die Luftfeuchtigkeit auch regelmäßig aktualisiert wird. Dazu editiert man die crontab mit
EDITOR=nano crontab -e
und fügt die Zeile
*/10 * * * * /data/usr/send_temp_to_cam_overlay.sh
ein.
Die Einblendung sieht dann so aus:
Sieht gut aus, und läuft soweit ich das sehe auch sehr gut.
Das einzige problem ist die Abfrage der Messwerte vom Sensor.
Sollten Die Daten noch nicht vorliegen wird „Using“ angezeigt statt der Temperatur.
Vielleicht auch nur bei mir.
Ich versuche mal die Daten in ne Liste zu packen um mit Median oder so den richtigen wert rauszubekommen.
Hallo Michael,
danke, schön, wenn Du es verwenden konntest. Ja, das Problem mit dem „Using“ habe ich auch ab und an. Das passiert immer dann, wenn der Sensor noch keine Daten liefert. Nach ein paar Sekunden geht’s dann wieder. Falls Dir dazu eine Lösung einfällt, ergänze sie gerne.
Viele Grüße, Hans