SORACOM UG 信州を通じてWebエンジニアが農業と関わってます!
こんにちは! SORACOM Advent Calendar 2018 9日目 担当のchinoppyこと知野です。
Webエンジニアが、SORACOM UG 信州を通じて、農業と関わり、そこでSORACOMを使用してシステム構築等おこなったお話しです。
本業もあり、動ける範囲での構築だったので、エラー処理などちょっと怪しいところもありますが、、、便利なサービス/機能/ライブラリなどを使ってなるべく「つくらない」こともとりいれながらやってみましたので、そのあたりで使用したものなども紹介していきたいと思います!(だいたいはみんな知っているものばかりかもしれませんが、、、)
なお、この内容は SORACOM UG 信州 #5 、 SORACOM UG 農業活用コミュニティ #1 で私が発表したものをあわせたような内容になってます!
【目次】
きっかけ
今年3月に開催された SORACOM UG 信州 #3 に参加し、懇親会も参加してくださった農業従事者の浦野さんから
- 農業仲間からハウス内の環境データ収集をしたい!
- できればスマホで遠隔監視もしたい
と要望をうけ、
- センサ/ハード側(以降、IoTボックスと記載)はできる
- でもクラウド側/Webの知識がなくどうやっていけばよいかわからない
とお話しがあり、私も含め、クラウド/Web側の知識はあるので、SORACOM UG 信州のひとつの企画としてサポートしていこうと決定しました!
私の担当は
- ハード側の制御プログラム(一部)
- クラウド/Web側
ですので、このあたりを中心に書いていきます!
IoTボックス
浦野さんが作成したIoTボックスのこと
仕様等
- 3G対応データ通信端末 AK-020を使用
- もちろんSIMは「SORACOM Air」
- Raspberry Pi 3 Model Bを使用
- 収集データ
- 気温(2地点)
- 湿度
- 地温
- 葉音
- 日射量
- 土壌水分(pF)
制御プログラム
- 言語:Python3
- 主な処理(★が私が担当分)
送信処理について
Pythonのライブラリの「requests」を使用して、SORACOM Funnel経由で、AWS IoTへ送信してます。
db_manager = SqliteDbManager() with db_manager.transaction() as session_pq: # 再送信データを取得 send_data_obj = SendData() send_data_list = send_data_obj.get_retry_data(session_pq) send_data_list.append(payload_str) for d in send_data_list: try: res = requests.post('http://funnel.soracom.io', data=d, headers=headers, timeout=5) res.raise_for_status() except Exception as e: # 未送信データを保存 entry = SendData(payload=d) session_pq.add(entry)
これを直接、AWS IoTへ送信するとなると、
- 証明書をラズパイに置かないといけない
- AWS IoT Device SDK for Pythonがあるが、もっと処理が複雑になってしまう
ことなどあり、SORACOM Airを使用することにより、requests一発で送信できるのは本当に便利!
Tips
最初、Funnelに送信すると以下のエラーが発生
Response:400 message:Failed to get credentials for OP0063709878, aws-iot"
全然、わからず寝る前にソラコム・サポートへ問い合わせ(リクエストを送信)。
次の日に丁寧な返信があり、無事解決(TT)
SIMグループにSORACOM Beamの設定もあったことが原因だったもよう。最初はSORACOM Beamを使用しようと思ったけど、途中でSORACOM Funnelにかえたので、設定が残っていた。。。
新しくSIMグループを作成、そこでSORACOM Funnelを設定。無事、送信できました!
迅速なご対応ありがとうございました!(TT)
クラウド(IoTボックス→データ保存のあたり)
こんな構成になってます
SORACOM
SORACOM FunnleとSORACOM Gateの「Public Gate機能」を使用してます。
SORACOM Funnel
AWS IoTへ送信してます
Public Gate機能
Mitsuyoshi Okiさんに教えていただいた便利機能です!
メンテンナス時に、この機能を利用して、自宅→ハウスのRaspberry Piに接続してメンテナンス等しています
SORACOMが用意しているVPGを利用して、デバイス間通信が可能です
ただし、Public Gate は他のSORACOMユーザと VPG を共用するモデルになっていて、他のユーザの所有する SORACOM Air SIM からもお客様のデバイスに対する通信が可能となるため、デバイスへの意図しないアクセスを防ぐためにセキュリティ対策を十分に行ってください。(こちらのデバイスのセキュリティ対策から抜粋)
こんな感じで
- 接続したいSIM同士を同じグループにする
- SORACOM Air for Cellular設定で「ON」にする
- SIM詳細のIPアドレスに接続!
もし、接続できない場合は、セッションの切断してみましょう。
★ご注意
- 指定の料金が発生しますので、使用するとき以外はOFFにしておくことをおすすめします(VPG料金表 参照)
- OFFにした後も、セッションの切断をしておいたほうがよいそうです(セッションが残っていると課金となってしまっている場合がある)
AWS
AWS IoT、DynamoDB
AWS IoTのルールを使用して、DynamoDBへ送信データを書き込んでいます
これもノンプログラミングで書き込みできて便利!
CloudWatch、Lambda、S3
毎朝9時にLambdaを実行して、DynamoDBへ書き込んだデータを前日1日分ずつファイルに出力し保存(バックアップ)するようにしてます
クラウド/Web(AWS⇔Webあたり)
構成はこんな感じ
AWS
API Gateway
API Gateway、LambdaでDynamoDBからデータを取得できるようにしました
ちなみに
AWS側の構築では、「serverless framework」を使用してます
AWSコンソールからいちいち、ポチポチサービスの設定などする必要がなく、便利ですね
- 毎日9時(JST)にLambdaを実行
functions: output_dynamodb_to_s3: handler: handler.output_dynamodb_to_s3 description: DynamoDB to S3 events: - schedule: cron(0 0 ? * * *)
- S3、DynamoDBあたりの設定
resources: Resources: [Name]: Type: AWS::S3::Bucket Properties: BucketName: [バケット名] [Name]: Type: AWS::DynamoDB::Table Properties: TableName: [テーブル名] AttributeDefinitions: - AttributeName: imsi AttributeType: S - AttributeName: timestamp AttributeType: N KeySchema: - AttributeName: imsi KeyType: HASH - AttributeName: timestamp KeyType: RANGE ProvisionedThroughput: ReadCapacityUnits: 3 WriteCapacityUnits: 3
Web
herokuにdjangoをデプロイして、IoTボックスから取得したデータを表示するようにしました
herokuもいちいちサーバ構築せず、Webページを公開できて便利!
画面構成
CSVダウンロードもできますw
グラフ部分
Chart.jsを使ってます
表示させるデータをリストにして、渡すだけで、きれいなグラフを描けて便利!
項目の定義と「data」に表示したいデータのリストを指定
var ctx = document.getElementById("id-chart").getContext('2d'); var chart = new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [ { label: '温度1', data: dataTemp1, backgroundColor: 'rgba(0, 0, 0, 0)', borderColor: 'rgba(255, 99, 132, 1)', borderWidth: 1 }, { label: '湿度', data: dataHumi, backgroundColor: 'rgba(0, 0, 0, 0)', borderColor: 'rgba(2, 99, 132, 1)', borderWidth: 1 }, { ・・・
絞り込みの表示などもデフォルトでできるので、うれしい!上の項目をクリックすることにより選択可能(これは、浦野さんに言われて気がつきましたw)
表部分
Data Tables for jQueryを使用してます。
これも、Chart.jsのように項目を定義して表示するデータを渡せば、表ができて便利!
検索、ソート機能、ページングがデフォルトでついている!
コスト
今のところ、600円/月〜800円/月程度
- 内訳
今後
SORACOM UG
この企画のことも含め今年でた課題などまた話しあっていきながら、本業もあるので、私のできる範囲で今後もゆる〜く関わっていきたいと思いますw
使いたい、試したい、活用したいSORACOMのサービス
SORACOM Beam
まだ、SORACOMを使ってのAWS Shadowを使ったことないので試したいと思っています。。。
SORACOM Inventory
こちらもAWS IoTでのデバイス管理(Just In Timeなど)は多少触ったことがあるので、SORACOMを使った場合、どのようになるか興味があります。
SORACOM Lagoon
今回、構築したようなシステムを簡単に構築できるSORACOM Lagoonというサービスもあるので、すぐ可視化したい、プロトタイピングのときや、すぐユーザにみせたいときなど、最適なサービスもあるので、活用したいです!
最後に
正直、今年のはじめにここまで関わるとは思っていませんでした(^^;
この企画等、紹介できなかったことがたくさんあり、そしてたくさんのひとが関わっています。今、振り返ってみると、誰一人かけても実現していなかったんだなぁっと、すごく感じています。
このような、それぞれの得意分野でお互い補いながらできたことが、とてもうれしいですね。
本当に、SORACOM UG等を通じて、私に関わっていただいた方々に本当に感謝感謝です(TT)
来年もよろしくお願いします!
それでは、明日の zoe6120 さんにバトンタッチです!