mirror of
https://github.com/markqvist/Sideband.git
synced 2025-03-29 16:58:01 -04:00
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
# 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 |