
Der Kindle von Amazon hat, wie viele ähnliche E-Book Reader, ein sogenanntes E-Ink Display. Diese Displayart hat die nette Eigenschaft, dass nur zur Aktualisierung Strom benötigt wird und der angezeigte Inhalt dann stromlos für einen sehr langen Zeitraum erhalten bleibt. Wer mehr wissen will kann sich hier (Wikipedia) schlau machen.
Das Display kann Bilder im JPG oder PNG Format anzeigen. Dabei müssen einige Vorraussetzungen erfüllt sein. Das Bild muss je nach Readerversion eine entsprechende Auflösung aufweisen und es muss in Graustufen konvertiert sein. Ich habe die Erfahrung gemacht, dass es entgegen anderslautender Aussagen nicht auf 16 Farben beschränkt sein muss abhängig von der benutzten Programmbibliothek.
Ein Bilderrahmen für die Großeltern
Die Idee ist es, den Großeltern einen digitalen Bilderrahmen zu schenken dessen Inhalt sich in regelmäßigen Abständen aktualisiert. Hierzu weckt die Software des Bilderrahmens diesen auf, greift auf einen FTPS-Server zu, holt sich ein gespeichertes Bild, konvertiert dieses ins richtige Format, stellt es auf dem Bildschirm dar und schaltet den den Bilderrahmen wieder in den Stand-By Modus um Strom zu sparen.
Dadurch bekommen die Großeltern regelmäßig ein schönes Bild ihrer Kinder und Enkel jenseits von Whatsapp & Co und das auch noch in einem schönen Rahmen.
Das Erscheinungsbild des Bilderrahmens steht dem eines mit echtem Foto in fast nichts nach. Manchmal wünscht man sich ein etwas besseres Reflektionsverhalten also die Fähigkeit einfallendes Licht zurückzuwerfen. Ein weißes Blatt Papier liegt hier bei ca 75%-80%. Der Kindle Paperwhite liegt mit seinem E-Ink Bildschirm nur bei ca. 40%, aber das ist ok.
Der JailBreake
Was ist das?
Um den Kindle in einen digitalen Bilderrahmen zu verwandeln, bietet es sich an den vorhandenen Bildschirmschoner zu nutzen. Leider kann dieser im Originalzustand nur die von Amazon hinterlegten Bilder darstellen. Möchte man hier etwas eigenes, dann muss der Kindle gehackt werden. In Fachkreisen nennt man das dann JailBreake.
Um den Kindle hat sich in den Jahren seit seiner Markteinführung eine große Gemeinschaft gebildet.
Ziel war es den Kindle zu personalisieren und eigene Software laufen zu lassen, handelt es sich doch um ein Linux Gerät. Anfangs war der JailBreake noch über Softwarelösungen durchführbar. Leider schläft Amazon nicht auf dem Baum und hat deshalb fiese Sperren in seine Firmware eingebaut.
Mein Kindle hatte schon beim Gebrauchtkauf die aktuellste Firmwareversion 12.1.2. An einen JailBreake per Software war nicht im Traum zu denken. Nun haben findige Leute einen Weg gefunden über die serielle Schnittstelle auf dem Mainboard den Kindle zu hacken.
Anleitung zum Serial JailBreake gibt es hier!
Ich habe es getan und es ist beiweitem nicht so schlimm wie es sich aufs Erste anhört. Die folgenden Bilder sind von einem Paperwhite 2 (anderes Projekt) der sich aber nur geringfügig von einem Paperwhite unterscheided. Die Vorgehensweise ist die gleiche.
Zuersteinmal muss der Kindle geöffnet werden. Das lässt sich mit einem nicht allzu scharfem Küchenmesser bewerkstelligen. Der Frontrahmen ist nur geklebt und lässt sich leicht entfernen. Im unteren Bereich wo der Schriftzug ist bitte etwas vorsichtig sein, da sind die LEDs für den Bildschirm der Hall Sensor für das Cover. Weiterhin kann man die Bildschirmschutzfolie ablösen wenn man mit dem Messer zu weit hineintaucht.

Danach liegen das Gehäuse und das Mainboard vor uns.

Jetzt werden alle Schrauben gelöst. Beim Paperwhite 2 3G sind es 10 Stück, vermutlich wegen der 3G Antenne. Beim Paperwhite sind es 11 Stück




Das Modem und die Sim Karte habe ich ausgebaut, weil ich mir dadurch einen geringeren Stromverbrauch verspreche. Kann auch nur Einbildung sein. Den Antennenaschluss lässt man einfach baumeln oder fixiert ihn mit Klebeband.

So, Akku raus und los gehts. Der Akku ist nur mit drei Schrauben befestigt.

Die serielle Schnittstelle ist schnell gefunden.

Jetzt gehts ans Löten. Wer sich das nicht zutraut, es gibt ganz gute Methoden zum lötfreien Kontaktieren. (lötfreies Kontaktieren) Man sollte bevor man anfängt zu Löten auf alle Fälle den Akku und ausbauen. Sicher ist sicher.

Der gelbe Draht geht zu TX am Adapter, der orange Draht zu RX und der grüne zu Masse (siehe unten). Den USB-RS232 Adapter habe ich bei Amazon gekauft. Hier muss man unbedingt darauf achten, dass er sich auf 1,8V stellen lässt oder von haus aus ein 1,8V Typ ist. Sonst kann man sich von seinem Kindle verabschieden!!!
Hier der Link zum USB-RS232 Adapter!


Wenn man die Kabel noch etwas mit Klebeband fixiert, kann das nicht schaden.
Ich werde jetzt hier nicht den ganzen Vorgang des Jailbreakes beschreiben. Das habe andere schon sehr detailliert getan. Siehe hier!
Das Kindle root Passwort bekommt man übrigens sehr komfortabel mit dem Kindle Password Tool heraus.
Was muss auf dem Kindle installiert werden:
- Jailbreake
- Jailbreake Hotfix
- KUAL
- KUAL helper um ab Firmware 5.6.x Softwarepakete installieren zu können,
- Usbnet für den Zugriff auf den Kindle über WLAN
- Python
- Screen Saver Hack für den Bildschirmschoner und etwas mehr, dazu später
Alle benötigen Softwarepakete bekommt man hier.
Die Installationsanweisungen findet man in den jewiligen Readme Dateien der Softwarepakete. Bei USBnet bitte unbedingt die Readme Datei lesen, hier kann viel schief gehen. Um genau zu sein, kann man sich, wenn´s dumm läuft, den Zugriff auf den Kindle komplett verbauen.
Eine sehr gute Anleitung für USBnet findet man hier.
Was muss auf dem PC installiert werden:
- PuTTy (Link) um mit dem Kindle in Kontakt zu treten
- Notepad++ (Link) um Dateianpassungen vornehmen zu können, Windows Editor funktioniert nich mit Linux Dateien, da er die Linux Line Endings entfernt,
- FTP Programm z.B. WinSCP (Link) um Dateien auf den Kindle zu transferieren. Das geht auch über USB ist aber mit WinSCP über WLAN viel komfortabler.
- RNDIS Treiber um den Kindle als Netzwerkkarte zu benutzen (Link)
Da ich auch zu der Gruppe Menschen gehöre, die ungern Anleitungen liest, habe ich sehr viel Zeit mit dem Versuch verbracht, mich über WLAN am Kindle anzumelden. Leider wurde mir der Zugang verwehrt da ich angeblich nicht über das richtige Passwort verfügte. In der README.txt von USBnet steht eindeutig drin, dass man sich zuerst über Telnet anmelden soll.

WLAN muss am Kindle ausgeschaltet sein und der Kindle über USB im Modus USBNet enabled (kein MassStorage) sein. Die IP-Adresse ist die, welche in der config Datei im Ordner usbnet/ect, festgelegt ist.

Telnet verlangt kein Passwort aber der Zugang über WLAN mit PuTTY. Also auf alle Fälle das Passwort als root mit
- mntroot rw (Lese- und Schreibrechte auf Root System vergeben)
- passwd
ändern. Hat man das erledigt setzt man das Root system wieder auf read only.
- mntroot ro
Danach sollte die Anmeldung über WLAN funktionieren. Die Einstellungen für PuTTy findet man in der Serial Jailbreake Beschreibung unter Punkt 3. Set up PuTTy)
Der Rahmen
Der Rahmen ist für ein Foto der Größe 13×18. Der Ausschnitt im Passepartout hat die Maße 118mm x 88mm. Damit hat man eine ungefähre Randabdeckung des Kindle Bildschirmes von umlaufend 1mm.
Den Kindle selbst habe ich mit doppelseitigem Klebeband auf die Rückseite des Passepartouts geklebt. Im Rahmen wurde ein Loch eingearbeitet um an die USB Buchse des Kindles zu kommen. Somit lässt sich der Bilderrahmen auch einigermaßen komfortabel aufladen.
Die Aufbereitung der Bilder für den Screen Saver Hack funktioniert am Besten mit Gimp. Das ist kostenlos und ein sehr guter Photoshop Ersatz. Die Anforderungen an ein Screen Saver Bild sind folgende:
- Auflösung muss der des Bildschirmes entsprechen sonst sieht das nachher sehr wild aus. Der Paperwhite und der Paperwhite 2 haben 758 x 1024.
- Das Bild sollte in Graustufen mit 8bit Auflösung konvertiert werden und als .png gespeichert werden
- Manch Leute fordern noch eine Reduzierung auf 16 Graustufen (Indiziert) was ich aber nicht bestätigen kann. Es funktioniert auch mit mehr Graustufen.
- Das Bild muss 90° gegen den Uhrzeigersin gedreht werden, damit es auf dem Bilderrahmen im Querformat richtig dargestellt wird es sei denn man will einen Bilderrahmen im Hochkantformat haben.
Die Bilder müssen eine fortlaufende Nummerierung haben. Die Bilder einfach im Ordner:
/mnt/us/linkss/screensavers/
abspeichern und den Kindle neu starten. Der Screen Savers Hack benennt angeblich alle Bilder nach seinen Vorstellungen um. Ich habe das nie probiert. Ich habe alle Bilde im Vornherein schon in fortlaufender Nomenklatur benannt.
- bg00_medium_001
- bg00_medium_002
Wozu dient der Kühlschrankmagnet

Da ich den Kindle als Bilderrahmen benutzen möchte und nicht nur als Bildschirmschoner auf einem normal genutzten Kindle muss eine Möglichkeit her, die Bilder auf einfache Weise zu wechseln ohne auf einen Knopf zu drücken ect.
Für den Kindle gibt es eine Hülle, welche ihn beim Zuklappen in den Ruhezustand versetzt. Dafür hat der Kindle am unteren Rand in der Leiste wo sich auch die LEDs für die Bildschirmbeleuchtung befinden einen Hall-Sensor und die Hülle hat einen engesetzten Magneten. Schließt man nun die Hülle wird der Hall Sensor aktiviert und der Kindle geht in den Standby.

Diese Funktion habe ich mir zunutze gemacht und schalte nun die einzelnen Bilder mit dem Kühlschrankmagnet, der links unten in der Ecke vom Bilderrahmen liegt, durch. Schiebt man ihn kurz zur Seite startet der Kindle und schiebt man den Magnet zurück, dan wird das nächste Bild als Bildschirmschoner geladen.
Der Akku hält übrigens beim einmaligen Wechsel pro Tag ziemlich lange. Ich will nicht übertreiben, aber es sollten mindestens 200 Tage wenn nicht mehr sein, da man auch nicht jeden Tag wechselt.
Einen automatischen Wechsel kann man auch realiseren und genau darum geht es im Folgenden.
Der Bilderrahmen der alles alleine macht und fast ein Jahr lang durchhält!

Das Ziel war es von Anfang an einen digitalen Bilderrahmen zu bauen, der nicht permanent am Netzteil hängen muss und wenn möglich mindestens ein halbes Jahr oder mehr ohne aufladen auskommt. Aus diesem Grund ist die Entscheidung ja auch auf ein E-Ink Display gefallen.
Im Mobilereader Forum gibt es ein Script mit dem Namen Onlinescreensaver. Dieses Script wird einfach auf den Kindle kopiert und läd dann automatisch nach einem selbstdefiniertem Zeitraum ein PNG-Bild von einer Web-Adresse.
Leider war es mir nicht möglich dieses Script zum Laufen zu bekommen.
Ich bin dann nach einigen Recherchen auf die Seite von Nico Hartung gestoßen. Er benutzt den Kindle um ein mit Python erstelltes Bild mit Daten von einer Wetterstation als Wetterdisplay anzuzeigen. Das Bild holt sich der Kindle von einem eigens eingerichteten Server wo die Daten der Wetterstation gesammelt und in ein Bild gepackt werden.
Auf Basis von Nicos Script habe ich ein eigenes Script geschrieben, welches den Kindle einmal am Tag aufweckt, auf einen FTP-Server zugreift, ein dort hinterlegtes Bild herunterläd, es mit Imagemagick (später mehr) auf dem Kindle bearbeitet um den Kindle Konventionen zu entsprechen, dieses dann auf dem Bildschirm darstellt, einen Logfile an den FTPS Srever sendet und den Kindle dann wieder schlafen schickt. Als Aufwachzeit habe ich mich für Mitternacht entschieden. Da schlafen die meisten Leute und wenn man morgens aufsteht, kann man sich über ein neues Bild freuen.
Das Script läuft permanet durch, weckt den Kindle auf, aktualisiert den Bildschirm und schickt den Kindle wieder schlafen. Möchte man eine Aktualisierung erzwingen, kann man den Kindle duch drücken der Taste aufwecken oder einen Magneten and den HALL-Sensor (siehe oben) halten. Das hat den gleichen Effekt, als würde er um Mitternacht selbstständig aufwachen. Wenn der Kindle schläft, befindet sich das Programm im RAM. Hier wird der Schlafmodus Suspend to RAM (ACPI Modus S3) genutzt. Alle ungenutzen
Hier das Script:
#!/bin/sh ########################################################### ### Programmer: Nico Hartung <nicohartung1@googlemail.com># ### chnaged for Picture Frame Mario Deuse <mdauso@web.de> # ########################################################### ########################################################### ## Install # ## copy onlinepictureframe folder to mnt/us/extensions/ # ## activate or deaktivate as usual in KUAL # ########################################################### #VERSION # - 20200307_V010 # - due to it´s speed on paperwhite 2 the script ends before midnight # 120 seconds added to make shure the script sets the wakeup time to next day # - 20200218_V009 # - status bar deactivated # - 20200217_V008 # - imagemagick optimized for better dithering and cropping of pictures to fill screen even # if the aspect ration doesn`t fit to screen aspect ratio # to prevent from bars on upper and lower side of the picture # - 20200212_V007 # - checking for new script on server, copy to script direction and reboot # - Hostname added for picture frame location # - 20200212_V006 # - V005 not used # - DynDNS from MyFritz used from now on # - tmp folder removed from script, # downloaded pictures will now be stored inside bin folder, # - 20200207_V004 # - usage of FTPS instead of FTP from now on # - 20200206_V003 # - V002 not used # - sleep 4 min after STR when battery level is low, when connecting charger the Kindle wakes up but the battery # - will not be over minimum level and the script would go into STR again ############################################################ # Variables NAME=pictureframe NAMEOLD=pictureframe_old SCRIPTDIR="/mnt/us/extensions/onlinepictureframe/bin/" TEMPDIR="/mnt/us/documents/" LOG="${SCRIPTDIR}/${NAME}.log" LOGOLD="${SCRIPTDIR}/${NAMEOLD}.log" #FTPS Server the pictures are located on USER="xxx" # FTPS user PASSWORT="xxx" # FTPS password PORT="xxx" # port of FTPS-Server FTPADRESSE="xxx" # DynDNS adress of FTPS server #Where will the picture frame be located #HOSTNAME="xxx" HOSTNAME="xxx" #HOSTNAME="xxx" ROUTERIP="192.168.178.1" # Standard Gateway AVM Fritz!Box #ROUTERIP="192.168.2.1" # Standard Gateway Telekom Speedport #!!!Be sure to have this folder structure on FTPS-Sever or change the script here!!! ORT="/Bilderrahmen/Bilder/${HOSTNAME}/abc.JPG" # location of picture on server FTPLOG="/Bilderrahmen/Logfiles/${HOSTNAME}/" # location of Logfile on server NEWSCRIPT="/Bilderrahmen/Newscript/${HOSTNAME}/${NAME}.sh" # new script on server #!!!The picture on FTPS-server must have the right name and ending: "abc.JPG" !!! TEMPFILEJPG="${SCRIPTDIR}/abc.jpg" TEMPFILEPNG="${SCRIPTDIR}/abc.png" LOGCOUNTER=0 # number of Log entries LOGCOUNTERALL=1 # number of Log´s NET="wlan0" LIMG="${SCRIPTDIR}" LIMGBATT="${SCRIPTDIR}/pictureframebattery.png" LIMGERR="${SCRIPTDIR}/pictureframeerror_image.png" LIMGERRWLAN="${SCRIPTDIR}/pictureframeerror_wlan.png" LIMGWEISS="${SCRIPTDIR}/weiss.png" LIMGNEWSCRIPT="${SCRIPTDIR}/newscript.png" SUSPENDFORS=600 # short sleeping time in case of ERROR BATTERYALERT=10 # from this Battery Level on to lower values a info will be displayed BATTERYLOW=6 # from this Battery Level on to lower values the picture frame will go into STR an show a "Please Charge Picture" BATTERYSLEEP=432000 # 5 days sleep time when Battery Level is equal or below "BATTERYLOW" ################################################################################### ### Functions kill_kindle() { initctl stop framework > /dev/null 2>&1 # "powerd_test -p" doesnt work, other command found initctl stop cmd > /dev/null 2>&1 initctl stop phd > /dev/null 2>&1 initctl stop volumd > /dev/null 2>&1 initctl stop tmd > /dev/null 2>&1 initctl stop webreader > /dev/null 2>&1 killall lipc-wait-event > /dev/null 2>&1 } customize_kindle() { mkdir /mnt/us/update.bin.tmp.partial # prevent from Amazon updates touch /mnt/us/WIFI_NO_NET_PROBE # do not perform a WLAN test } #return true if keyword not found wait_wlan() { return `lipc-get-prop com.lab126.wifid cmState | grep CONNECTED | wc -l` } ################################################################################### ### Script ### stop Kindle pocesses kill_kindle ### customize Kindle customize_kindle ################################################################################### ### Loop while true; do echo "." >> ${LOG} 2>&1 echo "." >> ${LOG} 2>&1 echo "========================================================" >> ${LOG} 2>&1 echo "`date '+%Y-%m-%d_%H:%M:%S'` Logbucheintrag Nr. ${LOGCOUNTER} von Logbuch Nr. ${LOGCOUNTERALL}" >> ${LOG} 2>&1 echo "========================================================" >> ${LOG} 2>&1 ### activate CPU Powersave echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo "`date '+%H:%M:%S'` CPU runtergetaktet." >> ${LOG} 2>&1 ### switch off screen saver lipc-set-prop com.lab126.powerd preventScreenSaver 1 >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Bildschirmschoner ausgeschaltet." >> ${LOG} 2>&1 ### switch off the top status bar lipc-set-prop com.lab126.pillow disableEnablePillow disable #lipc-set-prop com.lab126.pillow interrogatePillow '{"pillowId": "default_status_bar", "function": "nativeBridge.hideMe();"}' #PILLOW_SOFT_DISABLED="yes" echo "`date '+%H:%M:%S'` Statusleiste deaktiviert." >> ${LOG} 2>&1 ### check battery level and maybe start STR CHECKBATTERY=`gasgauge-info -s` if [ ${CHECKBATTERY} -le ${BATTERYLOW} ]; then echo "`date '+%H:%M:%S'` Akkuladung bei 5%, statisches Batteriezustandsbild gesetzt!" >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Logfile an Sever gesendet." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` STR, bitte Akku aufladen!" >> ${LOG} 2>&1 eips -f -g "${LIMGBATT}" /mnt/us/usbnet/bin/curl -T ${LOG} -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${FTPLOG} # send Logfile to server rtcwake -d /dev/rtc1 -m no -s ${BATTERYSLEEP} # picture frame will sleep for X days or wakes up in case of charging. echo "mem" > /sys/power/state sleep 300 # waiting time when charging until battery level is higher than "BATTERYLOW" otherwise it will fall into sleep again else echo "`date '+%H:%M:%S'` Verbleibende Akkuladung: `gasgauge-info -c` " >> ${LOG} 2>&1 fi ### activate WLAN lipc-set-prop com.lab126.wifid enable 1 >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` WLAN aktivieren. " >> ${LOG} 2>&1 WLANNOTCONNECTED=0 WLANCOUNTER=0 SHORTSUSPEND=0 ### wait for WLAN while wait_wlan; do if [ ${WLANCOUNTER} -gt 30 ]; then echo "`date '+%H:%M:%S'` Kein bekanntes WLAN verfügbar." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` DEBUG ifconfig > `ifconfig ${NET}`" >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` DEBUG cmState > `lipc-get-prop com.lab126.wifid cmState`" >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` DEBUG signalStrength > `lipc-get-prop com.lab126.wifid signalStrength`" >> ${LOG} 2>&1 eips -f -g "${LIMGERRWLAN}" WLANNOTCONNECTED=1 SHORTSUSPEND=1 #short sleeptime will be activated break fi let WLANCOUNTER=WLANCOUNTER+1 echo "`date '+%H:%M:%S'` | ${HOSTNAME} | Warte auf WLAN (Versuch ${WLANCOUNTER})." >> ${LOG} 2>&1 sleep 1 done ### connected to WLAN? if [ ${WLANNOTCONNECTED} -eq 0 ]; then echo "`date '+%H:%M:%S'` Mit WLAN verbunden." >> ${LOG} 2>&1 ### lost Standard Gateway if WLAN`s not available GATEWAY=`ip route | grep default | grep ${NET} | awk '{print $3}'` echo "`date '+%H:%M:%S'` ausgelesener Standard-Gateway: ${GATEWAY}." >> ${LOG} 2>&1 if [ -z "${GATEWAY}" ]; then route add default gw ${ROUTERIP} >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Standard-Gateway nach Sleep nicht mehr vorhanden." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Standard-Gateway wird neu auf ${ROUTERIP} gesetzt." >> ${LOG} 2>&1 fi ### Check new Script /mnt/us/usbnet/bin/curl --silent --time-cond ${SCRIPTDIR}/${NAME}.sh --output ${TEMPDIR}/${NAME}.sh -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${NEWSCRIPT} #-r File Name (File exists and is readable) if [ -r ${TEMPDIR}/${NAME}.sh ]; then cp ${TEMPDIR}/${NAME}.sh ${SCRIPTDIR}/${NAME}.sh rm ${TEMPDIR}/${NAME}.sh echo "`date '+%H:%M:%S'` Skript aktualisiert, Neustart durchführen." >> ${LOG} 2>&1 chmod 777 ${SCRIPTDIR}/${NAME}.sh eips -f -g ${LIMGNEWSCRIPT} sleep 5 reboot exit else echo "`date '+%H:%M:%S'` Kein neues Skript auf dem Server gefunden." >> ${LOG} 2>&1 fi ### download picture and send to screen ### download using cURL /mnt/us/usbnet/bin/curl -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${ORT} -o ${TEMPFILEJPG} ### Is there any picture? #-r File Name (File exists and is readable) if [ -r ${TEMPFILEJPG} ]; then echo "`date '+%H:%M:%S'` Bild auf Server gefunden und heruntergeladen." >> ${LOG} 2>&1 ### edit picture with Imagemagick to fulfill eips demands /mnt/us/linkss/bin/convert ${TEMPFILEJPG} -auto-orient -filter LanczosSharp -brightness-contrast 3x15 -resize x758 -gravity center -crop 1024x758+0+0 +repage -rotate 270 -colorspace Gray -dither FloydSteinberg -remap /mnt/us/linkss/etc/kindle_colors.gif -quality 75 -define png:color-type=0 -define png:bit-depth=8 ${TEMPFILEPNG} echo "`date '+%H:%M:%S'` Bild mit Imagemagick bearbeitet." >> ${LOG} 2>&1 ### send picture to screen eips -f -g ${LIMGWEISS} #cover the screen in white to prevent from shadows sleep 1 #let´s sleep a second, e-ink´s are not the fastest eips -f -g ${TEMPFILEPNG} #load picture to screen echo "`date '+%H:%M:%S'` Bildschirm aktualisiert." >> ${LOG} 2>&1 else eips -f -g ${LIMGWEISS} #cover the screen in white to prevent from shadows sleep 1 #let´s sleep a second, e-ink´s are not the fastest eips -f -g ${LIMGERR} #show error picture echo "`date '+%H:%M:%S'` Kein Bild gefunden, Error-Bild gesetzt." >> ${LOG} 2>&1 SHORTSUSPEND=1 #short sleep time will be activated fi ### delete temp. files rm ${TEMPFILEJPG} rm ${TEMPFILEPNG} echo "`date '+%H:%M:%S'` Temporaere Dateien entfernt." >> ${LOG} 2>&1 if [ ${CHECKBATTERY} -le ${BATTERYALERT} ]; then eips 2 2 -h " Akku bei 10 Prozent, bitte aufladen " fi fi ### calculate and set WAKEUPTIMER if [ ${SHORTSUSPEND} -eq 1 ]; then TODAY=$(date +%s) WAKEUPTIME=$(( ${TODAY} + ${SUSPENDFORS} )) echo "." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Ein Fehler ist aufgetreten, neuer Versuch am: `date -d @${WAKEUPTIME} '+%Y-%m-%d_%H:%M:%S'`" >> ${LOG} 2>&1 echo "." >> ${LOG} 2>&1 rtcwake -d /dev/rtc1 -m no -s ${SUSPENDFORS} else TOMORROW=$(date +%s -d 23:59) TODAY=$(date +%s) SUSPENDFORL=$((${TOMORROW} - ${TODAY} + 120)) #120 seconds added to make shure it´s past midnight WAKEUPTIME=$((${TODAY} + ${SUSPENDFORL})) echo "." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Alles OK, Bilderrahmen wird am: `date -d @${WAKEUPTIME} '+%Y-%m-%d_%H:%M:%S'` neu gestartet" >> ${LOG} 2>&1 echo "." >> ${LOG} 2>&1 rtcwake -d /dev/rtc1 -m no -s ${SUSPENDFORL} fi ### at 365 Log entries the Log will be saved as "pictureframe_old.log" on FTP server, the Log on Kindle will be deleted and a new Log will be created with number +1 let LOGCOUNTER=LOGCOUNTER+1 if [ ${LOGCOUNTER} -gt 365 ]; then cp ${LOG} ${LOGOLD} echo "`date '+%H:%M:%S'` Alter Logfile wird auf dem Sever gesichert und vom Bilderrahmen geloescht." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Ruhezustand wird gestartet." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Bye Bye!" >> ${LOG} 2>&1 /mnt/us/usbnet/bin/curl -T ${LOGOLD} -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${FTPLOG} rm ${LOGOLD} && rm ${LOG} LOGCOUNTER=0 let LOGCOUNTERALL=LOGCOUNTERALL+1 else ### send Logfile to FTP Server echo "`date '+%H:%M:%S'` Aktueller Logfile wird an den Sever gesendet." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Ruhezustand wird gestartet." >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Bye Bye!" >> ${LOG} 2>&1 /mnt/us/usbnet/bin/curl -T ${LOG} -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${FTPLOG} fi ### Go into STR echo "mem" > /sys/power/state done
Erklärungen zum Script:
# Variables NAME=pictureframe NAMEOLD=pictureframe_old SCRIPTDIR="/mnt/us/extensions/onlinepictureframe/bin/" TEMPDIR="/mnt/us/documents/" LOG="${SCRIPTDIR}/${NAME}.log" LOGOLD="${SCRIPTDIR}/${NAMEOLD}.log"
SCRIPTDIR und TEMPDIR:
Der Teil /mnt/us/extensions des Ordners SCRIPTDIR ist vorhanden wenn nach dem Jailbreake KUAL installiert wurde. Die Erweiterung onlinepictureframe/bin/ ist Bestandteil des Scripts und wird beim Kopieren des Scriptes in den „extensions“ Ordner von KUAL erzeugt. Der Ordner TEMPDIR ist bereits auf dem Kindle vorhanden.
FTPS-Server
#FTPS Server the pictures are located on USER="xxx" # FTPS user PASSWORT="xxx" # FTPS password PORT="xx" # port of FTPS-Server FTPADRESSE="xxx" # DynDNS adress of FTPS server #Where will the picture frame be located #HOSTNAME="xxx" HOSTNAME="xxx" ROUTERIP="192.168.178.1" # Standard Gateway AVM Fritz!Box #ROUTERIP="192.168.2.1" # Standard Gateway Telekom Speedport
USER, PASSWORT, PORT und FTPADRESSE
Hier werden die Zugangsdaten, die Serveradresse und der Port für den FTPS Server eingetragen. In meinem Falle ist es die heimische Fritz!Box mit freigegebem Datenspeicher. Hierbei ist es wichtig, dass eine dynamische DNS Adresse verwendet wird. Da der Internetprovider die Verbindung einmal am Tag kappt und neu aufbaut, ändert sich die IP-Adresse des Routers ständig und er ist im Netz nicht mehr zu finden. AVM bietet mit der Fritz!Box und dem Dienst MyFritz bereits eine DynDNS an. Man kann sich aber auch bei vielen Anbietern einen DynDNS Dienst einrichten. Google ist auch hier Dein Freund.
HOSTNAME
Den Hostnamen brauche ich, da ich zwei Bilderrahmen an unterschiedlichen Orten in Betrieb habe. Die beiden Rahmen werden mit unterschiedlichen Bildern gefüttert und müssen somit auch auf verschiedene Ordner auf dem FTPS Server zugreifen.
ROUTERIP
Der Standardgateway (ROUTERIP) wird angegeben, weil der Kindle diesen manchmal aus ungeklärtem Grund vergisst und dann nicht mehr ins Internet kommt. Sollte das der Fall sein, dann wird der hier angegebene Standardgateway je nach Router neu gesetzt.
Ordnerstruktur auf dem FTPS- Server
#!!!Be shure to have this folder structure on FTPS-Sever or change the script here!!! ORT="/Bilderrahmen/Bilder/${HOSTNAME}/abc.JPG" # location of picture on server FTPLOG="/Bilderrahmen/Logfiles/${HOSTNAME}/" # location of Logfile on server NEWSCRIPT="/Bilderrahmen/Newscript/${HOSTNAME}/${NAME}.sh" # new script on server #!!!The picture on FTPS-server must have the right name and ending: "abc.JPG" !!! TEMPFILEJPG="${SCRIPTDIR}/abc.jpg" TEMPFILEPNG="${SCRIPTDIR}/abc.png"
Das Script verlangt eine bestimmte Ordnerstruktur auf dem Server. Entweder man hält sich daran oder man schreibt das Script um. Das kann jeder machen wie er will. Bei mir gibt es zwei Bilderrahmen an unterschiedlichen Orten in der Republik. Dies wird mit dem Hostnamen gesteuert.
- ORT: Wo liegt das Bild auf dem FTPS-Server
- FTPLOG: Wo soll der Logfile abgespeichert werden.
- NEWSCRIPT: Hier wird nach einem aktuellerem als dem, auf dem Kindle laufenden, Script geschaut. Sofern vorhanden und neueren Datums, wird dieses heruntergeladen und im Scriptordner unter dem Scriptnamen abgespeichert, danach wird ein Neustart durchgeführt und das neue Script geladen.
Bisher ist es mir nicht gelungen mittels Wildcards (*.JPG , abc.* oder *.*) einfach irgendeine Datei herunterzuladen. Kann sein, dass das Linux auf dem Kindle keine Wildcards unterstützt. Aus diesem Grund muss das herunterzuladende Bild abc.JPG heißen. Warum? Das hab ich mir so ausgedacht.
Tempfile
- TEMPFILEJPG: Diese Angabe dient dazu, damit cURL weiß, wo es die heruntergeladene Dateie hinspeichern soll.
- TEMPFILEPNG: Diese Angabe dient dazu, damit Imagemagick (später mehr zu cURL und Imagemagick) weiß, wo es das bearbeitete Bild hinspeichern soll.
- Beide Dateien sowohl TEMPFILEJPG als auch TEMPFILEPNG werden nach erfolgreicher Aktualisierung des Bildschirmes gelöscht.
Zeiten
SUSPENDFORS=600 # short sleeping time in case of ERROR BATTERYALERT=10 # from this Battery Level on to lower values a info will be displayed BATTERYLOW=6 # from this Battery Level on to lower values the picture frame will go into STR an show a "Please Charge Picture" BATTERYSLEEP=432000 # 5 days sleep time when Battery Level is equal or below "BATTERYLOW"
- SUSPENDFORS: Kürzere Schlafzeit im Falle eines Fehlers. Falls das Script kein Bild auf dem Server findet oder kein WLAN erreichbar ist geht der Kindle nur für 10 Minuten schlafen, statt bis Mitternacht zu warten, und versucht es dann nochmal.
- BATTERYALERT: Gibt an, ab welchem Akkuladezustand ein Schriftzug auf dem Bildschirm erscheint, mit der Aufforderung den Bilderrahmen aufzladen, da der Akku nur noch 10% hat.
- BATTERYLOW: Ab 6% Akkuladung geht der Bilderrahmen in den Ruhezustand und wacht erst nach BATTERYSLEEP ( in diesem Falle 5 Tagen ) oder beim Anstöpseln des Ladegerätes wieder auf. Wird nicht aufgeladen geht der Bilderrahmen nach 5 Tagen wieder in den Ruhezustand.
Weitere Programmschritte
Wenn das Script startet werden zuerst einige nicht benötigte Prozesse auf dem Kindle gestoppt um Energie zu sparen.
Es wird ein Ordner angelegt, der Amazon vorgaugelt, es wird gerade ein update geladen. Damit soll verhindert werden, dass Amazon über automatische Updates eine neue Firmware aufspielt und der Jailbreake dadurch zerstört wird.
### Functions kill_kindle() { initctl stop framework > /dev/null 2>&1 # "powerd_test -p" doesnt work, other command found initctl stop cmd > /dev/null 2>&1 initctl stop phd > /dev/null 2>&1 initctl stop volumd > /dev/null 2>&1 initctl stop tmd > /dev/null 2>&1 initctl stop webreader > /dev/null 2>&1 killall lipc-wait-event > /dev/null 2>&1 } customize_kindle() { mkdir /mnt/us/update.bin.tmp.partial # prevent from Amazon updates touch /mnt/us/WIFI_NO_NET_PROBE # do not perform a WLAN test
Im weiteren Verlauf wird die CPU Frequenz reduziert, der Bildschirmschoner deaktiviert und die obere Menueleiste incl. Statusleiste (Akku, WLAN, Uhrzeit…) ausgeschaltet. Manchmal hatte ich den Effekt, dass nach erfolgreicher Aktualisierung des Bildschirmes plötzlich noch die obere Statusleiste geladen wird und im Bild verbleibt. Das wird damit verhindert.
### activate CPU Powersave echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo "`date '+%H:%M:%S'` CPU runtergetaktet." >> ${LOG} 2>&1 ### switch off screen saver lipc-set-prop com.lab126.powerd preventScreenSaver 1 >> ${LOG} 2>&1 echo "`date '+%H:%M:%S'` Bildschirmschoner ausgeschaltet." >> ${LOG} 2>&1 ### switch off the top status bar lipc-set-prop com.lab126.pillow disableEnablePillow disable echo "`date '+%H:%M:%S'` Statusleiste deaktiviert." >> ${LOG} 2>&1
Download der Bilder über FTPS
Anfangs habe ich die Bilder über FTP mit wget vom Server geladen. Das war mir aber zu unsicher, wobei unsicher relativ ist, und ich habe mich für FTPS entschieden. Mehr gibt die Fritzbox leider nicht her. Nun kann wget aber kein FTPS. Da kommt cURL ins Spiel. cURL kann ziemlich viel, auch FTPS. Die Version von cURL, welche in der Kindle Linux Version mitgeliefert wird ist aber so alt, dass diese kein FTPS unterstützt.
Nach langem Suchen konnten mir die Leute aus dem Mobilereader Forum helfen. Im UsbNet Hack (welches im Rahmen des Jailbreake Prozedere installiert wurde!!!) ist eine neuere version von cURL enthalten. Wenn man im Script auf diesen Ordner referenziert wird diese Version benutzt und dann funktioniert es auch mit FTPS.
Man kann die Funktionalität von cURL recht einfach über den Befehl curl –version (2 Bindestriche!) in der Konsole herausfinden. Im Beispiel unten hab ich das mal schnell im Windows getan. Ja, cURL gibts auch unter Windows.

### download using cURL /mnt/us/usbnet/bin/curl -k --ftp-ssl --tlsv1 --ftp-ssl-reqd --ftp-pasv ftp://${USER}:${PASSWORT}@${FTPADRESSE}:${PORT}/${ORT} -o ${TEMPFILEJPG}
Bearbeitung der Bilder mit Imagemagick
Imagemagick ist ein Befehlszeilen Bildbearbeitungsprogramm und ist im Screen Saver Hack enthalten. Diese Befehlszeile öffnet das heruntergeldene Bild bearbeitet es und speichert es im passenden Format wieder ab.
Vielen Dank an NiLuJe für die hilfreichen Hinweise.
### edit picture with Imagemagick to fulfill eips demands /mnt/us/linkss/bin/convert ${TEMPFILEJPG} -auto-orient -filter LanczosSharp -brightness-contrast 0x20 -resize x758 -gravity center -crop 1024x758+0+0 +repage -rotate 270 -colorspace Gray -dither FloydSteinberg -remap /mnt/us/linkss/etc/kindle_colors.gif -quality 75 -define png:color-type=0 -define png:bit-depth=8 ${TEMPFILEPNG}
Ich werde hier nicht auf alle aufgerufenen Funktionen eingehen aber auf die wichtigsten.
- auto-orient: hier wird geprüft, wie die Orientierung des Bildes bei der Aufnahme war und das Bild dementsprechend ausgerichtet, auch wenn es auf dem Kopf steht.
- resize x758 -gravity center -crop 1024×758+0+0 +repage: Das Bild wird auf eine Höhe von 758 Pixel geändert ohne Rücksicht auf die Breite. Dann wird das Bild zentriert und auf eine Breite von 1024 Pixel beschnitten. Danach werden mit repage die Offset und Canvas Werte aus dem Header des Bildes entfernt, da diese sonst falsch stehen bleiben würden.
- Mit -rotate 270 wird das Bild gedreht, da ja der Kindle im Landscape Modus benutzt und sozusagen auf die Seite gelegt wird.
- colorspace Gray -dither FloydSteinberg: Diese beiden Befehle sorgen dafür, dass das Bild erstens in Graustufen umgewandelt wird und zweitens die Übergänge im Bild mit den verfügbaren 16 Graustufen so bearbeitet werden, dass keine Farbränder entstehen. Extrem würde das ausfallen bei gleichmäßigen Farbübergängen wie zum Beispiel bei Bildern mit bewölktem Himmel oder Nebel. (Beschreibung hier)


Der Rahmen
Den Bilderrahmen habe ich bei IDEAL-Trend GmbH in Berlin gekauft.
Dieser Rahmen ist perfekt, da er die nötige Tiefe bereitstellt. Somit ist genügend Platz für den Kindle, den USB Anschluss und die Verlängerung für den Taster. Das Passepartout (aussen 18cm x 24cm, innen 8,8cm x 11,8 cm) kann man sich im Netz bei unzähligen Shops anfertigen lassen oder man geht zum örtlichen Rahmenbauer. Der Kindle ist mit doppelseitigem Klebeband von hinten am Passepartout befestigt.
Hier ein Profilschnitt des Rahmens und die Darstellung der verschiedenen Möglichkeiten des Zusammenbaus. (Quelle: IDEAL Trend GmbH Berlin)

Die Variante welche ich benutze ist hier aber nicht dargestellt. Der Rahmen ist also wirklich sehr flexibel.



Der Holzstab zur Betätigung des Tasters ist hier noch nicht gekürzt und auch noch nicht schwarz eingefärbt. Links davon der in den Rahmen eingelassene USB Anschluss.


Das USB Kabel oder besser, die USB Verlängerung gibts bei Ebay. Der Knickschutz auf der Steckerseite muss entfernt werden, sondt passt es nicht. (siehe Bild weiter oben)

Wie kommen die Bilder auf den Bilderrahmen
Der einfachste Weg ist es ein Bild per FTPS auf den Server zu übertragen und es hinterher in abc.JPG umzubenennen. Leider hat diese Methode zwei Nachteile. Erstens wird die Bilddatei nicht verkleinert. Das führt zu längerer Laufzeit des Scripts einmal beim Herunterladen des Bildes vom Server und weiterhin beim Umwandeln mit Imagemagick. Zweitens muss man sich nochmals per FTPS auf dem Server anmelden um das Bild umzubenennen. Dieses auf dem Smartphone vorher zu tun führt nur zu noch mehr Arbeitsschritten.
Nach langem Suchen habe ich tatsächlich eine App gefunden, die meine Anforderungen voll erfüllt.
- FTPS Support,
- mehrere FTP-Server,
- Bilder komprimieren,
- Bilder umbenennen,
- überschreiben auf Server ohne nachfragen,
Die App PhotoSync gibt es für iOS und Android. (klick ins Bild)
Nachdem man die App installiert hat, kann man aus der Bildergallerie auf Teilen klicken und PhotoSync auswählen, aber zuerst sollte man die App einrichten.
PhotoSync einrichten
Nach dem Start der App klickt man unten rechts auf das kleine Zahnrad und landet im Einstellungsmenue. Hier klickt man auf Konfigurieren und landet im nächsten Menue.

Da es sich beim Server, auf dem die Bilder gesendet werden sollen (Fritz!Box) um einen FTP-Server handelt wählt man hier FTP aus.
Hier sind bereits die beiden Hosts eingerichtet, da es ja auch zwei verschieden Bilderrahmen gibt. In einem jungfräulichen PhotoSync wählt man „Konfiguration hinzufügen…“
Im Reiter „FTP/SFTP Account einrichten“ trägt man die Dyns-Adresse des Servers, den Benutzernamen, das Passwort und den Port ein. Oben wählt man FTPS aus sofern man dieses Protokoll nutzen möchte. Sonst gibt es noch FTP und SFTP.

Als Titel gibt man am Besten den Standort des Bilderrahmens ein. Der Zielordner eintspricht dem entsprechenden Ordner auf dem Server.
Unterverzeichnisse sollen nicht erstellt werden.
Vor Übertr. wählen muss aus sein, sonst fragt PhotoSync jedes mal nach, wo das Bild hin soll. Das nervt.
Dateinahmen hat ein extra Menue. Das kommt als nächstes.
Dann kann man noch die Qualität des Uploads einstellen. Damit reduziert PhotoSync sowohl die Bildgröße als auch die Dateigröße. Hier habe ich „Hohe Qualität“ gewählt. Dadurch dauert der Download auf dem Bildschirm nicht solange und Qualitätsprobleme konnte ich nicht feststellen.
Scrollt man weiter nach unten, kann man noch die Qualitätsstufe für den mobilen Upload einstellen.

Aber der Clou ist der Reiter Dateinamen.
Hier kann man einen eigenen Dateinamen vergeben. PhotoSync benennt die Datei dann selbstständig um und überschreibt die auf dem Server vorhandene Datei ohne nachzufragen wenn man im vorherigen Menue „Überschreiben zulassen“ aktiviert hat.
Der eigen Dateiname muss „abc.JPG“ sein wenn man das Script für den Kindle nicht ändern möchte.

Der Bilderupload
Der Upload eines Bildes sollte nun denkbar einfach vonstatten gehen. In der Galerie wählt man ein Bild aus und klickt auf Teilen. Danach erscheint folgender Bildschirm.

Nun wählt man PhotoSync als Übertragungsmedium aus. Dann gehts weiter zu folgendem Menue.

Hier wählt man FTP aus. Ich habe alle anderen Möglichkeiten ausgeblendet, dann sieht es übersichtlicher aus. Im folgenden Menue muss man noch die FTP-Konfiguration wählen, die man zuvor eingerichtet hat und gelangt im Anschluss ins Sendemenue.


Hier muss man nichts weiter tun als zu warten bis der Upload abgeschlossen ist.
Das war´s.
Jetzt kann man am Bilderrahmen den Knopf betätigen und hat in ca. zwei Minuten ein neues Bild, oder man geht schlafen und freut sich auf ein neues Bild welches einem den Morgen versüßt.


Casablanca
Eine Sache noch. Ihr hab Euch sicher gefragt, was das ganze gekostet hat. Hier noch eine kurze Auflistung.
- gebrauchter Kindle 25€ -50€ + Versand bei Ebay
- RS232-USB Adapter 10€ + Versand bei Amazon
- Bilderrahmen 9€ + Versand bei Ideal Trend GmbH Berlin
- Passepartout 16€ incl. Versand bei AllesRahmen.de
- USB Verlängerung 3€ + Versand bei Ebay
- PhotoSync Pro App 5,49€ im App-Store
Viel Spaß beim Nachbauen!
Mario
Download „Online Picture Frame“
4.3.2020 Nachtrag
Mittlerweile konnte ich das ursprünglich auf dem Paperwhite entwickelte Script auch auf einem Paperwhite 2 erfolgreich testen. Was mich total überrascht hat, ist die Verarbeitungsgeschwindigkeit auf dem Paperwhite 2.
Ich habe mal die Zeiten aus den Logfiles verglichen. Beide Bilderrahmen haben das gleiche Bild geladen.
Paperwhite
komplettes Script verarbeiten: 1:13 Minuten
Bild mit Imagemagick bearbeiten: 53 Sekunden
Paperwhite 2
komplettes Script verarbeiten: 21 Sekunden
Bild mit Imagemagick bearbeiten: 9 Sekunden
Fals Ihr euch also entscheided den Bilderrahmen nachzubauen, empfehle ich einen Paperwhite 2 zu nehmen. Das sollte die Akkulebensdauer midestens verdoppeln.
Viel Spaß!
Mario
Hey Mario, sehr, sehr cooles Projekt! Ich bin im November Vater geworden und möchte meinen Eltern gerne ebenfalls einen E-Ink-Fotorahmen schenken. Ich habe jedoch noch ein wenig Respekt vor dem Wartungsaufwand. Amazon ist ja dafür berüchtigt, doch noch irgendwie Firmware-Updates aufzuspielen, um den Jailbreake zu zerstören. Hat der Ordner (der Amazon vorgaugelt, dass ein Update geladen wird) bisher bei Dir funktioniert? Oder werde ich in Zukunft regelmäßig von Oma und Opa gebucht, um den Jailbreak vom Bilderrahmen zu erneuern? =)
LikeLike
Hallo DerDom,
bis jetzt scheint es zu funktionieren. Toi Toi Toi. Ich musste diesbezüglich noch nicht eingreifen. Ach ja, noch herzlichen Glückwunsch zum Nachwuchs.
Gruß,
Mario
LikeLike