import network | |
import socket | |
import time | |
import struct | |
from machine import Pin | |
NTP_DELTA = 2208988800 | |
host = "pool.ntp.org" | |
led = Pin("LED", Pin.OUT) | |
ssid = 'A NETWORK' | |
password = 'A PASSWORD' | |
def set_time(): | |
NTP_QUERY = bytearray(48) | |
NTP_QUERY[0] = 0x1B | |
addr = socket.getaddrinfo(host, 123)[0][-1] | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
try: | |
s.settimeout(1) | |
res = s.sendto(NTP_QUERY, addr) | |
msg = s.recv(48) | |
finally: | |
s.close() | |
val = struct.unpack("!I", msg[40:44])[0] | |
t = val - NTP_DELTA | |
tm = time.gmtime(t) | |
machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0)) | |
wlan = network.WLAN(network.STA_IF) | |
wlan.active(True) | |
wlan.connect(ssid, password) | |
max_wait = 10 | |
while max_wait > 0: | |
if wlan.status() < 0 or wlan.status() >= 3: | |
break | |
max_wait -= 1 | |
print('waiting for connection...') | |
time.sleep(1) | |
if wlan.status() != 3: | |
raise RuntimeError('network connection failed') | |
else: | |
print('connected') | |
status = wlan.ifconfig() | |
print( 'ip = ' + status[0] ) | |
led.on() | |
set_time() | |
print(time.localtime()) | |
led.off() |
Modified defines for local time and local NTP host
NTP_DELTA = 2208988800 - 3600 # subtract 1 hour = 3600 seconds to get GMT + 1 for Portugal
host = "pt.pool.ntp.org" # using host from Portugal
I'm getting an intermittent failure running the code :
connected
ip = 192.168.3.58
Traceback (most recent call last):
File "", line 52, in
File "", line 24, in set_time
OSError: [Errno 110] ETIMEDOUT
Error message indicates its a time out but not sure what's causing the problem.
Hi Duncan,
I had that error also. That is why I created a try..except block. See the OSError part of it.
I also created extra logic to call set_time() only at: a) start; b) once in an hour. For the rest every second a REPL print of some time.localtime() data. See the next screenshot at the change of an hour:
Added variable tm_gmtoff, offset of GMT for Portugal:
The original script does call set_time() just once. That is OK for an example as this is.
I have the experience that the RTC's of various microcontollers in time deviate from NTP time.
That is why I decided to call set_time() at intervals to synchronize the built-in RTC.
I am still working on the script to have it fit better to my ideas.
I have published my project on the micropython forum:
https://forum.micropython.org/viewtopic.php?f=21&t=12761&p=69363&hilit=ntp#p69363
Paulus
Modified defines for local time and local NTP host NTP_DELTA = 2208988800 - 3600 # subtract 1 hour = 3600 seconds to get GMT + 1 for Portugal host = "pt.pool.ntp.org" # using host from Portugal
This fixed it for me. Thank you! I had to do "+ 21_600" to get to North America Central Time. Thank you again!
You're welcome
Hi, using this script provoked the error "machine" is not defined (line 30)
I changed line 6 into: "import machine".
line 11 into led = machine.Pin("LED", machine.Pin.OUT).
Then the script ran OK.