HAT-YUNの観測データをinfluxDBに入れる


目標

HAT-YUNで観測した値をデータベースに入れて記録したい。かっこいいグラフ表示とか出来たらもっといいよね!

材料

・M5Stick-C
https://www.switch-science.com/catalog/5517/
・YUN-HAT
https://www.switch-science.com/catalog/6072/
・InfluxDBが動いてるサーバ
今回はUbuntuのパッケージにあったInfluxDB 1.1.1を使いましたが、現時点での最新バージョンは1.8.3です。動作確認出来た方がいましたらコメントお願いします。

初期設定

動作確認

Arduinoを開いて、
ファイル>スケッチ例>M5StickC>Hat>YUN
に、公式のサンプルソースがあるので、開いて書き込みます。

// Adafruit_BMP280 lib in Sketch->Includ Library->Library Manager

とあるので、Adafruit_BMP280ライブラリをインストール。

書き込み時に、エラーが出る場合はG0をジャンパーピン等でGNDに繋ぐと、書き込める場合があります。

InfluxDBの準備

インストール方法は公式を参考に。
https://docs.influxdata.com/influxdb/v1.8/introduction/install/

UDPを使えるようにする

運用場面においてtcpにするメリットは無いのでudpを使います。

viの使い方はググってください。

$ sudo vi /etc/influxdb/influxdb.conf

必要箇所のコメントアウトを削除。

 [[udp]]
  # enabled = false
   enabled = true
   bind-address = ":8089"
   database = "udp"

influxdbを再起動

$ sudo service influxdb restart

データベースを作る

$ influx
CREATE DATABASE udp
quit

ソース


YUN.ino
YUN.ino
// please install Adafruit_BMP280 lib first
// Adafruit_BMP280 lib in Sketch->Includ Library->Library Manager

#include "M5StickC.h"
#include <Adafruit_BMP280.h>
#include "SHT20.h"
#include "yunBoard.h"
#include <WiFi.h>
#include <WiFiUdp.h>

char ssid[] = "YOUR-WiFi-SSID";
const char* password = "WiFi-pass";

// the IP address of your InfluxDB host
byte host[] = {192, 168, 1, 60};

// the port that the InfluxDB UDP plugin is listening on
int port = 8089;

SHT20 sht20;
Adafruit_BMP280 bmp;

uint32_t update_time = 0;
float tmp, hum;
float pressure;
uint16_t light;

WiFiUDP udp;

void setup() {
  M5.begin();
  Wire.begin(0, 26, 100000);
  M5.Lcd.setRotation(1);
  M5.Lcd.setTextSize(2);
    M5.Lcd.fillScreen(BLACK);
  // RGB888
 //  led_set(uint8_t 1, 0x080808);

  if (!bmp.begin(0x76)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
  }

    /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_1000); /* Standby time. */

  // put your setup code here, to run once:
    WiFi.begin(ssid, password); 
    while (WiFi.status() != WL_CONNECTED) { 
        delay(100);
        Serial.print(".");
    }
    Serial.println();
}

uint8_t color_light = 5;

void loop() {

//  led_set_all((color_light << 16) | (color_light << 8) | color_light);
  if(millis() > update_time) {
    update_time = millis() + 1000;
    tmp = sht20.read_temperature();
    hum = sht20.read_humidity();
    light = light_get();
    pressure = bmp.readPressure();

    M5.Lcd.setCursor(0, 8);
    M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
    M5.Lcd.printf("tmp:%.2f\r\n", tmp);
    M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
    M5.Lcd.printf("hum:%.2f\r\n", hum);
    M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
    M5.Lcd.printf("pre:%.2f\r\n", pressure/100);
    M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
    M5.Lcd.printf("light:%04d\r\n", light);
  }

  M5.update();
  Serial.println(pressure/100);

  if(M5.BtnA.wasPressed()) {
    esp_restart();  
  }

  delay(100);
  // put your main code here, to run repeatedly:
  byte addr[8];
  uint8_t chipid[6];
  esp_efuse_read_mac(chipid);
  String id=String(chipid[0],HEX)+String(chipid[1],HEX)+String(chipid[2],HEX)+String(chipid[3],HEX)+String(chipid[4],HEX)+String(chipid[5],HEX);
  String line;

    line="sensor,mac="+id+" device=\"yun\",tmp="+tmp+",hum="+hum+",pre="+pressure/100+",light="+light;
Serial.println(line);
    udp.beginPacket(host, port);
    udp.print(line);
    /* line output sample 
sensor,mac=11a11d11ff00 device="yun",tmp=30.99,hum=35.00,pre=1013.3,light=400
*/
    udp.endPacket();
    delay(10000);
}


Grafana

https://grafana.com/docs/grafana/latest/installation/
公式通りにインストール。

特に迷う所は無いと思いますが、humのクエリーはこんな感じ。

SELECT mean("hum") FROM "sensor" WHERE $timeFilter GROUP BY time($__interval) fill(null)

追記:FBで教えてもらいました。下に表示されている項目をクリックすると、左側のy軸か右側か選択できます。