Wi-Fiより遠くに測定データを飛ばしたい その2 温度を受け取る

 センサなどから収集したデータを無線で近距離(数km)に送るために開発されたsigfoxは、購入元のスイッチサイエンスの解説ページによると、「一つのメッセージのサイズが12バイト、1日のメッセージ回数は140回まで」とのことです。購入したsigfoxボードには、温湿度、気圧を測るBME280、加速度センサMMA8451Qを搭載しています。BME280で温度などを測定するスケッチは、こちらで解説しました。

全体の構成は複雑

 3番目までは前回説明しました。サンプル・スケッチを動かすだけで実行されます。

  •  Arduino UNOのI2CバスにつながれているBME280から温度データを読み出す
  •  ArduinoシールドのSigfox Shield for Arduinoは電波を出して近くの基地局にデータを送る
  •  基地局からはインターネット上にあるSigfoxクラウドに送られる
  •  Sigfoxクラウドから別のIoTを扱うクラウドにデータを送る

 前回のテスト用スケッチで、温度データはコンソールに表示していました。Sigfoxクラウドでは、そのような温度など特定なアプリケーション・データのデコードや保存はしません。12バイトの「温度など」の文字列を受けるだけです。

 なので、送った温度データが30℃以上だから、リレーをONにして電源をシャットダウンしようとかの処理を記述できません。その処理をするためには別のクラウド・サービスを利用し、そのクラウド上では、Sigfoxクラウドと非同期でデータを受け取るプログラムを動かしておきます。データを受け取ったら、そのサービスがもつストレージ機能や境界値の判断などのプログラムを動かします。その結果はMQTTなどを通じて、戻してもらうような利用を考えます。

 サンプルではGoogleのクラウドの例がありますが、日本語では説明が読めません。Asureは一度使ったことがあります。無料の使用権を2万円ほどもらったのですが、1週間で切れてしまいました。クラウド・サービス自体が巨大で、どこをどうして使っていったらよいか、富士山の樹海に迷い込んだ状態になります。マイクロソフトのサービスは、いずれもクレジット・カードを最初に登録しないとスタートできません。

 日本語の解説があって、少ないデータのテストでは使用料がかからないというクラウド・サービスはないものでしょうか。ありました。IBMのIBM Watson IoT Platformです。しかし3日目にcallbacks用にテストしていたnode-REDがアクセスできなくなり、質問を送っても何も返事がないです。

メールを使う

 Arduino + sigfoxシールドを使ってデータを送信すると、フランスのどこかにあるsigfoxクラウドに到着し、約1年間保管されます。削除されないうちにデータを別のところに送るために、二つの手段が用意されています。(※2018年5月31日訂正 10秒->1年)

  • http
  • mail

 httpはインターネットのグローバル・アドレスで受け取らないといけないので、通常クラウドが使われます。mailは普通のメール・ソフトで受け取れます。ここからはmailを使います。mailを送る設定は、callbacksから行います。

sigfoxクラウドの設定

 Device Typeをクリックします。

 Nameの項目にある、登録した「Unabiz Denshi Club kit」をクリックします。

 左のメニューにCallbacksが出るので、クリックし、右にあるNewをクリックします。

 Custom callbacksをクリックします。①ChannelのプルダウンからEmailを選ぶと、②以下の項目が入力できます。②はデータを受けるメール・アドレスです。③は件名です。④はメッセージ本体で、JSON形式にします。

 ④のサンプルです。

{
"time" : "{time}",
"deviceType": "Sensit_2.0",
"device" : "{device}",
"duplicate" : "{duplicate}",
"snr" : "{snr}",
"rssi" : "{rssi}",
"avgSnr" : "{avgSnr}",
"station" : "{station}",
"lat" : "{lat}",
"lng" : "{lng}",
"seqNumber" : "{seqNumber}",
"data" : "{data}"
}

 画面下のOKをクリックして設定は終了です。

メールを受け取る

 ふつうにメールを読むのと同じく、本文にはJSONのテキストでデータなどが送られてきます。

{
"time" : "1524283988",
"deviceType": "Sensit_2.0",
"device" : "73958B",
"duplicate" : "false",
"snr" : "19.93",
"rssi" : "-131.00",
"avgSnr" : "33.65",
"station" : "8634",
"lat" : "36.0",
"lng" : "140.0",
"seqNumber" : "195",
"data" : "920e0000b0510f0194592000"
}

 プログラミングに慣れていれば、メールを受信し、"data"の部分を抜き出し、二つ目のデータb0510f01の10fを抜き出して16進から10進に直すと10倍された温度データが読み取れます。

 ここでは、ラズパイでnode-REDを動かし、温度を読み取ります。GUIベースですが、javascriptを少し記述します。

ラズパイのOSをインストール

 node-REDは、IBMの開発したGUIでIoTを扱える開発環境です。ラズパイのOSであるRaspbianにはインストールされていて、メニューから選ぶだけで実行されます。

 2018-4-18版をダウンロードします。zipファイルを解凍し、マイクロSDメモリにWin32 Disk Imagerで書き込みます。一度使ったことのあるマイクロSDメモリは、Windows 10の最新バージョンでは正しく認識されないので、SD Card Formatterでフォーマットしてから利用します。マイクロSDメモリのドライブ番号を確認しながら作業を進めます。マイクロSDメモリをカード・リーダに挿入したときに出る「ドライブX:を使うにはフォーマットする必要があります。」は無視して、そのままにしておきます。

 エクスプローラでドライブ番号を確認します。D: です。ここでは一度使っているので、bootという名前が見えています。

 SD Card Formatterを立ち上げます。D: が選択されていることを確認して「フォーマット」をクリックします。

 ダウンロードしたzipファイルをダブルクリックし、2018-04-18-raspbian-stretch.imgをデスクトップにドロップします。

 解凍されます。

 

 Win32 Disk Imagerを立ち上げ、解凍されてデスクトップにある2018-04-18-raspbian-stretch.imgを読み込みます。書き込むドライブ番号を確認します。ここではD: です。WriteをクリックしてOSのイメージをマイクロSDメモリに書き込みます。数分かかります。書き込みが成功したという画面が出たらExitで終了します。

 「ドライブX:を使うにはフォーマットする必要があります。」が再度出るかもしれませんが、キャンセルします。最初に出た同じメッセージの出た画面でもキャンセルします。

 書き込んだマイクロSDメモリをラズパイに挿しこみ、電源をつないで起動します。

ラズパイのOSを最新に

 ターミナルから、

sudo apt-get update
sudo apt-get upgrade -y
sudo rpi-update

を実行し、最新状態にします。リブートします。

uname -a

を実行すると、カーネルは4.14.34でした。

 メイン・メニューのProgramming からNode-REDを選択します。

 node-REDが起動します。

 画面右上の矢印のアイコンの上にマウス・カーソルを持っていくとIPアドレスが表示されるので、メモします。

 PCのWebブラウザから、メモしたhttp://192.168.111.103:1880/をURLに入れます。node-REDを利用する準備ができました。

gmailの設定

 筆者はgmailを使っています。node-REDにあるemailは、そのままではgmailが使えません。Webでメールを読んでいる場合は、右上にあるアカウントのアイコンをクリックしてアカウントの設定を変更します。emailは、IMAP/POP3の受信ソフトです。

 「ログインとセキュリティ」へ行きます。

 「アカウントにアクセスできるアプリ」にある「安全性の低いアプリの許可」という項目を無効から有効に変更します。

 IMAPでGmailにアクセスするときの認証方式OAuth 2.0を無効にしたので、安全性は下がります。1時間ほどたつと、変更が有効になるようです。

(※)参考 http://www.atmarkit.co.jp/ait/articles/1409/03/news109.html

node-REDのemail設定

 左のソーシャル・グループからemailを中央のエリアにドロップし、ダブルクリックします。設定画面で、受信するメール・アドレスとパスワードを入れ、完了をクリックします。

 左の出力グループにあるdebugをドロップし①、アイコンのぽっち同士をマウスでつなげます②。デプロイをクリックすると③、デプロイが成功しましたと画面上部に出るので、デバッグのタブをクリックします④。debugノードは、ドロップした時点で、表示が「msg.payload」に変わっています。

 画面左の機能グループにあるfunctionをemailとdebugを結んだ線の上に持っていき、実線が点線に変化したら、ドロップします。functionをダブルクリックします。コード領域の2行目にreturn msg;と書かれています。次のjavascriptを貼り付けて置き換えます。

try {
if ( ~msg.payload.indexOf('73958B') ) {
return msg;
}
} catch(exception) {

}

 筆者のsigfoxシールドのIDが73958Bなので、この文字列があったら受信したメールを次のノードへ送り、そうでないならば、無視するというプログラムです。名前に「ID抽出」と入力しました。node-REDでは、メッセージを加工しながら次のノードへ送るという操作をします。

 sigfoxクラウドからのメールを取り出せたので、本文のJSON形式をプログラムで扱えるオブジェクトに変換します。左の機能グループからjsonを「ID抽出」と「debug」を結んでいる線の上に持ってきて、点線になったらドロップします。jsonをダブルクリックして設定画面で動作を「常にJavaScriptオブジェクトに変換」に変更し、完了をクリックします。

 最初にemailで受信したメールの中から、sigfoxクラウドからメールを選択し、平文のJSON形式のテキストを、javascriptで扱えるデータ形式に変換しました。

 温度が入っているのは、

"data" : "920e0000b0510f0194592000"

 この項目です。この部分を抜き出すために、新しいfunctionを「json」と「debug」を結ぶ線上にドロップします。functionをダブルクリックします。

 sigfoxクラウドから送られてくるデータの中で最初のctrは920eとデコードされています。

msg.addField("ctr", counter); // 4 bytes for the counter.
msg.addField("tmp", temperature); // 4 bytes for the temperature.
msg.addField("vlt", voltage); // 4 bytes for the voltage.

 その"920e"を目印に、12番目から3バイト取り出し、16進数に変換します。温度が10倍された表記で得られるので、10で割ります。この値を次のノードへ送ります。functionの名前は「データの抽出」にしました。 コードに下記のプログラムを貼り付けて完了をクリックします。

if (~msg.payload.data.indexOf('920e') ){
msg.payload = parseInt(msg.payload.data.substring(11,14),16 ) / 10 ;
return msg;
}

 デプロイをクリックします。gmailの「安全性の低いアプリの許可」が無効になるまで待ちます。

 node-REDは左から右へメッセージmsgが流れ、必要があれば加工します。メッセージの本体はpayloadなので、オブジェクトはmsg.payloadでアクセスできます。emailで受信したとき、メールの本文自体がmsg.payloadです。JSONフォーマットに変換したら、dataのデータは、はオブジェクトmsg.payload.dataでアクセスできるようになります。

プログラム

 上記のGUIのプログラムです。リスト内をダブルクリックで全選択し、CTRL-Cでコピーします。

 node-REDの中央部分にマウスを持っていき、CTRL-Iでフローをクリップボードから読み込み画面を出し、CTRL-Vで貼り付け、「読み込み」をクリックします。メール・アドレスは、利用するアドレスに書き換えてください。

[{"id":"b1abece.feba91","type":"e-mail in","z":"839b83ab.975e6","name":"","protocol":"IMAP","server":"imap.gmail.com","useSSL":true,"port":"993","box":"INBOX","disposition":"Read","repeat":"300","x":90,"y":80,"wires":[["8efd01a9.8a336"]]}]

 以上の設定で、Arduino UNO + sigfoxシールド上のセンサBME280が測った温度が、無線で近くのsigfox基地局に届き、インターネットを経由してフランスのsigfoxクラウドに届きます。そこからメールがgmailのサーバに送られ、自宅でインターネットにつながっているラズパイのnode-REDのemail(IMAPクライアント)で読み出し、dataに入っている温度を取り出し、デバッグ・ウインドウに表示しました。

動作確認

 具体的に、フィールドに持ち出して動作を確認しました。

 LED電球はモバイル・バッテリの代わりに使っています。

前へ

Wi-Fiより遠くに測定データを飛ばしたい その1 登録と接続

次へ

Blinkから始まるArduino入門 その4 複数LED