From 614ee88c8322bad33bf96bcc0a2b56f0fb3a2862 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Sun, 23 Apr 2023 11:40:06 +0200 Subject: [PATCH] Retry on error, solve #10 --- src/apps/plant.py | 16 ++++++++++------ src/lib/badger_with_clock.py | 18 ++++++++++++++++++ src/secrets_template.py | 1 + 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/apps/plant.py b/src/apps/plant.py index 2c4324d..a7c543b 100644 --- a/src/apps/plant.py +++ b/src/apps/plant.py @@ -9,7 +9,7 @@ from badger2040 import ( UPDATE_FAST, ) from badger_with_clock import Badger2040 -from badger_os import get_battery_level +from badger_os import get_battery_level, warning import secrets from dst import fix_dst @@ -201,10 +201,7 @@ def main(): while True: display.rtc.clear_timer_flag() fetch_and_display() - display.rtc.set_timer( - secrets.REFRESH_INTERVAL_MINUTES, ttp=PCF85063A.TIMER_TICK_1_OVER_60HZ - ) - display.rtc.enable_timer_interrupt(True) + display.set_timer_minutes_with_jitter(secrets.REFRESH_INTERVAL_MINUTES) print("Halting") display.halt() @@ -249,4 +246,11 @@ def get_time(): return fix_dst(*display.rtc.datetime()) -main() +while True: + try: + main() + except Exception as e: + print(e) + warning(display, str(e)) + display.set_timer_minutes_with_jitter(secrets.ERROR_REFRESH_INTERVAL_MINUTES) + display.halt() diff --git a/src/lib/badger_with_clock.py b/src/lib/badger_with_clock.py index a11e3f5..98d75fd 100644 --- a/src/lib/badger_with_clock.py +++ b/src/lib/badger_with_clock.py @@ -3,6 +3,7 @@ import machine from pimoroni_i2c import PimoroniI2C from pcf85063a import PCF85063A import ntptime +import random import badger2040 @@ -24,3 +25,20 @@ class Badger2040(badger2040.Badger2040): ntptime.settime() now = time.localtime() self.rtc.datetime(now[:7]) + + def set_timer_minutes(self, minutes: int): + """Wake the board in X minutes. Doesn't halt the board.""" + self.rtc.clear_timer_flag() + self.rtc.set_timer(minutes, ttp=PCF85063A.TIMER_TICK_1_OVER_60HZ) + self.rtc.enable_timer_interrupt(True) + + def set_timer_minutes_with_jitter( + self, minutes: int, jitter_percentage: float = 0.2 + ): + """ + Wake the board in X minutes with some jitter. Doesn't halt the board. + jitter_percentage should be a float between 0.0 and 1.0. + """ + delta = int(minutes * abs(jitter_percentage)) + minutes += random.randint(-delta, delta) + self.set_timer_minutes(minutes) diff --git a/src/secrets_template.py b/src/secrets_template.py index 1330183..6d69bef 100644 --- a/src/secrets_template.py +++ b/src/secrets_template.py @@ -14,3 +14,4 @@ HA_PLANT_CONDUCTIVITY_SENSOR = "sensor.plant_name_conductivity" HA_PLANT_ILLUMINANCE_SENSOR = "sensor.plant_name_illuminance" REFRESH_INTERVAL_MINUTES = 60 # Max 255 +ERROR_REFRESH_INTERVAL_MINUTES = 30