A repository for MicroPython code that communicates with and relays information from the Texas Instruments TMP117/119 temperature sensor.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.5 KiB

2 months ago
  1. import json
  2. import machine
  3. import asyncio
  4. import ntptime
  5. import select
  6. import time
  7. import sys
  8. import lib.TMP117
  9. import lib.mqtt_as
  10. import event_loops
  11. LED = machine.Pin("LED", machine.Pin.OUT)
  12. LED.on()
  13. def search_dict_list(dictionary, attribute, value):
  14. """Returns first instance where attribute = value in list of dictionaries"""
  15. return [item for item in dictionary if item[attribute] == value][0]
  16. # First, load correct config
  17. with open("global_config.json") as f:
  18. jdata = json.load(f)
  19. uuid = int.from_bytes(machine.unique_id(), "big")
  20. config = search_dict_list(jdata, "micro_id", uuid)
  21. # Setup i2c buses
  22. i2c_buses = []
  23. for bus_config in config["i2c_buses"]:
  24. bus = {
  25. "name": bus_config["name"]
  26. }
  27. if bus_config["hard_i2c"]:
  28. bus["obj"] = machine.I2C(
  29. bus_config["hard_i2c_bus"],
  30. scl = machine.Pin(bus_config["scl"]),
  31. sda = machine.Pin(bus_config["sda"]),
  32. freq = bus_config["freq"])
  33. else:
  34. bus["obj"] = machine.SoftI2C(
  35. scl = machine.Pin(bus_config["scl"]),
  36. sda = machine.Pin(bus_config["sda"]),
  37. freq = bus_config["freq"])
  38. i2c_buses.append(bus)
  39. # Setup sensors
  40. sensors = []
  41. for sensor_config in config["sensors"]:
  42. i2c_conn = search_dict_list(i2c_buses, "name", sensor_config["i2c_name"])["obj"]
  43. sensor = lib.TMP117.TMP117(
  44. name = sensor_config["name"],
  45. i2c = i2c_conn,
  46. i2c_addr = sensor_config["i2c_addr"],
  47. config_int = sensor_config["config"]
  48. )
  49. sensors.append(sensor)
  50. print(uuid)
  51. print(i2c_buses)
  52. print(sensors)
  53. temperature_topic = config["temperature_topic"]
  54. inbound_topic = config["inbound_topic"]
  55. # Setup communication
  56. if config["wifi_or_usb"] == "wifi":
  57. # Setup MQTT Client
  58. mqtt_config = lib.mqtt_as.config
  59. mqtt_config["ssid"] = config["network_settings"]["ssid"]
  60. mqtt_config["wifi_pw"] = config["network_settings"]["wifi_pw"]
  61. mqtt_config["server"] = config["network_settings"]["mqtt_server"]
  62. mqtt_config["port"] = config["network_settings"]["mqtt_port"]
  63. mqtt_config["queue_len"] = config["network_settings"]["mqtt_queue_length"]
  64. mqtt_client = lib.mqtt_as.MQTTClient(mqtt_config)
  65. # Connect to MQTT broker and sync clock via NTP server
  66. while not mqtt_client.isconnected():
  67. try:
  68. asyncio.run(mqtt_client.connect())
  69. ntptime.settime()
  70. except OSError as E:
  71. print(f"Connection failed. ERROR: {E}. Retrying.")
  72. LED.off()
  73. try:
  74. asyncio.run(event_loops.main_wifi(uuid, sensors, mqtt_client, temperature_topic, inbound_topic))
  75. finally:
  76. mqtt_client.close()
  77. LED.on()
  78. asyncio.new_event_loop()
  79. elif config["wifi_or_usb"] == "usb":
  80. while True:
  81. poll_obj = select.poll()
  82. poll_obj.register(sys.stdin, select.POLLIN)
  83. t1 = time.ticks_ms()
  84. sys.stdout.write("REQUEST_TIME\n")
  85. poll_results = poll_obj.poll(100)
  86. if poll_results:
  87. timestamp_ms = int(sys.stdin.readline())
  88. print(f"Recieved {timestamp_ms}")
  89. t2 = time.ticks_ms()
  90. t = time.gmtime(timestamp_ms//1000)
  91. machine.RTC().datetime((t[0], t[1], t[2], t[6], t[3], t[4], t[5], 0))
  92. print(f"Time: {time.time(), time.gmtime()}, took {time.ticks_diff(t2, t1)} ms latency")
  93. break
  94. else:
  95. time.sleep(5)
  96. LED.off()
  97. try:
  98. asyncio.run(event_loops.main_wired(uuid, sensors, temperature_topic, inbound_topic))
  99. finally:
  100. LED.on()
  101. asyncio.new_event_loop()