9.16. Ora e NTP

Una camera appena accesa non ha idea di che ora sia. L’orologio integrato parte da un momento arbitrario (1970-01-01 sulla maggior parte delle schede) e da lì conta in avanti finché qualcosa non gli dice diversamente. NTP – il Network Time Protocol – è il modo in cui la cam chiede alla rete l’ora reale dell’orologio da parete e imposta il proprio orologio in base alla risposta.

9.16.1. Perché la cam ha bisogno di conoscere l’ora

Per molti script l’orologio della cam non ha importanza – un ciclo di acquisizione di frame non si cura di che giorno sia. Per alcune cose comuni, invece, conta molto:

  • Timestamp nei log o nei dati caricati. Le voci che riportano tutte 1970-01-01 sono difficili da interpretare a posteriori.

  • Attività pianificate. «Esegui alle 03:00» richiede che la camera sappia cosa sono le 03:00.

9.16.2. Cosa fa NTP

NTP è un piccolo servizio pubblico: una rete di server che rispondono alla domanda «che ora è?» tramite un singolo scambio UDP. La camera invia una breve richiesta a un server NTP noto; il server risponde con un timestamp preciso (accurato a pochi millisecondi per qualsiasi server pubblico comune); la camera lo usa per impostare il proprio orologio. Il server predefinito usato dalla cam è pool.ntp.org, un pool globalmente bilanciato sul carico, progettato esattamente per questo tipo di client.

9.16.3. L’API Python: ntptime

MicroPython incapsula il protocollo in una singola chiamata. Lo schema più comune è attivare prima il collegamento, poi chiedere l’ora a NTP:

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())

Dopo che ntptime.settime() ritorna, l’orologio in tempo reale integrato e time.localtime() riflettono l’ora UTC corrente. Due parametri regolano i valori predefiniti:

  • ntptime.host è il nome del server da interrogare. Sovrascrivilo (ntptime.host = "time.google.com") prima di chiamare settime() per puntare a un server diverso.

  • ntptime.timeout è il numero di secondi da attendere per una risposta prima di rinunciare; il valore predefinito è breve.

9.16.4. Quando chiamarlo

  • Dopo che il collegamento di rete è attivo. NTP viaggia su UDP, che viaggia su una configurazione IP stabilita. Attendi prima che isconnected() restituisca True.

  • Periodicamente sulle cam in funzione a lungo. L’orologio integrato deriva nell’arco di ore e giorni. Una chiamata giornaliera o settimanale a settime() lo mantiene corretto.

9.16.5. Fusi orari

NTP restituisce l’ora UTC. MicroPython non include un database dei fusi orari, quindi convertire UTC in ora locale è compito dello script. L’approccio abituale è applicare un offset fisso per il fuso del luogo di installazione:

import time

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

L’ora legale, i secondi intercalari e le variazioni storiche dei fusi non sono gestiti da questo approccio. Per la maggior parte delle installazioni di camere un offset fisso è sufficiente; se uno script ha davvero bisogno dell’ora civile con l’ora legale, esegui la conversione lato server.

9.16.6. Cosa può andare storto

  • Rete non ancora disponibile. ntptime.settime() solleva OSError se non riesce a raggiungere il server. Può darsi che il collegamento non sia attivo, che la risoluzione del nome sia fallita, che il server sia irraggiungibile o che nessuna risposta sia arrivata entro ntptime.timeout. Riprova una volta che il collegamento è stabile.

  • Captive portal. Una rete Wi-Fi che intercetta il DNS può rispondere al nome del server NTP con l’IP del portale stesso, e le richieste NTP a quell’indirizzo restituiscono dati senza senso. La cam penserà che la rete sia attiva, ma l’impostazione dell’ora fallirà o sarà del tutto errata. Passa a una rete pulita oppure imposta un IP fisso.

  • Sovraccaricare i pool pubblici. I pool NTP pubblici limitano la frequenza dei client abusivi. Una volta all’ora è più che sufficiente; una volta al minuto farà bandire la cam.

Per il riferimento completo di ntptime, vedi ntptime — semplice client NTP.