ChinoDuino(Chino × Arduino)

自発性のないプログラマーがArduinoと出会って悪戦苦闘する様を綴っていく⇒今はいろいろ(^^;

SORACOM UG 信州を通じてWebエンジニアが農業と関わってます!

こんにちは! SORACOM Advent Calendar 2018 9日目 担当のchinoppyこと知野です。

Webエンジニアが、SORACOM UG 信州を通じて、農業と関わり、そこでSORACOMを使用してシステム構築等おこなったお話しです。

本業もあり、動ける範囲での構築だったので、エラー処理などちょっと怪しいところもありますが、、、便利なサービス/機能/ライブラリなどを使ってなるべく「つくらない」こともとりいれながらやってみましたので、そのあたりで使用したものなども紹介していきたいと思います!(だいたいはみんな知っているものばかりかもしれませんが、、、)

なお、この内容は SORACOM UG 信州 #5SORACOM 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
  • 主な処理(★が私が担当分)
    • 各センサのデータ収集
    • 10秒ごとに取得したデータをLCDに表示
    • 毎正時10分ごと取得したデータをクラウドへ送信(★)
    • 送信できなかった場合は、次回の送信時に再送信(★)
    • 1時間毎に再起動(※ここはちょっと頻度が多いので伸ばす予定・・・)(★)
送信処理について

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ボックス→データ保存のあたり)

こんな構成になってます

f:id:chinoppy:20190123233346p:plain

SORACOM

SORACOM FunnleとSORACOM Gateの「Public Gate機能」を使用してます。

SORACOM Funnel

AWS IoTへ送信してます

f:id:chinoppy:20181209161726p:plain
SORACOM Funnle

Public Gate機能

Mitsuyoshi Okiさんに教えていただいた便利機能です!

メンテンナス時に、この機能を利用して、自宅→ハウスのRaspberry Piに接続してメンテナンス等しています

SORACOMが用意しているVPGを利用して、デバイス間通信が可能です

ただし、Public Gate は他のSORACOMユーザと VPG を共用するモデルになっていて、他のユーザの所有する SORACOM Air SIM からもお客様のデバイスに対する通信が可能となるため、デバイスへの意図しないアクセスを防ぐためにセキュリティ対策を十分に行ってください。(こちらのデバイスのセキュリティ対策から抜粋)

こんな感じで

  • 接続したいSIM同士を同じグループにする

f:id:chinoppy:20181209163222p:plain
SIM管理

  • SORACOM Air for Cellular設定で「ON」にする

f:id:chinoppy:20190123231623p:plain

f:id:chinoppy:20181209163522p:plain
SIM詳細

もし、接続できない場合は、セッションの切断してみましょう。

★ご注意

  • 指定の料金が発生しますので、使用するとき以外はOFFにしておくことをおすすめします(VPG料金表 参照)
  • OFFにした後も、セッションの切断をしておいたほうがよいそうです(セッションが残っていると課金となってしまっている場合がある)

AWS

AWS IoT、DynamoDB

AWS IoTのルールを使用して、DynamoDBへ送信データを書き込んでいます

これもノンプログラミングで書き込みできて便利!

CloudWatch、Lambda、S3

毎朝9時にLambdaを実行して、DynamoDBへ書き込んだデータを前日1日分ずつファイルに出力し保存(バックアップ)するようにしてます

クラウド/Web(AWS⇔Webあたり)

構成はこんな感じ

f:id:chinoppy:20181209165945p:plain
クラウド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

herokudjangoをデプロイして、IoTボックスから取得したデータを表示するようにしました

herokuもいちいちサーバ構築せず、Webページを公開できて便利!

画面構成

f:id:chinoppy:20181209172034p:plain
グラフ・表

CSVダウンロードもできますw

f:id:chinoppy:20181209172201p:plain
CSVダウンロード

グラフ部分

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)

f:id:chinoppy:20181209173543p:plain
絞り込み

表部分

Data Tables for jQueryを使用してます。

これも、Chart.jsのように項目を定義して表示するデータを渡せば、表ができて便利!

検索、ソート機能、ページングがデフォルトでついている!

コスト

今のところ、600円/月〜800円/月程度

  • 内訳
    • Air SIM(基本料金)
      • SIM2枚(ハウス用、VPG用)=600円
    • Air SIM(データ通信帳)
      • 350KB/日 × 30日 = 10,500KB = 2円くらいw
    • Funnelは無料利用枠内、タダ!(毎正時10分ごと)
      • 6回/時 × 24時間 × 30日 = 4,320リクエス
    • PrivateGarden
      • たまに使用
    • AWS
      • 12ヶ月無料期間中(終了したとしても数十円程度くらい)
    • Heroku
      • 無料枠内のためタダ

今後

SORACOM UG

この企画のことも含め今年でた課題などまた話しあっていきながら、本業もあるので、私のできる範囲で今後もゆる〜く関わっていきたいと思いますw

使いたい、試したい、活用したいSORACOMのサービス

SORACOM Beam

まだ、SORACOMを使ってのAWS Shadowを使ったことないので試したいと思っています。。。

SORACOM Inventory

こちらもAWS IoTでのデバイス管理(Just In Timeなど)は多少触ったことがあるので、SORACOMを使った場合、どのようになるか興味があります。

SORACOM Lagoon

今回、構築したようなシステムを簡単に構築できるSORACOM Lagoonというサービスもあるので、すぐ可視化したい、プロトタイピングのときや、すぐユーザにみせたいときなど、最適なサービスもあるので、活用したいです!

f:id:chinoppy:20181209174722p:plain
SORACOM Lagoon

最後に

正直、今年のはじめにここまで関わるとは思っていませんでした(^^;

この企画等、紹介できなかったことがたくさんあり、そしてたくさんのひとが関わっています。今、振り返ってみると、誰一人かけても実現していなかったんだなぁっと、すごく感じています。

このような、それぞれの得意分野でお互い補いながらできたことが、とてもうれしいですね。

本当に、SORACOM UG等を通じて、私に関わっていただいた方々に本当に感謝感謝です(TT)

来年もよろしくお願いします!

それでは、明日の zoe6120 さんにバトンタッチです!