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 ainfluxdb:/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 prostrediaINFLUXDB_DB
Upozornenie
Nezabudnite, že v docker-compose.yml
je potrebné všetky
trvalé úložiska a siete deklarovať v blokoch volumes:
a
networks:
. V našom prípade to bude vyzerať takto:
volumes:
node_red_data:
influxdb:
Poznámka
Na začiatku konfiguračného súboru docker-compose.yml
sa
zadáva verzia formátu, napríklad version: "3.6"
. Odporúčame
zadať aspoň verziu 3.5
v prípade, že máte staršie verzie
nástroja Docker Compose.
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
Upozornenie
V prípade príkazu docker-compose exec ...
sa zadáva
namiesto názvu kontajnera názov služby definovanej v
docker-compose.yml
súbore. Teda influxdb
v
príkaze nahraďte názvom, ktorý ste zadali v bloku services:
pre InfluxDB.
Poznámka
Názov kontajnera môžete zistiť pomocou príkazu docker ps
alebo docker container ls
.
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
).
Poznámka
Na ukladanie dát do InfluxDB použite uzol influxdb out
,
v ktorom vytvoríte pripojenie na server. Pri nastavení pripojenia na
server zohľadnite nasledujúce vlastnosti: * Verzia servera je
1.x
* Host je názov služby kompozície (názov, ktorý ste
zadali v bloku services:
pre InfluxDB v súbore
docker-compose.yml
) * Databáza je tá, ktorú sme
zadefinovali ako inicializačnú premennou prostredia
INFLUXDB_DB
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
).
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
).
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
.
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í.
Additional Links
Node-RED - domovská stránka nástroja Node-RED
Node-RED: Running under Docker
node-red-contrib-influxdb - Node-RED nodes to save and query data from an influxdb time series database.