Raspberry Pi + Node-RED + DS18B20 防水型温度センサー でメダカ水槽の温度を管理する (4)
“Raspberry Pi + Node-RED + DS18B20 防水型温度センサー でメダカ水槽の温度を管理する (3)”
“自宅のWiFiが建屋の隅まで届きづらいのでWiFi中継機を導入したけど失敗、ローミングで拡張完了!”の続きです。
先日のTALKで、“Node-RED”をプラットフォームに、”node-red-dashboard“と”node-red-contrib-homekit-bridged“の2つのノードを使って、水槽の水温管理の仕組みを完成させました。
最初のプランでは、メダカ水槽の温度を測定するだけなので”Raspberry Pi Zero W“で十分だと思っていたのですが、実際に動かしてみると”Zero W”だと”Node-RED”が起動しないことが判明したので、贅沢に”Raspberry Pi 3 Model B“で稼働中です。ちなみに、窓の向こう側がベランダです。
一方で、ベランダに面したリビングルームの窓のサッシにラズパイを設置した関係で、書斎のルーターとの距離があるため、無線LANの信号が不安定という問題が発生したので、保管してあった”AirMac Time Capsule“を利用したローミングネットワークを構築し、ネット環境の安定化を図りました。
これで、当初の計画はコンプリートしたわけですが、窓のサッシに取り付けた”Raspberry Pi 3 Model B“がオーバースペックなのがどうにも気になっています。折角、無線LANも強化したので、計画を拡張して、ベランダに置いてある睡蓮鉢周辺のコンディションも計測できないか検討することにしました。
< 今回用意したモノ >
・当初の計画通りで使うつもりだった”Raspberry Pi Zero W“をベランダの睡蓮鉢の近くに設置します。
・睡蓮鉢の水温を計測するための“Aideepen 5個セット DS18B20 防水型温度センサ サーミスタ温度コントローラ 長さ1M プローブ付き” (DS18B20 防水型温度センサー)。以前購入した5本セットのうち4本が余っているので、そのうちの1本を使用します。
・ベランダの温湿度を計測するために、”HiLetgo 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoと互換” (DHT11 温度センサー)を購入しました。こちらは3本セットもので、以前購入実績があり、そこそこの精度で測定できそうなのでリピート買いです。
・モバイルバッテリー
今回は野外にラズパイを設置するので手元にあったモバイルバッテリーを使用しました。モバイルバッテリーの詳しいスペックは不明ですが、もともとの用途はiPhoneとApple Watchの充電用だったのでそれなりの容量はあるはず。後ほど、どのぐらい保つか動作確認テストを行います。
・タッパー
台所回りで古くなったので買い替えても良いかな?と思えるタッパーを1個利用します。
・LEDライト
後ほど紹介しますが、モバイルバッテリーでラズパイを動かすので、バッテリー切れをすぐに確認できるよう自作のLEDライトを用意しました。
< ベランダに設置するRaspberry Pi Zero Wのセットアップ >
・”DS18B20 防水型温度センサー”のセットアップは、先日のTALK (“Raspberry Pi + Node-RED + DS18B20 防水型温度センサー でメダカ水槽の温度を管理する (1)“)をご覧下さい。
それでは、”DS18B20 防水型温度センサー”で計測した睡蓮鉢の水温をテキストファイルに書き出す”Python”スクリプトを用意します。こちらのスクリプトは、メダカ水槽の水温を測定する時に用意した”water_temp.py”をベースに、テキストファイルへの書き出し部分 (赤い四角部分)を追記した内容です。
nano water_temp_outdoor.py
“Raspberry Pi Zero W“に”Node-RED”をインストールできないので、テキストファイルに書き出した睡蓮鉢の水温データを、リビングルームに設置済の”Raspberry Pi 3 Model B“に転送し、”Raspberry Pi 3 Model B”の”Node-RED”環境でデータを可視化することにします。
ラズパイ間の通信には、以前のTALK (“macOSからRaspberry Piにワンクリックでradiko ラジオ放送の再生を指示する “Automatorとparamikoを活用”“)でも利用した”paramiko“を使うことにします。
“paramiko”のインストール手順は以下の通りです。
sudo apt-get install libffi-dev
pip install paramiko
“paramiko”のインストールは”pip”経由で良いのですが、その前に”libffi-dev“をインストールしておかないと、
“c/_cffi_backend.c:15:10: fatal error: ffi.h: そのようなファイルやディレクトリはありません”というエラーが発生し、”paramiko”をインストールできませんでした。
“paramiko”を利用した”Python”スクリプトは次の通りです。
・”HOST” 送信先のラズパイのIPアドレス。今回の場合は”Raspberry Pi 3 Model B”のIPアドレスです。
・”USER” 送信先のラズパイにログインするためのユーザ名。
・”PASSWORD” 送信先のラズパイにログインするためのパスワード。
nano water_temp_outdoor_transport.py
・DHT11温度センサーのセットアップは、先日のTALK (“ワンコインでお部屋の温度をHomeKitをベースに外出先でもモニターできるようにしてみました“)をご覧下さい。なお、”DHT11温度センサー”のout端子は、前回同様、ラズパイのピンヘッド pin #11 (GPIO17)に接続しました。
続いて、睡蓮鉢周辺の温湿度を”DHT11温度センサー”で測定した結果を、テキストファイルに書き出す”Python”スクリプトを用意します。こちらのスクリプトは、室内の温湿度を測定する時に用意した”get_dht11_temp_humidity.py”をベースに、テキストファイル名のみ変更した内容です。
nano get_dht11_temp_humidity.py
テキストファイルに書き出した温湿度データを、リビングルームに設置済の”Raspberry Pi 3 Model B“に転送し、”Raspberry Pi 3 Model B”の”Node-RED”環境でデータを可視化することにします。用意する”Python”スクリプトは、先程作成した”water_temp_outdoor_transport.py”を温湿度用に変更した内容です。
nano temp_humidity_outdoor_transport.py
作成したスクリプトを、毎日朝6時〜夕方18時までの間、30分毎に実行するようcronを設定します。実行する時間間隔をあまり短くするとモバイルバッテリーの消耗にもつながるので、個人的に程よいインターバルということで設定しました。
crontab -e
cronを設定したら再起動しておきます。
sudo /etc/init.d/cron restart
< 窓のサッシに設置済のRaspberry Pi 3 Model Bのセットアップ >
室内に設置しているラズパイでは、ベランダのラズパイから送信されるデータを”Node-RED”のダッシュボードで可視化します。
先日のTALK (“Raspberry Pi + Node-RED + DS18B20 防水型温度センサー でメダカ水槽の温度を管理する (2)”)で作成したフローを一部改造します。
変更したところは以下の3点です。
・オリジナルのフローでは各センサーからデータを取得しましたが、今回は送信済のファイルに記録されているデータを読み込む方式に変更します。
データを読み込む部分は”file in”ノードを利用し、プロパティ画面では各データが記録されているテキストファイルを指定します。
・1台のラズパイ上に2種類のダッシュボードを作ったので、各フローを切り替えるボタンを配置しました。
ボタン配置のために、”button”ノード – “template”ノード – “ui control”ノード、という新しいフローを作成しました。メダカ水槽の管理フロー側にも、同様のフローを作成して下さい。
“button”ノードのプロパティ画面でのポイントは、ボタンに表示するアイコンの設定です。アイコン名は”Angular Material Icons“を参照して下さい。
“template”ノードのプロパティ画面では、後方の”ui control”ノードに送るJSON型のメッセージを作成します。
“ui control”ノードのプロパティ画面では、後方のノードがないので特段設定する内容はありませんが、念のために”Output”欄で”Change tab event only”を選択しておきます。
ボタン配置用のフローは、ボタン専用のグループに所属するようにしました。
・睡蓮鉢の室温は、自宅にいる時にチェックすれば十分なので、”ホーム” iOSアプリ対応は行いません。
完成した新しいフローはこんな感じです。
新しいフローをデプロイすると、こんな感じのダッシュボード画面が表示されます。
< ベランダに設置するRaspberry Pi Zero Wのパッケージング >
ラズパイやモバイルバッテリーをベランダに設置するので、最低限、防滴仕様にする必要があります。
今回は、台所で使わなくなったタッパーを使って、簡易版の防滴仕様パッケージングを自作しました。
バージョンアップの持続時間をチェックするために仮組み (タッパーに仮収納しただけ)したパッケージです。こうやってみると、ラズパイのLEDランプで稼働を確認できそうですが、本稼働時にはラズパイも防滴を目的にケースに収納する予定なので、やはりパッケージの外側からでもラズパイの稼働をチェックできるLEDランプは必要ですね。
< モバイルバッテリーは一日待たず省電力対策を行う >
実際に試験稼働してみたところ、使用したモバイルバッテリーの力不足もあってか、ラズパイの稼働時間は一日保ちませんでした。
そこで、ラズパイの省電力化を目的に以下の対策を行ってみることにしました。
・新しいモバイルバッテリーを調達しました。
アマゾンの新生活セールで
が格安の1,700円ぐらいで売っていたので、大容量ということで購入しました。余談ですが、個人的にはかなりお気に入りなので、後日のTALKで詳しい内容を紹介しようと思います。
・HDMIをオフにする
/opt/vc/bin/tvservice --off
・USBのオフにする (“Raspberry Pi Zero W”ではコマンドは正常に受け付けるものの電源供給はオンのまま。)
echo 0x0 | sudo tee /sys/devices/platform/soc/20980000.usb/buspower
・ラズパイの稼働チェック用LEDランプは外しました。その代わり、”Node_RED”のダッシュボード上にベランダに設置したラズパイに定期的にpingを打つことで生存監視を行うようにしました。
生存監視用に追加したフローは、”ping”ノード – “function”ノード – “text”ノードです。
“ping”ノードのプロパティ画面では、ベランダに設置したラズパイのIPアドレスを設定し、30分間隔でpingを打つようにしました。
“function”ノードのプロパティ画面では、下図のようなコードを入力し、pingの結果に応じたメッセージを後方に送るようにしました。
“text”ノードのプロパティ画面では、下図のような設定にしました。
新しいフローをデプロイすると、こんな感じのダッシュボード画面が表示されます。
< いよいよフィールドテストで動作検証する >
まずは、完成したパッケージングはこんな感じです。素人の工作レベルとしてはまずまずでしょ?
DS18B20 防水型温度センサーは、”ヒートシュリンクチューブ“で絶縁&防水対策を施しました。
DHT11 温度センサーは、プリント基板を保護する意味でタッパーの内側に配置し、ケースに細かな穴を開けた構造にしました。
タッパーの蓋を閉じると、外見はこんな感じになります。新規に購入したモバイルバッテリーは、パーセント表示でバッテリー残量を確認できるので、タッパーを閉じた状態でもOKです。
ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。