9.16. Zeit und NTP

Eine frisch eingeschaltete Kamera hat keine Ahnung, wie spät es ist. Die Onboard-Uhr startet zu einem beliebigen Zeitpunkt (auf den meisten Boards 1970-01-01) und zählt von dort aus weiter, bis ihr etwas anderes mitgeteilt wird. NTP – das Network Time Protocol – ist die Art und Weise, wie die Kamera das Netzwerk nach der tatsächlichen Uhrzeit der realen Welt fragt und ihre eigene Uhr anhand der Antwort stellt.

9.16.1. Warum die Kamera die Uhrzeit kennen muss

Für viele Skripte spielt die Uhr der Kamera keine Rolle – einer Schleife zur Einzelbildaufnahme ist es egal, welcher Tag ist. Für ein paar verbreitete Anwendungsfälle spielt sie jedoch eine große Rolle:

  • Zeitstempel in Protokollen oder hochgeladenen Daten. Einträge, die alle 1970-01-01 lauten, sind im Nachhinein schwer zu interpretieren.

  • Geplante Aufgaben. „Um 03:00 ausführen“ setzt voraus, dass die Kamera weiß, was 03:00 ist.

9.16.2. Was NTP macht

NTP ist ein kleiner öffentlicher Dienst: ein Netzwerk von Servern, die über einen einzigen UDP-Austausch die Frage „Wie spät ist es?“ beantworten. Die Kamera sendet eine kurze Anfrage an einen bekannten NTP-Server; der Server antwortet mit einem präzisen Zeitstempel (für jeden gängigen öffentlichen Server auf wenige Millisekunden genau); die Kamera nutzt diesen, um ihre eigene Uhr zu stellen. Der Standardserver, den die Kamera verwendet, ist pool.ntp.org, ein global lastverteilter Pool, der genau für diese Art von Client entwickelt wurde.

9.16.3. Die Python-API: ntptime

MicroPython kapselt das Protokoll in einem einzigen Aufruf. Das übliche Muster besteht darin, zuerst die Verbindung aufzubauen und dann NTP nach der Uhrzeit zu fragen:

import network
import ntptime
import time

wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect("my-network", "my-password")

while not wlan.isconnected():
    time.sleep_ms(100)

ntptime.settime()                 # cam's clock is now UTC
print(time.localtime())

Nachdem ntptime.settime() zurückgekehrt ist, geben die Onboard-Echtzeituhr und time.localtime() die aktuelle UTC-Zeit wieder. Zwei Stellschrauben passen die Standardwerte an:

  • ntptime.host ist der Name des abzufragenden Servers. Überschreiben Sie ihn (ntptime.host = "time.google.com") vor dem Aufruf von settime(), um auf einen anderen Server zu verweisen.

  • ntptime.timeout ist die Anzahl der Sekunden, die auf eine Antwort gewartet wird, bevor aufgegeben wird; der Standardwert ist kurz.

9.16.4. Wann sie aufzurufen ist

  • Nachdem die Netzwerkverbindung steht. NTP setzt auf UDP auf, das wiederum auf einer etablierten IP-Konfiguration aufsetzt. Warten Sie zuerst darauf, dass isconnected() den Wert True zurückgibt.

  • Regelmäßig bei langlaufenden Kameras. Die Onboard-Uhr driftet über Stunden und Tage hinweg ab. Ein täglicher oder wöchentlicher Aufruf von settime() hält sie genau.

9.16.5. Zeitzonen

NTP gibt UTC zurück. MicroPython bringt keine Zeitzonendatenbank mit, daher ist die Umrechnung von UTC in die Ortszeit Aufgabe des Skripts. Ein fester Versatz für die Zeitzone des Einsatzortes ist der übliche Ansatz:

import time

offset = -5 * 3600                  # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)

Sommerzeit, Schaltsekunden und historische Zeitzonenänderungen werden von diesem Ansatz nicht berücksichtigt. Für die meisten Kameraeinsätze ist ein fester Versatz ausreichend; wenn ein Skript wirklich die bürgerliche Zeit mit Sommerzeit benötigt, führen Sie die Umrechnung serverseitig durch.

9.16.6. Was schiefgehen kann

  • Noch kein Netzwerk. ntptime.settime() löst einen OSError aus, wenn der Server nicht erreichbar ist. Entweder steht die Verbindung nicht, die Namensauflösung ist fehlgeschlagen, der Server ist nicht erreichbar oder innerhalb von ntptime.timeout ist keine Antwort eingetroffen. Versuchen Sie es erneut, sobald die Verbindung stabil ist.

  • Captive Portals. Ein WLAN-Netzwerk, das DNS abfängt, kann den NTP-Servernamen mit der eigenen IP-Adresse des Portals beantworten, und NTP-Anfragen dorthin liefern Unsinn zurück. Die Kamera glaubt, das Netzwerk sei verfügbar, aber das Stellen der Uhrzeit schlägt fehl oder ist völlig falsch. Wechseln Sie zu einem sauberen Netzwerk oder kodieren Sie eine IP-Adresse fest ein.

  • Überlastung öffentlicher Pools. Öffentliche NTP-Pools drosseln missbräuchliche Clients. Einmal pro Stunde ist mehr als genug; einmal pro Minute führt dazu, dass die Kamera gesperrt wird.

Die vollständige Referenz zu ntptime finden Sie unter ntptime — einfacher NTP-Client.