Added BME280 telemetry plugin

This commit is contained in:
Mark Qvist 2025-03-09 14:28:03 +01:00
parent fbd5896856
commit 3faa7e2203

View File

@ -0,0 +1,67 @@
# This plugin provides temperature, humidity
# and pressure data via a BME280 sensor
# connected over I2C. The plugin requires
# the "smbus2" and "RPi.bme280" modules to
# be available on your system. These can be
# installed with:
#
# pip install smbus2 RPi.bme280
import os
import RNS
from importlib.util import find_spec
class BME280Plugin(SidebandTelemetryPlugin):
plugin_name = "telemetry_bme280"
I2C_ADDRESS = 0x76
I2C_BUS = 1
# If your BME280 has an offset from the true
# temperature, you can compensate for this
# by modifying this parameter.
TEMPERATURE_CORRECTION = 0.0
def start(self):
RNS.log("BME280 telemetry plugin starting...")
if find_spec("smbus2"): import smbus2
else: raise OSError(f"No smbus2 module available, cannot start BME280 telemetry plugin")
if find_spec("bme280"): import bme280
else: raise OSError(f"No bme280 module available, cannot start BME280 telemetry plugin")
self.sensor_connected = False
try:
self.bme280 = bme280
self.address = self.I2C_ADDRESS
self.bus = smbus2.SMBus(self.I2C_BUS)
self.calibration = self.bme280.load_calibration_params(self.bus, self.address)
self.sensor_connected = True
self.tc = self.TEMPERATURE_CORRECTION
except Exception as e:
RNS.log(f"Could not connect to I2C device while starting BME280 telemetry plugin", RNS.LOG_ERROR)
RNS.log(f"The contained exception was: {e}", RNS.LOG_ERROR)
super().start()
def stop(self):
self.bus.close()
super().stop()
def update_telemetry(self, telemeter):
if telemeter != None:
if self.sensor_connected:
try:
sample = self.bme280.sample(self.bus, self.address, self.calibration); ts = telemeter.sensors
telemeter.synthesize("temperature"); ts["temperature"].data = {"c": round(sample.temperature+self.tc,1)}
telemeter.synthesize("humidity"); ts["humidity"].data = {"percent_relative": round(sample.humidity,1)}
telemeter.synthesize("pressure"); ts["pressure"].data = {"mbar": round(sample.pressure,1)}
except Exception as e:
RNS.log("An error occurred while updating BME280 sensor data", RNS.LOG_ERROR)
RNS.log(f"The contained exception was: {e}", RNS.LOG_ERROR)
plugin_class = BME280Plugin