Smart Home: Mit der Webcam die Helligkeit ermitteln (z.B. für FHEM!)
Wie hell ist es eigentlich? Das kann für ein Smart Home wichtig sein: Sobald das smarte Zuhause weiß, wie hell es gerade in einem Zimmer ist, kann es darauf auch passend reagieren. Bei zu viel Sonneneinstrahlung lässt sich dann der Rolladen herunterfahren. Außerdem braucht der Bewegung-Sensor nicht automatisch das Licht einschalten, wenn es hell genug ist.
Aber auch für die Anwesenheitssimulation ist das praktisch: So kann das Smart Home entscheiden, ob die Lichter ein oder ausgeschaltet werden sollen, um zu simulieren, dass jemand zu Hause ist. Das lässt sich natürlich auch über die Uhrzeit oder den Sonnenstand steuern: Wenn man aber eine Kamera angeschlossen hat, lässt sich auch leicht deren Bild dafür nutzen!
» FHEM: Steuerung nach Uhrzeit
» FHEM: Steuerung nach Sonnenstand
» Helligkeitssensor BH1750 an Raspberry Pi anschließen
Helligkeit per Webcam ermitteln
Statt einem Helligkeitssensor nutzen wir in diesem Beispiel das Foto einer angeschlossenen Webcam (auch die Kamera des Raspberry Pi funktioniert gut!). Diese macht ein Bild, dessen Helligkeit anschließend ausgewertet wird.
Dazu schrumpft man das Foto auf eine Größe von 1×1 Pixel: Hierbei wird das Bild automatisch neu berechnet und der verbleibende Bildpixel bekommt die Durchschnittsfarbe des früheren Fotos. Im Vergleich mit Photoshop erzeugt die im Code verwendete PHP-Funktion ein beinahe identisches Bild, die Farbwerte stimmen fast ganz überein!
Anschließend wird anhand der Farbwerte des Bildes die Helligkeit berechnet, indem wir die Formel von Darel Rex Finley verwenden: Dadurch wird dem Farbwert für Gelb eine höhere Helligkeit als dem Wert von Rot und Blau. Dass man damit recht gut zwischen hell und dunkel unterscheiden kann, zeigt Frank Seitz hier bei der Berechnung der Hintergrundfarbe für Texte.
$helligkeit = round(sqrt((0.299*pow($r,2))+(0.587*pow($g,2))+(0.114*pow($b,2)))); $helligkeitprozent = round(($helligkeit / 255) * 100);
Wichtig ist für uns aber natürlich die Helligkeit der RGB Werte abhängig von der maximal möglichen Helligkeit (255): Diesen Wert ermitteln wir als Prozentwert. Diesen Wert kann man dann an FHEM senden, um die Helligkeit für einen Raum zu bestimmen. Dies ist natürlich abhängig von dem Raum und dem eigenen Empfinden: Bei einer Helligkeit von unter 10% kann die Smart Home Steuerung aber davon ausgehen, dass es die Lichter einschalten kann.
Webcam-Software und Apache Server installieren
Um ein Foto aufzunehmen und dann die Helligkeit zu erkennen, brauchen wir zunächst einen Linux-Computer mit Webcam: In unserem Beispiel ein Raspberry Pi (Zero) mit der Pi-Cam. Als Software brauchen wir fswebcam, um das Bild aufzunehmen und den Apache Webserver mit PHP:
Normalerweis sollte dann PHP 7 mit den benötigten Bibliotheken installiert sein. Da wir aber die GD Bibliothek benötigen, lässt sie sich so nach installieren. War sie schon vorhanden, ist das nicht schlimm: Die Installation stoppt dann einfach! Dazu meldet man sich per SSH am Raspberry an und gibt diesen Befehl ein:
sudo apt-get install php-gd
(weitere Optionen zur PHP GD Installation)
Anschließend kann man den Rechner einmal Neustarten, damit alle Pakete beim nächsten Start ordentlich geladen werden. Über die IP Adresse des Raspberry sollte man jetzt zum Apache Server gelangen: Dazu gibt man in einem Browser (muss nicht auf dem Raspberry sein!) die IP Adresse in die Adressleiste ein, zum Beispiel:
http://192.168.1.100
Dies sollte die Info-Seite des Apache Servers öffnen.
Foto aufnehmen und Helligkeit erkennen
Anschließend kopiert man das folgende Programm per FTP auf den Server oder erstellt es direkt dort in dem richtigen Ordner: Dazu geht man in das Verzeichnis /var/html:
cd /var/www/html/
Hier erstellt man die Datei helligkeit.php:
nano helligkeit.php
Hier kann man das folgende Programm einfach durch Kopieren und Einfügen in den Editor kopieren. Mit STRG + O wird die Datei gespeichert, mit STRG + X beendet man den Editor wieder.
Quellcode: Programm helligkeit.php
<html> <head> <title>Helligkeit erkennen</title> </head> <body> <?php $datei = '/var/ramdrive/helligkeit.jpg'; function helligkeit($datei) { exec('fswebcam --no-banner --resolution 384x288 '.$datei); $image = imagecreatefromjpeg($datei); $image_p = imagecreatetruecolor(1,1); imagecopyresampled($image_p, $image, 0, 0, 0, 0, 1,1, 384, 288); $rgb = imagecolorat($image_p,0,0); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; echo '<br><br>RGB (dec): '; echo 'R: '.$r.' '; echo 'G: '.$g.' '; echo 'B: '.$b.' '; if(strlen(dechex($r)) == 1) { $hexr = '0'.dechex($r); } else { $hexr = dechex($r); } if(strlen(dechex($g)) == 1) { $hexg = '0'.dechex($g); } else { $hexg = dechex($g); } if(strlen(dechex($b)) == 1) { $hexb = '0'.dechex($b); } else { $hexb = dechex($b); } $farbwert = $hexr.''.$hexg.''.$hexb; $helligkeit = round(sqrt((0.299 * pow($r,2)) + (0.587 * pow($g,2)) + (0.114 * pow($b,2)))); $helligkeitprozent = round(($helligkeit / 255) * 100); echo "\n<br>"; echo 'Farbe: '.$farbwert.' <img style="width:12px;height:12px;background-color:#'.$farbwert.';border:1px solid #000;">'."\n<br>"; echo "\n<br>"; echo 'Helligkeit: '.$helligkeit.' von 255 ('.$helligkeitprozent.'%)'."\n<br>"; } helligkeit($datei); ?> </body> </html>
Dieses Skript erstellt ein Foto mit fswebcam. In diesem Beispiel wird das Skript auf dem Raspberry in der RAM Disk gespeichert, um die SD Karte zu schonen: Wer das Bild woanders speichern möchte, muss den Ort in der Variablen $datei anpassen.
Ruft man das Skript über die IP Adresse des Raspberry auf (z.B.: http://192.168.1.100/helligkeit.php), kommt in etwa diese Ausgabe (linke Seite).
Das die Helligkeit tatsächlich 24% der maximal möglichen Helligkeit entspricht, zeigt die Überprüfung der Farbe mit GIMP (rechte Seite).
Helligkeit an FHEM senden
Um den Wert der Helligkeit an FHEM zu senden, gibt es mehrere Möglichkeiten. Eine Variante ist es, in FHEM einen dummy für die Helligkeit anzulegen:
define Helligkeit dummy
In diesen kann man jetzt direkt mit dem Browser über die Datei helligkeit.php den aktuell ermittelten Wert speichern. Dafür ergänzt man in der Datei die Funktion “helligkeit()” am Ende mit diesem Code:
echo '<iframe src="http://192.168.1.100:8088/fhem/?cmd.Helligkeit=set%20Helligkeit%20'.$helligkeitprozent.'" style="width:0;height:0;vosibility:hidden;border:0;" border="0"></iframe>';
Bei der Adresse unter “src” muss man die IP-Adresse des Raspberry, auf dem FHEM läuft, und dessen Port-Nummer angeben: Hier im Beispiel ist das http://192.168.1.100:8083.
Damit das funktioniert, muss man in FHEM das “csrfToken” für den gewählten Port abschalten. Zur Sicherheit sollte man dort dann aber auch die IP-Adressen beschränken, die Zugriff auf FHEM per HTTP haben dürfen: Mehr dazu hier.
- datenschutz (40x gelesen)
- windows-beschleunigen (39x gelesen)
- windows-schneller-starten-autostart-aufraeumen (34x gelesen)
- pc-einsteigerkurs (25x gelesen)
- pc-einsteigerkurs-1-2 (6x gelesen)
Mehr Tipps zu Smart Home: Mit der Webcam die Helli...
-
Lichtsensor BH1750 am Raspberry Pi – Helligkeit messen im Smart Home
Mit einem einfachen Helligkeitssensor wie dem BH1750 kann man am Raspberry Pi messen, wie hell es ist: Das ist wichtig für das Smart Home, um...
-
FHEM: JeeLink / LaCrosse Sensor: Batterie wechseln
Wer bei einem LaCrosse Temperatursensor die Batterien tauscht, muss eine Sache beachten - andernfalls wird die Hardware-ID zurückgesetzt und der Sensor wird unter einem neuen...
-
FHEM: Logitech Harmony Hub “Disconnected”
FHEM / Logitech Harmony Hub: Steht der Harmony Hub nach einem Update in der Smart Home Software plötzlich auf "Disconnected", lässt sich das in der...
-
USB Soundkarte am Raspberry Pi – Anleitung und Kauf-Tipps
Mit dem Onboard-Chip des Raspberry Pi lässt sich schon eine passable Audio-Ausgabe erreichen. Besser wird es allerdings mit speziellen Soundkarten wie dem HifiBerry Aufsatz. Deutlich...
-
Android Bildschirm auf den Fernseher streamen
Mit der Cast Funktion von Android (die auch im Chrome Browser eingebaut ist) lassen sich Inhalte auf andere Geräte streamen: Zum Beispiel Googles ChromeCast Geräte....
-
Windows 11 Screenshot: Als Bild oder Video speichern!
Seit Windows 95 macht man den Windows Screenshot mit der "Drucken" Taste: Das Bildschirm-Foto wird in die Zwischenablage kopiert und lässt sich direkt in andere...
Smart Home: Mit der Webcam die Helligkeit ermitteln (z.B. für FHEM!)