Skip to content

Instantly share code, notes, and snippets.

@maxious
Last active December 28, 2019 05:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxious/0813dc3d90e9ee2138bef2675fdb3b5e to your computer and use it in GitHub Desktop.
Save maxious/0813dc3d90e9ee2138bef2675fdb3b5e to your computer and use it in GitHub Desktop.
bme680 mqtt publisher for python
#!/usr/bin/env python
import bme680
# import context # Ensures paho is in PYTHONPATH
import paho.mqtt.publish as publish
import time
import platform
hostname = platform.node()
sensor = bme680.BME680()
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.DISABLE_GAS_MEAS)
sensor.set_temp_offset(0)
if sensor.get_sensor_data():
output = "{0:.2f} C, {1:.2f} hPa, {2:.3f} %RH".format(
sensor.data.temperature, sensor.data.pressure, sensor.data.humidity)
print(output)
print("")
publish.multiple([
{'topic': "bme680/"+hostname+"/temperature",
'payload': sensor.data.temperature},
{'topic': "bme680/"+hostname+"/pressure", 'payload': sensor.data.pressure},
{'topic': "bme680/"+hostname+"/humidity", 'payload': sensor.data.humidity},
], hostname="192.168.1.154")
if True: # time.localtime().tm_min < 59:
print("Time to do air quality gas measurement...")
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)
# start_time and curr_time ensure that the
# burn_in_time (in seconds) is kept track of.
start_time = time.time()
curr_time = time.time()
burn_in_time = 240
burn_in_data = []
# Collect gas resistance burn-in values, then use the average
# of the last 50 values to set the upper limit for calculating
# gas_baseline.
print('Collecting gas resistance burn-in data for 4 mins\n')
while curr_time - start_time < burn_in_time:
curr_time = time.time()
if sensor.get_sensor_data() and sensor.data.heat_stable:
gas = sensor.data.gas_resistance
burn_in_data.append(gas)
print('Value @ {0} is Gas: {1} Ohms'.format(
curr_time - start_time, gas))
time.sleep(1)
gas_baseline = sum(burn_in_data[-50:]) / 50.0
# Set the humidity baseline to 40%, an optimal indoor humidity.
hum_baseline = 40.0
# This sets the balance between humidity and gas reading in the
# calculation of air_quality_score (25:75, humidity:gas)
hum_weighting = 0.25
print('Gas baseline: {0} Ohms, humidity baseline: {1:.2f} %RH\n'.format(
gas_baseline,
hum_baseline))
if sensor.get_sensor_data() and sensor.data.heat_stable:
gas = sensor.data.gas_resistance
gas_offset = gas_baseline - gas
hum = sensor.data.humidity
hum_offset = hum - hum_baseline
# Calculate hum_score as the distance from the hum_baseline.
if hum_offset > 0:
hum_score = (100 - hum_baseline - hum_offset)
hum_score /= (100 - hum_baseline)
hum_score *= (hum_weighting * 100)
else:
hum_score = (hum_baseline + hum_offset)
hum_score /= hum_baseline
hum_score *= (hum_weighting * 100)
# Calculate gas_score as the distance from the gas_baseline.
if gas_offset > 0:
gas_score = (gas / gas_baseline)
gas_score *= (100 - (hum_weighting * 100))
else:
gas_score = 100 - (hum_weighting * 100)
# Calculate air_quality_score.
air_quality_score = hum_score + gas_score
print('Gas: {0:.2f} Ohms,humidity: {1:.2f} %RH,air quality: {2:.2f}'.format(
gas,
hum,
air_quality_score))
publish.multiple(
[
{'topic': "bme680/"+hostname+"/gas_resistance", "payload": round(gas,2)},
{'topic': "bme680/"+hostname+"/air_quality",
"payload": round(air_quality_score,2)}
], hostname="192.168.1.154")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment