Da es mich immer stört auf mein Handy zu schauen, wenn ich den Status einiger Geräte in FHEM abrufen möchte, habe ich ein wenig recherchiert und bin dabei auf eine Lösung gestoßen, in der ein Amazon Kindle Paperwhite 3 als Display für ein Dashboard benutzt wird. Wie ihr dies einrichten könnt, möchte ich euch heute in dieser Anleitung zeigen.

Wichtige Info vorweg: Ihr solltet ein Gerät ohne Spezialangebote haben. Versucht es gerne mit, bei mir ging es nicht. Die Freischaltung kostet 20 EUR.
Darüber hinaus solltet ihr in FHEM einen Web-View einrichten, der ohne SSL auskommt, da der Kindle diese nicht aufrufen kann. Ein Benutzer- und Passwort-Schutz funktioniert ohne Probleme (siehe unten).

Für die Installation inkl. Jailbreak braucht ihr ca. eine Stunde, wenn ihr meine Templates und Scripte verwendet.

Update (22.07.2016): Der Akku hält bei meinen Einstellungen (Update alle 10 Minuten) ca. eine Woche.

Genereller Ansatz: Der Kindle Paperwhite 3 zeigt als Bildschirmschoner den Status von FHEM als Bild (PNG) an – FHEM Dashboard. Dieses Bild wird aus einer SVG-Datei erzeugt, in der Platzhalter durch die jeweiligen Daten aus FHEM ersetzt werden. Die Gestaltung kann dabei individuell vorgenommen werden. Eine Interaktion ist nicht möglich.

Auf dem RaspberryPI (oder einem anderen Server)

ImageMagick installieren

apt-get install imagemagick 

Installation der Schriftart „Meteocons“

Damit ihr die Schriftart Meteocons in ImageMagick verwenden könnt, müsst ihr die Schriftart systemweit installieren.

  1. Font laden (hier hilft Google oder die aus Tablet-UI verwenden)
  2. Font (.ttf-Datei) nach /usr/share/fonts/truetype/meteocons kopieren
  3. Rechte setzen: sudo chmod -R a+r /usr/share/fonts/*
  4. Cache aktualisieren: sudo fc-cache -f -v

Das Template für die Statusanzeige (SVG Bilddatei) bzw. das FHEM Dashboard

Für den Amazon Kindle Paperwhite 3 muss das Bild eine Größe von 1072×1448 Pixel haben und (am besten) im Hochformat angelegt werden. Wer – so wie ich – den Kindle im Querformat anbringen möchte, muss im SVG dafür sorgen, dass der Inhalt gedreht wird.

Zunächst wird eine SVG-Datei, die als Template fungiert, erstellt. In dieser Datei werden Platzhalter (normaler Text) definiert, die später durch die Werte aus FHEM ersetzt werden. Anschließend wird diese Datei dann als PNG gespeichert, damit der Kindle Paperwhite diese auch anzeigen kann.

Das SVG-Template könnt ihr mit InkSkape erstellen. Ich habe es selbst „geschrieben“, damit ich genau bestimmen kann, was wie und wo passiert. Vorteil ist die Ausrichtung von Text (z. B. rechtsbündig und mittig) und die Erstellung von Styles. Es dauert ggf. etwas länger, dafür kann man sich aber auch sicher sein, dass alles funktioniert – inkl. eingebetteter Schriften.

Hier findet ihr ein Beispiel für ein Status-Template: template.svg

Die Funktion dkKindleDashboard()

Für die Erstellung habe ich eine eigene Funktion für das FHEM Dashboard geschrieben. Ihr könnt auch ein FHEM-Plugin (FR) verwenden, dieses finde ich aber für meine Zwecke zu unflexibel.


sub dkKindleDashboard() {
	my %yahoo_meteoconsmap = (
		"tornado" ,			"9",
		"tropicalstorm" ,		"&",
		"hurricane" ,			"!",
		"severethunderstorms" ,		"&",
		"thunderstorms" ,		"0",
		"mixedrainandsnow" ,		"V",
		"mixedrainandsleet" ,		"X",
		"mixedsnowandsleet" ,        	"X",
		"freezingdrizzle" ,            "W",
		"drizzle" ,                     "R",
		"freezingrain",                "W",
		"showers" ,                     "Q",
		"chanceofrain",               "Q",
		"snowflurries" ,               "U",
		"lightsnowshowers" ,          "U",
		"blowingsnow" ,                "W",
		"snow" ,                        "W",
		"hail" ,                        "X",
		"sleet" ,                       "X",
		"dust" ,                        "E",
		"foggy" ,                       "F",
		"haze" ,                        "L",
		"smoky" ,                       "M",
		"blustery" ,                    "!",
		"windy" ,                       "S",
		"cold" ,                        "G",
		"cloudy" ,                      "5",
		"mostlycloudy" ,                "N",
		"mostlycloudynight", 		"N",
		"partlycloudy" ,                "H",
		"clear" ,                       "B",
		"sunny" ,                       "B",
		"fair" ,                        "B",
		"mixedrainandhail" ,            "X",
		"hot" ,                         "B",
		"isolatedthunderstorms" ,       "Z",
		"scatteredthunderstorms" ,      "Z",
		"scatteredshowers" ,            "Q",
		"heavysnow" ,                   "#",
		"scatteredsnowshowers" ,        "V",
		"thundershowers" ,              "8",
		"snowshowers" ,                "$",
		"isolatedthundershowers" ,      "R"
    );

	my $filename_template = './www/images/template.svg';
	my $filename_output_svg = './www/images/status.svg';
	my $filename_output_png = './www/images/status.png';

	my $filedata;
	open (DATEI,'<',$filename_template) or die $!;
	while(){
    		$filedata = $filedata.$_;
	}
	close (DATEI);

	my $weather_icon_name = dkGetReading('Yahoo_Wetter', 'icon');
	$weather_icon_name =~ s/_| //g;
	my $weather_icon_code = $yahoo_meteoconsmap{$weather_icon_name};
	$filedata =~ s/WI/$weather_icon_code/;

	my $weather_condition = dkGetReading('Yahoo_Wetter', 'condition');
	$filedata =~ s/CONDITION/$weather_condition/;

	# weitere Ersetzungen hier einfügen

	open (DATEI,'>',$filename_output_svg) or die $!;
    	print DATEI "$filedata";
	close (DATEI);

	system("convert $filename_output_svg -type GrayScale -depth 8 $filename_output_png &");
}

Was macht diese Funktion?

Zunächst werden die Zeichencodes für die Meteocons für das Yahoo-Wetter definiert. Danach wird das Template (template.svg) geladen und die entsprechenden Platzhalter mit den Messwerten aus FHEM ersetzt. Anschließend wird die Datei als status.svg gespeichert und in ein Graustufen-PNG konvertiert (ImageMagick erforderlich, siehe oben).

Jetzt muss nur noch ein Timer für die automatischer Erstellung der Statusanzeige in FHEM angelegt werden. In meinem Fall wird die Funktion alle 10 Minuten aufgerufen.


define timer_statusanzeige_kindle at +*00:10:00 { dkKindleDashboard() }
attr timer_statusanzeige_kindle group Kindle
attr timer_statusanzeige_kindle room Test

Jailbreak Kindle Paperwhite

Der Jailbreak ist im Grund ganz einfach. Aber wie immer gilt: Nutzung auf eigene Gefahr.

  1. Download einer älteren Firmware 5.7.4 (Infos hier)
  2. Eine sehr gute Anleitung für einen („einfachen“ Jailbreak findet ihr hier)

Am besten legt ihr noch eine Datei bzw. einen Ordner mit dem Namen update.bin.tmp.partial an, um zu verhindern, dass der Kindle von Amazon ein Auto-Update bekommt.

Installation der Tools Screensaver und OnlineScreensaver

Nun kommt der etwas kniffelige Teil, keine Angst so schlimm ist es nicht.

Hier am besten die Dateien von der folgenden Seite verwenden, da ich insb. mit anderen KUAL-Versionen Probleme hatte Pakete zu installieren mit dem Kindle Paperwhite 3 (white). Zu den Snapshots of NiLuJe’s hacks. Bitte darauf achten, dass ihr euch die Pakete für das richtige Gerät ladet.

Hier braucht ihr folgende Pakete (Reihenfolge = Installationsreihenfolge):

  • KUAL
    Die Datei KUAL-KDK-2.0.azw2 in den Ordner documents auf dem Kindle kopieren.
    Ihr habt nun eine Art „Buch“ auf eurem Dashboard.
  • MR Package Installer
    Den Ordner MRInstaller in den Ordner extensions auf dem Kindle kopieren
  • Python 2.7
    Die Datei Update_python_0.14.N_install_pw2_kt2_kv_pw3_koa_kt3.bin in den Ordner mrpackages auf dem Kindle kopieren
  • ScreenSavers Hack
    Die Datei Update_linkss_0.24.N_install_pw2_kt2_kv_pw3_koa_kt3.bin in den Ordner mrpackages auf dem Kindle kopieren

Anschließend könnt ihr euer Buch Kindle Launcher öffnen. Dort wählt ihr den Menüpunkt Helper und dort Install MR Packages. Es folgt nun eine Installation der Pakete, die sich im Ordner mrpackages befinden.

Den OnlineScreensaver findet ihr auf dieser Seite: Online screensaver extension

  • Den Ordner onlinescreensaver in den Ordner extensions auf dem Kindle kopieren.
  • In KUAL steht euch nun ein weiterer Menüpunkt zur Verfügung.

Da der neue Kindle Paperwhite (bei den anderen kann ich es nicht sagen) einen speziellen Energiespar-Modus hat, funktioniert Online screensaver nicht sofort.

Kleiner Exkurs warum das so ist:

Der Kindle geht automatisch nach 10 Minuten Inaktivität in den Screen Saver Modus.
Nach weiteren 60 Sekunden wird der Power to Suspend Modus gestartet.
Nach weiteren 5 Sekunden geht der Kindle in den Sleep Modus. Nun werden keine Scripte mehr ausgeführt, um Energie zu sparen.
Folglich wird auch kein Bildschirm aktualisiert, da das Script pausiert.

Um dies zu übergehen muss das folgende Script scheduler.sh im Ordner /extensions/onlinescreensaver/bin/ ersetzt werden. Am besten ihr benennt das alte um. Achtet auf die korrekten Anführungszeichen, es ist wirklich eine Mischung aus und `. Bitte auch die Leerzeichen vor und nach den eckigen Klammern [] beachten.

#!/bin/sh

url="http://USER:PASS@192.168.x.y:8083/fhem/images/status.png"
screen_image="/mnt/us/linkss/screensavers/bg_ss00.png"

updateinterval=600 # in seconds
exitloop=0

while [ 1 -eq 1 ]
do
	exitloop=0

	if [ `lipc-get-prop com.lab126.powerd status | grep "Screen Saver" | wc -l` -gt 0 ]
	then
		wget -O $screen_image $url
		eips -f -g $screen_image

		while [ $exitloop -eq 0 ]
		do
			if [ `lipc-get-prop com.lab126.powerd status | grep "Ready" | wc -l` -gt 0 ]
			then
				lipc-set-prop com.lab126.powerd deferSuspend 3000000
				exitloop=1
			fi

			sleep 1
		done
	fi

	if [ `lipc-get-prop com.lab126.powerd status | grep "Ready" | wc -l` -gt 0 ]
	then
		while [ $exitloop -eq 0 ]
		do
			wget -O $screen_image $url
			eips -f -g $screen_image

			if [ `lipc-get-prop com.lab126.powerd status | grep -E "Active|Screen Saver" | wc -l` -gt 0 ]
			then
				exitloop=1
			fi

			if [ $exitloop -eq 0 ]
			then
				sleep $updateinterval
			fi
		done
	fi

	if [ $exitloop -eq 0 ]
	then
		sleep 10
	fi
done

Anschließend muss das Gerät neu gestartet werden (über Einstellungen –> Neustart), kein Framework Restart über KUAL.

Was macht das Script?

Das Script wird gleich nach dem Systemstart gestartet und läuft dann in einer nicht endenden Schleife. Es wird zunächst überprüft ob das Gerät im Modus „Screen Saver“ oder „Ready“ (for suspend) befindet. Nach dem Neustart des Gerätes wird der erste Zustand immer „Screen Saver“ sein.

Ist die erste Bedingung erfüllt, wird der Screen aktualisiert und die nächste Schleife solange durchlaufen bis exitloop=1 ist. Hierfür wird jeweils im Sekundentakt überprüft, ob das Gerät in den „Ready for suspend“ Modus wechselt. Ist dies der Fall, so wird exitloop auf 1 gesetzt und die Zeit für diesen Modus auf über 34 Tage gesetzt. Die Zeit kann nur verlängert werden, wenn sich das Gerät in dem Modus befindet. Ein früheres Setzen führt zu einem Fehler. Erfolgt dieser „Hack“ nicht, so geht das Gerät in einen tiefen Schlafmodus und das Script wird pausiert (siehe oben).

Ist exitloop=1, wird die Schleife abgebrochen.

Als nächstes wird geschaut, ob sich das Gerät in dem „Ready for suspend“ Modus befindet. Ist dies der Fall, so wird der Bildschirm aktualisiert. Nun wird noch sichergestellt, dass die Schleife wieder verlassen wird, wenn das Gerät angeschaltet wird. Ist dies der Fall (hier muss man min. so lange warten wie das definierte Intervall), wird exitloop wieder auf 1 gesetzt. Wenn exitloop=0 dann legt sich das Script für x Sekunden schlafen (Intervall in dem das Bild aktualisiert werden soll in Sekunden). In meinem Fall sind es 600 Sekunden = 10 Minuten.

Das war’s auch schon. Nun sind die Grundlagen für ein FHEM Dashboard gelegt, viel Spaß beim Basteln.

Schreibt mir eure Anpassungen und Optimierungen. Momentan verbraucht das Gerät doch sehr viel Strom.

Was lasst Ihr euch anzeigen? Wetter, Mülltermine, Alarmanlage?

Was Du dazu brauchst