Raspberry Piで温度・湿度・気圧センサーと天気予報APIでペット環境を見守る

こんにちは、 田村 です。

最近、知り合いのインコ部屋にRaspberry Piと温度・湿度・気圧センサーを設置し、天気予報APIも使用して、お留守番中の環境を確認できるようにしました。

動機

インコはもともと暖かく湿気のある地域に生息しており、寒さに弱い生き物です。
日中に家を空けていると、インコ部屋の温度・湿度が保たれているか、心配になります。
以前、部屋の温度を数日低くしてしまったことで、インコが体調を崩してしまったことがありました。

現在は、家電メーカーから発売されているペットカメラを設置していますが、これは微妙にかゆいところに手が届かないと感じていました。
ペットカメラには、標準カメラ、赤外線カメラ、温度センサー、動作センサー、音センサーが搭載されていfます。

標準カメラ、赤外線カメラは、外出先でも様子が見られるため、非常に便利です。
温度センサーは、ペットカメラの画角の関係で距離を取る必要があり、インコ部屋の外に置いています ※。
そのため、計測される温度は人がいるところの室温で、インコが過ごしているケージ内の室温はわかりません。また、温度センサーしかないため、湿度はわかりません。

※インコ部屋はアクリルケージで囲い、ペット用のヒーターで暖めています。

そこで今回、温度・湿度・気圧センサーをインコ部屋の中に設置し、環境を計測できるようにしました。

構成

今回構築した構成は下記の通りです。

ハードウェア

# 品名 数量
1 Raspberry Pi 4 Mlodel B 1
2 OKdoブラック2ピース構造スライドケース 1
3 TOSHIBA microSDHC EXCERIA 16GB 100MB/s 1
4 BME280 温湿度・気圧センサ 2
5 タカチ SWプラケース SW-50B 2
6 6極4芯モジュラーケーブル 2m 3
7 モジュラーローゼット MJ-4S-MG 1
8 モジュラーソケット6極4芯 TM5RJ3-64 3

ソフトウェア

  • Raspberry Pi 4 Model B

    • Raspbian 10.3
    • Python 3.7
  • 自宅サーバー

    • Ubuntu 18.04 LTS
    • Python 3.7
  • その他

    • Rakuten RapidAPI
    • Dark Sky API
    • Pandas
    • Matplotlib

ネットワーク

  • インコの家は、 LTE を経由してインターネットに接続しています。
  • インコの家と自宅は相互に通信できるよう、 IPsec で拠点間接続しています。

センサーの製作

温度・湿度・気圧センサーは、秋月電子通商で販売されている BME280 を使用しています。このセンサーは、I2Cで制御できます。

Raspberry Pi と BME280 を下記のように配線していきます。

BME280は、ジャンパを設定することで、 0x760x77 の2つのI2Cアドレスを使用できます。
今回、2つセンサーを接続するため、それぞれのアドレスになるようにジャンパをはんだ付けします。

I2Cは、電源に2本、信号に2本 (SCL, SDA) の合計4本の配線が必要になります。
Raspberry PiとセンサーをつなぐI2Cバスは、容易に取り回しができるようにしたいと考え、4芯モジュラーケーブルを採用しました。
モジュラーケーブルは家電量販店で調達できるものなので、最適な長さのものに交換して、センサーの位置を自由に変更できます。

タカチ SWプラケースを削り、センサーと2つのモジュラージャックを収めました。
2つのモジュラージャックは導通しているため、他のセンサーをデイジーチェーンできるようにしています。
写真では穴が空いていませんが、温度・湿度・気圧を計測できるよう、ケースの前面には通気孔を空けています。

Raspberry Pi からはI2Cで使用する4本の線を引き回し、モジュラーローゼットを配置しています。

設置

下記の写真のように、インコ部屋に温度センサーを設置しています。
手作業で穴を空けたため、ガタガタになってしまっています。

実装

センサーからのデータ取得

センサーからのデータの取得は、こちらのコードを参考にさせていただきました。
https://github.com/SWITCHSCIENCE/samplecodes/tree/master/BME280

こちらのコードをベースに、下記CSVを出力するように実装します。

Date,GR Temp,GR Press,GR Hum,OR Temp,OR Press,OR Hum
2020-03-01 17:00:00,23.94,1004.81,53.46,21.53,1003.36,62.13
2020-03-01 17:30:00,25.75,1005.25,50.85,22.10,1003.73,62.95
2020-03-01 18:00:00,26.55,1005.34,48.78,22.22,1003.83,62.06
2020-03-01 18:30:00,26.58,1005.70,47.49,22.00,1004.25,62.20
2020-03-01 19:00:00,26.41,1005.88,42.79,21.68,1004.29,50.83
2020-03-01 19:30:00,26.18,1006.09,40.66,21.65,1004.61,51.54

天気予報APIからの実績と予報データの取得

天気予報データは、 Rakuten RapidAPI を使用し、このマーケットプレイスで公開されている、 Dark Sky API を使用しました。
Rakuten RapidAPI は、1つのAPIキーを使用して世界中の様々なAPIを利用できるようにした、プロキシサービスです。

様々なAPIをWebで簡単にテストでき、Pythonをはじめいろいろな言語に対応したAPIをコールするためのコードスニペットも用意されているため、結構便利です。

Pythonのコードスニペットをダウンロードし、パースして下記CSVを出力するためのコードを追加実装しました。

Date,WT Temp,WT Press,WT Hum,WT Sum,WT PrecipIntensity,WT PrecipProbability,WT ApparentTemperature,WT WindSpeed,WT WindBearing,WT CloudCover
2020-03-01 17:00:00,14.79,1015.4,42.0,曇り,0,0,14.79,2.66,167,77
2020-03-01 17:30:00,14.2,1015.7,44.0,曇り,0,0,14.2,2.74,180,90
2020-03-01 18:00:00,13.65,1016,47.0,曇り,0,0,13.65,2.89,191,94
2020-03-01 18:30:00,13.14,1016.6,50.0,曇り,0,0,13.14,3.13,187,96.0
2020-03-01 19:00:00,12.73,1017.2,52.0,曇り,0,0,12.73,3.51,180,92.0
2020-03-01 19:30:00,12.46,1017.6,55,曇り,0,0,12.46,3.93,177,91.0

グラフの描画

グラフの描画は、まず Jupyter Notebook で行いました。
Jupyter Notebook はブラウザ上で Python のコードを記述でき、グラフなど視覚的な結果を確認しながらプログラミングできるツールです。

センサーからのデータ取得天気予報APIからの実績と予報データの取得 で出力していた2つのCSVを読み込ませ、 Pandas で加工していきます。
そのデータを Matplotlib でグラフを描画するようにしました。

Slackへのアップロード

Jupyter Notebook でグラフが描画できたら、ここから Python のコードに落とし込みます。
Pythonコード上で、 Slack files.upload API を使用して、Slack の特定 channel にグラフをアップロードするようにします。
cron に登録し、定期的にグラフをアップロードするようにします。

動作画面

下記のように、定期的に1週間ごと、1日ごとの温度・湿度・気圧の推移をグラフに描画しています。
緑色、黄色の線はセンサーのデータで、グレーの線は DarkSky API から取得した天気データです。

DarkSky API は、1時間ごとの天気予報も取得することが可能です。
これを使用して、1日先の1時間ごとの温度・湿度・気圧・降水量・降水確率を取得して、下記のようにグラフをプロットしています。
毎晩1回Slackにアップロードし、翌日のインコ部屋の温度管理の計画を立てるための情報として使用しています。

使用してみての感想

今回は温度・湿度・気圧センサーと天気予報APIから取得したデータをグラフに描画する仕組みを構築しました。

使用を開始してからは1ヶ月弱が過ぎました。
今までは、インコ部屋に温湿度計を立てて、ペットカメラ越しに確認しに行っていたのですが、このシステムを構築してからは定期的にSlackに情報が通知されるため、だいぶ把握が楽になりました。
湿度・温度・気圧・降水確率・降水量のグラフは、それぞれ別の画像で書き出しSlackにアップロードしているのですが、短時間に連続してアップロードしているためか、たまにアップロードに失敗します。
そんなに頻度は多くないので、失敗したときは手動でグラフ描画を再実行しています。

製作時の感想は、ケースの加工がなかなか大変でした。バンドソーやボール盤など電動工具がなく手作業で削ったり穴を空けていたので結構疲れました。
ソフトウェアの実装は、参考にできるコードがすでにあったり、便利なAPIサービスがあったりと、すんなり実装できました。

インコ部屋の環境は、今後下記のように改良してみたいと考えています。

  • Prometheus・Grafana 環境の構築
  • 温度のしきい値に応じて Slack への通知 (Prometheus Alertmanager)
  • 温度に応じて赤外線でエアコンの電源ONにする
  • I2Cバスのノイズ対策

関連記事

Raspberry Piでコミュニケーションシンクロ率を上げる