Database and Grafana

Theerawat Goodking
4 min readJun 16, 2023

--

full data summary :

https://drive.google.com/file/d/1OV12j5Vgo2thuWxoTZery4Xurr9p0JhG/view?usp=sharing

How to use Grafana and InfluxDB :

การสมัครเข้าใช้งาน ติดตั้ง InfluxDB และสร้าง key สำคัญ

ทำการ Search เข้า Web Influxdata.com และ Login to Influx Cloud 2.0
ทำการ Login โดยใช้ Google เลือกใช้ Mail ที่เราสะดวก
ทำการเข้าไปที่ Load Data เพื่อสร้างพวก Bucket และ Generate Token
เป็นขั้นตอนการสร้าง bucket
จะพบ buckets ที่เราสร้าง
เลือก buckets ที่เราสร้างไว้ก่อนหน้านี้เพื่อสร้าง token
จะพบ token ที่เราสร้าง
กลับไปที่หน้า จากนั้นให้กด Add data เพื่อเพิ่มข้อมูลแบบ client library เพื่อรับข้อมูลจาก ESP 32
เลื่อนหา และคลิกเลือก Arduino

ทำการติดตั้ง library ใน arduino เพื่อส่งข้อมูลเข้าใน InfluxDB

เมื่อเลื่อนลงมาจะเจอ tutorial สําหรับการส่งค่าเข้า InfluxDB โดยในขั้นแรกจะทําการลง library ภายใน arduino แบบ manual โดยให้คลิ้กตามลิ้งค์ของ Github Repository
ลิ้งค์จะนําเข้าสู่เว็บไวต์ผู้พัฒนา library ของ InfluxClient for Arduino ให้กดที่ code แล้วเลือก download ZIP เพื่อ ทำการดาวน์โหลด library
ให้ทำการติดตั้ง library โดยเปิด Arduino แล้วเลือก Add ZIP library จากนั้นให้กดเลือกไฟล์ที่โหลดได้ จาก GitHub แล้ว Arduino จะลง library ให้ อัตโนมัติโดยสามารถเช็คไฟล์ได้ที่ Include Library

การสมัครเข้าใช้งาน และติดตั้ง Grafana

ทำการ Search เข้า Web grafana.com จากนั้นกด donwloads ที่มุมขวาบน
เว็บไซต์จะนํามาที่หน้าการสมัครสมาชิก โดยในที่นี้จะใช้ account google เดียวกันกับที่สมัคร InflexDB
เมื่อลงชื่อเข้าใช้เสร็จสิ้น จะปรากฎหน้าต่างหลัก Grafana พร้อมที่จะใช้งานสร้าง Dashboard

การเขียนโปรแกรมใน ESP32 เพื่อส่งค่าเข้าไปยัง InfluxDB

จากเว็บไซต์ https://europe-west1-1.gcp.cloud2.influxdata.com/orgs/b0251acf6c0622e5/load-data/clientlibraries/arduino จะมีตัวอย่างการเขียนโปรแกรมทั้งหมด 3 ส่วนแต่ที่ จําเป็นในการทดลองจะมีสองส่วนคือ ส่วนเข้า เชื่อมต่อกับ Database โดยในที่นี้จะต้องใช้คีย์สำคัญที่สมัครและสร้างไว้กับ InfluxDB

ส่วนที่สองจะเป็นโปรแกรมในส่วน loop ทำการส่งค่าแบบ real time จาก ESP32 board เข้าสู่ InfluxDB
กลับมาที่เว็บ Influxdata.com เพื่อหาคีย์สำคัญ ได้แก่ Organization, token, buckets

โค้ดโปรแกรมส่งค่าสุ่มอุณหภูมิและความชื้นใน ESP32

#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP8266"
#endif
float temp;
float humd;
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#define WIFI_SSID "KengNeeHa"
#define WIFI_PASSWORD "0930963238"
#define INFLUXDB_URL "https://europe-west1-1.gcp.cloud2.influxdata.com"
#define INFLUXDB_TOKEN "plIl2kaYznrxJDiQUU8AxpFh937mfYHMksBG3cjM7e74eSgmp7R0UXyAikPNZYedVsFsDT0NZb-pclb381ijw=="
#define INFLUXDB_ORG "kengteeg28@gmail.com"
#define INFLUXDB_BUCKET "B6321031"
#define TZ_INFO "UTC+7"
#include "DHTesp.h"
DHTesp dht;
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN,
InfluxDbCloud2CACert);
Point sensor("temp&humd");
void setup() {
Serial.begin(115200);
dht.setup(15, DHTesp::DHT11);
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();
sensor.addTag("device", DEVICE);
sensor.addTag("SSID", WiFi.SSID());
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
} else {
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
}
void loop() {
temp = dht.getTemperature();
humd = dht.getHumidity();
sensor.clearFields();
sensor.addField("rssi", WiFi.RSSI());
sensor.addField("temp", temp);
sensor.addField("humid", humd);
Serial.print("Writing: ");
Serial.println(sensor.toLineProtocol());
if (wifiMulti.run() != WL_CONNECTED) {
Serial.println("Wifi connection lost");
}
if (!client.writePoint(sensor)) {
Serial.print("InfluxDB write failed: ");
Serial.println(client.getLastErrorMessage());
}
Serial.println("Wait 1s");
delay(1000);
}
result in serail monitor

เช็คค่าข้อมูลใน InfluxDB

เปิดเว็บไซต์ที่ลงชื่อเข้าใช้กับ InfluxDB ให้เข้ามาที่ แถบ Explore เมื่อคลิกเข้าไปจะมีกล่องสีเทาด้านล่าง ให้ ทําการเลือก bucket คือขอบเขตข้อมูลที่ต้องการ ตามที่ได้ตั้งชื่อไว้ในโปรแกรมของ ESP32 โดยให้คลิกเลือก lastreport > temp&humid > เลือก temp และ humid จากนั้นกด Submit หากส่งข้อมูลถูกต้อง จะขึ้นกราฟเป็น ค่าที่ส่งมาจากESP 32 โดยสามารถปรับแต่งลักษณะการแสดงผลของข้อมูลได้ตามรูปแบบมุมซ้ายบน ค่าเฉลี่ย และ เวลาการอัพเดทที่ขวาล่าง

สร้าง Grafana Dashboard จากข้อมูลใน InfluxDB และการปรับแต่งค่า

มาที่เว็บไซต์Dashboard ของ Grafana แล้วไปที่ แถบเครื่องมือ เลือก Data sources เพื่อเพิ่มฐานข้อมูล แล้วเลือก Add data source
เมื่อทำการเลือกส่วนข้อมูลที่จะแสดงผลแล้ว จะปรากฏผลลัพธ์ดังภาพ หรือจะสามารถปรับแต่งรูปแบบของกราฟได้ ตามที่ต้องการ โดยเลือกจากช่องฝั่งขวา จากนั้นให้กด Apply or Save เพื่อบันทึก

Temperature Code

from(bucket: "B6321031")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r.device == "ESP32")
|> filter(fn: (r) => r._field == "temp")
|> drop(columns: ["_measurement"])
|> drop(columns: ["_field"])
|> aggregateWindow(every: 60s, fn:mean)

Humidity Code

from(bucket: "B6321031")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r.device == "ESP32")
|> filter(fn: (r) => r._field == "humid")
|> drop(columns: ["_measurement"])
|> drop(columns: ["_field"])
|> aggregateWindow(every: 60s, fn:mean)
ผลลัพธ์ Dashboard
รูปวงจร

--

--

Theerawat Goodking
0 Followers

This is a blog for submission of Embedded Syetem subjects.