Die Anzeige aller im Haus gesammelter Daten über eine Webseite ist nett (siehe Screenshot), benötigt aber einen Rechner, Handy, Tablet etc. wo diese Seite im Browser anzeigt wird. Unschön dabei ist, das wenn man schnell die Außentemperatur wissen will, immer erst das Gerät anschalten oder aufwecken muss, einen Webbrowser öffnen muss, die Webseite aufruft und wartet bis die Seite geöffnet wird. Das ist für einen kurzen Blick auf die Temperatur eher unpraktisch.
Es musste eine Anzeigemöglichkeit für die wichtigsten Daten her, welche immer angeschaltet ist. Nach kurzer Recherche im Internet stellte sich ein Amazon Kindle als Statusdisplay aufgrund des E-Paper-Displays als stromsparender Anwärter auf diesen Job heraus. Also schnell einen Kindle 4 (kein Touch) im Internet für ~ 30€ besorgt (da ich bisher keinen besaß).
Lösungsansätze
Es gibt verschiedene Ansätze den Kindle als Statusdisplay (z.B. für Wetterinformationen) zu nutzen. Es gibt Lösungen wie hier beschrieben die den Browser des Kindle nutzen. Besser gefielen mir aber die Lösungen die den Bildschirmschoner des Kindle zur Anzeige eines Statusbildes nutzen. Das macht unter anderem die Lösung für FHEM, als auch die Lösung von Matthew Petroff (von dem die FHEM-Lösung wahrscheinlich auch abgeleitet ist). Basierend auf dieser Lösung ist ausserdem diese hier mit weiterführenden Erklärungen der nötigen Schritte.
Ich bevorzuge anstelle der FHEM-Lösung die ursprüngliche Version, da ich nicht nur Daten aus FHEM anzeigen will, sondern auch Daten aus meiner MySQL-Datenbank und zusätzliche Informationen die direkt aus dem Internet stammen.
Den Kindle habe ich übrigens mittels “Kindersicherung” der FritzBox vom Internet gekappt falls Amazon auf komische Gedanken kommt und mir mit einem gutgemeinten Online-Update irgendwas zerschießt.
Die Lösung, den Bildschirmschoner des Kindle mit einem im Netzwerk bereitgestelltem Bild zu nutzen, benötigt verschiedene Anpassungen des Kindle als auch einige Komponenten die auf einem Server bereit gestellt werden müssen (bei mir der Raspberry PI).
Beschreibung
Die Beschreibung der nötigen Schritte und die benötigte Software sind hier (ursprüngliche Idee), hier (erweiterte Anleitung) und hier (ausführliche Anleitung) erklärt. Aus diesem Grund liste ich die nötigen Arbeitsschritte hier nur Stichpunktartig auf:
Kindle:
- Jailbreak des Kindle damit man damit auch anständig arbeiten kann
- SSH für Kindle (USBNetwork Hacks)
- Root-Passwort für den Kindle ermitteln
- Kite installieren um nach dem Starten des Kindle das Init-Script (init_daten.sh) ausführen zu lassen
- Stoppen von powerd
- das ist nötig, da im Sleep-Mode der Cronjob nicht ausgeführt wird
- (“@reboot” in crontab funktioniert leider auf dem Kindle nicht)
- Stoppen von framework
- Stoppen von powerd
- Cronjob einrichten um alle x Minuten/Stunden ein aktualisiertes Bild per wget zu laden
- vi /etc/crontab/root
- */10 5-22 * * * /mnt/us/anzeige/zeige_daten.sh (alle 10 Minuten zwischen 5 und 22 Uhr
Server:
- Python-Script anpassen
- Das Python-Script sammelt die Daten, ersetzt die Platzhalter im SVG und erstellt daraus das PNG mittels rsvg-convert und pngcrush
- Cronjob zur Ausführung des Python-Script anlegen
- */3 * * * * /var/www/kindle/daten-script.sh &> /dev/null
- SVG-Template anpassen (mit Editor und/oder Inkscape)
- rsvg-convert installieren (sudo apt-get install librsvg2-bin)
- pngcrush installieren (sudo apt-get install pngcrush)
(Achtung! Die Dateinamen der Scripte in den Cron-Beispielen und die Dateinamen der SVG´s sind anders als in den oben verlinkten Anleitungen)
Python-Script
Das ursprüngliche Python-Script holt das Wetter von einer Webseite aus den USA. Das Wetter dort hat mich nicht wirklich interessiert und so habe ich das Script etwas angepaßt und verschiedene Wetterdaten und Statusinformationen aus meinen eigenen Quellen (FHEM und MySQL) gezogen.
Zur Anzeige der Wettericons nutze ich teilweise die Bilder aus dem ursprünglichen SVG. Einige habe ich allerdings gelöscht da ich hier z.B. keinen Blizzard erwarte. Die Werte für den Luftdruck und die Windstärke sowie die Auswahl des aktuellen Wetter-Icon erfolgt über die “condition” des FHEM-Yahoo-Wetter-Moduls.
Mein Pythonscript sieht wie folgt aus:
Bitte das Update im nachfolgendem Artikel beachten!!
#!/usr/bin/python2 import codecs import telnetlib import MySQLdb from datetime import datetime, time ################ # Hole FHEM data ################ tnet_host= "localhost" tnet_port= 7072 def fhem_task(fcmd): tc= telnetlib.Telnet(tnet_host,tnet_port) tc.write(fcmd) erg= tc.read_until( "\n" ) tc.close() return erg # Abwesenheit if "off" in fhem_task("list ABWESENHEIT STATE\r\n"): abwesenheit="nicht gesetzt" if "on" in fhem_task("list ABWESENHEIT STATE\r\n"): abwesenheit="gesetzt" # Fenster anz_fenster_offen=0; if "open" in fhem_task("get FensterHeizung param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterKeller param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterGaestezimmer1 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterGaestezimmer2 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterBuero1 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterBuero2 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterWohnen1 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterWohnen2 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterWohnen3 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterWohnen4 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterGaestebad param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterSpind param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get FensterBad1 param STATE\r\n"): anz_fenster_offen += 1 if "open" in fhem_task("get Garagentor param STATE\r\n"): stat_garage="offen" else: stat_garage="geschlossen" # Wetter try: condition=str.split(fhem_task("get MeinWetter condition\r\n")) if len(condition)==5: wetter_icon=condition[3] + " " + condition[4] else: wetter_icon=condition[3] except: wetter_icon="Fehler" luftdruck=str.split(fhem_task("get MeinWetter pressure\r\n")) tendenz=str.split(fhem_task("get MeinWetter pressure_trend_txt\r\n")) wind=str.split(fhem_task("get MeinWetter wind_speed\r\n")) #################### # Datenbank auslesen #################### db = MySQLdb.connect(host="localhost", user="", passwd=" ", db=" ") cur = db.cursor() cur.execute("SELECT MIN(aussentemperatur), MAX(aussentemperatur) FROM temperaturen WHERE timestamp >= DATE(NOW()) ORDER BY timestamp") for row in cur.fetchall(): mintemp=round(row[0],2) maxtemp=round(row[1],2) db.close() ################ # Preprocess SVG ################ now = datetime.now() now_time = now.time() if time(5,50) <= now.time() <= time(22,50): # Open SVG to process output = codecs.open('daten_script_preprocess.svg', 'r', encoding='utf-8').read() # Insert icons and temperatures output = output.replace('ICON_ONE',wetter_icon.decode("utf-8")) output = output.replace('WETTER_BESCHR',wetter_icon.decode("utf-8")) output = output.replace('TEMP_A',fhem_task("get Aussenthermometer param temperature\r\n")) output = output.replace('LUFT_A',fhem_task("get Aussenthermometer param humidity\r\n")) output = output.replace('MIN_TEMP',str(mintemp)) output = output.replace('MAX_TEMP',str(maxtemp)) output = output.replace('DRUCK_A',luftdruck[3]) output = output.replace('TENDENZ',tendenz[3]) output = output.replace('WIND_A',wind[3]) output = output.replace('ANZ_FENSTER',str(anz_fenster_offen)) output = output.replace('STAT_ABWESENHEIT',abwesenheit) output = output.replace('STAT_GARAGE',stat_garage) output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S')) # Write output codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output) else: # Open SVG to process output = codecs.open('sleep_preprocess.svg', 'r', encoding='utf-8').read() output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S')) # Write output codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
Es werden verschiedene Information aus FHEM mittels Telnet abgefragt und Daten aus einer MySQL-Datenbank (min/max-Werte) ermittelt. Neben Temperaturwerten zeige ich z.B. auch noch den Status der Fenster, des Garagentores und der Abwesenheitssteuerung an. Zwischen 5:50 und 22:50 Uhr wird alle 10 Minuten ein aktualisiertes Bild der Statusinformationen angezeigt, in der anderen Zeit ein Bild eines schlafenden Männchens. In dieser Zeit fragt der Kindle auch kein neues Bild per wget ab.
Ergebnis
Im Ergebnis schaut es dann so aus:
Und hier die Anzeige für Nachts:
Als Erweiterung werde ich evtl. noch während der Heizperiode mit dem Kachelofen oder abhängig der Puffertemperatur, die obere und untere Temperatur des Pufferspeichers anstelle des Luftdruckes und der Windinformation anzeigen. Die Puffertemperatur ist in der Regel unser Maßstab ob Holz nachgelegt werden muss oder nicht.
Es könnte z.B. auch eine Display füllende Information ausgegeben werden wenn eine der Batterien der Fensterkontakte leer ist oder ein Warnhinweis falls die Heizung eine Störung oder anstehende Wartung anzeigt. Im Python-Script würde ich dann analog dem "Schlaf-Bild" ein spezielles PNG aus einem weiteren SVG erzeugen.
Chris