Обработване на данни от ESP32 борд с InfluxDB 2 и Raspberry Pi

Нека данните да са си при мен

В предишните статии видяхме как да показваме и да съхраняваме данни от 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.

Весело програмиране!

Comments

No comments yet. Why don’t you start the discussion?

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *