ESP32 a InfluxDB

08.10.2022 Raspberry Pi #raspberrypi #esp32 #influxdb

Ukázka odesílání dat do InfluxDB z ESP32. InfluxDB je nainstalován na Raspberry Pi.


Předpokládáme, že InfluxDB je již nainstalován na Raspberry Pi.

Načítání dat v InfluxDB

1) Klikněte na NAČÍST VAŠE DATA.

influxdb-getting-started-page 

2) Přejděte dolů, dokud v části Klientské knihovny nenajdete možnost Arduino.

influx-db-load-data-arduino-client 

Stránka, která se otevře, vám umožňuje vytvářet kbelíky a také ukazuje ukázkový kód pro propojení desek ESP8266 nebo ESP32 s InfluxDB.

influxdb-load-data-dashboard-arduino    

Vytvoření InfluxDB bucketu

3) Můžete použít výchozí segment nebo vytvořit nový. Vytvoříme nový. Kliknutím na + Vytvořit segment vytvoříte pro tento příklad nový segment. Nastavení můžete změnit ve výchozím nastavení nebo si je můžete přizpůsobit.

influx-db-create-bucket 

Získání adresy URL InfluxDB

4) Získejte svou adresu URL InfluxDB* a další podrobnosti, které budete později potřebovat. Přejděte dolů k části Inicializace fragmentu klienta. Poté zkopírujte soubor INFLUXDB_URL,INFLUX_DB_ORG, a INFLUX_DB_BUCKET.

influxdb-initialize-arduino-client 

Vygenerujte token API

Nyní musíte vygenerovat token API, aby vaše zařízení mohla zapisovat a/nebo číst do vašeho segmentu.

5) Vyberte ikonu se šipkou nahoru a klikněte na API Tokeny.

influxdb-api-tokens-menu

6) Klikněte na + Generate API Token > All Access API Token 

influx-db-generate-api-token-all-access-8

7) Uveďte popis, který identifikuje daný token API. Protože to bude používat ESP32, napsal jsem jednoduše „ESP32“. 

influx-db-generate-api-token-all-access-9

8) Zobrazí se nové okno s vaším API tokenem. Zkopírujte token API na bezpečné místo, protože jej budete potřebovat později. Token API již neuvidíte!

influxdb-api-token-generated

V tuto chvíli byste měli uložit následující:

  • Adresa URL serveru InfluxDB
  • Organizace InfluxDB
  • Název segmentu InfluxDB
  • API Token

Propojení ESP32 s InfluxDB

AŤ už programujete ESP32 naprogramujeme pomocí Arduino IDe nebo VS Code, musí být nainstalována knihovna InfluxDB.

ESP32 - Ukládáme data do InfluxDB

Abychom vásim ukázali, jak ukládat data do InfluxDB pomocí ESP32, podíváme se na jeden z příkladů poskytnutých knihovnou. Ve vašem Arduino IDE přejděte na Soubor > Příklady > ESP8266 Infuxdb > Zabezpečený zápis. Nebo jednoduše zkopírujte níže uvedený kód do vašeho Arduino IDE.

/**
 * Secure Write Example code for InfluxDBClient library for Arduino
 * Enter WiFi and InfluxDB parameters below
 *
 * Demonstrates connection to any InfluxDB instance accesible via:
 *  - unsecured http://...
 *  - secure https://... (appropriate certificate is required)
 *  - InfluxDB 2 Cloud at https://cloud2.influxdata.com/ (certificate is preconfigured)
 * Measures signal level of the actually connected WiFi network
 * This example demonstrates time handling, secure connection and measurement writing into InfluxDB
 * Data can be immediately seen in a InfluxDB 2 Cloud UI - measurement wifi_status
 * 
 * Complete project details at our blog: https://RandomNerdTutorials.com/
 * 
 **/

#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 "REPLACE_WITH_YOUR_SSID"
// WiFi password
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
// InfluxDB v2 server url, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "REPLACE_WITH_YOUR_DATABASE_URL"
// InfluxDB v2 server or cloud API token (Use: InfluxDB UI -> Data -> API Tokens -> Generate API Token)
#define INFLUXDB_TOKEN "REPLACE_WITH_YOUR_TOKEN"
// InfluxDB v2 organization id (Use: InfluxDB UI -> User -> About -> Common Ids )
#define INFLUXDB_ORG "REPLACE_WITH_YOUR_ORG"
// InfluxDB v2 bucket name (Use: InfluxDB UI ->  Data -> Buckets)
#define INFLUXDB_BUCKET "ESP32"

// Set timezone string according to https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// Examples:
//  Pacific Time: "PST8PDT"
//  Eastern: "EST5EDT"
//  Japanesse: "JST-9"
//  Central Europe: "CET-1CEST,M3.5.0,M10.5.0/3"
#define TZ_INFO "WET0WEST,M3.5.0/1,M10.5.0"

// InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
// InfluxDB client instance without preconfigured InfluxCloud certificate for insecure connection 
//InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);

// 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(500);
  }
  Serial.println();

  // Add tags
  sensor.addTag("device", DEVICE);
  sensor.addTag("SSID", WiFi.SSID());

  // Alternatively, set insecure connection to skip server certificate validation 
  //client.setInsecure();

  // Accurate time is necessary for certificate validation and writing in batches
  // For the fastest time sync find NTP servers in your area: 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());
  }
}

void loop() {
  // Store measured value into point
  sensor.clearFields();
  // Report RSSI of currently connected network
  sensor.addField("rssi", WiFi.RSSI());
  // Print what are we exactly writing
  Serial.print("Writing: ");
  Serial.println(client.pointToLineProtocol(sensor));
  // If no Wifi signal, try to reconnect it
  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());
  }

  //Wait 10s
  Serial.println("Wait 10s");
  delay(10000);
}

Před nahráním kódu do desky musíte vložit své síťové přihlašovací údaje, InfluxDB URL, ID organizace a název bucketu.

Tento příklad ukazuje, jak vytvořit datový bod v databázi se značkami a poli. Ukládá RSSI připojené sítě (síla Wi-Fi mezi ESP32 a vaším routerem) každých 10 sekund.Pojďme se v rychlosti podívat na to, jak kód funguje.

Jak kodex funguje

Nejprve to začne zahrnutím požadovaných knihoven. V tomto příkladu se používá WiFiMultimísto toho WiFiknihovny pro připojení ESP32 k síti. To také definuje DEVICE název v závislosti na zvolené desce.

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

Poznámka :WiFiMultiknihovna umožňuje ESP32 připojit se k síti s nejlepší RSSI (indikátor síly přijímaného signálu) ze seznamu přidaných sítí. V tomto příkladu se připojuje pouze k jedné síti.

Zahrňte požadované knihovny InfluxDB, abyste mohli komunikovat s InfluxDB:

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

Vložte své síťové přihlašovací údaje do následujících proměnných, aby se ESP32 mohl připojit k internetu:

// WiFi AP SSID
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
// WiFi password
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

Do následujících řádků vložte adresu URL serveru InfluxDB – tu, kterou jste získali v tomto kroku:

// InfluxDB v2 server url, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "REPLACE_WITH_YOUR_INFLUXDB_URL"

Poznámka: Pokud spouštíte InfluxDB lokálně na Raspberry Pi, bude URL adresou Raspberry Pi IP na portu 8086. Například 192.168.1.106:8086.

Vložte svůj token InfluxDB – uložený v tomto kroku:

#define INFLUXDB_TOKEN "REPLACE_WITH_YOUR_INFLUXDB_TOKEN"

Přidejte název organizace InfluxDB – zkontrolujte tento krok.

#define INFLUXDB_ORG "REPLACE_WITH_YOUR_INFLUXXDB_ORGANIZATION_ID"

Nakonec přidejte název kbelíku InfluxDB:

#define INFLUXDB_BUCKET "ESP32"

Nastavení časového pásma

Časové pásmo musíte nastavit podle těchto pokynů. Nejjednodušší způsob je zkontrolovat tuto tabulku a zkopírovat odtud své časové pásmoV mém případě je to lisabonské časové pásmo:

#define TZ_INFO "WET0WEST,M3.5.0/1,M10.5.0"

Klient InfluxDB

Nyní, když máte všechna požadovaná nastavení, můžete vytvořit soubor InfluxDBClient instance. Vytváříme zabezpečeného klienta, který používá předem nakonfigurovaný certifikát – další informace o zabezpečeném připojení zde.

InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);

Point

Poté vytvoříme POINT volaný instancí senzoru. Bod se bude nazývat stav_wifi na databázi. Později v kódu se můžeme odkázat na tento bod (senzor) pro přidání značek a polí.

Point sensor("wifi_status");

setup()

V setup(), inicializujte Serial Monitor.

Serial.begin(115200);

Nastavení a připojení k Wi-Fi:

// 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(500);
}
Serial.println();

Poté k našim datům přidáme značky. Tagy jsou metadata, která nám umožňují lépe organizovat naše data. Je to také jednodušší způsob, jak později efektivněji dotazovat data. V tomto příkladu máme device tag, který ukládá název zařízení (buď ESP32 nebo ESP8266), a SSID tag, který ukládá SSID připojené sítě. Chcete-li přidat značku, metoda se nazývá addTag(). Jako argumenty předáváme klíč značky a hodnotu.

// Add tags
sensor.addTag("device", DEVICE);
sensor.addTag("SSID", WiFi.SSID());

Představte si, že máte tento příklad spuštěný na více deskách a každá deska má jedinečný štítek zařízení. Pak by bylo jednodušší dotazovat se na data vztahující se ke konkrétnímu zařízení pomocí značky zařízení. Totéž pro SSID připojené sítě.

Následující řádky synchronizují čas se servery NTP.

timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

Následující fragment kontroluje připojení k serveru InfluxDB:

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

loop()

V loop(), přidáme pole (aktuální data) k bodu. Začneme vymazáním bodových polí:

sensor.clearFields();

K tomuto bodu přidáme pole pomocí metody addField()a předávání jako argumenty, klíč (rssi) a skutečnou hodnotu RSSI (WiFi.RSSI()).

sensor.addField("rssi", WiFi.RSSI());

Vytiskněte si v Serial Monitor, co píšeme k věci:

Serial.println(client.pointToLineProtocol(sensor));

Nakonec, abychom skutečně přidali bod do databáze, použijeme metodu writePoint() na objektu InfluxDBClient a předejte jako argument bod, který chceme přidat: client.writePoint(senzor). Příkaz spustíme uvnitř příkazu if pro účely ladění.

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

Každých 10 sekund zapisujeme nová data do databáze.

//Wait 10s
Serial.println("Wait 10s");
delay(10000);

Ukázka – vizualizace dat na InfluxDB

Po vložení všech požadovaných nastavení na kód jej můžete nahrát na vaši desku ESP32. Pokud se během kompilace objeví nějaká chyba, zkontrolujte následující:

  • Zkontrolujte, zda máte v Tools > Board vybranou desku ESP32 .
  • Zkontrolujte verzi instalace desek ESP32 v nabídce Nástroje > Deska > Správce desek > ESP32. Pokud máte problémy s jinými verzemi, vyberte verzi 2.0.1.

Po nahrání kódu na vaši desku otevřete sériový monitor s přenosovou rychlostí 115200. Stisknutím tlačítka RST na desce ESP32 restartujte desku. Na sériovém monitoru by měl vytisknout něco podobného:

esp32-writesecure-influxdb-example-serial-monitor-demonstration 

Nyní přejděte na svůj účet InfludDB a přejděte do Průzkumníka dat kliknutím na odpovídající ikonu.

influxdb-data-explorer

Nyní můžete svá data vizualizovat. Začněte výběrem kbelíku, který chcete – v našem případě je to ESP32. Poté musíme přidat filtry, abychom vybrali naše data. Vyberte wifi_status pod polem _measurement, vaše SSID pod značkou SSID (v tomto případě máme pouze jedno SSID, ale pokud přidáme více SSID, mohli bychom data snadno filtrovat, protože jsme přidali SSID jako značku). Nakonec vyberte značku pole (rrsi) a zařízení (ESP32).

Nakonec klikněte na tlačítko ODESLAT.

Tím se zobrazí vaše data ve vámi zvoleném formátu. V levém horním rohu můžete vybrat různé způsoby vizualizace dat.

influxdb-esp32-data-explorer 

Můžete vytvořit řídicí panel pro zobrazení více vizualizací dat v různých formátech (měřidla, histogram, jednotlivé statistiky atd.) nebo různých dat na stejné stránce.

Vytvoření řídicího panelu

Klikněte na ikonu řídicího panelu a poté na Vytvořit řídicí panel > Nový řídicí panel.

influxdb-create-dashboard 

Přidejte buňku. Vytvořte dotaz pro získání dat a vyberte požadovanou vizualizaci. Pojmenujte buňku, například ESP32 RSSI History. Graf můžete také upravit kliknutím na tlačítko Přizpůsobit. Nakonec klikněte na ikonu  v pravém horním rohu a přidejte vizualizaci jako buňku na svůj řídicí panel.

esp32-rssi-history-influxdb-cell  

Na řídicí panel můžete přidat další vizualizace. Pro každou vizualizaci stačí přidat novou buňku. Například jsem přidal tabulku a jednu statistiku, která ukazuje aktuální SSID.

esp32-wifi-connection-strength-influxdb-dashboard 

Své buňky můžete přesunout na různé pozice a uspořádat řídicí panel tak, aby vám to dávalo smysl. Můžete si také přizpůsobit způsob, jakým se data obnovují a kolik datových bodů chcete vidět (až do posledních 30 dnů v bezplatném cloudovém plánu).

Závěr

Toto byl jen rychlý úvod do InfluxDB s ESP32. Naučili jste se, jak vytvořit databázový segment a jak vytvořit a odeslat body pomocí ESP32. V tomto příkladu odesíláme RSSI. V aplikaci IoT můžete přidat údaje ze senzorů, aktuální spotřebu nebo jakákoli jiná data, která mají smysl pro vaše projekty IoT a domácí automatizace.

Literatura:

ESP32: Getting Started with InfluxDB. Random Nerd Tutorials [online]. RandomNerdTutorials.com, 2022 [cit. 2022-09-28]. Dostupné z: https://randomnerdtutorials.com/esp32-influxdb/#load-data-influxdb