SORACOM IoT レシピ:IoTで、水槽の残量を可視化
この記事は最終更新日から1年以上が経過しています。
マルチコンバーターと磁気式フロートスイッチを用いた「水残量可視化/通知システム」
作成日:2022年6月
レシピ難易度:★★☆☆☆
本レシピでは、接点入力やアナログ入力をデジタル化できる「オプテックス社製 マルチコンバーター」と、磁気式フロートスイッチ(磁気を利用した接点センサー)を組み合わせて、貯水タンク内の水量をSORACOM Lagoon上で表示させ、一定量を超えると通知が送られるシステムを作成します。


本レシピを行うのに必要な時間、概算費用
本レシピは以下の通りです
- 必要な時間: 約90分
- 概要費用: 約115,800円
※ 概算費用: ハードウェアや SORACOM を始めとした各種サービスの概ねの費用 (送料などの付帯費用や無料枠適用は考慮しないものとしています)
使用する SORACOM サービス
- データ通信サービス SORACOM Air
- データ収集・蓄積サービス SORACOM Harvest Data
- ダッシュボード作成・共有サービス SORACOM Lagoon
用意するもの
| 品名 | 数量 | 費用 | 備考 | 
| IoT無線ユニット マルチコンバーター スターターキット | 1 | 107,800円 | 本スターターキットには – オプテックス社製 マルチコンバーター(OWU-310M) 1台 – マルチコンバーター用リチウム電池 (OWU-Battery300) 1ケ – SORACOM 特定地域向け IoT SIM / plan-D D-300MB SIM(サイズ:ナノ・データ通信のみ)1枚 これらに加えて、サービス利用料 2,000 円分のクーポン(6ヶ月有効)を同梱しています。 ※ポールへの取り付けには、ポール取付金具セット(OWU-PA1)を別途お求めください。 | 
| 磁気式フロートスイッチ | 2個 | 約6,400円 | 本レシピでは、側面取り付けタイプを利用しています。 | 
| 2芯ケーブル | 1~2m × 2本 | 約1,200円 | 磁気式フロートスイッチと、マルチコンバーターを接続するための延長ケーブルです。 本レシピでは、屋外向けの2芯ケーブルを利用しています。 | 
| 丸ワッシャー (ゴム製) | 4ケ | ― | 磁気式フロートスイッチの取り付け時における漏水対策用です。 本レシピでは、M14サイズの丸ゴムワッシャーを利用しています。 | 
| プラスドライバー | 1本 | ― | マルチコンバーターのふたの開け閉めに使用します。 サイズは No.1 のものをご用意ください。例: ベッセル(VESSEL)社 No. 1プラスドライバー | 
| マイナスドライバー | 1本 | ― | 磁気式フロートスイッチとマルチコンバーターを接続する際のストッパー外しに使います。 サイズは4mm程度あると確実です。 | 
| ニッパー | 1本 | ― | 2芯ケーブルの加工に使用します。 小型のモノで十分です。 | 
| 防水収縮チューブ もしくはビニールテープ | ― | ― | 磁気式フロートスイッチと2芯ケーブルの結線部分に使用します。 本レシピでは、防水型を利用しています。ビニールテープで代用できます。収縮チューブを利用する場合は高温のドライヤーもしくははんだごても必要となります。 | 
| 貯水タンク | 1ケ | ― | 本レシピでは、防水性ナイロン生地による持ち運び可能な貯水タンクを利用しています。 | 
- 金額はレシピ作成時となります。金額は税込み・送料別です。その他は参考価格となります。
このコンテンツの進め方
上から内容を読み進みながら作業を行なっていきます。また左サイドに追従する目次からページ内の移動が可能です。
本コンテンツは現状のままで提供され、株式会社ソラコムは、誤りがないことの保証を含め、明示であると黙示であるとを問わず、本コンテンツの記載内容につき、いかなる種類の表明も保証も行いません。
掲載情報の閲覧及び利用により、利用者自身、もしくは第三者が被った損害に対して、直接的、間接的を問わず、株式会社ソラコムは責任を負いかねます。
本コンテンツを実践する中で用意された機器、利用されたサービスについてのご質問は、それぞれの機器やサービスの提供元にお問い合わせをお願いします。機器やサービスの仕様は、本コンテンツ作成当時のものです。
株式会社ソラコムが提供する機器・サービスについてのご質問はフォームで受け付けております。機器・サービスご利用前の導入相談は https://soracom.jp/contact/ に、機器・サービスご利用開始後のサポートは、SORACOMユーザーコンソール内のサポートサイトから「リクエストを送信」(要ログイン)にてお問い合わせください。
Copyright (c) 2023 SORACOM, INC.
SIMの登録と、マルチコンバーター用の設定
まずSIMの登録とそれに紐付けるグループの設定を行います。
SIMの登録
マルチコンバーターは SIM を挿入することでセルラー通信(LTE-M)を通じて、クラウドと連携できるようになります。そのため、まず お手持ちのSIM を SORACOM へ登録をしましょう。
※ すでに登録済み、もしくは登録済みの別の SIM を利用する場合は次へお進みください。
登録の方法は発注済みの SIM を登録する(JP)をご覧ください。約5分で完了します。
登録が完了すると左の[Menu]→[SIM管理]に表示されますのでご確認ください。

グループの作成とSIMの所属
SORACOM の IoT データ収集・蓄積サービス SORACOM Harvest Data を利用して、データの可視化を簡単に実現してみましょう。
SORACOM Harvest Data とは?
IoT デバイスからのデータの収集や蓄積、およびファイルを保存するサービスが SORACOM Harvest (ソラコム ハーベスト) です。IoT デバイスからのデータの収集・蓄積対応しているのが SORACOM Harvest Data、画像ファイルやログファイルといったファイルに対応しているのが SORACOM Harvest Files となります。
SORACOM ユーザーコンソールにログインした後[Menu]>[SIM管理]をクリックします。

先ほど登録したSIMにチェックをつけ[操作]>[所属グループ変更]を選択します。

[新しい所属グループ]から[新しいグループを作成]をクリックします。

適当な名前をつけてグループを作成します。
| 項目 | 例 | 備考 | 
|---|---|---|
| グループ名 | left_water | 任意の名称を設定可能です。わかりやすい名称を使いましょう。 | 
名前を確認したら[グループ変更]をクリックします。

これでグループの作成とSIMの所属が完了しました。次に、グループの設定を行います。
グループの設定
ここでは「バイナリーパーサー」と「SORACOM Hervest Data」の設定を行い、データを取扱いしやすい形にして蓄積できるようにします。
[SIM一覧]から先ほど作成したグループを選択します。

[SORACOM Air forセルラー設定]から[バイナリーパーサー]をクリックし[フォーマット]に以下の情報を入力します。
serial_number:8:char:14 sequence_number:54:uint:8 RSSI:55:char:4 battery:59:char:1 ch1_ascii:64:char:2 ch1:77:uint:16:*-1+1 ch2_ascii:66:char:2 ch2:80:uint:16:*-1+1 alive_monitoring:72:char:2 test:74:char:2
入力が完了したら[保存]をクリックします。

以上でバイナリーパーサーの設定は完了です。
同じページ下部の[SORACOM Harvest Data設定]からボタンをクリックし[保存]をクリックします。

以上でバイナリパーサーとSORACOM Hervest Dataの設定が完了しました。
マルチコンバーターの設定と設置
次に行う動作確認テストに向けて簡単なセットアップを行います。
マルチコンバーターのフタを開ける
プラスドライバーで、2か所のねじを緩めてフタを開けます。

向きに注意しながら写真のようにSIMを挿入する

電源投入前に行ってください。電源投入中にSIMの抜き差しを行うと、SIMやドライコンバーターが破損する可能性があります。
入力切替部品をコネクタに装着する
入力1と入力2に[Alarm or Pulse]の入力切替端子を挿入します。

DIPスイッチを以下のように設定します
左から 1~12 と番号が割り当てられているので、以下のように設定してください。
| 番号 | スイッチ | 
|---|---|
| 1 | OFF | 
| 2 | OFF | 
| 3 | ON | 
| 4 | OFF | 
| 5 | OFF | 
| 6 | ON | 
| 7 | OFF | 
| 8 | OFF | 
| 9 | OFF | 
| 10 | OFF | 
| 11 | OFF | 
| 12 | OFF | 

これにより、入力1,2について両エッジ検出(水位の上昇下降両方を検出できる)という設定となります。
より詳細な意味については、公式マニュアルのP8をご覧ください。
専用リチウム電池の接続
ジャンパプラグを “BATT” 側にします。(なっている場合は確認のみでOKです)

専用リチウム電池をボックスへ取り付けた後、電源コネクタを接続します。
マルチコンバーターには電源スイッチがありません。プラグを接続した瞬間から電源がONとなります。
TESTボタン横のLEDが緑点滅(約1分程度)します。その点滅が終了したら準備完了です。

電源およびSIMカードに異常がある場合は、緑と赤のLEDが点灯したままとなります。電源コネクタを一度抜き、接続状況を再確認してください。
また、機器の設定変更やSIMの抜き差しの時には、まずプラグを抜いて電源をOFFにしてから作業するようにしてください。
電源プラグを再度接続する際には、接続前にTESTボタンを3秒長押してから、電源プラグを接続してください。(3秒の長押しをしても、特に何も起こりませんが、行うようにしてください)
以上で必要な設定は完了しました。
テスト
ここまでの作業が正しくできているか動作確認を行います。
ドライコンバーター中央の[TESTボタン]を3秒ほど押して離します

通信ができている場合はボタンの近くのランプが0.5秒赤く点灯し、しばらくするともう一度ランプが点灯されます。二回目のランプで送信完了です。
ユーザーコンソール内の[SIM一覧]から登録したSIMにチェックを入れて[操作]>[データを確認]を選択します。

以下のようにデータが出力されていることを確認してください。

[一次処理済みデータ]内に”test":"TS"の文字列があればテスト送信成功です。
以下、データ(JSON)のキー名と値の解説です。
| キー名 | 型 | 値 | 
|---|---|---|
| serial_number | 文字列 | 使用しているコンバーターのシリアルナンバー。 | 
| sequence_number | 数値 | データのシーケンス番号。送信回数の通し番号で、0~255を繰り返します。 | 
| RSSI | 文字列 | 電波強度。単位はdBmです。 | 
| battery | 文字列 | バッテリー状況。正常時 N、低バッテリー時 L となります。 | 
| ch1_ascii | 文字列 | 入力1の接点信号。センサー1の位置より水位が高いと1L、下がると1H、変化がなければNAになります。 ※デバッグ用途として、マルチコンバーターの出力をそのまま表示している項目です。 | 
| ch1 | 数値 | 入力1の測定値。センサー1の位置より水位が高いと1、低いと0になります。 | 
| ch2_ascii | 文字列 | 入力2の接点信号。センサー2の位置より水位が高いと2L、下がると2H、変化がなければNAになります。 ※デバッグ用途として、マルチコンバーターの出力をそのまま表示している項目です。 | 
| ch2 | 数値 | 入力2の測定値。センサー1の位置より水位が高いと1、低いと0になります。 | 
| alive_monitoring | 文字列 | 信号が死活管理信号(ハードが故障していないか確認するための定期的信号)である場合KA、そうでないとNAになります。 | 
| test | 文字列 | 信号がテスト信号の場合TS、そうでないとNAになります。 | 
| binaryParserEnabled | bool | バイナリーパーサーを有効化している場合Trueとなります。True固定です。 | 
磁気式フロートスイッチを、貯水タンクに取り付ける
ケーブルを延長する
センサーのケーブル長は短いため、取り付けに不便です。そこで、2芯ケーブルを利用して延長します。
2芯ケーブルを適度な長さ(1~2m)にカットした後、皮膜を取り銅線を取り出します (左)
センサーのケーブルの被膜を取り、銅線を取り出します (右)
※この時、結線部分の保護を収縮チューブで行う場合は、この時点で収縮チューブ(黒)も付けてください。


磁気式フロートスイッチを、貯水タンクに取り付ける
今回用意した貯水タンクには、中間および上部、計2つの蛇口用の穴が開いています。そこへ磁気式フロートスイッチを設置することで、残量を3段階で見分けられるようにしています。
磁気式フロートスイッチのケーブルを内側から通し、丸ゴムワッシャーと共に締めます。


この時重要なのは、磁気式フロートスイッチの上下です。以下のようになるよう取り付けてください。

この手順で、もう1つの磁気式フロートスイッチも取り付けましょう。
NOTE: 磁気式フロートスイッチの状態と、ch1/ch2の値について
今回使用している磁気式フロートスイッチは、円形物体の中心に回路をCLOSEとする部分があります。今回のように使った場合、水位が低い時にOPEN、水位が高い時CLOSEとなる、N.O.(a接点)型の接点センサーです。(逆さに設置すればN.C(b接点)型としても使えるタイプでもあります)

ちなみに、マルチコンバーターの仕様をそのまま反映するとOPEN(=水位が低い時)で1が発生するため、本来欲しい値とは真逆の値となることから、このままでは利用できません。
そこでバイナリーパーサーの計算機能を用いて chの状態値 × -1 +1 という演算を行うことで、OPENを0, CLOSEを1に変換しています。
磁気式フロートスイッチとマルチコンバーターを接続する
磁気式フロートスイッチのケーブルを、マルチコンバーターの下穴から通したあと、以下のように接続します。
貯水タンクの下部の磁気式フロートスイッチは、マルチコンバーターの入力1へ。
貯水タンクの上部の磁気式フロートスイッチは、マルチコンバーターの入力2へ。

マルチコンバーターへの取り付け方法
ケーブルの先端をマルチコンバーターの入力1(もしくは入力2)に差し込みます。
この時、マイナスドライバーでストッパーを押し込みながらケーブルの先端を押し込みます。軽くひぱっても取れないくらいのテンションがかかることを確認してください。

最終的には、以下のように入力1/入力2それぞれに取り付けます。その後、ケーブルを通した穴のネジを締めることで固定と防水防塵となります。

一番左の穴は、ネジを締めても穴が開いている状態になります。不要なケーブルを挟むことで埋めることができるため、特に屋外での利用であれば確実に埋めておきましょう。
動作テスト
フタを閉める前に動作テストを行います。
磁気式フロートスイッチとマルチコンバーターの接続作業の途中で、何度かセンサー反応が起こりデータを発信していると思いますが、改めての確認です。
磁気式フロートスイッチを、手で上下することでチェックできます。以下のようにデータが発信されるか確認しましょう。
| テスト # | 上部のセンサー | 下部のセンサー | 結果 | 
|---|---|---|---|
| 1 | 上げる | そのまま | ch1: 0 ch2: 1 | 
| 2 | 上げたまま | 上げる | ch1: 1 ch:2 1 | 
| 3 | 下げる | 下げる | ch1: 0 ch2: 0 | 
データの確認は、SORACOM Harvest Dataで行えます。以下のようになれば成功です。
※新しいデータが上に表示されているため、下から見ていきます。

磁気式フロートスイッチの変化から、実際の送信までは10秒程度かかります。頻繁に上下しないでください。
確認ができたら、最後にマルチコンバーターのフタを締めて完了です。
SORACOM Lagoonの利用開始
次に[SORACOM Hervest Data]に蓄積されたデータを[SORACOM Lagoon]を用いて可視化します。
SORACOM Lagoon を有効化する
SORACOM Harvest Data に蓄積されたデータを SORACOM Lagoon で活用していきます。
SORACOM Lagoon 用語解説
ここで SORACOM Lagoon で使われる用語を解説します。
| 用語 | 意味 | 
| プラン | SORACOM Lagoon の契約プランです。プランによって機能と料金が異なり、今回は無料の Free プランを利用します。SORACOM Lagoon のご利用料金に機能や料金の比較表があります。 | 
| SORACOM Lagoon ユーザー(Lagoon ユーザー) | SORACOM Lagoon へログインするためのユーザー( ID とパスワードの組)です。 SORACOM ユーザコンソールへのログインとは異なるユーザ一覧となり、皆さん自身で登録・削除が可能です。ダッシュボードやパネルを編集できる「編集可能」と表示専用の「読み取り」の2段階の権限を設定できます。作成可能数はプランによります。 | 
| リソースの種類 | 表示するデータの種別です。SORACOM Lagoon では以下の4つの中から選び、その中からノード(SIMや回線)を選択します。 ・Air = SORACOM Air for セルラー (SORACOM IoT SIM) ・Lora = SORACOM Air for LoRaWAN デバイス ・Sigfox = SORACOM Air for Sigfox デバイス ・Device = SORACOM Inventory デバイス 今回はSIMなので、「Air」の SIM を選択します。 | 
| パネル (Panel) | パネルはデータを表示する領域です。データソースとメトリクスを指定すると、そのメトリクス(たとえば SIM )のデータをパネルで使えるようになります。様々なパネルが存在します。 | 
| ダッシュボード (Dashboard) | 複数のパネルを束ねて「1枚の画面」にしたものがダッシュボードです。共有の画面表示単位となります。 | 
| アラート (Alert) | リソースのメトリクスデータに対して条件を設定し、その条件を満たしたら通知を行う仕組みの事です。 | 
| データリフレッシュ | SORACOM Harvest から SORACOM Lagoon へデータが反映される事、もしくは反映タイミングとなります。反映タイミングはプランによります。 | 
SORACOM ユーザーコンソールの[Menu]>[データ収集・蓄積・可視化]>[SORACOM Lagoon]とクリックします。

[SORACOM Lagoon の利用を開始する]をクリックします。

プランのうち Free の[選択する]ボタンクリックし、[次へ]をクリックします。

SORACOM Lagoon ユーザーの初期ユーザーに設定するパスワードを入力した後、[利用開始]をクリックします。

SORACOM Lagoon ユーザーの初期ユーザの ID は?
ID は SORACOM ユーザコンソールにログインしたときのメールアドレスが使われることになります。そのため、ここではパスワードのみ設定することになります。SORACOM ユーザコンソールへのログインとは異なるパスワードを設定する事を強くお勧めします。
利用開始がクリックできない場合は?
パスワードの条件が不足しています。全てに✔がつくようにパスワードを設定してください。
SORACOM Lagoon の有効化に成功すると、以下のように SORACOM Lagoon コンソールへのリンクが表示されます。この画面を SORACOM Lagoon 管理画面と呼びます。

Lagoon 3 で SORACOM のデータを取り扱うために、Lagoon 3 の利用を開始すると、オペレーターごとに Lagoon 3 専用の SAM ユーザーが作成されます。ただし、標準では、この SAM ユーザーには「Harvest Files にファイルをアップロードする権限」が付与されていません。そのため、Soracom X/Y Image で Harvest Files に画像をアップロードできません。
本レシピでは必要ありませんが、Harvest Files に画像をアップロードする機能を利用するには、ユーザーコンソールのSORACOM Lagoon画面で、[アクセスを許可] をクリックして、必要な権限を付与してください。
SORACOM Lagoon へログインする
SORACOM Lagoonは、SORACOMユーザーコンソールとは別のWeb管理画面(SORACOM Lagoonコンソール)で設定します。
SORACOM Lagoon 管理画面を表示したあと、[SORACOM Lagoon3 コンソール]ボタンをクリックします。

SORACOM Lagoon 管理画面は [Menu]>[データ収集・蓄積・可視化]>[SORACOM Lagoon]で表示する事ができます。
SORACOM Lagoon へログインします。
メールアドレス (SORACOM ユーザコンソールへログインする際のメールアドレス) と、SORACOM Lagoon 初期ユーザ作成時に利用したパスワードでログインします。

ログインに成功すると、以下のような画面が表示されます。これが SORACOM Lagoon ログイン直後の画面です。ここから「ダッシュボード」や「パネル」を作成していきます。

背景を白くしたい
SORACOM Lagoon の標準では背景が黒となっています。これは設定で変更が可能です。左下のアイコンにカーソルを合わせて表示される[Preferences]をクリックします。
設定画面に “UI Theme” を “Light” に変更して[Save]ボタンをクリックすると、背景が白くなります。
以下では SORACOM Lagoon 2 の Alert 設定手順について記載しております。SORACOM Lagoon 3 では Alert 機能が大幅にアップデートされているため、ユーザードキュメントを参照ください。なお、レシピは随時 SORACOM Lagoon 3 の手順に変更予定です。
アラート送信先を設定する
本レシピでは状況に応じた通知を行います。ここでは、アラート送信先を設定します。
アラートアイコンにカーソルを乗せると表示される「Alert」メニューから[Notification channels]をクリックします。
[New channel]をクリックします。
「Alerting」では以下の通りに入力します。
| 項目 | 内容 | 備考 | 
|---|---|---|
| Name | 任意の名称で構いません。 | |
| Type | ― | |
| Addresses | 通知の送付先メールアドレス | ; で複数指定が可能です。 | 
入力し終わったら[Save]をクリックします。
[Test]について
保存の前に[Test]にてテストが行えます。テストを行うと以下のようなメールが届きますので、確認にご利用ください。
また、メールが届かない場合の確認ポイントは以下の通りです。
– メールアドレスが正しいこと
– no-reply@soracom.jp からのメールが迷惑メールに判定されてないこと、もしくは受信フィルタで拒否されていないこと
以下のように表示されていれば成功です。
ダッシュボードをインポートする
あらかじめ設定が済んでいるテンプレートを使ってダッシュボードを作成します。
ダッシュボードアイコン  にカーソルを乗せると表示される「Dashboards」メニューから[import]をクリックします。
 にカーソルを乗せると表示される「Dashboards」メニューから[import]をクリックします。

[Import via panel json]のテキストボックスへ、以下のテキストを入力(貼り付け)します。
{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 0,
  "id": 3184,
  "links": [],
  "panels": [
    {
      "datasource": null,
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "thresholds"
          },
          "mappings": [
            {
              "from": "",
              "id": 1,
              "text": "中",
              "to": "",
              "type": 1,
              "value": "1"
            },
            {
              "from": "",
              "id": 2,
              "text": "満",
              "to": "",
              "type": 1,
              "value": "2"
            },
            {
              "from": "",
              "id": 3,
              "text": "少",
              "to": "",
              "type": 1,
              "value": "0"
            }
          ],
          "max": 2,
          "min": 0,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "super-light-blue",
                "value": null
              },
              {
                "color": "light-blue",
                "value": 1
              },
              {
                "color": "semi-dark-blue",
                "value": 2
              }
            ]
          }
        },
        "overrides": [
          {
            "matcher": {
              "id": "byName",
              "options": "C"
            },
            "properties": [
              {
                "id": "displayName",
                "value": "amount_water"
              }
            ]
          }
        ]
      },
      "gridPos": {
        "h": 11,
        "w": 5,
        "x": 0,
        "y": 0
      },
      "id": 2,
      "options": {
        "displayMode": "lcd",
        "orientation": "vertical",
        "reduceOptions": {
          "calcs": [
            "last"
          ],
          "fields": "",
          "values": false
        },
        "showUnfilled": true,
        "text": {}
      },
      "pluginVersion": "7.5.10",
      "targets": [
        {
          "datatype": "standard",
          "devicetype": "subscribers",
          "hide": true,
          "properties": "ch1",
          "refId": "A",
          "target": "",
          "type": "timeseries"
        },
        {
          "datatype": "standard",
          "devicetype": "subscribers",
          "hide": true,
          "properties": "ch2",
          "refId": "B",
          "target": "",
          "type": "timeseries"
        },
        {
          "datasource": "__expr__",
          "expression": "$A+$B",
          "hide": false,
          "refId": "C",
          "type": "math"
        }
      ],
      "title": "残量",
      "type": "bargauge"
    },
    {
      "alert": {
        "alertRuleTags": {},
        "conditions": [
          {
            "evaluator": {
              "params": [
                0.1
              ],
              "type": "lt"
            },
            "operator": {
              "type": "and"
            },
            "query": {
              "params": [
                "A",
                "5m",
                "now"
              ]
            },
            "reducer": {
              "params": [],
              "type": "last"
            },
            "type": "query"
          }
        ],
        "executionErrorState": "keep_state",
        "for": "1m",
        "frequency": "1m",
        "handler": 1,
        "name": "残量 alert",
        "noDataState": "keep_state",
        "notifications": [
          {
            "uid": ""
          }
        ]
      },
      "aliasColors": {},
      "bars": true,
      "dashLength": 10,
      "dashes": false,
      "datasource": null,
      "fieldConfig": {
        "defaults": {},
        "overrides": []
      },
      "fill": 1,
      "fillGradient": 0,
      "gridPos": {
        "h": 8,
        "w": 18,
        "x": 5,
        "y": 0
      },
      "hiddenSeries": false,
      "id": 4,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "hideEmpty": false,
        "hideZero": false,
        "max": false,
        "min": false,
        "rightSide": false,
        "show": false,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "nullPointMode": "null",
      "options": {
        "alertThreshold": true
      },
      "percentage": false,
      "pluginVersion": "7.5.10",
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "datatype": "standard",
          "devicetype": "subscribers",
          "hide": true,
          "properties": "ch1",
          "refId": "A",
          "target": "",
          "type": "timeseries"
        },
        {
          "datatype": "standard",
          "devicetype": "subscribers",
          "hide": true,
          "properties": "ch2",
          "refId": "B",
          "target": "",
          "type": "timeseries"
        },
        {
          "datasource": "__expr__",
          "expression": "$A+$B",
          "hide": false,
          "refId": "C",
          "type": "math"
        }
      ],
      "thresholds": [
        {
          "colorMode": "critical",
          "fill": true,
          "line": true,
          "op": "lt",
          "value": 0.1,
          "visible": true
        }
      ],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "履歴",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "$$hashKey": "object:1072",
          "decimals": 0,
          "format": "short",
          "label": "残量",
          "logBase": 1,
          "max": "2",
          "min": "0",
          "show": true
        },
        {
          "$$hashKey": "object:1073",
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "datasource": null,
      "description": "",
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "thresholds"
          },
          "custom": {
            "align": "center",
            "displayMode": "auto",
            "filterable": false,
            "width": 110
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              }
            ]
          },
          "unit": "none"
        },
        "overrides": [
          {
            "matcher": {
              "id": "byRegexp",
              "options": "^入力\\d$"
            },
            "properties": [
              {
                "id": "custom.displayMode",
                "value": "color-background"
              },
              {
                "id": "thresholds",
                "value": {
                  "mode": "absolute",
                  "steps": [
                    {
                      "color": "green",
                      "value": null
                    },
                    {
                      "color": "super-light-blue",
                      "value": 0
                    },
                    {
                      "color": "dark-blue",
                      "value": 1
                    }
                  ]
                }
              },
              {
                "id": "custom.width",
                "value": 60
              }
            ]
          },
          {
            "matcher": {
              "id": "byRegexp",
              "options": ".+イベント$"
            },
            "properties": [
              {
                "id": "mappings",
                "value": [
                  {
                    "from": "",
                    "id": 1,
                    "text": "",
                    "to": "",
                    "type": 1,
                    "value": "NA"
                  },
                  {
                    "from": "",
                    "id": 2,
                    "text": "死活監視",
                    "to": "",
                    "type": 1,
                    "value": "KA"
                  },
                  {
                    "from": "",
                    "id": 3,
                    "text": "テスト送信",
                    "to": "",
                    "type": 1,
                    "value": "TS"
                  }
                ]
              }
            ]
          },
          {
            "matcher": {
              "id": "byName",
              "options": "日時 (by SORACOM)"
            },
            "properties": [
              {
                "id": "custom.width",
                "value": 180
              }
            ]
          }
        ]
      },
      "gridPos": {
        "h": 8,
        "w": 18,
        "x": 5,
        "y": 8
      },
      "id": 10,
      "options": {
        "showHeader": true
      },
      "pluginVersion": "7.5.10",
      "targets": [
        {
          "datatype": "table",
          "devicetype": "subscribers",
          "refId": "A",
          "target": "",
          "type": "timeseries"
        }
      ],
      "title": "データテーブル (最新順)",
      "transformations": [
        {
          "id": "organize",
          "options": {
            "excludeByName": {
              "binaryParserEnabled": true,
              "serial_number": true
            },
            "indexByName": {
              "RSSI": 3,
              "alive_monitoring": 9,
              "battery": 4,
              "binaryParserEnabled": 11,
              "ch1": 5,
              "ch1_ascii": 6,
              "ch2": 7,
              "ch2_ascii": 8,
              "sequence_number": 2,
              "serial_number": 1,
              "test": 10,
              "time": 0
            },
            "renameByName": {
              "RSSI": "RSSI (電波強度)",
              "alive_monitoring": "死活監視イベント",
              "battery": "バッテリー状態",
              "ch1": "入力1",
              "ch1_ascii": "入力1 (文字列)",
              "ch2": "入力2",
              "ch2_ascii": "入力2 (文字列)",
              "sequence_number": "シーケンス番号",
              "serial_number": "シリアル番号",
              "test": "テスト送信イベント",
              "time": "日時 (by SORACOM)"
            }
          }
        },
        {
          "id": "sortBy",
          "options": {
            "fields": {},
            "sort": [
              {
                "desc": true,
                "field": "日時 (by SORACOM)"
              }
            ]
          }
        }
      ],
      "type": "table"
    },
    {
      "dashboardFilter": "",
      "dashboardTags": [],
      "datasource": null,
      "fieldConfig": {
        "defaults": {},
        "overrides": []
      },
      "gridPos": {
        "h": 3,
        "w": 5,
        "x": 0,
        "y": 11
      },
      "id": 8,
      "limit": 10,
      "nameFilter": "",
      "onlyAlertsOnDashboard": false,
      "pluginVersion": "7.5.10",
      "show": "current",
      "sortOrder": 1,
      "stateFilter": [],
      "title": "アラート状況",
      "type": "alertlist"
    },
    {
      "datasource": null,
      "description": "",
      "fieldConfig": {
        "defaults": {
          "color": {
            "mode": "thresholds"
          },
          "custom": {
            "align": null,
            "filterable": false
          },
          "mappings": [],
          "thresholds": {
            "mode": "absolute",
            "steps": [
              {
                "color": "green",
                "value": null
              }
            ]
          }
        },
        "overrides": []
      },
      "gridPos": {
        "h": 2,
        "w": 5,
        "x": 0,
        "y": 14
      },
      "id": 12,
      "options": {
        "showHeader": false
      },
      "pluginVersion": "7.5.10",
      "targets": [
        {
          "datatype": "table",
          "devicetype": "subscribers",
          "refId": "A",
          "target": "",
          "type": "timeseries"
        }
      ],
      "title": "シリアル番号",
      "transformations": [
        {
          "id": "groupBy",
          "options": {
            "fields": {
              "serial_number": {
                "aggregations": [],
                "operation": "groupby"
              }
            }
          }
        }
      ],
      "type": "table"
    }
  ],
  "refresh": "1m",
  "schemaVersion": 27,
  "style": "dark",
  "tags": [],
  "templating": {
    "list": []
  },
  "time": {
    "from": "now-1h",
    "to": "now"
  },
  "timepicker": {
    "refresh_intervals": [
      "5s",
      "10s",
      "30s",
      "1m",
      "5m",
      "15m",
      "30m",
      "1h",
      "2h",
      "1d"
    ],
    "time_options": [
      "5m",
      "15m",
      "1h",
      "6h",
      "12h",
      "24h",
      "2d",
      "7d",
      "30d"
    ]
  },
  "timezone": "",
  "title": "貯水タンク残量管理",
  "uid": "",
  "version": 23
}

貼り付けたら[Load]をクリックします。
Loadをクリックすると”Not valid JSON”と表示される
テキストが上手く入力できていない場合は以下のように表示されます。
貼り付けたテキストを見直すようにしてください。
Harvestで「Harvest」を選択し、「import」をクリックします。

確認できたら[Import]をクリックします。以下のように表示されていれば成功です

「Access denied to this dashboard」と表示されることがあります
[Folder] で「General」を選択して [Import] をクリックすると、「Access denied to this dashboard」と表示されますが、動作に影響はありません。
Importのクリック時に “Quota reached” と表示された場合は、ダッシュボード作成上限に達しています。Freeの場合はダッシュボードは最大1つであるため、既存のダッシュボードを削除してから再度本作業を行ってください。
複数のダッシュボードを同時に扱いたい場合は、Makers以上のプランをご検討ください。詳しくはSORACOM Lagoon / 各プランの違いをご覧ください。
パネルの調整と、ダッシュボードの保存
どのデータを表示するのか調整していきます。
“残量” > [Edit] をクリックします

”Query”タブで、以下のようにAとBそれぞれで、マルチコンバーターに取り付けたSIMを選択します

設定し終わったら、右上の [Apply] をクリックして、ダッシュボードに戻ります。
この作業を「シリアル番号」「履歴」「データテーブル (最新順)」の各パネルで繰り返し行います。
※「アラート状況」については、行う必要はありません。
プルダウンに 登録したSIM が無い?
左から2番目のプルダウンについては、事前に名前をつけた場合はその名前、名前がついていない場合は SIM の IMSI (回線識別用の15桁の番号) が表示されます。
データが表示されていない?
データを蓄積し始めてから間もない場合、グラフの右端に「少しだけ」表示されている場合があります。これは、パネルの表示時間の標準が「過去6時間分」を表示するようになっているからです。
画面右上の  をクリックすることでこれまでの作業を保存できます。
をクリックすることでこれまでの作業を保存できます。
アラートの調整と、ダッシュボードの保存
“履歴” > [Edit] をクリックします

“Alert” タブをクリックします。その時表示される “Notifier with invalid identifier is deleted” ダイアログは [Cancel] をクリックします。

“Notifications”の部分までスクロールします。
[Send to]の  をクリックし、先ほど作成した通知先 (例に沿っているなら email)を選択します。
をクリックし、先ほど作成した通知先 (例に沿っているなら email)を選択します。
画面右上の[Apply]ボタンをクリックします。

画面右上の  をクリックすることでこれまでの作業を保存できます。
をクリックすることでこれまでの作業を保存できます。
[Save]で保存します。
以上ですべての設定が終了です。
挙動を確認してみる
実際に水を貯めてみましょう。「残量」は水の量に合わせて以下のように表示されます。
| 貯水タンクの水位 | 「残量」の表示 | 
|---|---|
| 下側のスイッチよりも低いとき | 空 | 
| 下側のスイッチと上側のスイッチの間のとき | 中 | 
| 上側のスイッチよりも高いとき | 満 | 

また、水位が「少」となった場合は “Alerting” 水位が回復(中/満)になれば “OK” という通知がメールで届きます。

以上ですべての設定が完了です。
アラートがすぐに来ない?
水位が変化してもすぐにアラートが来ないと思います。これは、SORACOM Lagoonでアラートを1分後に送るようにしているからです。
これはデータが送信されるタイミングに少し差があることを考慮してミスアラートが出ないようにするためです。
No dataと表示されてしまう
マルチコンバーターは、センサーに反応したときのみデータが送信される仕組みです。そのため、長期にわたって同じ水位であった場合は、期間内のデータが存在しなかったことを示す「No data」という表記になります。
これについては、Lagoonのデータ表示期間を長くすることで対処できます。例えば過去24時間を表示対象にするという方法です。
あとかたづけと注意事項
本レシピでは費用がかかるサービスを利用しています。
本項をよく読み、必要な操作や解除作業を行うようにして、想定外の費用が掛からないようにしてください。
費用について
ここで記載している金額は全て税込み、送料別となります。
SORACOM プラットフォームの利用料金
| サービス/機能 | 料金 | 
| SORACOM Air (plan-D) | 基本料: 11円/日通信料: 0.22円~/MB(今回の利用であれば 1MB 以内で収まる範囲) | 
| SORACOM Harvest Data | 本機能を有効にしたグループに所属する1SIMあたり5.5円/日 (2000リクエスト/日/SIMを含む)2000リクエスト/日を超えた分は0.0044円/リクエスト | 
| SORACOM Lagoon | 今回は Free プラン(無料)を使用しました。 | 
無料利用枠について
SORACOM サービスでは一部サービスにおいて無料枠が設定されています。たとえば SORACOM Air for セルラーであればアカウント毎で30円/月の通信分や、SORACOM Harvest Data であれば31日分の書込みリクエストなどです。料金詳細に「無料利用枠」として掲載されていますので、ご確認ください。
グループ解除
SORACOM Harvest Data 等、「機能が有効になっているグループに所属している SIM × 費用」となっているサービスにおいては、「機能を OFF にする」することで費用の発生を抑えることができます。またもう1つの方法として「グループに所属している SIM の数を減らす(= 解除する)」事でも費用を抑える事ができます。
また、SORACOM Funk はリクエスト発生時毎の従量課金となっているため、作成したグループ内の設定が SORACOM Funk のみとなっていれば、リクエストが発生しなければ費用は発生しません。
グループ解除の方法はグループからの解除 (JP)をご覧ください。
SORACOM Harvest Data のデータ削除(任意)
SORACOM Harvest Data は基本的にはデータ保管料は無料※です。そのため、保存しておいても害はありませんが、デモ等で利用する際にはデータを綺麗にしておく必要が出てくるため、データ削除について解説します。
※発生から40日を超えたデータは削除されます。40日以上データを保管したい場合はデータ保持期間延長オプション利用料金をご利用ください。
SORACOM Harvest Data 画面 ([操作]>[データを確認]) のデータテーブルで、削除したいデータのチェックボックスを付けた後に[削除]をクリックします。表示されたダイアログで改めて[削除]をクリックすると、削除されます。
※ 複数のデータにチェックをつければ一括で削除可能です。

データの復元はできませんのでご注意ください。
SORACOM Lagoon の解約
SORACOM Lagoon はオンラインで解約が可能です。 Free プランであれば有効化しておいても費用は発生しませんが、長期に渡って利用しない場合には解約も選択いただけます。
解約の方法はSORACOM Lagoon の解約(JP)をご覧ください。
次のステップ
本レシピでは、マルチコンバーターとフロートスイッチを用いた水量監視システムを構築しました。
マルチコンバーターを使えば、フロートスイッチ以外にも接点信号やパルス信号を出力するセンサーなんでもIoT化することができます。ぜひ挑戦してみてください。