NefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化するメモ

1ヶ月ほどトライアンドエラーを繰り返したNefryBTをIBM Watson IoT Platform (QuickStart) にデータ送信&可視化するメモです。

今日、いままでの知見を集めて、落ち着いてやってみたらうまくいったのでメモしておきます。

今回の仕組み

今回の仕組みです。

image

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

image

このように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の送受信だけにシンプルにしたもので無事接続されました。

ざっくり流れだけですが、

image

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

image

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

image

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でやります。

IBM Watson IoT Platform

image

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

image

デバイス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がつながる状態で動かしてみます!

image

押してない状態。

image

押してみます。これを繰り返します。

さきほど、表示していたIBM Watson IoT Platformの画面を見てみましょう。

image

無事、データが送信されています!

まとめ

ということで、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 を!