Node-RED and Time Series Database InfluxDB
Tentokrát sa pokúsime údaje ukladať priamo do externej NoSQL databázy InfluxDB pomocou nástroja Telegraf. A ako bonus si ukážeme, ako vieme vytvoriť jednoduché REST API priamo v nástroji Node-RED.
Video pre cvičenie
Upozornenie
Pred príchodom na cvičenie si ešte doma stiahnite nasledujúce obrazy:
To docielite týmto príkazom:
$ docker image pull influxdb
About
Senzory merajú a namerané údaje posielajú pomocou komunikačného protokolu MQTT do sveta. Ak však s nimi budeme chcieť v budúcnosti pracovať a analyzovať ich, potrebujeme ich priebežne aj ukladať.
Pre potreby spracovávania údajov v IoT sa s veľkou obľubou používajú tzv. time series databázy (časozberné alebo časovo súsledné databázy). Spoznáte ich jednoducho podľa toho, že pri vizualizovaní je na jednej osi vždy čas. My sa budeme konkrétne venovať najpopulárnejšej databáze tohto typu v súčasnosti InfluxDB (podľa údajov zo servera db-engines.com).
A aby sme sa veľmi nenamakali, pre sledovanie a následné sťahovanie údajov z MQTT nebudeme robiť samostatný skript alebo flow, ale použijeme nástroj Telegraf.
Goals
- naučiť sa základy používania nástroja Telegraf
- zoznámiť sa so základmi používania databázy InfluxDB
- naučiť sa vytvárať REST API v nástroji Node-RED
- naučiť sa vytvárať jednoduché dynamické stránky v prostredí Node-RED
Content
Get Ready
Doteraz sme pracovali len s jedným kontajnerom, ktorým bol stále Node-RED. Odteraz však budeme vytvárať kompozíciu kontajnerov a súčasťou tejto kompozície budú tri nástroje:
- Node-RED - nástroj na rýchle prototypovanie vlastných riešení pomocou grafického programovania
- InfluxDB - časozberný databázový systém (z angl. time-series), ktorý patrí do kategórie NoSQL
- Telegraf - agent pre zbieranie a preposielanie metrík a udalostí z databáz, rozličných systémov a IoT senzorov
V tomto kroku túto kompozíciu pripravíme.
Task
Vytvorte súbor docker-compose.yaml
, v ktorom vytvoríte
kompozíciu kontajnerov pre Node-RED a Telegraf.
Pre túto kompozíciu nech platí:
- vytvorte priečinok
telegraf-weather/
, do ktorého stiahnite tento konfiguračný súbor - navonok bude komunikovať len nástroj Node-RED na porte
1880
- nástroj Node-RED spustite z obrazu
nodered/node-red
- nástroj Telegraf spustite z obrazu
telegraf
Upozornenie
Uvedené priečinky vytvorte ručne ešte predtým, ako kompozíciu
spustíte! Ak tak neurobíte, priečinky za vás vytvorí Docker sám
s prístupovými právami používateľa root
. To znamená, že
nikto s nimi nebude vedieť pracovať!
Task
Spustite a overte vytvorenú kompozíciu.
Ak ste postupovali správne, nástroj Node-RED bude dostupný
štandardne na adrese http://localhost:1880. Zobrazia sa v
ňom rovnako všetky flow-y, ktoré ste mali lokálne uložené v priečinku
data/
.
Poznámka
Ak sa vám flow v nástroji Node-RED nezobrazil žiadny flow z
predchádzajúcich cvičení, môžete si ho stiahnuť z tejto adresy. To
sa môže stať napr. v prípade, že ste nepoužívali lokálny priečinok, ale
perzistentný zväzok (volume). V tomto prípade stačí, ak miesto lokálneho
priečinku v konfiguračnom súbore docker-compose.yaml
použijete práve názov tohto perzistentného úložiska.
Okrem toho sa však v logoch nástroja docker-compose
budú
nachádzať merania z cvičenia o počasí. Každé meranie je v tvare tzv. Line
protokol-u databázového systému InfluxDB. Vo výstupe teda
budete vidieť záznamy v tvare:
weather,course=iot,host=93705be78fec,lat=49.239667,lon=19.266819,name=mirek,\
topic=kpi/iot/worldmap temperature=9.35,humidity=51,pressure=1030 \
1648403134693305089
Položky Line protokol-u sa skladajú zo štyroch častí:
- názov merania - v našom prípade
weather
- zoznam značiek - v našom prípade sa jedná o kľúče
course
,host
,lat
,lon
aname
- zoznam položiek - v našom prípade sa jedná o kľúče
temperature
,humidity
apressure
- časová značka - v našom prípade sa jedná o hodnotu
1648403134693305089
Upozornenie
Ak vo výpise neuvidíte svoje záznamy, tak skontrolujte:
- či posielate údaje na broker s adresou
broker.hivemq.com
do témykpi/iot/worldmap
- či sa vo vašej správe (JSON dokumente) nachádzajú všetky potrebné
kľúče:
lat
,lon
,name
,temperature
,humidity
apressure
- či sú hodnoty kľúčov
temperature
,humidity
apressure
čísla a nie reťazce
Storing Data to InfluxDB
Aktuálna konfigurácia pre nástroj Telegraf zabezpečuje len vypisovanie údajov na štandardný výstup. V tomto kroku zabezpečíme, že tieto údaje bude rovno zapisovať do časozberného databázového systému InfluxDB.
Task
Rozšírte konfiguráciu vášho súboru docker-compose.yaml
o
novú službu s názvom influxdb
, ktorá zabezpečí spustenie
databázového systému InfluxDB.
Pre službu influxdb
nech platí:
- službu spustite z obrazu
influxdb
- služba bude pracovať v rovnakej sieti, ako služby
nodered
atelegraf
- zabezpečte pre ňu trvalé úložisko s názvom
influxdb
- služba bude navonok komunikovať na porte
8086
Výsledná podoba konfigurácie služby môže vyzerať nasledovne:
influxdb:
image: influxdb
ports:
- 8086:8086
volumes: - influxdb:/var/lib/influxdb2
Nezabudnite však na osobitnú sekciu, kde potrebujete uviesť zoznam všetkých dostupných perzistentných zväzkov:
volumes: influxdb:
Task
Spustite a overte vytvorenú kompozíciu.
Ak ste postupovali správne, po otvorení prehliadača na adrese http://localhost:8086 sa vám otvorí uvítacia obrazovka webového rozhrania databázového systému InfluxDB.
Task
Dokončite sprievodcu inštaláciou vytvorením prvého používateľa.
Po kliknutí na tlačidlo Get Started
sa vám zobrazí
formulár pre vytvorenie prvého používateľa. Vyplňte všetky položky
formulára nasledovne:
- Username:
admin
- Password:
secret123
- Initial Organization Name:
kpi-iot
- Initial Bucket Name:
weather
Po vytvorení používateľa z nasledujúcej obrazovky vyberte položku
Configure Later
, čím sa presuniete priamo do webového
používateľského rozhrania databázového systému InfluxDB.
Poznámka
Nastavenie prvého používateľa môžete vykonať aj pri prvom spustení kontajnera pomocou nasledovných premenných prostredia:
DOCKER_INFLUXDB_INIT_MODE=setup
DOCKER_INFLUXDB_INIT_USERNAME=admin
DOCKER_INFLUXDB_INIT_PASSWORD=secret123
DOCKER_INFLUXDB_INIT_ORG=kpi-iot
DOCKER_INFLUXDB_INIT_BUCKET=weather
From MQTT to InfluxDB
V tomto stave máme rozbehnutý ako Telegraf tak aj databázu InfluxDB. Jediné, čo ešte potrebujeme spraviť, je zabezpečiť, aby boli údaje z MQTT zapísané do databázy InfluxDB. A to zabezpečíme v tomto kroku.
Task
Do konfiguračného súboru telegraf.conf
pridajte
konfiguráciu pre InfluxDB výstupný plugin.
Konfiguráciu získate z webového rozhrania InfluxDB:
- kliknite na ikonu
Data
v bočnom paneli - kliknite na kartu
Telegraf
- kliknite na tlačidlo
InfluxDB Output Plugin
Uvedenú konfiguráciu prekopírujte a vložte ju do konfiguračného
súboru telegraf.conf
. Výsledná konfigurácia bude (po
odstránení komentárov) vyzerať takto:
[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
token = "$INFLUX_TOKEN"
organization = "kpi-iot"
bucket = "weather"
Task
Vytvorte prístupový token pre zapisovanie a čítanie údajov z bucket-u
weather
.
Token vytvoríte pomocou webového rozhrania InfluxDB:
- kliknite na ikonu
Data
v bočnom paneli - kliknite na kartu
API Tokens
- kliknite na tlačidlo
Generate API Token
- z menu vyberte položku
Read/Write API Token
Pomocou dialógového okna vytvorte nový token s prístupom na čítanie
aj zápis do bucket-u weather
.
Task
Upravte vytvorenú konfiguráciu doplnením tokenu a zadaním správnej adresy InfluxDB servera.
Adresa InfluxDB servera je názov služby, ktorý sme použili v
konfigurácii v súbore docker-compose.yaml
, takže:
influxdb
.
Hodnotu token-u je možné získať z webového rozhrania InfluxDB:
- kliknite na ikonu
Data
v bočnom paneli - kliknite na kartu
API Tokens
- kliknite na položku s názvom tokenu pre prístup do bucket-u
weather
Token prekopírujte na príslušné miesto do konfigurácie.
Výsledná podoba konfigurácie bude vyzerať nasledovne:
[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
token = "your-token"
organization = "kpi-iot"
bucket = "weather"
Poznámka
Hodnotu tokenu pre nasadenie v produkcii nikdy neukladajte do konfiguračného súboru! Miesto toho ju použite ako premennú prostredia.
Task
Reštartujte vašu kompozíciu a overte vytvorenú konfiguráciu.
Ak ste postupovali správne, údaje postupne uvidíte vo webovom
používateľskom rozhraní po kliknutí na ikonu Explore
v
bočnom paneli. Vyberte si bucket weather
, meranie
weather
, zaškrtnite položku View Raw Data
a
potvrďte kliknutím na tlačidlo Submit
. Na obrazovke sa vám
zobrazí tabuľka so zozbieranými údajmi.
Task
Experimentujte s možnosťami zobrazenia údajov.
Webové rozhranie databázového systému InfluxDB poskytuje
viacero možností pre vizualizáciu údajov. Vyskúšajte si jednotlivé typy.
Pre ich aplikovanie nezabudnite odškrtnúť položku
View Raw Data
a potvrdiť voľbu stlačením tlačidla
Submit
.
Providing REST API
Merané údaje sa aktuálne ukladajú do databázy InfluxDB. V tomto kroku vytvoríme pomocou nástroja Node-RED jednoduché REST API na poskytovanie týchto údajov.
Task
Do nástroja Node-RED nainštalujte rozšírenie node-red-contrib-influxdb.
Task
Vytvorte nový flow s názvom REST API
.
Task
Pomocou uzla influxdb in
vytvorte dopyt do databázy
InfluxDB na získanie posledných nameraných hodnôt.
Po umiestnení uzla do flow-u ho najprv nakonfigurujte. Potrebujete postupne zadať tieto údaje:
- verziu databázy InfluxDB -
2.0
- URL adresu servera -
http://influxdb:8086
- prístupový token
- označenie organizácie -
kpi-iot
Dopyty sa v databáze InfluxDB vytvárajú od verzie 2 pomocou jazyka Flux. Získať posledné namerané hodnoty môžete napríklad takto:
from(bucket: "weather")
|> range(start: -30m)
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["name"] == "Mirek at Home")
|> last()
Task
Vytvorte jednoduché REST API pre získanie informácií o aktuálnych nameraných hodnotách.
O vašom flow-e nech platí:
- endpoint nech má cestu
/api/weather
- údaje nech vracia vo formáte JSON
- 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
Riešenie
{{{ payload.0._value }},
"humidity": {{ payload.1._value }},
"pressure": {{ payload.2._value }},
"temperature": {{ payload.2._dt }}"
"dt": " }
Task
Overte správnosť vytvoreného REST API.
Overenie môžete vykonať vykonaním dopytu na adresu http://localhost:1880/api/weather
štandardne priamo v prostredí nástroja Node-RED, pomocou
prehliadača alebo pomocou nástrojov ako curl
alebo
httpie
.
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 95
Content-Type: application/json; charset=utf-8
Date: Mon, 28 Mar 2022 01:21:18 GMT
ETag: W/"5f-BOdTGudIYm198sDJa/Qim8FEcp4"
Keep-Alive: timeout=5
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express
{
"humidity": 58,
"pressure": 1029,
"temperature": 5.46,
"dt": "2022-03-28T01:20:54.843952896Z"
}
Providing Data in Web Page
Údaje vieme získať pomocou jednoduchého REST API. Podobným spôsobom však môžeme údaje získať aj ich vložením do jednoduchej webovej stránky. To bude vašou úlohou v tomto kroku.
Task
Vytvorte nový flow s názvom Weather Web
.
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
.
Task
Overte správnosť svojho riešenia.
Otvorte adresu http://localhost:1880/www v prehliadači.
Additional Tasks
- Rozšírte vaše REST API o možnosť pridať názov meracieho bodu, z ktorého chcete získať údaje o počasí.
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.
Query data with Flux - The following guides walk through both common and complex queries and use cases for Flux.