diff --git a/CIRCUITPY/code.py b/CIRCUITPY/code.py index 1e3f71d..3a20218 100755 --- a/CIRCUITPY/code.py +++ b/CIRCUITPY/code.py @@ -1,23 +1,20 @@ +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 -# while True: - # print("\nTemperature: %0.1f C" % bme280.temperature) - # print("Humidity: %0.1f %%" % bme280.relative_humidity) - # print("Pressure: %0.1f hPa" % bme280.pressure) - # print("Altitude = %0.2f meters" % bme280.altitude) - # time.sleep(5) +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) @@ -34,8 +31,114 @@ 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) -# os.getenv("WIFI_PASSWORD") -# WIFI_SSID -# WIFI_PASSWORD +# 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!") diff --git a/CIRCUITPY/lib/._adafruit_minimqtt b/CIRCUITPY/lib/._adafruit_minimqtt new file mode 100755 index 0000000..7f4e7db Binary files /dev/null and b/CIRCUITPY/lib/._adafruit_minimqtt differ diff --git a/CIRCUITPY/lib/adafruit_minimqtt/.___init__.py b/CIRCUITPY/lib/adafruit_minimqtt/.___init__.py new file mode 100755 index 0000000..7f4e7db Binary files /dev/null and b/CIRCUITPY/lib/adafruit_minimqtt/.___init__.py differ diff --git a/CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy b/CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy new file mode 100755 index 0000000..7f4e7db Binary files /dev/null and b/CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy differ diff --git a/CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy b/CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy new file mode 100755 index 0000000..7f4e7db Binary files /dev/null and b/CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy differ diff --git a/CIRCUITPY/lib/adafruit_minimqtt/__init__.py b/CIRCUITPY/lib/adafruit_minimqtt/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy b/CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy new file mode 100755 index 0000000..5ecd260 Binary files /dev/null and b/CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy differ diff --git a/CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy b/CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy new file mode 100755 index 0000000..9919aac Binary files /dev/null and b/CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy differ diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000..4b24de6 --- /dev/null +++ b/notes.txt @@ -0,0 +1,41 @@ + +## Helpful links +- https://docs.circuitpython.org/projects/minimqtt/en/latest/examples.html +- [how to use settings.toml](https://learn.adafruit.com/circuitpython-octoprint-controller-and-monitor/create-your-settings-toml-file) +- [adafruit-circuitpython-esp32spi docs](https://docs.circuitpython.org/projects/esp32spi/en/latest/) +- [pico pinout](https://pico.pinout.xyz/) +- [home assistant mqtt guide](https://www.home-assistant.io/integrations/mqtt/#testing-your-setup) +- [home assistant device classes](https://www.home-assistant.io/integrations/sensor/#device-class) + +## Home assistant debugging + +homeassistant/sensor/balcony_weather_station/test_bme_280 +homeassistant/sensor/balcony_weather_station/test_bme_280 +{ + "name": "BEM 280 Temperature", + "device_class": "temperature", + "unit_of_measurement": "°C", + "value_template": "{{ value_json.temperature}}", + "state_topic": "homeassistant/sensor/balcony_weather_station/test_bme_280/state", + "unique_id": "balcony_weather_station_bme_280_test_temperature", + "device": { + "identifiers": "balcony_weather_station_001", + "name": "Balcony Weather Station" + } +} + +homeassistant/sensor/balcony_weather_station/test_bme_280/state +{ "temperature": 23.20, "humidity": 50 } + +{ + "name": "BEM 280 Humidity", + "device_class": "humidity", + "unit_of_measurement": "%", + "value_template": "{{ value_json.humidity}}", + "state_topic": "homeassistant/sensor/balcony_weather_station/test_bme_280/state", + "unique_id": "balcony_weather_station_bme_280_test_humidity", + "device": { + "identifiers": "balcony_weather_station_001", + "name": "Balcony Weather Station" + } +}