Damit das RaspberryPi auch nach längerer Zeit im ausgeschalteten Zustand die korrekte Systemzeit anzeigt, muss es beim Booten entweder eine Internetverbindung haben und über das NTP-Protokoll die lokale Zeit aktualisieren - oder die Entscheidung fällt auf ein RTC-Modul (Real-Time-Clock).
Es existieren verschiedene Modelle auf dem Markt. Für das vorliegende RaspberryPi Model 3 B scheint folgender Artikel von AZ-Delivery gut geeignet zu sein, aufgrund der guten Rezensionen habe ich mich zuerst daran versucht:
DS3231 RTC Real Time Clock
Das Modul besitzt sechs Pins, vier davon müssen mit den GPIO-Pins des Raspberry verbunden werden.
Folgendes Diagramm zeigt die Belegung der Pins eines Raspberry 3 Model B (Quelle):
Da es sich um das DS3231-Modul handelt, muss der VCC-Pin an einen 3.3V-Ausgang angeschlossen werden.
Dieser Blogeintrag erklärt das Vorgehen genauer. Befolgt man alle Anweisungen darin, ist man fast am Ziel.
Synchronisieren der Zeit bei Systemstart
In unserem Fall baute das Raspberry jedoch keine dauerhafte Verbindung zum RTC-Modul auf. Zu Testzwecken lief lief der Befehl
sudo hwclock -D -r
zum Abfragen der Zeit aus dem RTC-Modul sporadisch ins Leere.
Damit das automatische Starten der Software (Definiert in der Datei /etc/rc.local) auch bei einer negativen Antwort auf den Synchronisationsbefehl noch funktioniert, hilft folgender Workaround:
Durch das Einbauen einer While-Schleife vor dem Aufruf der eigentlichen Anwendung MedDoser wartet das Boot-Skript mit der weiteren Ausführung so lange, bis die lokale Systemzeit korrekt vom RTC-Modul gelesen wurde. Der Befehl hwclock -s sorgt dafür, dass die Zeit des RTC-Moduls mit der lokalen Systemzeit überschrieben (synchronisiert) wird:
while ! hwclock -s do echo "Failed to sync RTC to local time." done echo "Successfully synced RTC to local time"
Der im obigen Blogbeitrag empfohlene Befehl
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
funktioniert in unserem Szenario nicht und kann daher aus der Datei /etc/rc.local auskommentiert bzw. entfernt werden.
Setzen der Systemzeit auf dem RTC-Modul
Es ist wichtig, dass einmalig die korrekte Systemzeit (z.B. bei bestehender Internetverbindung) auf das RTC-Modul geschrieben wird. Ob die lokale Systemzeit richtig ist, kann mit folgendem Befehl überprüft werden:
date
Das Schreiben der lokalen Zeit auf das RTC-Modul geschieht mit folgendem Befehl:
sudo hwclock -w
Testen der Konfiguration
Ob das Einrichten der RTC funktioniert hat, prüft man am Einfachsten, indem das Gerät über den Zeitraum von ein paar Stunden ausgeschaltet und dann wieder hochgefahren wird. Stimmt die Systemzeit dann mit der realen Tageszeit überein, passt alles (Voraussetzung: Die Zeitzone wurde in der Raspberry-Konfiguration an den Aufenthaltsort angepasst).
Einfacher ist es jedoch, die Systemzeit manuell auf einen Wert in der Vergangenheit zu setzen, z.B. mit
sudo date -s "Wed Nov 29 14:00:00 UTC+1 2017"
Danach das Gerät neu starten und prüfen, ob trotzdem die richtige Zeit angezeigt wird.