IoT workshop 11 juni 2018: verschil tussen versies

Uit Inf2019
Naar navigatie springen Naar zoeken springen
Regel 3: Regel 3:
== Workshop Netwerken/IoT 11 juni 2018 ==
== Workshop Netwerken/IoT 11 juni 2018 ==


In deze workshop maak je kennis met het lesmateriaal voor dit thema. Je voert enkele experimenten uit als een eerste voorproefje van dit materiaal.
In deze workshop maak je kennis met een deel van het lesmateriaal voor "IoT voor gebruikers". Je voert enkele experimenten uit als een eerste voorproefje van dit materiaal.
 
De nadruk in deze workshop ligt op de "edge" van het Internet of Things: de manier waarop je "''things''" aansluit, in het bijzonder via radioverbindingen en speciale IoT-gerichte protocollen. De verwerking van de data van deze "''things''" is een belangrijk onderdeel van de een IoT-toepassing, maar daar komen we nu niet aan toe.
 
We komen ook niet toe aan de implementatie-details: dat komt bij het IoT voor makers aan de orde en bij de nascholing voor docenten.


=== Voorkennis ===
=== Voorkennis ===

Versie van 11 jun 2018 08:41

Netwerken

IoT workshop 11 juni 2018

Zie ook Netwerken-project

Workshop Netwerken/IoT 11 juni 2018

In deze workshop maak je kennis met een deel van het lesmateriaal voor "IoT voor gebruikers". Je voert enkele experimenten uit als een eerste voorproefje van dit materiaal.

De nadruk in deze workshop ligt op de "edge" van het Internet of Things: de manier waarop je "things" aansluit, in het bijzonder via radioverbindingen en speciale IoT-gerichte protocollen. De verwerking van de data van deze "things" is een belangrijk onderdeel van de een IoT-toepassing, maar daar komen we nu niet aan toe.

We komen ook niet toe aan de implementatie-details: dat komt bij het IoT voor makers aan de orde en bij de nascholing voor docenten.

Voorkennis

Voorkennis voor deze workshop (en voor "IoT voor gebruikers"): Inleiding commmunicatie en netwerken.

  • basisbegrippen op het gebied van communicatie en netwerken; bitsnelheid/latency; pakketcommunicatie vs. verbindingsgerichte communicatie; netwerk; lokaal netwerk; internet, router/gateway/modem/firewall, internet-protocollen, ip-adres, domeinnaam,

Agenda

  • inleiding
  • opdracht 1 - gesimuleerde IoT-knoop en MQTT
  • opdracht 2 - dashboard, met IoT-knopen elders
  • opdracht 3 - NodeRed: een eigen dashboard
  • opdracht 4 - NodeRed: koppelen van IoT-knopen
  • opdracht 5 - fysieke knopen (op basis van ESP8266/WiFi)
  • opdracht 6 - fysieke knopen (op basis van RFM69)
  • opdracht 7 - LoRa en The Things Network
  • afronding, vragen, volgende stappen

Inleiding

Opzet van het materiaal van het thema Netwerken/Internet of Things

  • (1) Inleiding communicatie en netwerken
    • basisbegrippen communicatie, netwerken en internet - met de dagelijkse wereld van de leerling als context
  • (2) Internet of Things voor gebruikers
    • praktische inleiding in het internet of things - wat kun je ermee?
    • gebruik van verschillende soorten radio's, in verschillende configuraties (gateways e.d.)
  • (3) Internet of Things voor makers
    • uitwerking in detail van de onderdelen, samenstelling, programma's en configuraties
    • facultatief/eigen selectie
  • (4) Project Internet of Things
    • als (zo mogelijk gemengd) team werken aan een eigen IoT-toepassing

Voorkennis voor IoT-gedeelte: communicatie, web en internet

In het eerste deel van de module behandelen we de basisbegrippen van communicatie, netwerken, en het internet, vanuit de context van de dagelijkse omgeving van de leerling. Onder andere het web speelt daarbij een belangrijke rol. In het tweede deel (en later) beschouwen we deze basisbegrippen als bekend: we gebruiken deze, geven meer detail, of laten juist de verschillen tussen het web en het Internet of Things zien.

Internet of Things voor makers - en nascholing IoT

In het materiaal van deze deelmodule en in de docenten-nascholing gaan we dieper in op de constructie en het programmeren van de verschillende onderdelen. Zowel de hardware als de software zijn als "open source" publiek beschikbaar. Voor het programmeren van de onderdelen gebruiken we in eerste instantie de Arduino IDE. Sommige van de IoT-knopen die we gebruiken kun je ook programmeren met microPython.

  • een eerste versie van de nascholing wordt gegeven als samenwerking van IBM en Bètapartners-Amsterdam, in najaar 2018;
    • data: 20/9, 18/10, 15/11, 6/12 (en 10 januari als terugkomdag); steeds van 16:00-20:00 uur.
    • locatie: IBM Amsterdam
    • aanmelden via Betapartners (itsacademy.nl)
    • informatie bij Eelco Dijkstra.

Internet of Things - op de grens van de fysieke en de virtuele wereld

Een belangrijk aspect van communicatie, in vergelijking met rekenen en opslag van gegevens, is dat je naast de virtuele wereld van informatie, ook te maken hebt met de fysieke wereld van materie, krachten, straling en energie. Deze fysieke wereld bepaalt veel eigenschappen van communicatie, tot op het niveau van de toepassing. Bijvoorbeeld:

  • de snelheid van communicatie (bitsnelheid en latency);
  • de betrouwbaarheid van communicatie;
  • de veiligheid van communicatie;
  • het energieverbruik van communicatie;
  • de schaarste aan middelen voor communicatie (resources - in tijd en ruimte).

Bij zeer lokale communicatie kun je soms van deze fysische aspecten abstraheren. Bij radiocommunicatie en communicatie over lange afstanden (internet) lukt dat niet, en moet je met deze aspecten rekening houden. Bij het Internet of Things geldt dit in sterke mate.

Bovendien speelt bij het Internet of Things de fysieke wereld nog een rol: het gaat om het koppelen van fysieke dingen aan de virtuele wereld van het internet.

IoT - toepassingen

Het Internet of Things heeft een grote verscheidenheid aan toepassingen. Enkele voorbeelden:

  • domotica (huis-automatisering) - Philips Hue, enz.
  • dijkbewaking (slimme dijk)
  • sensoren in het spoor en in de treinen - vroegtijdig detecteren van slijtage en andere problemen
  • monitoring van loslopend vee in Afrika
  • detecteren van vrije parkeerplaatsen in een stad
  • precisie-landbouw (bijv. alleen water geven waar en wanneer dit nodig is)
  • smart meter, smart appliances - afstemmen

Enkele belangrijke thema's:

  • combineren met andere data en processen
  • gebruik van Data Science en Artificial Intelligence
  • beslissen op basis van actuele en individuele data - in plaats van op basis van historische gemiddelden
  • vroegtijdig signaleren van slijtage en andere problemen - "just in time" onderhoud
  • afstemmen en bij elkaar brengen van vraag en aanbod - "just in time" enz.
  • hierdoor in het algemeen: voorkomen van verspilling, vergroten van betrouwbaarheid

Internet of Things versus het web

Voor veel mensen bepaalt het web het gezicht en het karakter van het internet. Het IoT verschilt in een aantal opzichten fundamenteel van het web: dit verschil helpt om zowel het web, het internet en het IoT beter te begrijpen. Enkele van de verschillen:

  • De variatie aan "dingen" (en hun omgeving) is veel groter dan die van mensen: hierdoor is het IoT is veel heterogener dan het web;
    • o.a. een grote variatie aan radio's voor communicatie tussen "dingen" (IoT-knopen) en de rest van het internet;
  • Het IoT gebruikt andere protocollen en interacties:
    • bijvoorbeeld: MQTT/PubSub in plaats van HTTP/client-server
  • Je moet protocollen en diensten van allerlei verschillende niveaus kunnen koppelen:
    • van sensoren/actuatoren tot Data Science- en Artificial Intelligence-diensten (voor beslissingen);
    • bijvoorbeeld met NodeRed.
  • Fysieke aspecten spelen een belangrijke rol.
  • Tenslotte: het IoT is in een boeiende fase van ontwikkeling: de technologie is grotendeels beschikbaar, veel toepassingen moeten nog bedacht worden.

Grote variatie in radio-communicatie

Er is een heel grote variatie aan "things": van dijken tot stoelen en tafels, van auto's tot huisdieren, enz. De eisen die aan de communicatie tussen een "thing" en de toepassingen in het internet gesteld worden, verschillen daarmee sterk. In het bijzonder communiceren veel "things" bij voorkeur draadloos, waarbij de sensoren, actuatoren, lokale besturing en de communicatie (radio) vaak gevoed worden uit een batterij. Dit stelt zulke specifieke eisen aan de radiocommunicatie dat hiervoor meestal verschillende radio's gebruikt worden. Deze radio's worden bovendien op verschillende manieren aan het internet gekoppeld. We geven in de deelmodules daarvan 3 voorbeelden:

radio bereik energie bitsnelheid pakketgrootte (payload) #berichten/uur internet-verbinding alternatieven
WiFi 10-50m veel groot (Mbit/s) 1-2kbytes onbeperkt WiFi basestation <-> internet
RFM69 20-200m weinig ca. 50 kbit/s ca. 60 bytes 3600 gateway RFM69-netwerk <-> WiFi netwerk <-> internet ZigBee, Z-wave
LoRa 50-2000m weinig 5000-250 bit/s ca. 10-20 bytes ca. 30-5 publieke gateway <-> internet SigFox, LTE-NB
(BLE) 1-100m weinig 125kbit/s - 2 Mbit/s (??) (??) via computer/smartphone
  • Een WiFi-apparaat heeft meestal een permanente stroomvoorziening, of een grote batterij die regelmatig (bijv. dagelijks) opgeladen wordt. De batterijen voor LoRa- of RFM69-apparaten moeten maanden tot jaren mee kunnen gaan.
  • Bij LoRa is er een uitwisseling van bitsnelheid en bereik: hoe groter het bereik, des te kleiner de bitsnelheid ("je kunt de radio-energie maar op 1 manier gebruiken"). Een lagere bitsnelheid betekent ook minder berichten per uur.

Opdracht 1: gesimuleerde IoT-knopen, mqtt en toepassingen

IoT-knoop, broker en MQTT0

MQTT is een zogenaamd publish-subscribe protocol. De communicatie vindt in dit geval plaats tussen clients, met tussenkomst van een broker (makelaar). De broker heeft alleen als taak om berichten door te sturen:

  • een client abonneert zich ("subscribe") bij de broker op de berichten van een bepaald onderwerp ("topic"), bijvoorbeeld node/A/actuators;
  • een client kan een bericht (M) publiceren ("publish") onder een bepaald onderwerp. De broker stuurt dit bericht door ("push") naar alle clients zich op dit onderwerp geabonneerd hebben.
  • een client kan zowel "publisher" als "subscriber" zijn.

De MQTT "push"-interactie staat tegenover de pull interactie van het HTTP-protocol.

In deze opdracht gebruiken we gesimuleerde IoT-knopen, IoT-knopen van elders, en een MQTT-hulpprogramma waarmee we de interactie tussen de IoT-knopen, de MQTT-broker en IoT-toepassingen kunnen volgen. Dit hulpprogramma gebruiken we ook als eenvoudige IoT-toepassing.

Programma's

N.B.: deze programma's gebruiken de poorten 1883 en 1884; deze poorten zijn soms niet bereikbaar via een schoolnetwerk. Aan een oplossing hiervoor wordt gewerkt.

Opdrachten

Open de bovenstaande programma's (webpagina's) in een browservenster. Het is handig om de vensters met de IoT-knoop-simulator en met het MQTT0-hulpprogramma naast elkaar te plaatsen op de desktop.

IoT-knoop(-simulator): de ID van de knoop speelt een centrale rol in de communicatie; deze vind je onderaan. Deze waarde kun je aanpassen.

Voer de volgende stappen uit:

  1. MQTT0: vul de ID van de gesimuleerde knoop in, bij IoT-node
  2. IoT-knoop: verander een sensorwaarde (slider)
    1. MQTT0: je ziet nu een bericht met de nieuwe waarde(n) langskomen in het venster onder "subscribe".
    2. MQTT0: en je ziet de sensorwaarden in tabelvorm verschijnen.
  3. MQTT0: druk op de led-aan knop
    1. je ziet het bericht langskomen in het venster onder "subscribe"
    2. IoT-knoop: de linker led (led0) gaat (rood) branden.
  4. MQTT0: verstuur een MQTT bericht, met de twee vensters onderaan:
    1. vul het topic in voor het aansturen van de led(s) van je IoT-knoop;
    2. vul het bericht in om beide LEDs van je IoT-knoop aan te zetten;
    3. verstuur dit ("publish").
    4. IoT-knoop: de LEDs gaan aan.

Opmerking (MQTT0): je ziet ook de berichten van de andere knopen langs komen in het venster onder "subscribe". Als je alleen de berichten van je eigen knoop wilt zien, pas je het subscribe-topic aan, bijvoorbeeld tot node/e0f1/+.

We geven de opdrachten en de reacties nogmaals weer, in onderstaande tabel:

IoT-knoop MQTT-bericht (subscribe-venster) MQTT0
(1) vul ID van IoT-knoop in (bijv. e0f1)
(2) verander een sensorwaarde
-> node/e0f1/sensors -> sensorwaarden in tabel
(3) druk op LED-aan-knop
led0 gaat branden <- node/e0f1/actuators <-
(4a) vul juiste topic in (publish)
(4b) vul bericht in (publish)
(4c) klik op "publish"
led1 gaat branden <- node/e0f1/actuators <-

Theorie bij deze opdracht

MQTT voorbeeld
  • MQTT is een publish-subscribe (Pub/Sub) protocol; zie: MQTT met publieke broker
    • de mqtt-broker is infvopedia.nl:1883
    • deze is in de clients geconfigureerd: in de IoT-knoop-simulator en in het MQTT0-hulpprogramma.
    • deze clients zijn voor de broker gelijkwaardig (en in de berichten niet te onderscheiden).
    • deze clients communiceren alleen via de broker: ze kennen elkaar niet.

Opmerkingen

  • je ziet ook de MQTT-berichten van andere knopen voorbij komen: het teken "+" in een subscribe-topic is een wildcard-teken
    • pas het topic van het subscribe-venster aan zodat je alleen de berichten van je eigen knoop ziet.
  • de berichten zijn in het zgn. JSON formaat. Dit lijkt sterk op JavaScript. Een belangrijk verschil met JavaScript is dat de property-namen (veldnamen) altijd tussen dubbele "-s geschreven worden.

Opdracht 2: een sensor-dashboard

Voorbeeld van een dashboard

We hebben met NodeRed een simpel dashboard gemaakt voor een aantal IoT-knopen. In deze opdracht bestudeer je dit dashboard, en sluit je je eigen IoT-knoop op dit dashboard aan. In een volgende opdracht maak je zelf een dashboard.

Het dashboard gebruikt enkele knopen die elders opgesteld staan:

  • TTN-knopen: LoRa-knopen verbonden via een publieke TTN gateway (http://thethingsnetwork.org)
  • IoT-knopen via WiFi verbonden in een lokaal netwerk
  • IoT-knopen via RFM69 verbonden via een gateway in een lokaal netwerk

Opdrachten

  1. bekijk het dashboard en de verschillende sensorgegevens;
  2. vergelijk de waarden in het dashboard met de waarden die je in de MQTT-berichten ziet;
    1. vergelijk de sensordata van de verschillende IoT-knopen; wat valt je daarbij op?
  3. verbind je IoT-knoop-simulator met het dashboard:
    1. IoT-knoop-simulator: stel als adres in: ffa0;
    2. controleer dat je je sensor-instellingen in het dashboard terugvindt;
    3. mogelijk zijn er meerdere IoT-knopen met hetzelfde adres: wat gebeurt er dan?

Opdracht 3: NodeRed (via FRED) - je eigen dashboard

Het dashboard dat je eerder gebruikt hebt is gemaakt met NodeRed. Met NodeRed koppel je op een grafische manier allerlei protocollen en diensten aan elkaar. Dit is bijzonder handig voor het Internet of Things, omdat je met zoveel verschillende protocollen en diensten te maken hebt.

NodeRed is op verschillende manieren beschikbaar. Op de standaard-distributie voor de Raspberry Pi is NodeRed al geïnstalleerd. Als je NodeRed "in the cloud" gebruikt, kun je er een server mee maken die in het publieke internet beschikbaar is. Er zijn verschillende clouddiensten waar je eenvoudig NodeRed kunt installeren. We gebruiken in dit voorbeeld een clouddienst die helemaal gericht is op NodeRed (en op MQTT): FRED (https://fred.sensetecnic.com/)

  • de gratis FRED-account heeft de nodige beperkingen, maar dit is een goed platform om te oefenen met NodeRed.
  • de eerste flow-pagina (tab) van een nieuwe account bevat allerlei voorbeelden; hier kun je later mee experimenteren.

In deze opdracht (1) importeer je onderstaande flow voor een dashboard in NodeRed; en (2) vervolgens pas je deze aan voor je eigen (gesimuleerde) IoT-knoop. Je past een node aan door een "dubbelklik" daarop: je krijgt dan de instellingen van de node te zien.

Opdrachten

  • start een gesimuleerde IoT-knoop, en stel hierin een eigen unieke node-ID in.
  • log in bij FRED, en activeer NodeRed (indien nodig)
  • maak een nieuwe tab (via "+")
  • kopieer de code hieronder naar NodeRed:
    • kopieer deze code naar het clipboard ("Copy", bijv. ctrl-C of cmd-C)
    • ga naar NodeRed, en selecteer "import->clipboard" (via hamburger-menu rechtsboven)
    • "Paste" (ctrl-P/cmd-P) de inhoud van het clipboard in het venster
    • klik op "Import"; de flow verschijnt nu in NodeRed
  • pas de knoop MQTT-input-node node/e0f1/sensors aan (double click op de node):
    • verander het Topic in het sensor-topic van je eigen IoT-knoop (met eigen node-ID);
    • selecteer als Server (mqtt-broker) "infvopedia.nl"
    • klik op de pen rechts naast deze servernaam om de instellingen te veranderen
    • selecteer de tab "Security", en pas de instellingen aan:
      • Username: mqtttest
      • Password: testmqtt
      • klik op "Update" om de instellingen te bewaren.
    • "Save"
  • activeer deze flow ("Deploy", rechts boven)
    • je kunt het dashboard in je browser bekijken via de dashboard-tab, hokje met uitgaande pijl (rechtsboven)
    • in het dashboard (in je browser) selecteer je de tab My-node
    • als je nu een sensorwaarde in je eigen IoT-knoop verandert, moet je dit in het dashboard kunnen zien.

De dashboard-flow

NodeRed dashboard flow

[{"id":"5e3f6502.43471c","type":"mqtt in","z":"c9819513.b5c408","name":"","topic":"node/e0f1/sensors","qos":"2","broker":"d97b4423.5d2e78","x":170,"y":120,"wires":[["9a7d4d72.52a178"]]},{"id":"9a7d4d72.52a178","type":"json","z":"c9819513.b5c408","name":"","pretty":false,"x":210,"y":220,"wires":[["4d0ca7b0.c72278","f844ca03.6d7bf8","c4605ff8.e68618"]]},{"id":"bd11d240.d3e168","type":"ui_gauge","z":"c9819513.b5c408","name":"","group":"a4643fc8.e80d68","order":0,"width":0,"height":0,"gtype":"gage","title":"Temperatuur","label":"'C","format":"{{payload}}","min":0,"max":"50","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":610,"y":200,"wires":[]},{"id":"eb10bb85.4c73b8","type":"ui_chart","z":"c9819513.b5c408","name":"","group":"b7537500.9e9de","order":0,"width":0,"height":0,"label":"Temperatuur","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"0","ymax":"50","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":610,"y":240,"wires":[[],[]]},{"id":"4d0ca7b0.c72278","type":"change","z":"c9819513.b5c408","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.temp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":220,"wires":[["eb10bb85.4c73b8","bd11d240.d3e168"]]},{"id":"2881d11b.ee3086","type":"ui_gauge","z":"c9819513.b5c408","name":"","group":"a4643fc8.e80d68","order":0,"width":0,"height":0,"gtype":"gage","title":"Luchtdruk","label":"units","format":"{{payload}}","min":"950","max":"1050","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":600,"y":300,"wires":[]},{"id":"96937342.1bee2","type":"ui_chart","z":"c9819513.b5c408","name":"","group":"b7537500.9e9de","order":0,"width":0,"height":0,"label":"Luchtdruk","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"950","ymax":"1050","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":600,"y":340,"wires":[[],[]]},{"id":"f844ca03.6d7bf8","type":"change","z":"c9819513.b5c408","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.pres","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":320,"wires":[["2881d11b.ee3086","96937342.1bee2"]]},{"id":"c4605ff8.e68618","type":"debug","z":"c9819513.b5c408","name":"","active":true,"console":"false","complete":"false","x":390,"y":160,"wires":[]},{"id":"d97b4423.5d2e78","type":"mqtt-broker","z":"","name":"","broker":"infvopedia.nl","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","willTopic":"","willQos":"0","willRetain":"false","willPayload":""},{"id":"a4643fc8.e80d68","type":"ui_group","z":"","name":"my-meters","tab":"4e75c8d2.40f86","disp":true,"width":"6","collapse":false},{"id":"b7537500.9e9de","type":"ui_group","z":"","name":"My-graphs","tab":"4e75c8d2.40f86","disp":true,"width":"6","collapse":false},{"id":"4e75c8d2.40f86","type":"ui_tab","z":"","name":"My-node","icon":"dashboard"}]

Opdracht 4 NodeRed: koppelen van twee IoT-knopen

Je kunt in NodeRed ook verschillende IoT-knopen aan elkaar koppelen. We gebruiken dit om met de knoppen van de ene IoT-knoop een LED van een andere IoT-knoop aan- en uit te schakelen.

We gebruiken de ene knop om een LED aan te zetten, en de andere knop om deze uit te zetten. Dit zorgt ervoor dat er geen vreemde dingen gebeuren als er een bericht verloren gaat.

  • Deze aanpak gebruik je veel vaker bij communicatie: het maakt dan geen verschil of een bepaalde opdracht 1 keer of vaker uitgevoerd wordt. Een dergelijke opdracht noemen we idempotent. Dit vinden we onder andere terug bij de HTTP-opdrachten: GET en PUT zijn idempotent; POST, bijvoorbeeld voor het opsturen van een ingevuld formulier, is niet idempotent: de browser vraagt je dan ook of je "het formulier nog een keer wilt opsturen".
  • Merk op: veel knoppen op een infrarood-afstandbediening zijn idempotent (behalve: de volume-knoppen en de knoppen voor vorig/volgend kanaal).
  • Ga na wat er kan gebeuren als je één knop gebruikt voor het aan- en uitzetten van een enkele LED, in een situatie dat er berichten verloren kunnen gaan.

Opdracht

Bij deze opdracht heb je twee IoT-knopen nodig: met de buttons van de ene knoop bedien je een LED van de andere knoop.

(1) Importeer de flow, pas deze aan, en test deze:

  • maak een IoT-knoop(simulator) aan, en geef deze een eigen (uniek) adres (nodeA);
  • maak een tweede IoT-knoop aan, en geef deze een eigen (uniek) adres (nodeB);
  • maak een nieuw flow-venster aan in NodeRed (via de "+"-tab);
  • importeer hierin de flow-code die hieronder staat;
  • pas de volgende knopen aan:
    • node/eof1/sensors (mqtt input-node)
      • verander het Topic in node/[nodeA]/sensors, waarin [nodeA] de ID is van nodeA
      • "Save"
    • node/eof2/actuators (mqtt output node)
      • verander het Topic in node/[nodeB]/sensors, waarin [nodeB] de ID is van nodeB
      • "Save"
  • "Deploy" de aangepaste flow
  • Test de flow:
    • Button0 van NodeA schakelt Led0 van NodeB aan
    • Button1 van NodeA schakelt Led0 van NodeB uit

(2) Deze flow heeft als nadeel dat je bij NodeA niet ziet of Led0 bij NodeB brandt.

  • pas de flow aan zodat Button0 ook Led0 van NodeA aanzet, en Led0 van NodeA uitzet
    • hint: je hoeft maar 1 output-node toe te voegen.

(3) Wat lastiger is de volgende variant:

  • pas de flow aan zodat Button0 Led1(!) van NodeA aanzet, en Led1 van NodeA uitzet (in plaats van Led0).
    • (en nog steeds Led0 van NodeB schakelt)
    • tip: binnen NodeRed kun je nodes of hele flows kopiëren en plakken met Copy/Paste.

(4) De volgende stap ligt nu voor de hand:

  • pas de flow aan zodat Button0 van NodeB Led0 van NodeA en Led1 van NodeB aan zet; Button1 van NodeB zet deze leds uit.

Flow bij deze opdracht

IoT node - switch flow

Uitleg bij deze flow:

  • de mqtt-input-node ontvangt (via "subscribe") de berichten van het Topic node/[IDa]/sensors
  • de JSON-node zet de JSON-tekst van het mqtt-bericht om in een JavaScript-object
  • de switch-node splitst de berichten in:
    • berichten met button0: 1 en
    • berichten met button1: 1;
  • deze verschijnen op de twee uitgangen, en op de ingangen van de template-nodes:
    • de eerste template-node geeft als resultaat {"led0": 1} (in JSON)
    • de tweede template-node geeft: {"led0": 0} (idem)
  • de mqtt-output-node verstuurt ("publish") het JSON-bericht onder Topic node/[IDb]/actuators
  • controleer de berichten met het mqtt-hulpprogramma
  • controleer de berichten door debug-nodes aan de flow toe te voegen (vergeet "Deploy" niet!).

NodeRed-code van deze flow:

[{"id":"7bd76101.769c6","type":"mqtt in","z":"21e77168.c3a01e","name":"","topic":"node/e0f1/sensors","qos":"2","broker":"d97b4423.5d2e78","x":210,"y":120,"wires":[["61316186.c89fa8"]]},{"id":"61316186.c89fa8","type":"json","z":"21e77168.c3a01e","name":"","property":"payload","action":"","pretty":false,"x":400,"y":120,"wires":[["65a7b0ed.8e5d"]]},{"id":"65a7b0ed.8e5d","type":"switch","z":"21e77168.c3a01e","name":"button0/1 split","property":"payload","propertyType":"msg","rules":[{"t":"jsonata_exp","v":"payload.button0 = 1","vt":"jsonata"},{"t":"jsonata_exp","v":"payload.button1 = 1","vt":"jsonata"}],"checkall":"true","repair":false,"outputs":2,"x":330,"y":240,"wires":[["441083fd.53bc6c"],["54723040.784cf"]]},{"id":"441083fd.53bc6c","type":"template","z":"21e77168.c3a01e","name":"led0-1","field":"payload","fieldType":"msg","format":"json","syntax":"mustache","template":"{\"led0\": 1}","output":"str","x":540,"y":220,"wires":[["e12e623.940f0a"]]},{"id":"54723040.784cf","type":"template","z":"21e77168.c3a01e","name":"led0-0","field":"payload","fieldType":"msg","format":"json","syntax":"mustache","template":"{\"led0\": 0}","output":"str","x":540,"y":260,"wires":[["e12e623.940f0a"]]},{"id":"e12e623.940f0a","type":"mqtt out","z":"21e77168.c3a01e","name":"","topic":"node/e0f2/actuators","qos":"","retain":"","broker":"d97b4423.5d2e78","x":790,"y":240,"wires":[]},{"id":"d97b4423.5d2e78","type":"mqtt-broker","z":"","name":"","broker":"infvopedia.nl","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","willTopic":"","willQos":"0","willRetain":"false","willPayload":""}]

Opdracht 5: fysieke IoT-knopen op basis van ESP8266

IoT-knoop met publieke MQTT broker

De ESP8266-knopen hebben een ingebouwde WiFi-radio; daarmee communiceren ze via een lokaal WiFi-netwerk met de MQTT-broker in het publieke internet.

De node-ID bestaat uit de laatste 4 cijfers van het MAC-adres van deze WiFi-radio: je vindt dit op de sticker op de node.

Opmerkingen:

  • Voor het lokale WiFi-netwerk gebruiken we een MiFi: een mobiele WiFi-router. Deze heeft maar een beperkt WiFi-bereik, en een beperkt aantal WiFi-clients; maar je kunt deze bijna overal gebruiken.
  • Je kunt een dergelijke node eenvoudig opbouwen op een breadboard; maar je kunt ook een voorgesoldeerde versie (laten) maken. De sensoren zijn dezelfde als voor de simulator.

Opdrachten

  • MQTT0: vul de node-ID in van je ESP8266-knoop
  • MQTT0: zet led0 van de ESP8266-knoop aan (via het "publish" venster)
  • MQTT0: stuur een bericht om beide LEDs aan (of uit) te zetten naar de ESP8266-knoop
  • ESP8266-knoop: hou je vinger op de LDR; en zie dat (binnen ca. 50 seconden) MQTT0 een andere sensorwaarde weergeeft.

Opdracht 6: fysieke knopen op basis van RFM69

IoT-knopen met lokale gateway

Om IoT-knopen met een kleine batterij te kunnen voeden, met een lange levensduur, is "low power" communicatie van belang. WiFi is daarvoor niet de beste keuze. Een alternatief is de RFM69-radio (of vergelijkbaar: ZigBee, Z-wave). Deze heeft een bereik van 25-250 meter, afhankelijk van de omgeving en van de antenne.

We gebruiken IoT-knopen met deze radio in combinatie met een gateway: deze zet het "low power" protocol van de IoT-knopen om in MQTT over WiFi.

  • in de mqtt-berichten zie je behalve de sensorgegevens ook enkele gegevens van de gateway, zoals de sterkte van het ontvangen signaal (rssi).
  • omdat er berichten verloren kunnen gaan, stuurt de IoT-knoop ook een volgnummer mee.
  • de node-ID staat op de node.

Opdrachten

  • MQTT0: vul de node-ID in van je RFM69-knoop
  • MQTT0: zet led0 van de IoT-knoop aan (via het "publish" venster)
  • MQTT0: stuur een bericht om beide LEDs aan (of uit) te zetten naar de IoT-knoop
  • IoT-knoop: hou je vinger op de LDR; en zie dat (binnen ca. 50 seconden) MQTT0 een andere sensorwaarde weergeeft.

Opdracht 7: LoRa en TTN - thethingsnetwork

IoT-knopen met publieke gateway

De LoRa-radio maakt "long range" communicatie mogelijk - met een bereik tot enkele kilometers. Dit bereik gaat ten koste van de bitsnelheid; door de verdere beperkingen van de radioband (868MHz) betekent dit dat je met in een uur 10-30 berichten kunt sturen met een payload van ca. 10 bits.

De LoRa-radio's van de "things" communiceren meestal met een LoRaWAN-gateway. Deze gateway communiceert met een LoraWAN-server, die onder andere zorgt voor de coördinatie van de verschillende gateways en de bijbehorende LoRa-IoT-knopen.

  • LoRa is de radio; LoRaWAN is het bijbehorende netwerk (en netwerkprotocol).
  • een LoRaWAN-gateway kun je vergelijken met een "zendmast" van mobiele telefonie: een LoRa-IoT-knoop communiceert met de dischtbijzijnde LoRaWAN-gateway(s) van de eigen aanbieder.

Er zijn meerdere aanbieders van LoRaWAN-netwerken; ondere andere KPN. Een bijzondere aanbieder is TheThingsNetwork (TTN; https://thethingsnetwork.org). Dit is een netwerk opgebouwd door een "community": een groot aantal particulieren en bedrijven die samen het netwerk maken en ondersteunen, bijvoorbeeld door een eigen gateway in het netwerk aan te sluiten.

Opdrachten

TTN Console

(1) Log in bij het console van een voorgedefinieerde toepassing op TheThingsNetwork:

(2) Ga naar het Console

  • selecteer Applications
  • selecteer application infvo-iot-22feb
  • in de Data tab kun je nu de ontvangen data bekijken

(3) Selecteer een data-regel in de Data-tab (klik op de regel), en bestudeer de data:

  • Upload: van IoT-knoop naar gateway
  • payload: de binaire payload
    • dit is een gecomprimeerd formaat, geconstrueerd in het (Arduino)programma in de IoT-knoop
  • fields: de gedecodeerde payload (zie verderop);
  • metadata, o.a.
    • tijd van ontvangst, frequentie, data-rate
    • de identificatie van de gateway, en de locatie van de gateway
  • estimated airtime: de duur van een bericht (in het communicatiekanaal)
    • "fair use": max. 30 s. per dag
  • opmerking: deze data vind je ook terug in het JSON-object dat je in NodeRed ontvangt via MQTT

(4) Omvormen van de payload-data

  • selecteer de tab Application formats;
  • je ziet hier de functie die gebruikt wordt om het binaire payload-formaat om te zetten in een JavaScript-object.

(5) Access key

  • selecteer tab Overview
  • onder "Access keys" vind je de sleutel die je bijv. in NodeRed kunt gebruiken om de data van deze toepassing te ontvangen
  • je kopieert de sleutel via het clipboard-icoon rechts
  • klik eventueel op het oogje om de sleutel zichbaar te maken

TTN in NodeRed

Voer de onderstaande opdrachten uit in NodeRed (via FRED):

(1) Voeg eventueel de TTN-nodes toe (eenmalig):

  • Selecteer links: Add or Remove nodes
  • Selecteer IoT
  • Onderaan vind je TTN: vink deze aan
  • de TTN-knopen vind je na installatie in de lijst met knopen links

Voor andere NodeRed installaties voeg je de TTN-knopen toe via "Hamburger menu->Manage Palette".

(2) Testen van TTN-node(s):

  • maak een nieuwe flow-tab aan (+)
  • selecteer van de knopen links een TTN Uplink-node, en plaats deze in het flow-venster
  • configureer deze (double click):
    • App: ...add new ttn app...
      • App ID: infvo-iot-22feb
      • Access key: ... de sleutel die je vanuit het console gekopieerd hebt...
  • sluit op de output van deze node, een Debug-node aan
  • "Deploy"
    • je krijgt nu de binnenkomende berichten van de TTN-toepassing te zien, in het debug-venster
    • als je de metadata wilt zien: verander in de debug-node, de Output van "msg.payload" in "Complete msg object".

TTN community

  • Ga naar: https://www.thethingsnetwork.org/community
  • zoek een community in de buurt van je school (of van je woonplaats)
    • zie bijv. de lijst met communities/plaatsen onder "The Netherlands) (bij de T)
  • ga na of er al een gateway is in de buurt van je school (of van je huis)
  • ga na wat er voor nodig is om een gateway op je school te installeren.