diff --git a/docs/example_plugins/bme280_telemetry.py b/docs/example_plugins/bme280_telemetry.py new file mode 100644 index 0000000..af29c70 --- /dev/null +++ b/docs/example_plugins/bme280_telemetry.py @@ -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 \ No newline at end of file