def __init__(self, name="dome", config={}): # Initialise the bme680 import bme680 i2c = board.I2C() # uses board.SCL and board.SDA self.active = False decAddress = int(config['address'], 16) try: self.bme680 = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except (RuntimeError, IOError): self.bme680 = bme680.BME680(bme680.I2C_ADDR_SECONDARY) self.bme680.set_humidity_oversample(bme680.OS_2X) self.bme680.set_pressure_oversample(bme680.OS_4X) self.bme680.set_temperature_oversample(bme680.OS_8X) self.bme680.set_filter(bme680.FILTER_SIZE_3) self.fan = False self.attachedFans = [] self.temperature = -999 self.humidity = -999 self.pressure = -999 self.name = name print(config, flush=True) try: self.monitorCadence = config['cadence'] except KeyError: self.monitorCadence = 20 self.exit = False self.logData = {}
def query_bme(): """ Query BME sensor for meteorological information #https://github.com/pimoroni/bme680-python/blob/master/examples/temperature-pressure-humidity.py """ try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except (RuntimeError, IOError): sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) while True: if sensor.get_sensor_data(): temp = sensor.data.temperature pres = round(sensor.data.pressure) rh = round(sensor.data.humidity) break return temp, rh, pres
def initBME680(ts_sensor): global sensor try: # setup BME680 sensor try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) try: offset = ts_sensor[0]["offset"] print('BME680 Temperature Offset ' + str(offset) + ' read from settings') except: offset = -1.5 print('BME680 Temperature Offset ' + str(offset) + ' set from default value') # These oversampling settings can be tweaked to change the balance between accuracy and noise in the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) sensor.set_temp_offset(offset) sensor.set_gas_heater_temperature(320) sensor.set_gas_heater_duration(150) sensor.select_gas_heater_profile(0) return 1 except IOError as ex: if str(ex) == "[Errno 121] Remote I/O error": print("Initializing BME680 failed: Most likely wrong Sensor Chip-ID") else: print("Initializing BME680 failed: " + str(ex)) return 0
def _setup(self): try: self._sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: self._sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) if self._sensor is None: raise Base.SensorException("No BME680 I2C sensor found") self._meta['calibration_data'] = {} cd = self._attrs_to_dict(self._sensor.calibration_data) for k in cd: if not callable(cd[k]): self._meta['calibration_data'][k] = cd[k] # TODO: MAKE CONFIG'ABLE self._sensor.set_humidity_oversample(bme680.OS_2X) self._sensor.set_pressure_oversample(bme680.OS_4X) self._sensor.set_temperature_oversample(bme680.OS_8X) self._sensor.set_filter(bme680.FILTER_SIZE_3) self._sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) # TODO: SAME. ALSO MAKE PROFILES SELECTABLE AND WHAT NOT self._sensor.set_gas_heater_temperature(320) self._sensor.set_gas_heater_duration(150) self._sensor.select_gas_heater_profile(0) self._meta['initial_reading'] = self._attrs_to_dict(self._sensor.data)
def run(): client = mqtt.Client() client.connect(HOST_NAME) client.loop_start() topic = "sensors/" + LOCATION + "/environment" try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) while True: sensor.get_sensor_data() builder = MeasurementBuilder() builder.measurement = "environment" builder.tags["location"] = "FR-TEST-PI" builder.values["temperature"] = sensor.data.temperature builder.values[ "pressure"] = sensor.data.pressure * 100.0 # Convert to Pascals builder.values["humidity"] = sensor.data.humidity print(builder.build()) message = client.publish(topic, builder.build()) time.sleep(10)
def initBME680(): global sensor try: # setup BME680 sensor try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # These oversampling settings can be tweaked to change the balance between accuracy and noise in the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) sensor.set_gas_heater_temperature(320) sensor.set_gas_heater_duration(150) sensor.select_gas_heater_profile(0) return 1 except IOError as ex: print("Reading BME680 failed: IOError Exception: " + str(ex)) print( "In case of \"[Errno 121] Remote I/O error\": Maybe SD0 is not connected to GND" ) return 0
def __init__(self, outqueue = None, burn_time = 300): '''The module is intented to be a secondary thread of the base class SmartCoil. To allow communication between the main thread and this thread, a Queue can be passed as an argument. Additionally, the BME680 needs a period of burning time to prime the gas sensor and read accurate air quality values. A specific amount of time to prime the gas sensor can be passed as an argument too. Args: outqueue (:obj:`Queue`, optional): Outbound queue to send messages to the main thread. burn_time (int): Time in seconds to allow the sensor to burn before sending accurate readings. Defaults to 5 minutes. ''' try: self.outbound_queue = outqueue self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) #3.32 except IOError: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # sensor initial calibration for name in dir(self.sensor.calibration_data): if not name.startswith('_'): value = getattr(self.sensor.calibration_data, name) # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) self.sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) # Up to 10 heater profiles can be configured, each # with their own temperature and duration. # sensor.set_gas_heater_profile(200, 150, nb_profile=1) # sensor.select_gas_heater_profile(1) self.sensor.set_gas_heater_temperature(320) self.sensor.set_gas_heater_duration(150) self.sensor.select_gas_heater_profile(0) # for building up gas resistance baseline self.start_time = time.time() self.curr_time = time.time() self.burn_in_time = burn_time self.burn_in_data = [] self.gas_baseline = None self.burn_complete = False # Set the humidity baseline to 40%, an optimal indoor humidity. self.hum_baseline = 40.0 # This sets the balance between humidity and gas reading in the # calculation of air_quality_score (25:75, humidity:gas) self.hum_weighting = 0.25
def __init__(self, addFilter=False): # Initialisation: try: self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) self.applySensorSettings() if (addFilter == True): # Adds a filter on top of the readings (Makes the more stable) self.sensor.set_filter(bme680.FILTER_SIZE_3)
def __init__(self): try: self.bme = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: self.bme = bme680.BME680(bme680.I2C_ADDR_SECONDARY) except Exception as e: print(e) self.data = self.Data() self.bme.set_humidity_oversample(bme680.OS_1X) self.bme.set_pressure_oversample(bme680.OS_1X) self.bme.set_temperature_oversample(bme680.OS_1X) self.bme.set_filter(bme680.FILTER_SIZE_1)
def __init__(self, apparatus_uuid): super().__init__('BME680', apparatus_uuid) try: try: self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) logger.info(f'Sensor found at {bme680.I2C_ADDR_PRIMARY}.') except IOError: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) logger.info(f'Sensor found at {bme680.I2C_ADDR_SECONDARY}.') self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) self.sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) self.sensor.set_gas_heater_temperature(320) self.sensor.set_gas_heater_duration(150) self.sensor.select_gas_heater_profile(0) logger.info(f'Sensor initialized.') except: logger.critical('Failed to initialize sensor, cannot connect.') raise NameError('Failed to initialize sensor, cannot connect.') self.data = { "temp": None, "pres": None, "relh": None, "gasr": None, "tsta": None } config = configparser.ConfigParser() config.read('configuration.ini') self.temp = Observable(uuid.UUID(config["observables"]["BME680.temp"]), 'C', 'Temperature', 'temp', 'raw', self) self.pres = Observable(uuid.UUID(config["observables"]["BME680.pres"]), 'hPa', 'Pressure', 'pres', 'raw', self) self.relh = Observable(uuid.UUID(config["observables"]["BME680.relh"]), '%', 'Relative Humidity', 'relh', 'raw', self) self.gasr = Observable(uuid.UUID(config["observables"]["BME680.gasr"]), 'Ohms', 'Gas Resistance', 'gasr', 'raw', self) self.tsta = Observable(uuid.UUID(config["observables"]["BME680.tsta"]), 'NA', 'Temperature stability', 'tsta', 'raw', self) self.observables = [ self.temp, self.pres, self.relh, self.gasr, self.tsta ] logger.info('5 Observables available.')
def initBME680(ts_sensor): sensor = None i2c_addr = "0x76" # default value try: # setup BME680 sensor try: if 'i2c_addr' in ts_sensor: i2c_addr = ts_sensor["i2c_addr"] if i2c_addr == "0x76": sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) elif i2c_addr == "0x77": sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) else: logger.error("Ivalid BME680 I2C Adress '" + i2c_addr + "' specified.") return sensor except IOError as ex: if str(ex) == "[Errno 121] Remote I/O error": logger.error("Initializing BME680 on I2C Adress '" + i2c_addr + "' failed: Most likely wrong Sensor Chip-ID or sensor not connected.") else: logger.error("Initializing BME680 on I2C Adress '" + i2c_addr + "' failed: " + repr(ex)) return sensor except Exception as ex: logger.exception("Unhandled Exception initBME680 during initializing of BME680") return sensor offset = 0 if 'offset' in ts_sensor: offset = float(ts_sensor["offset"]) logger.debug("BME680 on I2C Adress '" + i2c_addr + "': The Temperature Offset is " + str(offset) + " °C") # These oversampling settings can be tweaked to change the balance between accuracy and noise in the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) sensor.set_temp_offset(offset) sensor.set_gas_heater_temperature(320) sensor.set_gas_heater_duration(150) sensor.select_gas_heater_profile(0) sensor.set_power_mode(bme680.FORCED_MODE) return sensor except IOError as ex: if str(ex) == "[Errno 121] Remote I/O error": logger.error("Reading BME680 on I2C Adress '" + i2c_addr + "' failed: Most likely I2C Bus needs a reboot") return sensor except Exception as ex: logger.exception("Unhandled Exception in initBME680") return sensor
def __init__(self): super(AbstractSensor, self).__init__() try: self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) logging.info("BME680 found on I2C primary address") except IOError: try: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) logging.info("BME680 found on I2C secondary address") except IOError: logging.error("BME680 not found on I2C. Exiting...") GPIO.cleanup() sys.exit(2) self.initialize()
def __init__(self): try: self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) if self.sensor is None: Utils.log("could not init BME680 sensor!") self.font = ImageFont.truetype("assets/IBMPlexSans-Medium.ttf", 100) self.sensor.set_temp_offset( AppConstants.AppConstants.bme680_temperature_offset) self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) self.sensor.set_gas_status(bme680.DISABLE_GAS_MEAS)
def initialize_bme680(): humidity_os = get_constant('humidity_oversample', str) temperature_os = get_constant('temperature_oversample', str) pressure_os = get_constant('pressure_oversample', str) filter_size = get_constant('filter_size', str) enable_gas_meas = bme680.constants.ENABLE_GAS_MEAS if config['enable_gas_meas'].get() == "yes"\ else bme680.constants.DISABLE_GAS_MEAS temp_offset = config['temp_offset'].get(int) gas_heater_temperature = config['gas_heater_temperature'].get(int) gas_heater_duration = config['gas_heater_duration'].get(int) gas_heater_profile = config['gas_heater_profile'].get(int) sensor = bme680.BME680(bme680.constants.I2C_ADDR_PRIMARY) sensor.set_humidity_oversample(humidity_os) sensor.set_temperature_oversample(temperature_os) sensor.set_pressure_oversample(pressure_os) sensor.set_filter(filter_size) sensor.set_gas_status(enable_gas_meas) sensor.set_temp_offset(temp_offset) sensor.set_gas_heater_temperature(gas_heater_temperature) sensor.set_gas_heater_duration(gas_heater_duration) sensor.select_gas_heater_profile(gas_heater_profile) return sensor
def __init__(self, mqtt_id, i2c_addr=None, i2c_device=None): self.mqtt_id = mqtt_id if i2c_addr: self._sensor = bme680.BME680(i2c_addr=i2c_addr, i2c_device=i2c_device) else: self._sensor = bme680.BME680(i2c_device=i2c_device) self._sensor.set_humidity_oversample(bme680.OS_8X) self._sensor.set_pressure_oversample(bme680.OS_8X) self._sensor.set_temperature_oversample(bme680.OS_8X) self._sensor.set_filter(bme680.FILTER_SIZE_3) self._sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) self._sensor.set_gas_heater_temperature(320) self._sensor.set_gas_heater_duration(150) self._sensor.select_gas_heater_profile(0)
def __init__(self, i2c_device, address=I2C_ADDR_PRIMARY, debug=False, calibrate=None, raw=False): self.sensor = bme680.BME680(i2c_addr=address, i2c_device=i2c_device) self.debug = debug # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. self.sensor.set_humidity_oversample(OS_2X) self.sensor.set_pressure_oversample(OS_4X) self.sensor.set_temperature_oversample(OS_8X) self.sensor.set_filter(FILTER_SIZE_3) self.sensor.set_gas_status(ENABLE_GAS_MEAS) self.sensor.set_gas_heater_temperature(320) self.sensor.set_gas_heater_duration(150) self.sensor.select_gas_heater_profile(0) self.calibrate = { 'temperature': None, 'pressure': None, 'humidity': None, 'altitude': None, 'gas': None} if type(calibrate) is dict: for k in calibrate.keys(): if (not k in self.calibrate.keys()) or (not type(calibrate[k]) is list): continue self.calibrate[k] = calibrate[k] self.raw = raw self.updated = 0 # millis of last BME680 data update self.sea_level_pressure = 1010.0 # Set the humidity baseline to 40%, an optimal outdoor humidity. self.hum_base = 80.0 # This sets the balance between humidity and gas reading in the # calculation of air_quality_score (25:75, humidity:gas) self.hum_weight = 0.25 self.gas_base = None
def test_temp_offset(smbus, calibration): """Validate temperature calculation with offset against mock calibration data.""" sensor = bme680.BME680() sensor.calibration_data = calibration sensor.set_temp_offset(1.99) assert sensor._calc_temperature(501240) == 2669 + 199 assert sensor.calibration_data.t_fine == 146830
def test_temp_offset(smbus, calibration): """Validate temperature calculation with offset against mock calibration data.""" sensor = bme680.BME680() sensor.calibration_data = calibration sensor.set_temp_offset(1.99) assert sensor._calc_temperature(501240) == pytest.approx(2868.30, 0.01) assert sensor.calibration_data.t_fine == pytest.approx(146831.78, 0.01)
def main(): sensor = bme680.BME680() # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. sensor.set_humidity_oversample(bme680.OS_16X) sensor.set_pressure_oversample(bme680.OS_16X) sensor.set_temperature_oversample(bme680.OS_16X) sensor.set_filter(bme680.FILTER_SIZE_3) print("Polling:") try: while True: if sensor.get_sensor_data(): now = maya.now() t = sensor.data.temperature h = sensor.data.humidity p = sensor.data.pressure output = f"{now.rfc2822()} - Temp: {t:.2f} C, Hum: {h:.2f} HU, Pres: {p:.2f} hPa." print(output) time.sleep(60) except KeyboardInterrupt: pass
def __init__(self, poll_time=5, debug=False): Thread.__init__(self) config = configparser.ConfigParser() config.read('config.conf') humidity_offset = float(config['PiEnvironmentSensor']['humidity_offset']) # Poll time in minutes self.__poll_time = poll_time self.__debug = debug self.__stop = False # Prepare sensor self.__sensor = bme680.BME680() self.__sensor.set_humidity_oversample(bme680.OS_2X) self.__sensor.set_pressure_oversample(bme680.OS_4X) self.__sensor.set_temperature_oversample(bme680.OS_8X) self.__sensor.set_filter(bme680.FILTER_SIZE_3) self.__sensor.set_gas_status(bme680.DISABLE_GAS_MEAS) # Humidity offset due to other sensor self.HUMIDITY_OFFSET = humidity_offset if not os.path.isfile('environment.log'): with open('environment.log', 'w') as environment_log: environment_log.write('Time,Temperature,Pressure,Humidity\n')
def __init__(self, logger, mqttc, sensor_id, addr, temp_offset): super().__init__(logger, mqttc, sensor_id) self.addr = addr self.temp_offset = temp_offset self.sensor = bme680.BME680(addr) self.config(temp_offset) self.gas_baseline = self.get_gas_baseline()
def __init__(self, name, interface=None, addr=0x77, event=None): Interface.__init__(self, name, interface, event=event) self.addr = addr self.lock = threading.Lock() self.correction = .68 # pressure correction - rough approximation in inches self.sensor = bme680.BME680(self.addr) self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) # self.sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) # self.sensor.set_gas_heater_temperature(320) # self.sensor.set_gas_heater_duration(150) # self.sensor.select_gas_heater_profile(0) def sample(): while True: with self.lock: try: while not self.sensor.get_sensor_data(): time.sleep(.1) except IOError as ex: log(self.name, type(ex).__name__, str(ex)) time.sleep(weatherSampleRate) sampleThread = LogThread(name="sampleThread", target=sample) sampleThread.start()
def __init__(self, config): super(monitor_bme680, self).__init__(config) self.config = config import bme680 self.sensor = bme680.BME680() self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) if config['aqi_measure']: self.sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) self.sensor.set_gas_heater_temperature(320) self.sensor.set_gas_heater_duration(150) self.sensor.select_gas_heater_profile(0) else: self.sensor.set_gas_status(bme680.DISABLE_GAS_MEAS) self.measure_thread = threading.Thread(target=self.measure) self.halt_event = threading.Event() self.iaq = None self.humidity = 0 self.pressure = 0 self.temperature = 0 self.burn_in_data = [] self.gas_baseline = None self.hum_baseline = None self.hum_weighting = None self.sensor_ready = False
def read(self): if bme680.BME680().get_sensor_data(): return BME680Result(self.get_sensor_name(), True, self.sensor.data.temperature, self.sensor.data.humidity, self.sensor.data.pressure, self.sensor.data.gas_comp)
def test_setup_not_present(): """Mock the adbsence of a BME680 and test initialisation.""" sys.modules['smbus'] = mock.MagicMock() sys.modules['smbus'].SMBus = MockSMBus with pytest.raises(RuntimeError): sensor = bme680.BME680() # noqa F841
def read_from_sensor(addr): try: sensor = bme680.BME680(addr) sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) except: logger.debug('ERROR: Could not connect to sensor') logger.debug(' Ensure i2c is turned on via raspi-config') logger.debug(' Check wires') return False, None try: while True: if sensor.get_sensor_data(): temperature = '{0:.2f}'.format(sensor.data.temperature) pressure = '{0:.2f}'.format(sensor.data.pressure) humidity = '{0:.2f}'.format(sensor.data.humidity) return True, { "temperature": temperature, "pressure": pressure, "humidity": humidity } except: logger.debug('ERROR: Could not get sensor data') return False, None
def run(self): try: sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # These calibration data can safely be commented # out, if desired. #print('Calibration data:') for name in dir(sensor.calibration_data): if not name.startswith('_'): value = getattr(sensor.calibration_data, name) #if isinstance(value, int): # print('{}: {}'.format(name, value)) # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_filter(bme680.FILTER_SIZE_3) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) sensor.set_gas_heater_temperature(320) sensor.set_gas_heater_duration(150) sensor.select_gas_heater_profile(0) # Up to 10 heater profiles can be configured, each # with their own temperature and duration. # sensor.set_gas_heater_profile(200, 150, nb_profile=1) # sensor.select_gas_heater_profile(1) print('\n BME680 is Started') while not self.Terminated: if sensor.get_sensor_data(): ret = self.client1.publish("home/temperature", (sensor.data.temperature)) ret = self.client1.publish("home/pressure", (sensor.data.pressure)) ret = self.client1.publish("home/humidity", (sensor.data.humidity)) time.sleep(60)
def _setup_bme680(options: Options) -> Optional[BME680Handler]: """Set up and configure the BME680 sensor.""" sensor_handler = None sensor = None try: # pylint: disable=no-member bus = SMBus(options.i2c_bus) sensor = bme680.BME680(options.i2c_address, bus) # Configure Oversampling os_lookup = { 0: bme680.OS_NONE, 1: bme680.OS_1X, 2: bme680.OS_2X, 4: bme680.OS_4X, 8: bme680.OS_8X, 16: bme680.OS_16X, } sensor.set_temperature_oversample(os_lookup[DEFAULT_OVERSAMPLING_TEMP]) sensor.set_temp_offset(DEFAULT_TEMP_OFFSET) sensor.set_humidity_oversample(os_lookup[DEFAULT_OVERSAMPLING_HUM]) sensor.set_pressure_oversample(os_lookup[DEFAULT_OVERSAMPLING_PRES]) # Configure IIR Filter filter_lookup = { 0: bme680.FILTER_SIZE_0, 1: bme680.FILTER_SIZE_1, 3: bme680.FILTER_SIZE_3, 7: bme680.FILTER_SIZE_7, 15: bme680.FILTER_SIZE_15, 31: bme680.FILTER_SIZE_31, 63: bme680.FILTER_SIZE_63, 127: bme680.FILTER_SIZE_127, } sensor.set_filter(filter_lookup[DEFAULT_FILTER_SIZE]) sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) sensor.set_gas_heater_duration(DEFAULT_GAS_HEATER_DURATION) sensor.set_gas_heater_temperature(DEFAULT_GAS_HEATER_TEMP) sensor.select_gas_heater_profile(0) except (RuntimeError, OSError): _LOGGER.error("BME680 sensor not detected at 0x%02x", options.i2c_address) return None sensor_handler = BME680Handler( sensor, DEFAULT_AQ_BURN_IN_TIME, DEFAULT_AQ_HUM_BASELINE, DEFAULT_AQ_HUM_WEIGHTING, ) sleep(0.5) # Wait for device to stabilize if not sensor_handler.sensor_data.temperature: _LOGGER.error("BME680 sensor failed to Initialize") return None return sensor_handler
def __init__(self, enabled_heater=True): # BME680 Bosch.cfg = Config().get() Bosch.logger = Log(Bosch.cfg["bosch"]["log_file"]).get() self.burn_time = Bosch.cfg["bosch"]["burn_time"] self.sensors = bme680.BME680() self.setup(enabled_heater)
def __init__(self): self.name = 'BME680' try: self.sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) except IOError: self.sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) # These oversampling settings can be tweaked to # change the balance between accuracy and noise in # the data. self.sensor.set_humidity_oversample(bme680.OS_2X) self.sensor.set_pressure_oversample(bme680.OS_4X) self.sensor.set_temperature_oversample(bme680.OS_8X) self.sensor.set_filter(bme680.FILTER_SIZE_3) # Disable gas measurements self.sensor.set_gas_status(bme680.DISABLE_GAS_MEAS)