- Měříme a získáváme měřené údaje
- Odesíláme údaje a sbíráme v cloudu
- Sebraná data ukládáme do databáze
- Data z databáze zpracujeme, zobrazíme a analyzujeme
3. Ukládání měření do databáze
Pro sběr měřených dat je nejvhodnější databáze časových řad (TSDB – Time Series Database), protože je přizpůsobena pro optimální uložení velkého množství dat v časové řadě a pro další zpracování disponuje optimalizovanými agregačními funkcemi. Velmi často používanou databází je InfluxDB, která je zdarma i s užitečnými nástroji ke zpracování dat a díky připraveným knihovnám se s ní snadno pracuje v různých programovacích jazycích.
3.1 Instalace vlastní InfluxDB
Databázový stroj InfluxDB můžeme v oblíbeném operačním systému Debian GNU/Linux či Ubuntu/Mint Linux jednoduše nainstalovat ze standardního instalačního balíku influxdb
. Případně na jiných platformách podle návodu k instalaci na webu influxdata.com.
Předpokladem je, že máme k dispozici hodně úložného prostoru, protože data mohou časem narůst do obřích rozměrů.
$ apt install influxdb
Nepotřebujeme-li zaznamenávat dotazy a přístupy přes HTTP, tak můžeme vypnout logování v konfiguračním souboru /etc/influxdb/influxdb.conf
.
[data]
query-log-enabled = false
[http]
log-enabled = false
3.2 InfluxDB v cloudu
InfluxDB lze používat také v cloudu a zde se budeme věnovat platformě InfluxDB Cloud 2.0, která nabízí provoz připraveného databázového stroje v cloudu AWS (v Evropě Frankfurt n.M.), v Azure (v Evropě Amsterdam) nebo v Google Cloud (v Evropě Belgie).
Varianta Free je k dispozici všem zdarma s několika omezeními: zápis 5 MB za 5 vteřin, dotazy 300 MB za 5 minut, 10000 řad dat a maximálně 2 databáze (Buckets) se zachováním dat 30 dní. Pro nenáročné domácí použití naprosto dostačující.
Pro další práci s databází jsou klíčové následující kroky s poznamenáním údajů potřebných k přístupu k databázi:
- Podle vybrané lokality poznamenat URL InfluxDB Cluster Node
- Při instalaci nebo později vytvořit databázi (Bucket) na stránce Data/Buckets
– poznamenat Bucket ID - Vytvořit přístupový Token a nastavit oprávnění na stránce Data/Tokens
– poznamenat Token - Pojmenovat organizaci – Organization/About
– poznamenat User ID a Organization ID
3.3 Ukládání zpráv z MQTT brokeru do InfluxDB
Je několik možností, jak přijímat zprávy z MQTT brokeru a data ukládat do databáze InfluxDB.
- Vlastní skript/program – v Pythonu lze pro připojení k MQTT brokeru a InfluxDB použít moduly Paho MQTT Client a InfluxDB-Python. Jako například ve skriptech MQTT 2 InfluxDB Bridge nebo MQTTInfluxDBBridge.py.
- Program Telegraf obsahuje modul MQTT Consumer, který pracuje jako MQTT klient zapisuje odebírané zprávy do InfluxDB. V konfiguračním souboru
/etc/telegraf/telegraf.conf
stačí nastavit jen pár údajů nebo si vygenerovat potřebnou konfiguraci v administraci InfluxDB Cloud.
[[inputs.mqtt_consumer]]
servers = ["tcp://42616269c5a14a655a6c6f64c49b6a.s2.eu.hivemq.cloud:8883"]
topics = [
"test/#",
]
username = "kralicek-itacek"
password = "***heslo***"
[[outputs.influxdb_v2]]
urls = ["https://eu-central-1-1.aws.cloud2.influxdata.com"]
token = "$INFLUX_TOKEN"
organization = "Kralickovo"
bucket = "Kralickuv Bucket"
Do souboru /etc/default/telegraf
vložíme token pro přístup k databázi InfluxDB v podobě nastavení proměnné prostředí:
INFLUX_TOKEN=CkJhYmnFoWUgZG8ga2/FoWUuCgo=
- Definice toku dat ve vývojovém nástroji Node-RED – tuto variantu popíšu podrobněji níže.
3.4 Node-RED jako MQTT klient zapisující data do InfluxDB
Můžeme použít vlastní instalaci prostředí Node-RED na počítači nebo v cloudu. Nejzajímavější je spuštění v IBM Cloud v rámci free tier, kde lze celé používat zdarma (stačí úroveň Lite). Instalaci provedeme po počáteční registraci podle návodu. Během instalace se pro uložení dat programu vytvoří databáze Cloudant, spustí instance aplikace Node-RED a nakonfigurují nějaké další služby potřebné pro běh prostředí.
Po přihlášení do editoru Node-RED nastavíme:
- Menu / Manage palette / Install – do vyhledávacího pole zadáme influxdb a nainstalujeme doplněk node-red-contrib-stackhero-influxdb-v2
- Založíme a přejmenujeme nové Flow
- Vytvoříme node typu „mqtt-in“ a nastavíme:
- Server (Connection – hostname, port, Use TLS; Security – uživatelské jméno a heslo)
- Topic
- Output – a parsed JSON object
- Vytvoříme node typu „function“, pojmenujeme „toFloat“ a na záložce onMessage zadáme kód:
msg.payload = parseFloat(msg.payload);
return msg;
- Vytvoříme node typu „change“, pojmenujeme „prepare fields“ a nastavíme pravidlo:
- Set msg.payload to expression
{
'precision': 'ms',
'data': [
{
'measurement': 'test',
'tags': {
'host': 'zajickuvprevadec',
'topic': msg.topic
},
'fields': {
'value': msg.payload
},
'timestamp':$toMillis($now())
}
]
}
- Vytvoříme node typu „Stackhero-InfluxDB-v2-write“ a nastavíme přístupové údaje Database – Host, Port, TLS, Token, Organization, Default bucket
- Všechny vytvořené nody postupně propojíme z výstupu prvního na vstup druhého atd. Případně můžeme přidat node typu „debug“ pro výpis informací.
- Po vytvoření kompletního Flow použijeme vpravo nahoře tlačítko Deploy a mělo by začít fungovat.