2021年4月19日月曜日

Raspberry Pi Zeroに接続したDHT11センサーの温度・湿度データをPostgreSQLに保存する

DHT11センサーの温度・湿度データをPostgreSQLに保存するには以下の手順を実行します。

※Raspberry Pi ZeroとDHT11センサーモジュールの接続については、以下を参照してください。
Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得する

実装手順

1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table dht11_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature float,
  humidity float,
  constraint pk_dht11_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. dht11とpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、dht11とpsycopg2用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/dht11_pg

cd ~/dht11_pg

pipenv --python 3

pipenv install dht11 psycopg2-binary

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_dht11.py
import os
import psycopg2
import psycopg2.extras
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

while True:
  instance = dht11.DHT11(pin=14)
  result = instance.read()
  if result.is_valid():
    print("Temperature: {:.1f}(C)".format(result.temperature))
    print("Humidity: {:.1f}(%)".format(result.humidity))

    device_name = 'test device'
    sql = """insert into dht11_sensor values (%s, current_timestamp, %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, result.temperature, result.humidity))
    conn.commit()
    break

GPIO.cleanup()

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_dht11.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python record_dht11.py

関連情報

・蓄積したデータを可視化するにはApache Supersetなどを使用することもできます。
Apache Supersetでデータセットを集計して二重軸時系列グラフ(Mixed Time-Series)で表示する

0 件のコメント:

コメントを投稿