summaryrefslogtreecommitdiff
path: root/extmod/ntptime.py
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/ntptime.py')
-rw-r--r--extmod/ntptime.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/extmod/ntptime.py b/extmod/ntptime.py
new file mode 100644
index 000000000..05d7e9717
--- /dev/null
+++ b/extmod/ntptime.py
@@ -0,0 +1,48 @@
+import utime
+
+try:
+ import usocket as socket
+except:
+ import socket
+try:
+ import ustruct as struct
+except:
+ import struct
+
+# The NTP host can be configured at runtime by doing: ntptime.host = 'myhost.org'
+host = "pool.ntp.org"
+
+
+def 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]
+
+ EPOCH_YEAR = utime.gmtime(0)[0]
+ if EPOCH_YEAR == 2000:
+ # (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
+ NTP_DELTA = 3155673600
+ elif EPOCH_YEAR == 1970:
+ # (date(1970, 1, 1) - date(1900, 1, 1)).days * 24*60*60
+ NTP_DELTA = 2208988800
+ else:
+ raise Exception("Unsupported epoch: {}".format(EPOCH_YEAR))
+
+ return val - NTP_DELTA
+
+
+# There's currently no timezone support in MicroPython, and the RTC is set in UTC time.
+def settime():
+ t = time()
+ import machine
+
+ tm = utime.gmtime(t)
+ machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0))