aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2025-03-13 09:49:41 +0100
committerElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2025-03-13 09:49:41 +0100
commit64c8503eb9e77f68c21bb65976b74a75060e8f44 (patch)
treea27815142a8303a2cac6028d66d4e0bae899b3c3
Initial code for a flashlight or a rainbow effect
-rw-r--r--gd_clock.py149
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)