get mqtt working with bem 280 sensor
This commit is contained in:
parent
2ee960c723
commit
05c470197f
9 changed files with 157 additions and 13 deletions
|
|
@ -1,23 +1,20 @@
|
||||||
|
import os
|
||||||
import board
|
import board
|
||||||
import time
|
import time
|
||||||
import busio
|
import busio
|
||||||
from adafruit_bme280 import basic as adafruit_bme280
|
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:
|
i2c = busio.I2C(scl=board.GP15, sda=board.GP14)
|
||||||
# print("\nTemperature: %0.1f C" % bme280.temperature)
|
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x76)
|
||||||
# print("Humidity: %0.1f %%" % bme280.relative_humidity)
|
# location's pressure (hPa) QNH at sea level
|
||||||
# print("Pressure: %0.1f hPa" % bme280.pressure)
|
bme280.sea_level_pressure = 1016 # value from https://metar-taf.com/EDDM
|
||||||
# print("Altitude = %0.2f meters" % bme280.altitude)
|
|
||||||
# time.sleep(5)
|
|
||||||
|
|
||||||
from digitalio import DigitalInOut
|
from digitalio import DigitalInOut
|
||||||
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
|
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
|
||||||
from adafruit_esp32spi import adafruit_esp32spi
|
from adafruit_esp32spi import adafruit_esp32spi
|
||||||
|
import adafruit_minimqtt.adafruit_minimqtt as MQTT
|
||||||
|
|
||||||
esp32_cs = DigitalInOut(board.GP21)
|
esp32_cs = DigitalInOut(board.GP21)
|
||||||
esp32_ready = DigitalInOut(board.GP22)
|
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():
|
for ap in esp.scan_networks():
|
||||||
print("\t%s\t\tRSSI: %d" % (str(ap['ssid'], 'utf-8'), ap['rssi']))
|
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")
|
# MQTT inspiration from https://docs.circuitpython.org/projects/minimqtt/en/latest/examples.html
|
||||||
# WIFI_SSID
|
mqtt_state_topic = "homeassistant/sensor/balcony_weather_station/bme_280_001/state"
|
||||||
# WIFI_PASSWORD
|
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!")
|
print("Done!")
|
||||||
|
|
|
||||||
BIN
CIRCUITPY/lib/._adafruit_minimqtt
Executable file
BIN
CIRCUITPY/lib/._adafruit_minimqtt
Executable file
Binary file not shown.
BIN
CIRCUITPY/lib/adafruit_minimqtt/.___init__.py
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/.___init__.py
Executable file
Binary file not shown.
BIN
CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/._adafruit_minimqtt.mpy
Executable file
Binary file not shown.
BIN
CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/._matcher.mpy
Executable file
Binary file not shown.
0
CIRCUITPY/lib/adafruit_minimqtt/__init__.py
Executable file
0
CIRCUITPY/lib/adafruit_minimqtt/__init__.py
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/adafruit_minimqtt.mpy
Executable file
Binary file not shown.
BIN
CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy
Executable file
BIN
CIRCUITPY/lib/adafruit_minimqtt/matcher.mpy
Executable file
Binary file not shown.
41
notes.txt
Normal file
41
notes.txt
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue