Esempio n. 1
0
    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 = {}
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
File: BME680.py Progetto: rpj/rpi
    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)
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
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
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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.')
Esempio n. 11
0
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
Esempio n. 12
0
 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()
Esempio n. 13
0
 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)
Esempio n. 14
0
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
Esempio n. 15
0
    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)
Esempio n. 16
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
Esempio n. 17
0
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
Esempio n. 18
0
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)
Esempio n. 19
0
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')
Esempio n. 21
0
 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()
Esempio n. 22
0
    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()
Esempio n. 23
0
    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
Esempio n. 24
0
 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)
Esempio n. 25
0
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
Esempio n. 26
0
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
Esempio n. 27
0
    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)
Esempio n. 28
0
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
Esempio n. 29
0
    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)
Esempio n. 30
0
    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)