get mqtt working with bem 280 sensor

This commit is contained in:
Travis Shears 2023-07-26 15:21:51 +02:00
parent 2ee960c723
commit 05c470197f
Signed by: travisshears
GPG key ID: D4C2E4DFAB8BABF8
9 changed files with 157 additions and 13 deletions

View file

@ -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!")

BIN
CIRCUITPY/lib/._adafruit_minimqtt Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

Binary file not shown.

Binary file not shown.

41
notes.txt Normal file
View file

@ -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"
}
}