2021年3月19日金曜日

Raspberry Pi Zeroに接続したBME680センサーのデータをPostgreSQLに保存する

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

0 件のコメント:

コメントを投稿