クラウドジョウロ その2

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、おてらです。

 

前回の記事でがせさんがAWS側のお話を丸投げしちゃったので僕の方でまとめます(´・ω・`)

とはいえ、僕も先人の知恵を丸パクリ借りて作っただけなのであまりオリジナリティはありません><;

AWS側概要

構成図

構成図はざっくりとこのようになっています。(クリックで拡大)

クラウドジョウロ構成図

 

何だかAWSサービス使いまくっちゃってますね。

 

ラズパイからデータを取得してAWSへ転送する

ラズパイの基盤はがせさんが組んでくれたので僕はラズパイに植木鉢の土壌水分量の値を取得してそれをAWSへ転送するスクリプトを導入しました。

丸パクリ参考にさせて頂いた記事はこちら↓

IoTを使って畑を監視する

 

こちらの記事では土壌水分センサーだけでなく、デジタル光センサー、温度・湿度センサーも使っています。

値を取得するスクリプト内にはそれぞれのセンサー毎の値の取得関数が書かれているので、土壌水分量だけが必要な我々は他の記述はカットして使わせて頂きました。

元となるソースコードはこちらで公開されています。

水分量のグラフ化

水分量をいつでもどこでも見られるようにすべく、Webから確認できるようにEC2でWebサーバを立てました。

水分量をグラフ化してWebサーバ上で見られるようにしたのはまた別の担当になるのでここでは割愛します!

 

 

水分量が閾値を下回ると自動で水をやってくれるようにしたい

ここからが若干オリジナリティの出てくる部分になりますw

 

やりたいことは、植木鉢が乾いたらラズパイに取り付けられたジョウロが自動的に水をやるようにすることです。

 

そのためにまずCloud Watchからアラートを発砲させる仕組みを作ります。

 

DynamoDBのStreamを使ってLambda経由でCloud Watchにデータを送り、Cloud Watchに水分量を監視するメトリクスを作成します。

Lambdaに登録するpythonのスクリプトはサンプルソースの lambda_function.py です。

あっここもパクリオリジナリティ出てませんでしたね(⌒-⌒;)

 

これでClowd Watchのダッシュボードに「pi-farm」のメトリクスが追加されるのでこれを見てみると、水分量のグラフが表示されます。

 

Cloud Watchはアラートを作ることができ、アラートの通知先はメールかAmazon SNSが選択できます。

メールだと結局受け取る自分たちがそれをトリガーに行動しなくてはならないので自動化ではありません。

なので通知先をAmazon SNSにするため、Amazon SNSでポリシーを作成します。

 

Amazon SNSとHTTPリクエストを受け取るスクリプトの用意

Amazon SNSで通知を出してジョウロの稼動を自動化させるために、水分量をリアルタイムで確認できるWebサーバ上にPHPのPOSTリクエストを送り、そのPOSTリクエストをトリガーに、ラズパイ側のモーターを動かすスクリプトをキックする仕組みを考えました。

 

まずはAmazon SNSの設定。

 

HTTPのPOSTリクエストを利用するためにはサブスクリプションを行う必要があります。

具体的には、Amazon SNS上でトピックを作成し、それをサブスクリプションするユーザに確認を貰う必要があります。

メール通知の場合は宛先のメールアドレス宛に確認のURLが書かれていてそれにアクセスするだけなので簡単ですが、HTTP(S)の場合は少々面倒です。

 

HTTP通知の場合はイベント発生時にPOSTリクエストが発行されます。中身はJSONになっていてこれをWebサーバで受け取り処理をします。

 

Amazon SNSでトピックを作成後、サブスクリプションを作成する際に、HTTPを選択し、実際にPOSTリクエストを受け取るURLを指定します。

なので、ここでPOSTリクエストを受け取るWebアプリケーションを準備しておく必要があります。

ここはとりあえずPOSTリクエストを受けてログに書き出すだけのPHPスクリプトをお借りして試してみます。

このスクリプトは水分量をWeb上から見られるようにしたEC2のサーバに設置しました。

<?php
$json = file_get_contents("php://input");
error_log ($json);

?>

PHPを用意した後、サブスクリプションを実行すると早速Apacheのエラーログに登録用のURLが出力されるのでアクセスします。

これで準備は完了です。

あとはPOSTリクエストを受け取るURLに、通知された時にラズパイ側のスクリプトをキックするスクリプトを用意しておけばOKです。ちょっと手間ですが。

 

CloudWatchの設定

ここまできたらCloudWatchのアラームの通知先を設定します。

下記の画像におけるアラームのプレビューでは実際に取得できた値(青線)の表示がありませんが、とりあえず水分量が50%を下回ったらアラームを発砲するように設定します。

通知先の「pi_farm_notice」がAmazon SNSです。

2016-06-07_10h01_16

実際に通知されるかどうかは強制的にアラームを発砲させればよいので、センサーを植木鉢から引っこ抜き、50%未満の値を取得させます。

これでEC2側のアクセスログに、Amazon SNSからのPOSTリクエストが通知されれば成功です。

 

 

ひとまずここまでで以下の流れは出来るようになりました。

  1. センサーから水分量の値を取得する
  2. 取得したデータをAWS上に転送する
  3. 取得したデータをグラフ化する(別担当者)
  4. 水分量が減ってくるとアラームを発砲
  5. アラームを受け取り自動で水をやる

水をやる部分は単純にラズパイに取り付けたモーターが動作して、ジョウロが自動的にウィンウィン動いて水がジャーっと出てくるだけですがw

 

終わりに

今回は先人の知恵をフル活用させていただいて何とか形にすることが出来ました。

一部、Amazon SNSの部分など自分の力で四苦八苦しながら自動化できたときは少しばかり達成感がありました。

 

ラズパイ以外の部分は全てAWSで完結できました。このIoTデバイスやプログラムを作る上で右も左もあまり分かってない中AWSの様々なサービスに触れましたが、柔軟性が非常に高く、「こういうことがやりたいな~」と思ったことは比較的なんでも実現出来るような気がします。

 

今後もチームのみんなでAWSを使ったIoTデバイスを生み出していきたいです!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す