<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mick</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mick"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Mick"/>
	<updated>2026-05-01T02:46:17Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ultraschallsensor&amp;diff=3015</id>
		<title>Ultraschallsensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ultraschallsensor&amp;diff=3015"/>
		<updated>2013-10-01T02:22:01Z</updated>

		<summary type="html">&lt;p&gt;Mick: /* Digital */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Srf06.jpg|300px|right|thumb|SRF06 Ansicht fertig bestückte Platine (Bild robot-electronics.co.uk)]]&lt;br /&gt;
&lt;br /&gt;
= Analog =&lt;br /&gt;
Bei [http://www.robot-electronics.co.uk/acatalog/Ultrasonic_Rangers.html SRF06 - 4-20mA Current Loop Ultrasonic Range Finder]&lt;br /&gt;
Dieser stellt je nach Messweite einen Ausgangsstrom von 4-20mA bereit. Mittels A/D Wandler (1wire, zb. DS2438) kann das Signal bequem eingelesen werden.&lt;br /&gt;
Deutsche Distributoren sind zb:&lt;br /&gt;
&lt;br /&gt;
[http://www.exp-tech.de/Sensoren/SRF06-4-20mA-Current-Loop-Ultrasonic-Ranger-Finder.html http://www.exp-tech.de/Sensoren/SRF06-4-20mA-Current-Loop-Ultrasonic-Ranger-Finder.html]&lt;br /&gt;
&lt;br /&gt;
[http://de.manu-systems.com/SRF06.shtml http://de.manu-systems.com/SRF06.shtml]&lt;br /&gt;
&lt;br /&gt;
[http://www.lipoly.de/index.php?main_page=product_info&amp;amp;amp;cPath=880_2631_2632&amp;amp;amp;products_id=161191 http://www.lipoly.de/index.php?main_page=product_info&amp;amp;amp;cPath=880_2631_2632&amp;amp;amp;products_id=161191]&lt;br /&gt;
&lt;br /&gt;
[http://nodna.de/Devantech-SRF06-Current-Loop-Ultraschall-Sensor http://nodna.de/Devantech-SRF06-Current-Loop-Ultraschall-Sensor]&lt;br /&gt;
&lt;br /&gt;
nach folgendem Plan wird der Sensor an einen A/D Wandler angeschlossen, das originale Manual ist [http://www.robot-electronics.co.uk/htm/srf06tech.htm hier] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Srf06_connect.gif|460px|center|SRF06 Beschaltungsplan (Bild robot-electronics.co.uk)]]&lt;br /&gt;
&lt;br /&gt;
= Digital =&lt;br /&gt;
Bei [http://www.icplan.de] habe ich den [http://www.icplan.de/seite21.htm Minisensor] (Achtung, wird nicht mehr gebaut, Drucksonde als Alternative dort verfügbar) geordert, um diesen über eine serielle Schnittstelle (Pegelwandlung erforderlich, z.B. mit separater Platine vom selben Hersteller) abzufragen.&lt;br /&gt;
&lt;br /&gt;
In Abhängigkeit des Füllstandes soll dieser mit &lt;br /&gt;
[http://www.pollin.de/shop/dt/MTQ5OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_AVR_NET_IO.html] über Ethersex/[[ECMD]]] ein  Magnetventil zur Nachspeisung schalten. Damit soll ein Trockenlaufen der Pumpe vermieden werden und auch in Trockenzeiten Wasser über die Brauchwasserleitung zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Das Protokoll ist ziemlich einfach (5 Ziffern im Abstand von ca. 100 ms senden und die Ausgabe des Sensors seriell einlesen), sodass eine Verarbeitung mit Fhem, Nagios/Icinga oder Cacti jederzeit möglich ist.&lt;br /&gt;
&lt;br /&gt;
Durch den (Mindest-)Abstand von 100 ms zwischen den Zeichen verbietet sich der Einsatz von ECMD, da dieses Modul die Zeichen immer mit der vollen Baudrate sendet und bisher kein &amp;quot;Pausenzeichen&amp;quot; (delay) dort möglich ist.&lt;br /&gt;
&lt;br /&gt;
Deshalb habe ich ein kleines (aber nicht sehr elegantes) Pearl-Skript für die serielle Schnittstelle geschrieben, welches momentan zwar im Verzeichnis /usr/share/fhem/FHEM/ liegt, aber noch nicht in FHEM eingebunden ist. Ich verwende dieses aber bereits für das [[Statusdisplay]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Falls es jemand hinbekommt, über ECMD die 100ms Pausenzeiten zwischen den Zeichen zu setzen, kann man die Sensoren direkt aus fhem ohne das Skript abfragen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
#  Ultrasonic sensor value retrieval using Mini3-Sensor from icplan.de &lt;br /&gt;
#  Copyright (C) 2011 Jens Wagner&lt;br /&gt;
#  &lt;br /&gt;
#  This program is free software: you can redistribute it and/or modify&lt;br /&gt;
#  it under the terms of the GNU General Public License as published by&lt;br /&gt;
#  the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
#  (at your option) any later version.&lt;br /&gt;
#&lt;br /&gt;
#  This program is distributed in the hope that it will be useful,&lt;br /&gt;
#  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
#  GNU General Public License for more details.&lt;br /&gt;
#&lt;br /&gt;
#  You should have received a copy of the GNU General Public License&lt;br /&gt;
#  along with this program. If not, see &amp;amp;lt;[http://www.gnu.org/licenses/ http://www.gnu.org/licenses/]&amp;amp;gt;.&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
use Device::SerialPort; &lt;br /&gt;
#&lt;br /&gt;
my $seriel = Device::SerialPort-&amp;amp;gt;new(&#039;/dev/ttyS1&#039;) || die &amp;quot;Kann /dev/ttyS1 nicht öffnen! ($!)\n&amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
$seriel-&amp;amp;gt;baudrate(9600);&lt;br /&gt;
$seriel-&amp;amp;gt;parity(&amp;quot;none&amp;quot;);&lt;br /&gt;
$seriel-&amp;amp;gt;databits(8);&lt;br /&gt;
$seriel-&amp;amp;gt;stopbits(1);&lt;br /&gt;
#&lt;br /&gt;
print &amp;quot;Entfernung Sensor 1: &amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;1&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;2&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
$|=1;&lt;br /&gt;
my $exit=0;&lt;br /&gt;
while($exit &amp;amp;lt; 2000)&lt;br /&gt;
{&lt;br /&gt;
my ($cin, $sin) = $seriel-&amp;amp;gt;read(1);&lt;br /&gt;
if($cin)&lt;br /&gt;
{&lt;br /&gt;
 print $sin;&lt;br /&gt;
 $exit=0;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{$exit++}&lt;br /&gt;
}&lt;br /&gt;
print &amp;quot;\n&amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
exit(0);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Verwendet man an Stelle der Zeichenfolge &#039;1 2 0 0 0&#039; die Zeichenfolge &#039;1 1 0 0 0&#039; bekommt man die Temperatur des Sensors angezeigt.&lt;br /&gt;
&lt;br /&gt;
Das Skript muss zwingend verbessert werden, da derzeit nur der Abstand in cm zum Wasserspiegel ausgegeben wird und nicht das enthaltene Volumen. Hierzu braucht man entweder (da meist liegende Zylinder oder Kugeln zum Einsatz kommen) etwas Mathematik oder man nutzt eine Tabelle in Form einer CSV-Datei. Ich habe bereits letzteres in Vorbereitung aber noch nicht in das Skript eingebaut.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ultraschallsensor&amp;diff=3014</id>
		<title>Ultraschallsensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ultraschallsensor&amp;diff=3014"/>
		<updated>2013-10-01T02:21:05Z</updated>

		<summary type="html">&lt;p&gt;Mick: Versuch der Wiederherstellung der Ursprungsversion nach Wiki-Crash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Srf06.jpg|300px|right|thumb|SRF06 Ansicht fertig bestückte Platine (Bild robot-electronics.co.uk)]]&lt;br /&gt;
&lt;br /&gt;
= Analog =&lt;br /&gt;
Bei [http://www.robot-electronics.co.uk/acatalog/Ultrasonic_Rangers.html SRF06 - 4-20mA Current Loop Ultrasonic Range Finder]&lt;br /&gt;
Dieser stellt je nach Messweite einen Ausgangsstrom von 4-20mA bereit. Mittels A/D Wandler (1wire, zb. DS2438) kann das Signal bequem eingelesen werden.&lt;br /&gt;
Deutsche Distributoren sind zb:&lt;br /&gt;
&lt;br /&gt;
[http://www.exp-tech.de/Sensoren/SRF06-4-20mA-Current-Loop-Ultrasonic-Ranger-Finder.html http://www.exp-tech.de/Sensoren/SRF06-4-20mA-Current-Loop-Ultrasonic-Ranger-Finder.html]&lt;br /&gt;
&lt;br /&gt;
[http://de.manu-systems.com/SRF06.shtml http://de.manu-systems.com/SRF06.shtml]&lt;br /&gt;
&lt;br /&gt;
[http://www.lipoly.de/index.php?main_page=product_info&amp;amp;amp;cPath=880_2631_2632&amp;amp;amp;products_id=161191 http://www.lipoly.de/index.php?main_page=product_info&amp;amp;amp;cPath=880_2631_2632&amp;amp;amp;products_id=161191]&lt;br /&gt;
&lt;br /&gt;
[http://nodna.de/Devantech-SRF06-Current-Loop-Ultraschall-Sensor http://nodna.de/Devantech-SRF06-Current-Loop-Ultraschall-Sensor]&lt;br /&gt;
&lt;br /&gt;
nach folgendem Plan wird der Sensor an einen A/D Wandler angeschlossen, das originale Manual ist [http://www.robot-electronics.co.uk/htm/srf06tech.htm hier] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Srf06_connect.gif|460px|center|SRF06 Beschaltungsplan (Bild robot-electronics.co.uk)]]&lt;br /&gt;
&lt;br /&gt;
= Digital =&lt;br /&gt;
Bei [www.icplan.de] habe ich den [http://www.icplan.de/seite21.htm Minisensor] (Achtung, wird nicht mehr gebaut, Drucksonde als Alternative dort verfügbar) geordert, um diesen über eine serielle Schnittstelle (Pegelwandlung erforderlich, z.B. mit separater Platine vom selben Hersteller) abzufragen.&lt;br /&gt;
&lt;br /&gt;
In Abhängigkeit des Füllstandes soll dieser mit &lt;br /&gt;
[http://www.pollin.de/shop/dt/MTQ5OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_AVR_NET_IO.html] über Ethersex/[[ECMD]]] ein  Magnetventil zur Nachspeisung schalten. Damit soll ein Trockenlaufen der Pumpe vermieden werden und auch in Trockenzeiten Wasser über die Brauchwasserleitung zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Das Protokoll ist ziemlich einfach (5 Ziffern im Abstand von ca. 100 ms senden und die Ausgabe des Sensors seriell einlesen), sodass eine Verarbeitung mit Fhem, Nagios/Icinga oder Cacti jederzeit möglich ist.&lt;br /&gt;
&lt;br /&gt;
Durch den (Mindest-)Abstand von 100 ms zwischen den Zeichen verbietet sich der Einsatz von ECMD, da dieses Modul die Zeichen immer mit der vollen Baudrate sendet und bisher kein &amp;quot;Pausenzeichen&amp;quot; (delay) dort möglich ist.&lt;br /&gt;
&lt;br /&gt;
Deshalb habe ich ein kleines (aber nicht sehr elegantes) Pearl-Skript für die serielle Schnittstelle geschrieben, welches momentan zwar im Verzeichnis /usr/share/fhem/FHEM/ liegt, aber noch nicht in FHEM eingebunden ist. Ich verwende dieses aber bereits für das [[Statusdisplay]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Anmerkung: Falls es jemand hinbekommt, über ECMD die 100ms Pausenzeiten zwischen den Zeichen zu setzen, kann man die Sensoren direkt aus fhem ohne das Skript abfragen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
#  Ultrasonic sensor value retrieval using Mini3-Sensor from icplan.de &lt;br /&gt;
#  Copyright (C) 2011 Jens Wagner&lt;br /&gt;
#  &lt;br /&gt;
#  This program is free software: you can redistribute it and/or modify&lt;br /&gt;
#  it under the terms of the GNU General Public License as published by&lt;br /&gt;
#  the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
#  (at your option) any later version.&lt;br /&gt;
#&lt;br /&gt;
#  This program is distributed in the hope that it will be useful,&lt;br /&gt;
#  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
#  GNU General Public License for more details.&lt;br /&gt;
#&lt;br /&gt;
#  You should have received a copy of the GNU General Public License&lt;br /&gt;
#  along with this program. If not, see &amp;amp;lt;[http://www.gnu.org/licenses/ http://www.gnu.org/licenses/]&amp;amp;gt;.&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
use Device::SerialPort; &lt;br /&gt;
#&lt;br /&gt;
my $seriel = Device::SerialPort-&amp;amp;gt;new(&#039;/dev/ttyS1&#039;) || die &amp;quot;Kann /dev/ttyS1 nicht öffnen! ($!)\n&amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
$seriel-&amp;amp;gt;baudrate(9600);&lt;br /&gt;
$seriel-&amp;amp;gt;parity(&amp;quot;none&amp;quot;);&lt;br /&gt;
$seriel-&amp;amp;gt;databits(8);&lt;br /&gt;
$seriel-&amp;amp;gt;stopbits(1);&lt;br /&gt;
#&lt;br /&gt;
print &amp;quot;Entfernung Sensor 1: &amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;1&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;2&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
select(undef, undef, undef, 0.2);&lt;br /&gt;
$seriel-&amp;amp;gt;write(&#039;0&#039;);&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
$|=1;&lt;br /&gt;
my $exit=0;&lt;br /&gt;
while($exit &amp;amp;lt; 2000)&lt;br /&gt;
{&lt;br /&gt;
my ($cin, $sin) = $seriel-&amp;amp;gt;read(1);&lt;br /&gt;
if($cin)&lt;br /&gt;
{&lt;br /&gt;
 print $sin;&lt;br /&gt;
 $exit=0;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{$exit++}&lt;br /&gt;
}&lt;br /&gt;
print &amp;quot;\n&amp;quot;;&lt;br /&gt;
#&lt;br /&gt;
exit(0);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Verwendet man an Stelle der Zeichenfolge &#039;1 2 0 0 0&#039; die Zeichenfolge &#039;1 1 0 0 0&#039; bekommt man die Temperatur des Sensors angezeigt.&lt;br /&gt;
&lt;br /&gt;
Das Skript muss zwingend verbessert werden, da derzeit nur der Abstand in cm zum Wasserspiegel ausgegeben wird und nicht das enthaltene Volumen. Hierzu braucht man entweder (da meist liegende Zylinder oder Kugeln zum Einsatz kommen) etwas Mathematik oder man nutzt eine Tabelle in Form einer CSV-Datei. Ich habe bereits letzteres in Vorbereitung aber noch nicht in das Skript eingebaut.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3013</id>
		<title>Infodisplay Linux-Rechner</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3013"/>
		<updated>2013-10-01T02:07:44Z</updated>

		<summary type="html">&lt;p&gt;Mick: /* Motivation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Infodisplay.png|400px|mini|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.]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Für meine Fhem-Installation suchte ich ein kleines billiges Statusdisplay, welches beim Verlassen des Hauses eine Reihe von Informationen liefern kann. &lt;br /&gt;
&lt;br /&gt;
Beim Versender [http://www.pearl.de/a-HPM1184-5618.shtml Pearl] fand sich ein passendes Display für unter 10 Euro, welches sich über [http://ssl.bulix.org/projects/lcd4linux/ 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 [http://picframe.spritesserver.nl/wiki/index.php/DPF_with_AppoTech_AX206#Supported_Devices_.28Aug_2012.29 hier] oder auch detaillierter im [http://dpf-ax.svn.sourceforge.net/viewvc/dpf-ax/ Sourecforge Repository]).&lt;br /&gt;
&lt;br /&gt;
Die Anleitung zum Hacken des Rahmens und weitere Infos gibt es [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung mit diversen Links für die Fritzbox findet sich [http://thomasheinz.net/lcd-an-fritzbox-mit-lcd4linux-und-digitalen-bilderrahmen-von-pearl/ hier].&lt;br /&gt;
&lt;br /&gt;
Der Code dazu findet sich inzwischen auch bei Sourceforge unter&lt;br /&gt;
[http://dpf-ax.svn.sourceforge.net/viewvc/dpf-ax/trunk/ [1]]&lt;br /&gt;
&lt;br /&gt;
Aktuelle Infos&#039; bei dem der dieses Display (und inzwischen viele andere gehackt hat):&lt;br /&gt;
[http://tech.section5.ch/news/?p=150 [2]]&lt;br /&gt;
&lt;br /&gt;
== Projektlog ==&lt;br /&gt;
=== Start ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== erste Versuche ===&lt;br /&gt;
Das Display [http://www.pearl.de/product.jsp?pdid=HPM1184&amp;amp;amp;catid=5618&amp;amp;amp;what=2 [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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Anleitung unter [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [4]] ist für armel, daher an Stelle von sdcc_2.9.0-5_armel.deb&lt;br /&gt;
das entsprechenden Paket für i386 sdcc_2.9.0-5_i386.deb suchen.&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht man den Kram zum Hacken des Displays nicht vollständig, wenn man dieses vorher unter Windows gehackt hat [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/comment-page-1/ [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.&lt;br /&gt;
&lt;br /&gt;
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. [http://www.vdr-portal.de/board18-vdr-hardware/board11-lcds/p1041355-pearl-display-textskalierung-unter-lcd4linux/ [7]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_dpf.c lcd4linux.1/drv_dpf.c&lt;br /&gt;
--- lcd4linux/drv_dpf.c	2011-11-14 14:41:40.859787820 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_dpf.c	2011-11-13 14:42:58.650315817 +0100&lt;br /&gt;
@@ -160,12 +160,26 @@ static int drv_dpf_start2(const char *se&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/* Fixme: provider other fonts someday... */&lt;br /&gt;
-	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
+	/* Overridden - we have scaled the textout drawing */&lt;br /&gt;
+/*	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
 		error(&amp;quot;%s: bad Font &#039;%s&#039; from&amp;amp;#160;%s (only 6x8 at the moment)&amp;quot;,&lt;br /&gt;
 			Name, s, cfg_source());&lt;br /&gt;
 		return -1;&lt;br /&gt;
+	} */&lt;br /&gt;
+&lt;br /&gt;
+	/* we dont want fonts below 6 width */&lt;br /&gt;
+	if (XRES &amp;amp;lt;6) {&lt;br /&gt;
+		error(&amp;quot;%s: bad Font &#039;%s&#039; width &#039;%d&#039; using minimum of 6)&amp;quot;,&lt;br /&gt;
+			Name,s,XRES);&lt;br /&gt;
+		XRES = 6;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
+    /* we dont want fonts below 8 height */&lt;br /&gt;
+    if (YRES &amp;amp;lt;8) {&lt;br /&gt;
+        error(&amp;quot;%s: bad Font &#039;%s&#039; height &#039;%d&#039; using minimum of 8)&amp;quot;,&lt;br /&gt;
+            Name,s,YRES);&lt;br /&gt;
+        YRES = 8;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
 	/* open communication with the display */&lt;br /&gt;
 	if (drv_dpf_open(section) &amp;amp;lt; 0) {&lt;br /&gt;
diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_generic_graphic.c lcd4linux.1/drv_generic_graphic.c&lt;br /&gt;
--- lcd4linux/drv_generic_graphic.c	2011-11-14 14:41:40.614375417 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_generic_graphic.c	2011-11-14 14:58:29.303285793 +0100&lt;br /&gt;
@@ -259,15 +259,18 @@ static void drv_generic_graphic_render(c&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	for (y = 0; y &amp;amp;lt; YRES; y++) {&lt;br /&gt;
-	  int mask = 1 &amp;amp;lt;&amp;amp;lt; XRES;&lt;br /&gt;
+&lt;br /&gt;
 	  for (x = 0; x &amp;amp;lt; XRES; x++) {&lt;br /&gt;
-		mask &amp;amp;gt;&amp;amp;gt;= 1;&lt;br /&gt;
-		if (chr[y] &amp;amp;amp; mask)&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;&lt;br /&gt;
-		else&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;&lt;br /&gt;
+		int mask = 1 &amp;amp;lt;&amp;amp;lt; 6;&lt;br /&gt;
+		mask &amp;amp;gt;&amp;amp;gt;= ((x*6)/(XRES))+1;&lt;br /&gt;
+        if (chr[(y*8)/(YRES)] &amp;amp;amp; mask)&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = fg;&lt;br /&gt;
+        else&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = bg;&lt;br /&gt;
+&lt;br /&gt;
 	  }&lt;br /&gt;
 	}&lt;br /&gt;
+&lt;br /&gt;
 	c += XRES;&lt;br /&gt;
 	txt++;&lt;br /&gt;
   }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Diesen kopieren wir mit dem Dateinamen lcd4linux-scaletext-dpf.patch in das Verzeichnis ~/dpf/lcd4linux und wenden ihn mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;patch -p1 &amp;amp;lt; lcd4linux-scaletext-dpf.patch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Mit diesem patch bauen wir lcd4linux nochmals neu, dazu rufen wir &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf und dann &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ..&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
./build-dpf-lcd4linux.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann daran denken, dass lcd4linux nicht mehr laufen sollte, daher&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;killall lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 /etc/lcd4linux.conf&lt;br /&gt;
chown root.root /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Und anschließend (wenn keine Fehlermeldung gekommen war) noch ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cp lcd4linux/lcd4linux /usr/local/bin/lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun können wir den Font in der Sektion Display in /etc/lcd4linux.conf ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;vi /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Details zur lcd4linux.conf unter [http://ssl.bulix.org/projects/lcd4linux/wiki/Howto_de [8]]&lt;br /&gt;
&lt;br /&gt;
Nun rufen wir mit angeschlossenem und gehacktem Display &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf. Kommt dabei keine Fehlermeldung beenden wir mit &amp;amp;lt;CRTL&amp;amp;gt;-&amp;amp;lt;C&amp;amp;gt;, bauen die udev-Regeln entsprechend [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [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.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Fensterstatus eines FHT80TF-2 ===&lt;br /&gt;
noch etwas quick&amp;amp;amp;dirty:&lt;br /&gt;
&lt;br /&gt;
Dazu nutzen wir das exec-plugin von lcd4linux&lt;br /&gt;
&lt;br /&gt;
Mit diesem rufen wir ein Shell-Skript namens &amp;quot;fenster&amp;quot; auf. Dieses besteht aus einer Codezeile (hier der Lesbarkeit wegen mit einem Zeilenumbruch):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/usr/bin/fhem.pl 7072 &#039;list CUL_FHTTK_b1987b STATE&#039; |awk &#039;/CUL/ \&lt;br /&gt;
{printf(&amp;quot;%s \n&amp;quot;,$2)}&#039;|sed -e &#039;s/Closed/ist zu/&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Derzeit erfasse ich genau einen FHT80TF-2&amp;amp;#160;! Vielleicht kann ja einer der hier anwesenden Perl-Freaks da mal so eine nette Schleife einbauen, die den Status aller bekannten FHT80TF-2 abfragt.&amp;amp;#160;;-)&lt;br /&gt;
&lt;br /&gt;
Das Skript gibt genau &amp;quot;geschlossen&amp;quot; zurück wenn das Fenster zu ist. Ansonsten &amp;quot;Open&amp;quot; (muss ich noch schöner machen&amp;amp;#160;;-) ).&lt;br /&gt;
&lt;br /&gt;
Als nächstes brauchen wir in der Datei /etc/lcd4linux (neu anlegen, Rechte auf 600, Eigentümer auf root setzen) folgende Einträge:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Definition des Displays&lt;br /&gt;
Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#   Durch den scaletext-patch aus dem VDR-Portal können wir nun einen größeren Font als 8x6 nutzen&lt;br /&gt;
  Font    &#039;12x32&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
# Definition des Fensterstatus-Widgets&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster&#039;&lt;br /&gt;
#   Skript /root/fenster alle 100 Sekunden ausführen&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
#   Display alle 10 Sekunden updaten&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
# Layout-Definition&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Für Debugging-Zwecke Kommentar entfernen und den DPF-Eintrag auskommentieren &lt;br /&gt;
#sowie lcd4linux -F aufrufen&lt;br /&gt;
#&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit wird nun der Status alle 100 Sekunden bei fhem ausgelesen und alle 10 Sekunden die Anzeige aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wetterinformationen ===&lt;br /&gt;
&#039;&#039;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&amp;amp;#160;;-)&#039;&#039;&lt;br /&gt;
Die Wetterinformationen bekommen wir mit dem Fhem-Modul Weather. Dieses liest in bestimmten Abständen die Daten eines Ortes aus Google Weather aus.&lt;br /&gt;
&lt;br /&gt;
Wir definieren daher in der fhem.cfg folgende Zeile(n), wobei eigentlich nur die erste notwendig ist:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wx Weather &amp;quot;Ilmenau,TH&amp;quot; 1800 de&lt;br /&gt;
attr wx room Wetter&lt;br /&gt;
define FileLog_wx FileLog /var/log/fhem/wx-%Y.log wx&lt;br /&gt;
attr FileLog_wx logtype text&lt;br /&gt;
attr FileLog_wx room Wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;get wx temp_c&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
liefert z.B. die Ausgabe der aktuellen Temperatur in °C&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;wx temp_c =&amp;amp;gt; -1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist also gerade -1°C.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/root/&amp;quot; legen wir nun ein Subdirectory &amp;quot;wetter&amp;quot; an und legen dort ein Skript &amp;quot;hole_wetter&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx temp_c;get wx condition;get wx humidity; \&lt;br /&gt;
get wx wind_condition;get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;quit&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um Fhem alle 5 Minuten abzufragen ergänzen wir folgenden Eintrag in der crontab:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter &amp;amp;gt; /root/wetter/wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Diese sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lenny:~/wetter# more wx&lt;br /&gt;
wx fc0_high_c =&amp;amp;gt; 3&lt;br /&gt;
wx fc0_low_c =&amp;amp;gt; -1&lt;br /&gt;
wx temp_c =&amp;amp;gt; -1&lt;br /&gt;
wx condition =&amp;amp;gt; Meistens bewölkt&lt;br /&gt;
wx humidity =&amp;amp;gt; Luftfeuchtigkeit: 93&amp;amp;#160;%&lt;br /&gt;
wx wind_condition =&amp;amp;gt; Wind: W mit 14 km/h&lt;br /&gt;
wx fc1_high_c =&amp;amp;gt; 7&lt;br /&gt;
wx fc1_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc1_condition =&amp;amp;gt; Vereinzelt Schnee&lt;br /&gt;
wx fc2_high_c =&amp;amp;gt; 5&lt;br /&gt;
wx fc2_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc2_condition =&amp;amp;gt; Vereinzelt Regen&lt;br /&gt;
lenny:~/wetter#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir diese Datei noch die Rechte &amp;quot;600&amp;quot; setzen, damit lcd4linux diese verarbeitet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &amp;quot;temp&amp;quot; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; temp_c&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%d°C\n&amp;quot;,$4)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit gibt das Skript nun folgendes aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-1°C&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist Geschmacksfrage, ob man die Einheit hier mit ausgeben lässt, oder diese im Postfix von lcd4linux angibt (dazu mehr weiter unten).&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit sind die &amp;quot;condition&amp;quot;-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 &amp;quot;wind_condition&amp;quot; 5 Stück:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; wind_condition&#039; /root/wetter/wx |awk &#039;{print $4,$5,$6,$7,$8}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden auch mehrere Worte korrekt ausgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Wind: W mit 14 km/h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Meine /etc/lcd4linux.conf (muss ebenfalls die Rechte 600 haben) sieht nun mit den Wetterdaten wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
Widget Zisterne {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
  expression exec(&#039;/root/zisterne&#039;, 100000)&lt;br /&gt;
  postfix &#039; cm&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Temp &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Morgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Morgen &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Uebermorgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Ueberm. &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col1 &#039;Temp&#039;&lt;br /&gt;
    Col9 &#039;Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7.Col5 &#039;Cond&#039;&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col1 &#039;Morgen&#039;&lt;br /&gt;
    Col9 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11.Col1 &#039;fc1_Cond&#039;&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col1 &#039;Uebermorgen&#039;&lt;br /&gt;
    Col9 &#039;fc2_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc2_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14.Col1 &#039;fc2_Cond&#039;&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
lcd4linux fragt damit nun alle 300 Sekunden die Werte aus dem Zwischenspeicher (der Datei &amp;quot;wx&amp;quot;) ab und aktualisiert die jeweilige Displayanzeige alle 20 Sekunden. Das reicht für den Einsatzzweck vollkommen aus.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Abfragen ist nun im Bild dieses Beitrages zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wettergrafiken (Symbolbilder) ===&lt;br /&gt;
Zuerst sollte man mal lt. hackfin [http://forum.doozan.com/read.php?2,2435,4139#msg-4139 [10]] ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install libgd2-noxpm-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit einem Image-Widet in der lcd4linux.conf die Nachricht, dass &amp;quot;Image&amp;quot; &amp;quot;not supported class&amp;quot; sei&amp;amp;#160;:-(&lt;br /&gt;
&lt;br /&gt;
Dann also nochmals alles kompilieren. Das heißt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd dpf&lt;br /&gt;
make clean&lt;br /&gt;
./build-dpf-lcd4linux.sh&lt;br /&gt;
make&lt;br /&gt;
cd lcd4linux&lt;br /&gt;
patch -p1 &amp;amp;lt;lcd4linux-scaletext-dpf.patch&lt;br /&gt;
make&lt;br /&gt;
cp lcd4linux /usr/local/bin/lcd4linux&lt;br /&gt;
lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann sollte die Klasse &amp;quot;Image&amp;quot; beaknnt sein und eine in der &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
angegebene Grafik auch angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install imagemagick&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Unser hole_wetter-Skript passen wir dann wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Fhem-Variablen auslesen&lt;br /&gt;
fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx fc0_condition;get wx fc0_day_of_week; \&lt;br /&gt;
get wx temp_c;get wx condition;get wx fc0_icon;get wx humidity;get wx wind_condition; \&lt;br /&gt;
get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition;get wx fc1_day_of_week;get wx fc1_icon; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;get wx fc2_day_of_week;get wx fc2_icon;&#039; \&lt;br /&gt;
&amp;amp;gt; /root/wetter/wx&lt;br /&gt;
# Wetter-Icon von heute holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc0_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc0_icon.gif&lt;br /&gt;
# Wetter-Icon von morgen holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc1_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc1_icon.gif&lt;br /&gt;
# Wetter-Icon von uebermorgen holen&lt;br /&gt;
URL=$(fhem.pl &#039;get wx fc2_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc2_icon.gif&lt;br /&gt;
&lt;br /&gt;
# nach png konvertieren fuer DPF und Rechte auf 600 setzefuer lcd4linux&lt;br /&gt;
for i in *.gif; do convert &amp;quot;$i&amp;quot; &amp;quot;${i%.gif}.png&amp;quot;&amp;amp;#160;; done&lt;br /&gt;
chmod 600 *&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir noch unseren crontab Eintrag wie folgt modifizieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Das heißt, wir lassen die Umleitung in eine Datei weg, dies erledigt jetzt unser modifiziertes Skript!&lt;br /&gt;
&lt;br /&gt;
Außerdem legen wir ein Verzeichnis wetter/wx_icons sowie drei neue Skripte an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# wetter/fc0_icon&lt;br /&gt;
grep &#039;fc0_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc1_icon&lt;br /&gt;
grep &#039;fc1_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc2_icon&lt;br /&gt;
grep &#039;fc2_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unsere /etc/lcd4linux.conf passen wir wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 18&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
#Kommentar für Ultraschall-Füllstansanzeige (separater Eintrag im Fhem-Wiki) entfernen!&lt;br /&gt;
#Widget Zisterne { &lt;br /&gt;
#  class &#039;Text&#039;&lt;br /&gt;
#  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
#  expression (170 - exec(&#039;/root/zisterne&#039;, 100000))/155*100&lt;br /&gt;
#  postfix &#039;%&#039;&lt;br /&gt;
#  precision 1&lt;br /&gt;
#  width 26&lt;br /&gt;
#  align &#039;R&#039;&lt;br /&gt;
#  update 20000&lt;br /&gt;
#}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 15&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 5&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc0_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc0_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC1_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc1_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 7&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039; bis &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC2_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc2_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget dummy {&lt;br /&gt;
  class &#039;text&#039;&lt;br /&gt;
  expression &lt;br /&gt;
  visible 0&lt;br /&gt;
  width 0&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
    Col20 &#039;Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
#    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
#  Row5.Col1 &#039;dummy&#039; # notwendig, da sonst wegen Prozentzeichen von Zisterne keine Ausgabe&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col5 &#039;fc0_cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7 {&lt;br /&gt;
    Col5 &#039;Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col5 &#039;fc1_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col5 &#039;fc2_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Layer 2 {&lt;br /&gt;
    X85.Y5 &#039;FC0_icon&#039;&lt;br /&gt;
    X145.Y5 &#039;FC1_icon&#039;&lt;br /&gt;
    X192.Y5 &#039;FC2_icon&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Außerdem müssen für diese Modifikation die Skripte fc*_condition wie folgt angepasst werden (Beispiel fc0_condition):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039;fc0_day_of_week&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s: &amp;quot;,$4)}&#039;&lt;br /&gt;
grep &#039;fc0_condition&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s&amp;amp;#160;%s\n&amp;quot;,$4,$5)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden nun statt &amp;quot;Heute&amp;quot;, &amp;quot;Morgen&amp;quot; und &amp;quot;Ueberm.&amp;quot; die Wochentage von Google angezeigt und es ist mehr Platz für die Ausgabe der Wetterbedingungen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden der Zisternenanzeige mit Ultraschallsensor ===&lt;br /&gt;
Ist man Besitzer des [[Ultraschallsensor]], kann man das dort angegebene Skript zur Abfrage einfach in das Verzeichnis /root/ kopieren und dessen Rechte auf &#039;700&#039; 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&amp;amp;#160;% (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.&lt;br /&gt;
Dieser Wert ist ein Füllstanswert und entspricht nicht dem prozentualen Volumen. Wer dieses berechnen will, muss die Formel nach [http://de.wikipedia.org/wiki/Zylinder_%28Geometrie%29#Volumenberechnung_eines_liegenden_Kreiszylinders_.28Tank-Problem.29 [11]] verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Müllkalender ===&lt;br /&gt;
Einen einfachen Müllkalender kann man mit dem Progrämmchen calcurse realisieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install calcurse&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dort importiert man die Mülltermine (Serien gehen auch!) als ics-Dateien. Die Termine sollten einen kurzen sprechenden Inhalt haben z.B. &amp;quot;Gelber Sack&amp;quot;. Import mit folgendem Befehl&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -i dateiname.ics&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann legt man in /root eine Datei mit dem Namen &amp;quot;muell&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -d 2|awk &#039;/*/ {print &amp;quot;+++ &amp;quot; $2 &amp;quot; &amp;quot; $3 &amp;quot; &amp;quot; $4 &amp;quot; &amp;quot; $5 &amp;quot; +++&amp;quot;}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden die Texte der in den nächsten 2 Tagen anstehenden Termine ausgegeben.&lt;br /&gt;
Das Skript /root/muell noch schnell mit den korrekten Rechten versehen&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 700 /root/muell&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
und anschließend in die /etc/lcd4linux.conf einen neuen Widget-Eintrag hinzufügen, z.B.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Widget Muell {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/muell&#039;, 100000)&lt;br /&gt;
  Foreground &#039;FF0000&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;M&#039;&lt;br /&gt;
  speed 250&lt;br /&gt;
  update 10000&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(Bei diesem Widget-Eintrag haben wir nun eine rote Vordergrundfarbe und eine Laufschrift. Dadurch nimmt man die &amp;quot;Mülltonnen-Erinnerung&amp;quot; eher wahr als bei statischem Text.)&lt;br /&gt;
&lt;br /&gt;
Im Bereich Layout in dieser Datei muss noch die Zeile&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Row5.Col1 &#039;Muell&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Schon wird die Müllabfuhr 2 Tage vorher in Zeile 5 des Displays angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== bekannte Probleme ===&lt;br /&gt;
keine mehr.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß beim Nachbau / Verbessern!&lt;br /&gt;
--[[Benutzer:Mick|Mick]] ([[Benutzer Diskussion:Mick|Diskussion]]) 06:30, 18. Jan. 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3012</id>
		<title>Infodisplay Linux-Rechner</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3012"/>
		<updated>2013-10-01T01:56:54Z</updated>

		<summary type="html">&lt;p&gt;Mick: /* bekannte Probleme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Infodisplay.png|400px|mini|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.]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Für meine Fhem-Installation suchte ich ein kleines billiges Statusdisplay, welches beim Verlassen des Hauses eine Reihe von Informationen liefern kann. &lt;br /&gt;
&lt;br /&gt;
Beim Versender [http://www.pearl.de/a-HPM1184-5618.shtml Pearl] fand sich ein passendes Display für unter 10 Euro, welches sich über [http://ssl.bulix.org/projects/lcd4linux/ 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).&lt;br /&gt;
&lt;br /&gt;
Die Anleitung zum Hacken des Rahmens und weitere Infos gibt es [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung mit diversen Links für die Fritzbox findet sich [http://thomasheinz.net/lcd-an-fritzbox-mit-lcd4linux-und-digitalen-bilderrahmen-von-pearl/ hier].&lt;br /&gt;
&lt;br /&gt;
Der Code dazu findet sich inzwischen auch bei Sourceforge unter&lt;br /&gt;
[http://dpf-ax.svn.sourceforge.net/viewvc/dpf-ax/trunk/ [1]]&lt;br /&gt;
&lt;br /&gt;
Aktuelle Infos&#039; bei dem der dieses Display (und inzwischen viele andere gehackt hat):&lt;br /&gt;
[http://tech.section5.ch/news/?p=150 [2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projektlog ==&lt;br /&gt;
=== Start ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== erste Versuche ===&lt;br /&gt;
Das Display [http://www.pearl.de/product.jsp?pdid=HPM1184&amp;amp;amp;catid=5618&amp;amp;amp;what=2 [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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Anleitung unter [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [4]] ist für armel, daher an Stelle von sdcc_2.9.0-5_armel.deb&lt;br /&gt;
das entsprechenden Paket für i386 sdcc_2.9.0-5_i386.deb suchen.&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht man den Kram zum Hacken des Displays nicht vollständig, wenn man dieses vorher unter Windows gehackt hat [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/comment-page-1/ [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.&lt;br /&gt;
&lt;br /&gt;
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. [http://www.vdr-portal.de/board18-vdr-hardware/board11-lcds/p1041355-pearl-display-textskalierung-unter-lcd4linux/ [7]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_dpf.c lcd4linux.1/drv_dpf.c&lt;br /&gt;
--- lcd4linux/drv_dpf.c	2011-11-14 14:41:40.859787820 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_dpf.c	2011-11-13 14:42:58.650315817 +0100&lt;br /&gt;
@@ -160,12 +160,26 @@ static int drv_dpf_start2(const char *se&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/* Fixme: provider other fonts someday... */&lt;br /&gt;
-	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
+	/* Overridden - we have scaled the textout drawing */&lt;br /&gt;
+/*	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
 		error(&amp;quot;%s: bad Font &#039;%s&#039; from&amp;amp;#160;%s (only 6x8 at the moment)&amp;quot;,&lt;br /&gt;
 			Name, s, cfg_source());&lt;br /&gt;
 		return -1;&lt;br /&gt;
+	} */&lt;br /&gt;
+&lt;br /&gt;
+	/* we dont want fonts below 6 width */&lt;br /&gt;
+	if (XRES &amp;amp;lt;6) {&lt;br /&gt;
+		error(&amp;quot;%s: bad Font &#039;%s&#039; width &#039;%d&#039; using minimum of 6)&amp;quot;,&lt;br /&gt;
+			Name,s,XRES);&lt;br /&gt;
+		XRES = 6;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
+    /* we dont want fonts below 8 height */&lt;br /&gt;
+    if (YRES &amp;amp;lt;8) {&lt;br /&gt;
+        error(&amp;quot;%s: bad Font &#039;%s&#039; height &#039;%d&#039; using minimum of 8)&amp;quot;,&lt;br /&gt;
+            Name,s,YRES);&lt;br /&gt;
+        YRES = 8;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
 	/* open communication with the display */&lt;br /&gt;
 	if (drv_dpf_open(section) &amp;amp;lt; 0) {&lt;br /&gt;
diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_generic_graphic.c lcd4linux.1/drv_generic_graphic.c&lt;br /&gt;
--- lcd4linux/drv_generic_graphic.c	2011-11-14 14:41:40.614375417 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_generic_graphic.c	2011-11-14 14:58:29.303285793 +0100&lt;br /&gt;
@@ -259,15 +259,18 @@ static void drv_generic_graphic_render(c&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	for (y = 0; y &amp;amp;lt; YRES; y++) {&lt;br /&gt;
-	  int mask = 1 &amp;amp;lt;&amp;amp;lt; XRES;&lt;br /&gt;
+&lt;br /&gt;
 	  for (x = 0; x &amp;amp;lt; XRES; x++) {&lt;br /&gt;
-		mask &amp;amp;gt;&amp;amp;gt;= 1;&lt;br /&gt;
-		if (chr[y] &amp;amp;amp; mask)&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;&lt;br /&gt;
-		else&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;&lt;br /&gt;
+		int mask = 1 &amp;amp;lt;&amp;amp;lt; 6;&lt;br /&gt;
+		mask &amp;amp;gt;&amp;amp;gt;= ((x*6)/(XRES))+1;&lt;br /&gt;
+        if (chr[(y*8)/(YRES)] &amp;amp;amp; mask)&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = fg;&lt;br /&gt;
+        else&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = bg;&lt;br /&gt;
+&lt;br /&gt;
 	  }&lt;br /&gt;
 	}&lt;br /&gt;
+&lt;br /&gt;
 	c += XRES;&lt;br /&gt;
 	txt++;&lt;br /&gt;
   }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Diesen kopieren wir mit dem Dateinamen lcd4linux-scaletext-dpf.patch in das Verzeichnis ~/dpf/lcd4linux und wenden ihn mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;patch -p1 &amp;amp;lt; lcd4linux-scaletext-dpf.patch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Mit diesem patch bauen wir lcd4linux nochmals neu, dazu rufen wir &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf und dann &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ..&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
./build-dpf-lcd4linux.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann daran denken, dass lcd4linux nicht mehr laufen sollte, daher&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;killall lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 /etc/lcd4linux.conf&lt;br /&gt;
chown root.root /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Und anschließend (wenn keine Fehlermeldung gekommen war) noch ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cp lcd4linux/lcd4linux /usr/local/bin/lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun können wir den Font in der Sektion Display in /etc/lcd4linux.conf ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;vi /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Details zur lcd4linux.conf unter [http://ssl.bulix.org/projects/lcd4linux/wiki/Howto_de [8]]&lt;br /&gt;
&lt;br /&gt;
Nun rufen wir mit angeschlossenem und gehacktem Display &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf. Kommt dabei keine Fehlermeldung beenden wir mit &amp;amp;lt;CRTL&amp;amp;gt;-&amp;amp;lt;C&amp;amp;gt;, bauen die udev-Regeln entsprechend [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [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.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Fensterstatus eines FHT80TF-2 ===&lt;br /&gt;
noch etwas quick&amp;amp;amp;dirty:&lt;br /&gt;
&lt;br /&gt;
Dazu nutzen wir das exec-plugin von lcd4linux&lt;br /&gt;
&lt;br /&gt;
Mit diesem rufen wir ein Shell-Skript namens &amp;quot;fenster&amp;quot; auf. Dieses besteht aus einer Codezeile (hier der Lesbarkeit wegen mit einem Zeilenumbruch):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/usr/bin/fhem.pl 7072 &#039;list CUL_FHTTK_b1987b STATE&#039; |awk &#039;/CUL/ \&lt;br /&gt;
{printf(&amp;quot;%s \n&amp;quot;,$2)}&#039;|sed -e &#039;s/Closed/ist zu/&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Derzeit erfasse ich genau einen FHT80TF-2&amp;amp;#160;! Vielleicht kann ja einer der hier anwesenden Perl-Freaks da mal so eine nette Schleife einbauen, die den Status aller bekannten FHT80TF-2 abfragt.&amp;amp;#160;;-)&lt;br /&gt;
&lt;br /&gt;
Das Skript gibt genau &amp;quot;geschlossen&amp;quot; zurück wenn das Fenster zu ist. Ansonsten &amp;quot;Open&amp;quot; (muss ich noch schöner machen&amp;amp;#160;;-) ).&lt;br /&gt;
&lt;br /&gt;
Als nächstes brauchen wir in der Datei /etc/lcd4linux (neu anlegen, Rechte auf 600, Eigentümer auf root setzen) folgende Einträge:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Definition des Displays&lt;br /&gt;
Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#   Durch den scaletext-patch aus dem VDR-Portal können wir nun einen größeren Font als 8x6 nutzen&lt;br /&gt;
  Font    &#039;12x32&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
# Definition des Fensterstatus-Widgets&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster&#039;&lt;br /&gt;
#   Skript /root/fenster alle 100 Sekunden ausführen&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
#   Display alle 10 Sekunden updaten&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
# Layout-Definition&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Für Debugging-Zwecke Kommentar entfernen und den DPF-Eintrag auskommentieren &lt;br /&gt;
#sowie lcd4linux -F aufrufen&lt;br /&gt;
#&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit wird nun der Status alle 100 Sekunden bei fhem ausgelesen und alle 10 Sekunden die Anzeige aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wetterinformationen ===&lt;br /&gt;
&#039;&#039;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&amp;amp;#160;;-)&#039;&#039;&lt;br /&gt;
Die Wetterinformationen bekommen wir mit dem Fhem-Modul Weather. Dieses liest in bestimmten Abständen die Daten eines Ortes aus Google Weather aus.&lt;br /&gt;
&lt;br /&gt;
Wir definieren daher in der fhem.cfg folgende Zeile(n), wobei eigentlich nur die erste notwendig ist:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wx Weather &amp;quot;Ilmenau,TH&amp;quot; 1800 de&lt;br /&gt;
attr wx room Wetter&lt;br /&gt;
define FileLog_wx FileLog /var/log/fhem/wx-%Y.log wx&lt;br /&gt;
attr FileLog_wx logtype text&lt;br /&gt;
attr FileLog_wx room Wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;get wx temp_c&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
liefert z.B. die Ausgabe der aktuellen Temperatur in °C&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;wx temp_c =&amp;amp;gt; -1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist also gerade -1°C.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/root/&amp;quot; legen wir nun ein Subdirectory &amp;quot;wetter&amp;quot; an und legen dort ein Skript &amp;quot;hole_wetter&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx temp_c;get wx condition;get wx humidity; \&lt;br /&gt;
get wx wind_condition;get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;quit&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um Fhem alle 5 Minuten abzufragen ergänzen wir folgenden Eintrag in der crontab:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter &amp;amp;gt; /root/wetter/wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Diese sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lenny:~/wetter# more wx&lt;br /&gt;
wx fc0_high_c =&amp;amp;gt; 3&lt;br /&gt;
wx fc0_low_c =&amp;amp;gt; -1&lt;br /&gt;
wx temp_c =&amp;amp;gt; -1&lt;br /&gt;
wx condition =&amp;amp;gt; Meistens bewölkt&lt;br /&gt;
wx humidity =&amp;amp;gt; Luftfeuchtigkeit: 93&amp;amp;#160;%&lt;br /&gt;
wx wind_condition =&amp;amp;gt; Wind: W mit 14 km/h&lt;br /&gt;
wx fc1_high_c =&amp;amp;gt; 7&lt;br /&gt;
wx fc1_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc1_condition =&amp;amp;gt; Vereinzelt Schnee&lt;br /&gt;
wx fc2_high_c =&amp;amp;gt; 5&lt;br /&gt;
wx fc2_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc2_condition =&amp;amp;gt; Vereinzelt Regen&lt;br /&gt;
lenny:~/wetter#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir diese Datei noch die Rechte &amp;quot;600&amp;quot; setzen, damit lcd4linux diese verarbeitet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &amp;quot;temp&amp;quot; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; temp_c&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%d°C\n&amp;quot;,$4)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit gibt das Skript nun folgendes aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-1°C&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist Geschmacksfrage, ob man die Einheit hier mit ausgeben lässt, oder diese im Postfix von lcd4linux angibt (dazu mehr weiter unten).&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit sind die &amp;quot;condition&amp;quot;-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 &amp;quot;wind_condition&amp;quot; 5 Stück:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; wind_condition&#039; /root/wetter/wx |awk &#039;{print $4,$5,$6,$7,$8}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden auch mehrere Worte korrekt ausgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Wind: W mit 14 km/h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Meine /etc/lcd4linux.conf (muss ebenfalls die Rechte 600 haben) sieht nun mit den Wetterdaten wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
Widget Zisterne {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
  expression exec(&#039;/root/zisterne&#039;, 100000)&lt;br /&gt;
  postfix &#039; cm&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Temp &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Morgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Morgen &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Uebermorgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Ueberm. &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col1 &#039;Temp&#039;&lt;br /&gt;
    Col9 &#039;Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7.Col5 &#039;Cond&#039;&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col1 &#039;Morgen&#039;&lt;br /&gt;
    Col9 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11.Col1 &#039;fc1_Cond&#039;&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col1 &#039;Uebermorgen&#039;&lt;br /&gt;
    Col9 &#039;fc2_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc2_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14.Col1 &#039;fc2_Cond&#039;&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
lcd4linux fragt damit nun alle 300 Sekunden die Werte aus dem Zwischenspeicher (der Datei &amp;quot;wx&amp;quot;) ab und aktualisiert die jeweilige Displayanzeige alle 20 Sekunden. Das reicht für den Einsatzzweck vollkommen aus.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Abfragen ist nun im Bild dieses Beitrages zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wettergrafiken (Symbolbilder) ===&lt;br /&gt;
Zuerst sollte man mal lt. hackfin [http://forum.doozan.com/read.php?2,2435,4139#msg-4139 [10]] ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install libgd2-noxpm-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit einem Image-Widet in der lcd4linux.conf die Nachricht, dass &amp;quot;Image&amp;quot; &amp;quot;not supported class&amp;quot; sei&amp;amp;#160;:-(&lt;br /&gt;
&lt;br /&gt;
Dann also nochmals alles kompilieren. Das heißt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd dpf&lt;br /&gt;
make clean&lt;br /&gt;
./build-dpf-lcd4linux.sh&lt;br /&gt;
make&lt;br /&gt;
cd lcd4linux&lt;br /&gt;
patch -p1 &amp;amp;lt;lcd4linux-scaletext-dpf.patch&lt;br /&gt;
make&lt;br /&gt;
cp lcd4linux /usr/local/bin/lcd4linux&lt;br /&gt;
lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann sollte die Klasse &amp;quot;Image&amp;quot; beaknnt sein und eine in der &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
angegebene Grafik auch angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install imagemagick&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Unser hole_wetter-Skript passen wir dann wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Fhem-Variablen auslesen&lt;br /&gt;
fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx fc0_condition;get wx fc0_day_of_week; \&lt;br /&gt;
get wx temp_c;get wx condition;get wx fc0_icon;get wx humidity;get wx wind_condition; \&lt;br /&gt;
get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition;get wx fc1_day_of_week;get wx fc1_icon; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;get wx fc2_day_of_week;get wx fc2_icon;&#039; \&lt;br /&gt;
&amp;amp;gt; /root/wetter/wx&lt;br /&gt;
# Wetter-Icon von heute holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc0_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc0_icon.gif&lt;br /&gt;
# Wetter-Icon von morgen holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc1_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc1_icon.gif&lt;br /&gt;
# Wetter-Icon von uebermorgen holen&lt;br /&gt;
URL=$(fhem.pl &#039;get wx fc2_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc2_icon.gif&lt;br /&gt;
&lt;br /&gt;
# nach png konvertieren fuer DPF und Rechte auf 600 setzefuer lcd4linux&lt;br /&gt;
for i in *.gif; do convert &amp;quot;$i&amp;quot; &amp;quot;${i%.gif}.png&amp;quot;&amp;amp;#160;; done&lt;br /&gt;
chmod 600 *&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir noch unseren crontab Eintrag wie folgt modifizieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Das heißt, wir lassen die Umleitung in eine Datei weg, dies erledigt jetzt unser modifiziertes Skript!&lt;br /&gt;
&lt;br /&gt;
Außerdem legen wir ein Verzeichnis wetter/wx_icons sowie drei neue Skripte an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# wetter/fc0_icon&lt;br /&gt;
grep &#039;fc0_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc1_icon&lt;br /&gt;
grep &#039;fc1_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc2_icon&lt;br /&gt;
grep &#039;fc2_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unsere /etc/lcd4linux.conf passen wir wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 18&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
#Kommentar für Ultraschall-Füllstansanzeige (separater Eintrag im Fhem-Wiki) entfernen!&lt;br /&gt;
#Widget Zisterne { &lt;br /&gt;
#  class &#039;Text&#039;&lt;br /&gt;
#  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
#  expression (170 - exec(&#039;/root/zisterne&#039;, 100000))/155*100&lt;br /&gt;
#  postfix &#039;%&#039;&lt;br /&gt;
#  precision 1&lt;br /&gt;
#  width 26&lt;br /&gt;
#  align &#039;R&#039;&lt;br /&gt;
#  update 20000&lt;br /&gt;
#}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 15&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 5&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc0_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc0_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC1_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc1_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 7&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039; bis &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC2_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc2_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget dummy {&lt;br /&gt;
  class &#039;text&#039;&lt;br /&gt;
  expression &lt;br /&gt;
  visible 0&lt;br /&gt;
  width 0&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
    Col20 &#039;Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
#    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
#  Row5.Col1 &#039;dummy&#039; # notwendig, da sonst wegen Prozentzeichen von Zisterne keine Ausgabe&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col5 &#039;fc0_cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7 {&lt;br /&gt;
    Col5 &#039;Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col5 &#039;fc1_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col5 &#039;fc2_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Layer 2 {&lt;br /&gt;
    X85.Y5 &#039;FC0_icon&#039;&lt;br /&gt;
    X145.Y5 &#039;FC1_icon&#039;&lt;br /&gt;
    X192.Y5 &#039;FC2_icon&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Außerdem müssen für diese Modifikation die Skripte fc*_condition wie folgt angepasst werden (Beispiel fc0_condition):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039;fc0_day_of_week&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s: &amp;quot;,$4)}&#039;&lt;br /&gt;
grep &#039;fc0_condition&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s&amp;amp;#160;%s\n&amp;quot;,$4,$5)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden nun statt &amp;quot;Heute&amp;quot;, &amp;quot;Morgen&amp;quot; und &amp;quot;Ueberm.&amp;quot; die Wochentage von Google angezeigt und es ist mehr Platz für die Ausgabe der Wetterbedingungen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden der Zisternenanzeige mit Ultraschallsensor ===&lt;br /&gt;
Ist man Besitzer des [[Ultraschallsensor]], kann man das dort angegebene Skript zur Abfrage einfach in das Verzeichnis /root/ kopieren und dessen Rechte auf &#039;700&#039; 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&amp;amp;#160;% (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.&lt;br /&gt;
Dieser Wert ist ein Füllstanswert und entspricht nicht dem prozentualen Volumen. Wer dieses berechnen will, muss die Formel nach [http://de.wikipedia.org/wiki/Zylinder_%28Geometrie%29#Volumenberechnung_eines_liegenden_Kreiszylinders_.28Tank-Problem.29 [11]] verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Müllkalender ===&lt;br /&gt;
Einen einfachen Müllkalender kann man mit dem Progrämmchen calcurse realisieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install calcurse&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dort importiert man die Mülltermine (Serien gehen auch!) als ics-Dateien. Die Termine sollten einen kurzen sprechenden Inhalt haben z.B. &amp;quot;Gelber Sack&amp;quot;. Import mit folgendem Befehl&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -i dateiname.ics&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann legt man in /root eine Datei mit dem Namen &amp;quot;muell&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -d 2|awk &#039;/*/ {print &amp;quot;+++ &amp;quot; $2 &amp;quot; &amp;quot; $3 &amp;quot; &amp;quot; $4 &amp;quot; &amp;quot; $5 &amp;quot; +++&amp;quot;}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden die Texte der in den nächsten 2 Tagen anstehenden Termine ausgegeben.&lt;br /&gt;
Das Skript /root/muell noch schnell mit den korrekten Rechten versehen&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 700 /root/muell&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
und anschließend in die /etc/lcd4linux.conf einen neuen Widget-Eintrag hinzufügen, z.B.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Widget Muell {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/muell&#039;, 100000)&lt;br /&gt;
  Foreground &#039;FF0000&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;M&#039;&lt;br /&gt;
  speed 250&lt;br /&gt;
  update 10000&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(Bei diesem Widget-Eintrag haben wir nun eine rote Vordergrundfarbe und eine Laufschrift. Dadurch nimmt man die &amp;quot;Mülltonnen-Erinnerung&amp;quot; eher wahr als bei statischem Text.)&lt;br /&gt;
&lt;br /&gt;
Im Bereich Layout in dieser Datei muss noch die Zeile&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Row5.Col1 &#039;Muell&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Schon wird die Müllabfuhr 2 Tage vorher in Zeile 5 des Displays angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== bekannte Probleme ===&lt;br /&gt;
keine mehr.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß beim Nachbau / Verbessern!&lt;br /&gt;
--[[Benutzer:Mick|Mick]] ([[Benutzer Diskussion:Mick|Diskussion]]) 06:30, 18. Jan. 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3011</id>
		<title>Infodisplay Linux-Rechner</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3011"/>
		<updated>2013-10-01T01:56:14Z</updated>

		<summary type="html">&lt;p&gt;Mick: /* bekannte Probleme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Infodisplay.png|400px|mini|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.]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Für meine Fhem-Installation suchte ich ein kleines billiges Statusdisplay, welches beim Verlassen des Hauses eine Reihe von Informationen liefern kann. &lt;br /&gt;
&lt;br /&gt;
Beim Versender [http://www.pearl.de/a-HPM1184-5618.shtml Pearl] fand sich ein passendes Display für unter 10 Euro, welches sich über [http://ssl.bulix.org/projects/lcd4linux/ 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).&lt;br /&gt;
&lt;br /&gt;
Die Anleitung zum Hacken des Rahmens und weitere Infos gibt es [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung mit diversen Links für die Fritzbox findet sich [http://thomasheinz.net/lcd-an-fritzbox-mit-lcd4linux-und-digitalen-bilderrahmen-von-pearl/ hier].&lt;br /&gt;
&lt;br /&gt;
Der Code dazu findet sich inzwischen auch bei Sourceforge unter&lt;br /&gt;
[http://dpf-ax.svn.sourceforge.net/viewvc/dpf-ax/trunk/ [1]]&lt;br /&gt;
&lt;br /&gt;
Aktuelle Infos&#039; bei dem der dieses Display (und inzwischen viele andere gehackt hat):&lt;br /&gt;
[http://tech.section5.ch/news/?p=150 [2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projektlog ==&lt;br /&gt;
=== Start ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== erste Versuche ===&lt;br /&gt;
Das Display [http://www.pearl.de/product.jsp?pdid=HPM1184&amp;amp;amp;catid=5618&amp;amp;amp;what=2 [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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Anleitung unter [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [4]] ist für armel, daher an Stelle von sdcc_2.9.0-5_armel.deb&lt;br /&gt;
das entsprechenden Paket für i386 sdcc_2.9.0-5_i386.deb suchen.&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht man den Kram zum Hacken des Displays nicht vollständig, wenn man dieses vorher unter Windows gehackt hat [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/comment-page-1/ [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.&lt;br /&gt;
&lt;br /&gt;
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. [http://www.vdr-portal.de/board18-vdr-hardware/board11-lcds/p1041355-pearl-display-textskalierung-unter-lcd4linux/ [7]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_dpf.c lcd4linux.1/drv_dpf.c&lt;br /&gt;
--- lcd4linux/drv_dpf.c	2011-11-14 14:41:40.859787820 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_dpf.c	2011-11-13 14:42:58.650315817 +0100&lt;br /&gt;
@@ -160,12 +160,26 @@ static int drv_dpf_start2(const char *se&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/* Fixme: provider other fonts someday... */&lt;br /&gt;
-	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
+	/* Overridden - we have scaled the textout drawing */&lt;br /&gt;
+/*	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
 		error(&amp;quot;%s: bad Font &#039;%s&#039; from&amp;amp;#160;%s (only 6x8 at the moment)&amp;quot;,&lt;br /&gt;
 			Name, s, cfg_source());&lt;br /&gt;
 		return -1;&lt;br /&gt;
+	} */&lt;br /&gt;
+&lt;br /&gt;
+	/* we dont want fonts below 6 width */&lt;br /&gt;
+	if (XRES &amp;amp;lt;6) {&lt;br /&gt;
+		error(&amp;quot;%s: bad Font &#039;%s&#039; width &#039;%d&#039; using minimum of 6)&amp;quot;,&lt;br /&gt;
+			Name,s,XRES);&lt;br /&gt;
+		XRES = 6;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
+    /* we dont want fonts below 8 height */&lt;br /&gt;
+    if (YRES &amp;amp;lt;8) {&lt;br /&gt;
+        error(&amp;quot;%s: bad Font &#039;%s&#039; height &#039;%d&#039; using minimum of 8)&amp;quot;,&lt;br /&gt;
+            Name,s,YRES);&lt;br /&gt;
+        YRES = 8;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
 	/* open communication with the display */&lt;br /&gt;
 	if (drv_dpf_open(section) &amp;amp;lt; 0) {&lt;br /&gt;
diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_generic_graphic.c lcd4linux.1/drv_generic_graphic.c&lt;br /&gt;
--- lcd4linux/drv_generic_graphic.c	2011-11-14 14:41:40.614375417 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_generic_graphic.c	2011-11-14 14:58:29.303285793 +0100&lt;br /&gt;
@@ -259,15 +259,18 @@ static void drv_generic_graphic_render(c&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	for (y = 0; y &amp;amp;lt; YRES; y++) {&lt;br /&gt;
-	  int mask = 1 &amp;amp;lt;&amp;amp;lt; XRES;&lt;br /&gt;
+&lt;br /&gt;
 	  for (x = 0; x &amp;amp;lt; XRES; x++) {&lt;br /&gt;
-		mask &amp;amp;gt;&amp;amp;gt;= 1;&lt;br /&gt;
-		if (chr[y] &amp;amp;amp; mask)&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;&lt;br /&gt;
-		else&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;&lt;br /&gt;
+		int mask = 1 &amp;amp;lt;&amp;amp;lt; 6;&lt;br /&gt;
+		mask &amp;amp;gt;&amp;amp;gt;= ((x*6)/(XRES))+1;&lt;br /&gt;
+        if (chr[(y*8)/(YRES)] &amp;amp;amp; mask)&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = fg;&lt;br /&gt;
+        else&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = bg;&lt;br /&gt;
+&lt;br /&gt;
 	  }&lt;br /&gt;
 	}&lt;br /&gt;
+&lt;br /&gt;
 	c += XRES;&lt;br /&gt;
 	txt++;&lt;br /&gt;
   }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Diesen kopieren wir mit dem Dateinamen lcd4linux-scaletext-dpf.patch in das Verzeichnis ~/dpf/lcd4linux und wenden ihn mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;patch -p1 &amp;amp;lt; lcd4linux-scaletext-dpf.patch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Mit diesem patch bauen wir lcd4linux nochmals neu, dazu rufen wir &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf und dann &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ..&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
./build-dpf-lcd4linux.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann daran denken, dass lcd4linux nicht mehr laufen sollte, daher&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;killall lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 /etc/lcd4linux.conf&lt;br /&gt;
chown root.root /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Und anschließend (wenn keine Fehlermeldung gekommen war) noch ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cp lcd4linux/lcd4linux /usr/local/bin/lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun können wir den Font in der Sektion Display in /etc/lcd4linux.conf ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;vi /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Details zur lcd4linux.conf unter [http://ssl.bulix.org/projects/lcd4linux/wiki/Howto_de [8]]&lt;br /&gt;
&lt;br /&gt;
Nun rufen wir mit angeschlossenem und gehacktem Display &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf. Kommt dabei keine Fehlermeldung beenden wir mit &amp;amp;lt;CRTL&amp;amp;gt;-&amp;amp;lt;C&amp;amp;gt;, bauen die udev-Regeln entsprechend [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [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.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Fensterstatus eines FHT80TF-2 ===&lt;br /&gt;
noch etwas quick&amp;amp;amp;dirty:&lt;br /&gt;
&lt;br /&gt;
Dazu nutzen wir das exec-plugin von lcd4linux&lt;br /&gt;
&lt;br /&gt;
Mit diesem rufen wir ein Shell-Skript namens &amp;quot;fenster&amp;quot; auf. Dieses besteht aus einer Codezeile (hier der Lesbarkeit wegen mit einem Zeilenumbruch):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/usr/bin/fhem.pl 7072 &#039;list CUL_FHTTK_b1987b STATE&#039; |awk &#039;/CUL/ \&lt;br /&gt;
{printf(&amp;quot;%s \n&amp;quot;,$2)}&#039;|sed -e &#039;s/Closed/ist zu/&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Derzeit erfasse ich genau einen FHT80TF-2&amp;amp;#160;! Vielleicht kann ja einer der hier anwesenden Perl-Freaks da mal so eine nette Schleife einbauen, die den Status aller bekannten FHT80TF-2 abfragt.&amp;amp;#160;;-)&lt;br /&gt;
&lt;br /&gt;
Das Skript gibt genau &amp;quot;geschlossen&amp;quot; zurück wenn das Fenster zu ist. Ansonsten &amp;quot;Open&amp;quot; (muss ich noch schöner machen&amp;amp;#160;;-) ).&lt;br /&gt;
&lt;br /&gt;
Als nächstes brauchen wir in der Datei /etc/lcd4linux (neu anlegen, Rechte auf 600, Eigentümer auf root setzen) folgende Einträge:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Definition des Displays&lt;br /&gt;
Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#   Durch den scaletext-patch aus dem VDR-Portal können wir nun einen größeren Font als 8x6 nutzen&lt;br /&gt;
  Font    &#039;12x32&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
# Definition des Fensterstatus-Widgets&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster&#039;&lt;br /&gt;
#   Skript /root/fenster alle 100 Sekunden ausführen&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
#   Display alle 10 Sekunden updaten&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
# Layout-Definition&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Für Debugging-Zwecke Kommentar entfernen und den DPF-Eintrag auskommentieren &lt;br /&gt;
#sowie lcd4linux -F aufrufen&lt;br /&gt;
#&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit wird nun der Status alle 100 Sekunden bei fhem ausgelesen und alle 10 Sekunden die Anzeige aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wetterinformationen ===&lt;br /&gt;
&#039;&#039;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&amp;amp;#160;;-)&#039;&#039;&lt;br /&gt;
Die Wetterinformationen bekommen wir mit dem Fhem-Modul Weather. Dieses liest in bestimmten Abständen die Daten eines Ortes aus Google Weather aus.&lt;br /&gt;
&lt;br /&gt;
Wir definieren daher in der fhem.cfg folgende Zeile(n), wobei eigentlich nur die erste notwendig ist:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wx Weather &amp;quot;Ilmenau,TH&amp;quot; 1800 de&lt;br /&gt;
attr wx room Wetter&lt;br /&gt;
define FileLog_wx FileLog /var/log/fhem/wx-%Y.log wx&lt;br /&gt;
attr FileLog_wx logtype text&lt;br /&gt;
attr FileLog_wx room Wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;get wx temp_c&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
liefert z.B. die Ausgabe der aktuellen Temperatur in °C&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;wx temp_c =&amp;amp;gt; -1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist also gerade -1°C.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/root/&amp;quot; legen wir nun ein Subdirectory &amp;quot;wetter&amp;quot; an und legen dort ein Skript &amp;quot;hole_wetter&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx temp_c;get wx condition;get wx humidity; \&lt;br /&gt;
get wx wind_condition;get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;quit&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um Fhem alle 5 Minuten abzufragen ergänzen wir folgenden Eintrag in der crontab:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter &amp;amp;gt; /root/wetter/wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Diese sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lenny:~/wetter# more wx&lt;br /&gt;
wx fc0_high_c =&amp;amp;gt; 3&lt;br /&gt;
wx fc0_low_c =&amp;amp;gt; -1&lt;br /&gt;
wx temp_c =&amp;amp;gt; -1&lt;br /&gt;
wx condition =&amp;amp;gt; Meistens bewölkt&lt;br /&gt;
wx humidity =&amp;amp;gt; Luftfeuchtigkeit: 93&amp;amp;#160;%&lt;br /&gt;
wx wind_condition =&amp;amp;gt; Wind: W mit 14 km/h&lt;br /&gt;
wx fc1_high_c =&amp;amp;gt; 7&lt;br /&gt;
wx fc1_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc1_condition =&amp;amp;gt; Vereinzelt Schnee&lt;br /&gt;
wx fc2_high_c =&amp;amp;gt; 5&lt;br /&gt;
wx fc2_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc2_condition =&amp;amp;gt; Vereinzelt Regen&lt;br /&gt;
lenny:~/wetter#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir diese Datei noch die Rechte &amp;quot;600&amp;quot; setzen, damit lcd4linux diese verarbeitet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &amp;quot;temp&amp;quot; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; temp_c&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%d°C\n&amp;quot;,$4)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit gibt das Skript nun folgendes aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-1°C&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist Geschmacksfrage, ob man die Einheit hier mit ausgeben lässt, oder diese im Postfix von lcd4linux angibt (dazu mehr weiter unten).&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit sind die &amp;quot;condition&amp;quot;-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 &amp;quot;wind_condition&amp;quot; 5 Stück:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; wind_condition&#039; /root/wetter/wx |awk &#039;{print $4,$5,$6,$7,$8}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden auch mehrere Worte korrekt ausgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Wind: W mit 14 km/h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Meine /etc/lcd4linux.conf (muss ebenfalls die Rechte 600 haben) sieht nun mit den Wetterdaten wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
Widget Zisterne {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
  expression exec(&#039;/root/zisterne&#039;, 100000)&lt;br /&gt;
  postfix &#039; cm&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Temp &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Morgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Morgen &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Uebermorgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Ueberm. &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col1 &#039;Temp&#039;&lt;br /&gt;
    Col9 &#039;Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7.Col5 &#039;Cond&#039;&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col1 &#039;Morgen&#039;&lt;br /&gt;
    Col9 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11.Col1 &#039;fc1_Cond&#039;&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col1 &#039;Uebermorgen&#039;&lt;br /&gt;
    Col9 &#039;fc2_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc2_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14.Col1 &#039;fc2_Cond&#039;&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
lcd4linux fragt damit nun alle 300 Sekunden die Werte aus dem Zwischenspeicher (der Datei &amp;quot;wx&amp;quot;) ab und aktualisiert die jeweilige Displayanzeige alle 20 Sekunden. Das reicht für den Einsatzzweck vollkommen aus.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Abfragen ist nun im Bild dieses Beitrages zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wettergrafiken (Symbolbilder) ===&lt;br /&gt;
Zuerst sollte man mal lt. hackfin [http://forum.doozan.com/read.php?2,2435,4139#msg-4139 [10]] ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install libgd2-noxpm-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit einem Image-Widet in der lcd4linux.conf die Nachricht, dass &amp;quot;Image&amp;quot; &amp;quot;not supported class&amp;quot; sei&amp;amp;#160;:-(&lt;br /&gt;
&lt;br /&gt;
Dann also nochmals alles kompilieren. Das heißt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd dpf&lt;br /&gt;
make clean&lt;br /&gt;
./build-dpf-lcd4linux.sh&lt;br /&gt;
make&lt;br /&gt;
cd lcd4linux&lt;br /&gt;
patch -p1 &amp;amp;lt;lcd4linux-scaletext-dpf.patch&lt;br /&gt;
make&lt;br /&gt;
cp lcd4linux /usr/local/bin/lcd4linux&lt;br /&gt;
lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann sollte die Klasse &amp;quot;Image&amp;quot; beaknnt sein und eine in der &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
angegebene Grafik auch angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install imagemagick&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Unser hole_wetter-Skript passen wir dann wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Fhem-Variablen auslesen&lt;br /&gt;
fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx fc0_condition;get wx fc0_day_of_week; \&lt;br /&gt;
get wx temp_c;get wx condition;get wx fc0_icon;get wx humidity;get wx wind_condition; \&lt;br /&gt;
get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition;get wx fc1_day_of_week;get wx fc1_icon; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;get wx fc2_day_of_week;get wx fc2_icon;&#039; \&lt;br /&gt;
&amp;amp;gt; /root/wetter/wx&lt;br /&gt;
# Wetter-Icon von heute holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc0_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc0_icon.gif&lt;br /&gt;
# Wetter-Icon von morgen holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc1_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc1_icon.gif&lt;br /&gt;
# Wetter-Icon von uebermorgen holen&lt;br /&gt;
URL=$(fhem.pl &#039;get wx fc2_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc2_icon.gif&lt;br /&gt;
&lt;br /&gt;
# nach png konvertieren fuer DPF und Rechte auf 600 setzefuer lcd4linux&lt;br /&gt;
for i in *.gif; do convert &amp;quot;$i&amp;quot; &amp;quot;${i%.gif}.png&amp;quot;&amp;amp;#160;; done&lt;br /&gt;
chmod 600 *&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir noch unseren crontab Eintrag wie folgt modifizieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Das heißt, wir lassen die Umleitung in eine Datei weg, dies erledigt jetzt unser modifiziertes Skript!&lt;br /&gt;
&lt;br /&gt;
Außerdem legen wir ein Verzeichnis wetter/wx_icons sowie drei neue Skripte an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# wetter/fc0_icon&lt;br /&gt;
grep &#039;fc0_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc1_icon&lt;br /&gt;
grep &#039;fc1_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc2_icon&lt;br /&gt;
grep &#039;fc2_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unsere /etc/lcd4linux.conf passen wir wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 18&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
#Kommentar für Ultraschall-Füllstansanzeige (separater Eintrag im Fhem-Wiki) entfernen!&lt;br /&gt;
#Widget Zisterne { &lt;br /&gt;
#  class &#039;Text&#039;&lt;br /&gt;
#  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
#  expression (170 - exec(&#039;/root/zisterne&#039;, 100000))/155*100&lt;br /&gt;
#  postfix &#039;%&#039;&lt;br /&gt;
#  precision 1&lt;br /&gt;
#  width 26&lt;br /&gt;
#  align &#039;R&#039;&lt;br /&gt;
#  update 20000&lt;br /&gt;
#}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 15&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 5&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc0_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc0_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC1_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc1_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 7&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039; bis &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC2_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc2_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget dummy {&lt;br /&gt;
  class &#039;text&#039;&lt;br /&gt;
  expression &lt;br /&gt;
  visible 0&lt;br /&gt;
  width 0&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
    Col20 &#039;Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
#    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
#  Row5.Col1 &#039;dummy&#039; # notwendig, da sonst wegen Prozentzeichen von Zisterne keine Ausgabe&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col5 &#039;fc0_cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7 {&lt;br /&gt;
    Col5 &#039;Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col5 &#039;fc1_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col5 &#039;fc2_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Layer 2 {&lt;br /&gt;
    X85.Y5 &#039;FC0_icon&#039;&lt;br /&gt;
    X145.Y5 &#039;FC1_icon&#039;&lt;br /&gt;
    X192.Y5 &#039;FC2_icon&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Außerdem müssen für diese Modifikation die Skripte fc*_condition wie folgt angepasst werden (Beispiel fc0_condition):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039;fc0_day_of_week&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s: &amp;quot;,$4)}&#039;&lt;br /&gt;
grep &#039;fc0_condition&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s&amp;amp;#160;%s\n&amp;quot;,$4,$5)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden nun statt &amp;quot;Heute&amp;quot;, &amp;quot;Morgen&amp;quot; und &amp;quot;Ueberm.&amp;quot; die Wochentage von Google angezeigt und es ist mehr Platz für die Ausgabe der Wetterbedingungen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden der Zisternenanzeige mit Ultraschallsensor ===&lt;br /&gt;
Ist man Besitzer des [[Ultraschallsensor]], kann man das dort angegebene Skript zur Abfrage einfach in das Verzeichnis /root/ kopieren und dessen Rechte auf &#039;700&#039; 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&amp;amp;#160;% (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.&lt;br /&gt;
Dieser Wert ist ein Füllstanswert und entspricht nicht dem prozentualen Volumen. Wer dieses berechnen will, muss die Formel nach [http://de.wikipedia.org/wiki/Zylinder_%28Geometrie%29#Volumenberechnung_eines_liegenden_Kreiszylinders_.28Tank-Problem.29 [11]] verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Müllkalender ===&lt;br /&gt;
Einen einfachen Müllkalender kann man mit dem Progrämmchen calcurse realisieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install calcurse&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dort importiert man die Mülltermine (Serien gehen auch!) als ics-Dateien. Die Termine sollten einen kurzen sprechenden Inhalt haben z.B. &amp;quot;Gelber Sack&amp;quot;. Import mit folgendem Befehl&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -i dateiname.ics&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann legt man in /root eine Datei mit dem Namen &amp;quot;muell&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -d 2|awk &#039;/*/ {print &amp;quot;+++ &amp;quot; $2 &amp;quot; &amp;quot; $3 &amp;quot; &amp;quot; $4 &amp;quot; &amp;quot; $5 &amp;quot; +++&amp;quot;}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden die Texte der in den nächsten 2 Tagen anstehenden Termine ausgegeben.&lt;br /&gt;
Das Skript /root/muell noch schnell mit den korrekten Rechten versehen&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 700 /root/muell&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
und anschließend in die /etc/lcd4linux.conf einen neuen Widget-Eintrag hinzufügen, z.B.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Widget Muell {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/muell&#039;, 100000)&lt;br /&gt;
  Foreground &#039;FF0000&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;M&#039;&lt;br /&gt;
  speed 250&lt;br /&gt;
  update 10000&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(Bei diesem Widget-Eintrag haben wir nun eine rote Vordergrundfarbe und eine Laufschrift. Dadurch nimmt man die &amp;quot;Mülltonnen-Erinnerung&amp;quot; eher wahr als bei statischem Text.)&lt;br /&gt;
&lt;br /&gt;
Im Bereich Layout in dieser Datei muss noch die Zeile&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Row5.Col1 &#039;Muell&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Schon wird die Müllabfuhr 2 Tage vorher in Zeile 5 des Displays angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== bekannte Probleme ===&lt;br /&gt;
keine mehr.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß beim Nachbau / Verbessern!&lt;br /&gt;
--[[Benutzer:Mick|Mick]] ([[Benutzer Diskussion:Mick|Diskussion]]) 03:56, 1. Okt. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
--&amp;lt;a href=&amp;quot;/w/index.php?title=Benutzer:Mick&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Benutzer:Mick (Seite nicht vorhanden)&amp;quot;&amp;gt;Mick&amp;lt;/a&amp;gt; 06:30, 18. Jan. 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3010</id>
		<title>Infodisplay Linux-Rechner</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Infodisplay_Linux-Rechner&amp;diff=3010"/>
		<updated>2013-10-01T01:52:43Z</updated>

		<summary type="html">&lt;p&gt;Mick: Versuch der Wiederherstellung der Ursprungsversion nach Wiki-Crash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Infodisplay.png|400px|mini|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.]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Für meine Fhem-Installation suchte ich ein kleines billiges Statusdisplay, welches beim Verlassen des Hauses eine Reihe von Informationen liefern kann. &lt;br /&gt;
&lt;br /&gt;
Beim Versender [http://www.pearl.de/a-HPM1184-5618.shtml Pearl] fand sich ein passendes Display für unter 10 Euro, welches sich über [http://ssl.bulix.org/projects/lcd4linux/ 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).&lt;br /&gt;
&lt;br /&gt;
Die Anleitung zum Hacken des Rahmens und weitere Infos gibt es [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung mit diversen Links für die Fritzbox findet sich [http://thomasheinz.net/lcd-an-fritzbox-mit-lcd4linux-und-digitalen-bilderrahmen-von-pearl/ hier].&lt;br /&gt;
&lt;br /&gt;
Der Code dazu findet sich inzwischen auch bei Sourceforge unter&lt;br /&gt;
[http://dpf-ax.svn.sourceforge.net/viewvc/dpf-ax/trunk/ [1]]&lt;br /&gt;
&lt;br /&gt;
Aktuelle Infos&#039; bei dem der dieses Display (und inzwischen viele andere gehackt hat):&lt;br /&gt;
[http://tech.section5.ch/news/?p=150 [2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projektlog ==&lt;br /&gt;
=== Start ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== erste Versuche ===&lt;br /&gt;
Das Display [http://www.pearl.de/product.jsp?pdid=HPM1184&amp;amp;amp;catid=5618&amp;amp;amp;what=2 [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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Anleitung unter [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [4]] ist für armel, daher an Stelle von sdcc_2.9.0-5_armel.deb&lt;br /&gt;
das entsprechenden Paket für i386 sdcc_2.9.0-5_i386.deb suchen.&lt;br /&gt;
&lt;br /&gt;
Eigentlich braucht man den Kram zum Hacken des Displays nicht vollständig, wenn man dieses vorher unter Windows gehackt hat [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/comment-page-1/ [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.&lt;br /&gt;
&lt;br /&gt;
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. [http://www.vdr-portal.de/board18-vdr-hardware/board11-lcds/p1041355-pearl-display-textskalierung-unter-lcd4linux/ [7]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_dpf.c lcd4linux.1/drv_dpf.c&lt;br /&gt;
--- lcd4linux/drv_dpf.c	2011-11-14 14:41:40.859787820 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_dpf.c	2011-11-13 14:42:58.650315817 +0100&lt;br /&gt;
@@ -160,12 +160,26 @@ static int drv_dpf_start2(const char *se&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/* Fixme: provider other fonts someday... */&lt;br /&gt;
-	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
+	/* Overridden - we have scaled the textout drawing */&lt;br /&gt;
+/*	if (XRES&amp;amp;#160;!= 6 &amp;amp;amp;&amp;amp;amp; YRES&amp;amp;#160;!= 8) {&lt;br /&gt;
 		error(&amp;quot;%s: bad Font &#039;%s&#039; from&amp;amp;#160;%s (only 6x8 at the moment)&amp;quot;,&lt;br /&gt;
 			Name, s, cfg_source());&lt;br /&gt;
 		return -1;&lt;br /&gt;
+	} */&lt;br /&gt;
+&lt;br /&gt;
+	/* we dont want fonts below 6 width */&lt;br /&gt;
+	if (XRES &amp;amp;lt;6) {&lt;br /&gt;
+		error(&amp;quot;%s: bad Font &#039;%s&#039; width &#039;%d&#039; using minimum of 6)&amp;quot;,&lt;br /&gt;
+			Name,s,XRES);&lt;br /&gt;
+		XRES = 6;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
+    /* we dont want fonts below 8 height */&lt;br /&gt;
+    if (YRES &amp;amp;lt;8) {&lt;br /&gt;
+        error(&amp;quot;%s: bad Font &#039;%s&#039; height &#039;%d&#039; using minimum of 8)&amp;quot;,&lt;br /&gt;
+            Name,s,YRES);&lt;br /&gt;
+        YRES = 8;&lt;br /&gt;
+    }&lt;br /&gt;
 &lt;br /&gt;
 	/* open communication with the display */&lt;br /&gt;
 	if (drv_dpf_open(section) &amp;amp;lt; 0) {&lt;br /&gt;
diff -rupN --exclude=.svn --exclude=&#039;*.log&#039; --exclude=Makefile --exclude=&#039;*.m4&#039; --exclude=&#039;*.in&#039; --exclude=autom4te.cache --exclude=&#039;config*&#039; --exclude=&#039;*.Po&#039; --exclude=&#039;*.sh&#039; lcd4linux/drv_generic_graphic.c lcd4linux.1/drv_generic_graphic.c&lt;br /&gt;
--- lcd4linux/drv_generic_graphic.c	2011-11-14 14:41:40.614375417 +0100&lt;br /&gt;
+++ lcd4linux.1/drv_generic_graphic.c	2011-11-14 14:58:29.303285793 +0100&lt;br /&gt;
@@ -259,15 +259,18 @@ static void drv_generic_graphic_render(c&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	for (y = 0; y &amp;amp;lt; YRES; y++) {&lt;br /&gt;
-	  int mask = 1 &amp;amp;lt;&amp;amp;lt; XRES;&lt;br /&gt;
+&lt;br /&gt;
 	  for (x = 0; x &amp;amp;lt; XRES; x++) {&lt;br /&gt;
-		mask &amp;amp;gt;&amp;amp;gt;= 1;&lt;br /&gt;
-		if (chr[y] &amp;amp;amp; mask)&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = fg;&lt;br /&gt;
-		else&lt;br /&gt;
-		  drv_generic_graphic_FB[layer][(r + y) * LCOLS + c + x] = bg;&lt;br /&gt;
+		int mask = 1 &amp;amp;lt;&amp;amp;lt; 6;&lt;br /&gt;
+		mask &amp;amp;gt;&amp;amp;gt;= ((x*6)/(XRES))+1;&lt;br /&gt;
+        if (chr[(y*8)/(YRES)] &amp;amp;amp; mask)&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = fg;&lt;br /&gt;
+        else&lt;br /&gt;
+          drv_generic_graphic_FB[layer][(r + y ) * LCOLS + c + x] = bg;&lt;br /&gt;
+&lt;br /&gt;
 	  }&lt;br /&gt;
 	}&lt;br /&gt;
+&lt;br /&gt;
 	c += XRES;&lt;br /&gt;
 	txt++;&lt;br /&gt;
   }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Diesen kopieren wir mit dem Dateinamen lcd4linux-scaletext-dpf.patch in das Verzeichnis ~/dpf/lcd4linux und wenden ihn mit &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;patch -p1 &amp;amp;lt; lcd4linux-scaletext-dpf.patch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
an. &lt;br /&gt;
&lt;br /&gt;
Mit diesem patch bauen wir lcd4linux nochmals neu, dazu rufen wir &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf und dann &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd ..&lt;br /&gt;
make clean&lt;br /&gt;
make&lt;br /&gt;
./build-dpf-lcd4linux.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann daran denken, dass lcd4linux nicht mehr laufen sollte, daher&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;killall lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 /etc/lcd4linux.conf&lt;br /&gt;
chown root.root /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Und anschließend (wenn keine Fehlermeldung gekommen war) noch ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cp lcd4linux/lcd4linux /usr/local/bin/lcd4linux&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun können wir den Font in der Sektion Display in /etc/lcd4linux.conf ändern&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;vi /etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Details zur lcd4linux.conf unter [http://ssl.bulix.org/projects/lcd4linux/wiki/Howto_de [8]]&lt;br /&gt;
&lt;br /&gt;
Nun rufen wir mit angeschlossenem und gehacktem Display &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
auf. Kommt dabei keine Fehlermeldung beenden wir mit &amp;amp;lt;CRTL&amp;amp;gt;-&amp;amp;lt;C&amp;amp;gt;, bauen die udev-Regeln entsprechend [http://geekparadise.de/2011/04/digitaler-bilderrahmen-von-pearl-als-statusdisplay-fur-dockstar/ [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.&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Fensterstatus eines FHT80TF-2 ===&lt;br /&gt;
noch etwas quick&amp;amp;amp;dirty:&lt;br /&gt;
&lt;br /&gt;
Dazu nutzen wir das exec-plugin von lcd4linux&lt;br /&gt;
&lt;br /&gt;
Mit diesem rufen wir ein Shell-Skript namens &amp;quot;fenster&amp;quot; auf. Dieses besteht aus einer Codezeile (hier der Lesbarkeit wegen mit einem Zeilenumbruch):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/usr/bin/fhem.pl 7072 &#039;list CUL_FHTTK_b1987b STATE&#039; |awk &#039;/CUL/ \&lt;br /&gt;
{printf(&amp;quot;%s \n&amp;quot;,$2)}&#039;|sed -e &#039;s/Closed/ist zu/&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Derzeit erfasse ich genau einen FHT80TF-2&amp;amp;#160;! Vielleicht kann ja einer der hier anwesenden Perl-Freaks da mal so eine nette Schleife einbauen, die den Status aller bekannten FHT80TF-2 abfragt.&amp;amp;#160;;-)&lt;br /&gt;
&lt;br /&gt;
Das Skript gibt genau &amp;quot;geschlossen&amp;quot; zurück wenn das Fenster zu ist. Ansonsten &amp;quot;Open&amp;quot; (muss ich noch schöner machen&amp;amp;#160;;-) ).&lt;br /&gt;
&lt;br /&gt;
Als nächstes brauchen wir in der Datei /etc/lcd4linux (neu anlegen, Rechte auf 600, Eigentümer auf root setzen) folgende Einträge:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Definition des Displays&lt;br /&gt;
Display dpf {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#   Durch den scaletext-patch aus dem VDR-Portal können wir nun einen größeren Font als 8x6 nutzen&lt;br /&gt;
  Font    &#039;12x32&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000000&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
# Definition des Fensterstatus-Widgets&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster&#039;&lt;br /&gt;
#   Skript /root/fenster alle 100 Sekunden ausführen&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
#   Display alle 10 Sekunden updaten&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
# Layout-Definition&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Für Debugging-Zwecke Kommentar entfernen und den DPF-Eintrag auskommentieren &lt;br /&gt;
#sowie lcd4linux -F aufrufen&lt;br /&gt;
#&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit wird nun der Status alle 100 Sekunden bei fhem ausgelesen und alle 10 Sekunden die Anzeige aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wetterinformationen ===&lt;br /&gt;
&#039;&#039;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&amp;amp;#160;;-)&#039;&#039;&lt;br /&gt;
Die Wetterinformationen bekommen wir mit dem Fhem-Modul Weather. Dieses liest in bestimmten Abständen die Daten eines Ortes aus Google Weather aus.&lt;br /&gt;
&lt;br /&gt;
Wir definieren daher in der fhem.cfg folgende Zeile(n), wobei eigentlich nur die erste notwendig ist:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define wx Weather &amp;quot;Ilmenau,TH&amp;quot; 1800 de&lt;br /&gt;
attr wx room Wetter&lt;br /&gt;
define FileLog_wx FileLog /var/log/fhem/wx-%Y.log wx&lt;br /&gt;
attr FileLog_wx logtype text&lt;br /&gt;
attr FileLog_wx room Wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;get wx temp_c&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
liefert z.B. die Ausgabe der aktuellen Temperatur in °C&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;wx temp_c =&amp;amp;gt; -1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist also gerade -1°C.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis &amp;quot;/root/&amp;quot; legen wir nun ein Subdirectory &amp;quot;wetter&amp;quot; an und legen dort ein Skript &amp;quot;hole_wetter&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx temp_c;get wx condition;get wx humidity; \&lt;br /&gt;
get wx wind_condition;get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;quit&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um Fhem alle 5 Minuten abzufragen ergänzen wir folgenden Eintrag in der crontab:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter &amp;amp;gt; /root/wetter/wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Diese sieht dann wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lenny:~/wetter# more wx&lt;br /&gt;
wx fc0_high_c =&amp;amp;gt; 3&lt;br /&gt;
wx fc0_low_c =&amp;amp;gt; -1&lt;br /&gt;
wx temp_c =&amp;amp;gt; -1&lt;br /&gt;
wx condition =&amp;amp;gt; Meistens bewölkt&lt;br /&gt;
wx humidity =&amp;amp;gt; Luftfeuchtigkeit: 93&amp;amp;#160;%&lt;br /&gt;
wx wind_condition =&amp;amp;gt; Wind: W mit 14 km/h&lt;br /&gt;
wx fc1_high_c =&amp;amp;gt; 7&lt;br /&gt;
wx fc1_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc1_condition =&amp;amp;gt; Vereinzelt Schnee&lt;br /&gt;
wx fc2_high_c =&amp;amp;gt; 5&lt;br /&gt;
wx fc2_low_c =&amp;amp;gt; 1&lt;br /&gt;
wx fc2_condition =&amp;amp;gt; Vereinzelt Regen&lt;br /&gt;
lenny:~/wetter#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir diese Datei noch die Rechte &amp;quot;600&amp;quot; setzen, damit lcd4linux diese verarbeitet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 600 wx&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &amp;quot;temp&amp;quot; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; temp_c&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%d°C\n&amp;quot;,$4)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit gibt das Skript nun folgendes aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-1°C&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Es ist Geschmacksfrage, ob man die Einheit hier mit ausgeben lässt, oder diese im Postfix von lcd4linux angibt (dazu mehr weiter unten).&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit sind die &amp;quot;condition&amp;quot;-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 &amp;quot;wind_condition&amp;quot; 5 Stück:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039; wind_condition&#039; /root/wetter/wx |awk &#039;{print $4,$5,$6,$7,$8}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden auch mehrere Worte korrekt ausgegeben, z.B.:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Wind: W mit 14 km/h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Meine /etc/lcd4linux.conf (muss ebenfalls die Rechte 600 haben) sieht nun mit den Wetterdaten wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 20&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
Widget Zisterne {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
  expression exec(&#039;/root/zisterne&#039;, 100000)&lt;br /&gt;
  postfix &#039; cm&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;R&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Temp &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Morgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Morgen &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Uebermorgen {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression &#039;Ueberm. &#039;&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col1 &#039;Temp&#039;&lt;br /&gt;
    Col9 &#039;Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7.Col5 &#039;Cond&#039;&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col1 &#039;Morgen&#039;&lt;br /&gt;
    Col9 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11.Col1 &#039;fc1_Cond&#039;&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col1 &#039;Uebermorgen&#039;&lt;br /&gt;
    Col9 &#039;fc2_Min_Temp&#039;&lt;br /&gt;
    Col19 &#039;fc2_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14.Col1 &#039;fc2_Cond&#039;&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
lcd4linux fragt damit nun alle 300 Sekunden die Werte aus dem Zwischenspeicher (der Datei &amp;quot;wx&amp;quot;) ab und aktualisiert die jeweilige Displayanzeige alle 20 Sekunden. Das reicht für den Einsatzzweck vollkommen aus.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Abfragen ist nun im Bild dieses Beitrages zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden von Wettergrafiken (Symbolbilder) ===&lt;br /&gt;
Zuerst sollte man mal lt. hackfin [http://forum.doozan.com/read.php?2,2435,4139#msg-4139 [10]] ein&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install libgd2-noxpm-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
mit einem Image-Widet in der lcd4linux.conf die Nachricht, dass &amp;quot;Image&amp;quot; &amp;quot;not supported class&amp;quot; sei&amp;amp;#160;:-(&lt;br /&gt;
&lt;br /&gt;
Dann also nochmals alles kompilieren. Das heißt:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;cd dpf&lt;br /&gt;
make clean&lt;br /&gt;
./build-dpf-lcd4linux.sh&lt;br /&gt;
make&lt;br /&gt;
cd lcd4linux&lt;br /&gt;
patch -p1 &amp;amp;lt;lcd4linux-scaletext-dpf.patch&lt;br /&gt;
make&lt;br /&gt;
cp lcd4linux /usr/local/bin/lcd4linux&lt;br /&gt;
lcd4linux -F&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann sollte die Klasse &amp;quot;Image&amp;quot; beaknnt sein und eine in der &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;/etc/lcd4linux.conf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
angegebene Grafik auch angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install imagemagick&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Unser hole_wetter-Skript passen wir dann wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Fhem-Variablen auslesen&lt;br /&gt;
fhem.pl 7072 &#039;get wx fc0_high_c;get wx fc0_low_c;get wx fc0_condition;get wx fc0_day_of_week; \&lt;br /&gt;
get wx temp_c;get wx condition;get wx fc0_icon;get wx humidity;get wx wind_condition; \&lt;br /&gt;
get wx fc1_high_c;get wx fc1_low_c;get wx fc1_condition;get wx fc1_day_of_week;get wx fc1_icon; \&lt;br /&gt;
get wx fc2_high_c;get wx fc2_low_c;get wx fc2_condition;get wx fc2_day_of_week;get wx fc2_icon;&#039; \&lt;br /&gt;
&amp;amp;gt; /root/wetter/wx&lt;br /&gt;
# Wetter-Icon von heute holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc0_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc0_icon.gif&lt;br /&gt;
# Wetter-Icon von morgen holen&lt;br /&gt;
URL=$(fhem.pl 7072 &#039;get wx fc1_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc1_icon.gif&lt;br /&gt;
# Wetter-Icon von uebermorgen holen&lt;br /&gt;
URL=$(fhem.pl &#039;get wx fc2_icon&#039;|awk &#039;{printf(&amp;quot;www.google.de%s\n&amp;quot;, $4)}&#039;)&lt;br /&gt;
wget &amp;quot;$URL&amp;quot; -O /root/wetter/wx_icons/fc2_icon.gif&lt;br /&gt;
&lt;br /&gt;
# nach png konvertieren fuer DPF und Rechte auf 600 setzefuer lcd4linux&lt;br /&gt;
for i in *.gif; do convert &amp;quot;$i&amp;quot; &amp;quot;${i%.gif}.png&amp;quot;&amp;amp;#160;; done&lt;br /&gt;
chmod 600 *&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun müssen wir noch unseren crontab Eintrag wie folgt modifizieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;*/5 * * * * sh /root/wetter/hole_wetter&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Das heißt, wir lassen die Umleitung in eine Datei weg, dies erledigt jetzt unser modifiziertes Skript!&lt;br /&gt;
&lt;br /&gt;
Außerdem legen wir ein Verzeichnis wetter/wx_icons sowie drei neue Skripte an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# wetter/fc0_icon&lt;br /&gt;
grep &#039;fc0_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc1_icon&lt;br /&gt;
grep &#039;fc1_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# wetter/fc2_icon&lt;br /&gt;
grep &#039;fc2_icon&#039; /root/wetter/wx |awk &#039;{print $4}&#039;|sed &#039;s/\/ig\/images\/weather/\/root\/wetter\/wx_icons/g&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unsere /etc/lcd4linux.conf passen wir wie folgt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Display curses {&lt;br /&gt;
  Driver   &#039;Curses&#039;&lt;br /&gt;
  Size    &#039;26x20&#039;&lt;br /&gt;
}&lt;br /&gt;
Display DPF {&lt;br /&gt;
  Driver   &#039;DPF&#039;&lt;br /&gt;
  Port    &#039;usb0&#039;&lt;br /&gt;
#  Font    &#039;6x8&#039;&lt;br /&gt;
  Font    &#039;12x16&#039;&lt;br /&gt;
  Foreground &#039;ffffff&#039;&lt;br /&gt;
  Background &#039;000066&#039;&lt;br /&gt;
  Basecolor &#039;000066&#039;&lt;br /&gt;
}&lt;br /&gt;
Widget Time {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression strftime(&#039;%d.%m.%G&amp;amp;#160;%H:%M&#039;,time())&lt;br /&gt;
  width 18&lt;br /&gt;
  align &#039;C&#039;&lt;br /&gt;
  update 10000&lt;br /&gt;
}&lt;br /&gt;
#Kommentar für Ultraschall-Füllstansanzeige (separater Eintrag im Fhem-Wiki) entfernen!&lt;br /&gt;
#Widget Zisterne { &lt;br /&gt;
#  class &#039;Text&#039;&lt;br /&gt;
#  prefix &#039;Zisternenfuellstand&#039;&lt;br /&gt;
#  expression (170 - exec(&#039;/root/zisterne&#039;, 100000))/155*100&lt;br /&gt;
#  postfix &#039;%&#039;&lt;br /&gt;
#  precision 1&lt;br /&gt;
#  width 26&lt;br /&gt;
#  align &#039;R&#039;&lt;br /&gt;
#  update 20000&lt;br /&gt;
#}&lt;br /&gt;
Widget Fenster {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Fenster &#039;&lt;br /&gt;
  expression exec(&#039;/root/fenster&#039;, 100000)&lt;br /&gt;
  width 15&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/temp&#039;, 300000)&lt;br /&gt;
  width 5&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/min_temp&#039;, 3000000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc0_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget Wind_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/wind_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc0_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc0_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Min &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_min_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039;Max &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc1_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc1_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC1_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc1_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Min_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_min_temp&#039;, 300000)&lt;br /&gt;
  width 7&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Max_Temp {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  prefix &#039; bis &#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_max_temp&#039;, 300000)&lt;br /&gt;
  width 9&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget fc2_Cond {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/wetter/fc2_condition&#039;,300000)&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;L&#039;&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Widget FC2_Icon {&lt;br /&gt;
  class  &#039;Image&#039;&lt;br /&gt;
  file   &#039;/root/wetter/wx_icons/fc2_icon.png&#039;&lt;br /&gt;
  update  10000&lt;br /&gt;
  reload  1&lt;br /&gt;
  visible 1&lt;br /&gt;
  inverted 0&lt;br /&gt;
}&lt;br /&gt;
Widget dummy {&lt;br /&gt;
  class &#039;text&#039;&lt;br /&gt;
  expression &lt;br /&gt;
  visible 0&lt;br /&gt;
  width 0&lt;br /&gt;
  update 20000&lt;br /&gt;
}&lt;br /&gt;
Layout Default {&lt;br /&gt;
  Row1 {&lt;br /&gt;
    Col1 &#039;Time&#039;&lt;br /&gt;
    Col20 &#039;Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row3 {&lt;br /&gt;
    Col1 &#039;Fenster&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row4 {&lt;br /&gt;
#    Col1 &#039;Zisterne&#039;&lt;br /&gt;
  }&lt;br /&gt;
#  Row5.Col1 &#039;dummy&#039; # notwendig, da sonst wegen Prozentzeichen von Zisterne keine Ausgabe&lt;br /&gt;
  Row6 {&lt;br /&gt;
    Col5 &#039;fc0_cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row7 {&lt;br /&gt;
    Col5 &#039;Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row8.Col5 &#039;Wind_Cond&#039;&lt;br /&gt;
  Row10 {&lt;br /&gt;
    Col5 &#039;fc1_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row11 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row13 {&lt;br /&gt;
    Col5 &#039;fc2_Cond&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Row14 {&lt;br /&gt;
    Col5 &#039;fc1_Min_Temp&#039;&lt;br /&gt;
    Col16 &#039;fc1_Max_Temp&#039;&lt;br /&gt;
  }&lt;br /&gt;
  Layer 2 {&lt;br /&gt;
    X85.Y5 &#039;FC0_icon&#039;&lt;br /&gt;
    X145.Y5 &#039;FC1_icon&#039;&lt;br /&gt;
    X192.Y5 &#039;FC2_icon&#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
Variables {&lt;br /&gt;
  tick 1000&lt;br /&gt;
  tack 500&lt;br /&gt;
  minute 60000&lt;br /&gt;
}&lt;br /&gt;
Display &#039;DPF&#039;&lt;br /&gt;
#Display &#039;Curses&#039;&lt;br /&gt;
Layout &#039;Default&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Außerdem müssen für diese Modifikation die Skripte fc*_condition wie folgt angepasst werden (Beispiel fc0_condition):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;grep &#039;fc0_day_of_week&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s: &amp;quot;,$4)}&#039;&lt;br /&gt;
grep &#039;fc0_condition&#039; /root/wetter/wx|awk &#039;{printf(&amp;quot;%s&amp;amp;#160;%s\n&amp;quot;,$4,$5)}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden nun statt &amp;quot;Heute&amp;quot;, &amp;quot;Morgen&amp;quot; und &amp;quot;Ueberm.&amp;quot; die Wochentage von Google angezeigt und es ist mehr Platz für die Ausgabe der Wetterbedingungen.&lt;br /&gt;
&lt;br /&gt;
=== Einbinden der Zisternenanzeige mit Ultraschallsensor ===&lt;br /&gt;
Ist man Besitzer des [[Ultraschallsensor]], kann man das dort angegebene Skript zur Abfrage einfach in das Verzeichnis /root/ kopieren und dessen Rechte auf &#039;700&#039; 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&amp;amp;#160;% (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.&lt;br /&gt;
Dieser Wert ist ein Füllstanswert und entspricht nicht dem prozentualen Volumen. Wer dieses berechnen will, muss die Formel nach [http://de.wikipedia.org/wiki/Zylinder_%28Geometrie%29#Volumenberechnung_eines_liegenden_Kreiszylinders_.28Tank-Problem.29 [11]] verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Müllkalender ===&lt;br /&gt;
Einen einfachen Müllkalender kann man mit dem Progrämmchen calcurse realisieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;apt-get install calcurse&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dort importiert man die Mülltermine (Serien gehen auch!) als ics-Dateien. Die Termine sollten einen kurzen sprechenden Inhalt haben z.B. &amp;quot;Gelber Sack&amp;quot;. Import mit folgendem Befehl&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -i dateiname.ics&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dann legt man in /root eine Datei mit dem Namen &amp;quot;muell&amp;quot; mit folgendem Inhalt an:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;calcurse -d 2|awk &#039;/*/ {print &amp;quot;+++ &amp;quot; $2 &amp;quot; &amp;quot; $3 &amp;quot; &amp;quot; $4 &amp;quot; &amp;quot; $5 &amp;quot; +++&amp;quot;}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Damit werden die Texte der in den nächsten 2 Tagen anstehenden Termine ausgegeben.&lt;br /&gt;
Das Skript /root/muell noch schnell mit den korrekten Rechten versehen&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;chmod 700 /root/muell&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
und anschließend in die /etc/lcd4linux.conf einen neuen Widget-Eintrag hinzufügen, z.B.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Widget Muell {&lt;br /&gt;
  class &#039;Text&#039;&lt;br /&gt;
  expression exec(&#039;/root/muell&#039;, 100000)&lt;br /&gt;
  Foreground &#039;FF0000&#039;&lt;br /&gt;
  width 26&lt;br /&gt;
  align &#039;M&#039;&lt;br /&gt;
  speed 250&lt;br /&gt;
  update 10000&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(Bei diesem Widget-Eintrag haben wir nun eine rote Vordergrundfarbe und eine Laufschrift. Dadurch nimmt man die &amp;quot;Mülltonnen-Erinnerung&amp;quot; eher wahr als bei statischem Text.)&lt;br /&gt;
&lt;br /&gt;
Im Bereich Layout in dieser Datei muss noch die Zeile&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Row5.Col1 &#039;Muell&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Schon wird die Müllabfuhr 2 Tage vorher in Zeile 5 des Displays angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== bekannte Probleme ===&lt;br /&gt;
keine mehr.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß beim Nachbau / Verbessern!&lt;br /&gt;
--&amp;lt;a href=&amp;quot;/w/index.php?title=Benutzer:Mick&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Benutzer:Mick (Seite nicht vorhanden)&amp;quot;&amp;gt;Mick&amp;lt;/a&amp;gt; 06:30, 18. Jan. 2012 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Statusdisplay]]&lt;/div&gt;</summary>
		<author><name>Mick</name></author>
	</entry>
</feed>