## Úvod do internetu vecí s nástrojom Node-RED
#### alebo tvorba IoT riešení bez programovania
[Miroslav "mirek" Biňas](https://bletvaska.github.io)
/ [**IOSCS**]()
[![mirek](images/mirek.na.hackathone.jpg)](https://bletvaska.github.io)
> **Internet vecí** predstavuje sieť prepojených objektov (vecí), ktoré sú jednoznačne adresovateľné s tým, že táto sieť je založená na štandardizovaných komunikačných protokoloch umožňujúcich výmenu a zdieľanie údajov a informácií, ktorých analýzou bude možné docieliť vyššiu pridanú hodnotu. -- ([Pavel Pohanka](https://pavelpohanka.cz/internet-of-things/))
notes:
* IoT nie je len o hardveri
* ani o softveri
* ani len o datach
* o vsetkom, ale hladajme pridanu hodnotu
## Základom IoT sú **údaje**.
notes:
* architektura IoT riesenia musi zabezpecit zber, ulozenie aj analyzu.
[![Node-RED Logo](images/logo-node.red.png)](https://nodered.org)
## Čo je Node-RED?
> [Node-RED](https://nodered.org) is a **programming tool** for **wiring** together hardware devices, APIs and online services in new and interesting ways. ([homepage](https://nodered.org))
* grafický programovací nástroj
* **Flow-based programming** for the Internet of Things. (2017)
## A okrem toho...
* open source (zadarmo)
* platformovo nezávislý ([nodejs](https://nodejs.org/))
* aplikácia v prehliadači
## "Tradičné" požiadavky na vývoj IoT riešení
* programovanie v nízkoúrovňových jazykoch
* zručnosti na úrovni návrhu hardvéru
* rozumieť elektronike
* znalosti komplexných API pre integrovanie externých služieb
* znalosti TSDB systémov pre prácu s dátami
* znalosti z oblastí ako DA alebo ML pre aplikovanie poznatkov z uložených dát
Node-RED sa postará o technické aspekty vášho riešenia a pomôže vám sústrediť sa na váš **workflow**.
## Prípadová štúdia
notes:
* vecami môže byť čokoľvek čo vieme identifikovať. v našom prípade to budú lietadlá.
* stiahneme informácie o letoch nad slovenskom pomocou komunikačného protokolu HTTP
* spracujeme ich a zobrazíme ich na vlastnej mape
* zautomatizujeme proces sťahovania a aktualizácie údajov na mape
* získané údaje prepošleme ďalej pomocou komunikačného protokolu MQTT
* údaje začneme lokálne ukladať
* poskytneme ich ďalej pomocou REST API
* urobíme jednoduchú webovú stránku
* budem robit nazivo a samozrejme budem podvadzat
* som ucitel, takze mozem
## 1. Zber údajov z vecí
notes:
* running
```bash
$ docker container run --publish 1880:1880 --name nodered --volume $(pwd)/data:/data --rm nodered/node-red
```
[![The OpenSky Network](images/logo-opensky.png)](https://openskynetwork.github.io/opensky-api/index.html)
https://opensky-network.org/api/states/all?lamin=47.4912&lomin=16.4517&lamax=49.8981&lomax=25.9378
![Zber údajov](images/01.retrieve.data.png)
## Čo je to FBP?
> **Flow-Based Programming** is a programming paradigm that defines applications as **networks** of "black box" processes, which exchange data across predefined **connections** by **message passing**, where the connections are specified **externally** to the processes. ([Wikipedia](https://en.wikipedia.org/wiki/Flow-based_programming))
## Prenášaná správa
```json
{
"_msgid": "89cbb063.7f7a7",
"payload": "Hello world!",
"topic": "Greetings!"
}
```
[![node-red-contrib-web-worldmap](images/worldmap.node.gif)](https://flows.nodered.org/node/node-red-contrib-web-worldmap)
[node-red-contrib-web-worldmap](https://flows.nodered.org/node/node-red-contrib-web-worldmap)
notes:
* nainstalujeme plugin worldmap
* nastavit zemepisnu vysku a sirku, zoom level na hodnotu 8
* nainstalujeme plugin pre handlebars
## Šablóna pre spracovanie údajov
```json
[
{{#each states}}
{
"name": "{{0}}",
"icao24": "{{0}}",
"callsign": "{{1}}",
"origin_country": "{{2}}",
"lon": {{5}},
"lat": {{6}},
"icon": "plane",
"speed": {{9}},
"last_contact": {{4}},
"heading": {{10}},
"ttl": 60
}{{#unless @last}},{{/unless}}
{{/each}}
]
```
![Zber údajov](images/02.presenting.data.png)
## 3. Aktualizácia údajov
notes:
* nechame udaje stahovat napr. kazdych 10s
* cron job / systemd timers
* udaje budeme aktualizovat kazdych 5s, ale netreba zabudnut na cakanie 6s na zaciatku kvoli inicializacii mapy
![Aktualizácia údajov](images/03.updating.data.png)
## 4. Publikovanie údajov cez MQTT
notes:
* MQTT je jeden zo zakladnych komunikacnych protokolov v IoT rieseniach
* pouzijeme `broker.hivemq.com:1883` a topic `ossconf/flights`
![Publikovanie údajov](images/04.publishing.data.with.mqtt.png)
## 5. REST API
* HTTP protokol
* endpoint: `/api/flights/:cislo_letu`
notes:
## Lokálna databáza
* REST API musí údaje vrátiť okamžite po prijatí požiadavky
* databáza ako globálna premenná
* jednoduchý slovník (`key-value` store)
```json
{
{{#each this}}
"{{ icao24 }}": {
"icao24": "{{icao24}}",
"callsign": "{{callsign}}",
"origin_country": "{{origin_country}}",
"lon": {{lon}},
"lat": {{lat}},
"speed": {{speed}},
"last_contact": {{last_contact}},
"heading": {{heading}}
}{{#unless @last}},{{/unless}}
{{/each}}
}
```
notes:
* vysledok vlozime pomocou uzla `CHANGE` do premennej `global.flights = msg.payload`
![Uloženie údajov](images/05.storing.data.png)
![REST API](images/06.rest.api.png)
notes:
* `CHANGE` uzol urobi `msg.payload = global.flights[msg.req.params.flight]`
## Testovanie REST API
http://localhost:1880/api/flights/cislo_letu
## 6. Webová stránka
* podobné ako v prípade REST API
notes:
```html
<h1>Flight nr {{payload.callsign}}</h1>
<ul>
<li>
<b>ICAO24</b>: {{ payload.icao24 }}
</li>
<li>
<b>Callsign</b>: {{ payload.callsign}}
</li>
<li>
<b>Country of Origin</b>: {{ payload.origin_country }}
</li>
<li>
<b>Longitude</b>: {{ payload.lon }}
</li>
<li>
<b>Latitude</b>: {{ payload.lat }}
</li>
<li>
<b>Speed</b>: {{ payload.speed }}
</li>
<li>
<b>Heading</b>: {{ payload.heading }}
</li>
<li>
<b>Last Contact</b>: {{ payload.last_contact }}
</li>
</ul>
```
notes:
* vysledok vlozime pomocou uzla `CHANGE` do premennej `global.flights = msg.payload`
![Web Page](images/07.web.page.png)
notes:
* `SWITCH`:
* `property = global.flights`
* `has key = msg.req.params.flight`
* `otherwise`
* `CHANGE`
* `msg.payload = global.flights[msg.req.params.flight]`
## Čo ešte Node-RED dokáže?
* websocket-y
* pripojiť k nemu hardvér
* vlastné dashboard-y
* integrácia s DB systémami
* integrácia s ďalšími službami
* programovať uzly (JavaScript, Python)
* a iné
## Aké sú skúsenosti?
* [Namakané webináre](http://namakanyden.sk/webinare/) (Covid edition)
* [IoT kurz na TUKE](https://kurzy.kpi.fei.tuke.sk/iot1/) (2 roky)
* IoT kurz v rámci IT Akadémie (2 behy)
## Zdroje
* [domovská stránka nástroja Node-RED](https://nodered.org)
* [FRED: Front End For Node-RED](https://fred.sensetecnic.com)
* [flow s výslednou službou](resources/flows-flights.json)
* [Node-RED kanál na YouTube](https://www.youtube.com/channel/UCQaB8NXBEPod7Ab8PPCLLAA)
[![Follow Us on Facebook](images/follow.us.on.facebook.png)](https://www.facebook.com/namakanyden)
[www.facebook.com/namakanyden](https://www.facebook.com/namakanyden)
![qr code](https://api.qrserver.com/v1/create-qr-code/?data=https://bit.ly/3bzZfw2&size=300x300)
(**https://bit.ly/3bzZfw2**)