2€-Dämmerungssensor / Upscaling einer alten Webcam

Begonnen von fhemRigge, 09 März 2021, 20:06:09

Vorheriges Thema - Nächstes Thema

fhemRigge

Hallo zusammen,

ich habe den ersten Lockdown dazu genutzt, mit Hilfe einer alten Webcam aus der Bastelkiste einen günstigen Dämmerungssensor zu realisieren.
Falls ihn jemand nachbauen möchte, stelle ich ihn hier mal vor - viel Spaß damit!

Ziel
Der Sensor soll das vorherrschende Tageslicht messen und den gemessenen Wert als Quasi-Lux Angabe an FHEM ausgeben. Es soll damit möglich sein, sowohl bei vorübergehender Dämmerung, als auch bei einbrechender Dunkelheit Aktionen in FHEM vorzunehmen. Die Lösung soll wenig kosten, möglichst auf Verkabelung verzichten und nicht auf Batterien angewiesen sein.

Lösung
Ich habe in meiner Bastelkiste eine alte Logitech QuickCam Communicate STK gefunden. Die Webcam gibt es aber auch für ca. 2 EUR gebraucht bei Ebay. Die Webcam hat ein ca. 2 m langes USB-Kabel. Glücklicherweise steht mein FHEM-Server im Flur mit Tageslicht (also mit einem Fenster nach Draußen).
Ich habe die Webcam am FHEM-Server angeschlossen und unauffällig innen in einer Ecke des Fensters platziert. Zusätzlich habe ich den Linsenbereich der Kamera mit "Butterbrotpapier" abgedeckt, um unbeabsichtigte Aufnahmen von Außen zu vermeiden, aber auch um das einfallende Licht zu Filtern.

Die Lösung besteht aus folgenden Software-Komponenten:

  • Dummy in FHEM
  • Shell-Skript
  • Crontab Eintrag

Dummy in FHEM
Um überhaupt in FHEM präsent zu sein habe ich einen Dummy verwendet.
define twilight_detector dummy
attr twilight_detector alias Dämmerungssensor
attr twilight_detector icon message_light_intensity
attr twilight_detector room Flur
attr twilight_detector stateFormat {sprintf("%.0f"." lx",ReadingsVal($name,"state",0))}


Shell-Skript
Das Skript wird minütlich gestartet und läuft ca. 10 Sekunden. Es wird ein 48x48 px großes Bild der Webcam erfasst und im Cache gespeichert. Danach wird mit dem Befehl convert der "Mittelwert" des Bildes ermittelt. Anschließend wird dieser Mittelwert an FHEM übertragen und abschließend wird das Bild gelöscht.
#!/bin/bash

/usr/bin/fswebcam -q -d /dev/video0 -r 48x48 -F 1 --jpeg 85 --no-banner --no-title --no-timestamp --greyscale --set brightness=10% --set exposure=781 --set gamma=6 --save /opt/fhem/log/cache/twilight_detector.jpg
value=$(convert /opt/fhem/log/cache/twilight_detector.jpg -format "%[fx:100*mean]" info:)
curl -s "http://127.0.0.1:80xx/fhem?cmd=set%20twilight_detector%20"$value"&XHR=1&fwcsrf=csrf_xxxxxxxxxxxxxxx"
rm /opt/fhem/log/cache/twilight_detector.jpg


Crontab Eintrag
Starte das Skript minütlich.
* * * * *    /opt/fhem/scripts/capture_webcam_image.sh

Verwendung
Ich habe ein paar Tage Erfahrung mit dem Dämmerungsverlauf gesammelt und konnte so einen Wertebereich festlegen, in dem das Licht bei mir im Flur geschaltet werden soll.
Bei Quasi-Lux Werten von 72 und kleiner soll das Licht angehen. Steigt der Wert über 75, soll es ausgehen.
define Flurlampe_an_bei_Dunkelheit notify twilight_detector:.* {\
if ($EVENT < 72 && Value("Flurlampe") eq "off") {\
  fhem('set Flurlampe on');;\
}\
elsif ($EVENT > 75 && Value("Flurlampe") eq "on") {\
  fhem('set Flurlampe off');;\
}\
}


Erfahrung
Im angehängten Bild 01_Logitech_QuickCam-Communicate-STX.png sieht man die Webcam. 02_Daemmerungssensor_mittags_in_FHEM.png zeigt den Dummy in FHEM zur Mittagszeit (heute leicht bewölkt, daher "nur" ein Wert von 96. Und in 03_Plot_Daemmerungsverlauf_in_FHEM.png sieht man den Plot mit dem Dämmerungsverlauf des heutigen Tages.
An manchen Tagen mit vielen Wolken und viel Wind kommt es vor, dass das Licht tagsüber immer wieder mal an- bzw. ausgeschaltet wird. Da wäre eine "Glättung" evtl. ganz nett.
Im Vergleich zu rein rechnerischen Werten a lá Twilight erscheinen mir die Angaben meines Dämmerungssensors zuverlässiger.

Ich betreibe den Dämmerungssensor seit ca. März 2020 und bin absolut zufrieden damit!

Vor- und Nachteile
Als Vorteil sehe ich ganz klar den Preis und das Upscaling des Geräts. Es wäre sonst vermutlich über kurz oder lang in den Müll gewandert (natürlich zur Sammelstelle für Elektroschrott). Ich hatte Glück, dass das 2 m lange USB-Kabel gerade lange genug war für die Strecke zwischen Server und Fenster. Das Kabel sehe ich aber als Nachteil an. Andererseits musste ich keine neue Stromleitung o.ä. legen und kann auch auf Batterien verzichten. Die Tatsache, dass es sich um keinen wirklichen Lichtmesser handelt, also am Ende keine Lux-Angabe steht, spielt für meinen Einsatzzweck keine Rolle.

PS:
Ich weiß, ich habe überall in FHEM die Ausgabe des Sensors mit "lx" (also Lux) beschriftet. Mir ist klar, dass das nur der Optik dient und nicht der tatsächlichen Helligkeit entspricht.
FHEM 6.3 (Rev 29043), Raspi Model B Rev 2 bullseye, 1xCUL (V 1.67 CUL868), 1xnanoCUL (VTS 0.39 CSM868), 1xSIGNALduino (V 3.4.0 SIGNALduino), 1xRFXtrx433, 1xHM-LC-Sw1-PI-DN-R1, 3xHM-LC-BL1PBU-FM, 1xMAX! Wandthermostat, 10xMAX! Heizkörperthermostat und einiges mehr.