1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # main.py -- put your code here!
- import time
- import machine
- import ujson
- import network
- from umqttsimple import MQTTClient
- from config import MQTT_SERVER, CLIENT_ID, TOPIC_SUB, TOPIC_PUB, LED_LIST
- from leds import Leds
- import gc
- gc.collect()
- leds = Leds()
- leds.update()
- station = network.WLAN(network.STA_IF)
- def send_status(error = None):
- msg = {
- 'state': "ON" if leds.enabled else "OFF",
- 'speed': leds.steps,
- 'color': {LED_LIST[i][0]: leds.vals[i] for i in range(len(LED_LIST))},
- 'time' : time.time(),
- 'error': error
- }
- msg = ujson.dumps(msg)
- client.publish(TOPIC_PUB, bytes(msg, 'utf-8'), retain=True, qos=0)
- def sub_cb(topic, msg):
- try:
- cmd = ujson.loads(str(msg, 'utf-8'))
- if 'state' in cmd:
- if cmd['state'] == "OFF":
- leds.disable()
- else:
- leds.enable()
- if 'speed' in cmd:
- leds.setSteps(int(cmd['speed']))
- if 'color' in cmd:
- for i in range(len(LED_LIST)):
- color = LED_LIST[i][0]
- if color in cmd['color']:
- leds.setColor(i, int(cmd['color'][color]))
- if 'reset' in cmd:
- machine.reset()
- send_status()
-
- except Exception as e:
- send_status("cb error")
- def connect_and_subscribe():
- client = MQTTClient(CLIENT_ID, MQTT_SERVER)
- client.set_callback(sub_cb)
- client.connect()
- client.subscribe(TOPIC_SUB)
- print('Connected to %s MQTT broker, subscribed to %s topic' % (MQTT_SERVER, TOPIC_SUB))
- return client
- def restart_and_reconnect():
- print('Failed to connect to MQTT broker. Reconnecting...')
- time.sleep(10)
- machine.reset()
- try:
- client = connect_and_subscribe()
- client.set_last_will(TOPIC_PUB, b"offline", retain=True, qos=0)
- client.sock.settimeout(10)
- except OSError as e:
- print(e)
- restart_and_reconnect()
- last_message = -55
- message_interval = 60
- try:
- while True:
- client.check_msg()
- if (time.time() - last_message) >= message_interval:
- send_status()
- last_message = time.time()
- gc.collect()
- leds.update()
- time.sleep(0.02)
- if station.isconnected() == False:
- leds.setColor(0, 60)
- except Exception as e:
- try:
- send_status("loop error")
- except:
- print("fatal error")
- restart_and_reconnect()
|