BME680で取得したの温度・気圧・湿度・ガスのデータをPostgreSQLに保存するには以下の手順を実行します。
Raspberry Pi ZeroとBME680の接続は「
Raspberry Pi ZeroにBME680を接続して、温度・気圧・湿度・ガスの値を取得する」を参照してください。
実行手順
1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table test_sensor
(
device_name varchar(30) not null,
data_ts timestamp not null,
temperature float,
atmospheric_pressure float,
humidity float,
gas float,
constraint pk_test_sensor primary key (device_name, data_ts)
);
2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update
sudo apt-get -y install python3-pip python3-distutils python3-dev
sudo pip3 install --upgrade pip
sudo pip3 install --upgrade setuptools
sudo pip3 install pipenv
echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc
source ~/.bashrc
3. bme680とpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、bme680用の仮想環境を作成します。
sudo apt-get -y install libpq-dev
mkdir -p ~/bme680_pg
cd ~/bme680_pg
pipenv --python 3
pipenv install bme680 psycopg2-binary smbus
pipenv shell
4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。
record_bme680.py
import os
import psycopg2
import psycopg2.extras
import bme680
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)
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)
while True:
if sensor.get_sensor_data():
print("temperature:{0:.2f}".format(sensor.data.temperature))
print("atmospheric_pressure:{0:.2f}".format(sensor.data.pressure))
print("humidity:{0:.3f}".format(sensor.data.humidity))
if sensor.data.gas_resistance:
print("gas: {} Ohms".format(sensor.data.gas_resistance))
device_name = 'test device'
sql = """insert into test_sensor values (%s, current_timestamp, %s, %s, %s, %s)"""
conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
cur.execute(sql , (device_name, sensor.data.temperature, sensor.data.pressure, sensor.data.humidity, sensor.data.gas_resistance))
conn.commit()
break
5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_bme860.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード
python record_bme680.py
関連情報
・bme680-pythonのgithubリポジトリ
https://github.com/pimoroni/bme680-python