見出し画像

Day19. AWS IoTとSORACOM Beamで遠隔温度モニターをつくる!

これ※ひとりでIoTまるっとチュートリアル Advent Calendar 2018 19日目

Day18では、AWS IoTにデータをアップロードすることが可能になりました。後は、AWS上のサービスと結び付けていろいろなことができるようになるわけです。データを集積したり、イベントを誘発したり。

今日は、AWS IoTにもう一歩踏み込んでみます。目標は「温度の遠隔モニタリングシステム」です!

目次
・SIMに証明書!SORACOM Beamが便利
・温度をAWS IoTにアップロードする
・温度データをログとして残す&アラートを上げる

SIMに証明書!SORACOM Beamが便利

また、Raspberry PiとSORACOMのSIMを結びつけないといけないので、ドングルなどを用意しましょう。こちらの記事がとても丁寧でした。

データを扱う前に、データのアップロードの仕方を再考してみましょう。デバイスからAWS IoTへの送信には、証明書が必要でした。しかし、デバイスが変わるごとに、証明書をどうのこうのするのって、結構めんどくさくないですか?

そういうときに、SORACOM Beamが便利です。データの転送サービスで、我々が端末側でやらなければいけないので、SORACOMクラウドが用意しているクラウドにデータを投げるだけです。そうすると、SORACOMの方でAWS IoTに自動的に転送してくれるのです。

そんなことがなぜ可能なのかというと、SIMに証明書を配置できるからです。端末ではなく、SIMに配置できるため、そこにつながった端末に設定を加えることなく、AWS IoTへの送信が実現するというわけです。ステキ!

実際にSORACOM Beamを使って、AWS IoTに転送してみましょう。

SORACOMコンソール画面を開き、SIMグループを選択します

追加から、グループ名を入力します。(今回はadvent-calendarとします)

SORACOMのSIMは、グループで管理され、その中で様々なサービスを享受できます。今回のBeamもサービスの中の一つです。Beamの設定をしていきましょう。

どこへ転送するかの詳細を設定していきます。今回は、MQTTSを用いて、AWS IoTに転送します。Day18. で用意した証明書を使うと、そのままエンドポイントに送信されます。
(※このままだと、Day18. と同じモノとして認識されます、送信されたモノを区別したいなら、新しくモノと証明書を作ったほうがいいかもしれません。)

これにてBeamの設定は完了です。最後に、SIMをグループに所属させましょう。

これで、SORACOMクラウドにデータを送れば、AWS IoTに転送される仕組みが出来ました!

温度をAWS IoTにアップロードする

SORACOM Beamを使って、センシングした温度をAWS上にアップロードしていきましょう。ここで用いるのは、Day8で用いた温度センシングのコードを少しいじったものです。ラズパイの配線自体はDay8と変わりません(LED関連のピンは今回使わないので外してOKです)

Day17.のコードに比べて、エンドポイントが変わっていることに注目です!beam.soracom.ioに投げればOKです。

import paho.mqtt.client as mq
import smbus

import ssl
import json

import time
from datetime import datetime as dt

endpoint = "beam.soracom.io"
port = 1883
topic_pub = "topic/pub"

def read_temp():
    i2c_channel = 1
    adt7410_addr = 0x48
    i2c = smbus.SMBus(i2c_channel)
    data = i2c.read_i2c_block_data(adt7410_addr, 0x00, 2)
    temp = ((data[0]<<8|data[1])>>3)/16.0
    return temp

if __name__ == '__main__':  
    client = mq.Client(protocol=mq.MQTTv311)
    client.connect(endpoint, port=port, keepalive=60)
    count = 0
    while True:
        count += 1
        temp = read_temp()
        print(count)
        client.publish(topic_pub, json.dumps({"message":"Hello AWS IoT","temperature":temp, "count":count}))
        time.sleep(5)
        

これにて、温度のアップロード完了です。AWS IoTのテストで、subscribeできるか確認してみてください

ちゃんとデータが取れてますね!!

topic/pubの下についているのは、IMSIヘッダです。いわゆる、SIMの持つ固有番号です。Beamの設定でつけられるので、設定を確認しましょう。

遠隔温度監視システムを作る

せっかくAWS IoTデータをアップロードしているわけですから、AWS上で何かしらの処理をしたくありませんか?それには、IoTのルールという機能を用います。集まったデータに対して、条件をつけて下記のような処理が可能になります

例1 : 来たデータを随時データベースに突っ込む
例2 : 一定温度を上回るとアラートを上げる

自由度も高いので、柔軟にIoTシステムが作れます。今回は、遠隔温度監視システムを作っていきましょう。アーキテクチャは次の通りです。

まず、IoT Coreからルールを作成します。

ルールの名前/適用条件(クエリステートメント)/アクションを設定していきます。ルールの名前は適当に付けてください。

ルールの適用条件は、SQLで書きます。書き方の例は、SQLリファレンスを参考にしてください

次にアクションの追加です。上記のルールから、データが流れて来た場合に行う動作を決めます。DynamoDBに保存したり、IoT Analyticsに流したり、用途に応じていろいろな選択肢があります。今回は、Lambda関数を呼び出しましょう。

Lambdaの作成方法は、Day17で話した通りです。ここではpythonでslack通知をする方法をそのまま使います。関数を作ったら、下記コードをコピペして、Slack URLを設定して変えれば動くと思います。(advent2018-callingという名前にしました)

import json
import urllib.parse
import urllib.request
def lambda_handler(event, context):
   url = "https://hooks.slack.com/services/xxxxxx"
   params = urllib.parse.urlencode({"payload": {"text": ":cry: temperature is over 30!!"}}).encode("utf-8")
   f = urllib.request.urlopen(url, params)
   print(f.read())
   return

作成後、IoT Coreのルールに戻り、このLambdaを選択すれば、完成です!

温度が30℃以上のときにこんなふうにSlackにアラートが上がるようになります!!

これで、いつでもどこでもモニタリングが可能になりました。遠隔温度モニターの完成です!

まとめ

このアドベントカレンダーも、ハードウェアの制作から始まって、データをクラウド上にアップロードし、処理するところまでができるようになりました!いよいよIoTという感じですね。

ハードウェア、ゲートウェイ、クラウドで様々な処理を行ってIoTというシステムが成り立つということが、一通り理解できたと思います。明日は、ちょっと広い視野で見た、クラウド/フォグ/エッジコンピューティングに関する話をします!ではではっ!

前の日 : AWS IoT入門(Raspi接続編)
次の日 : エッジ/フォグ/クラウドコンピューティング

サポートいただけると励みになります! よろしくおねがいします!!