Sens’itのデータを活用する – ①Amazon Timestreamへの蓄積

この記事は SORACOM Advent Calendar 2020 の 12/17付記事となります

皆さんこん**は。
20182019に引き続き、3年連続でSORACOM Advent Calendarに投稿させていただきます。

昨年の記事「ブログに時間をなかなか割けず、発信が少なくなってすみません」 と、インプットする時間を設けてアウトプットを続けよう、と誓ったものの、2020年も

色々忙しい毎日を送っており、今年もあまりアウトプットすることができませんでした・・・反省しきりです。

ですがそんな中でも春に1件、IoT関連の投稿をさせていただきました。
GPSマルチユニット SORACOM Edition発売に関する記事です。

GPSマルチユニットSORACOM Editionでペットのお世話
我が家にハムスターがやってきました。 GPSマルチユニットSORACOM Editionにてケージ周りの温度を測定、Zabbixで閾値監視し通知するようにしました。

この記事ではSORACOM Harvest経由でZabbixにデータを格納しグラフ化、及びアラートの通知まで実装する内容となっておりました。

Sens’it

今年はもう1つ、IoTデバイスとしてソラコムさんからSens’itを入手しています。

簡単に説明すると、携帯回線網ではなく Sigfox通信で直接データをアップロードできるセンサーデバイスですね。

Sigfoxは920MHz帯のSSB…
と聞くだけでアマチュア無線休眠中の私としては想像できるのですが、要するにLPWAの一種となります。

Sens’itのデフォルトでは測定頻度が概ね1時間に1回という制約はありますが、温湿度センサー・加速度センサー・磁気センサー・照度センサーなどが内蔵されておりますので、これ1つで各種測定が可能となります。

また非常に電池の持ちが良いので、(防水対策は十分に行った上で)屋外に設置し測定を行う向きには良い選択肢なのではないかと思いました。

なお、ソラコムさんから販売されているSens’itデバイスに関しては、標準で各種SORACOMサービスと接続されておりますので、多例えば SORACOM HarvestやLagoonで状態をグラフ化するのは非常に容易です。

zabbixへの連携

また、上述のGPSマルチユニットの記事と同じ方式で、zabbixへの取り込みも簡単にできました。

SAMユーザの作成

SigfoxDevice:getDataFromSigfoxDevice メソッドのみ許可するSAMユーザを作成し、認証キーを発行します。

{
  "statements": [
    {
      "api": [
        "SigfoxDevice:getDataFromSigfoxDevice"
      ],
      "effect": "allow"
    }
  ]
}

zabbixサーバ側情報取得スクリプト

以下のようなPythonスクリプトを設置します。

import sys
import requests
import json
import base64

soracom_authKeyId = 'keyId-xxxxxxxxxxx' (※SAMユーザの認証キーID)
soracom_authKey   = 'secret-xxxxxxxxxxxxxxxxxxx'  (※SAMユーザの認証キーシークレット)
device_id = 'xxxxxx' (※当該デバイスのID)

args = sys.argv

headers = {'Content-Type': 'application/json'}
payload = {'authKeyId': soracom_authKeyId, 'authKey': soracom_authKey}
responce = requests.post("https://api.soracom.io/v1/auth", headers=headers,data=json.dumps(payload)).text
data = json.loads(responce)

try:
  apikey = data['apiKey']
  token = data['token']
except:
  print('Invalid Username/Password')

headers = {
  'Accept': 'application/json',
  'X-Soracom-Api-Key': apikey,
  'X-Soracom-Token': token
}

url="https://api.soracom.io/v1/sigfox_devices/" + device_id + "/data?sort=desc&limit=1"

responce = requests.get(url,headers=headers).text
data    = json.loads(responce)[0]['content']
jsondata = json.loads(data)

#print jsondata
#print type(jsondata)

if len(args) > 1:
  if args[1]=='temp':
    print(jsondata['tempC'])
  elif args[1] == 'humi':
    print(jsondata['humidity'])
  elif args[1] == 'bat':
    print(jsondata['battery'])

あとはGPSマルチユニットの記事と同じ設定を行うことで、グラフ化や監視の設定は行うことが可能です。

Amazon Timestreamへの蓄積

これで温湿度データを定期的に収集できるようになった訳ですが、やはり測定データは長期間蓄積して機械学習に掛けて分析したくなります。AWSには Amazon Forecastという、機械学習を使用して精度の高い予測を行うフルマネージドサービスがありますので、これを利用して予測を行うことをゴールにしたいと考えました。

私のSens’it、実は北関東の某所(屋内)に置いてきています。
上のグラフで氷点下を示していることに驚いたかもしれませんが、通常時は無人であるため室内でも氷点下になり、水道管の凍結を防ぐために不在時は水抜きの運用が必須となります。
水抜き運用の開始時期/終了時期の提案、とか面白いかもしれません。

とはいえ、ひとまずはデータを蓄積するところから、ですので今回は蓄積するところまでにします。

Timestreamを使う

AWS上でのIoTデータの蓄積は、今まで悩みどころだったと思います。
DynamoDBを用いるのが一般的だったのかなと思いますが、noSQLデータベースのためデータ抽出して加工する向きには癖があり使いにくいかと。

そんなことで昨年登場したのがAmazon Timestreamで、完全マネージドで提供される高速かつスケーラブルなサーバーレス時系列データベースサービスとなります。取り出しにはSQLライクな構文で抽出できるので、使い勝手が良いこともありますし、非常に安価なのでIoTデータの蓄積には持って来いです。

東京リージョンでは未だリリースされておりませんが、使ってみたいと思います。
とは言っても、既にSORACOM Blogで取り上げられておりましたの、以下の記事を参考にいたしました。(takiponeさんに感謝!)

最小限のデバイス開発でデータをAmazon Timestreamに送るSORACOMとAWSの構成 - SORACOM公式ブログ
こんにちは、ソリューションアーキテクトのtakiponeこと大瀧です。 時系列データベースサービス Amazon Timestream が、先日正式リリースされました。 Timestream は従来のリレーショナルデータ

アーキテクチャ

とはいってもこれだけ。コード不要で実装できる有り難みがすごいです。
なお、私はus-west-2(オレゴン)のリージョンで設定を行いました。

TimestreamのDB/テーブル作成

まず、AWSコンソールよりTimestreamの設定を開いてDB及びテーブルの作成をします。
とはいえ驚くほど簡単ですが。

データベースを作成します。
とはいえ、Standard Databaseを選択し、名前を入れるだけ。

続いてテーブルを作成します。
テーブル名と、メモリストア/ディスクストアの保存期間を指定します。

私はメモリストアの保存期間を1日に指定しましたが、今回のユースケースではもっと短くて良いかと思います。
(メモリ内で時系列にソートされ、ディスクに格納するための階層構造ですので)

各カラムの型宣言とか不要なのかと心配になりますが、Timestreamは自動判定で格納してくれます。
以上これだけです

IAMポリシー/ユーザの作成 ~ SORACOM Funnelの設定

こちらのマニュアルを参考に設定しました。
ほとんどそのままのため、省略します。

https://dev.soracom.io/jp/start/funnel_aws_iot/

AWS IoT CoreのRule設定

最後にAWS IoT Coreのルールエンジンの設定を行います。
対応するリージョンでRuleの設定を開くと、Timestreamの選択肢があるはずです。

 

アクションの設定で、作成したTimestreamのデータベースとテーブル名を指定します。
複数Sens’itからデータをアップロードすることも想定して、ディメンションに${deviceid}を追加しました。
またタイムスタンプとして ${timestamp} 単位:MILLISECONDS を指定します。

SORACOM Blog記事では、タイムスタンプの設定のためCLIを併用しておりますが、現在ではGUI設定のみで可能になっています。
アクセス権限を得るため、ロールの設定を忘れなく。
(「ロールの設定」をクリックし進めるだけですね)
 
ルール設定の最後に、ルールクエリステートメントの設定を行います。
値として以下を設定しました。
SORACOM Funnel から届くデータにおいて、デバイスからのデータはpayload要素内に含まれます。
SELECT payloads.tempC, payloads.humidity, payloads.battery FROM 'sensit/#'

※私の設定では SORACOM Funnel にて sensit/ トピックに発行するように設定しています。

ここでSELECTした項目の数だけTimestreamに書き込みが行われますので、ここで項目をいかに減らすのかというのが重要になります。

確認

これで設定完了です。
Sens’itからデータが来たタイミングで、Amazon Timestreamにデータが格納されるようになりました。

しばらく放置してデータを蓄積した後に活用を検討したいと思います。

コメント