import os import board import busio import time from digitalio import DigitalInOut import adafruit_esp32spi.adafruit_esp32spi_socket as socket from adafruit_esp32spi import adafruit_esp32spi import adafruit_minimqtt.adafruit_minimqtt as MQTT class AirLift(): def __init__(self, pubsub): self.ssid = os.getenv("WIFI_SSID") self.wifi_pass = os.getenv("WIFI_PASSWORD") self._setup() pubsub.subscribe("mqtt_pub", self._publish) def _publish(self, body): self.mqtt_client.publish(body['topic'], body['msg']) def connect(self): while not self.esp.is_connected: try: print(f"Trying to connect to {self.ssid}") self.esp.connect_AP(self.ssid, self.wifi_pass) except (RuntimeError, ConnectionError) as e: print("Ran into problem connecting to AP", e) time.sleep(5) self.esp.reset() time.sleep(5) continue print("Connected to", str(self.esp.ssid, "utf-8"), "\tRSSI:", self.esp.rssi) def _setup(self): esp32_cs = DigitalInOut(board.GP21) esp32_ready = DigitalInOut(board.GP22) esp32_reset = DigitalInOut(board.GP17) spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP20) self.esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) if self.esp.status == adafruit_esp32spi.WL_IDLE_STATUS: print("ESP32 found and in idle mode") print("Firmware vers.", self.esp.firmware_version) print("MAC addr:", [hex(i) for i in self.esp.MAC_address]) self.connect() # MQTT inspiration from https://docs.circuitpython.org/projects/minimqtt/en/latest/examples.html def connect(mqtt_client, userdata, flags, rc): print("Connected to MQTT Broker!") print("Flags: {0}\n RC: {1}".format(flags, rc)) def disconnect(mqtt_client, userdata, rc): print("Disconnected from MQTT Broker!") def subscribe(mqtt_client, userdata, topic, granted_qos): print("Subscribed to {0} with QOS level {1}".format(topic, granted_qos)) def unsubscribe(mqtt_client, userdata, topic, pid): print("Unsubscribed from {0} with PID {1}".format(topic, pid)) def publish(mqtt_client, userdata, topic, pid): print("Published to {0} with PID {1}".format(topic, pid)) def message(client, topic, message): print("New message on topic {0}: {1}".format(topic, message)) socket.set_interface(self.esp) MQTT.set_socket(socket, self.esp) self.mqtt_client = MQTT.MQTT( broker=os.getenv("MQTT_HOST"), username=os.getenv("MQTT_USER"), password=os.getenv("MQTT_PASSWORD"), client_id='balcony_weather_station' ) self.mqtt_client.on_connect = connect self.mqtt_client.on_disconnect = disconnect self.mqtt_client.on_subscribe = subscribe self.mqtt_client.on_unsubscribe = unsubscribe self.mqtt_client.on_publish = publish self.mqtt_client.on_message = message print("Attempting to connect to %s" % self.mqtt_client.broker) self.mqtt_client.connect()