Wio 3GからSlackにメッセージ投稿 (実装編)

Seeed K.K.の中井です。

今回は直接インターネットにつながるWio 3Gを利用して温度センサーから取得したデータを、Slackにメッセージ投稿するところまでやってみたいと思います。 Slackにメッセージ投稿するまでの準備編も記事にしていますので、そちらも参考にしてください。

f:id:mnakai:20200227112438j:plain

使用するデバイスはコチラです。 soracom.jp

jp.seeedstudio.com

ビルド環境は、Arduino IDEを利用します。 Wioシリーズの開発環境のセットアップ方法についてはコチラのドキュメントを参考にしてください。

開発環境のセットアップ | Wiki

GroveDriverPack

今回は温湿度センサーとして「Grove - I2C High Accuracy Temp&Humi Sensor (SHT35)」を用います。Arduino用ライブラリには「GroveDriverPack」を利用したいと思います。

github.com

GroveDriverPackは、Wio 3GWio LTE Cat.1LTE M1/NB1(BG96)などに対応したGroveモジュールのクラスライブラリの集合体です。 多くのGroveモジュールに対応しておりサンプルが豊富なため、また、実機で動作確認されているため、すばやく開発が可能となります。

実際にWio 3G + SHT35の動作確認を、「Grove - I2C High Accuracy Temp&Humi Sensor(SHT35)」ライブラリでもやってみたのですが、 ポート名の変更、正しく動作せずにデバッグ、修正、、、と余計に時間がかかってしまいました。

GitHub - Seeed-Studio/Seeed_SHT35

では、Arduino IDEに「GroveDriverPack」をインストールしましょう。「Wio_cell_lib_for_Arduino」のときと手順は同じです。

  • Arduino IDEを開いて、"スケッチ > ライブラリをインクルード > ライブラリを管理"を選択 f:id:mnakai:20200227120205j:plain

  • "GroveDriverPack"で検索して、インストール f:id:mnakai:20200227120233j:plain

SHT35から温度と湿度を取得してみる(動作確認)

GroveDriverPackにはSHT35のサンプルスケッチがありますので、そちらで動作の確認をしてみましょう。

"ファイル > スケッチ例 > GroveDriverPack > GroveTempHumiSHT35" を選択し、スケッチをロード。

作業用PCとWio 3Gを接続して、"スケッチ > マイコンボードに書き込む"を実行。 書き込みが完了した後に、一度作業用PCから取り外して、SHT35をI2Cポートに接続。

f:id:mnakai:20200227120257p:plain

再度PCと接続して、"ツール > シリアルモニタ" などでログを確認。ボーレートは115200です。

Current humidity = 36.31%  temperature = 22.80C
Current humidity = 36.31%  temperature = 22.80C
Current humidity = 36.31%  temperature = 22.81C
Current humidity = 36.31%  temperature = 22.80C
Current humidity = 36.23%  temperature = 22.80C

無事、温度と湿度が取得できました。

Slackにメッセージ投稿

色々と準備に時間がかかりましたが、本題のWio 3GからSlackにメッセージ投稿してみます。

用意したスケッチはコチラです。 サンプルスケッチ GroveTempHumiSHT35にセルラーの初期化コードを追加、 API送信用のslackPostMessage()を追加しています。

#include <GroveDriverPack.h>
#include <WioCellLibforArduino.h>

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"

#define SLACK_URL         "https://slack.com/api/chat.postMessage"
#define TOKEN             "<YOUR ACCESS-TOKEN>"
#define CHANNEL           "<YOUR CHANNEL-ID>"

#define INTERVAL          (60000)

WioCellular Wio;
GroveBoard Board;
GroveTempHumiSHT35 TempHumi(&Board.I2C);

void setup() {
  delay(200);
  SerialUSB.begin(115200);

  Wio.Init();
  Wio.PowerSupplyCellular(true);
  Wio.PowerSupplyGrove(true);
  delay(500);

  Board.I2C.Enable();
  if (!TempHumi.Init()) {
    SerialUSB.println("Sensor not found.");
  }

  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("Connecting to \"" APN "\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("ERROR!");
  }
}

static bool slackPostMessage(int* status, const char* token, const char* channel, const char* text) {
  char* authorization = (char*)malloc(strlen(token) + 8);
  sprintf(authorization, "Bearer %s", token);

  WioCellularHttpHeader header;
  header["Accept"] = "*/*";
  header["User-Agent"] = "Wio 3G";
  header["Connection"] = "Keep-Alive";
  header["Content-Type"] = "application/json";
  header["Authorization"] = authorization;

  char* data = (char*)malloc(strlen(token) + strlen(channel) + strlen(text) + 36);
  sprintf(data, "{\"token\":\"%s\",\"channel\":\"%s\",\"text\":\"%s\"}", token, channel, text);

  bool ret = Wio.HttpPost(SLACK_URL, data, status, header);
  free(authorization);
  free(data);
  return ret;
}

void loop() {
  if (SerialUSB.available() >= 1) {
    switch (SerialUSB.read()) {
    case 'H':
      SerialUSB.println("On heater.");
      TempHumi.SetHeater(true);
      break;
    case 'h':
      SerialUSB.println("Off heater.");
      TempHumi.SetHeater(false);
      break;
    }
  }
  
  TempHumi.Read();
  
  char message[128];
  char tempStr[16], humiStr[16];
  dtostrf(TempHumi.Temperature, 0, 2, tempStr);
  dtostrf(TempHumi.Humidity, 0, 2, humiStr);
  sprintf(message, "Current temperature = %s C, humidity = %s %%", tempStr, humiStr);
  SerialUSB.println(message);

  int status;
  if (!slackPostMessage(&status, TOKEN, CHANNEL, message)) {
    SerialUSB.println("slack.postMessage failed.");
  }

  delay(INTERVAL);
}
  • #define TOKEN "<YOUR ACCESS-TOKEN>"
  • #define CHANNEL "<YOUR CHANNEL-ID>"

この2行は環境に合わせて準備してあるものに置き換えてください。

Wio 3Gに書き込むと、、、

f:id:mnakai:20200227122255j:plain

まとめ

いかがでしたでしょうか? 意外と簡単にSlackにメッセージが投稿できることを体験できたのではないでしょうか。 Slack以外にも、例えばWio Cell lib for Arduinoには、SORACOM HarvestやBeamなどにポストするサンプルが収録されていますので、 色々と試してみると面白いかもしれません。 是非、Wio 3GやWio LTEを使って遊んでみてください!

変更履歴

日付 変更者 変更内容
2020/2/27 mnakai 作成