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

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

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/.

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í:

  1. názov merania - v našom prípade weather
  2. zoznam značiek - v našom prípade sa jedná o kľúče course, host, lat, lon a name
  3. zoznam položiek - v našom prípade sa jedná o kľúče temperature, humidity a pressure
  4. časová značka - v našom prípade sa jedná o hodnotu 1648403134693305089

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 a telegraf
  • 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.

InfluxDB: Welcome Screen

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
InfluxDB: Setup Initial User

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.

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:

  1. kliknite na ikonu Data v bočnom paneli
  2. kliknite na kartu Telegraf
  3. 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:

  1. kliknite na ikonu Data v bočnom paneli
  2. kliknite na kartu API Tokens
  3. kliknite na tlačidlo Generate API Token
  4. 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.

InfluxDB: Vytvorenie token-u

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:

  1. kliknite na ikonu Data v bočnom paneli
  2. kliknite na kartu API Tokens
  3. 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"

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.

InfluxDB: Údaje z merania počasia

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.

InfluxDB: Zmena spôsobu vizualizácie údajov

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
REST API pre informácie o počasí

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.

Poskytnutie webovej stránky

Task

Overte správnosť svojho riešenia.

Otvorte adresu http://localhost:1880/www v prehliadači.

Additional Tasks

  1. Rozšírte vaše REST API o možnosť pridať názov meracieho bodu, z ktorého chcete získať údaje o počasí.