<Gravioユースケース>テレワークあるある―オフィスの観葉植物の水やり、どうしていますか?―IoTを活用した「カシコイ自動灌水システム」をリーズナブルかつ最小限のシェルスクリプトを用いてGravioで実現しませんか?
この記事は1年以上前に書かれた内容です。
Gravioの機能・画面キャプチャーなどの情報が古い可能性があります。
最新情報は、Gravioオンラインマニュアルをご参考ください。
こんにちは、Gravio事業部のタルミです。
いよいよ暑くなってきましたね。緊急宣言解除に伴い、オフィス街に人が戻り始めて来ているのを感じられます。とはいえ、気を抜くことはできません。第二波のみならず、今後に備えて「働き方改革」はより積極的に実施していくべきではないのでしょうか?事実、この数ヶ月、色々な場面で「旧来」の仕組みに綻びが垣間見えた気がします。特に「省人化」「自動化」「簡素化」「情報のシェア」という面において、積極的にテクノロジーを利用していくケースが増えて来ていると感じていますし、どのような業種、業態であっても、必ずテクノロジーを活用して改善できるポイントがあるでしょう。また、目まぐるしく状況が変化する状況ですから、テクノロジーも「フレキシブル」で「高いアジリティ」を持っていないといけません。現場で対応できるレベルの「かんたんさ」が今後より求められるのではないでしょうか?
実は弊社、緊急事態宣言発令後のテレワーク率が95%を超えています(2020年6月時点)。捺印の電子化や経費精算方法の簡略化、各種センサーによる部門宛て郵便物の有無確認や社員健康管理システムの構築など、様々な業務支援や環境整備を各部署が自発的に行っており、今後も「リモートワーク」での勤務を継続していく方向です。ご存知かと思いますが、GoogleさんやFacebookさんも弊社同様、年末までリモートワークを行なう方針だそうですね。
さて、オフィスに行かない日々が続くと、「旧来」の仕組みではうまく行かないケースが日々発生します。以前ブログでご紹介したスマートTVの電源制御などもそうですが、人に頼っていた作業を「自動化」できるところから変えていく、というのはその第一歩です。「IoTのワークフロー連携」という言葉を最近見かけますが、センサーのデータをただ監視するだけではなく、収集したデータを基に、関係者が直接行動に移せる「有益な情報」を自動的に通知したり、更には人が行なっていた「行動」や「対処」をテクノロジーを使って自動化する、というものです。
このように書くとオオゴトですが、「実は困っていることがあり、どうにかならない?」と社内で相談を受けたケースを基に今回は実装方法をご紹介します。
オフィスの観葉植物の水やりをする人がいない!
そうです。みんなテレワークに移行してしまって、会社に来る人が激減しているのです。しかも、セキュリティーの関係から、観葉植物をメンテナンスしてくださる業者さんも入室できない状況。これは「グリーン」を重視する弊社にとっては一大事なんですww
※ASTERIA GreenActivity
そこで、農業や緑化の世界では一般的な「自動灌水」をオフィスで実現することにします。
まずはいつものごとく情報収集。
いろんな灌水用パーツがあって、プログラムを作成してあげれば対応できそうなセンサーやリレーキット、電子タイマーによる自動散水機などは市場に豊富に存在します(お好きな方はぜひどうぞ)。しかし、誰もが作れるものではありませんし、自動散水機はほとんど屋外用なので、どちらも使いにくそうです。オフィス内なので、水栓がそばにあるわけではありませんから。工事もできれば避けたい。
プログラムは書きたくない+ハンダゴテは使いたくない+ドリルで穴とかも開けたくない=「アリもの」で作れたら楽じゃないですか?
そこで、Gravioと、Amazon Primeで購入できる「既製品」をうまく使って、Gravio流の「自動水やりシステム」を作ってみましょう。
用意するもの
- Gravio一式
- Gravio開閉センサー(Basic以上で無償レンタル)
- Gravioクライメートセンサー(湿度検知用、Basic以上で無償レンタル)
- Gravioが動作するPC(Win10 / Mac / Raspberry Pi4 / Gravio Hub)
- インターネット/無線LAN環境(スマートプラグの制御、Slackなどへの通知に必要)
以下Amazonで購入
- スマートプラグ(WiFi経由でAC電源の ON/OFF ができるもの。今回はTP Link社HS105を利用)
2000円程度 - USB電源アダプター( 5V、2A対応)
1000円程度 - USB給電型水中ポンプ
1500円程度 - 灌水ホースキット
1500円程度 - 大型貯水タンク(20L 前後)
1500円程度
家にあるもの、もしくは100円ショップなどで
- プラスチックの蝶番みたいなもの
100円ショップなど - 発泡スチロール・接着剤・両面テープ
オフィスや自宅にあるものを利用
仕組み
貯水タンクに灌水用の水を入れておき、Gravioのタイマー機能、および湿度センサーの情報を基に、水やりのタイミングになったら自動的にスマートプラグ経由で通電し、水中ポンプを動作させ配水する。
あわせて、貯水タンクの水残量が確認できるしくみを開閉センサーを用いて作成し、残量に合わせて関係者に通知(誰かがオフィスに来るタイミングに合わせて水を補充してもらう)。
Gravioを使うメリット
単純なタイマーによるスケジュール型の灌水に加え、温度や湿度条件にあわせて追加灌水の調整を行えること。
また、完了報告や水残量警告などをSlackやLINEに通知ができること。
また、これらをプログラミング知識や電子工作の知識を必要とせずに実現できること。
セットアップの順番
- 水中ポンプと灌水用のホースキットをつなぐ
- Gravioで温湿度センサーの設定を行なう
- Gravioで開閉センサーの設定を行なう
- Gravioとスマートプラグをネットワーク上で接続する
- Gravioでスマートプラグの通電アクションを設計する
- Gravioで通知(SlackもしくはLINE)アクションを設計する
- 各種トリガーを設定していく
(スケジュール通電、湿度情報による通電、水不足の通知)
以上が大まかな流れとなります。
では、早速作って行きましょう。
1. 水中ポンプと灌水用のホースキットをつなぐ
水中ポンプのラインナップは豊富です。
今回はさほど水量が必要ないので、小さくて安価なものを選定しました。USB給電タイプです。
もちろん大量の水を配水したい場合は大きな AC100V で動作する強力なポンプを選んでいただければ良いでしょう。
また、灌水ホースも安価なものをAmazon Primeで探せましたので、こちらを使います。
キモになるのは、ポンプの吐水口径と、ホースの内径です。ここがしっかり嵌合しないと、水が汲み出せません。
サイズを良くみながら購入してください。
園芸用の灌水キットの取り扱い説明書などを参考にしながら、ホースを接続していってください。
今回は運良く「ぴったりサイズ」部材だったので、奥までガッチリ差し込むだけです。ホースはお湯で柔らかくなるので、温めたあと伸ばして被せるようにしても良いでしょう。
ここで、水がキチンと配水できるか、通電して確かめておきましょう。
USBケーブルをアダプターに挿せば、モーターが動き始め、ポンプが作動するはずです。
それぞれの観葉植物にはホースと散水ノズルが接続されています。屋内なので、派手な散水より滴下のような感じが良いですね。この製品はノズルの先端を回すと、停止→滴下→ミスト→開放のような感じで水の撒き方を変えることができます。
弊社ではこんな感じの調整をしています。いい感じですね。ポンプの性能にもよりますが、10鉢以下であれば、滴下なら問題なさそうです。
2. Gravio 温湿度センサーの接続
接続に関しては過去ブログをご参照ください。今回は湿度情報を利用します。
湿度情報がGravio Studio上で拾えていれば、問題ありません。
3. Gravio 開閉センサーの接続
開閉センサーのセットアップも同じくペアリングを行ないます。で、今回はこのようなものを作っています。(といっても、超強力接着剤と両面テープで貼るだけですw)
水がいっぱい入っているとセンサーは開情報、水がなくなると浮力がなくなるためフラップが下に向き、センサーと近づくことで閉情報を発出します。この情報が「水がなくなった」合図になるわけです。
ちなみにこのピンクのフタみたいなものは100円ショップで買ってきたもの、磁石は手元にあったネオジム磁石を使っています。
もちろん開閉センサーについている純正磁石でも動作します。
開閉センサーを使った残水量検知も2同様にGravio Studioでデータがキチンと来ているか確認しておきましょう。
4. スマートプラグ接続における考え方
Gravioからスマートプラグを制御するのは、大きく分けて3つの方法があります。
A:ZigbeeでダイレクトにGravioHubから制御(弊社Gravioライトと同様の制御)
B:オフィス内の無線(WiFi)を利用し、APIを使って制御(SONY Bravia制御と同様)
C:Webhook-IFTTTを使い、外部サービス経由で電源制御
実はAが一番簡単なのですが、対応しているスマートプラグが残念ながら日本で提供されておりません(Aqara Smart Plugという製品が弊社推奨ですが、国内での取扱いがございません)。
そこで、BもしくはCになります。
データ通信の経路という観点から行くと、今回はオフィス内で制御できればいいわけですから、別にクラウドにつなぐ必要はありません。要はGravio HubからローカルWiFiを使って直接スマートプラグを動作させれば事足ります。エッジで処理しているので、タイムラグもほぼありません。Cのやり方はクラウド経由になります。ちなみに同様の処理をしているケースとして、GravioからWebhookを使ってIFTTTに連携する記事などがWeb上にあがっていますので、こちらの方法がお好きな方は参考にしてみてください。
エッジコンピューティングの説明にもなるのですが、今回のような「同じエリアにあるセンサー」を基に「同じエリアにあるもの」の制御を行なう場合、一般的に同じエリア(同一エッジエリア)で実装したほうが安定性は高く、タイムラグもなく、通信コストも掛からないというメリットがあります。まさしくエッジのメリットですね。したがって、今回はBを主に考えます。
とはいえ、この「スマートプラグのローカル内制御」が今回一番むずかしいところです。理由としては、
ローカルのIPアドレスで制御できるAPIを公開しているスマートプラグがほとんど存在しない
ということが上げられます。今回は、有志の方が市場でも人気のTP Link社のスマートプラグ製品における制御コマンドをGitHub上で公開してくださっているので、そちらを使います。
ちなみに、CのIFTTTを使う方法であれば、APIを意識することなく使えますので、このあたりはネットワークをどう組みたいか、スキル的にカバーできるか、など考えながら最適な方法をご検討ください。
今回、TP Link社のスマートプラグをエッジ内で動作させるために、シェルスクリプトとnodeを用います。また、スマートプラグ制御専用のソフトをインストールする必要があります。
ちなみに、ソフトはこちらで提供されています。
読んでいただくと、nodeのインストールも必要ということがわかるので、そちらも導入しておきます。
nodeが利用できて、上記のアプリケーション(含むapi)がインストールされていれば、下記のスクリプトがターミナルからCUIで実行できるようになっているはずです。
電源OFF
tplink-smarthome-api sendCommand 192.168.XXX.XXX:9999'{"system":{"set_relay_state":{"state":0}}}'
電源ON
tplink-smarthome-api sendCommand 192.168.XXX.XXX:9999'{"system":{"set_relay_state":{"state":1}}}'
※なお、IPアドレスはスマートプラグに割り当てられたものを利用してください。
上記の tplink-smarthome-api と node を導入したあと、作成したこれらのスクリプトが動作するか、ターミナルを使って動かしておきましょう。
キチンと動作することが確認できたら、あとはシェルスクリプト形式にして保存します。
<tplinkon.sh> <tplinkoff.sh>などの名前をつけておくとわかりやすいですね。
こんな感じになるかと思います。
<例:tplinkon.sh> :電源ON用シェルスクリプト
#!/bin/bash
tplink-smarthome-apisendCommand your.local.IP.address:9999 '{"system":{"set_relay_state":{"state":1}}}'
作成したシェルスクリプトをあとはGravio上で走らせればOKですので、Gravioで電源操作のシェルを動作させるためのアクションを作成していきます。この場合、使うのはRunScriptアクションですね。
設定時に注意となりますが、TVの電源管理ブログでも説明いたしました「シェルスクリプトに実行権限の設定実施」をお忘れなく。
Gravio側からスクリプトを叩くので権限の設定が必要ですね。
また、今回はnodeにもパスを通して置く必要があります。
先程作成した<tplinkon.sh>や<tplinkoff.sh>にnodeのパスを記載して上書き保存しましょう。
最終的に作らないといけないシェルスクリプトはこうなります。
#!/bin/bash
/usr/local/bin/node /usr/local/bin/tplink-smarthome-api sendCommand 192.168.XXX.XXX:9999 '{"system":{"set_relay_state":{"state":1}}}'
スクリプトに名前をつけて(例:gravio_poweron.sh)、RunScriptアクションでアップロードしましょう。
前回同様、Gravio上で新しくアップロードした.shファイルには sudo chmod +x をしておいてくださいね。
最後に、いつもの▶ボタンを押してGravio上で試してみましょう。
▶ボタンでスマートプラグの電源On、もしくはOffができれば完了です。
スマートプラグにはUSB電源アダプターをセットし、そこにポンプのUSB電源ケーブルを差し込みましょう。
差し込めば、スマートプラグの動作と連動してポンプが動作します。
5. スマートプラグの通電スケジュール設計
どんなタイミングでポンプを動かせばいいか?
これは管理する植物や置かれている空間などによって変わってくると思いますが、ある程度の要望にお答えできる「自由度」が高いのがGravioの特長です。
今回、基本設定として、毎日朝9時にポンプを180秒駆動する「タイマー型」の灌水スケジュールを基本としますが、これだけでは面白くありませんよね。
タイマー型の灌水スケジュール用のポンプ動作は簡単です。
- RunScriptでパワーオン
- Sleepで3分(180000ms)
- Runscriptでパワーオフ
こんな感じのアクションを作り、あとはタイマートリガーで定時動作させればOKです。
次は、定時灌水システムでは絶対できない過去の情報を基にした制御を入れてみましょう。
今回は、
同じ日の15時30分に、その日の「朝9時30分〜15時30分(6時間前)」の、植物が置かれている空間の「湿度データ」を遡って確認し、もし湿度が45%を下回っているデータが一つでもあったら、15時30分に追加で120秒の給水を行なう、
という仕組みを設計してみました。
水やりが足りない、もしくは、空気が乾いている、という場合を想定してみたわけです。
このような「過去のデータを遡って確認を行なう」場合に最適なのがSensorDataDBというアクションです。
投薬(飲み忘れ防止)の記事でもご紹介しましたね。こちらを使って処理します。
さっそくSensorDataDBの設定を行なってみましょう。
遡って確認したいデータの種類と期間をここで設定します。
15時30分から6時間前まで遡るようにすればいいですね。
注意事項としては、湿度データに対して「フィルター」を後でかけますので、小数点を含む数値として湿度を取り扱う必要があります。ところが、
Gravioの初期設定は湿度を文字列として扱う設定になっています(String)ので、ここを(Double)に変更しておくことです。
次は、抽出したデータをフィルタリングします。使うアクションは先程ご紹介した“Filter”です。
ただし、今のままではFilterにStep1で抽出した「データ」が入力されていません。
ですので、下記の作業を行ないます。
これで、“Filter”アクションのステップ出力にデータがマッピングされました。
ステップ出力の Data=sin.Data のところが、水色(Double)になっているのを確認しましょう。そして、フィルター条件を入れておきます。
今回は、sin.Data < 45 と入れました。
これで、このアクションを実行した時点から過去6時間のデータを遡り、湿度が45%未満になったデータはあるのか、ないのか、というフィルターをかけたことになります。
このフィルターアクションは、データがなければその後のアクションがエラーになり、もしデータがあれば次のアクションを実行する、という仕組みになっています。
今回の場合にあてはめますと、湿度45%未満を過去6時間以内に記録していれば、水やりしたのに、植物周辺の空気は引き続き乾いているから、水を追加で撒く、というアクションとなります。逆に湿度45%未満にならなかった場合は、そこまで乾燥しているわけではないので、追加の水やりアクションは起こさない、ということです。
ちなみに、鉢カバーの植物がある程度密集しているエリアに湿度を拾えるGravioクライメートセンサーを取り付けてあります。
次に、フィルター条件に合致した場合に行なうアクションを作ります。
45%未満の湿度がフィルターの結果見つかった場合に行なうアクションですね。
先程作成したフィルターアクションのアイコンをダブルクリックしてみましょう。
すると、新しくアクションが設定できるようになるはずです。
そして、タイマー灌水と同じ仕組みで、
- スマートプラグをON
- 今回は2分Sleep
- スマートプラグをOFFする
アクションを設定すればいいですね。
フィルター連動のアクションを作り終えたら、ダブルクリックする前の元の画面に戻りましょう。画面左上部の親アクションをクリックすれば下記の画面に戻ります。
フィルターの中に子アクションが入っているのが確認できます。
この仕組みをうまく使って頂ければ、直近◯時間に室温が◯◯℃を超えているデータが見つかったら給水を行なう、なども可能ですね。
もちろん、室温や湿度が◯℃、◯%になったら即給水を行なう、という仕組みであれば単純にトリガー設定だけで可能です。
今回はエッジ内のDBデータにフィルターをかける、というのがポイントです。
これによって、定時給水と、湿度低下時の追加給水のアクションが設計できました。
それぞれ別のアクションとして保存しておきましょう。
6. 通知アクションを先程作成したRunscriptアクションに“追加”する
5. で作成したアクションの最後に、LINEもしくはSlackのアクションを追加する形でOKですね。それぞれのメッセージは変更しましょう。
たとえば
定時給水を行なうアクション実行通知
- Runscript で電源ON
- Sleep で180秒
- Runscript で電源OFF
- Slack や LINEで「定時水やり完了しました」
追加給水を行なうアクション実行の通知
- SensorDataDBで過去データ抜き出し
- Filterで45%以下のデータを抜き出し
- データがあればRunscriptで電源ON
- Sleep で120秒
- Runscriptで電源OFF
- SlackやLINEで「追加水やり完了しました」
開閉センサーによる水位情報を伝えるアクション
Slack/LINEで「水が減っていますので補給してください」
こちらのアクションは開閉(水面検知)センサーが発報したらすぐに動作するアクションですので、特にDBを見る必要はありませんね。
単純にトリガーを設定すれば良いだけです(トリガーの設定は次章で説明)。
定時水やりが成功すると、弊社の場合はこのような形でSlackにメッセージが流れます。
同様に、水が足りなくなったりしたとき、追加水やりが自動で発動したときもメッセージが届きます。
7. トリガーの確認
定時給水・追加給水はタイマートリガーを利用します。
すでに定時給水用のタイマートリガーは設定済みなので、追加給水用のタイマートリガーを忘れずにつくっておきましょう。
アクションとして追加給水(フィルター使っているアクションですね)を選び、開始日時を15時30分、毎日繰り返し、です。
あわせて、水残量チェックは、開閉センサーをトリガーとして利用しますので、こちらも設定しておきましょう。
今回は「閉」状態=水残量が少ない状態ですね。
以上で、インテリジェントな灌水(水やり)システムを構築することができました。
さいごに
タンクの設置位置にはご注意ください。
高低差があると(タンクを高いところに設置する)、ポンプが作動していなくても、サイフォンの原理で水が流れます。タンクは床面に設置して頂くのが良いでしょう。ポンプの仕様書に「高低差」が記載されているはずです。その高さまでなら水を持ち上げられますので、ポンプを購入する際には吐出力をチェックしましょう。
今回は「スマートプラグ」の制御ですので、様々な電源ON/OFFで動作させるような場合でお使いいただけます。シーソー型のメカニカルスイッチを採用している廉価版の加湿器や、サーキュレーターなどの制御にも良いでしょう。センサー情報も今回は湿度を軸に検討しましたが、明るさセンサー(社外品、OMRON社様製品に対応しています)などを使えば、日射(明るさ)などの情報と連動させることもできますね。Gravioで無償貸出可能なワイヤレスボタンと連動させれば、人によるオペレーションの簡素化にも転用可能です。ボタンを押せば、設定した条件に基づいて自動給水開始、となります。
ぜひ、Gravioを用いて、新しい生活様式に役立つ「自動化・省力化」にチャレンジしてみてください。