Raspberry Piで温湿度モニタリングシステムの構築

この記事のまとめ:
  • Raspberry PiとXiaomiのBluetooth温湿度センサーを使って、温湿度のモニタリングシステムをDockerやAnsibleを使って構築しましたのでその内容を紹介します。
背景

前回、BluetoothでXiaomiの温湿度センサーがブロードキャストするデータを受信してJSONファイルとして保存するスクリプトまで作りましたので、今回はそのJSONファイルをInfluxDB用に加工してInfluxDBに登録するスクリプトを作って、これらのスクリプトをAnsibleでデプロイします。あともちろんサーバー側にはInfluxDBと可視化用にGrafanaを立ち上げます。 今回で温湿度モニタリングシステムの話は完了です。

リポジトリ

今回作ったコードは下記のリポジトリからダウンロードできます。

システム構成

今回のシステムの全体概要は次の通りです。

サーバー側とRaspberry Pi側での準備をそれぞれ見ていきます。

サーバーでの準備

サーバーにTSDBとしてInfluxDBを、ダッシュボードとしてGrafanaをDockerコンテナとして立ち上げます。

docker-compose.yml にまとめてますので、下記のコマンドでコンテナが立ち上がります。

$ docker-compose up -d
$ docker-compose ps
Name                                    Command                  State   Ports
-----------------------------------------------------------------------------------------------
mitemp-server_grafana_1_9c73dcab1d05    /run.sh                  Up      0.0.0.0:3001->3000/tcp
mitemp-server_influxdb_1_965ec865b14e   /entrypoint.sh influxd   Up      0.0.0.0:8087->8086/tcp

GrafanaやInfluxDBへの接続ポート等は適宜変更してください。

Raspberry Piでの準備

Raspberry Piで設定等しなければならないことはすべてサーバーからAnsibleで設定します。下記コマンドで作成したプレイブックを実行できます。

$ ansible-playbook -i inventory/inventory.ini mitemp_deploy.yml

処理の内容は ansible/roles/mitemp/tasks/main.yml を実行しているだけで、主な内容は下記の通りです。

  1. Docker用のPython APIをpipでインストールする
  2. XiaomiのBluetooth温湿度センサーのデータを受信するコンテナ (hassiweb/mitemp) をプルする
  3. 取得したデータをInfluxDBに登録するコンテナ (hassiweb/ mitemp-sender) をプルする
  4. コンテナを実行するシェルスクリプトとデータを保存するセンサーのMACアドレスを書いたファイル(※)とInfluxDBへの接続情報ファイル(※)をコピーする
  5. cronでシェルスクリプトを実行する時間についての変数(※)を読み込む
  6. 2.のコンテナを実行するシェルスクリプトをcronに登録する
  7. 3.のコンテナを実行するシェルスクリプトをcronに登録する

※を付けたファイルは環境に応じて変更が必要です。少し中身を見てみます。

設定ファイル
  • データを保存するセンサーのMACアドレスを書いたファイル
    • ファイル: ansible/roles/mitemp/files/mac_list.txt
    • センサーのMACアドレスを列挙します。MACアドレスを調べる方法は前回の記事に記載していますのでこちらをご参照ください。

  • InfluxDBへの接続情報ファイル

    • ファイル: ansible/roles/mitemp/files/influxdb.conf
    • 下記のフォーマットでInfluxDBのデータベースに接続するために必要な情報を記載します。
    [INFLUX_DB]
    HOST = 192.168.0.20
    PORT = 8087
    USERNAME = admin
    PASSWORD = admin
    DATABASE = mitemp
  • cronでシェルスクリプトを実行する時間についての変数

    • ファイル: ansible/roles/mitemp/vars/<ターゲットのホスト名/IPアドレス>.yml
    • 下記のフォーマットで mitemp_measurement_cron_minmitemp_sender_cron_min という変数名でcronで hassiweb/mitemp コンテナと hassiweb/mitemp-sender コンテナを実行する時間の設定しています。ファイルはターゲットのホストごとに作成する必要があります。
    mitemp_measurement_cron_min: "5-59/10"
    mitemp_sender_cron_min: "0-59/10"
Grafanaで表示

上記がすべて問題なく実行できていればデータはInfluxDBにどんどん保存されていくはずです。

InfluxDB内のデータ保存先はデフォルトでは、データベースは mitemp 、measurementはセンサーのMACアドレスに入るようになっていますので、下記のようにcurlコマンドを叩けばデータが保存されているか確認できます。

$ curl -G 'http://192.168.0.20:8087/query?pretty=true' --data-urlencode "db=mitemp" --data-urlencode 'q=SELECT * from "<センサーのMACアドレス>"'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current Dload  Upload   Total   Spent    Left  Speed
100  4089    0  4089    0     0   236k      0 --:--:-- --:--:-- --:--:--  234k{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "58:2D:34:33:D4:8A",
                    "columns": [
                        "time",
                        "battery",
                        "humidity",
                        "temperature"
                    ],
                    "values": [
                        [
                            "2019-06-16T16:29:51Z",
                            68,
                            50.7,
                            25.4
                        ],
                        [
                            "2019-06-16T16:30:17Z",
                            68,
                            50.5,
                            25.4
                        ],
...

ちゃんとデータが保存されているようであればInfluxDBでちょちょいとダッシュボードを作ってやればこんな感じになります。

無事に完成しました。

# 我が家の1階とロフトの温度差がすごい…。これからどうやって部屋を涼しくさせるかを考えよ。


今回は以上です。 最後まで読んでいただき、ありがとうございます。
関連記事



コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法

PythonでPinterestのPin (画像)の検索結果を取得する

ネットワーク越しの RTL-SDR で SDR# を使う方法