diff options
author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2025-03-13 09:49:41 +0100 |
---|---|---|
committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2025-03-13 09:49:41 +0100 |
commit | 64c8503eb9e77f68c21bb65976b74a75060e8f44 (patch) | |
tree | a27815142a8303a2cac6028d66d4e0bae899b3c3 |
Initial code for a flashlight or a rainbow effect
-rw-r--r-- | gd_clock.py | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/gd_clock.py b/gd_clock.py new file mode 100644 index 0000000..438813f --- /dev/null +++ b/gd_clock.py @@ -0,0 +1,149 @@ +import board +import json +import os +import time +import wifi + +import adafruit_connection_manager +import adafruit_minimqtt.adafruit_minimqtt as MQTT +import colours +import neopixel + + +num_pixels = 12 +pixels = neopixel.NeoPixel(board.GP0, num_pixels) + +CMD_FEED = "ctrl/gd_clock/cmd" +SENS_FEED = os.getenv('MQTT_SENS_FEED') + + +class Flashlight: + + def start(self, clock): + print("Starting Flashlight mode") + pixels.fill((255, 255, 255)) + clock.brightness = 0.5 + pixels.brighness = clock.brightness + + def loop(self, clock): + pass + + +flashlight = Flashlight() + + +class Rainbow: + count = 0 + step = 1 + + def start(self, clock): + print("Starting rainbow mode") + pixels.fill((0, 0, 0)) + clock.brightness = 0.1 + pixels.brightness = clock.brightness + + def loop(self, clock): + self.count += 1 + if self.count >= num_pixels: + self.count = 0 + i = self.count // self.step + for j in range(8): + pixels[i - j] = colours.hsv2rgb( + int(360 / num_pixels) * (i - j), + 255, + 256 * (1/2 ** j) - 1 + ) + pixels[i - 8] = (0, 0, 0) + + +rainbow = Rainbow() + + +class GD_Clock: + brightness = 0.1 + current_mode = rainbow + + def connected(self, client, userdata, flags, rc): + print("Connected to MQTT") + client.subscribe(CMD_FEED + "/#") + client.subscribe(SENS_FEED + "/#") + + def disconnected(self, client, topic, message): + time.sleep(10) + client.connect() + + def parse_cmd(self, topic, message): + print(f"New cmd on topic {topic}: {message}") + try: + payload = json.loads(message) + except ValueError: + return None + cmd = payload.get("cmd", None) + value = payload.get("value", None) + kwargs = payload.get("kwargs", {}) + if cmd == "mode": + if value == "flashlight": + self.current_mode = flashlight + self.current_mode.start(self) + elif value == "rainbow": + self.current_mode = rainbow + self.current_mode.start(self) + elif cmd == "brightness": + if value == "+": + self.brightness = min(1.0, self.brightness + 0.1) + elif value == "-": + self.brightness = max(0.1, self.brightness - 0.1) + else: + try: + bright = float(value) + except ValueError: + return None + self.brightness = min(0.1, max(1.0, bright)) + print("Setting brightness to", self.brightness) + pixels.brightness = self.brightness + + def parse_sensor(self, topic, message): + print(f"New sensor message on topic {topic}: {message}") + pass + + def message(self, client, topic, message): + if topic.startswith(CMD_FEED): + self.parse_cmd(topic, message) + elif topic.startswith(SENS_FEED): + self.parse_sensor(topic, message) + + +# ****** Main code ********************************************************** # + +print("Connecting to WiFi") +try: + wifi.radio.connect( + os.getenv('CIRCUITPY_WIFI_SSID'), + os.getenv('CIRCUITPY_WIFI_PASSWORD') + ) +except TypeError: + print("Could not find WiFi info. Check your settings.toml file!") + raise +print("Connected to WiFi") + +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) + +mqtt_client = MQTT.MQTT( + broker=os.getenv('MQTT_HOST'), + socket_pool=pool, +) + +clock = GD_Clock() + +mqtt_client.on_connect = clock.connected +mqtt_client.on_disconnect = clock.disconnected +mqtt_client.on_message = clock.message + +mqtt_client.connect() + +clock.current_mode.start(clock) + +while True: + mqtt_client.loop(timeout=1) + clock.current_mode.loop(clock) + time.sleep(1) |