"""RTC Time""" import gc from time import * from machine import RTC import usocket as socket import ustruct as struct # NTP_DELTA (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60 NTP_DELTA = 3155673600 _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") _monthname = (None, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",) def ntptime(host="pool.ntp.org", utc=28800): 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: del addr s.close() gc.collect() val = struct.unpack("!I", msg[40:44])[0] return gmtime(val - NTP_DELTA + utc) # There's currently no timezone support in MicroPython, and the RTC is set in UTC time. def settime(times): if isinstance(times, str): try: times = eval(times) except: raise ValueError("Clock information format error, use ',' to separate at least 6 numerical values") if type(times) in (tuple, list): if 6 <= len(times) <= 8: RTC().datetime((times[0], times[1], times[2], 0, times[3], times[4], times[5], 0)) else: raise ValueError("Settime needs a type of length 6~8") def strtime(times=None): if times is None: times = localtime() if isinstance(times, str): try: times = eval(times) except: raise ValueError("Clock information format error, use ',' to separate at least 6 numerical values") if type(times) in (tuple, list): if 6 <= len(times) <= 8: return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'.format(*times) else: raise ValueError("Settime needs a type of length 6~8") def rfc1123_time(times=None, utc=28800): if times is None: times = localtime() if isinstance(times, str): try: times = eval(times) except: raise ValueError("Clock information format error, use ',' to separate at least 6 numerical values") if type(times) in (tuple, list): if 6 <= len(times) <= 8: times = localtime(mktime(times) - utc) return '{0}, {1:02d} {2} {3:04d} {4:02d}:{5:02d}:{6:02d} GMT'.format(_weekdayname[times[6]], times[2], _monthname[times[1]], times[0], times[3], times[4], times[5]) else: raise ValueError("Settime needs a type of length 6~8")