From 05c470197f32554be2d6bc168a513d87fba103e7 Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Wed, 26 Jul 2023 15:21:51 +0200 Subject: [PATCH] get mqtt working with bem 280 sensor --- CIRCUITPY/code.py | 129 ++++++++++++++++-- CIRCUITPY/lib/._adafruit_minimqtt | Bin 0 -> 4096 bytes CIRCUITPY/lib/adafruit_minimqtt/.___init__.py | Bin 0 -> 4096 bytes .../adafruit_minimqtt/._adafruit_minimqtt.mpy | Bin 0 -> 4096 bytes CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy | Bin 0 -> 4096 bytes CIRCUITPY/lib/adafruit_minimqtt/__init__.py | 0 .../adafruit_minimqtt/adafruit_minimqtt.mpy | Bin 0 -> 14635 bytes CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy | Bin 0 -> 901 bytes notes.txt | 41 ++++++ 9 files changed, 157 insertions(+), 13 deletions(-) create mode 100755 CIRCUITPY/lib/._adafruit_minimqtt create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/.___init__.py create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/__init__.py create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy create mode 100755 CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy create mode 100644 notes.txt 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 0000000000000000000000000000000000000000..7f4e7db936ca85f01058b8d51cfd6bbadfd3284c GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^44`sRG%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!N9=6(Avx-Dbdo>JjvQQ zqbNT&)f&x^QSN96jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb2#O0I0JG!eAg5 zl95@gP?TDnUs{x$s*sjnl&z4NSCR_scIM|L=Hyf=!cbj9nnLwI M+$%B+a{vDW06I`D5C8xG literal 0 HcmV?d00001 diff --git a/CIRCUITPY/lib/adafruit_minimqtt/.___init__.py b/CIRCUITPY/lib/adafruit_minimqtt/.___init__.py new file mode 100755 index 0000000000000000000000000000000000000000..7f4e7db936ca85f01058b8d51cfd6bbadfd3284c GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^44`sRG%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!N9=6(Avx-Dbdo>JjvQQ zqbNT&)f&x^QSN96jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb2#O0I0JG!eAg5 zl95@gP?TDnUs{x$s*sjnl&z4NSCR_scIM|L=Hyf=!cbj9nnLwI M+$%B+a{vDW06I`D5C8xG literal 0 HcmV?d00001 diff --git a/CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy b/CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy new file mode 100755 index 0000000000000000000000000000000000000000..7f4e7db936ca85f01058b8d51cfd6bbadfd3284c GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^44`sRG%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!N9=6(Avx-Dbdo>JjvQQ zqbNT&)f&x^QSN96jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb2#O0I0JG!eAg5 zl95@gP?TDnUs{x$s*sjnl&z4NSCR_scIM|L=Hyf=!cbj9nnLwI M+$%B+a{vDW06I`D5C8xG literal 0 HcmV?d00001 diff --git a/CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy b/CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy new file mode 100755 index 0000000000000000000000000000000000000000..7f4e7db936ca85f01058b8d51cfd6bbadfd3284c GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^44`sRG%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!N9=6(Avx-Dbdo>JjvQQ zqbNT&)f&x^QSN96jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb2#O0I0JG!eAg5 zl95@gP?TDnUs{x$s*sjnl&z4NSCR_scIM|L=Hyf=!cbj9nnLwI M+$%B+a{vDW06I`D5C8xG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5ecd2604d69c46e0fb0c928ae09125666049425e GIT binary patch literal 14635 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 H(vtok9@noZ literal 0 HcmV?d00001 diff --git a/CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy b/CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy new file mode 100755 index 0000000000000000000000000000000000000000..9919aacfe5330acb420d84222383d54b7fb746f9 GIT binary patch literal 901 zcmZ{i&rj1}7{{Nt-PV=yqgzK^kl@JZ24fl8%;~`xGHQZDNE$ZC6jMo8pkZt{DuL79 zsXGvfiSgvszhG<~e*gpi0b(Kt;NZnG2hYA^K{;sOw0Ym>`M%%p=WRP-r|$U6TM-{H z4;QnGOT{;asjeA$W9_wRj;$@4+KOI`u5Z8cV>Ymmg-IST=adc245Qnf=JvXgU+$*` zlu35Myc>cSvJGdF2wtWn;Dl)eD9w*(M4 zT7bURHs?$stGDzL62L7{0`yCy*CW{ka7lK-YnXaby<#Jdj`EPxLo>Sr<5M?{I8IwJ za@nGu=eo5*-qiDEm=Zjyx{)iG8>%V+@ooVvxCsD@13`#D)yF8UTLXZdl)D?;b{vAL zmyMHFhgvKY%yzGwTP0L>93B^=F{tu%bI%K(IB>*~I@Jq@b)NOYN2}^(;t;2riJzrf z-N&}~f&pLO!OQ^kuvqd3#AtXVq`>5TV#6NXuyH}N#TkXTv6ZDiyL~j79%GghP!n0=+NTr6CId5 zmGct;hpdJ^V86SPN>jsLp{UHibWcrz-hT`ZXMB^}; zt<|kTiVoRCTb1vMA@b#5r^76)8(L-M^vSTJsB0`vMZ!=zrSRPmvA%;$6 zp2YXGa2#ZUmNSVtEP|CjYLN1o?872O%8j&DzKl`o6a&ZmMDwe}QKJO=Oct?-CLGwp s-{roxmZSe64%B)3nLPMcEVR;ylxL3jTj?|=zE{V$0~yXd`O_)mH&K-E761SM literal 0 HcmV?d00001 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" + } +}