1NCE Pluginのデータ可視化サービスDatacakeで土壌水分量をIoT監視し、LINE通知
皆さんこんにちは。IoTソリューションアーキテクトのTakamasaです。
この記事では、2024年から低容量IoT回線「1NCE」が新しく発表したPlugin機能の1つである、ローコード可視化サービス「Datacake」を使って、簡単にIoTデバイスのセンサーデータの可視化をする方法と、水分センサーを使ってメール及びLINE APIを使ってスマホに通知をする方法を紹介します。
1NCEとは?
先ずはおさらいですが、1NCE(ワンス) というIoT回線の特徴を簡単にまとめてみます。
1回線当たり一括2,200円(税込)の支払いのみで、最長10年間、500MBまで利用可能(プリペイド式)
SIMカード1枚からオンラインで購入可能
日本国内に加えて、165以上の国と地域において追加料金なしでローミングサービスを利用可能
SIMカードに加えて、ウェブ上の回線管理ツール(CMP)や、お客さまのシステムとのデータ連携を可能にするAPI、安全にデータを伝送するOpen VPNなどの機能を追加料金なしで利用可能
eSIMやIPSec(各拠点のLANを相互接続する高セキュリティーのネットワーク)、VPCピアリング(AWS VPC同士を接続)などの機能を、有償の追加オプションとして提供
一番の特徴は、IoT回線でよくありがちな基本料金+従量課金ということではなく、一括で10年間前払いするという部分がとても特徴的ですね。
また今回使ってみるSIM管理プラットフォームについても、2,200円(税込)の中で使用できるということなので、気軽にIoTをプロトタイピングしてみるといった使い方でもできそうです。
尚、1NCE(ワンス)SIMカードでは法人ユーザーであれば、どなたでも1枚からWEBで購入が可能です。
1NCEのSIM回線プラットフォーム自体には、REST APIや、IMEIロック、SMS送信、回線無効化、追加チャージなど、回線に関わる操作が一元的に管理できるものなっています。
1NCE OSについて
1NCE OSとは、1NCE プラットフォーム上で受信したデータを加工・分析・変換などができる付加サービスです。
OSと名前がついているので、IoTデバイス側に使われるOperating System (OS)と勘違いする人も多いのですが、1NCE OSというプラットフォームサービス名なだけで特にデバイス側に何か特別なOSをインストールする必要はありません。
1NCE OS機能は、全部で6つの機能に別れています。
Device Authenticator:SIM認証を使ったデバイスオンボード機能
IoT Integrator:UDP、CoAP、LwM2Mのデータエンドポイント機能と、送られたデータをクラウド側に転送する機能
Device Inspector:Device Integratorに送れたデータを最大7日間保管する機能
Device Locator:IoTデバイスの基地局情報から位置情報を取得して、APIとして返す機能
Energy Saver:バイナリデータとJSONテンプレートを使ってデータ整形する機能
Plugin:サードパーティーのサービス統合機能
いくつかの機能に別れていますが、基本的に1NCE OSの考え方は機能パーツという感じに近く、単体で使えるものも有れば、組み合わせて使わないと動作しないものも様々あるのが、ちょっと使いづらい点ですね。
私なりに1NCE OSの全体像を作ってみましたので、こちらの方がまだわかりやすいのかなと思っています。
1NCE OSの全体的な仕組みとしては、バイナリデータを使ったデータ転送機能、データハブ機能、クラウドからデバイス側へのデータ転送機能、位置情報機能、そしてサードパーティープラグインというところが今今の機能になると思います。
1NCE Pluginの概要
さて、それでは今回発表された1NCE Pluginとは何かという部分をもう少し深堀りしていきたいと思います。
正確には1NCE OS機能の一部としてのPluginという機能がある形になりますが、1NCE Pluginとしても表現する場合があります。
コンセプトとしては、1NCE OS自体に新たな機能が増えていくわけではなく、1NCEのパートナー企業の提供するサービスと、1NCE OSと簡単に繋げるようになっているような感じです。近年流行ったChatGPTのPluginのイメージに近いかもしれません。
この記事執筆時点で、1NCE Pluginのパートナーとしては、以下の3つが準備されています。
FOTA (Firmware OTA):Mender社の提供するFOTAサーバの利用が可能。差分アップデートによりデータ量の節約が可能。
データ可視化: Datacake社が提供するデータ可視化サービス。収集したデータをローコードで解析し、Rule Engineに基づいたアクションが設定可能。
Azure ハブ:Tartabit社の提供するIoT Bridge機能。Azureの各種サービスにワンクリックで接続が可能。
注意としてですが、1NCEとしてこれらのサービスを提供しているわけではなく、サービス自体はあくまでも各パートナーが提供しているものになります。そのため、課金体系としても各パートナーが個別に請求してくるような形です。
1NCE Pluginとしてはこれらのサービスとの接続をワンクリックで実施できるようにしているということになります。
因みに1NCE Plugin自体の利用料金は、追加費用無しで利用が可能です。
今回構築する構成について
さて試してみる構成としては、以下のようにしてみたいと思います。
今回はかなりシンプルなIoTシステムを作ってみました。
やりたいことは、我が家にある植木の土壌水分量をセンサーで定期的にチェックし、その水分量が閾値を超えた時に、メールを通知して水を上げるように行動を促すというIoTシステムです。
この構成でできること
土壌の水分量をウェブからチェックできる
適切なタイミングで水やり検知ができる
メールとLINEでユーザーに通知する
この構成を実現するにあたって、用意したものは以下です。
Raspberry Pi 3 B+
USB LTE モデム
GrovePi+
温度センサー
土壌水分センサー
そして構成のポイントとして、使用するプロトコルに敢えて、CoAP(Constrained Application Protocol)を使ってみました。
1NCE OSを使用することができるプロトコルには、UDP/CoAP/LwM2Mの3つがあるのですが、基本的にはどれもIoTデバイスによく使用される比較的に軽量なUDPベースのプロトコルになります。
因みにTCPベースのプロトコルには、TCP/HTTP/MQTTなどがあります。
UDPベースのプロトコルでは、到達確実性というものが担保されていないので、基本的にはデータを送りっぱなしという形になります。TCPベースの場合には、3-wayハンドシェイクという仕組みを使って、一旦通信間のコネクションを確立してからデータを送るという仕組み上、データの到達性という意味では高いのですが、その代わりにデータ量が多いという特徴があります。
CoAPというプロトコルは、UDPベースでありつつも、HTTPと同じようにREST(GET/POST/PUT/DELETE)のように操作することができ、非同期処理のサポートやヘッダーの簡略化によって、軽量さと操作性を両立させています。さらに上位レイヤ部分の実装が必要ですが、使用するライブラリによっては、TCPのように再送処理を組み込むことができ、これによって、到達性という部分もカバーできます。
今回は1NCE OSで受信したデータを1NCE Pluginを使って、Datacakeというデータ可視化サービスと連携させてみます。
Datacakeについて
Datacakeとは、ドイツ発のローコードIoTプラットフォームで、誰でも簡単にデータの可視化やルールエンジンを使った自動化、例えばメール通知、SMS送信、Webhook、デバイスへのデータ送信、自動スクリプトの実行などができるようになります。
1NCE Pluginでは、このDatacakeのIoTプラットフォームと、ワンクリックで接続できるようになっており、1NCE OSに送られたセンサーデータを一瞬で可視化することが可能です。
一般的にデータ可視化サービスの場合、デバイスとの接続、データの解析、DBとのマッピングなどなど単純に可視化するだけにも関わらず、結構な手間暇を掛けて設定する必要がありました。
さらに可視化サービスも、初期費用100万円+月額費用のような請求形態で、小規模なIoTシステムには向かないという欠点がありました。
Datacakeの場合は、ローコードでほぼコードを書くことなく接続でき、ダッシュボードについてもメーカーに依頼することなく、自分自身で表示を編集することが可能です。
Datacakeで表示ができるウィジェットの一覧は、こんな感じです。
数値の表示や、ゲージの見た目も出来ますし、テーブル、スライダー、地図、さらにはiframeなんかも表示できるので、おそらく外部でHTML/Javascriptで1NCE SIM残量を表示するページを作れば、これ一つでダッシュボード可視化ができてしまいます。
さらにすごいのは、表示する値を調整できる機能です。
一般的に格安なダッシュボードサービスになると、「受信したデータを単に表示するだけ」、「グラフ化するだけ」のようなものが多いのですが、なんとDatacakeの場合は受信したデータを計算して、指定した期間の最小・最大・平均・合計、変化量、変化率を表示することができます。
このレベルができるダッシュボードサービスは比較的高額になることが多いのですが、これを安価に実現しているというのがすごいと思います。
さらにはルールエンジンという仕組みを使って、モニターしている値に応じたアクションを設定可能です。
メール送信・SMS送信・Webhook、データ送信など、おそらく小規模なIoTシステムであれば、これだけで完結できると思います。
Webhookにも対応しているので、今回はLINEのMessage APIと連携して、水が切れたらメールとLINEで通知するというところまでやってみたいと思います。
Datacakeの料金プラン
因みに、1NCE Pluginとしてはサードパーティーシステムに接続する機能ということになっているので、Datacake自体の課金については、個別に契約するような形になります。
但し、1アカウント当たり5台までは無料で使用できるようになっているので、ごく小規模なIoTシステムや、PoC用途であれば、このダッシュボードでほとんどことができるかと思います。
因みに契約体系としては、ボリュームでの契約かもしくは1台ごとに課金していく2種類の方式が選択することが可能です。
10台ぐらいまでであれば、実質 10 € (月1,400円)程度で利用できるので、比較的に安価にIoTデバイスからのデータの可視化および通知の仕組みを作ることができます。
設定手順
ここからは実際の構築手順になります。
1NCEポータルでCoAPエンドポイントを有効化する
先ずは1NCEポータルから、CoAPのエンドポイントを有効化していきます。
この機能はDevice Integratorという名前で記載されています。
1NCEポータルにログイン後、1NCE OS > Device Integratorをクリックしてください。
※初回利用の場合には、データ保管に関して、同意する必要があります。
Device Integratorをクリックすると、以下のような画面が出てくるので、右上の “+ New Integration”をクリックしましょう。
※画像ではUDPを有効化済み。
あとは、次の画面で ”Use this Protocol”をクリックして終了です。
この画面で表示されている、coap://coap.os.1nce.com:5683が送信先になります。
因みに、エンドポイントにはcoapとcoapsがありますが、前者が非暗号化のcoapになり、後者がDTLSというUDP層を用いたTLS認証方式になります。
そもそも1NCEプラットフォームまではキャリア閉域網と呼ばれる閉じたネットワークではありますが、それでもデバイスのマイコンとモジュールもしくはIoTデバイスとLTEルータ間でのセキュリティを高めたいということであれば、CoAP over DTLSが利用できます。
またDTLSを使用することで、UDPで対応できなかった「ステートフル」「再送処理」などがDTLS層でTLSっぽく対応することが可能です。因みにCoAPだけでも使用するライブラリによっては再送処理も一部対応が可能になっています。
IoTデバイスから1NCE OSにデータを送信する
これで、送信先(エンドポイント)が設定できたので、ここからはデバイス側から1NCE OSにデータを送信していきたいと思います。
今回はRasberry PiにPythonのコードを作成して、送信していきます。
以下はGrovePiを使ったサンプルコードになるので、PCではGrovePi部分が動作しないので、ご注意ください。
import asyncio
import struct
import aiocoap.resource as resource
from aiocoap.message import Message
from aiocoap.transports.generic_udp import GenericMessageSocketTransport
from aiocoap import Context, Code
import grovepi
import logging
# サーバーエンドポイント、ポート、トピックの設定
ENDPOINT = 'coap.os.1nce.com'
PORT = 5683
TOPIC = '<SIM ICCID>' # お持ちのSIMに書き換える
# データの定義とパッケージング
temp, humi = grovepi.dht(6, 0)
moisture = grovepi.analogRead(1)
cpu_temp = float(tempf.read()) / 1000.0
# ロガーの設定
logger = logging.getLogger(__name__)
# データ送信用のバイト列データ作成
payload = (bytearray(struct.pack('f', temp)) +
bytearray(struct.pack('f', humi)) +
bytearray(struct.pack('f', cpu_temp)) +
bytearray(struct.pack('f', moisture)))
url = 'coap://{}:{}/?t={}'.format(ENDPOINT, PORT, TOPIC)
async def send_coap_message(protocol, url, payload):
request = Message(code=Code.POST, payload=payload, uri=url, mtype=0) # Message type CON (0)
try:
response = await protocol.request(request).response
if response.code.is_successful():
logger.info("CoAP message sent successfully")
else:
logger.error("Failed to send CoAP message. Error code: %s", response.code)
except asyncio.TimeoutError:
logger.error("Request timed out")
except Exception as e:
logger.error("Exception occurred while sending CoAP message: %s", e)
async def main():
protocol = await Context.create_client_context()
await send_coap_message(protocol, url, payload)
if name == "__main__":
asyncio.run(main())
これで、あとはこのファイルを起動させればデバイス側の準備は完了です。
EnergySaverでバイナリ変換テンプレートを作成する
前項で作成したコードは、平文ではなく、バイナリでデータを送っているので、このままだと変な文字化けをしたデータのみが、表示されてしまいます。
なので、次は1NCE OS側でバイナリ変換のためのテンプレートを作成していきます。
ポータルから1NCE OSタブを開いて頂き、左側のタブからEnergySaverを選択し、+New Templateをクリックします。
適当な名前をつけて、適用するプロトコルを選択していきます。
このテンプレートは、1プロトコル:1テンプレートの関係になっているので、もしUDPとCoAPで送信形式を変えたい場合は、それぞれ適切なプロトコルを選択してください。
今回はCoAPだけですが、UDPも一応クリックしておきます。
Template部分に実際の変換テンプレートを作成していきます。
今回のテンプレートは、シンプルに4 byte (Temperature) + 4 byte(humidity) + 4 byte(cpu_temperature) + 4 byte(moisture)の形式にしました。
{
"sense": [
{
"asset": "temperature",
"value": {
"byte": 0,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "humidity",
"value": {
"byte": 4,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "cpu_temperature",
"value": {
"byte": 8,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "moisture",
"value": {
"byte": 12,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
}
]
}
これで一旦保存してください。
EnergySaver部分の設定に関しては以下の記事を参照ください。
1NCE PluginでDatacakeと接続する
次にデータ可視化とメール送信、Web Hookを行うDatacake側の設定を行っていきます。
先ずは、Datacakeのサイトにアクセスし、アカウントの作成をしてください。
アカウントの作成が完了したら、次はDevicesのタブから、+Add Devicesをクリックします。
Datacake側では、既に1NCEテンプレートが準備されているので、このまま”1NCE”を選択し、次に進みます。
すると、次の画面でWorkspace IDが表示されますので、これをコピーして保存しておいてください。
次に、1NCE ポータルに移動し、1NCE OS > PluginからDatacake “Data Visualization”をクリックしてください。
プラグインの説明が表示されますので、Install Pluginで進めてください。
その次の画面で、先ほどDatacakeで表示されたWorkspace IDを入れるところがあるので、ここで入力し、Proceedをクリックしてください。
これで、1NCE OSとDatacakeの接続が完了しました。
Datacake側でデバイスを追加する
次はDatacake側でデバイスを追加していきます。
正しく1NCE OSとDatacakeが接続ができていれば、+Add Deviceをクリックすると、1NCE OS側に接続されているデバイス一覧が表示されるはずです。
Datacakeで表示したいデバイスを選択し、先に進めてください。
次の画面で、Datacake側で登録されている製品テンプレートを選択する部分がありますが、New Product Template > 1NCE OS Base Device Templateを選択して、先に進めてください。
ここで、料金プランを選択する部分が出てきますが、今回は~5台以下なので、”Free”を選択します。
Datacake側でデータをマッピング
次にDatacakeに登録されたデバイスに、1NCE OSで送られたデータとDatacake上で表示する項目のマッピングをしていきます。
先ずはちゃんとデータが届いているかどうか確認したいので、Device > Debugを選択してください。
正しくデータが届いていれば、Received 1NCE payloadという部分で何かしらデータが見えるはずです。
ここでデータが文字化けしている場合には、EnergySaverのテンプレートに何か間違いがあるはずです。
Debugにて、データが到達していることがわかれば、次はマッピングの設定をしていきます。
Configrationのタブをクリックしてください。
そのまま画面をスクロールしてしていくと、Configuration Fieldsという部分があると思います。
以下の画面では既に追加済みなのですが、正しくEnergySaverが設定できていれば、ワンクリックで追加ができるはずです。
因みに、1NCE OS側でDevice LocatorはONにしている場合には、頻度は少ないですが、Cell IDをベースとした位置情報が数日に1回取得されます。
精度はそこまで高くはないですが、何もしなくても緯度経度情報が取れるので、とりあえず使っておきます。
これで、Datacake側のマッピングは完了です。
Historyタブでは、無料版であれば最大7日間のデータが保管されるので、以下のような感じでデータ履歴が表示されます。
今回は温度・湿度・水分量をセンサーを使って取得しているので、湿度と水分量だけ、水が溜まっていくように見た目にしています。
どの値で、どの色にするかも含めて設定可能です。
これで、データの可視化は完了です。
ルールエンジンを使ってメール送信を設定
最後は、センサーデータを監視して、閾値を超えたときにメール送信するように設定していきます。
Datacake画面から、Rulesタブから、+Add Ruleをクリックします。
ここでルールを作成していきます。
今回は、植木の水分センサーを監視していきたいと思いますので、Moistureが600を超えたときに、メールを飛ばすというように設定してみます。
またチェックする間隔、600秒(10分)毎にチェックするように設定しておきます。
因みに、hysteresis(応差)というのは、一度閾値を超えたときに、ここまで数字が落ちたら、再度トリガーをかけるように設定できます。
今回のケースだと、水分量600でメール発報するようにし、水を注ぐと500以下まで下がるので、水を注ぐまでは600以上になっても何もしないようになります。
LINE Message APIを設定してチャネルを作成
次にLINE Message APIを使って、メールだけでなく、スマホのLINEアプリにも通知が来るように設定してみます。
先ずは、LINE Developperのサイトに行って、アカウントを作成してください。
https://developers.line.biz/ja/
アカウント作成完了後ですが、先ずはプロバイダを作成していきます。
プロバイダは、適当な名前で作っておきます。今回はIoTDevにしておきました。
プロバイダを作成したら、次はチャネルを作ります。
LINE APIは、いくつかあるのですが、今回は単純に通知チャネルを作りたいので、Messaging APIを設定しておきます。
チャネルを作成できたら、Messaing API設定のタブをクリックして、自分のスマホのLINEアプリからQRコードを読み込んでください。
これで、自分のスマホから今回作成したチャネルが見えるようになります。
ルールエンジンを使ってLINE通知
次は、Datacake側のRules設定を使って、LINEチャネルに通知します。
+Add rulesから、ThenのアクションをCall a webhookに設定してください。
ここから、LINE APIのフォーマットに従って、APIを書いていきます。
Message APIは、色々なことができるのですが、今回は一番シンプルに、チャネルの全登録者に向けて、ブロードキャストするように設定しておきます。
細かい設定方法は以下のページを参照ください。
LINE Developer APIリファレンス
https://developers.line.biz/ja/reference/messaging-api/
今回は一番シンプルに以下で進めていきます。YOUR_KEYの部分が、前項でコピーしておいたチャネルアクセストークンの部分になります。
URL https://api.line.me/v2/bot/message/broadcast
Content-Type application/json;
Authorization Bearer YOUR_KEY
そしてメッセージ部分関しては、APIリファレンスに従い、単純にテキストメッセージを送るようにします。
一応、Datacake側の制限として、送信するテキストに日本語が使えないということになっているので、仕方がなく「植木(ウンベラタ)の水が切れているようです。水をあげてもらえますか?」みたいな英語を書いておきます。
また文章の途中で、現在の水分量を間に入れる方法もわからなかったので、2行に数値だけを出力するようにしました。
{
"messages": [
{
"type":"text",
"text":"Hey, our Umbellata's getting really thirsty. Can we give it some water, please? Current Moisture level is below;"
},
{
"type":"text",
"text":{{ devices["INSERT_PLACEHOLDER_DEVICE"]["measurements"]["MOISTURE"] }}
}
]
}
これで全ての設定は完了になります。
実際に使ってみる
このまま1週間程度運用してみて、その時を待ちます。
そして、ついにその時がきました。
こんな感じでちゃんと設定した通り、メールが通知されました。
メールの場合は、日本語で送信ですが、その代わりセンサーの値を送信することができません。
一方で、Web Hookの場合はDatacake側の仕様なのか英語でしか送信できませんが、センサーデータをこんな感じで送ることができます。
これで、もう植木の水やりタイミングを間違えることはありませんね!
因みにセンサーの値がたまに異常値を出すことがありましたので、実際の運用、コードについては今回のコードから少々修正する必要はありそうです。
最後に
今回は1NCE PluginのDatacakeを使って、植木の水分量を可視化し、そして適切な水やりのタイミングで、メール送信さらにはLINE通知までを実装してみました。
正直、ここまでの機能をこんなに簡単にこれだけの金額でできるって結構すごいと思います。
今回の記事のポイントとしては、以下の点になります。
1NCE OSを使うことで、データ送信を簡素化さらにはデータサイズの圧縮が簡単に
1NCE PluginでワンクリックでDatacakeと接続
Datacakeを使えば、データの可視化およびメール送信、Webhookが簡単に実装できる
1NCE(ワンス)SIMカードでは法人ユーザーであれば、どなたでも1枚からWEBで購入が可能で、今回紹介した1NCE SIM管理プラットフォームの機能は、アカウントユーザーであればであれば誰でも無料で試すことができますので、先ずは是非触ってみてください。