import os import board import time import busio from adafruit_bme280 import basic as adafruit_bme280 i2c = busio.I2C(scl=board.GP15, sda=board.GP14) bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x76) # location's pressure (hPa) QNH at sea level bme280.sea_level_pressure = 1016 # value from https://metar-taf.com/EDDM 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 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) esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) if esp.status == adafruit_esp32spi.WL_IDLE_STATUS: print("ESP32 found and in idle mode") print("Firmware vers.", esp.firmware_version) print("MAC addr:", [hex(i) for i in esp.MAC_address]) for ap in esp.scan_networks(): print("\t%s\t\tRSSI: %d" % (str(ap['ssid'], 'utf-8'), ap['rssi'])) print("Connecting to AP...") while not esp.is_connected: try: esp.connect_AP( os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD") ) except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue print("Connected to", str(esp.ssid, "utf-8"), "\tRSSI:", esp.rssi) # MQTT inspiration from https://docs.circuitpython.org/projects/minimqtt/en/latest/examples.html mqtt_state_topic = "homeassistant/sensor/balcony_weather_station/bme_280_001/state" mqtt_config_topic_temperature = "homeassistant/sensor/balcony_weather_station/bme_280_001_temp/config" mqtt_config_topic_humidity = "homeassistant/sensor/balcony_weather_station/bme_280_001_humi/config" mqtt_config_topic_pressure = "homeassistant/sensor/balcony_weather_station/bme_280_001_pres/config" 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(esp) MQTT.set_socket(socket, esp) mqtt_client = MQTT.MQTT( broker=os.getenv("MQTT_HOST"), username=os.getenv("MQTT_USER"), password=os.getenv("MQTT_PASSWORD"), ) mqtt_client.on_connect = connect mqtt_client.on_disconnect = disconnect mqtt_client.on_subscribe = subscribe mqtt_client.on_unsubscribe = unsubscribe mqtt_client.on_publish = publish mqtt_client.on_message = message print("Attempting to connect to %s" % mqtt_client.broker) mqtt_client.connect() print("Publishing to %s" % mqtt_config_topic_temperature) config_msg_temperature = """{ "name": "BEM 280 Temperature", "device_class": "temperature", "unit_of_measurement": "°C", "value_template": "{{ value_json.temperature}}", "state_topic": "homeassistant/sensor/balcony_weather_station/bme_280_001/state", "unique_id": "balcony_weather_station_bme_280_001_temperature", "device": { "identifiers": "balcony_weather_station_001", "name": "Balcony Weather Station" } }""" mqtt_client.publish(mqtt_config_topic_temperature, config_msg_temperature) print("Publishing to %s" % mqtt_config_topic_humidity) config_msg_humidity = """{ "name": "BEM 280 Humidity", "device_class": "humidity", "unit_of_measurement": "%", "value_template": "{{ value_json.humidity}}", "state_topic": "homeassistant/sensor/balcony_weather_station/bme_280_001/state", "unique_id": "balcony_weather_station_bme_280_001_humidity", "device": { "identifiers": "balcony_weather_station_001", "name": "Balcony Weather Station" } }""" mqtt_client.publish(mqtt_config_topic_humidity, config_msg_humidity) print("Publishing to %s" % mqtt_config_topic_pressure) config_msg_pressure = """{ "name": "BEM 280 Pressure", "device_class": "pressure", "unit_of_measurement": "hPa", "value_template": "{{ value_json.pressure}}", "state_topic": "homeassistant/sensor/balcony_weather_station/bme_280_001/state", "unique_id": "balcony_weather_station_bme_280_001_pressure", "device": { "identifiers": "balcony_weather_station_001", "name": "Balcony Weather Station" } }""" mqtt_client.publish(mqtt_config_topic_pressure, config_msg_pressure) while True: msg = f"""{{ "temperature": {bme280.temperature:.1f}, "humidity": {bme280.relative_humidity:.1f}, "pressure": {bme280.pressure:.1f} }}""" mqtt_client.publish(mqtt_state_topic, msg) time.sleep(30) print("Disconnecting from %s" % mqtt_client.broker) mqtt_client.disconnect() print("Done!")