Digitaler Bilderrahmen: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
K (use POSIX; raus)
 
(4 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Nutzung eines digitalen Bilderrahmens zur Darstellung von Temperatur Messwerten, die über fhem gesammelt werden.
Diese Seite beschreibt die Verwendung eines Digitalen Bilderrahmens (DPF) als Display für FHEM. Die Anbindung erfolgt dabei direkt über WLAN, erforderlich ist also ein DPF mit WLAN-Interface, der RSS Feeds aus dem eigenen Netzwerk erlaubt.
 
Auf der Seite [[Digitaler Bilderrahmen mit lcd4linux]] wird ein Ansatz beschrieben, der mit einfacheren DPF arbeitet.
 
Ein ähnlicher, aber genereller durchgeführter Ansatz (als Workshop) ist in der Beschreibung des Moduls [[RSS]] (das auch hier als Basis verwendet wird) verlinkt.


'''Bevor Du dieser Anleitung folgst, könntest Du Dir zuvor das Modul RSS ansehen, das seit April 2012 in fhem verfügbar ist.'''
== Voraussetzungen: ==
== Voraussetzungen: ==
* Digitaler Bilderrahmen mit wlan, der RSS Feeds aus dem eigenen Netzwerk erlaubt, z.B. Kodak W1020
* Digitaler Bilderrahmen mit WLAN, der RSS Feeds aus dem eigenen Netzwerk erlaubt, z.B. Kodak W1020
* Hausinternes LAN Netzwerk mit WLAN Möglichkeit. z.B. Avm Fritz Box 7071
* Hausinternes LAN Netzwerk mit WLAN Möglichkeit. z.B. Avm Fritz Box 7071
* fhem Server zur Erfassung der Temperatur Daten von funkgesteuerten Sensoren. z.B. Sheevaplug developement kit,
* fhem Server zur Erfassung der Temperatur Daten von funkgesteuerten Sensoren. z.B. Sheevaplug developement kit,
* CUL CC1101-USB-Lite 868MHz;
* [[CUL]] CC1101-USB-Lite 868MHz;
* Temperatur/Feuchte Sensoren, S555TH
* Temperatur/Feuchte Sensoren, [[S555TH]]
 
== Software auf dem fhem Server: ==
== Software auf dem fhem Server: ==
* Ubuntu mit apache2 als web server, php5, und natürlich fhem.
* Ubuntu mit apache2 als web server, php5, und natürlich fhem.
== Was ist zu tun ==
== Was ist zu tun ==
=== Definition der Sensoren in der fhem.cfg z.B.# Temperatur Sensoren ===
=== Definition der Sensoren in der fhem.cfg z.B.# Temperatur Sensoren ===
Zeile 28: Zeile 33:
define sens8 CUL_WS 8 -0.4 1.0
define sens8 CUL_WS 8 -0.4 1.0
attr sens8 room Terasse</nowiki>
attr sens8 room Terasse</nowiki>
=== Definition des Bilderrahmens als dummy ===
=== Definition des Bilderrahmens als dummy ===
  <nowiki># Definition des digital Frames zur Hinterlegung des Status
  <nowiki># Definition des digital Frames zur Hinterlegung des Status
Zeile 33: Zeile 39:
attr frame art frame
attr frame art frame
attr frame loglevel 6</nowiki>
attr frame loglevel 6</nowiki>
=== Definiton einer Fernbedienung FS20 für die Bedienung des Bilderrahmens ===
=== Definiton einer Fernbedienung FS20 für die Bedienung des Bilderrahmens ===
  <nowiki># Doppelte Kanalzahl zum Schalten des Bilderrahmen
  <nowiki># Doppelte Kanalzahl zum Schalten des Bilderrahmen
Zeile 51: Zeile 58:
define rc.8 FS20 ................. 07
define rc.8 FS20 ................. 07
attr rc.8 art dummy</nowiki>
attr rc.8 art dummy</nowiki>
=== Definition von Hilfsfeldern ===
=== Definition von Hilfsfeldern ===
  <nowiki># Definition von Hilfsfeldern zum Schalten des Bilderrahmens
  <nowiki># Definition von Hilfsfeldern zum Schalten des Bilderrahmens
Zeile 61: Zeile 69:
define f7 notify rc.7 { wetter ( "7" ) }
define f7 notify rc.7 { wetter ( "7" ) }
define f9 notify rc.8 { wetter ( "8" ) }</nowiki>
define f9 notify rc.8 { wetter ( "8" ) }</nowiki>
=== Anlegen einer Datei 99_Myown unter fhem…/FHEM ===
=== Anlegen einer Datei 99_Myown unter fhem…/FHEM ===
  <nowiki>package main;
  <nowiki>package main;
use strict;
use strict;
use warnings;
use warnings;
use POSIX;
use Time::Local&#160;;
use Time::Local&#160;;
sub
sub
Zeile 85: Zeile 93:
  return ""&#160;;
  return ""&#160;;
}</nowiki>
}</nowiki>
=== Anlegen eines Verzeichnisses für den Zugriff durch apache2 ===
=== Anlegen eines Verzeichnisses für den Zugriff durch apache2 ===
<nowiki>mkdir /var/www/pgm7</nowiki>
:<code>mkdir /var/www/pgm7</code>
 
=== Erstellen von Hintergrundbildern in Verzeichnissen die mit der Extension .pic ===
=== Erstellen von Hintergrundbildern in Verzeichnissen die mit der Extension .pic ===
<nowiki>mkdir /var/www/pgm7/blumen.pic</nowiki>
:<code>mkdir /var/www/pgm7/blumen.pic</code>
 
=== Ablegen von Hintergrundbildern ( .jpg ) im Format 800x480 Pixel für den Bilderrahmen Kodak W1020 ===
=== Ablegen von Hintergrundbildern ( .jpg ) im Format 800x480 Pixel für den Bilderrahmen Kodak W1020 ===
=== Erstellen einer Datei index.php im Verzeichnis /var/www/pgm7 ===
=== Erstellen einer Datei index.php im Verzeichnis /var/www/pgm7 ===
<code>
<code>
Zeile 517: Zeile 529:
makexml()&#160;;
makexml()&#160;;
?&gt;</nowiki></code>
?&gt;</nowiki></code>
=== Anpassen des Scripts an lokales Netzwerk, siehe Beginn des Scripts ===
=== Anpassen des Scripts an lokales Netzwerk, siehe Beginn des Scripts ===
=== Eintrag des RSS Feeds im Bilderrahmen als Foto-RSS ===
=== Eintrag des RSS Feeds im Bilderrahmen als Foto-RSS ===
[[File:W1020.jpg|455px]]
[[File:W1020.jpg|455px]]
=== Beispiel der Anzeige auf dem digitalen Bilderrahmen ===
=== Beispiel der Anzeige auf dem digitalen Bilderrahmen ===
[[File:PictuerFrame-1.jpg|800px]]
[[File:PictuerFrame-1.jpg|800px]]
=== Restart des ganzen Systems; Bilderrahmen, und Server. ===
=== Restart des ganzen Systems; Bilderrahmen, und Server. ===
Nach restart von fhem mit telnet …. Eingabe von:
Nach restart von fhem mit telnet …. Eingabe von:
Zeile 549: Zeile 564:
53              Maximale Anzahl Hintergrundbilder im Verzeichnis
53              Maximale Anzahl Hintergrundbilder im Verzeichnis
5              Maximale Anzahl Verzeichnisse mit Hintergrundbildern</nowiki>
5              Maximale Anzahl Verzeichnisse mit Hintergrundbildern</nowiki>
=== Mit Hilfe der Fernbedienung die unter Punkt 3. definiert wurde kann man nun den Bilderrahmen einstellen ===
=== Mit Hilfe der Fernbedienung die unter Punkt 3. definiert wurde kann man nun den Bilderrahmen einstellen ===
  <nowiki>Einstellung:
  <nowiki>Einstellung:
Zeile 554: Zeile 570:
Taste 2 Zeige    Bilder ohne Temperaturen
Taste 2 Zeige    Bilder ohne Temperaturen
Taste 3 – Taste 8  Schaltet auf ein anderes Verzeichnis mit Hintergrund Bildern um</code></nowiki>
Taste 3 – Taste 8  Schaltet auf ein anderes Verzeichnis mit Hintergrund Bildern um</code></nowiki>


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Aktuelle Version vom 7. Februar 2022, 13:37 Uhr

Diese Seite beschreibt die Verwendung eines Digitalen Bilderrahmens (DPF) als Display für FHEM. Die Anbindung erfolgt dabei direkt über WLAN, erforderlich ist also ein DPF mit WLAN-Interface, der RSS Feeds aus dem eigenen Netzwerk erlaubt.

Auf der Seite Digitaler Bilderrahmen mit lcd4linux wird ein Ansatz beschrieben, der mit einfacheren DPF arbeitet.

Ein ähnlicher, aber genereller durchgeführter Ansatz (als Workshop) ist in der Beschreibung des Moduls RSS (das auch hier als Basis verwendet wird) verlinkt.

Voraussetzungen:

  • Digitaler Bilderrahmen mit WLAN, der RSS Feeds aus dem eigenen Netzwerk erlaubt, z.B. Kodak W1020
  • Hausinternes LAN Netzwerk mit WLAN Möglichkeit. z.B. Avm Fritz Box 7071
  • fhem Server zur Erfassung der Temperatur Daten von funkgesteuerten Sensoren. z.B. Sheevaplug developement kit,
  • CUL CC1101-USB-Lite 868MHz;
  • Temperatur/Feuchte Sensoren, S555TH

Software auf dem fhem Server:

  • Ubuntu mit apache2 als web server, php5, und natürlich fhem.

Was ist zu tun

Definition der Sensoren in der fhem.cfg z.B.# Temperatur Sensoren

define sens1 CUL_WS 1 -0.1
attr sens1 room Wohnen
define sens2 CUL_WS 2 -0.2 -0.5
attr sens2 room Boden
define sens3 CUL_WS 3 0.0 -0.5
attr sens3 room Schlafen
define sens4 CUL_WS 4 -0.3 -5.0
attr sens4 room Bad
define sens5 CUL_WS 5 0.0 -0.5
attr sens5 room Buero
define sens6 CUL_WS 6 -0.5 -0.3
attr sens6 room Kueche
define sens7 CUL_WS 7 -0.6 0.4
attr sens7 room Diele
define sens8 CUL_WS 8 -0.4 1.0
attr sens8 room Terasse

Definition des Bilderrahmens als dummy

# Definition des digital Frames zur Hinterlegung des Status
define frame dummy
attr frame art frame
attr frame loglevel 6

Definiton einer Fernbedienung FS20 für die Bedienung des Bilderrahmens

# Doppelte Kanalzahl zum Schalten des Bilderrahmen
define rc.1 FS20 ......... 00
attr rc.1 art dummy
define rc.2 FS20 ............ 01
attr rc.2 art dummy
define rc.3 FS20 .............. 02
attr rc.3 art dummy
define rc.4 FS20 .............. 03
attr rc.4 art dummy
define rc.5 FS20 .............04
attr rc.5 art dummy
define rc.6 FS20 ..............05
attr rc.6 art dummy
define rc.7 FS20 ..................06
attr rc.7 art dummy
define rc.8 FS20 ................. 07
attr rc.8 art dummy

Definition von Hilfsfeldern

# Definition von Hilfsfeldern zum Schalten des Bilderrahmens
define f1 notify rc.1 { wetter ( "1" ) }
define f2 notify rc.2 { wetter ( "2" ) }
define f3 notify rc.3 { wetter ( "3" ) }
define f4 notify rc.4 { wetter ( "4" ) }
define f5 notify rc.5 { wetter ( "5" ) }
define f6 notify rc.6 { wetter ( "6" ) }
define f7 notify rc.7 { wetter ( "7" ) }
define f9 notify rc.8 { wetter ( "8" ) }

Anlegen einer Datei 99_Myown unter fhem…/FHEM

package main;
use strict;
use warnings;
use Time::Local ;
sub
wetter($)
{
  my ($t) = @_;
 my $string = $value{frame};
 my @frame_value=explode(",",$string);
 if ( $t == "1" ) { $frame_value[4]=$t;}
 if ( $t == "2" ) { $frame_value[4]=$t;}
 if ( $t == "3" ) { $frame_value[6]=$t-2;}
 if ( $t == "4" ) { $frame_value[6]=$t-2;}
 if ( $t == "5" ) { $frame_value[6]=$t-2;}
 if ( $t == "6" ) { $frame_value[6]=$t-2;}
 if ( $t == "7" ) { $frame_value[6]=$t-2;}
 if ( $t == "8" ) { $frame_value[6]=$t-2;}
 $string=join(",",@frame_value);
 fhem ( "set frame ".$string );
 return "" ;
}

Anlegen eines Verzeichnisses für den Zugriff durch apache2

mkdir /var/www/pgm7

Erstellen von Hintergrundbildern in Verzeichnissen die mit der Extension .pic

mkdir /var/www/pgm7/blumen.pic

Ablegen von Hintergrundbildern ( .jpg ) im Format 800x480 Pixel für den Bilderrahmen Kodak W1020

Erstellen einer Datei index.php im Verzeichnis /var/www/pgm7

<?PHP
 # parameter----------------------------------
 $image="pgm7/image.jpg";        # Path to the generated image
 $picdir="pgm7";            # Name of the directory
 $imagefile="/work/www/".$image;    # Absolute Path to the generated image
 $pictfile="[http://192.168.178.25/ http://192.168.178.25/]".$image;
                     # Path to the generated image for apache
 $fhz_pl="/work/fhem/fhem.pl";     # Path to fhem
 $fhz_port="7072";           # Port Number of fhem
 $picpath="/work/www/".$picdir;     # Path to the pictures used as background
 $frame="frame";            # Name of the Picture Frame in fhem
 $voice="on" ;             # check fritz box for Voice notice
 $voicebox="[ftp://192.168.178.1/USB-FlashDisk-01/FRITZ/voicebox/rec ftp://192.168.178.1/USB-FlashDisk-01/FRITZ/voicebox/rec]" ;
                     # URL of the voicebox
 $telicon="/work/www/pgm7/telefon.jpg"; # Path to a telefon icon
                     # Size 100x100 Pixel
                     # some fonts
 $fontarial="/usr/share/fonts/truetype/msttcorefonts/Arial.ttf";
 $fontarialb="/usr/share/fonts/truetype/msttcorefonts/Arial_Bold.ttf";
 $fontgeorgiab="/usr/share/fonts/truetype/msttcorefonts/georgiab.ttf";
 
 $maxon="on" ;             # define min/max outside temperatures are available #  echo $imagefile," ", $pictfile, "\n";
 
# ++++++++++++++++++++++++++++++++++++++
# Return an Array with all Elements ( files or folders )
# in path whi end with sub
# for example ( /work/www/pgm7 .pic
# will return all return all directory Names in /work/www/pgm7
# with the extesion .pic
 
function ls ( $path,$sub ) {
$all=array();
$verz = opendir ( $path );
$i=1;
while ( $file = readdir ( $verz ) )
{
 if ( $file != '.' && $file != '..')
 {
 $pfad_info = pathinfo ( $file );
# echo $pfad_info['dirname'],"\n";
# echo $pfad_info['basename'],"\n";
# echo $pfad_info['extension'],"\n";
 if ($pfad_info['extension'] == $sub ) {
 $all[$i]=$file ;
 $i=$i+1;
 }
 }
}
 
closedir ( $verz );
$all[0]=$i-1;
# print_r($all);
return $all ;
}
 
# ++++++++++++++++++++++++++++++++++++++
# We check if the fritz box 7072 will contain
# Voice messages.
# we return an array that contains:
#  rec[0] --> Number of messages
#  rec[1] --> Number of Messages for Line 1
#  rec[2] --> Number of Messages for Line 2
#  ....
#  May be extendet if necessary
function voice ( $path ) {
$rec=array();
$rec[0]=0;
$rec[1]=0;
$rec[2]=0;
if ( false !== ($verz = @opendir ( $path ))) {
while (false !== ($file = readdir($verz))) {
 if ( $file != '.' && $file != '..')
  {
  $pfad_info = pathinfo ( $file );
# print_r($pfad_info);
  if ($pfad_info['filename'] == "rec.0" ) {
   $rec[0]=$rec[0]+1;
   $rec[1]=$rec[1]+1;
  }
  if ($pfad_info['filename'] == "rec.1" ) {
   $rec[0]=$rec[0]+1;
   $rec[2]=$rec[2]+1;
  }
 }
 } 
}
 return $rec;
}
 
# ++++++++++++++++++++++++++++++++++++++
# get the latest status of the picture Frame from fhem
function get_state () {
 global $stack;
 global $frame;
 for($i=0; $i < count($stack[0][children]); $i++) {
  if (substr($stack[0][children][$i][name],0,5)=='dummy') {
  $type=$stack[0][children][$i][name];
   for($j=0; $j < count($stack[0][children][$i][children]); $j++)
{
    $name=$stack[0][children][$i][children][$j][attrs][name];
    if ( $name == $frame ) {
    $state=$stack[0][children][$i][children][$j][attrs][state];} }
  }
 }
# echo $state;
 $qq=explode(",",$state);
# print_r($qq);
 return $qq;
 
}
 
# ++++++++++++++++++++++++++++++++++++++
# set a new status for the frame in fhem
function set_state($qq) {
global $fhz_pl;
global $fhz_port;
global $frame;
$zz=$qq[0].",".$qq[1].",".$qq[2].",".$qq[3].",".$qq[4].",".$qq[5].",".
$qq[6].",".$qq[7].",".$qq[8];
# echo "zz= ",$zz,"\n";
$xmllist="$fhz_pl $fhz_port \"set $frame $zz\" ";
exec($xmllist,$output);
# echo $output,"\n";
# echo $xmllist,"\n";
return "";
}
# ++++++++++++++++++++++++++++++++++++++
# get the xml file from fhem and parse the xml-file
# start_element_handler ( resource parser, string name, array attribs )
function startElement($parser, $name, $attribs) { global $stack; $tag=array("name"=>$name,"attrs"=>$attribs);
                         array_push($stack,$tag); }
# ++++++++++++++++++++++++++++++++++++++
# end_element_handler ( resource parser, string name )
function endElement($parser, $name) { global $stack; $stack[count($stack)-2]['children'][] = $stack[count ($stack)-1]; 
                   array_pop($stack); }
# ++++++++++++++++++++++++++++++++++++++
function new_xml_parser($live)
{ global $parser_live;
  $xml_parser = xml_parser_create();
  xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
  xml_set_element_handler($xml_parser, "startElement", "endElement");
  if (!is_array($parser_live)) { settype($parser_live, "array"); }
  $parser_live[$xml_parser] = $live;
  return array($xml_parser, $live); } 
 
# ++++++++++++++++++++++++++++++++++++++
function my_parse () {
# go parsing
global $output;
if (!(list($xml_parser, $live) = new_xml_parser($live))) { die("could not parse XML input"); }
foreach($output as $data) {
 if (!xml_parse($xml_parser, $data)) { die(sprintf("XML error: %s at line %d\n",
    xml_error_string(xml_get_error_code($xml_parser)),
    xml_get_current_line_number($xml_parser))); } }
xml_parser_free($xml_parser);
}
# ++++++++++++++++++++++++++++++++++++++
# Pass only the image. if there voice notes, they will be displayed
function pass_image($state) {
  global $stack;
  global $imagefile;
  global $fontarial;
  global $fontarialb;
  global $fontgeorgiab;
  $bild=$state[0]."/".$state[1]; 
  $im = imagecreatefromjpeg ( $bild );
  $black = ImageColorAllocate($im, 0, 0, 0);
  $bg1p = ImageColorAllocate($im, 110,148,183);
  $bg2p = ImageColorAllocate($im, 175,198,219);
  $white = ImageColorAllocate($im, 255, 255, 255);
  $gray= ImageColorAllocate($im, 133, 133, 133);
  $red = ImageColorAllocate($im, 255, 0, 125);
  $green1 = ImageColorAllocate($im, 0, 255, 0);
  $green = ImageColorAllocate($im, 133, 255,133);
  $yellow= ImageColorAllocate($im, 255, 255, 0);
  $blue= ImageColorAllocate($im, 0, 64, 255);
  $darkblue=ImageColorAllocate($im, 0, 32, 255);
  $orange= ImageColorAllocate($im, 255, 230, 25);
  if ( $voice == "on" ) {
  $yz=array();
  $yz=voice($voicebox);
  if ( $yz[0] > 0 ) {
   imagefilledrectangle($im,760,0,800,480,$black);
   $telefon=$telicon;
   $imtel = imagecreatefromjpeg ( $telefon );
   if ( $yz[1] > 0 ) {
     imagecopyresized ( $im,$imtel,765,100,0,0,30,30,100,100);
     $fontttfb=$fontarialb;
     $txtcolor=$white;
     $fontsize=16 ;
     $text=$yz[1];
     ImageTTFText ($im, $fontsize, 0, 775, 145, $txtcolor, $fontttfb, $text);
   }
   if ( $yz[2] > 0 ) {
     imagecopyresized ( $im,$imtel,765,170,0,0,30,30,100,100);
     $fontttfb=$fontarialb;
     $txtcolor=$white;
     $fontsize=16 ;
     $text=$yz[2];
     ImageTTFText ($im, $fontsize, 0, 775, 215, $txtcolor, $fontttfb, $text);
   }
  }
  }
  $newfile = $imagefile;
  imagejpeg ( $im, $newfile, 100 );
}
 
# ++++++++++++++++++++++++++++++++++++++
function make_image($state) {
 global $stack;
 global $imagefile;
 global $fontarial;
 global $fontarialb;
 global $fontgeorgiab;
 $bild=$state[0]."/".$state[1];
 $now=date("i");
 $datum=date("d.m.y H:i");
 $zeit =date("H:i");
 $ycord=50;
 $fontsize=10;
 $imgmaxx=800;
 $imgmaxy=480;
 $im = imagecreatefromjpeg ( $bild );
 $black = ImageColorAllocate($im, 0, 0, 0);
 $bg1p = ImageColorAllocate($im, 110,148,183);
 $bg2p = ImageColorAllocate($im, 175,198,219);
 $white = ImageColorAllocate($im, 255, 255, 255);
 $gray= ImageColorAllocate($im, 133, 133, 133);
 $red = ImageColorAllocate($im, 255, 0, 125);
 $green1 = ImageColorAllocate($im, 0, 255, 0);
 $green = ImageColorAllocate($im, 133, 255,133);
 $yellow= ImageColorAllocate($im, 255, 255, 0);
 $blue= ImageColorAllocate($im, 0, 64, 255);
 $darkblue=ImageColorAllocate($im, 0, 32, 255);
 $orange= ImageColorAllocate($im, 255, 230, 25);
 if ( $maxon == "on" ) {
# get temp Max and Temp Min from fhem xml file
 for($i=0; $i < count($stack[0][children]); $i++) {
  if (substr($stack[0][children][$i][name],0,5)=='dummy') {
   $maxt=0;
   $mint=0;
   for($j=0; $j < count($stack[0][children][$i][children]); $j++)
{
    $sensor=$stack[0][children][$i][children][$j][attrs][name];
    $state=$stack[0][children][$i][children][$j][attrs][state];
    if ($sensor == "Temp_Max" ) { $maxt=$state; }
    if ($sensor == "Temp_Min" ) { $mint=$state; }
   }
  }
 }
}
 $ycord=$imgmaxy;
# get temperatures from fhem xml file
 for($i=0; $i < count($stack[0][children]); $i++) {
  if (substr($stack[0][children][$i][name],0,6)=='CUL_WS') {
  $type=$stack[0][children][$i][name];
   for($j=0; $j < count($stack[0][children][$i][children]); $j++) {
    $sensor=$stack[0][children][$i][children][$j][attrs][name];
    $state=$stack[0][children][$i][children][$j][attrs][state];
    $t=substr($state,3,4);
    $h=substr($state,12,4);
    for($k=0; $k < count($stack[0][children][$i][children][$j] [children]); $k++) {
     if (($stack[0][children][$i][children][$j][children][$k] [attrs][key])=='room') {
       $room  =$stack[0][children][$i][children][$j][children] [$k][attrs][value];}
     if (($stack[0][children][$i][children][$j][children][$k] [attrs][key])=='sensor') {
       $ok   =$stack[0][children][$i][children][$j][children] [$k][attrs][value];}
    $measured=$stack[0][children][$i][children][$j][children][$k] [attrs][measured]; }
    $fontttfb=$fontarialb;
    $fontsize=16 ;
    $xcord = 520 ;
    $txtcolor=$green;
    $xcord1 = 660 ;
 
     if ( $room == "Terasse" ) {
      $txtcolor=$red;
      if( $t < 0 ) $txtcolor=$blue ;
      $text="Garten:";
      $fontsize=16 ;
      $xcord = 130 ;
      $ycord = $imgmaxy-120;
      $xy=imagettfbbox ( $fontsize,0,$fontttfb,$text);
      $xc=$xcord-abs($xy[2]-$xy[0])/2;
      ImageTTFText ($im, $fontsize, 0, $xc, $ycord, $txtcolor, $fontttfb, $text);
 #      $text="$t° $h% ";
      $text="$t°";
      $fontsize=28 ;
      $yc = $imgmaxy-85 ;
      $xy=imagettfbbox ( $fontsize,0,$fontttfb,$text);
      $xc=$xcord-abs($xy[2]-$xy[0])/2;
      ImageTTFText ($im, $fontsize, 0, $xc, $yc, $txtcolor, $fontttfb, $text);
      if ( $maxon == "on" ) {
       $text="Min: ".$mint."° Max: ".$maxt."°";
       $fontsize=16;
       $yc = $imgmaxy-60 ;
       $xy=imagettfbbox ( $fontsize,0,$fontttfb,$text);
       $xc=$xcord-abs($xy[2]-$xy[0])/2;
       ImageTTFText ($im, $fontsize, 0, $xc, $yc, $txtcolor, $fontttfb, $text);
       }
      }
     else {
      $text=$room.":";
      $ycord = $ycord-20 ;
      ImageTTFText ($im, $fontsize, 0, $xcord, $ycord, $txtcolor, $fontttfb, $text);
 #      $text="$t° $h%";
      $text="$t°";
      ImageTTFText ($im, $fontsize, 0, $xcord1, $ycord, $txtcolor, $fontttfb, $text);
      }
     }
    $fontttfb=$fontarialb;
    $txtcolor=$black;
    $fontsize=12 ;
    $text="Created at $datum on Peter's homeserver (Sheevaplug)";
    $xcord=10;
    $ycord = $imgmaxy-7 ;
    ImageTTFText ($im, $fontsize, 0, $xcord, $ycord, $txtcolor, $fontttfb, $text);
 
    if ( $voice == "on" ) {
    $yz=array();
    $yz=voice($voicebox);
    if ( $yz[0] > 0 ) {
     imagefilledrectangle($im,760,0,800,480,$black);
     $telefon=$telicon;
     $imtel = imagecreatefromjpeg ( $telefon );
     if ( $yz[1] > 0 ) {
       imagecopyresized ( $im,$imtel, 765,100,0,0,30,30,100,100);
       $fontttfb=$fontarialb;
       $txtcolor=$white;
       $fontsize=16 ;
       $text=$yz[1];
       ImageTTFText ($im, $fontsize, 0, 775, 145, $txtcolor, $fontttfb, $text);
     }
     if ( $yz[2] > 0 ) {
       imagecopyresized ( $im,$imtel, 765,170,0,0,30,30,100,100);
       $fontttfb=$fontarialb;
       $txtcolor=$white;
       $fontsize=16 ;
       $text=$yz[2];
      ImageTTFText ($im, $fontsize, 0, 775, 215, $txtcolor, $fontttfb, $text);
     }
    }
    }
    $newfile = $imagefile;
    imagejpeg ( $im, $newfile, 100 );
#   imagejpeg ( $im, '', 100);''}
 }
}
 
function makexml () {
global $pictfile;
global $frame_status;
$now=date("U");
$datum=date("d.m.y H:i");
header("Content-type: application/xml; \n");
echo "<?xml version='1.0' encoding='utf-8'?>" ;
echo "<rss version='2.0' xmlns:media='[http://search.yahoo.com/mrss/' http://search.yahoo.com/mrss/']>";
echo "<channel>";
echo "<title>Peters Pictures</title>";
echo "<link rel='alternate' type='application/rss+xml' title='>Peters Pictures' href='[http://192.168.178.25/' http://192.168.178.25/'] />";
echo "<ttl>1</ttl>\n";
echo "<item>";
echo "<title>B1_$now</title>";
echo "<media:content url='$pictfile' type='image/jpeg' height='480' width='800' />";
echo "<guid isPermaLink='false'>B1_$now</guid>";
echo "</item>\n";
echo "</channel></rss>";
return "";
}
# main ---------------------------------
 unset($output);
 $stack = array();
 $output = array();
 $xmllist="$fhz_pl $fhz_port xmllist";
 exec($xmllist,$output);
 my_parse();
# $frame_status[0]: Directory of the picture source
# $frame_status[1]: Source of current background picture
# $frame_status[2]: display counter for picture
# $frame_status[3]: * Max Display counter
# $frame_status[4]: * Typ of Display
#            0: only pass through
#            1: Picture with temperatures and Humidity
# 
# $frame_status[5]: Number of the picture in the directory. This number points
#          to the picture in $frame_status[1]
# $frame_status[6]: * Directory Number. This number points
#            to the Directory in $frame_status[0]
# $frame_status[7]: Number of pictures in directory ( file name with - jpg )
# $frame_status[8]: Number of directories with pictures ( directoriy name with .pic )
#
#          * set outside of this procedure
$frame_status=array();
$frame_status=get_state ($state);
# print_r($frame_status);
 
$verzeichnisse=ls($picpath,"pic");
if ( $frame_status[6] <= $verzeichnisse[0] ) {
 $frame_status[0]=$picpath."/".$verzeichnisse[$frame_status[6]] ; }
else {
  $frame_status[0]=$picpath."/".$verzeichnisse[1]; }
$bilder=ls($frame_status[0],"jpg");
if ( $frame_status[5] > $bilder[0]) {
  $frame_status[5] = 1 ; }
$frame_status[1]=$bilder[$frame_status[5]];
$frame_status[7]=$bilder[0];
$frame_status[3]=4;
$frame_status[8]=$verzeichnisse[0];
if ( $frame_status[2] < $frame_status[3] ) {
  $frame_status[2]= $frame_status[2]+1 ; }
else { $frame_status[2] = 1 ;
  if ($frame_status[5] < $frame_status[7]) {
   $frame_status[5] = $frame_status[5] + 1 ;
   $frame_status[1]=$bilder[$frame_status[5]];}
 else {
   $frame_status[5] = 1 ;
   $frame_status[1]=$bilder[$frame_status[5]]; } }
# print_r($frame_status);
set_state($frame_status);
if ( $frame_status[4] == "1" ) {
make_image($frame_status); }
# print_r($frame_status);
if ( $frame_status[4] == "2" ) {
pass_image($frame_status); }
makexml() ;
?>

Anpassen des Scripts an lokales Netzwerk, siehe Beginn des Scripts

Eintrag des RSS Feeds im Bilderrahmen als Foto-RSS

W1020.jpg

Beispiel der Anzeige auf dem digitalen Bilderrahmen

PictuerFrame-1.jpg

Restart des ganzen Systems; Bilderrahmen, und Server.

Nach restart von fhem mit telnet …. Eingabe von:

setstate frame /work/www/pgm7/blumen.pic,52.jpg,3,4,2,52,7,53,5

dabei ist

/work/www/pgm7/blumen.pic   Verzeichnis der Hintergrundbilder
52.jpg            Aktuelles Hintergrundbild
3               Zähler für die Nutzung des Hintergrundbildes
4               Maximale Anzahl zur Nutzung des Hintergrundbildes; 
               hier wird festgelegt, wie lange das Hintergrundbild 
               verwendet werden soll. 
               Mit der Eingabe von 4 wird das Bild erst nach 4 maligem
               Refresh des RSS Feeds gewechselt.
1               Typ der Darstellung, mit (1) 
               oder ohne (2) Temperaturen.
               Dies kann über die Fernbedienung ( siehe Punkt 3 )
               geändert werden.
52              Momentan verwendetes Hintergrundbild im Verzeichnis
7               Momentan verwendetes Verzeichnis für Hintergrundbilder;
               Dies kann über die Fernbedienung ( Siehe Punkt 3 ) 
               geändert werden. 
               Taste 3 = 1. Verzeichnis, 
               Taste 4 = 2. Verzeichnis
               .....
53              Maximale Anzahl Hintergrundbilder im Verzeichnis
5               Maximale Anzahl Verzeichnisse mit Hintergrundbildern

Mit Hilfe der Fernbedienung die unter Punkt 3. definiert wurde kann man nun den Bilderrahmen einstellen

Einstellung:
Taste 1 Zeige     Bilder mit eingeblendeten Temperaturen
Taste 2 Zeige     Bilder ohne Temperaturen
Taste 3 – Taste 8   Schaltet auf ein anderes Verzeichnis mit Hintergrund Bildern um</code>