Infodisplay Linux-Rechner

Aus FHEMWiki
Wechseln zu: Navigation, Suche
DPF auf Basis eines Appotech Prozessors als Info-Diplay mit LCD4Linux und DPFHack an Fhem. Datum, Zeit sowie Status eines FHT80TF-2 und Wert eines Ultraschallsensor in einer Zisterne werden durch LCD4Linux abgefragt und im Display dargestellt, außerdem werden Google Weather Daten über Fhem abgefragt und im Display dargestellt.

Motivation

Für meine Fhem-Installation suchte ich ein kleines billiges Statusdisplay, welches beim Verlassen des Hauses eine Reihe von Informationen liefern kann.

Beim Versender Pearl fand sich ein passendes Display für unter 10 Euro, welches sich über lcd4linux an eine Fritzbox oder einen *NIX-/Linux-Rechner anbinden lässt (mittlerweile ist dieses Display dort nicht mehr verfügbar, es gibt aber eine ganze Reihe funktionierender Alternativen, siehe hier oder auch detaillierter im Sourecforge Repository).

Die Anleitung zum Hacken des Rahmens und weitere Infos gibt es hier.

Eine Anleitung mit diversen Links für die Fritzbox findet sich hier.

Der Code dazu findet sich inzwischen auch bei Sourceforge unter [1]

Aktuelle Infos' bei dem der dieses Display (und inzwischen viele andere gehackt hat): [2]

Eine einsatzbereite Binary-Datei für die Fritz!Box und die Raspberry Pi kann man inzwischen hier im FHEM SVN herunterladen.

Projektlog

Start

Das folgende Kochrezept ist unter debian lenny (mittlerweile auch squeeze) getestet. Ziel des Projektes ist es, z.B. den Status von Fensterkontakten beim Verlassen des Hauses prüfen zu können und ggf. weitere nette Informationen (z.B. Wettervorhersage, Müllabfuhrkalender) dort anzuzeigen.

erste Versuche

Das Display [3] ist gestern gekommen, die mitbestellte Gratis-Taschenlampe (Artikel-Nummer GRA-16629-901 oder ein anderer Gratis-Artikel, dann entfällt der Mindermengenzuschlag) auch. Das Display ist winzig und sollte erst einmal eine Weile geladen werden. Achtung: Am besten gleich ein Mini-USB-Kabel mitbestellen, das beiliegende (unbedingt entsorgen!) taugt gar nichts (zu geringer Querschnitt, mangelnde Stromversorgung, dadurch wacklige Device-Erkennung). Irgendwo im Dunstkreis der u.g. Anleitung steht, dass man den China-Akku entfernen sollte. Dies sollte unterbleiben (der Akku-Pack enthält eine winzige Einzelzellenüberwachung und die Ursache für das Stabilitätsproblem ist das Kabel), da sonst das Display jedesmal nach einem Reboot / kurzer Spannungsausfall von Hand in den Debug-Modus gesetzt werden muss.

Nach dem Hack des Displays (unter Windows, Binaries im VDR-Portal, ging am schnellsten) habe ich mir dann die Dateien für i386/Linux aus den Einzelanleitungen zusammengestoppelt.

Die Anleitung unter [4] ist für armel, daher an Stelle von sdcc_2.9.0-5_armel.deb das entsprechenden Paket für i386 sdcc_2.9.0-5_i386.deb suchen.

Eigentlich braucht man den Kram zum Hacken des Displays nicht vollständig, wenn man dieses vorher unter Windows gehackt hat [6] des dpfhack und lcd4linux notwendig. Damit das richtig funzt sollte man die in der Anleitung genannten udev rules verwenden. Ansonsten gibt es beim Anschalten eine Fehlermeldung.

Das Display funktioniert, nur ist noch der Font zu klein (6x8). Abhilfe schafft hier der sogenannte lcd4linux-scaletext-dpf.patch aus dem VDR-Portal, den ich mir mal erlaubt habe, hierein zu kopieren. [7]

diff -rupN --exclude=.svn --exclude='*.log' --exclude=Makefile --exclude='*.m4' --exclude='*.in' --exclude=autom4te.cache --exclude='config*' --exclude='*.Po' --exclude='*.sh' lcd4linux/drv_dpf.c lcd4linux.1/drv_dpf.c
--- lcd4linux/drv_dpf.c	2011-11-14 14:41:40.859787820 +0100
+++ lcd4linux.1/drv_dpf.c	2011-11-13 14:42:58.650315817 +0100
@@ -160,12 +160,26 @@ static int drv_dpf_start2(const char *se
 	}
 
 	/* Fixme: provider other fonts someday... */
-	if (XRES != 6 && YRES != 8) {
+	/* Overridden - we have scaled the textout drawing */
+/*	if (XRES != 6 && YRES != 8) {
 		error("%s: bad Font '%s' from %s (only 6x8 at the moment)",
 			Name, s, cfg_source());
 		return -1;
+	} */
+
+	/* we dont want fonts below 6 width */
+	if (XRES <6) {
+		error("%s: bad Font '%s' width '%d' using minimum of 6)",
+			Name,s,XRES);
+		XRES = 6;
 	}
 
+    /* we dont want fonts below 8 height */
+    if (YRES <8) {
+        error("%s: bad Font '%s' height '%d' using minimum of 8)",
+            Name,s,YRES);
+        YRES = 8;
+    }
 
 	/* open communication with the display */
 	if (drv_dpf_open(section) < 0) {
diff -rupN --exclude=.svn --exclude='*.log' --exclude=Makefile --exclude='*.m4' --exclude='*.in' --exclude=autom4te.cache --exclude='config*' --exclude='*.Po' --exclude='*.sh' lcd4linux/drv_generic_graphic.c lcd4linux.1/drv_generic_graphic.c
--- lcd4linux/drv_generic_graphic.c	2011-11-14 14:41:40.614375417 +0100
+++ lcd4linux.1/drv_generic_graphic.c	2011-11-14 14:58:29.303285793 +0100
@@ -259,15 +259,18 @@ static void drv_generic_graphic_render(c
 	}
 
 	for (y = 0; y < YRES; y++) {
-	  int mask = 1 << XRES;
+
 	  for (x = 0; x < XRES; x++) {
-		mask >>= 1;
-		if (chr[y] & mask)
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;
-		else
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;
+		int mask = 1 << 6;
+		mask >>= ((x*6)/(XRES))+1;
+        if (chr[(y*8)/(YRES)] & mask)
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = fg;
+        else
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = bg;
+
 	  }
 	}
+
 	c += XRES;
 	txt++;
   }

Diesen kopieren wir mit dem Dateinamen lcd4linux-scaletext-dpf.patch in das Verzeichnis ~/dpf/lcd4linux und wenden ihn mit

patch -p1 < lcd4linux-scaletext-dpf.patch

an.

Mit diesem patch bauen wir lcd4linux nochmals neu, dazu rufen wir

make

auf und dann

cd ..
make clean
make
./build-dpf-lcd4linux.sh

Dann daran denken, dass lcd4linux nicht mehr laufen sollte, daher

killall lcd4linux

Wer noch keine lcd4linux.conf im /etc Verzeichnis hat, sollte die nun spätestens anlagen. Danach noch die Rechte und den Eigentümer/Gruppe korrekt setzen:

chmod 600 /etc/lcd4linux.conf
chown root.root /etc/lcd4linux.conf

Und anschließend (wenn keine Fehlermeldung gekommen war) noch ein

cp lcd4linux/lcd4linux /usr/local/bin/lcd4linux

Nun können wir den Font in der Sektion Display in /etc/lcd4linux.conf ändern

vi /etc/lcd4linux.conf

Display dpf { Driver 'DPF' Port 'usb0' # Font '6x8' Font '12x16' Foreground 'ffffff' Background '000000' Basecolor '000066' } Details zur lcd4linux.conf unter [8]

Nun rufen wir mit angeschlossenem und gehacktem Display

lcd4linux -F

auf. Kommt dabei keine Fehlermeldung beenden wir mit <CRTL>-<C>, bauen die udev-Regeln entsprechend [9] in das System ein und ziehen das Display für ca. 10 Sekunden ab. Anschließend stecken wir es an, dann sollte eine sinnvolle Ausgabe kommen.

Ausgabe des Fensterstatus eines FHT80TF-2

noch etwas quick&dirty:

Dazu nutzen wir das exec-plugin von lcd4linux

Mit diesem rufen wir ein Shell-Skript namens "fenster" auf. Dieses besteht aus einer Codezeile (hier der Lesbarkeit wegen mit einem Zeilenumbruch):

/usr/bin/fhem.pl 7072 'list CUL_FHTTK_b1987b STATE' |awk '/CUL/ \
{printf("%s \n",$2)}'|sed -e 's/Closed/ist zu/'

Derzeit erfasse ich genau einen FHT80TF-2 ! Vielleicht kann ja einer der hier anwesenden Perl-Freaks da mal so eine nette Schleife einbauen, die den Status aller bekannten FHT80TF-2 abfragt. ;-)

Das Skript gibt genau "geschlossen" zurück wenn das Fenster zu ist. Ansonsten "Open" (muss ich noch schöner machen ;-) ).

Als nächstes brauchen wir in der Datei /etc/lcd4linux (neu anlegen, Rechte auf 600, Eigentümer auf root setzen) folgende Einträge:

# Definition des Displays
Display dpf {
  Driver   'DPF'
  Port    'usb0'
#   Durch den scaletext-patch aus dem VDR-Portal können wir nun einen größeren Font als 8x6 nutzen
  Font    '12x32'
  Foreground 'ffffff'
  Background '000000'
  Basecolor '000066'
}
# Definition des Fensterstatus-Widgets
Widget Fenster {
  class 'Text'
  prefix 'Fenster'
#   Skript /root/fenster alle 100 Sekunden ausführen
  expression exec('/root/fenster', 100000)
  width 20
  align 'R'
#   Display alle 10 Sekunden updaten
  update 10000
}
# Layout-Definition
Layout Default {
  Row1 {
    Col1 'Fenster'
  }
}
Display 'DPF'
#Für Debugging-Zwecke Kommentar entfernen und den DPF-Eintrag auskommentieren 
#sowie lcd4linux -F aufrufen
#
#Display 'Curses'
Layout 'Default'

Damit wird nun der Status alle 100 Sekunden bei fhem ausgelesen und alle 10 Sekunden die Anzeige aktualisiert.

Einbinden von Wetterinformationen

Hinweis: Inzwischen funktioniert Google Weather nicht mehr. Daher muss man auf yahoo o.ä. ausweichen. Vorgehensweise ähnlich. Ich poste das mal, sobald ich wieder Zeit habe ;-) Die Wetterinformationen bekommen wir mit dem Fhem-Modul Weather. Dieses liest in bestimmten Abständen die Daten eines Ortes aus Google Weather aus.

Wir definieren daher in der fhem.cfg folgende Zeile(n), wobei eigentlich nur die erste notwendig ist:

define wx Weather "Ilmenau,TH" 1800 de
attr wx room Wetter
define FileLog_wx FileLog /var/log/fhem/wx-%Y.log wx
attr FileLog_wx logtype text
attr FileLog_wx room Wetter

Nach dem Speichern der fhem.cfg können wir nun über fhem auf die (alle 1800 Sekunden von Google abgefragten) Werte (im Beispiel für die Stadt Ilmenau in Thüringen) zugreifen:

get wx temp_c

liefert z.B. die Ausgabe der aktuellen Temperatur in °C

wx temp_c => -1

Es ist also gerade -1°C.

Im Verzeichnis "/root/" legen wir nun ein Subdirectory "wetter" an und legen dort ein Skript "hole_wetter" mit folgendem Inhalt an:

fhem.pl 7072 'get wx fc0_high_c;get wx fc0_low_c;get wx temp_c;get wx condition;get wx humidity; \
get wx wind_condition;get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition; \
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;quit'

Das Skript fragt mit netcat also alle uns interessierenden Wettervariablen der Google-Abfrage ab und schreibt diese auf die STDOUT. Dies sollte in 3 Sekunden geschehen (-w 3). Würde man alle Variablen einzeln abfragen, dauert jede Abfrage mindestens 1 Sekunde und es würde zu Verklemmungen führen, das exec-Plugin von lcd4linux (und mit diesem lcd4linux selbst) hängt sich in diesem Fall einfach auf.

Um Fhem alle 5 Minuten abzufragen ergänzen wir folgenden Eintrag in der crontab:

*/5 * * * * sh /root/wetter/hole_wetter > /root/wetter/wx

In der Datei /root/wetter/wx stehen nun immer die aktuellen Wetterwerte (es sei denn, die Internet-Verbindung funktioniert gerade mal nicht, dann ist diese leer).

Diese sieht dann wie folgt aus:

lenny:~/wetter# more wx
wx fc0_high_c => 3
wx fc0_low_c => -1
wx temp_c => -1
wx condition => Meistens bewölkt
wx humidity => Luftfeuchtigkeit: 93 %
wx wind_condition => Wind: W mit 14 km/h
wx fc1_high_c => 7
wx fc1_low_c => 1
wx fc1_condition => Vereinzelt Schnee
wx fc2_high_c => 5
wx fc2_low_c => 1
wx fc2_condition => Vereinzelt Regen
lenny:~/wetter#

Nun müssen wir diese Datei noch die Rechte "600" setzen, damit lcd4linux diese verarbeitet.

chmod 600 wx

Für jede der Variablen legen wir nun ein eigenes Skript im Verzeichnis an, welches die Rechte 700 bekommt, für die aktuelle Temperatur z.B. ein Skript "temp" mit folgendem Inhalt:

grep ' temp_c' /root/wetter/wx|awk '{printf("%d°C\n",$4)}'

Damit gibt das Skript nun folgendes aus:

-1°C

Es ist Geschmacksfrage, ob man die Einheit hier mit ausgeben lässt, oder diese im Postfix von lcd4linux angibt (dazu mehr weiter unten).

Eine Besonderheit sind die "condition"-Skripte, diese geben einige durch Leerzeichen getrennte Worte aus, sodass man hier nicht nur $4 in awk angeben muss, sondern einfach ein paar mehr Variablen vorsieht, z.B. für das Skript "wind_condition" 5 Stück:

grep ' wind_condition' /root/wetter/wx |awk '{print $4,$5,$6,$7,$8}'

Damit werden auch mehrere Worte korrekt ausgegeben, z.B.:

Wind: W mit 14 km/h

Mit diesen Vorbereitungen haben wir nun die Voraussetzungen geschaffen, damit lcd4linux auf die Variablen zugreifen kann. Dabei muss man nämlich wissen, dass jeder Wert in lcd4linux in einem eigenen Widget adressiert wird.

Meine /etc/lcd4linux.conf (muss ebenfalls die Rechte 600 haben) sieht nun mit den Wetterdaten wie folgt aus:

Display curses {
  Driver   'Curses'
  Size    '26x20'
}
Display DPF {
  Driver   'DPF'
  Port    'usb0'
#  Font    '6x8'
  Font    '12x16'
  Foreground 'ffffff'
  Background '000066'
  Basecolor '000066'
}
Widget Time {
  class 'Text'
  expression strftime('%d.%m.%G %H:%M',time())
  width 20
  align 'C'
  update 10000
}
Widget Zisterne {
  class 'Text'
  prefix 'Zisternenfuellstand'
  expression exec('/root/zisterne', 100000)
  postfix ' cm'
  width 26
  align 'R'
  update 20000
}
Widget Fenster {
  class 'Text'
  prefix 'Fenster '
  expression exec('/root/fenster', 100000)
  width 26
  align 'R'
  update 20000
}
Widget Temp {
  class 'Text'
  prefix 'Temp '
  expression exec('/root/wetter/temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget Min_Temp {
  class 'Text'
  prefix 'Min '
  expression exec('/root/wetter/min_temp', 3000000)
  width 9
  align 'L'
  update 20000
}
Widget Max_Temp {
  class 'Text'
  prefix 'Max '
  expression exec('/root/wetter/max_temp', 3000000)
  width 9
  align 'L'
  update 20000
}
Widget Cond {
  class 'Text'
  expression exec('/root/wetter/condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget Wind_Cond {
  class 'Text'
  expression exec('/root/wetter/wind_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget Morgen {
  class 'Text'
  expression 'Morgen '
  width 9
  align 'L'
  update 0
}
Widget fc1_Min_Temp {
  class 'Text'
  prefix 'Min '
  expression exec('/root/wetter/fc1_min_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc1_Max_Temp {
  class 'Text'
  prefix 'Max '
  expression exec('/root/wetter/fc1_max_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc1_Cond {
  class 'Text'
  expression exec('/root/wetter/fc1_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget Uebermorgen {
  class 'Text'
  expression 'Ueberm. '
  width 9
  align 'L'
  update 20000
}
Widget fc2_Min_Temp {
  class 'Text'
  prefix 'Min '
  expression exec('/root/wetter/fc2_min_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc2_Max_Temp {
  class 'Text'
  prefix 'Max '
  expression exec('/root/wetter/fc2_max_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc2_Cond {
  class 'Text'
  expression exec('/root/wetter/fc2_condition',300000)
  width 26
  align 'L'
  update 20000
}
 
Layout Default {
  Row1 {
    Col1 'Time'
  }
  Row3 {
    Col1 'Zisterne'
  }
  Row4 {
    Col1 'Fenster'
  }
  Row6 {
    Col1 'Temp'
    Col9 'Min_Temp'
    Col19 'Max_Temp'
  }
  Row7.Col5 'Cond'
  Row8.Col5 'Wind_Cond'
  Row10 {
    Col1 'Morgen'
    Col9 'fc1_Min_Temp'
    Col19 'fc1_Max_Temp'
  }
  Row11.Col1 'fc1_Cond'
  Row13 {
    Col1 'Uebermorgen'
    Col9 'fc2_Min_Temp'
    Col19 'fc2_Max_Temp'
  }
  Row14.Col1 'fc2_Cond'
}
Variables {
  tick 1000
  tack 500
  minute 60000
}
Display 'DPF'
#Display 'Curses'
Layout 'Default'

lcd4linux fragt damit nun alle 300 Sekunden die Werte aus dem Zwischenspeicher (der Datei "wx") ab und aktualisiert die jeweilige Displayanzeige alle 20 Sekunden. Das reicht für den Einsatzzweck vollkommen aus.

Das Ergebnis dieser Abfragen ist nun im Bild dieses Beitrages zu sehen.

Einbinden von Wettergrafiken (Symbolbilder)

Zuerst sollte man mal lt. hackfin [10] ein

apt-get install libgd2-noxpm-dev

absetzen. Damit wird sichergestellt, dass die libgd2-noxpm beim Compilieren einbezogen wird und Grafiken überhaupt angezeigt werden können. Vorher bekommt man nämlich die Nachricht beim Aufruf von

lcd4linux -F

mit einem Image-Widet in der lcd4linux.conf die Nachricht, dass "Image" "not supported class" sei :-(

Dann also nochmals alles kompilieren. Das heißt:

cd dpf
make clean
./build-dpf-lcd4linux.sh
make
cd lcd4linux
patch -p1 <lcd4linux-scaletext-dpf.patch
make
cp lcd4linux /usr/local/bin/lcd4linux
lcd4linux -F

Dann sollte die Klasse "Image" beaknnt sein und eine in der

/etc/lcd4linux.conf

angegebene Grafik auch angezeigt werden.

Nun kommen wir dazu, das Wetterskript so anzupassen, dass auch die Grafiken korrekt heruntergeladen werden. Da diese als *.gif vorliegen unser Rähmchen aber nur *.png kann, brauchen dazu noch das Paket convert aus dem Paket imagemagick, also geben wir auf unserer Kommandozeile ein:

apt-get install imagemagick

Unser hole_wetter-Skript passen wir dann wie folgt an:

# Fhem-Variablen auslesen
fhem.pl 7072 'get wx fc0_high_c;get wx fc0_low_c;get wx fc0_condition;get wx fc0_day_of_week; \
get wx temp_c;get wx condition;get wx fc0_icon;get wx humidity;get wx wind_condition; \
get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition;get wx fc1_day_of_week;get wx fc1_icon; \
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;get wx fc2_day_of_week;get wx fc2_icon;' \
> /root/wetter/wx
# Wetter-Icon von heute holen
URL=$(fhem.pl 7072 'get wx fc0_icon'|awk '{printf("www.google.de%s\n", $4)}')
wget "$URL" -O /root/wetter/wx_icons/fc0_icon.gif
# Wetter-Icon von morgen holen
URL=$(fhem.pl 7072 'get wx fc1_icon'|awk '{printf("www.google.de%s\n", $4)}')
wget "$URL" -O /root/wetter/wx_icons/fc1_icon.gif
# Wetter-Icon von uebermorgen holen
URL=$(fhem.pl 'get wx fc2_icon'|awk '{printf("www.google.de%s\n", $4)}')
wget "$URL" -O /root/wetter/wx_icons/fc2_icon.gif

# nach png konvertieren fuer DPF und Rechte auf 600 setzefuer lcd4linux
for i in *.gif; do convert "$i" "${i%.gif}.png" ; done
chmod 600 *

Nun müssen wir noch unseren crontab Eintrag wie folgt modifizieren:

*/5 * * * * sh /root/wetter/hole_wetter

Das heißt, wir lassen die Umleitung in eine Datei weg, dies erledigt jetzt unser modifiziertes Skript!

Außerdem legen wir ein Verzeichnis wetter/wx_icons sowie drei neue Skripte an:

# wetter/fc0_icon
grep 'fc0_icon' /root/wetter/wx |awk '{print $4}'|sed 's/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g'

# wetter/fc1_icon grep 'fc1_icon' /root/wetter/wx |awk '{print $4}'|sed 's/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g' # wetter/fc2_icon grep 'fc2_icon' /root/wetter/wx |awk '{print $4}'|sed 's/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g'

Unsere /etc/lcd4linux.conf passen wir wie folgt an:

Display curses {
  Driver   'Curses'
  Size    '26x20'
}
Display DPF {
  Driver   'DPF'
  Port    'usb0'
#  Font    '6x8'
  Font    '12x16'
  Foreground 'ffffff'
  Background '000066'
  Basecolor '000066'
}
Widget Time {
  class 'Text'
  expression strftime('%d.%m.%G %H:%M',time())
  width 18
  align 'C'
  update 10000
}
#Kommentar für Ultraschall-Füllstansanzeige (separater Eintrag im Fhem-Wiki) entfernen!
#Widget Zisterne { 
#  class 'Text'
#  prefix 'Zisternenfuellstand'
#  expression (170 - exec('/root/zisterne', 100000))/155*100
#  postfix '%'
#  precision 1
#  width 26
#  align 'R'
#  update 20000
#}
Widget Fenster {
  class 'Text'
  prefix 'Fenster '
  expression exec('/root/fenster', 100000)
  width 15
  align 'L'
  update 20000
}
Widget Temp {
  class 'Text'
  expression exec('/root/wetter/temp', 300000)
  width 5
  align 'L'
  update 20000
}
Widget Min_Temp {
  class 'Text'
  prefix 'Min '
  expression exec('/root/wetter/min_temp', 3000000)
  width 9
  align 'L'
  update 20000
}
Widget Max_Temp {
  class 'Text'
  prefix 'Max '
  expression exec('/root/wetter/max_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc0_Cond {
  class 'Text'
  expression exec('/root/wetter/fc0_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget Wind_Cond {
  class 'Text'
  expression exec('/root/wetter/wind_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget fc0_Icon {
  class  'Image'
  file   '/root/wetter/wx_icons/fc0_icon.png'
  update  10000
  reload  1
  visible 1
  inverted 0
}
Widget fc1_Min_Temp {
  class 'Text'
  prefix 'Min '
  expression exec('/root/wetter/fc1_min_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc1_Max_Temp {
  class 'Text'
  prefix 'Max '
  expression exec('/root/wetter/fc1_max_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc1_Cond {
  class 'Text'
  expression exec('/root/wetter/fc1_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget FC1_Icon {
  class  'Image'
  file   '/root/wetter/wx_icons/fc1_icon.png'
  update  10000
  reload  1
  visible 1
  inverted 0
}
Widget fc2_Min_Temp {
  class 'Text'
  expression exec('/root/wetter/fc2_min_temp', 300000)
  width 7
  align 'L'
  update 20000
}
Widget fc2_Max_Temp {
  class 'Text'
  prefix ' bis '
  expression exec('/root/wetter/fc2_max_temp', 300000)
  width 9
  align 'L'
  update 20000
}
Widget fc2_Cond {
  class 'Text'
  expression exec('/root/wetter/fc2_condition',300000)
  width 26
  align 'L'
  update 20000
}
Widget FC2_Icon {
  class  'Image'
  file   '/root/wetter/wx_icons/fc2_icon.png'
  update  10000
  reload  1
  visible 1
  inverted 0
}
Widget dummy {
  class 'text'
  expression 
  visible 0
  width 0
  update 20000
}
Layout Default {
  Row1 {
    Col1 'Time'
    Col20 'Temp'
  }
  Row3 {
    Col1 'Fenster'
  }
  Row4 {
#    Col1 'Zisterne'
  }
#  Row5.Col1 'dummy' # notwendig, da sonst wegen Prozentzeichen von Zisterne keine Ausgabe
  Row6 {
    Col5 'fc0_cond'
  }
  Row7 {
    Col5 'Min_Temp'
    Col16 'Max_Temp'
  }
  Row8.Col5 'Wind_Cond'
  Row10 {
    Col5 'fc1_Cond'
  }
  Row11 {
    Col5 'fc1_Min_Temp'
    Col16 'fc1_Max_Temp'
  }
  Row13 {
    Col5 'fc2_Cond'
  }
  Row14 {
    Col5 'fc1_Min_Temp'
    Col16 'fc1_Max_Temp'
  }
  Layer 2 {
    X85.Y5 'FC0_icon'
    X145.Y5 'FC1_icon'
    X192.Y5 'FC2_icon'
  }
}
Variables {
  tick 1000
  tack 500
  minute 60000
}
Display 'DPF'
#Display 'Curses'
Layout 'Default'

Außerdem müssen für diese Modifikation die Skripte fc*_condition wie folgt angepasst werden (Beispiel fc0_condition):

grep 'fc0_day_of_week' /root/wetter/wx|awk '{printf("%s: ",$4)}'
grep 'fc0_condition' /root/wetter/wx|awk '{printf("%s %s\n",$4,$5)}'

Damit werden nun statt "Heute", "Morgen" und "Ueberm." die Wochentage von Google angezeigt und es ist mehr Platz für die Ausgabe der Wetterbedingungen.

Einbinden der Zisternenanzeige mit Ultraschallsensor

Ist man Besitzer des Ultraschallsensor, kann man das dort angegebene Skript zur Abfrage einfach in das Verzeichnis /root/ kopieren und dessen Rechte auf '700' setzen. Entfernt man nun in der /etc/lcd4linux.conf das Widget Zisterne und die zugehörige Zeile im Layot-Abschnitt die Kommentarzeichen, wird der Zisternenfüllstand in % (bei mir ist der Abstand Sensor bis Boden ca. 170 cm und beim maximalen Füllstand gibt das Sensorskript 15cm aus) unter dem Fensterstatus angegeben. Dieser Wert ist ein Füllstanswert und entspricht nicht dem prozentualen Volumen. Wer dieses berechnen will, muss die Formel nach [11] verwenden.

Müllkalender

Einen einfachen Müllkalender kann man mit dem Progrämmchen calcurse realisieren

apt-get install calcurse

Dort importiert man die Mülltermine (Serien gehen auch!) als ics-Dateien. Die Termine sollten einen kurzen sprechenden Inhalt haben z.B. "Gelber Sack". Import mit folgendem Befehl

calcurse -i dateiname.ics

Dann legt man in /root eine Datei mit dem Namen "muell" mit folgendem Inhalt an:

calcurse -d 2|awk '/*/ {print "+++ " $2 " " $3 " " $4 " " $5 " +++"}'

Damit werden die Texte der in den nächsten 2 Tagen anstehenden Termine ausgegeben. Das Skript /root/muell noch schnell mit den korrekten Rechten versehen

chmod 700 /root/muell

und anschließend in die /etc/lcd4linux.conf einen neuen Widget-Eintrag hinzufügen, z.B.

Widget Muell {
  class 'Text'
  expression exec('/root/muell', 100000)
  Foreground 'FF0000'
  width 26
  align 'M'
  speed 250
  update 10000
}

(Bei diesem Widget-Eintrag haben wir nun eine rote Vordergrundfarbe und eine Laufschrift. Dadurch nimmt man die "Mülltonnen-Erinnerung" eher wahr als bei statischem Text.)

Im Bereich Layout in dieser Datei muss noch die Zeile

Row5.Col1 'Muell'

ergänzt werden.

Schon wird die Müllabfuhr 2 Tage vorher in Zeile 5 des Displays angezeigt.

bekannte Probleme

keine mehr.

Viel Spaß beim Nachbau / Verbessern! --Mick (Diskussion) 06:30, 18. Jan. 2012 (CET)