NefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化するメモ
1ヶ月ほどトライアンドエラーを繰り返したNefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化するメモです。
今日、いままでの知見を集めて、落ち着いてやってみたらうまくいったのでメモしておきます。
今回の仕組み
今回の仕組みです。

D2ポートにGrove タッチセンサーをつないでNefry BT R2を準備します。

このようにNefry BTにつないだタッチセンサーのデータをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化します。
Nefry BT R2 がしっかりMQTTできるか試しておく
そういえば、Nefry BT R2はMQTT接続はじめてなので試しておきます。(Nefry BT 無印は確認済み)
- Nefry ライブラリバージョン
- 1.2.0
- Nefry BT R2 LCDディスプレイ
- 装着済み
- Arduino IDE バージョン
- 1.8.5 Windows
Node-RED MQTTブローカー経由でNefryBT+フルカラーテープLEDを動かすメモ この記事をMQTTの送受信だけにシンプルにしたもので無事接続されました。
ざっくり流れだけですが、

Node-REDでMQTT Broker ノードを使ってMQTTを受け付けるようにして、

D2を押すと内部的には反応し、

Node-REDに無事データが受信できています。ちゃんとMQTTとWi-Fi機能してますね!
ESPまわりでうまくいった文献を探す
いろいろと探しました。
- ESP8266系の成功記事を置き換えてみる
- NG:ESP8266WiFiがスタートになっててうまく置き換えられず
- Mosquitoを利用したコマンドラインから叩くMQTT仕様を読み解く
- NG:QuickStartではないトークン付きの記事が多く読み解けず
どれもNG。無念。自分の力が足りないとしか言いようがないですが、地道に探していたところ、以下の記事がNefry BTへの移植に相性が良さそうでした。
Connect an ESP32 to the Watson IoT Platform!
PubSubClient・WiFiClientクラスの扱いが、私のアプローチと近いので移植しやすそうで光明が見えます。
IBM Watson IoT Platform の準備(QuickStart)
まずつながるとテンションが上がるので、おなじみQuickStartでやります。

こうやってすぐ試せるのはありがたいところ。

デバイスIDを「NefryBT_123456789」で待っておきます。これは、のちほど、Nefry BTのプログラムで設定するデバイスIDと一致させたいので間違えないようにしましょう。
プログラムを書いていく
ということで、Connect an ESP32 to the Watson IoT Platform!の記事を参考にプログラムを改修していきます。
#include <Nefry.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
//-------- Customise these values -----------
// 接続先のIBM Watson IoT Platform
#define ORG "quickstart" // your organization or "quickstart"
// デバイスタイプはNefry BTで
#define DEVICE_TYPE "nefrybt" // use this default for quickstart or customize to your registered device type
// デバイスIDは以下で
#define DEVICE_ID "NefryBT_123456789" // use this default for quickstart or customize to your registered device id
// quickstartでは使わないが宣言はしておく
#define TOKEN "<yourDeviceToken>" // your device token or not used with "quickstart"
//-------- Customise the above values --------
// 実際の接続するための設定群
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
// WiFiClient準備
WiFiClient wifiClient;
// 入力の状態記録
int sensorValueState = LOW;
// ポート番号
const int port = 1883;
// 今回センサーがつながったピン番号 D2
int PIN = D2;
// MQTT接続のための準備
// QuickStartのため server , port だけ。あとはwifiClient紐付け。
PubSubClient client(server, port, wifiClient);
void setup() {
pinMode(PIN,INPUT);
Serial.begin(115200);
}
void loop() {
String payload;
// MQTT再接続処理
if (!!!client.connected()) {
Serial.print("Reconnecting client to "); Serial.println(server);
while (!!!client.connect(clientId, authMethod, token)) {
Serial.print(".");
delay(500);
}
Serial.println();
}
// センサー反応判定
int sensorValueCurrent = digitalRead(PIN);
if ( sensorValueCurrent != sensorValueState ) {
if( sensorValueCurrent == HIGH ){
Serial.println("sensor ON");
// IBM Watson IoT Platformに合わせてデータ構造をつくる flag = 1
payload = "{ \"d\" : {\"flag\":1} }";
} else {
Serial.println("sensor OFF");
// IBM Watson IoT Platformに合わせてデータ構造をつくる flag = 0
payload = "{ \"d\" : {\"flag\":0} }";
}
// データ送信
Serial.print("Sending payload: ");
Serial.println(payload);
if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
} else {
Serial.println("Publish failed");
}
}
// 入力の状態を次のループまで記憶
sensorValueState = sensorValueCurrent;
delay(3000);
}
こちらをNefry BTに書き込みます。
動かしてみる!
Wi-Fiがつながる状態で動かしてみます!

押してない状態。

押してみます。これを繰り返します。
さきほど、表示していたIBM Watson IoT Platformの画面を見てみましょう。

無事、データが送信されています!
まとめ
ということで、NefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化できました。
IBM Watson IoT PlatformはシンプルなMQTTの構造をしていたのでNefry BTでもすぐつながるだろうと思っていましたが、接続するためのその周辺の情報、送信時のデータの形式・トークン・サーバーの送信先あたりが適切に設定できておらず、かなりハマってしまいました、QuickStartとはいえ無事につながって良かったです。
publishだけでなく、Subscribeや、しっかり自分用のIBM Watson IoT Platformを立てた際も試していこうと思います。
それではよき、Nefry BT & IBM Watson IoT Platform Life を!