見出し画像

GrafanaでAlert通知してみた。― 前編 ー

先月(10月)上旬にある企業を訪問するまで Grafana を知りませんでした。「おいおいそんなんで支援の仕事ができるのかよ。」と言われそうですが本当なので仕方ありません。わたしもそう思ったのですぐに使ってみることにしました。Grafana が何なのかを調べるとデータベースが必要だと分かったので対応しているデータベースから時系列データ用の InfluxDB を使うことにしました。ということでこの前編では InfluxDB にM5Stack を使ってデータを送信するまでの設定と手順を報告します。


InfluxDB Cloud アカウント登録

InfluxDB Cloud の公式サイトにアクセスしてアカウント登録します。

Bucketの作成

データの入れ物である Bucket (バケツ)を作ります。左側のメニューからBucket を選択します。

Load Data のタブ BUCKETS が選択された画面が表示されるのでボタン +CREATE BUCKET をクリックします。

Nameに Bucket の名称を入力しボタン CREATE クリックします。

API Tokenの作成

上部のタブ API TOKENS を選択し、ボタン +CREATE API TOKEN をクリックして Custom API Token を選択します。

識別のための適切な記述を Description に入力し、作成した Bucket Write 欄にチェックを入れてボタン GENERATE をクリックします。

API Token が表示されるので、ボタン COPY TO CLIPBOARD をクリックしてメモ帳などで保存します。

接続情報の確認

InfluxDB にデータを送るために必要な情報(API Token 以外)を確認するために上部の登録済み組織のタブをクリックします。

SETTINGS タグ内の Cluster URL を ボタン COPY TO CLIPBOARD でコピーしてメモ帳などで保存します。

続いて Organization ID を ボタン COPY TO CLIPBOARD でコピーしてメモ帳などで保存します。

Arduino開発環境でプログラム作成

左側のメニュー Load Data(上向き矢印のアイコン)で Sources を選択して表示される画面の下の Arduino アイコンをすことでウィザードに進むと API Token( All Access API Token )が発行されてサンプルプログラムが表示されます。しかしながらすでに書き込み ”Write” 限定の API Token を作成したのでウィザードには進みません。

ウィザードで表示されるプログラムは下記のとおりです。メモ帳などで保存した API Token、Cluster URL、Organaizatio ID と Bucket の名称をそれぞれの記載場所で置き換えてください。
InfluxDbClient.h と InfluxDbCloud.h をインクルードするために必要なライブラリ ESP8266 Influxdb をインストールします。
さらに、わたしはM5Stack Core2 for AWS を使用したので M5Core2 をインストールして M5Core2.h をインクルードしました。

ちなみにわたしのプログラム開発環境はつぎのとおりです。

  • OS:Windows10

  • エディタ:Visual Studio Code

  • プラグインフレームワーク:PlatformIO

  • 開発フレームワーク:arduino

// from the web site of InfluxDB
// https://us-east-1-1.aws.cloud2.influxdata.com/orgs/64de506a597eb6f9/new-user-setup/arduino

#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP8266"
#endif

#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>

// WiFi AP SSID
#define WIFI_SSID "YOUR_WIFI_SSID"
// WiFi password
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"

#define INFLUXDB_URL "***** Cluster URL *****"
#define INFLUXDB_TOKEN "***** API Token *****"
#define INFLUXDB_ORG "***** Organization ID *****"
#define INFLUXDB_BUCKET "***** Bucket Name *****"

// Time zone info
#define TZ_INFO "UTC9"

// Declare InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);

// Declare Data point
Point sensor("wifi_status");

void setup() {
  Serial.begin(115200);

  // Setup wifi
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to wifi");
  while (wifiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }
  Serial.println();

  // Accurate time is necessary for certificate validation and writing in batches
  // We use the NTP servers in your area as provided by: https://www.pool.ntp.org/zone/
  // Syncing progress and the time will be printed to Serial.
  timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");


  // Check server connection
  if (client.validateConnection()) {
    Serial.print("Connected to InfluxDB: ");
    Serial.println(client.getServerUrl());
  } else {
    Serial.print("InfluxDB connection failed: ");
    Serial.println(client.getLastErrorMessage());
  }

  // Add tags to the data point
  sensor.addTag("device", DEVICE);
  sensor.addTag("SSID", WiFi.SSID());
}

void loop() {
  // Clear fields for reusing the point. Tags will remain the same as set above.
  sensor.clearFields();

  // Store measured value into point
  // Report RSSI of currently connected network
  sensor.addField("rssi", WiFi.RSSI());

  // Print what are we exactly writing
  Serial.print("Writing: ");
  Serial.println(sensor.toLineProtocol());

  // Check WiFi connection and reconnect if needed
  if (wifiMulti.run() != WL_CONNECTED) {
   Serial.println("Wifi connection lost");
  }

  // Write point
  if (!client.writePoint(sensor)) {
   Serial.print("InfluxDB write failed: ");
   Serial.println(client.getLastErrorMessage());
  }

  Serial.println("Waiting 1 second");
  delay(1000);
}

ビルドして実行したところ下記のようなエラーが発生しました。

.pio/libdeps/upload_to_influxdb/ESP8266 Influxdb/src/Point.h:39:7: error: redefinition of 'class Point'
 class Point {
       ^~~~~
In file included from .pio/libdeps/upload_to_influxdb/M5Core2/src/M5Touch.h:234,
                 from .pio/libdeps/upload_to_influxdb/M5Core2/src/M5Core2.h:77,
                 from src/main.cpp:1:
.pio/libdeps/upload_to_influxdb/M5Core2/src/utility/PointAndZone.h:153:7: note: previous definition of 'class Point'
 class Point {
       ^~~~~

クラス Point が重複定義されているようです。ネットを検索していろりろと試してみましたが解決できませんでした。
CやC++のプログラミングの知識が浅いことが原因だと自覚しているものの、先に進むことを優先してとりあえずライブラリ ESP8266 influxdb のPoint.h と Point.cpp 内のクラス名 Point を別の名前に変更しました。
最も手間のかかる方法でしたがエラーは解消しました。後日もっといい方法を捜したいと思います。※読者の方々からのアドバイスは大歓迎です。

InfluxDBに保存されたデータの確認

左側のメニュー(折れ線グラフのアイコン)Data Explorer をクリックします。

Bucket と Measurement を選択し RUN をクリックしてデータが表示されるのを確認します。

ボタン Table がクリックされた状態ならデータが表示され、ボタン GRAPH がクリックされた状態ならグラフが表示されるはずです。
以上が M5Stack Core2 for AWS から InfluxDB へデータを送信する設定と手順の報告です。後編では InfluxDB のデータを Grfana への送ってダッシュボードに表示する部分を報告します。

この記事が気に入ったらサポートをしてみませんか?