0から試すIoT~ラズベリーパイ+dht11で温湿度を検出して冷蔵庫を開けた時間を推定する~

ラズベリーパイアイコン Python R

ラズベリーパイを買って、家の中でIoTの雰囲気を味わってみたので、共有する記事です。
ラズベリーパイをセットアップして、dht11と接続し、温湿度をパソコンと共有する方法を解説します。


この記事の中で、以下の事が分かります。

  • ラズベリーパイを使う時に必要なモノ
  • ラズベリーパイのセッティング
  • dht11の使い方
  • MQTTで通信する方法
  • ホテリングのT2理論

この記事と同じことがしたい時は、githubにコードを置いているので、参考にしてみてください。

msamunetogetoge/raz-pi-dht11-PC
ラズベリーパイ+dht11で取得したデータをPCに貯めるコード. Contribute to msamunetogetoge/raz-pi-dht11-PC development by creating an account on GitHub.

はじめに

何をしたのか、何がしたいのか書いておきます。

何がしたいのか

リアルなビッグデータを触ってみたいと何となく思っていました。
python + djangoでアプリを作れるようになったので、自分でデータを取得する事に抵抗がなくなり、IOTでも齧ってみるかとなったのでした。

何をしたのか

ラズベリーパイ+センサーで冷蔵庫の中の温度(ついでに湿度)を10秒毎に記録しました。そのデータをpcに保存し続け、ホテリングのT2理論で異常検知を行いました。
冷蔵庫の中はある温度を基準に上がり下がりしているという仮説の元、異常値として冷蔵庫の開閉を検知できるかなと思っていました。
ホテリングのT2理論は、一つの正規分布があって、そこからの外れ値をカイ二乗検定で検知するという手法なので、今回の分析には最適かなと思い、選択しました。
実際、GMMや、k-meansでは、温度の上がり下がりそれぞれにクラスタを割り当ててしまい、上手くいきませんでした。
そして、データ取得、解析は共に上手くいきました。
どうやったのかを共有したいと思います。

使ったものたち

使ったものを紹介します。
使った言語はpythonです。linuxのシステムも少し使いました。
ラズベリーパイは冷蔵庫に入れようと思ってたので、3A以上出力できるモバイルバッテリーを買いました。6時間くらい連続で動きました。
ラズベリーパイ3 は2,5Aで動くのですが、ラズベリーパイ4は3A以上必要らしいので、バッテリーは3A以上のモノを選びました。
本は、6章の温湿度測定のコードを殆どパクりました。

ラズベリーパイ 3 Model B+

ラズベリーパイ 開発ボード 無線通信実現-Raspberry Pi 3 Model B 【正規品】
Amazon.co.jp: ラズベリーパイ 開発ボード 無線通信実現-Raspberry Pi 3 Model B 【正規品】: 産業・研究開発用品

dht11

HiLetgo 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoと互換 [並行輸入品]
HiLetgo 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoと互換 が基板ストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料(一部除く)。

バッテリー

モバイルバッテリー 26800mAh 大容量 薄型 USB C Charmast 4出力ポート 3入力ポート 最大5V/3A出力 急速充電 iSmart出力 Type-C スマホ充電器【PSE認証済み】iPhone MacBook Android Switch 機種対応
モバイルバッテリー 26800mAh 大容量 薄型 USB C Charmast 4出力ポート 3入力ポート 最大5V/3A出力 急速充電 iSmart出力 Type-C スマホ充電器【PSE認証済み】iPhone MacBook Android Switch 機種対応がモバイルバッテリーストアでいつでもお買い得。当日...

ゼロからよくわかる! ラズベリー・パイで電子工作入門ガイド Raspberry Pi 4 Model B対応[改訂2版]
Amazonでタトラエディットのゼロからよくわかる! ラズベリー・パイで電子工作入門ガイド Raspberry Pi 4 Model B対応。アマゾンならポイント還元本が多数。タトラエディット作品ほか、お急ぎ便対象商品は当日お届けも可能。またゼロからよくわかる! ラズベリー・パイで電子工作入門ガイド Raspberry...

マイクロSD 64GB

ラズベリーパイとdht11

ラズベリーパイとdht11 について書きます。

ラズベリーパイの準備

ラズベリーパイは、小さいコンピューターです。とはいっても、モニターやOSが無くて、usbポートやcpuがむき出しになっています。
ラズベリーパイに電源を繋いでも、OSがインストールされていないので、動きません。
マイクロSDにOSをインストールしておく必要があります。
公式サイトに従ってインストールします。
拘りが無ければ、ラズビアンをインストールすればいいと思います。
https://www.raspberrypi.org/software/

ラズベリーパイとdht11の物理的な接続


物理的に接続した写真です。

ラズベリーパイ+dht11

買ったdht11 は、抵抗と端子が付いていたので、直接差し込むだけで動きました。
違うものを買うと、フレットボードや抵抗が必要だったり、自分で抵抗値と温度を換算したりしないといけないので、ラッキーでした。
端子の接続先などは、以下のサイトや、上にあげた本にも書いています。

https://raspi.taneyats.com/entry/home-electronics-2

ラズベリーパイとdht11の通信

dht11 用のpython ライブラリがあります。
それと、ラズベリーパイのピンの情報を扱うライブラリを使用して通信する事が出来ます。
例えば、次のようなコードでとりあえずはデータを取得できます。

crontab を使って、適当な感覚で上のようなファイルを実行させると、恒常的にデータを取得する事が出来ます。
データを取得しても、ラズベリーパイの中に貯めておいてはしょうがありません。
別の機器と通信する規格にMQTTがあります。
次は、MQTTを使ってパソコンにデータを送信し、csvに記録していきます。

MQTT

mqtt とは、データ配信プロトコルの一種で、データの送受信に、publisher, topic, broker, subscriber を使うものです。1
pubは、topicを決めてデータを送信する人(機器)です。subは、topicを決めてデータを受信する人(機器)です。
broker はpubからsubにデータを渡す役割を担います。この時、sub側は、適切にtopicを選ばないとデータを貰う事が出来ません。

実際に使うには、ラズベリーパイと、ラズベリーパイと通信したい機器にmosqitto をインストールします。

Eclipse Mosquitto
Version 2.0 has been released! The full details are available on the blog post. Eclipse Mosquitto is an open source (EPL/EDL licensed) message broke...


また、python でmosquittoを扱う為に、paho-mqtt をインストールします。これはpip install出来ます。

paho-mqtt
MQTT version 5.0/3.1.1 client class

また、MQTTを動かすコードは、MQTTブローカーのセットアップ , pythonでMQTT送受信 が役に立ちました。

PCとラズベリーパイで通信する為のコード

今回は、ラズベリーパイがpub, 自分のpcがsubという状態です。
ラズベリーパイ側からは10秒毎にpublishされてくるので、pcを動かし続けて、sub用のコードを動かし続けるという感じになります。
初めに、ラズベリーパイ側、pc側で

としてmosquittoを起動しておきます。pc側では、以下のようなコードを作って、動かしておきます。2

上手く動いて、データを受信できると、sub側のコマンドに以下のようなメッセージが出力されます。

subscribe が成功した時のメッセージ

ラズベリーパイ側では、以下のようなコードを動かします。

while True の中身で、データの整形などを行っています。3
このコードは、ラズベリーパイ側で、crontabなどで適当な時間毎に動くようにしておきます。
準備が出来たら、ラズベリーパイをバッテリーに繋いで冷蔵庫に入れます。

湿気とかで壊れたら怖いなと思って、料理で使うパックに入れて封をして投入しました。

冷蔵庫に入るラズベリーパイ

全く冷蔵庫に触れない深夜帯と、必ず冷蔵庫に触る朝方、2回に分けて冷蔵庫に入れました。
10秒毎にデータを取得し、大体12時間分のデータを集めました。

異常検知の手法

データが集まったので、ホテリングのT2理論を使って解析します。湿度はあまり当てにならない感じだったので、温度だけを使います。
ホテリングのT2理論については、解説の記事があるのでそちらをご覧ください。

初めに、得られた温度のグラフを見ます。

得られたデータのグラフ

初めの方は、冷蔵庫の開け閉めが無かった気がするデータです。(深夜に起きて冷蔵庫を開けたかもしれませんが。)
後半は、何回か冷蔵庫を開け示したデータになっています。

ホテリングのT2理論で解析してみます。

異常度の高い順にデータを並べた

以下にも、という時間に異常値が検出されています。多分朝7時ころに朝ごはんを食べたんでしょう。
もう少し分かりやすいように、結果で色分けしたグラフを描いてみます。

結果を眺めると、次の事が分かります。

  • 基本的に温度は1℃~5℃を振動している
  • 前半、後半に異常値がある
  • 温度が低い部分と高い部分が異常値

温度が低すぎる部分と高すぎる部分を異常値として検知している事が分かります。(手法の特性上そうなるのは当たり前ですが。)
低い部分は冷蔵庫の開け閉めに関係ないので、高くなっている部分にだけ注目するスクリプトを書き足す事で、冷蔵庫の開け閉めを検知できそうです。

まとめ

  • ラズベリーパイを買ってラズビアンをインストールした
  • dht11と接続、通信した
  • MQTTを使ってpc,ラズベリーパイ間でデータの送受信をした
  • ラズベリーパイ+dht11 を冷蔵庫に投入して、大きめのデータを作った
  • ホテリングのT2理論を使って異常検知(冷蔵庫の開け閉めの検知)を行った

やってみた感想

IOTの片鱗を垣間見た。サーバーの安定性などの問題が解決できるなら、あまりITに強くない中小企業とかでヒーローに慣れそうだなと思った。ビッグデータってどうやって作るんだろうと思っていたけど、今回みたいに、数秒ごとに何個かのデータを取って1か月もすればビッグデータが出来るなあと分かった。
少しビッグデータが身近に感じた。

次にやる(かもしれない)こと

GCPのサービスにMQTTのブローカーがあるので、電源をどうにかして、1週間くらいデータを取って同じことをしてみる。

  1. 以下、publisher はpub ,subscriberは subと書きます。
  2. データの送受信はjson形式で行います。別にpythonの辞書型でも良いんですが、どのサイトも一回jsonにしてたので真似しました。
  3. ラズベリーパイ側でスクリーンショットを取ってpcに移動するのが面倒だったので動いた時の画像はありません。すみません。
タイトルとURLをコピーしました