9.16. Hora y NTP¶
Una cámara recién encendida no tiene idea de qué hora es. El reloj integrado comienza en un instante arbitrario (1970-01-01 en la mayoría de las placas) y avanza a partir de ahí hasta que algo le indique lo contrario. NTP – el Network Time Protocol – es la forma en que la cámara le pide a la red la hora real del mundo y ajusta su propio reloj a partir de la respuesta.
9.16.1. Por qué la cámara necesita saber la hora¶
Para muchos scripts el reloj de la cámara no importa – a un bucle de captura de fotogramas no le importa qué día es. Para algunas cosas comunes importa mucho:
Marcas de tiempo en registros o datos subidos. Las entradas que dicen todas
1970-01-01son difíciles de interpretar después.Tareas programadas. «Ejecutar a las 03:00» requiere que la cámara sepa qué es 03:00.
9.16.2. Qué hace NTP¶
NTP es un pequeño servicio público: una red de servidores que responden «¿qué hora es?» mediante un único intercambio UDP. La cámara envía una petición corta a un servidor NTP conocido; el servidor responde con una marca de tiempo precisa (exacta hasta unos pocos milisegundos en cualquier servidor público común); la cámara la usa para ajustar su propio reloj. El servidor predeterminado que usa la cámara es pool.ntp.org, un grupo balanceado globalmente diseñado exactamente para este tipo de cliente.
9.16.3. La API de Python: ntptime¶
MicroPython envuelve el protocolo en una sola llamada. El patrón habitual es levantar primero el enlace y luego pedir la hora 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())
Después de que ntptime.settime() retorna, el reloj de tiempo real integrado y time.localtime() reflejan la hora UTC actual. Dos ajustes modifican los valores predeterminados:
ntptime.hostes el nombre del servidor a consultar. Sobrescríbelo (ntptime.host = "time.google.com") antes de llamar asettime()para apuntar a un servidor diferente.ntptime.timeoutes el número de segundos a esperar una respuesta antes de rendirse; el valor predeterminado es corto.
9.16.4. Cuándo llamarlo¶
Después de que el enlace de red esté activo. NTP viaja sobre UDP, que viaja sobre una configuración IP establecida. Espera primero a que
isconnected()retorneTrue.Periódicamente en cámaras de larga ejecución. El reloj integrado se desvía a lo largo de horas y días. Un
settime()diario o semanal lo mantiene preciso.
9.16.5. Zonas horarias¶
NTP devuelve UTC. MicroPython no incluye una base de datos de zonas horarias, por lo que convertir UTC a hora local es tarea del script. Un desfase fijo para la zona del despliegue es el enfoque habitual:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
El horario de verano, los segundos intercalares y los cambios históricos de zona no se manejan con este enfoque. Para la mayoría de los despliegues de cámaras un desfase fijo es suficiente; si un script realmente necesita la hora civil con horario de verano, haz la conversión en el lado del servidor.
9.16.6. Qué puede salir mal¶
Aún no hay red.
ntptime.settime()lanzaOSErrorsi no puede alcanzar el servidor. O bien el enlace no está activo, la resolución de nombres falló, el servidor es inalcanzable, o no llegó ninguna respuesta dentro dentptime.timeout. Reintenta una vez que el enlace sea estable.Portales cautivos. Una red Wi-Fi que intercepta DNS puede responder al nombre del servidor NTP con la propia IP del portal, y las peticiones NTP a esa IP devuelven datos sin sentido. La cámara creerá que la red está activa pero el ajuste de la hora fallará o será completamente erróneo. Cámbiate a una red limpia o codifica una IP de forma fija.
Saturar los grupos públicos. Los grupos NTP públicos limitan la tasa de los clientes abusivos. Una vez por hora es más que suficiente; una vez por minuto hará que la cámara sea bloqueada.
Para la referencia completa de ntptime, consulta ntptime — cliente NTP simple.