Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OverflowError: timestamp out of range for platform time_t #2

Closed
mcgrailk3 opened this issue Sep 12, 2019 · 7 comments
Closed

OverflowError: timestamp out of range for platform time_t #2

mcgrailk3 opened this issue Sep 12, 2019 · 7 comments

Comments

@mcgrailk3
Copy link

Running the example on Adafruit Metro M4 Express AirLift (WiFi) creates this error. Running latest library as well.

OverflowError: timestamp out of range for platform time_t

@jerryneedell
Copy link

jerryneedell commented Sep 13, 2019

I have reproduced this error , but if I execute the ntp_simpletest.py code manually, line by line, at the REPL, it works ...

for some reason -- when the script is executed, the esp.get_time() call in ntp.set_time() is returning (0,)

@jerryneedell
Copy link

jerryneedell commented Sep 13, 2019

hmm

I added a loop to wait for esp.get_time() to return a non-zero result -- it works after 15 seconds

# Initialize the NTP object
ntp = NTP(esp)
while esp.get_time()[0] == 0 :
    print(esp.get_time())
    time.sleep(1)


Press any key to enter the REPL. Use CTRL-D to reload.
Adafruit CircuitPython 5.0.0-alpha.1-2-gfebfc7e4e on 2019-09-02; Adafruit PyPortal with samd51j20
>>> 
>>> import ntptest
Connecting to AP...
could not connect to AP, retrying:  ('No such ssid', b'Needell Airport')
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(1568371142,)
Seconds since Jan 1, 1970: 1568371142 seconds
struct_time(tm_year=2019, tm_mon=9, tm_mday=13, tm_hour=10, tm_min=39, tm_sec=2, tm_wday=4, tm_yday=256, tm_isdst=-1)
It is currently 9/13/2019 at 10:39:2 UTC
>>> 

also ran on metro_m4_airlift -- one time it worked after 1 retry -- the next took 16 seconds

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.

Press any key to enter the REPL. Use CTRL-D to reload.
Adafruit CircuitPython 5.0.0-alpha.2-46-gb8200d729 on 2019-09-10; Adafruit Metro M4 Airlift Lite with samd51j19
>>> import ntptest
Connecting to AP...
(0,)
Seconds since Jan 1, 1970: 1568371357 seconds
struct_time(tm_year=2019, tm_mon=9, tm_mday=13, tm_hour=10, tm_min=42, tm_sec=37, tm_wday=4, tm_yday=256, tm_isdst=-1)
It is currently 9/13/2019 at 10:42:37 UTC
>>>
>>>
soft reboot

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.



Press any key to enter the REPL. Use CTRL-D to reload.
Adafruit CircuitPython 5.0.0-alpha.2-46-gb8200d729 on 2019-09-10; Adafruit Metro M4 Airlift Lite with samd51j19
>>> import ntptest
Connecting to AP...
could not connect to AP, retrying:  ('No such ssid', b'Needell Airport')
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
(0,)
Seconds since Jan 1, 1970: 1568371406 seconds
struct_time(tm_year=2019, tm_mon=9, tm_mday=13, tm_hour=10, tm_min=43, tm_sec=26, tm_wday=4, tm_yday=256, tm_isdst=-1)
It is currently 9/13/2019 at 10:43:26 UTC
>>> 

@jerryneedell
Copy link

this is not a problem with NTP but with ESP32SPI - opened issue there
adafruit/Adafruit_CircuitPython_ESP32SPI#72

@jerryneedell
Copy link

I submitted a PR to have ESP32SPI raise an exception if the returned time is zero.
adafruit/Adafruit_CircuitPython_ESP32SPI#73

The adafruit_ntp.py library could be modiied to handle the exception or the ntp_simpletest.py can handle it - here is an example

import time
import board
import busio
from digitalio import DigitalInOut
from adafruit_esp32spi import adafruit_esp32spi
from adafruit_ntp import NTP

# If you are using a board with pre-defined ESP32 Pins:
esp32_cs = DigitalInOut(board.ESP_CS)
esp32_ready = DigitalInOut(board.ESP_BUSY)
esp32_reset = DigitalInOut(board.ESP_RESET)

# If you have an externally connected ESP32:
# esp32_cs = DigitalInOut(board.D9)
# esp32_ready = DigitalInOut(board.D10)
# esp32_reset = DigitalInOut(board.D5)

spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)

print("Connecting to AP...")
while not esp.is_connected:
    try:
        esp.connect_AP(b"WIFI_SSID", b"WIFI_PASS")
    except RuntimeError as e:
        print("could not connect to AP, retrying: ", e)
        continue

# Initialize the NTP object
ntp = NTP(esp)

# Fetch and set the microcontroller's current UTC time
# keep retrying until valid time is returned
while True:
    try:
        ntp.set_time()
        break
    except ValueError as e:
        print("error gettiing time - retrying in 5 seconds: ", e)
        time.sleep(5)
        continue
# Get the current time in seconds since Jan 1, 1970
current_time = time.time()
print("Seconds since Jan 1, 1970: {} seconds".format(current_time))

# Convert the current time in seconds since Jan 1, 1970 to a struct_time
now = time.localtime(current_time)
print(now)

# Pretty-parse the struct_time
print("It is currently {}/{}/{} at {}:{}:{} UTC".format(
    now.tm_mon, now.tm_mday, now.tm_year,
    now.tm_hour,now.tm_min, now.tm_sec))

I ran this with the updated esp32SPI on a metro_m4_airlift_lite


Press any key to enter the REPL. Use CTRL-D to reload.
Adafruit CircuitPython 5.0.0-alpha.2-46-gb8200d729 on 2019-09-10; Adafruit Metro M4 Airlift Lite with samd51j19
>>> import ntp_simpletest
Connecting to AP...
could not connect to AP, retrying:  ('No such ssid', b'Needell Airport')
error gettiing time - retrying in 5 seconds:  _GET_TIME returned 0
error gettiing time - retrying in 5 seconds:  _GET_TIME returned 0
error gettiing time - retrying in 5 seconds:  _GET_TIME returned 0
Seconds since Jan 1, 1970: 1568476935 seconds
struct_time(tm_year=2019, tm_mon=9, tm_mday=14, tm_hour=16, tm_min=2, tm_sec=15, tm_wday=5, tm_yday=257, tm_isdst=-1)
It is currently 9/14/2019 at 16:2:15 UTC
>>> 

Let me know how you think we should proceed. Do you want a PR to just update the ntp_simpletest.py or do you want to handle the exception in the library? If so, do you want to limit the number of retries? It typically takes 15 seconds for the time to become valid.

@mcgrailk3
Copy link
Author

Hey sorry, I am just seeing this. Everything looks great. I'm impressed!

@brentru
Copy link
Member

brentru commented Sep 25, 2019

@jerryneedell I was playing around with this this AM and will submit a PR.

I added an valid_time property to the ntp object, set_time sets this property if valid, and a user would check against the property with a loop in the modified example code. This avoids blocking loops or printing in the library.

@brentru
Copy link
Member

brentru commented Sep 25, 2019

Patched in master and released, closing...

@brentru brentru closed this as completed Sep 25, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants