Нека данните да са си при мен
В предишните статии видяхме как да показваме и да съхраняваме данни от ESP32 контролера. В тази статия ние ги показахме на серийната конзола, а в тази ги запазихме в платформата Thingspeake. Но как да ги съхраним локално при нас. Сигурно има много решения за това, които може би ще разгледаме по-късно. Но нека се спрем на едно, което може би не е най-простото, но ни дава доста гъвкавост. За целта ще използваме InfluxDB 2 и ще го подкараме на Rasberry PI 3 model B.
Но какво е InfluxDB
InfluxDB е временна база данни, проектирана за съхранение и обработка на времеви-серийни данни. Този вид данни включва информация, която се записва в различни времеви точки. Примери на времеви серии включват данни от сензори, измервания от мониторинг на инфраструктура, логове от събития и други подобни данни, които се записват през времето.
Ето някои от ключовите характеристики на InfluxDB:
- Времеви серии: InfluxDB е оптимизирана за работа с данни във времеви редове. Това означава, че данните се записват и четат със специфично внимание към времевите маркери, които ги идентифицират.
- SQL-подобен език за заявки (InfluxQL): InfluxDB предоставя собствен език за заявки, наречен InfluxQL, който е подобен на SQL. Този език е оптимизиран за заявки върху времеви данни и има синтаксис, който улеснява работата със времеви редове.
- Гъвкавост и мащабируемост: InfluxDB е проектирана да бъде гъвкава и лесно мащабируема. Това я прави подходяща за различни приложения, където е необходимо съхранение и анализ на времеви данни.
- Поддръжка на Retention Policies и Continuous Queries: InfluxDB позволява на потребителите да задават политики за задържане на данни (Retention Policies) и да създават непрекъснати заявки (Continuous Queries) за автоматична обработка на данни върху времеви периоди.
- Отлична за мониторинг и IoT: Поради своите характеристики, InfluxDB е особено подходяща за използване в системи за мониторинг, измервания от IoT (Интернет на нещата) устройства и други приложения, където е важно да се съхраняват и анализират времеви данни.
- Версия InfluxDB 2: В допълнение към оригиналната версия InfluxDB (1.x), съществува и InfluxDB 2, която предоставя нов интерфейс, подобрен език за заявки (Flux), и други нововъведения.
InfluxDB е често използвана в областта на мониторинга и управлението на времеви данни поради своите специфични характеристики за работа с такъв тип информация. Затова и ние искаме да използваме базата за да запишем данни в нея. Това ще ни предостави голяма гъвкавост, защото на по-късен етап ще можем да визуализираме данните, да ги обработваме, да реагираме на тях и да ги предаваме на други системи. Ползваме базата, защото тя ни предоставя и структура на данните, лесен език за манипулация и входно/изходен интерфейс, без големи усилия и сложни инсталации. Затова ползваме и база, а не примерно текстов формат, който директно се записва на паметта.
Но къде ще ги запишем тези данни? Raspberry Pi
Вече обсъдихме записването на данни и базата, която ще използваме, но къде можем да инсталираме тази база данни? Възможно е да я инсталираме на някой клауд провайдър като Google, AWS или Azure, но за това ни трябва постоянно интернет. Това при модерните технологии и бързият и стабилен интернет е възможно, но нека да съхраняваме нещата локално. Така ако се случи нещо и нямаме връзка, все още можем да достъпваме данните и да не сме зависими от интернет. Но какво е Raspberry Pi?
Raspberry Pi (Raspberry Pi Foundation) е серия от единични платки (SBC – Single Board Computers), проектирани с цел образование в областта на компютърните науки и подпомагане на хобита с програмиране. Raspberry Pi е известен с ниската си цена, компактния си размер и възможността да изпълнява различни софтуерни задачи.
- Основните характеристики на Raspberry Pi варират в зависимост от модела, но включват обикновено:
- Процесор: ARM-базиран процесор с различни характеристики в зависимост от модела.
- Памет (RAM): Различни модели предлагат различни нива на оперативната памет.
- Вход/Изход (I/O) портове: USB портове, HDMI изход, аудио изход, GPIO (General Purpose Input/Output) портове и други, които позволяват свързването с различни периферни устройства.
- Слот за MicroSD карта: Картата служи за съхранение на операционната система и данни.
- Мрежови възможности: Вграден Ethernet порт или възможност за свързване чрез Wi-Fi модул (в зависимост от модела).
- GPIO пинове: Raspberry Pi разполага с GPIO пинове, които позволяват свързването с различни сензори, актуатори и други електронни компоненти.
- Операционна система (OS): Raspberry Pi поддържа различни операционни системи, като Raspbian (предишно наречен „Raspberry Pi OS“), Ubuntu, и други.
Raspberry Pi е станал популярен не само в образователния сектор, но и в хоби програмирането, IoT проекти, медиен център, домашен сървър, и други. Този достъпен и гъвкав компютър съчетава силата на софтуер и хардуер в компактен и лесен за използване пакет. Може постоянно да е включен и има ниска консумация на енергия. Raspberry Pi е идеален за нашият проект и е достатъчно мощен, за да изпълни задачата.
Да инсталираме малко софтуер
Първо трябва да инсталираме операционна система на Raspberry Pi борда.
Отидете на официалната страница на Raspberry Pi в секцията download – тук и свалете Raspberry Pi Imager като кликнете на „Download for Windows“ или Mac OS/Linux

След това стартирайте и инсталирайте файла, който свалихме.
След като го пуснете, трябва да се покаже следният прозорец:

На този екран трябва да изберем няколко неща:
- Raspberry PI Device – тук избираме за кой PI искаме да инсталираме операционна система. Тук избираме „Raspberry Pi 3“
- Operating OS – Тук избираме Raspberry PI OS (LEGACY, 64 Bit) FULL
- Storage – Тук избираме SD картата, която по-късно ще вкараме в Raspberry PI борда и ще я ползваме за памет.
На следващият екран искаме да промениме настройките на операционната система. Изберете „Edit Settings“
Нека тук настроим няколко неща:

Под „General“
- Set hostname – тук може да настроим хоста на Raspberry PI борда, без да знаем неговият IP адрес. Това е особено полезно, когато искаме да пуснем борда headless, или нямаме вързан монитор, мишка и клавиатура и борда е вързан само с нашата локална мрежа. По този начин можем да се вържем с него през ssh и да го управляваме. Но за това по-късно.
- Set username and password – Нека настоим име и парола с които можем да се вържем с борда. Това е и потребителя, който ще се създаде на операционната система.
- Configure wireless LAN – Нека настроим и връзката с безжичната мрежа, ако не ползваме кабел. За този пример Pi-то не е вързано с кабел.

Под „Services“
- Нека да разрешим SSH, като изберем „Enable SSH“ и „Use password authentification“

И нека запазим настройките.
След като сме направили настройките, може да продължим.

И да се съгласим, че картата ни ще бъде изтрита

След като подтвърдим, ще получим екран, на който се вижда статуса на записване на операционната система.

Когато е готова инсталацията получаваме следното съобщение

След като поставим картата обратно в Raspberry Pi борда, може да се свържем с него. Той трябва автоматично да се е свързал с интернет през безжичната мрежа. За това не ни е нужна клавитура, мишка и монитор. Ще използваме SSH достъпа. За целта ще използваме putty. Може да свалим програмата от тук.
Какво е Putty
PuTTY е свободен и отворен софтуер, предназначен за терминално приобщаване (SSH, Telnet, Rlogin, и други) към други компютри в мрежата. Проектът е основан от Саймън Татъм и стартира през 1998 г.
Основната цел на PuTTY е да предостави лесен начин за свързване с други компютри, особено при работа със сървъри, чрез различни протоколи за комуникация. Ето някои от най-важните характеристики на PuTTY:
- SSH, Telnet, Rlogin и др.: Поддържа различни протоколи за сигурна и несигурна комуникация с други компютри.
- Терминален емулатор: Предоставя текстов интерфейс, който позволява на потребителя да въведе команди и да получи резултатите.
- SCP и SFTP клиенти: Включва и инструменти за прехвърляне на файлове чрез SCP (Secure Copy) и SFTP (SSH File Transfer Protocol).
- Поддържа сертификати и ключове: Позволява използването на SSH ключове за автентикация, което увеличава сигурността при свързване със сървъри.
- Поддръжка на различни операционни системи: PuTTY е наличен за Microsoft Windows и има и различни портации за UNIX-базирани системи.
- Съхранение на сесии: Позволява на потребителите да съхраняват настройки и конфигурации за често използвани сесии.
- Бърз и лек: PuTTY е лек и се изпълнява бързо, което го прави удобен за използване дори на по-стари компютри или при лоша мрежова свързаност.
PuTTY е широко използван инструмент в областта на системната администрация и разработката на софтуер, където се изисква терминален емулатор за достъп и управление на отдалечени системи. Ние ще го използваме за достъп до системата, без да ни е нужно да сме до нея.
На страницата трябва да кликнем на „Download PuTTY“ и да свалим „putty-64bit-0.80-installer.msi
“. Файла ще ни инсталира програмата на компютъра.

След като я инсталираме, трябва да въведем адреса на Raspberry Pi борда в „Host name“ полето и да натиснем „Open“. Адреса сме задали преди това по-нагоре и след това трябва да приемем сертификата.


След като въведем правилното име и парола, можем да продължим с инсталацията.
Така изглежда правилното вписване в системата:

Възможно е да не успеем да отворим адреса директно. За да успеем да се логнем в Pi борда, трябва да открием IP адреса му по някакъв начин. Едната възможност е да погледнем в рутера на нашата мрежа под настройките на DHCP (ако е конфигурирано) и там да видим кое устройство си е взело IP адрес последно и да ползваме този адрес за връзка. Другата възможност е, ако имаме физически достъп до Pi борда и вързана клавиатура и монитор, можем да се влезем в операционната система и да изпълним командата – „hostname -I“. След изпълнението й, можем да видим адреса:

В случая, той е 192.168.11.42 и може да го ползваме, като заменим с rasberrypiDB.local
Инсталация на InfluxDB
Вече имаме достъп до Pi борда и можем да продължим с инсталацията на базата данни.
За да я инсталираме, може да следваме следната документация тук , като изберем платформата

Но нека първо свалим базата данни. Изпълнете следната комада в терминала на Putty
>curl -O https://dl.influxdata.com/influxdb/releases/influxdb2_2.7.4-1_arm64.deb
И да я разархивираме
>sudo dpkg -i influxdb2_2.7.4-1_arm64.deb
Сега вече може да стартираме базата с
> sudo service influxdb start
И да я тестваме с
>sudo service influxdb status
Нега да видим резултата

Може да видим, че работи от следният текст:
influxdb.service - InfluxDB is an open-source, distributed, time series database
Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset: enable>
Active: active (running)
Нека да отворим адреса на Pi борда на порт 8086 в браузъра. И ще видим това:

Нека да въведем същият потребител и парола, които използвахме при конфигуриране на Pi борда и да продължим нататък.

Трябва да въведем и организация и име на бъкета, които не са показани по-горе, за да продължим нататък. След това получаваме токън за администрация, който е хубаво да си го запишем някъде, защото се показва само веднъж. Но за този пример не ни трябват тези допълнителни данни.
Когато отново отворим http://192.168.11.42:8086/ може да видим началната страница на базата данни. На нея можем да намерим пример за ArduinoIDE и пример с ESP32.

За да получим информация за ESP32, на страницата трябва да изберем правилния борд

Довършете процеса за настройка, описан в упътването.
В променливата INFLUXDB_BUCKET трябва да попълним бъкета от горе, който не е показан на скриншота.
След като отворим Arduino IDE-то, трябва да създадем нов проект и да изберем правилните настройки.
Програма в едитора изглежда така:
#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>
#include "driver/temp_sensor.h"
// WiFi AP SSID
#define WIFI_SSID "Be*****"
// WiFi password
#define WIFI_PASSWORD "*****"
#define INFLUXDB_URL "http://192.168.11.42:8086"
#define INFLUXDB_TOKEN "PAq*****"
#define INFLUXDB_ORG "4a3*****"
#define INFLUXDB_BUCKET "Test"
// Time zone info
#define TZ_INFO "UTC2"
// Declare InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
// Declare Data point
Point sensor("Internal temp");
void initTempSensor(){
temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT();
temp_sensor.dac_offset = TSENS_DAC_L2;
temp_sensor_set_config(temp_sensor);
temp_sensor_start();
}
void setup() {
Serial.begin(115200);
initTempSensor();
// 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(100);
}
Serial.println();
// Accurate time is necessary for certificate validation and writing in batches
// We use the NTP servers in your area as provided by: 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());
}
// Add tags to the data point
sensor.addTag("device", DEVICE);
sensor.addTag("Name", "My_ESP32_board");
}
void loop() {
float result = 0;
temp_sensor_read_celsius(&result);
Serial.print("Temperature:");
Serial.println(result);
// Clear fields for reusing the point. Tags will remain the same as set above.
sensor.clearFields();
// Store measured value into point
sensor.addField("temp", result);
// Print what are we exactly writing
Serial.print("Writing: ");
Serial.println(sensor.toLineProtocol());
// Check WiFi connection and reconnect if needed
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());
}
Serial.println("Waiting 1 second");
delay(1000);
}
Трябва да въведем правилните настройки на WiFi мрежата и токъните от примера на базата данни. Програмата е модифицирана да чете от вътрешният сензор за температура и да записва резултатите в базата. Как се прочита вътрешният сензор може да се намери тук.
Нека я тестваме и да видим резултатите. В сериината конзола може да видим, че ESP32 борда пише резултатите.

При първоначалните опити за писане, се появи следната грешка: „InfluxDB write failed: connection refused“. Тук може да се намери лесно решение на проблема.
Нека видим и записите в Influx базата данни:

Заключение
С този пример видяхме, как може да пишем измервания от сензор на ESP32 борд във външна база данни. Това ни улеснява, когато искаме да работим с данните, също така ги защитава от загуба и ги структурира, за да може да се ползват от други приложения. Също така разполагаме с история на данните и не сме зависими от паметта и мрежовата връзка на сензорите. Това е последната статия от серията за работа с данни от сензорите на ESP32 борд. Тук може да видите как те се визуализират в серийната конзола, а тук как се пазят във външната платформа ThingSpeak.
Весело програмиране!