ESP8266 NodeMCU: начало работы с InfluxDB
Это руководство поможет вам быстро начать работу с InfluxDB, используя плату ESP8266. InfluxDB – это база данных временных рядов (TSDB) с открытым исходным кодом. Поэтому она идеально подходит для хранения данных датчиков с временными метками за определённый период времени. В этом руководстве вы настроите корзину (bucket) InfluxDB для сохранения данных и узнаете, как сохранять данные ESP8266 в базу данных. InfluxDB также предлагает различные способы визуализации и организации ваших данных (дашборды, графики, таблицы, шкалы и т.д.).
Обновлено 21 мая 2024
У нас есть аналогичное руководство для платы ESP32: начало работы с InfluxDB.
Что такое InfluxDB?
InfluxDB – это высокопроизводительная база данных временных рядов (TSDB) с открытым исходным кодом, которая может хранить большие объёмы данных в секунду. Каждая точка данных, которую вы отправляете в базу данных, связана с определённой временной меткой. Поэтому она идеально подходит для проектов IoT-логирования, таких как хранение данных с датчиков вашей метеостанции.
Вы можете запустить InfluxDB в InfluxDB Cloud, или локально на вашем ноутбуке или Raspberry Pi.
«Зачем использовать InfluxDB Cloud? Это быстрая, эластичная, бессерверная платформа мониторинга в реальном времени, движок для создания дашбордов, сервис аналитики и процессор событий и метрик.»
Ключевые термины InfluxDB
Прежде чем начать, есть несколько важных терминов, которые вам нужно понять. Мы рассмотрим только наиболее релевантные термины, полный глоссарий вы можете прочитать по ссылке. Не беспокойтесь, если некоторые термины кажутся запутанными. Вы лучше поймёте эти термины, когда начнёте записывать данные в базу данных.
В InfluxDB bucket (корзина) – это именованное место хранения данных временных рядов. Все корзины имеют период хранения (retention period) – он определяет продолжительность времени, в течение которого корзина сохраняет данные. Точки с временными метками, превышающими период хранения, удаляются.
Данные в InfluxDB хранятся в таблицах в строках и столбцах. Набор данных в строке известен как точка (point) (аналогично строке в таблице базы данных SQL). Каждая точка имеет measurement (измерение), tag set (набор тегов), field key (ключ поля), field value (значение поля) и timestamp (временную метку);
Столбцы хранят наборы тегов (tag sets) (индексированные) и наборы полей (field sets). Единственный обязательный столбец – это time, который хранит временные метки и включён во все таблицы InfluxDB.
tag (тег): пара ключ-значение в структуре данных InfluxDB, которая записывает метаданные. Теги являются необязательной частью структуры данных InfluxDB, но они полезны для хранения часто запрашиваемых метаданных; теги индексируются, поэтому запросы по тегам выполняются быстро.
tag key (ключ тега): ключи тегов – это строки, которые хранят метаданные. Ключи тегов индексируются, поэтому запросы по ключам тегов обрабатываются быстро.
tag value (значение тега): значения тегов – это строки, которые хранят метаданные. Значения тегов индексируются, поэтому запросы по значениям тегов обрабатываются быстро.
field (поле): пара ключ-значение в структуре данных InfluxDB, которая записывает метаданные и фактическое значение данных. Поля обязательны в структуре данных InfluxDB и не индексируются – запросы по значениям полей сканируют все точки, соответствующие указанному временному диапазону, и, как следствие, не так производительны по сравнению с тегами.
field key (ключ поля): ключ пары ключ-значение. Ключи полей – это строки, которые хранят метаданные.
field value (значение поля): значение пары ключ-значение. Значения полей – это фактические данные; они могут быть строками, числами с плавающей точкой, целыми числами или булевыми значениями. Значение поля всегда связано с временной меткой. Значения полей не индексируются – запросы по значениям полей сканируют все точки, соответствующие указанному временному диапазону, и, как следствие, не так производительны.
measurement (измерение): часть структуры InfluxDB, которая описывает данные, хранящиеся в связанных полях.
Мы также рекомендуем быстро ознакомиться с ключевыми концепциями InfluxDB.
Создание учётной записи InfluxDB
Примечание
Если вы хотите запустить InfluxDB локально на Raspberry Pi, сначала следуйте следующему руководству: Установка InfluxDB 2 на Raspberry Pi. Затем перейдите к разделу Загрузка данных в InfluxDB.
1) Перейдите на https://cloud2.influxdata.com/signup и создайте учётную запись InfluxDB.
2) Выберите, где вы хотите сохранить свои данные. Выберите место, ближайшее к вашему местоположению. Введите имя для Компании и Организации.
3) Выберите тарифный план InfluxDB. Для этого примера мы будем использовать бесплатный план. Для большинства наших IoT-проектов бесплатный план отлично подходит.
4) Затем заполните форму, чтобы продолжить.
5) Наконец, вы будете перенаправлены в центр ресурсов.
Загрузка данных в InfluxDB
6) Нажмите на значок Load Data и выберите Sources.
7) Прокрутите вниз, пока не найдёте опцию Arduino в разделе Client Libraries.
8) Нажмите на Initialize Client.
Страница, которая откроется, позволяет создавать корзины (buckets), а также показывает пример кода для взаимодействия плат ESP8266 или ESP32 с InfluxDB.
Создание корзины (Bucket) InfluxDB
9) Создайте новую корзину для хранения ваших данных. Нажмите + Create Bucket, чтобы создать новую корзину для этого примера. Вы можете использовать настройки по умолчанию или настроить их.
Получение URL и API-токена InfluxDB
10) Получите URL вашего InfluxDB* и другие детали, которые понадобятся позже. Прокрутите вниз до фрагмента Configure InfluxDB profile. Затем скопируйте INFLUXDB_URL, INFLUXDB_TOKEN, INFLUXDB_ORG и INFLUXDB_BUCKET.
Примечание
* если вы запускаете InfluxDB локально на Raspberry Pi, URL будет IP-адресом Raspberry Pi на порту 8086. Например, 192.168.1.106:8086.
API-токены
Если вы следовали предыдущим шагам, InfluxDB Cloud уже создал для вас API-токен, который вы можете найти во фрагменте, представленном на предыдущем шаге. Если вы перейдёте к значку Load Data и выберете API Tokens, вы найдёте ранее сгенерированный API-токен.
На этой странице вы можете сгенерировать новый API-токен при необходимости.
На данный момент у вас должны быть сохранены следующие данные:
URL сервера InfluxDB
Организация InfluxDB
Имя корзины (Bucket) InfluxDB
API-токен
Взаимодействие ESP8266 с InfluxDB
Мы будем программировать ESP8266 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение для плат ESP8266:
В качестве альтернативы вы можете использовать VS Code с расширением PlatformIO. Ознакомьтесь со следующим руководством, чтобы начать работу с VS Code + PlatformIO:
Установка клиентской библиотеки InfluxDB для Arduino
Существует библиотека, которая упрощает взаимодействие ESP8266 с InfluxDB: клиентская библиотека InfluxDB для Arduino. Эта библиотека также совместима с платами ESP32.
Установка – Arduino IDE
Если вы используете Arduino IDE, выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries
Найдите InfluxDB и установите библиотеку ESP8266 Influxdb от Tobias Shurg.
Установка – VS Code
Если вы используете VS Code с расширением PlatformIO, начните с создания проекта Arduino для вашей платы ESP8266.
Затем нажмите на значок PIO Home и выберите вкладку Libraries. Найдите «influxdb». Выберите ESP8266 Influxdb от Tobias Schurg.
Сохранение данных ESP8266 в InfluxDB
Чтобы показать вам, как сохранять данные в InfluxDB с помощью ESP8266, мы рассмотрим один из примеров, предоставляемых библиотекой. В вашей Arduino IDE перейдите в File > Examples > ESP8266 Influxdb > Secure Write. Или просто скопируйте код ниже в вашу 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);
}
Перед загрузкой кода на вашу плату вам нужно вставить ваши сетевые учётные данные, URL InfluxDB, идентификатор организации и имя корзины.
Этот пример показывает, как создать точку данных в базе данных с тегами и полями. Он сохраняет RSSI подключённой сети (уровень сигнала Wi-Fi между ESP8266 и вашим роутером) каждые 10 секунд.
Давайте кратко рассмотрим, как работает код.
Как работает код
Сначала подключаются необходимые библиотеки. В этом примере используется ESP8266WiFiMulti вместо библиотеки ESP8266WiFi для подключения ESP8266 к сети. Также определяется имя DEVICE в зависимости от выбранной платы.
#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP8266"
#endif
Примечание
Библиотека ESP8266WiFiMulti позволяет ESP8266 подключаться к сети с лучшим RSSI (индикатором уровня принимаемого сигнала) из списка добавленных сетей. В этом примере подключение происходит только к одной сети.
Подключите необходимые библиотеки InfluxDB для взаимодействия с InfluxDB:
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
Вставьте ваши сетевые учётные данные в следующие переменные, чтобы ESP8266 мог подключиться к интернету:
// WiFi AP SSID
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
// WiFi password
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
Вставьте URL сервера InfluxDB в следующие строки – тот, который вы получили на этом шаге:
// 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"
Примечание
Если вы запускаете InfluxDB локально на Raspberry Pi, URL будет IP-адресом Raspberry Pi на порту 8086. Например, 192.168.1.106:8086.
Вставьте ваш токен InfluxDB – сохранённый на этом шаге:
#define INFLUXDB_TOKEN "REPLACE_WITH_YOUR_INFLUXDB_TOKEN"
Добавьте имя вашей организации InfluxDB – смотрите этот шаг.
#define INFLUXDB_ORG "REPLACE_WITH_YOUR_INFLUXXDB_ORGANIZATION_ID"
Наконец, добавьте имя вашей корзины InfluxDB:
#define INFLUXDB_BUCKET "REPLACE_WITH_YOUR_BUCKET_NAME"
Настройка часового пояса
Вы должны установить часовой пояс согласно этим инструкциям. Самый простой способ – проверить эту таблицу и скопировать ваш часовой пояс оттуда. В моём случае это часовой пояс Лиссабона:
#define TZ_INFO "WET0WEST,M3.5.0/1,M10.5.0"
Клиент InfluxDB
Теперь, когда у вас есть все необходимые настройки, вы можете создать экземпляр InfluxDBClient. Мы создаём защищённый клиент, использующий предварительно настроенный сертификат – узнайте больше о безопасном подключении здесь.
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
Point
Затем мы создаём экземпляр Point с именем sensor. Точка будет называться wifi_status в базе данных. Позже в коде мы можем обращаться к этой точке (sensor), чтобы добавлять теги и поля.
Point sensor("wifi_status");
Примечание
Набор данных в строке базы данных известен как точка (point). Каждая точка имеет measurement (измерение), tag set (набор тегов), field key (ключ поля), field value (значение поля) и timestamp (временную метку).
setup()
В setup() инициализируем Serial Monitor.
Serial.begin(115200);
Настройка и подключение к 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();
Затем мы добавляем теги к нашим данным. Теги – это метаданные, которые позволяют лучше организовать наши данные. Это также более простой способ запрашивать данные более эффективно позже. В этом примере у нас есть тег device, который сохраняет имя устройства (либо ESP32, либо ESP8266), и тег SSID, который сохраняет SSID подключённой сети. Чтобы добавить тег, мы вызываем метод addTag() для точки sensor. В качестве аргументов мы передаём ключ и значение тега.
// Add tags
sensor.addTag("device", DEVICE);
sensor.addTag("SSID", WiFi.SSID());
Представьте, что у вас этот пример работает на нескольких платах, и каждая плата имеет уникальный тег устройства. Тогда было бы проще запрашивать данные, относящиеся к конкретному устройству, используя тег устройства. То же самое для SSID подключённой сети.
Следующие строки синхронизируют время с серверами NTP.
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
Следующий фрагмент проверяет подключение к серверу InfluxDB:
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
} else {
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
loop()
В loop() мы добавляем поля (фактические данные) к точке. Начинаем с очистки полей точки:
sensor.clearFields();
Мы добавляем поле к этой точке, используя метод addField() и передавая в качестве аргументов ключ (rssi) и фактическое значение RSSI (WiFi.RSSI()).
sensor.addField("rssi", WiFi.RSSI());
Выводим в Serial Monitor, что именно мы записываем в точку:
Serial.println(client.pointToLineProtocol(sensor));
Наконец, чтобы фактически добавить точку в базу данных, мы используем метод writePoint() объекта InfluxDBClient и передаём в качестве аргумента точку, которую хотим добавить: client.writePoint(sensor). Мы выполняем команду внутри оператора if для отладки.
if (!client.writePoint(sensor)) {
Serial.print("InfluxDB write failed: ");
Serial.println(client.getLastErrorMessage());
}
Мы записываем новые данные в базу данных каждые 10 секунд.
//Wait 10s
Serial.println("Wait 10s");
delay(10000);
Демонстрация – визуализация данных в InfluxDB
После ввода всех необходимых настроек в коде вы можете загрузить его на вашу плату ESP8266. Если вы получаете ошибку при компиляции, проверьте следующее:
Убедитесь, что у вас выбрана плата ESP8266 в Tools > Board.
Проверьте версию установки плат ESP8266 в Tools > Board > Boards Manager > ESP8266. Выберите версию 3.0.1, если у вас возникают проблемы с другими версиями.
После загрузки кода на вашу плату откройте Serial Monitor на скорости 115200 бод. Нажмите встроенную кнопку RESET на ESP8266, чтобы перезагрузить плату. В Serial Monitor должно отобразиться нечто подобное:
Теперь перейдите в вашу учётную запись InfluxDB и откройте Data Explorer, нажав на соответствующий значок.
Теперь вы можете визуализировать свои данные. Начните с выбора нужной корзины (bucket). Затем нам нужно добавить фильтры для выбора наших данных. Выберите wifi_status в поле _measurement, ваш SSID в теге SSID (в данном случае у нас всего один SSID, но если мы добавим несколько SSID, мы сможем легко фильтровать данные, потому что мы добавили SSID как тег). Наконец, выберите тег поля (rssi) и устройство (ESP8266).
Наконец, нажмите кнопку RUN.
Это отобразит ваши данные в выбранном формате. Выберите опцию GRAPH.
Заключение
Это было лишь краткое введение в InfluxDB с ESP8266. Вы узнали, как создать корзину (bucket) базы данных и как создавать и отправлять точки с помощью ESP8266. В этом примере мы отправляем RSSI. В IoT-приложении вы можете добавить показания датчиков, текущее потребление или любые другие данные, которые имеют смысл для ваших проектов IoT и домашней автоматизации.
Следуйте следующему руководству, чтобы узнать, как отправлять показания датчика BME280 в InfluxDB с помощью плат ESP32/ESP8266.
Мы надеемся, что вам понравилось это руководство и оно помогло вам начать работу с InfluxDB. Скоро мы создадим больше руководств на эту тему. Следите за обновлениями!
Узнайте больше о ESP8266 с нашими ресурсами:
Спасибо за чтение.