Bauanleitung für einen digitalen Bilderrahmen – Teil 2

Nachdem ich im ersten Teil der Anleitung gezeigt habe, was alles an Hardware und Drumherum notwendig ist, geht es hier ans Eingemachte, damit das System auch lauffähig wird.
 Apple iPhone 7 (3.99mm, f/1.8, 1/10 sec, ISO100, 0 EV, Blitz: 24) 


Ziel des Ganzen war ja, ein stabiles System zu haben, welches sich hart ausschalten lässt und bei welchem sich mit wenig Aufwand die Zusammenstellung der Bilder ändern lässt.

Hierzu hatte ich mir folgende Vorgaben gemacht:

  • die Bilder liegen auf meinem Webspace und werden per FTP einzeln geladen
  • die Bilder sind in Unterordnern sortiert, eine Auswahl eines oder aller Ordner muss möglich sein
  • das System muss automatisch starten
  • eine Änderung der anzuzeigenden Bilder muss im laufenden Betrieb möglich sein

 

Das Grundsystem

Als Basis dient ein Raspbian, welches über die üblichen Quellen bezogen werden kann. Eine 8GB SD-Karte ist ausreichend. Das System wird nach Installation auf der Karte nach der Anleitung unter https://www.mehr4u.de/raspberry-pi-mit-readonly-filesystem.html folgendem Link als readonly-System eingerichtet. Damit ist die Basis für das simple Ausschalten per Funksteckdose o.ä. gegeben. Für die Einrichtung von WLAN und SSH gibt es im Netz entsprechende Anleitungen.

Jetzt werden die benötigten Zusatzpakete installiert (vorher wird ein Update & Upgrade des Systems ausgeführt):

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get install ntp curlftpfs fbi -y

Als nächstes habe ich den user „pi“ mittels

sudo raspi-config

und der Auswahl „Boot Options“ -> „Desktop / CLI“ -> „Console Autologin“ als Autologin-User angelegt. Das System start also automatisch als User „pi“ in die Konsole.

Im Verzeichnis /home/pi findes sich die Datei .profile, welche das Startscript für das Autologin ist. Dort hinein kommt folgendes ans Ende:

sleep 5 # 5sec warten. damit die WLAN-Verbindung steht
sudo curlftpfs -o allow_other benutzer:passwort@ftp-server /mnt/ftp/meinebilder/ # mittels curlftpfs das FTP-Verzeichnis nach /mnt/ftp/meinebilder mounten
sleep 10 # 10sec warten, damit das FTP-Verzeichnis sicher gemountet ist
sudo chmod 777 /mnt/ftp/meinebilder/files.txt
set PS1=""
setterm cursor off
clear
sudo killall -9 fbi # mögliche Prozesse von fbi killen
sudo cp /mnt/ftp/meinebilder/files.txt /tmp/files.txt 
sudo fbi -l /mnt/ftp/meinebilder/files.txt -T 1 -a -u -t 10 --blend 500 # fbi mit der Dateiliste starten

Danach noch mit

sudo mkdir /mnt/ftp
sudo mkdir /mnt/ftp/meinebilder

die Verzeichnisse für den Mountpoint anlegen, sonst funktioniert das nicht. 🙂
Zusätzlich habe ich mir für administrative Zwecke einen zweiten User mit sudo-Rechten angelegt, welcher ohne Autologin startet, damit nicht immer bei Arbeiten über SSH der fbi-Prozess neu angestoßen wird.

 

Cronjob und Uhrzeit

Durch das readonly-System wurden bei mir die Cronjobs nicht gespeichert, ebenso funktionierte die Urhzeit nicht mehr, wodurch der Zufallsgenerator eben keine zufälligen Ergebnisse mehr lieferte. Folgende Anpassungen habe ich vorgenommen:

Mittels

sudo nano /etc/init.d/scriptname

ein Script für die Zeitsynchronisation erstellt.
Da hinein kommt die Zeile

sudo dpkg-reconfigure ntp

Das Script wird mittels

sudo chmod +x /etc/init.d/scriptname

ausführbar gemacht und mit

sudo update-rc.d scriptname defaults

registriert, damit es beim Booten ausgeführt wird.

Für den Cronjob (Welcher Änderungen an der Dateiliste auf dem Webserver registriert) wird die Datei „cron_pi“ im Verzeichnis /home/pi angelegt und bekommt folgenden Inhalt:

* * * * * /home/pi/checkfiles.sh
* * * * * sleep 30 && /home/pi/checkfiles.sh

checkfiles.sh überprüft, ob sich die Verzeichnisliste auf dem Webserver geändert hat, wie genau, erläutere ich später. Der Cronjob wird aller 30sec ausgeführt, deswegen die 30sec Verzögerung in der zweiten Zeile.

Damit die Datei auch an die richtige Stelle kommt, muss /etc/rc.local angepasst werden. Dort hinein kommt vor! „exit 0“ folgendes:

sudo cp /home/pi/cron_pi /tmp/cron/crontabs/pi
sudo /etc/init.d/cron restart

Damit wird der Cronjob in das Benutzerverzeichnis geladen und gestartet.

Das dazugehörige Script checkfiles.sh liegt im Userverzeichnis von pi. Es sorgt dafür, dass regelmäßig abgefragt wird, ob sich die Dateiliste mit den Bildern geändert hat. Wenn ja, dann wird der fpi-Prozess gestoppt und mit der neuen Liste neu gestartet.

#!/bin/bash
sudo cp /tmp/files.txt /tmp/oldfiles.txt
sudo cp /mnt/ftp/meinebilder/files.txt /tmp/files.txt
DIFF=$(sudo cmp /tmp/files.txt /tmp/oldfiles.txt)
echo $DIFF
if [ -z "$DIFF" ];
then
	echo "Keine Änderung"
else
	sudo killall -9 fbi
	sudo fbi -l /mnt/ftp/meinebilder/files.txt -T 1 -a -u -t 10 --blend 500 
fi

Die Datei files.txt wird auf dem Webserver bei der Auswahl der Bilder erzeugt. Das Script muss natürlich mit chmod +x ausführbar gemacht werden.

 

Die Bilderauswahl auf dem Webserver

Ich speichere meine Bilder in verschiedenen Ordnern, meist im Schema Monat_Jahr, auf dem Webserver. Mittels eines PHP-Scripts erzeuge ich die Dateilist für fbi. Hierbei kann ich einen oder alle Ordner aufnehmen.

Die notwendigen Scripte mit Rekursion für Unterordner habe ich aus http://www.selfphp.de/kochbuch/kochbuch.php?code=44 genommen und entsprechend für mich angepasst.

Als erstes habe ich die Datei mit den benötigten Funktionen für die Verzeichnissuche. Diese wird dann entsprechend eingebunden und aufgerufen.

searchfiles.inc.php

' . "\n";
    $ausgabe .= '    ' . "\n";
    $ausgabe .= '
' . "\n"; return $ausgabe; } function buildfile($pictures) { reset ($pictures); $inhalt =""; foreach ($pictures as $key => $array) { //$inhalt .= $pictures[$key]['name']['dir']; foreach ($array as $key2 => $array1) { if (!empty($pictures[$key][$key2]['file'])){ $inhalt .= str_replace("meinebilder/","/mnt/ftp/meinebilder/",$pictures[$key]['name']['path']).$pictures[$key][$key2]['file']."\n"; } } } $handle = fopen("meinebilder/files.txt", w); fwrite ($handle, $inhalt); fclose ($handle); } ?>

Diese Datei wird von dirselect.php aufgerufen. An dirselect.php wird das zu durchsuchende Verzeichnis übergeben, und danach wird die Datei files.txt erstellt.


Zum Schluß habe ich die Datei für die eigentliche Auswahl, diese liest das Stammverzeichnis ein und zeigt mir die verfügbaren Unterordner, welche ich mittels Radiobutton auswählen kann.

select.php


Das ist jetzt noch nicht sonderlich formatiert, mit ein bisschen CSS lässt sich da bestimmt was machen. 🙂

Wenn ich nichts vergessen habe, dann sollte das jetzt eigentlich funktionieren. Aktuell bastele ich noch an einer Vorschau auf der Website, der lokale Webserver auf der Pi soll auch noch was zu tun bekommen, damit man fbi rudimentär über den Browser steuern kann. (anhalten, zurück, Bildinfo und sowas) Und curlftpfs muss ich noch überreden, eine SSL-Verbindung aufzumachen.

Hinterlasse einen Kommentar