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
Pingback: Amazon Kindle als Statusdisplay - Update - bubuxblog
Danke für das Projekt und die ausführliche Beschreibung!
Ich habe selbst versucht meinen Kindle als Wetterstation einzusetzen aber aus irgendeinem Grund führt jeder eips Befehl nur zu einem weißen Bildschirm bis ich reboote. Hast du eine Ahnung woran das liegen könnte?
Hallo Jörn,
eigentlich kommt der weisse Bildschirm nur durch die Option “-c”. Text an eine bestimmte Koordinate schreibt man z.B. mit “eips -h 1 1 testtext”” zur Anzeige des PNG-Bildes auch?
Kommt bei Dir immer der weisse Bildschirm? Hast Du ein K4? Passiert das bei “eips -g
Bleibt der weiße Bildschirm auch wenn Du die “An/Aus-Taste” drückst oder kommt dann der normale Bildschirmschoner bzw. der Startbildschirm?
Wenn ja, weiß ich auch nicht woran das liegen könnte. Ist bei mir noch nicht aufgetreten.
Hast du mal per SSH in /var/log/messages geschaut ob da was drin steht?
Eine ausführliche Anleitung aller Optionen von eips gibt es hier: http://wiki.mobileread.com/wiki/Eips
Gruß
Chris
Hallo,
super Projekt, will ich unbedingt nachbauen!
Vielen Dank!
Lothar
Super gemacht, toll vorgestellt!
Ich beschäftige mich erst seit kurzem mit dem Kindle (K4) als Display für mein SmartHome, finde die Idee aber schon mal genial. So weit funktioniert alles, was funktionieren soll…
Das Update wird auch vom Server getriggert und ersetzt den Cronjob auf dem Kindle. Der Server stellt fest, dass sich mind. ein Wert geändert hat, erzeugt ein neues PNG und triggert das Update auf dem Kindle per SSH.
Frage: Hast du eine Idee, wie man die Tasten des Kindle abfragen kann? Denke gerade über mehrere Images zum durchblättern nach. Oder ein “Force-Update”, wenn man die Tastatur-Taste drückt…. oder, oder, oder….
Hallo Michael,
freut mich zu hören das es funktioniert. Wie hast Du das mit dem vom Server getriggerten Update und ohne den Cron auf dem Kindle gemacht?
Mein Kindle schaltet WLAN immer nur kurz an wenn der Cron ausgeführt und geht nach 15 Minuten komplett schlafen. Dadurch hält der Akku erheblich länger. Ich muss allerdings zum Aufwecken einmal kurz auf den Anschalter drücken. Das ist soweit OK allerdings dauert es dann immer etwas bis der Cron auf dem Kindle startet und das aktualisierte Bild angezeigt wird. Ich hatte dann versucht das Script zum Holen und Anzeigen des Bildes mit Druck auf den Anschaltknopf zu starten (“Force-Update”). Das hat bisher leider nicht funktioniert, ich habe allerdings auch noch nicht viel Arbeit dafür investiert. Aktuell bin ich dabei ein Tablet mit FTUI für FHEM als Wandtablet vorzubereiten. Mit MotionDetector zum Anschalten des Displays beim vorbeigehen. Mittels FTUI bekommt man irgendwie mehr Information einfacher dargestellt. Die Kindle-Anzeige wird aber zusätzlich weiter genutzt.
Gruß
Chris
geht ziemlich easy per SSH:
SSH root@[IP-des-Kindle] ‘/mnt/us/forceupdate.sh’
in diesem forceupdate.sh Script definierst du was alles passieren soll.
Ich habe übrigens auch eine Lösung für die anderen Tasten gefunden: https://github.com/jp3141/KindleThermometer hier sind zwar noch nicht alle Tasten benutzt worden, für die fehlenden (Keyboard und DOWN) habe ich mir die IDs einfach anzeigen lassen… Ich bastel da noch ein wenig daran. Wenn ich mal was fertig habe, poste ich gerne mal nen Link darauf. Wird aber unter Umständen noch ein wenig dauern..
Zu deinem Tablet: Ich habe selbst ein “günstiges” Android 10 Zoll Tablet an der Wand. Nutze ioBroker (den vis-Adapter) Damit geht es echt sehr gut und schick….
@Chris
Hi Chris, in den Kommentaren schreibst du: “Mein Kindle schaltet WLAN immer nur kurz an wenn der Cron ausgeführt und geht nach 15 Minuten komplett schlafen. Dadurch hält der Akku erheblich länger.”
1. Teilst du mit uns mal deine aktuelle “zeige_daten.sh”?
1.1. Oder wie deaktivierst du das WLAN?
2. Wie lange hält der Akku deines Kindle 4?
——————–
@ Michael
Oh, du hast ja einiges überarbeitet.
1. Wie lange hält der Akku?
2. Teilst du mit uns deine Skripte?
Viele Grüße
Nico
Hallo Nico,
meine aktuelle zeige_daten.sh ist in diesem Artikel zu finden. In Zeile 3 wird das WLAN aktiviert und in Zeile 18 wieder deaktiviert. D.h. aber auch das der Kindle per SSH nur zu erreichen ist, wenn man einmal unten auf den Knopf drückt und dann solange wie der der Cron nicht gestartet wird. Der Akku hält maximal eine Woche.
Gruß
Chris
Servus Jungs,
hier meine Skripts:
https://github.com/nicoh88/kindle-kt3_weatherdisplay_battery-optimized
Komme mit einem KT3 auf eine Akkulaufzeit von 30-35 Tage. War ganz schönes gebastel, hat sich aber gelohnt. 😉
Gruß Nico
Moin
Ganz blöde Frage, wo müssen die SVG Dateien denn liegen, damit das Skript diese findet? Wenn ich ein vereinfachtes Skript zum testen ausführen möchte, bekomme ich folgende Fehlermeldung:
python /home/kindle/kindle.sh
Traceback (most recent call last):
File “/home/kindle/kindle.sh”, line 34, in
output = codecs.open(“sleep.svg”, “r”, encoding=”utf-8″).read()
File “/usr/lib/python2.7/codecs.py”, line 896, in open
file = __builtin__.open(filename, mode, buffering)
IOError: (Errno 2) No such file or directory: “sleep.svg”
Die Datei sleep.svg ist natürlich vorhanden, liegt im gleichen Verzeichnis wie das Skript (/home/kindle/)
Gruß
RED
Hallo,
eigentlich alles im gleichen Ornder wie das Python-Script…
Gruß
Chris
Hi
Hab es geschafft das Python Skript ans laufen zu bekommen und es wird auch das Output SVG erzeugt. Aber wo finde ich denn den Befehl um daraus ein PNG zu machen? Fehlt das nicht irgendwie im Skript?
Gruß
LED
Hallo,
das PNG wir mit einem kleinen Shell-Script (daten-script.sh) erzeugt, welches vorher der PNG-Konvertierung auch das Pythonscript aufruft:
[cc lang=”bash”]
#!/bin/sh
cd “$(dirname “$0″)”
python2 daten-script.py
rsvg-convert –background-color=white -o daten_script_output.png daten_script_output.svg
pngcrush -c 0 -o daten_script_output.png daten_output.png
[/cc]
Gruß
Chris
OK, so langsam komme ich weiter. Ich kann jetzt meine eigenen Sensoren abfragen und auch Wetterdaten bekommt mein Skript. Aus dem SVG kann ich ein PNG erstellen und es auf dem Webserver ablegen.
Aber ich verstehe nicht wo die Wettericons herkommen. Wenn ich die Original SVG Dateien mit Inkscape öffne, sind da nur die Platzhalter Variablen. Kann ich theoretisch auch andere Grafiken einbinden? Diagramme zum Beispiel? Danke!
Gruß
LED
PS: Warum hast Du eigentlich keine Feinstaubwerte mehr auf deiner Seite?
Hi
Musste erst ein bisschen Python lernen und hatte viele Probleme auf dem Weg zu bewältigen. Habe jetzt auch endlich verstanden, dass die Icons schon im SVG enthalten sind. Interessant!
Das mit dem weißen Bildschirm hat mich sehr viel Zeit gekostet, dabei lag es lediglich daran, dass der Convert Befehl aus dem SVG ein PNG16 und kein PNG8 gemacht hat. Lösung “depth 8” als Option angeben.
Ich nutze ebenfalls iobroker und habe es endlich geschafft über Simple-API an die gewünschten Daten ranzukommen. Mag für die meisten sehr einfach sein, aber ich habe bei 0 angefangen.
Mein Kindle hat einen dicken 5.000mAh Akku bekommen (der in der Wand versenkt wurde) und sollte damit ziemlich lange halten. SSH Zugriff habe ich jetzt auch endlich, nur wie man den Cronjob aktiviert ist mir noch schleierhaft.
Wo kann ich denn nachlesen was ich mit dem SSH Rootzugriff alles machen kann bzw. wie ich Dateien editieren kann und wo ich die passenden finde?
Gruß
LED