main.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. # main.py -- put your code here!
  2. import time
  3. import machine
  4. from machine import Pin, PWM
  5. import ujson
  6. import network
  7. from umqttsimple import MQTTClient
  8. from config import MQTT_SERVER, CLIENT_ID, TOPIC_SUB, TOPIC_PUB, LED_LIST
  9. from leds import Leds
  10. import gc
  11. gc.collect()
  12. leds = Leds()
  13. leds.setColor(2, 1)
  14. leds.update()
  15. station = network.WLAN(network.STA_IF)
  16. def send_status(error = None):
  17. msg = {
  18. 'state': "ON" if leds.enabled else "OFF",
  19. 'speed': leds.steps,
  20. 'color': {LED_LIST[i][0]: leds.vals[i] for i in range(len(LED_LIST))},
  21. 'time' : time.time(),
  22. 'error': error
  23. }
  24. msg = ujson.dumps(msg)
  25. client.publish(TOPIC_PUB, bytes(msg, 'utf-8'))
  26. def sub_cb(topic, msg):
  27. try:
  28. cmd = ujson.loads(str(msg, 'utf-8'))
  29. if 'state' in cmd:
  30. if cmd['state'] == "OFF":
  31. leds.disable()
  32. else:
  33. leds.enable()
  34. if 'speed' in cmd:
  35. leds.setSteps(int(cmd['speed']))
  36. if 'color' in cmd:
  37. for i, (color, _, _) in enumerate(LED_LIST):
  38. if color in cmd['color']:
  39. leds.setColor(i, int(cmd['color'][color]))
  40. if 'reset' in cmd:
  41. machine.reset()
  42. send_status()
  43. except Exception as e:
  44. send_status("cb error")
  45. def connect_and_subscribe():
  46. client = MQTTClient(CLIENT_ID, MQTT_SERVER)
  47. client.set_callback(sub_cb)
  48. client.connect()
  49. client.subscribe(TOPIC_SUB)
  50. print('Connected to %s MQTT broker, subscribed to %s topic' % (MQTT_SERVER, TOPIC_SUB))
  51. return client
  52. def restart_and_reconnect():
  53. print('Failed to connect to MQTT broker. Reconnecting...')
  54. time.sleep(10)
  55. machine.reset()
  56. try:
  57. client = connect_and_subscribe()
  58. client.set_last_will(TOPIC_PUB, b"offline", retain=False, qos=0)
  59. client.sock.settimeout(10)
  60. except OSError as e:
  61. print(e)
  62. restart_and_reconnect()
  63. last_message = 0
  64. message_interval = 60
  65. while True:
  66. try:
  67. client.check_msg()
  68. if (time.time() - last_message) >= message_interval:
  69. send_status()
  70. last_message = time.time()
  71. gc.collect()
  72. leds.update()
  73. time.sleep(0.02)
  74. except OSError as e:
  75. send_status("loop error")
  76. restart_and_reconnect()
  77. if station.isconnected() == False:
  78. leds.init(0)
  79. leds.setColor(0, 60)