Amazon Kindle als Statusdisplay

startseite_intranet
Webseite – Übersicht

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)
    • 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
    • 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)
        • hier mein SVG für die Datenanzeige und
        • hier für zwischen 23 und 5 Uhr
        • bei Änderungen mit Inkscape nicht im “Inkscape-Format” abspeichern sondern als “Normales SVG”
      • 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:

kindle_statusdisplay

Und hier die Anzeige für Nachts:

kindle_statusdisplay2

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

16 Gedanken zu „Amazon Kindle als Statusdisplay

  • Pingback: Amazon Kindle als Statusdisplay - Update - bubuxblog

  • 6. April 2016 um 13:02 Uhr
    Permalink

    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?

    Antwort
    • 6. April 2016 um 18:24 Uhr
      Permalink

      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”
      Kommt bei Dir immer der weisse Bildschirm? Hast Du ein K4? Passiert das bei “eips -g ” zur Anzeige des PNG-Bildes auch?
      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 Antwort

  • 2. Dezember 2016 um 18:24 Uhr
    Permalink

    Hallo,
    super Projekt, will ich unbedingt nachbauen!
    Vielen Dank!
    Lothar

    Antwort
  • 25. Januar 2018 um 10:08 Uhr
    Permalink

    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….

    Antwort
    • 26. Januar 2018 um 15:56 Uhr
      Permalink

      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

      Antwort
      • 26. Januar 2018 um 16:30 Uhr
        Permalink

        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….

        Antwort
  • 22. Februar 2018 um 22:54 Uhr
    Permalink

    @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

    Antwort
    • 4. März 2018 um 11:42 Uhr
      Permalink

      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

      Antwort
  • 14. Juli 2019 um 07:09 Uhr
    Permalink

    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

    Antwort
    • 20. Juli 2019 um 10:39 Uhr
      Permalink

      Hallo,

      eigentlich alles im gleichen Ornder wie das Python-Script…

      Gruß
      Chris

      Antwort
  • 16. Juli 2019 um 10:44 Uhr
    Permalink

    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

    Antwort
    • 20. Juli 2019 um 10:28 Uhr
      Permalink

      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

      Antwort
  • 23. Juli 2019 um 16:22 Uhr
    Permalink

    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?

    Antwort
  • 27. April 2020 um 11:49 Uhr
    Permalink

    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

    Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert