Raspberry Piでカイワレ大根を育ててみた

Node-REDのコントリビュータをしている横井一仁です。今回は、Raspberry Piで植物を栽培するシステムを、Node-REDを用いて開発してみました。用いた植物は、すぐに育つカイワレ大根です🌱🌱🌱
![day1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/0bb25745-433c-dc12-e55d-5bf9e340fdbc.jpeg)
開発したものは「リモート監視ダッシュボード」と「LED照明の自動制御」の2つです。

## リモート監視ダッシュボード
植物が置かれている場所の温度や湿度の環境データを、リモートから監視できるようにするダッシュボードです。

- システム構成
  - エッジ環境側のRaspberry Piで、Grove Piの温湿度センサからデータを取得して、MQTTブローカshiftr.ioへ転送
  - リモート環境側では、ユーザのブラウザ上でNode-REDランタイムを動かし、shiftr.ioからデータ取得、可視化
![system1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/4f5d8519-8c35-52fb-03e1-a38c84d5c126.png)
このリモート監視ダッシュボードは、WebContainerという技術を用いてユーザインターフェイスの表示や、REST APIからのデータ取得などのフロントエンド処理を、ブラウザ上で行なっていることが特徴です。クラウド上でNode-REDのサーバを24時間立ち上げておく必要がなく、無料でオンデマンドにリモート監視ダッシュボードを利用できます。

- エッジ側のフロー
  まずRaspberry Pi上のNode-REDで、温湿度センサデータの値をクラウドへ転送するフローを作成しました。
  ![flows_raspberrypi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/538f093f-7311-ba95-94c8-f466b41a00ce.png)
  上のフローでは、定期的にGroveノード(node-red-contrib-grove-base-hatのgrove-light-sensor-v1_2ノード)で温湿度データを取得し、そのままデータをshiftr.ioへMQTTプロトコルで転送しています。

- ブラウザ上で動作するフロー
  次に、温湿度のデータをリモートから監視できるダッシュボードも作成しました。
  ![flows.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/4502453e-e611-bd7d-ad67-ccf1f716f8f7.png)
  こちらはhttp requestノードを用いて定期的にshiftr.ioのREST APIにアクセスして、転送した温湿度データを取得しています。その後、changeノードで温度と湿度のデータに分けてそれぞれ、chartノードで時系列グラフを表示しています。

- ブラウザ上で動作するダッシュボード
  パス`/uikit`を指定してページを開くと、温湿度データの時系列グラフがリアルタイムに表示されます。
  ![dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/2ee96e52-aa1e-07cb-6045-4f06a1a4510e.png)
　WebContainer上のダッシュボードがどんな感じで動くのか、興味のある方向けにデモページのボタンを用意しました。Google Chrome上で以下のボタンをクリックすると、ランダムデータを表示するリモート監視ダッシュボードが表示されます。
  [![](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/kazuhitoyokoi/node-red-ogiri-sapporo?embed=1&hideExplorer=1&hideNavigation=1&view=preview&initialpath=uikit)
  WebContainerは、GitHubリポジトリからフロー( https://github.com/kazuhitoyokoi/node-red-ogiri-sapporo/blob/main/flows.json )をダウンロードし、自動的に「npm install node-red」と「npm start」のコマンドを実行してくれます。WebAssemblyの技術を用いて、これをブラウザ上で行なってくれるのがWebContainerです。

　これで、外出中でもカイワレが置かれている場所の温度や湿度が分かるようになりました❗️
## LED照明の自動制御
カイワレ大根が夜も光合成を行えるよう、LED照明の自動制御も同じRaspberry Piで行いました。
- システム構成
  - Raspberry Piは、Grove Piの照度センサの値を定期的に取得
  - 明るいと判定した際にUSBライトの電源OFF、暗いと判断した際にUSBライトの電源をOFF
![system2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/5d26872f-9eb6-4de5-c770-18c29a2d9fec.png)
- USB電源の制御コマンド
  まずRaspberry PiでUSBのON/OFFを制御するために、uhubctlコマンドをインストールします。
  - uhubctlコマンドをインストール
    ```
    sudo apt-get update
    sudo apt-get install uhubctl
    ```
  電源のON/OFFは以下のコマンドで行います。-lオプションには、USBハブのIDを指定します。Raspberry Pi 4に内蔵されているUSBハブを指定する場合のIDは「1-1」です。-aオプションには、USBハブの電源をONにしたい時に0、OFFにしたい時は1を指定します。
  - USB電源ONコマンド
    ```
    sudo uhubctl -l 1-1 -a 1
    ```
  - USB電源OFFコマンド
    ```
    sudo uhubctl -l 1-1 -a 0
    ```
  - ターミナルから操作した時の様子
    Raspberry PiにSSHで入り、これらコマンドを実行してみた様子を撮影してみました。
    ![uhubctl_command.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/f7ee0416-7384-866c-21b6-4940071bc98b.gif)
    きちんとUSBライトのON/OFFの制御ができていますね。
- 照度に応じてUSB電源ON/OFFを操作するフロー
   次にuhubctlコマンドを用いたNode-REDのフローを作成しました。
  ![flows_raspberrypi1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/ebeabfba-02a9-62dd-8b01-9fa1e3eb6618.png)
  このフローでは、grove-temperature-humidity-sensor-sht3xノードを用いて、定期的に照度センサの値を取得しています。switchノードを用いての大小を比較し、値が小さい時に1(電源ON)のメッセージ、大きい時に0(電源OFF)のメッセージをchangeノードで生成するようにしています。今回はswitchノードの閾値を「300」としました。終端にあるexecノードは受け取った1または0のメッセージをもとに、uhubctlコマンドの-aオプションを指定して、USB電源のONとOFFを切り替えています。

- フロー実行時の様子
  テストとして部屋の照明をつけたり消したりしてみました。部屋の照明が消えている時はUSBライトがONになります。一方、照明をつけるとすぐUSBライトがOFF、再度照明を消すとUSBライトがONに変わります。
  ![controlled_by_node-red.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/403baf25-fbee-a89a-c3c5-d18a0abc3864.gif)
  もちろん、運用時は日が沈むとUSBライトが自動的に点灯し、日が昇ると消灯します🌅

# 成長の様子
カイワレ大根は、すくすく育ち、無事収穫できました🌱🍽️😋
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/7ebcb9e1-30cc-750d-da91-3050660bdfcd.jpeg" width="300px"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/53d98702-37cd-0d9c-be55-01139a8d45b2.jpeg" width="300px"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/bdde44aa-9d9a-0e83-1a76-6c5c181042ca.jpeg" width="300px"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/191d8546-d18f-6afb-52db-5f8e0ce9c8ce.jpeg" width="300px">

# 最後に
開発した後に思ったことは以下の2つです。
- リモート監視ダッシュボードは、カイワレ大根の置かれている状況確認より、エアコンの消し忘れ確認で便利❗️
- LEDは制御しなくても、24時間をつけておく方がカイワレ大根の成長が早いのでは❓🤔

というオチでした(笑)。ただ、今回の開発を通して、他のシステムにも応用できそうなWebContainerやUSBの電源制御の知見を得られたことは良かったです😊👍

### ※使用機材
- ハードウェア
  - Raspberry Pi 4 Model B (メモリ4GB)
  - Grove HAT
  - Grove 光センサ
  - Grove 温度湿度センサ (SHT31)
  - USBライト (ダイソーで購入)
- ソフトウェア
  - Node-RED
  - Groveノード (node-red-contrib-grove-base-hat)
  - [React Node-REDダッシュボード](https://qiita.com/kazuhitoyokoi/items/5c85304108798149f7ff)
- サービス
  - shiftr.io (MQTTやREST APIでデータを送受信できるMQTTブローカ)
  - WebContainer (Node.jsをブラウザ上で実行できるWebAssembly実装の環境)
- その他
  - カイワレ大根の種
  - 水耕栽培用の容器