Files
HomeMonitor/Calendar/BadgerDisplay/calendar.py

133 lines
3.1 KiB
Python

import badger2040
import machine
import urequests
import ntptime
import datetime
import math
from machine import Pin, ADC
LOOP = True
WIDTH = 296
HEIGHT = 128
COUNTRY = "US"
STATE = "MA"
TIMEZONE = "America/New_York"
BASE_URL = f"http://172.23.10.3:8081/api/calendar/events/next?country={COUNTRY}&state={STATE}&timezone={TIMEZONE}"
badger = badger2040.Badger2040()
def get_battery_level():
global battery_level
Pin(25, Pin.OUT, value=1) # Deselect Wi-Fi module
Pin(29, Pin.IN, pull=None) # Set VSYS ADC pin floating
# VSYS measurement
vsys_adc = ADC(29)
vsys = (vsys_adc.read_u16() / 65535) * 3 * 3.3
battery_level = vsys
def get_data(url):
global name, type, date, days_until, hours_until, minutes_until, is_today
print(f"Requesting URL: {url}")
response = urequests.get(url)
json = response.json()
print("Data obtained!")
print(json)
name = json["name"]
type = json["type"]
date = json["date"]
is_today = json["isToday"]
if json["durationUntil"] is None:
days_until = 0
hours_until = 0
minutes_until = 0
else:
days_until = json["durationUntil"]["days"]
hours_until = json["durationUntil"]["hours"]
minutes_until = json["durationUntil"]["minutes"]
response.close()
def update_display():
badger.set_pen(15)
badger.clear()
badger.set_pen(0)
badger.set_font("bitmap8")
text = f"{name}"
text_width = badger.measure_text(text, scale=2)
badger.text(text, math.floor((WIDTH - text_width) / 2), 25, scale=2)
text = "Today" if is_today else f"{days_until} days {hours_until} hours"
text_width = badger.measure_text(text, scale=2)
badger.text(text, math.floor((WIDTH - text_width) / 2), 65, scale=2)
badger.text(f"Battery: {battery_level:.2f}V", 2, HEIGHT - 10, scale=1)
text = f"{last_updated.date()} {last_updated.time()}"
text_width = badger.measure_text(text, scale=1)
badger.text(text, WIDTH - text_width - 2, HEIGHT - 10, scale=1)
badger.update()
step = 0
while True:
try:
step = 0
badger.connect(status_handler=None)
step += 1
try:
if badger.isconnected():
ntptime.settime()
except Exception as e:
print(f"{step} - {repr(e)}")
step += 1
last_updated = datetime.datetime.now(tz=datetime.timezone.utc)
year = datetime.date.today().year
step += 1
get_data(f"{BASE_URL}&year={year}")
step += 1
get_battery_level()
step += 1
update_display()
step += 1
if LOOP:
badger2040.sleep_for(30)
else:
break
except Exception as e:
badger.set_pen(15)
badger.clear()
badger.set_pen(0)
badger.set_font("bitmap8")
badger.text(f"{step} - {repr(e)}", 0, 0, WIDTH, scale=1)
badger.update()
break