Deel 8: Laat je ‘things’ met elkaar praten via MQTT

Het versturen en ontvangen van data is de basis van het Internet of Things. Zou dat niet kunnen, dan kunnen de apparaten niet op elkaar reageren. Zoals ik in de blauwdruk al schreef zijn er veel manieren om data te versturen. Naast het versturen van data via radiosignalen (433 MHz) is het ook mogelijk om gebruik te maken van je bestaande wifi-netwerk. Maar: welk protocol gebruik je daar dan voor?

Protocollen

Er zijn honderden manieren om data over het wifi-netwerk te versturen. Je kunt bijvoorbeeld een e-mail sturen of een webpagina opvragen. Het zijn allebei manieren om een stuk data over te brengen van het ene apparaat naar het andere. Maar: wat is nu de simpelste manier, die bovendien zo min mogelijk energie en geld kost? Een van die oplossingen is MQTT.

MQTT

MQTT is al in 1999 ontwikkeld door onder andere IBM. Het is een voorbeeld van communicatie tussen apparaten (M2M-communicatie). Het protocol werd (en wordt) vaak gebruikt voor telemetrie. De afkorting MQTT stond dan ook voor Message Queue Telemetry Transport. Het protocol is ‘lichtgewicht’ en uitermate geschikt voor het versturen van kleine hoeveelheden data (en het maakt niet uit wat voor soort data!). Bovendien is het ontwikkeld met onbetrouwbare verbindingen in het achterhoofd. Ideaal voor het Internet of Things dus!

In 2013 werd MQTT open source gemaakt en sindsdien waakt OASIS over deze open standaard. Met de snelle groei van het Internet of Things kwam ook MQTT opnieuw in de aandacht. Omdat MQTT inmiddels niet meer alleen wordt gebruikt voor telemetrie, is de naam niet langer een afkorting.

Hoe werkt MQTT?

In een notendop: MQTT werkt met een ‘broker’ (een server) en clients. Die clients kunnen data versturen naar een ‘topic’ of zich abonneren op een topic. Zo kan data worden uitgewisseld. Bovendien is er een aantal slimme foefjes bedacht, zoals het bewaren van berichten en het instellen van QoS (Quality of Service).  Voor een uitgebreidere uitleg over het protocol kun je hier terecht of op de Github-pagina van MQTT.

MQTT gevisualiseerd
MQTT gevisualiseerd door HiveMQ, een commerciële aanbieder van MQTT-diensten. Via: http://www.hivemq.com/wp-content/uploads/publish_flow.png

Waarom MQTT zo nuttig is, komt in een andere post aan de orde. Dan leg ik uit hoe je sensors kunt toevoegen aan Homebridge.

Installeren

Het installeren van MQTT op een Raspberry Pi Zero is uitermate eenvoudig. Er zijn meerdere programma’s beschikbaar, maar ik heb gekozen voor Mosquitto.

Stap 1: Voeg Mosquitto toe aan de repositories. De laatste versie van Mosquitto zit niet in de repositories (simpel gezegd: de database met programma’s) van Raspbian Jessie. Om toch de laatste versie te kunnen installeren voegen we de ‘repository’ van Mosquitto toe. Daartoe moeten we eerste de gpg-sleutel toevoegen. Als dat is gebeurd verversen we de lijst met repositories op de Pi. Let op: iedere regel is een commando dat moet worden afgesloten met een Enter.

Stap 2: Installeer Mosquitto. Naast de server voegen we ook de clients toe en de Python-bindings.

Stap 3: Configureer Mosquitto. Om dat te doen moet de server (die meteen na het installeren wordt gestart) eerst worden gestopt.

Dan pas je het configuratiebestand aan:

Voeg na de regel log_dest topic de volgende regels toe:

Stap 4: Sla het configuratiebestand op.

Sla het bestand op met Ctrl + X, Y en Enter.

Stap 5: Start de Mosquitto-broker.

Voila: Mosquitto draait nu en kan gebruikt worden.

Authenticatie

Standaard hoef je je niet aan te melden met een gebruikersnaam en wachtwoord op een MQTT-broker. Vanuit het oogpunt van de veiligheid is dat wel gewenst. Daarom is het verstandig om dit in te schakelen. Dat doe je als volgt:

Stap 1: Stop de Mosquitto-broker.

Stap 2: Maak een wachtwoord-bestand aan. Let op: pas onderstaande voorbeeld aan met je eigen gebruikersnaam. In dit geval is gekozen voor gebruiker pi. Er wordt twee keer gevraagd om een wachtwoord. Wil je meerdere gebruikers aanmaken? Herhaal dan het commando met een andere gebruikersnaam.

Stap 3: Pas de configuratie van Mosquitto aan.

Voeg de volgende regels toe aan het configuratiebestand:

De laatste regel maakt het onmogelijk in te loggen zonder gebruikersnaam en wachtwoord.

Stap 4: Sla het configuratiebestand op.

Sla het bestand op met Ctrl + X, Y en Enter.

Stap 5: Herstart de Mosquitto-broker.

Mosquitto draait nu met ingeschakelde authenticatie. Om te testen of alles werkt kun je gebruikmaken van een MQTT-app op bijvoorbeeld je telefoon. Ik gebruik daarvoor MQTT Tool voor iOS.

Side note: echt veilig is de combinatie gebruikersnaam/wachtwoord allang niet meer. Het zou beter zijn om bijvoorbeeld met certificaten te werken. Dat is met MQTT ook mogelijk, maar let op: niet elke client kan met certificaten overweg. Het is bijvoorbeeld ingewikkelder als je een ESP8266 gebruikt.

Lees verder in Deel 9: Het gebruik van de sensors in HomeKit.

Deel 7: De TSL2561-sensor aansluiten op een Raspberry Pi Zero

De tweede sensor die ik wilde aansluiten was een sensor die de lichtintensiteit meet. Ik heb gekozen voor de digitale I2C-sensor, de TSL2561 van Adafruit.

Hardware

De TSL2561 is een kleine sensor die het zichtbare licht meet én het licht in het infraroodspectrum. De sensor wordt gemaakt door AMS, voorheen TAOS (datasheet). Ik heb toevallig voor het board van Adafruit gekozen, maar dezelfde sensor wordt ook door Sparkfun aangeboden en is te koop via Chinese webshops.

De sensor kan op verschillende gevoeligheden worden ingesteld, zodat je de sensor ook kunt gebruiken bij veel of juist heel weinig licht. De TSL2561 werkt via I2C.

 

TSL2561 sensor

 

Het aansluiten is relatief eenvoudig:

Fritzing TSL2561 en Raspberry Pi Zero

De pinnen op de TSL2561 van links naar rechts gezien:

  • Vin: Voeding (3.3V) → Pin 1
  • GND: Ground (GND) → Pin 6
  • 3vo: Niet in gebruik
  • Addr: Niet in gebruik
  • Int: Niet in gebruik
  • SDA: Seriële data → Pin 3
  • SCL: Seriële klok → Pin 5

Voor een handig overzicht van de ‘pinout’ op Raspberry Pi Zero kun je dit diagram gebruiken.

Ter referentie: Pin 1 (het oranje vierkantje linksboven), is de meest linker pin van de onderste rij als je de Pi Zero voor je hebt liggen met de USB-aansluitingen naar je toe.

Pinout Raspberry Pi Zero
Pinout Raspberry Pi Zero, afbeelding via The Pi4J Project: http://pi4j.com/images/j8header-zero-large.png

 

I2C

I2C (meestal gewoon geschreven als I2C) is een manier om te kunnen communiceren tussen microprocessors en andere IC’s. Om met I2C te werken moet er een aantal zaken worden ingesteld.

Stap 1: Inschakelen I2C

Standaard staat I2C niet aan op de Raspberry Pi Zero. Om I2C in te schakelen, start je raspi-config.

Ga naar Advanced Options → I2C en schakel deze in.

Stap 2: Installeer i2c-tools

Om vervolgens aan de slag te kunnen met I2C en te controleren of de sensor goed is aangesloten, is het handig om i2c-tools te installeren. Dat doe je als volgt:

Stap 3: Test of de sensor zichtbaar is

Om te controleren of de sensor wordt herkend door de Pi geef je het volgende commando:

Als je vervolgens een overzicht krijgt met het nummer 39 (het standaard I2C-adres van de TSL2561) dan zit je goed. Verschijnt de sensor niet, dan is er iets niet goed gegaan met het aansluiten.

Voorbeeldscript

Stap 1: Installeer smbus

Om de sensor uit te kunnen lezen met Python heb je een script nodig. Dit script maakt gebruik van smbus, een stukje software om via Python en de System Management Bus het I2C-apparaat aan te sturen. Dat onderdeel moet dus eerst worden geïnstalleerd.

Side note: eigenlijk is dit een omweg om de sensor uit te lezen. Het is ook mogelijk om de sensor direct via i2c uit te lezen. Waarom geef ik daar dan geen voorbeeld van? Simpel: ik kon geen geschikt script vinden om de sensor op de juiste manier aan te sturen. Er bestaat ook een smbus-versie van de sensor, dat is de TSL2560. Meer informatie in deze datasheet van AMS.

Stap 2: Open een nieuw document in Nano

Je opent nu een nieuw document met de naam tsl2561voorbeeld.py in de Nano-editor.

Stap 3: Kopieer en plak het script

Kopieer en plak de volgende code.

Stap 4: Opslaan

Sla het script op met Ctrl + X, Y en Enter.

Stap 5: Draai het script

Het script kun je uitvoeren met het volgende commando:

 

Lees verder in Deel 8: Laat je ‘things’ met elkaar praten via MQTT

Deel 6: De DHT22-sensor aansluiten op de Raspberry Pi Zero

De eerste sensor die ik wilde aansluiten was de DHT22, een digitale sensor die de temperatuur en de vochtigheid meet. De DHT22 is voor iets meer dan 2 dollar te koop in China en is het grote broertje van de DHT11.

Hardware

De DHT22 wordt soms geleverd op een speciaal bordje, een breakout board, maar in mijn geval heb ik gewoon gekozen voor de sensor, zonder breakout board. De sensor wordt ook wel de AM2302 genoemd en wordt gemaakt door Aosong in China (datasheet). De DHT11 kan ook gebruikt worden, maar meet een stuk minder nauwkeurig.

DHT22 sensor

Het aansluiten is relatief eenvoudig:

Fritzing DHT22 en Raspberry Pi Zero
Fritzing diagram DHT22 en Raspberry Pi Zero

De pinnen op de DHT22 van links naar rechts gezien:

  • Pin 1: Voeding (3.3V) → Pin 17
  • Pin 2: Data input → Pin 15
  • Pin 3: Niet in gebruik
  • Pin 4: Ground (GND) → Pin 9

Ik heb een weerstand van 10kΩ gebruikt, zoals wordt geadviseerd. Die zet je tussen de voeding en de datapin als pull-up. Het is letterlijk een kwestie van minuten om de sensor aan te sluiten.

Library

Om de sensor te kunnen uitlezen met de Raspberry Pi is een ‘library’ vereist. Adafruit (de elektronicaspecialist uit de Verenigde Staten) heeft die voor de DHT22 al gemaakt. Je kunt die vinden op GitHub. Bovendien moet de programmeertaal Python geïnstalleerd zijn. Dat laatste is overigens standaard het geval bij Raspbian.

Stap 1: Installeer de Python ontwikkeltools

Voordat je de libraries kunt installeren, moet je eerst de Python ontwikkeltools installeren. Dat doe je als volgt:

Is dat al gedaan? Dan zal het systeem dat netjes aangeven en verandert er niks. Is dat nog niet gedaan, toets Y en Enter.

Stap 2: Installeer de libraries

Je kunt op twee manieren de libraries installeren:

Met behulp van ‘git’

 

Handmatig, door de bestanden te downloaden van GitHub met wget.

Let op: de bestanden worden gedownload in de folder waar je je op dat moment bevindt!

 

Voorbeeldscript

Als de installatie voltooid is, kun je met een Python-script de sensor uitlezen. Adafruit heeft een voorbeeldscript gemaakt, dat je als volgt kunt aanmaken:

Stap 1: Open een nieuw document in Nano

Je opent nu een nieuw document met de naam DHT22voorbeeld.py in de Nano-editor.

Stap 2: Kopieer en plak het script

Kopieer en plak de volgende code. In het script wordt uitgegaan van de aansluiting van de DHT22 op GPIO pin 4.

Stap 3: Opslaan

Sla het script op met Ctrl + X, Y en Enter.

Stap 4: Draai het script

Het script kun je uitvoeren met het volgende commando:

 

Lees verder in Deel 7: De TSL2561-sensor aansluiten op de Raspberry Pi Zero.

Deel 5: De blauwdruk voor mijn ‘Things’ en sensors

Het Internet of Things bestaat grotendeels uit apparaten die iets meten. Met behulp van sensors dus. Die sensors kunnen licht meten, temperatuur, vochtigheid, de hoeveelheid regen, en ga zo maar door. Het IoT bestaat ook uit apparaten die zelfstandig iets kunnen: een twitterbericht uitprinten via een bonnenprinter, een slot openen, een kachel aanzetten of bijvoorbeeld de rolluiken sluiten. Voordat je hiermee aan de slag gaat, is het slim om de vraag te stellen: wat wil je precies doen?

De blauwdruk

Voordat ik dieper inga op het aansluiten van de sensors en slimme apparaten die ik heb gebruikt of wil gaan gebruiken, leg ik uit welke sensors ik heb gekozen en waarom. Een soort blauwdruk dus van mijn plannen.

Sensors

Om te beginnen: de sensors. Een aantal zaken is niet alleen nuttig of leuk om te weten, het is ook de basis voor de automatisering van je huis. Ik wilde de volgende dingen weten:

  • De temperatuur
  • De luchtvochtigheid
  • De lichtintensiteit
  • De hoeveelheid koolmonoxide
  • Beweging in huis

Ik heb voor de temperatuur en de luchtvochtigheid voor een gecombineerde sensor gekozen. Het is de DHT22, een digitale sensor, die vrij nauwkeurig metingen verricht. Voor de lichtintensiteit heb ik gekozen voor de TSL2561, een sensor die niet alleen zichtbaar licht meet, maar ook infrarood licht. Ook dit is een digitale sensor.

Voor de koolmonoxide heb ik nog geen sensor in huis en ook de bewegingssensor is nog niet besteld. Ik wilde het niet meteen te ingewikkeld maken.

Automatisering

Als je sensors hebt die dingen meten, wil je ook dat op basis van die metingen iets wordt gedaan (een ‘proces’ wordt aangestuurd). In mijn geval is dat vrij eenvoudig: ik wil dat de lichten in mijn werkkamer aangaan, zodra de hoeveelheid licht onder een bepaalde lux-waarde komt. Aangezien ik geen Philips Hue-lampen wil aanschaffen – vanwege de pittige prijs voor alleen al een startset – moest ik een oplossing verzinnen voor mijn bestaande lampen.

Die oplossing heb ik gevonden in de KlikAanKlikUit-systemen (KaKu). Het systeem werkt vrij simpel: met een afstandsbediening kun je een speciale stekker aan- en uitzetten (en dus ook een lamp in- of uitschakelen). Ook zijn er bepaalde stekkers die lampen kunnen dimmen. Daarmee zijn je lampen ineens iets slimmer geworden. Maar hoe stuur je zo’n signaal naar een lamp als je geen afstandsbediening hebt? Sterker nog: hoe doe je dit geautomatiseerd? KaKu zelf heeft een speciaal basisstation (een bridge) die dit mogelijk maakt. Maar ik wil niet weer een apparaat erbij kopen dat niet met de andere apparaten praat.

Om toch de stekkers (en dus de verlichting) te kunnen bedienen kun je met de Raspberry Pi het signaal versturen naar de stekker. Dat signaal wordt op een bepaalde golflengte uitgestuurd. In het geval van de KaKu (en in heel veel andere gevallen, maar daarover later meer) is dat 433 Mhz. Voor de Pi heb je daar een handig setje voor: een 433 MHz-zender die je voor een prikkie kunt aanschaffen.

Platforms

Naast het 433 Mhz-platform waarop veel KaKu-producten werken, zijn er nog andere platforms. KaKu is eenrichtingsverkeer: een apparaat geeft niet aan of hij aan of uit staat. Wil je dat wel, dan is er ook tweerichtingsverkeer mogelijk. Dat werkt op een andere frequentie, 866 MHz. KaKu heeft deze producten ook, maar die zijn wel wat duurder.

Daarnaast is er het Z-Wave-platform, dat op weer een andere frequentie werkt (2,4 GHz). Ook zijn er platforms op basis van bluetooth, NFC, RFiD,  en ZigBee. En daarmee is de lijst nog lang niet compleet. Wederom: om het niet te moeilijk te maken, richt ik me in eerste instantie op het 433 Mhz-platform. Andere platforms komen misschien later aan bod.

ESP8266

Naast het zenden van signalen via speciale frequenties, is het ook mogelijk om via het wifi-netwerk signalen te versturen. En naast het 433 MHz-platform, wil ik me daar ook op richten. De reden: de apparaten waarmee je dit kunt doen zijn spotgoedkoop. Voor een paar dollar heb je een apparaat dat met je wifi-netwerk verbonden is en opdrachten kan ontvangen of versturen.

De basis is de ESP8266-chip: een chip met ingebouwde wifi-mogelijkheden. Een van mijn plannen is het namaken van een Philips Hue-lamp met behulp van deze chip en een LED-strip. Dat maakt het mogelijk om mijn zelfgebouwde Hue-lamp aan te sturen via HomeKit en Homebridge.

Tips en inspiratie

Hoe kun je voor jezelf bepalen wat je nodig hebt en beter nog: hoe kom je achter mogelijkheden die je zelf nog niet had bedacht? Hieronder een aantal websites die je inspiratie kunnen geven of waar je producten kunt bestellen. Het belangrijkste is eigenlijk dat er geen grenzen zijn en dat je je fantasie gebruikt. En dat is eigenlijk alleen maar heel erg leuk!

  • Kiwi Electronics – een uitstekende webwinkel met een ruim assortiment.
  • Adafruit – maker van veel producten, met veel aandacht voor projecten.
  • Hackaday – verzameling van projecten die tot de verbeelding spreken.
  • Raspberry Pi Foundation – verzameling van projecten op basis van de Pi.
  • Hackster.io – verzameling van projecten, van robots tot smart meubilair.

Lees verder in Deel 6: De DHT22-sensor aansluiten op de Raspberry Pi Zero.

Deel 3: Home automation (domotica) met een Raspberry Pi Zero

Zoals ik al in de introductie schreef had ik altijd zo mijn bedenkingen bij zelfdenkende koelkasten of slimme thermometers die je een push-bericht sturen als de kip in de oven gaar is. Tot ik bij een vriend langs ging die nuttige toepassingen had bedacht. Home automation, ook wel domotica genoemd.

De toepassing van slimme apparaten in huis

Slimme apparaten kunnen het leven makkelijker maken. Ze kunnen bijvoorbeeld met één klik op de knop je hele huis ‘instellen’ als je lekker een filmpje wil kijken. Maar het draait niet alleen om home automation. Slimme apparaten kunnen je huis veiliger maken of zorgen voor energiebesparing. De basis voor al die apparaten wordt gelegd met sensors.

Sensors meten bijvoorbeeld de lichtintensiteit (lux-waarde) en het systeem kan vervolgens op basis daarvan besluiten de lichten in huis aan of uit te zetten. Zo blijft er nooit een lamp branden als de zon fel schijnt. Een ander voorbeeld is het inschakelen van de centrale verwarming als een sensor registreert dat de temperatuur in huis onder de 19°C is én een andere sensor registreert dat er mensen in het huis zijn. En dit is nog maar het topje van de ijsberg.

Nest Thermostaat
Persfoto van de Nest Thermostaat, via: https://nest.com/nl/press/#product-images

Ik besloot dat ik ook wel eens wilde kijken hoe ik mijn huis ‘smart’ kon maken.

Welk systeem kies je?

Er zijn allerlei verschillende systemen om je huis slim te maken. Als Apple-liefhebber was ik op de hoogte van HomeKit – een app van Apple die het mogelijk maakt om vanaf je iPhone of iPad de home automation aan te sturen. Het is met HomeKit bijvoorbeeld mogelijk om de Hue-lampen van Philips te gebruiken.

Er zijn tientallen aanbieders van slimme producten die je met een app op je telefoon kan aansturen. Om er een paar te noemen: Elgato, Philips, KlikAanKlikUit en bijvoorbeeld NEST.

Er is echter een aantal grote nadelen. De wirwar van aanbieders zorgt ook voor een wirwar van apps op je telefoon. Bovendien ‘praten’ niet alle systemen met elkaar, omdat ze met verschillende protocollen werken. Daarnaast zijn deze systemen vaak niet goedkoop en in sommige gevallen worden ze niet (volledig) ondersteund door HomeKit.

Enter Homebridge. Homebridge is een gratis softwarepakket dat ontwikkeld is om met HomeKit slimme apparaten aan te sturen. En dan hebben we het niet alleen over de slimme lampen van Philips of de schakelaars van KlikAanKlikUit of Toon, de slimme thermostaat. We hebben het dan ook over zelfgebouwde apparaten of sensors. Bovendien maakt Homebridge het mogelijk om apparaten die eigenlijk niet door HomeKit worden ondersteund tóch te gebruiken. En dan wordt home automation plots erg interessant.

Mijn eigen Internet of Things

Ik besloot de Raspberry Pi Zero, die ik in een opwelling had gekocht toen ik de Zero W bestelde, te gaan gebruiken om mijn eigen Internet der Dingen op te tuigen en mijn huis – samen met mijn telefoon – ‘smart’ te maken. Nu woon ik een huis uit begin 20e eeuw, waardoor ik bijvoorbeeld geen centrale verwarming heb. Dat beperkt mijn mogelijkheden. Anderzijds is het een extra uitdaging om zelfs een oud huis slimmer te maken door zelf nieuwe oplossingen te bedenken.

Ik heb de keuze gemaakt voor een Raspberry Pi Zero, Homebridge en Apple’s HomeKit, maar er zijn natuurlijk diverse andere softwarepakketten en minicomputers waarmee je hetzelfde kunt bereiken. In deze serie blogs wil ik laten zien hoe ik mijn eigen Internet der Dingen vormgeef. Tegelijkertijd fungeert het blog als een soort logboek waarin ik vastleg tegen welke problemen ik aanloop en welke oplossingen ik heb gevonden. Ik hoop dat ik daarmee ook anderen kan helpen die tegen dezelfde problemen aanlopen.

Lees verder in Deel 4: Installeren Homebridge op Raspberry Pi Zero

Het Internet of Things – een introductie

Internet of Things

Het Internet of Things ontwikkelt zich stormachtig, maar wat is het nu precies? Hoe werkt het? En wat kun je er eigenlijk mee?

De term Internet of Things (IoT) stamt al uit 1985. Volgens Wikipedia werd de term voor het eerst gebruikt door Peter Lewis, die een toespraak hield bij de Amerikaanse FCC, de telecomwaakhond. In zijn toespraak zegt hij dat het Internet of Things…

… de integratie is tussen mensen, processen en technologie, met behulp van apparaten die met elkaar verbonden zijn en met sensoren die dergelijke apparaten kunnen aansturen en monitoren’. Peter Lewis

Dat klinkt nogal vaag, maar met een concreet voorbeeld wordt al snel duidelijk wat Lewis hiermee bedoelde. Stel je voor dat je een koelkast hebt die met het internet verbonden is. Je pakt een pak melk uit de koelkast, schenkt een glas in en gooit het lege pak vervolgens weg. De koelkast registreert dat de melk op is en bestelt via internet zelfstandig een nieuw pak melk bij bijvoorbeeld de supermarkt. 

De koelkast (de technologie, het ‘ding’) bestelt zelfstandig (het proces) een pak melk, omdat je de laatste melk hebt opgemaakt (mens).

Nu is dat nogal een triviaal voorbeeld. Waarom zou je dit willen? Wat is de toegevoegde waarde? Die vraag heb ik mezelf ook meermaals gesteld. Daar kwam bij dat de technologie enkele jaren terug nog best prijzig was en mijn kennis van hardware beperkt was.

Toch heb ik besloten me eens te verdiepen in de wereld van het Internet of Things, nadat de Raspberry Pi Foundation een nieuwe ‘minicomputer’ op de markt bracht, die slechts 5 euro kost. In een reeks blogs leg ik uit wat ik heb gedaan en hoe ik mijn eigen ‘Internet der Dingen’ heb opgezet. Bovendien ga ik in op de praktische toepassing ervan. Ook geef ik bij elk onderwerp de noodzakelijke codes, commando’s, configuratie-instellingen en links naar handige websites.