Billiglösung Informationstafel

Vorwort:

Einen digitalen Bilderrahmen wollte ich schon immer haben. Beim Kauf stand aber noch nicht fest, dass ich den auch über das Netzwerk verfügbar haben möchte. Eines Tages ist dann das Außenthermometer des Wohnzimmers kaputt gegangen und ich habe mir Gedanken gemacht, wie ich denn jetzt an meine Außentemperatur gelange. Ich habe  mich dann an Bilderrahmen erinnert, die auch die Wetterinformationen angezeigt hatten. Mit etwas Recherche bin ich dann bei einem Fritz-WLAN-Stick hängen geblieben, den man als USB-Speicher-Stick verwenden kann. Nach etwas rumgetüfftel hab ich mich ans Programmieren gemacht und bin mit dem Ergebnis zufrieden …

Das Ergebnis:

Jedes 5te, angezeigte Bild ist ein Informationsbild.

Statusinformationen

angezeigt werden:

  • die „momentane“ Temperatur (max 30min alt)
  • die min/max-Temperatur der nächsten 2 Tage
  • Termine der nächsten 5 Tage
  • die letzten 5 Anrufe

Hardware:

  • Agfaphoto AF 5077PS
  • Fritzbox 7270
  • Fritz!WLAN USB Stick

Agfaphoto AF 5077PS

Es ist ein stinknormaler, digitaler Bilderrahmen, der weder über LAN noch über WLAN-Schnittstelle zu befüttern ist. Er besitzt eine Auflösung von 800×600 und kann zeitgesteuert ein- und ausgeschaltet werden. Der Bilderrahmen kann per SD-Karte oder per USB-Stick mit Daten gefüttert werden.

Fritzbox 7270

Die Schaltzentral zum Internet :)

Fritz!WLAN USB STick

Der WLAN-Stick, der den Bilderrahmen netzwerktauglich macht.

Software:

  • spezielle Labor-Firmware der Fritzbox (wird leider nicht mehr angeboten)
  • Perl (zum Basteln des Infobildes)

grobe Funktionsübersicht

Der Bilderrahmen holt sich die Bilder über den Fritz-WLAN-Stick von der Fritzbox. Das Verzeichnis auf der Fritzbox ist über das heimische Netz per FTP frei zugänglich.  Die Bilder auf der Fritzbox sind von 1000 bis xxxx durchnummeriert und jedes 5te Bild wurde nummerierungstechnisch ausgelassen, zB gibt es die Bilder 1003.jpg, 1004.jpg, 1006.jpg. Bild 1005.jpg, 1010.jpg sind dann die „Status“-Bilder. Ich habe mir ein paar Skripte geschrieben, die mir a.) die Daten von den Wetterseiten holen und b.) Bilder mit diesen Daten dynamisch zusammenstellt.

Nachfolgend nehme ich mal die Skripte auseinander … ABER ACHTUNG: Ich bin kein Informatiker, die Skripte sind Quick’n’Dirty von mir zusammengebastelt.

Wetterbild erstellen

Vorgeplänkel: Variablen setzen

#!/usr/bin/perl -w
use GD;
use DBI;
use Net::FTP;
my $pfad1=“/usr/src/scripte/cache/“;
my $datei1=“wetter.xml“;
my $cache1=“$pfad1″.“$datei1″;
my $cache2=“$pfad1″.“$datei1″.“_1″;
my $pfad2=“/var/www/wetter/Bilder/“;
my $temp1=““;
my $temp2=““;
my @cache1=();
my @cache2=();
my @cache3=();
my $zaehler1=0;
my $dateipfad=““;
my $xml=““;
SOAPREQUEST();
VERARBEITUNG();
BILDERZEUGEN();
BILDHOCHLADEN();

XML-Wetter-Datei für Hamburg bei Google abholen

sub SOAPREQUEST{
system(„curl -s \“http://www.google.com/ig/api?weather=%22Hamburg%22&hl=de\“ > $cache1″);
system(„iconv –from-code=ISO-8859-1 –to-code=UTF-8 $cache1 –output=$cache2“);
system(„mv $cache2 $cache1“);
}

abgeholte Datei verarbeiten und in Variablen packen

sub VERARBEITUNG{
open(INPUTDATEI,“$cache1″);
while($temp1=){
chomp($temp1);
$temp2=“$temp2″.“$temp1″;
}
close(INPUTDATEI);
@cache2=split(„\<„,$temp2); foreach $temp1 (@cache2){ if (length($temp1) > 1){
$temp1=~ s/\/\>//g;
$temp1=~ s/\>//g;
$temp1=~ s/\“//g;
@cache3=split(„=“,$temp1);
if ($cache3[0] eq „day_of_week data“){
$zaehler1=$zaehler1+10;
if ($cache3[1] eq „Mo.“){
$cache3[1]=“Montag“;
}
elsif ($cache3[1] eq „Di.“){
$cache3[1]=“Dienstag“;
}
elsif ($cache3[1] eq „Mi.“){
$cache3[1]=“Mittwoch“;
}
elsif ($cache3[1] eq „Do.“){
$cache3[1]=“Donnerstag“;
}
elsif ($cache3[1] eq „Fr.“){
$cache3[1]=“Freitag“;
}
elsif ($cache3[1] eq „Sa.“){
$cache3[1]=“Samstag“;
}
elsif ($cache3[1] eq „So.“){
$cache3[1]=“Sonntag“;
}
$tagname[$zaehler1+1]=$cache3[1];
}
if ($cache3[0] eq „low data“){
$tagmin[$zaehler1+1]=$cache3[1];
}
elsif ($cache3[0] eq „temp_c data“){
$nowtemp=$cache3[1];
}
elsif ($cache3[0] eq „humidity data“){
$nowhum=$cache3[1];
}
elsif ($cache3[0] eq „wind_condition data“){
$nowwind=$cache3[1];
}
elsif ($cache3[0] eq „high data“){
$tagmax[$zaehler1+1]=$cache3[1];
}
elsif ($cache3[0] eq „condition data“){
$tagbem[$zaehler1+1]=$cache3[1];
}
elsif ($cache3[0] eq „icon data“){
@cache1=split(„/“,$cache3[1]);
$tagicon[$zaehler1+1]=$cache1[4];
$dateipfad=“$pfad2″.“$tagicon[$zaehler1+1]“;
if (-e $dateipfad){
}
else{
system („wget -O $dateipfad http://www.google.com$cache3[1]“);
}
}
}
}
}

aus den gefüllten Daten wird jetzt ein Bild gebastelt …

sub BILDERZEUGEN{
my $bild = new GD::Image(800,600);
my $black = $bild->colorAllocate(0,0,0);
my $white = $bild->colorAllocate(255,255,255);
my $gray = $bild->colorAllocate(200,200,200);
my $blau = $bild->colorAllocate(0,0,255);
my $rot = $bild->colorAllocate(255,0,0);
my $bildbg = newFromJpeg GD::Image(„/var/www/wetter/Bilder/felge.jpg“);
my $bildbg2 = newFromJpeg GD::Image(„/var/www/wetter/Bilder/felge_2.jpg“);
my $bildicon1 = newFromGif GD::Image („$pfad2$tagicon[1]“);
my $bildicon2 = newFromGif GD::Image („$pfad2$tagicon[11]“);
my $bildicon3 = newFromGif GD::Image („$pfad2$tagicon[21]“);
my $bildicon4 = newFromGif GD::Image („$pfad2$tagicon[31]“);
my $bildicon5 = newFromGif GD::Image („$pfad2$tagicon[41]“);
# copy(**Bild**,Ziel-x,Ziel-y,Quelle-x,Quelle-y,Quelle-breite,Quelle-höhe)
$bild->copy($bildbg,0,0,0,0,800,600);
$bild->filledRectangle(44,44,755,555,$black);
$bild->copy($bildbg2,45,45,0,0,710,510);
# filledRectangle(x1,y1,x2,y2)
$bild->filledRectangle(60,90,182,212,$white);
$bild->filledRectangle(58,88,181,211,$black);
$bild->filledRectangle(460,90,501,131,$white);
$bild->filledRectangle(459,89,500,130,$black);
$bild->filledRectangle(460,215,501,256,$white);
$bild->filledRectangle(459,214,500,255,$black);
$bild->filledRectangle(460,340,501,381,$white);
$bild->filledRectangle(459,339,500,380,$black);
$bild->filledRectangle(460,465,501,506,$white);
$bild->filledRectangle(459,464,500,505,$black);
# copyResized(**Bild**,Ziel-x,Ziel-y,Quelle-x,Quelle-y,Ziel-breite,Ziel-höhe,Quelle-breite,Quelle-höhe)
$bild->copyResized($bildicon1,60,90,0,0,120,120,40,40);
$bild->copyResized($bildicon2,460,90,0,0,40,40,40,40);
$bild->copyResized($bildicon3,460,215,0,0,40,40,40,40);
$bild->copyResized($bildicon4,460,340,0,0,40,40,40,40);
$bild->copyResized($bildicon5,460,465,0,0,40,40,40,40);
# stringFT(Farbe,Font_Pfad,Grösse,Ziel-x,Ziel-y,“Text“)
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,22,0,60,75,“aktuell:“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,16,0,450,72,“$tagname[11]:“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,16,0,450,197,“$tagname[21]:“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,16,0,450,322,“$tagname[31]:“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,16,0,450,447,“$tagname[41]:“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,58,0,210,170,“$nowtemp“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,22,0,60,260,“$tagbem[1]“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,20,0,60,300,“$nowhum“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,20,0,60,330,“$nowwind“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,105,“$tagbem[11]“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,230,“$tagbem[21]“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,355,“$tagbem[31]“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,480,“$tagbem[41]“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,125,“max:“);
$bild->stringFT($rot,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,125,“$tagmax[11]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,250,“max:“);
$bild->stringFT($rot,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,250,“$tagmax[21]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,375,“max:“);
$bild->stringFT($rot,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,375,“$tagmax[31]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,500,“max:“);
$bild->stringFT($rot,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,500,“$tagmax[41]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,145,“min:“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,145,“$tagmin[11]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,270,“min:“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,270,“$tagmin[21]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,395,“min:“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,395,“$tagmin[31]“.chr(176).“C“);
$bild->stringFT($black,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,12,0,520,520,“min:“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSans.ttf“,14,0,560,520,“$tagmin[41]“.chr(176).“C“);
$bild->stringFT($white,“/usr/share/fonts/truetype/freefont/FreeSansBold.ttf“,14,0,611,591,“asterisk-hamburg.de“);
$bild->stringFT($white,“/usr/share/fonts/truetype/freefont/FreeSansBold.ttf“,10,0,11,591,“Quelle: www.google.de“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSansBold.ttf“,14,0,610,590,“asterisk-hamburg.de“);
$bild->stringFT($blau,“/usr/share/fonts/truetype/freefont/FreeSansBold.ttf“,10,0,10,590,“Datenquelle: www.google.de“);
open (AUSGABEFILE,“>/var/www/wetter.jpg“);
print AUSGABEFILE $bild->jpeg;
close (AUSGABEFILE);
}

das erzeugte Bild muss jetzt nur noch auf die Fritzbox…

sub BILDHOCHLADEN{
my $ftp = Net::FTP->new(„192.168.178.1“, Debug => 0) or die „Cannot connect to fritzbox: $@“;
$ftp->login(„ftpuser“,““) or die „Cannot login „, $ftp->message;
$ftp->cwd(„/USB-Stick“) or die „Cannot change working directory „, $ftp->message;
$ftp->binary;
$ftp->put(„/var/www/wetter.jpg“,“0005a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0010a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0015a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0020a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0025a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0030a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0035a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0040a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0045a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0050a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0055a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0060a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0065a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0070a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0075a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0080a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0085a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0090a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0095a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0100a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0105a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0110a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0115a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0120a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0125a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0130a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0135a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0140a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0145a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0150a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0155a.JPG“);
$ftp->put(„/var/www/wetter.jpg“,“0160a.JPG“);
$ftp->quit;
}
Kommentar schreiben

0 Kommentare.

Kommentar schreiben


Hinweis - Du kannst dies benutzenHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>