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

##目標
HAT-YUNで観測した値をデータベースに入れて記録したい。かっこいいグラフ表示とか出来たらもっといいよね！
![スクリーンショット 2020-11-11 16.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181687/1b6570e4-da44-9f87-87ff-18c629cc8325.png)

##材料
・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です。動作確認出来た方がいましたらコメントお願いします。

##初期設定
http://pages.switch-science.com/letsiot/m5stickc/

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

```c
// 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の使い方はググってください。

```sh
$ sudo vi /etc/influxdb/influxdb.conf
```

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

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

influxdbを再起動

```sh
$ sudo service influxdb restart
```

###データベースを作る

```influx
$ influx
CREATE DATABASE udp
quit
```

##ソース
<details>
<summary>YUN.ino</summary>
<div>

```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=10１３．３,light=400
*/
    udp.endPacket();
    delay(10000);
}

```

</div>
</details>

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

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

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

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