Sonntag, 25. Oktober 2015

FHEM Statusdisplay mittels Digitaler Bilderrahmen (Motorola LS1000W)

Das Ergebnis vorweg



Die Idee dahinter

FHEM bietet heute vielerlei Möglichkeiten. Dazu gehört auch die Anzeige von Informationen "auf einen Blick" mit dem Dashboard. Wiederum dafür gibt es viele (Hilfs-)Module, die die Optik schön abrunden und hilfreiche Features mit sich bringen (z.B. Kalendereinträge anzeigen, Wettervorhersage mit Icons...)
Es galt nur noch alle Infos auf den digitalen Bilderrahmen zu bringen.



Benötigte Geräte und Materialien
  • RaspberryPi/BananaPi mit Debian, Apache2-Webserver und PHP es ist nicht erforderlich einen X-Server zu verwenden - diese Anleitung eignet sich (nur) für sog. "Headless"-Systeme.
  • Digitaler Bilderrahmen mit WLAN-Fähigkeit und Möglichkeit einen RSS-Feed zu lesen (In meinem Beispiel handelt es sich um einen Motorola LS1000W, den es vor geraumer Zeit bei Reichelt für etwa 85 EUR im Angebot gab. Die Anleitung sollte sich jedoch mit einigen Modifikationen leicht auf einen anderen WLAN-fähigen Bilderrahmen adaptieren lassen). Meine Wahl fiel auf den Motorola durch den im Internet zu findenen Hack von my-fuzzy-logic. Diesen Teil davon verwende ich ebenfalls hier im Beitrag.
  • FHEM-Installation mit konfiguriertem Dashboard
Funktionsweise
Da der digitale Bilderrahmen natürlich ein Anzeigegerät für Bilder ist, muss man einen Weg finden dynamische Inhalte (wie Websites o.ä.) in ein Bildformat (hier JPEG) zu bringen. Ich habe das durch einen simplen Screenshot der betreffenden Website (das Dashboard von FHEM) erreicht. Dafür habe ich ein PHP-Skript geschrieben, das anschließend via "Cron-Job" (Linux zeitgesteuertes Ausführen) alle fünf Minuten automatisch gestartet wird.

PHP-Skipt

 <?php  
 $filename="dashboard".date('j-m-y-h-i').".jpg";               //Erstellung des Dateinamens  
                                                               //Hier: dashboard2015-10-25-12-00.jpg  
 if (glob('/var/www/dashboard*'))                              //Prüfen, ob bereits Grafiken des Dashboards in /var/www/ befinden, wenn ja alle vorhandenen löschen  
 {                                                             //damit der Speicher nicht überläuft  
      $command = "rm /var/www/dashboard*";  
      exec($command, $output, $ret);  
      if ($ret)  
      {  
             echo "error deleting old file(s)\n";  
             die;  
      }  
 }  

 //Erstellung eines neuen Screenshots der FHEM-Dashboard-Seite  
 //Falls die FHEM-Seite mit einem Passwort-Attribut geschützt ist:  
 //Beim Zugriff darauf achten, dass bei der URL die passenden Parameter für <fhemuser> und <fhempass> gewählt werden 

 $command = "xvfb-run cutycapt --url=http://<fhemuser>:<fhempass>@127.0.0.1:8083/fhem/dashboard/MyDashboard --out=/var/www/".$filename;  
 exec($command, $output, $ret);  
 if ($ret) {  
   echo "error fetching screen dump\n";  
   die;  
 }  

 //"myfeed.rss"-Datei bearbeiten, damit der Bilderrahmen die Aktualisierung der Screenshotdatei bemerkt   
 //Die Adresse unter "<media:content url=" ist der Ort, an den der Apache-Webserver die Anfragen des Bildderrahmens weiterleitet

 $myfile = fopen("/var/www/myfeed.rss", "w") or die("Unable to open file!");  
 $txt = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>  
 <rss>  
 <channel>  
 <ttl>1</ttl>  
 <item>  
 <media:content url=\"http://192.168.1.254/".$filename."\" type=\"image/jpeg\" /> 
 </item>  
 </channel>  
 </rss>";  
 fwrite($myfile,$txt);  
 fclose($myfile); 
 
 //Berechtigung für das Lesen des zuvor erstellten Screenshots setzen 
 
 $command = "chmod 777 /var/www/".$filename;  
 exec($command, $output, $ret);  
 if ($ret)  
 {  
     echo "error chmodding file(s)\n";  
      die;  
 }  
 echo "Screendump completed\n";  
 ?>  

Diese Datei muss dann unter einem geeigneten Namen abgespeichert werden. In meinem Fall habe ich sie im Home-Ordner gespeichert "/home/ajendry/web2jpg/web2jpg.php".

Führt man das Skript nun z.B. alle fünf Minuten mittels Cron-Job als "root" aus, so erhält man einen Screenshot und eine (neue) myfeed.rss Datei im Ordner "/var/www/", welcher in meinem Fall dem Apache-Home-Ordner entspricht.

Cron-Job erstellen

Mittels CLI-Befehl

 crontab -e  

kann man die Tabelle der Cron-Jobs bearbeiten. Erweitert man diese um bzw. erstellt man in diese Tabelle folgende Zeile, wird das Skript alle 5 Minuten ausgeführt:

 0,5,10,15,20,25,30,35,40,45,50,55 * * * * sudo php /home/ajendry/web2jpg/web2jpg.php  

Vorbereitungen für den Bilderrahmen (Motorola LS1000W)

1. Einfach Anleitung von my-fuzzy-logic befolgen.

Tipp: Falls ihr wegen einer Fritzbox oder eines Providerabhängig gewählten Routers keine Möglichkeit habt, eine DNS-Umleitung für "rss.framechannel.de" zu erstellen, so verwendet bei der Verbindung mit dem WLAN eures Heimnetzes einen alternativen DNS-Server. Dabei wählt ihr einfach die IP-Adresse eures RaspberryPis oder BananaPis. Dort könnt ihr dann den BIND9-DNS-Dienst installieren und eine Weiterleitung der Namensauflösung von rss.framechannel.de festlegen.