Node-RED and Time Series Database InfluxDB

tentokrát sa pokúsime údaje ukladať priamo do externej NoSQL databázy InfluxDB a pristupovať k nim pomocou REST API

Goals

  • zoznámiť sa so základmi používania databázy InfluxDB
  • naučiť sa vytvárať REST API v Node-RED
  • naučiť sa vytvárať jednoduché dynamické stránky v prostredí Node-RED

Content

Get Ready

Task

Vytvorte si zálohu na vašom počítači všetkých flow-ov, ktoré sme doteraz urobili.

Task

Vytvorte súbor docker-compose.yaml, v ktorom vytvoríte kompozíciu kontajnerov pre Node-RED a InfluxDB.

Pre kompozíciu nech platí:

  • obom kontajnerom nakonfigurujte trvalé úložisko (node_red_data:/data pre Node-RED a influxdb:/var/lib/influxdb pre InfluxDB)
  • navonok bude komunikovať len Node-RED na porte 1880
  • Node-RED spustite z obrazu nodered/node-red
  • databázu InfluxDB spustite z obrazu influxdb:1.8
  • kontajneru InfluxDB nastavte inicializačnú databázu db pomocou premennej prostredia INFLUXDB_DB

Task

Spustite a overte vytvorenú kompozíciu.

Kompozíciu spustíte príkazom docker-compose up v priečinku, v ktorom sa nachádza príslušný konfiguračný súbor docker-compose.yml. Na adrese http://localhost:1880 sa bude nachádzať Node-RED.

Task

Naimportujte do nástroja Node-RED vaše lokálne uložené flow-y a overte ich.

Task

Overte činnosť databázy InfluxDB.

K databáze sa pripojíte pomocou príkazového jedným z nasledujúcich príkazov:

$ docker container exec -it <názov_kontajnera> influx
$ docker-compose exec influxdb influx

Ak ste postupovali správne, nasledujúce príkazy v CLI rozhraní Influx by sa mali vykonať bez chýb:

> show database
> use db
> show measurements

Storing Data to InfluxDB

Task

Do nástroja Node-RED nainštalujte uzol node-red-contrib-influxdb.

Task

Zabezpečte, aby sa pri získavaní dát o počasí tieto dáta rovno ukladali do databázy InfluxDB.

Pri tejto úlohe nemôžeme ukladať priamo celý JSON, ktorý sme získali, pretože niektoré atribúty obsahujú objekty. Do InfluxDB môžeme ukladať len kombinácie kľúč: hodnota, pričom hodnota môže byť reťazec alebo číslo. Preto vhodne JSON upravte (napríklad uzlom function).

Ako názov merania (measurement) použite weather. Je možné taktiež rôzne dáta uložiť do rôznych meraní (tabuliek), v takom prípade rozdeľte dáta o počasí a pomocou rôznych uzlov influxdb out ich uložte do databázy s rôznymi názvami meraní (measurement).

Uzly pre ukladanie dát o počasí

Task

Overte, že sa tieto dáta uložili správne.

V databázovom klientovi influx môžete zadať príkazy:

> use db
> select * from weather

Taktiež sa môžete na obsah databázy pozrieť pomocou uzla influxdb in v Node-RED, v ktorom zadáte rovnaké query (select * from weather) a výstup zobrazíte pomocou uzla debug.

Providing REST API

Task

Vytvorte nový flow s názvom REST API.

Task

Vytvorte jednoduché REST API pre získanie informácií o aktuálnej teplote.

O vašom flow-e nech platí:

  • endpoint nech má cestu /api/temperature
  • údaje nech vracia vo formáte JSON
  • nech vráti vždy poslednú nameranú hodnotu
  • v prípade, že ešte neprebehlo žiadne meranie (nie sú k dispozícii žiadne dáta), vaše REST API vráti ako hodnotu null

Na získanie dát z InfluxDB použite uzol influxdb in. Pri zadávaní query sa inšpirujte SQL zápisom a dokumentáciou Influx Query Language (InfluxQL). Nezabudnite, že načítané dáta je potrebné ešte dodatočne upraviť (napríklad pomocou uzla function alebo change).

REST API endpoint pre načítanie dát o teplote

Task

Overte správnosť vášho flow-u.

Napríklad cez prehliadač alebo z príkazového riadku pomocou nástroja curl.

$ curl localhost:1880/api/temperature

Task

Podobným spôsobom implementujte REST API aj pre vlhkosť a tlak.

Providing Data in Web Page

Task

Vytvorte nový flow s názvom Website.

Task

Vytvorte jednoduchú stránku, pomocou ktorej budete vizualizovať aktuálne namerané údaje z databázy InfluxDB.

Pre získanie dát použite vytvorené REST API. Vzhľad stránky nastavte pomocou uzla template.

Stránka zobrazujúca dáta o počasí získaných z REST API endpoint-u

Additional Tasks

Requesting more REST API endpoints

Task

Vytvorte rôzne REST API endpoint-y pre rôzne druhy dát.

Task

Upravte flow pre webovú stránku tak, aby sa dopytovala na viac REST API endpoint-ov a zobrazila dáta zo všetkých z nich.

Upravte flow tak, aby sa dopyty na REST API vykonávali paralelne. Odpovede z dopytov potom zlúčte do jedného payload pomocou uzla join, alebo nainštalujte paletu node-red-contrib-fusion a použite uzol fusion. Aby ste mohli dáta zlúčiť, musíte každej paralelnej vetve priradiť jedinečný atribút topic (payload.topic), na základe ktorého sa tieto dáta rozlíšia od ostatných po zlúčení.

Zlúčenie dát z rôznych REST API endpoint-ov pomocou uzla join