Domotica helemaal niet moeilijk
Ik had een droom...
Ik heb al heel wat afgedroomd in mijn leven, maar ik kwam nooit veel verder, want zodra ik een droom wilde verwerkelijken, stuitte ik steevast op praktische hindernissen die te veel waren voor mijn motivatie.
Het bouwen van een draadloze batterijgevoede temperatuursensor om de temperatuur in de woonkamer te meten is niet erg ingewikkeld, en het toevoegen van een op afstand bedienbaar relais om een verwarming aan en uit te zetten is ook goed te doen. Maar dan wordt het ingewikkeld. Je hebt een of andere controller nodig om zaken als “op weekdagen moet de verwarming om 7 uur ’s ochtends inschakelen; in het weekend niet voor 9 uur” te kunnen instellen. En handmatig ingrijpen moet ook mogelijk zijn zonder dat een officiële huisgenoot eerst Python moet leren om de temperatuur te kunnen aanpassen.
Tot nog toe hadden we het niet over domotica – dit was slechts de beschrijving was van een beetje luxe programmeerbare thermostaat. Er is veel meer nodig om van een op afstandsbediende lamp een volwaardig uitbreidbaar domoticasysteem te maken. Daarom bleef het voor mij bij dromen.
Espurna & ESPHome
Tot voor kort – toen ik online zocht naar de handleiding van een WiFi-bestuurde stekker die ik een paar jaar geleden had gekocht maar nooit gebruikte, kwam ik het ‘Espurna’-project tegen (hoewel ik het uiteindelijk niet gebruikte, noem ik het hier omdat het een uitstekend open source-project is dat zeker bekendheid verdient). Met Espurna kun je eenvoudig WiFi-gebaseerde sensoren en controllers maken (voornamelijk op basis van de ESP8266) die met elkaar kunnen praten. Het ESPHome-project (figuur 1) lijkt sterk op Espurna.
En u vond Arduino gemakkelijk?
Espurna en ESPHome bieden allebei gemakkelijke manieren om de ESP8266- en ESP32-apparaten van Espressif te programmeren. Dat is zelfs zo simpel dat het de Arduino op raketwetenschap doet lijken. Na het installeren van de software (uiteraard) hoeft u slechst een eenvoudig tekstbestand te schrijven dat specificeert welk soort sensor is aangesloten op welke pin(nen) van uw ESP-module; na het compileren en flashen van de firmware hebtt u een slim apparaat in handen met een webinterface, over-the-air programmering, MQTT-communicatie en wat u verder maar wenst. Ik vind dat best indrukwekkend, maar daar houdt het nog niet op.
U bent de baas over uw slimme WiFi-stekkers
Het internet loopt over van goedkope slimme stekkers en relaiskaarten met ingebouwd WiFi en andere connected WiFi-gadgets. Veel van die apparaten zijn opgebouwd rond een ESP8266 (figuur 2).
Doorgaans hebben ze een account nodig bij een of andere cloudservice ergens op het internet, beheerd via een eigen app op uw smartphone. Dat maakt het gebruik er niet aangenamer op, zozeer zelfs dat die dingen vaak in een la of, erger nog, in de vuilnisbak belanden.
Maar dat hoeft niet meer, want met Espurna en ESPHome kunt u die dingen opnieuw programmeren met firmware die u naar believen kunt wijzigen. Geen internetverbinding nodig, nooit meer van die apps met in slecht Engels geschreven interface of dubieuze clouddiensten; flash het rotding gewoon opnieuw en integreer het in uw domoticasysteem dat wordt beheerd door u@home.
Van afstandsbediening tot automatisering
ESPHome en Espurna bieden ook automatisering, zodat gebruikers regels kunnen specificeren voor het in- en uitschakelen van apparatuur op basis van events en sensoren. Met beide systemen kunt u een heel luxe domoticasysteem maken met in de handel verkrijgbare goedkope WiFi-compatibele hardware of zaken die u zelf hebt gebouwd.
Daarmee zou dit artikel kunnen eindigen, als ik automatisering met Espurna en ESPHome niet te ingewikkeld vond. Toegegeven, dat kan een gevolg zijn van mijn beperkte intellectuele vermogens, maar het gebrek aan goede documentatie voor deze projecten is ook niet echt behulpzaam. Hoewel er heel wat documentatie lijkt te zijn, is die tamelijk gefragmenteerd en niet altijd even duidelijk.
Home Assistent
Zowel ESPHome als Espurna kunnen worden geïntegreerd met Home Assistant, een zogenaamde domotica-hub of controller. Dat is een apparaat waarmee de gebruiker sensoren en actuatoren (van verschillende fabrikanten) in één systeem kan combineren. Hier moeten ‘sensoren en actuatoren’ zeer algemeen worden opgevat, aangezien ze kunnen variëren van thermometers en GPS via internetdiensten tot motorbesturing en sms’en. Home Assistant (ook wel ‘HA’, ‘Hass’ of ‘Hass.io’) is compatibel met – om enkele bekende namen te noemen – Alexa en OK Google, Ikea’s Trådfri, Philips Hue, Z-Wave en Zigbee Home Automation, en Sonoff van iTead. Op het moment van schrijven kent HA 1574 integratiemogelijkheden en biedt het veel meer mogelijkheden dan Espurna en ESPHome.
U gebruikt HA om de regels voor de apparaten in en om uw huis te definiëren. “Als de zon over 20 minuten ondergaat en de smartphone van bewoner A in huis is en het drie weken niet geregend heeft, schakel dan de derde gazonsproeier van rechts aan”. Dat is een typisch (en basaal) voorbeeld van HA-automatisering (onder de aanname dat de betreffende hardware is geïnstalleerd en naar behoren functioneert). HA biedt ook een volledig aanpasbare grafische gebruikersinterface (GUI) of dashboard voor het systeem (figuur 3).
HA is open source, geschreven in Python en draait op een Raspberry Pi. Het werkt ook op andere besturingssystemen; alleen heb ik het op een Raspberry Pi 3 heb geïnstalleerd omdat dat zo eenvoudig was. U zult inmiddels gesnopen hebben dat gemak hoog in mijn vaandel staat.
Integratie in Home Assistant
Home Assistant was ook de reden waarom ik doorging met ESPHome in plaats van met Espurna. ESPHome heeft een plug-in (figuur 4) waarmee deze zodanig in de Home Assistant kan worden geïntegreerd dat ESPHome-apparaten automatisch door HA worden gedetecteerd.
Flash’n’Play, wat wil een mens nog meer? De integratie is zo ver doorgevoerd dat je zelfs geen ontwikkelcomputer meer nodig hebt; sensoren en actuatoren kunnen (her)geprogrammeerd en (her)geconfigureerd worden vanaf uw smartphone en vanuit uw comfortabele stoel.
Energiezuinige IoT-apparaten
WiFi is geweldig om apparaten snel met een netwerk te verbinden, maar het kost een beetje stroom. Het is daarom niet de beste oplossing voor low-power sensorknooppunten die jarenlang op een enkele knoopcel of via energy harvesting moeten werken. Dergelijke apparaten zijn de meeste tijd in slaap, en als ze wakker worden versturen ze hun gegevens in ijltempo omdat ze niet genoeg energie hebben voor lange handshake-protocollen.
Voor deze apparaten is MySensors een geweldige oplossing – een open-source domotica- en IoT-project op basis van radio’s die in de ISM-band werken; en dan vooral de nRF24 van Nordic Semiconductor (figuur 5) en de RFM69 van HopeRF. Het recentere nRF5-platform (zoals op de BBC micro:bit) kan ook worden gebruikt.
De MySensors-website is een beetje rommelig, maar als u eenmaal door de ruis heen kijkt, ziet u dat er veel leuks beschikbaar is.
MySensors gebruikt voornamelijk (maar niet uitsluitend) Arduino als microcontrollerplatform en het bouwt en onderhoudt helemaal zelf een boom- of ster-netwerk. Net als ESPHome integreert het (zij het iets minder) soepel met Home Assistant.
Het project wordt geleverd als een Arduino-bibliotheek die deel uitmaakt van de bibliotheekmanager van de Arduino IDE. Nadat u het hebt geïnstalleerd, kunt u uw applicatie op basis van een van de voorbeelden opbouwen. In veel gevallen betekent dit alleen het wijzigen van de pinnummer(s) van de aangesloten periferie.
De handen uit de mouwen
Na deze lange introductie wilt u waarschijnlijk aan de slag; ik stel voor om eerst de Home Assistant op een Raspberry Pi te installeren. Een goede stap-voor-stap handleiding is te vinden op [3] onder de tab ‘Getting Started’. Daar wordt het gebruik van een Pi 4 aanbevolen, maar bij mij draait HA op een Pi 3. Een microSD-kaart van 32 GB of groter wordt aanbevolen. Bedenk wel dat de Pi niet overweg kan met exFAT-geformatteerde SDXC-kaarten (SD-kaarten groter dan 32 GB), dus als u kiest voor een 64 GB microSD-kaart (of zelfs groter) moet u die herformatteren als FAT32. Voor een robuuster systeem wilt u misschien een SSD gebruiken in plaats van een (kwetsbare) microSD-kaart.
Multicast DNS
Home Assistant berust op het multicast DNS-protocol (mDNS) om apparaten te vinden en ermee te communiceren, maar dit protocol wordt niet erg goed ondersteund door Android en Windows (zie kader). Apple-apparaten en Raspberry Pi doen het prima en ik neem aan dat computers met een of andere vorm van Linux ook zullen werken. Daarom kunt u misschien beter een statisch IP-adres voor HA kiezen. Mijn HA-systeem gebruikt DHCP en ik heb verbindingsproblemen ondervonden met de HA-app voor Android toen de HA-computer een nieuw IP-adres kreeg van de DHCP-server.
Merk op dat het HA-installatieprogramma snel een webserver opstart waarop u de voortgang van de installatie kunt volgen; het aansluiten van een beeldscherm op de Pi is hier niet zinvol. Raadpleeg de router van uw netwerk om het IP-adres van deze server te vinden.
Toegang tot het configuratiebestand
De tweede stap van de installetie is het configureren van Home Assistant. Dat gaat via een wizard, zodat ik hier geen details ga noemen. Belangrijker is de installatie van enkele add-ons na het configureren van HA. Dit gaat vanuit het ‘Supervisor’-menu onder het tabblad ‘Add-on Store’. Om de een of andere reden kunt u met de standaard HA-setup het hoofdconfiguratiebestand (configuration.yaml) niet bewerken, maar u zult merken dat het regelmatig nodig is, vooral wanneer u met het systeem experimenteert. Ik heb daarom de add-ons ‘File Editor’ (vroeger bekend als ‘Configurator’) en ‘Samba-share’ geïnstalleerd. Met de eerste kunt u bestanden op laag niveau rechtstreeks in HA bewerken, met de tweede kunt u enkele HA-mappen op het netwerk zetten, zodat u bijvoorbeeld bestanden met uw favoriete teksteditor kunt bewerken. Om veiligheidsredenen wilt u misschien ook de add-on ‘Terminal & SSH’ installeren.
Met Samba kunt u HA ook als fileserver gebruiken als u een ‘www’-map in de ‘config’-map aanmaakt.
Het installeren van add-ons is niet moeilijk, klik gewoon op de kaart van de add-on om deze te openen en klik vervolgens op installeren. Een geopende kaart bevat instructies voor het configureren van de add-on.
Installatie van de ESPHome add-on
Dit brengt ons bij ESPHome, omdat we ook de ESPHome-add-on moeten installeren. Om dit voor elkaar te krijgen, voegt u eerst de URL van de repository toe aan de store. Zoek vervolgens het vak met de tekst ‘Add new repository by URL’ en plak daar de volgende URL in:
https://github.com/esphome/hassio
Nu kunt u de ESPHome add-on installeren. Er zijn drie versies: normaal, bèta en dev; we zullen de normale vanilla-versie gebruiken. De enige configuratie die ik voor deze add-on deed, was het inschakelen van de opties ‘Start on boot’, ‘Auto update’ en ‘Show in sidebar’. Dat laatste is handig omdat de toegang tot de add-on dan veel gemakkelijker is.
MySensors integreren
Op het moment van schrijven was er geen Home Assistant add-on voor MySensors. Om dit in HA voor elkaar te krijgen moet u daarom een paar regels toevoegen aan het configuratie.yaml bestand van HA (zie kader):
mysensors:
gateways:
- device: ’192.168.1.100’
persistence_file: ’mysensors/wifi_gateway.json’
tcp_port: 5003
optimistic: false
persistence: true
retain: true
version: ’2.0’
Zoals opgemerkt moet u een statisch IP kiezen voor de MySensors-gateway die u gaat bouwen (ja, daar bent u mee bezig, zie onder), en moet u een naam en locatie kiezen voor het JSON-bestand waar HA informatie over het MySensors-netwerk kan opslaan.
Belangrijk: telkens wanneer het configuration.yaml bestand van HA wordt gewijzigd, moet het systeem opnieuw worden opgestart voordat de wijzigingen effect hebben. U kunt dit doen via het tabblad ‘System’ van de Supervisor.
Nu u toch met het configuratiebestand bezig bent, kunt u net zo goed het volgende toevoegen (dat spaart een herstart uit):
binary_sensor:
- platform: workday
country: [country]
Deze regels maken het mogelijk om automatiseringsregels te schrijven die alleen op werkdagen of in het weekend worden geactiveerd, dat soort dingen. Vervang [country] door de code van het land waarin het systeem werkt. Raadpleeg de helppagina van de ‘Workday Binary Sensor’ om deze code (en andere nuttige informatie) te vinden.
Mijn eerste ESPHome-apparaat
Als u de bovenstaande instructies hebt gevolgd, bent u er nu klaar voor om ESP8266- en ESP32-apparaten te programmeren. Omdat een nieuw (maagdelijk) apparaat nog niet compatibel is met ESPHome, moet het in eerste instantie via de seriële poort worden geprogrammeerd. Afhankelijk van het apparaat moet u hiertoe mogelijk een USB/serieel-driver op de HA-computer installeren. De NodeMCU-kaarten met een Silabs (Silicon Laboratories) CP2102 USB-chip die ik gebruikte, werkten direct na het uitpakken.
Nadat u het apparaat hebt aangesloten op de computer waarop HA draait, opent u het ESPHome-dashboard via de zijbalk (als u deze optie hebt ingeschakeld) of door op ‘Open Web UI’ te klikken vanaf de add-on kaart in het Supervisor Dashboard-scherm. Controleer of de seriële poort beschikbaar is in de dropdown-lijst in de rechterbovenhoek die standaard ‘OTA (Over-The-Air)’ toont. Als dat niet het geval is, start u de ESPHome add-on opnieuw (door terug te gaan naar de ESPHome-kaart op het Supervisor-dashboard), dan zou het moeten lukken.
Vervolgens klikt u op de roze ‘+’ knop op het ESPHome Dashboard. Daarmee start u een wizard die u door het eerste deel leidt. Merk op dat ik nooit enig wachtwoord voor mijn apparaten heb opgegeven, maar dat is wellicht niet zo verstandig.
Selecteer voor het uploaden de seriële poort waarop het apparaat is aangesloten.
Het YAML-bestand bewerken
De wizard is nu klaar en er zou een kaart moeten zijn voor uw apparaat. Aanklikken van de knop ‘Edit’ werkt (bij mij) op dit moment niet, maar na het opnieuw laden van de pagina wel. Controleer dan de inloggegevens voor uw WiFi-netwerk en zorg ervoor dat u de regels ‘api:’ en ‘ota:’ ziet. Als u deze configuratie naar uw apparaat uploadt en het opnieuw start, wordt het door Home Assistant gedetecteerd. Het kan nu ook worden losgekoppeld van de computer omdat over-the-air programmeren is ingeschakeld. Het apparaat doet echter nog niets, omdat u de periferie niet hebt geconfigureerd. Lees daarom eerst verder voordat u een configuratie laadt.
Als u een NodeMCU-module gebruikt, kunt u deze een kickstart geven door de onderstaande regels toe te voegen aan het einde (onder ‘ota:’ voor de duidelijkheid, de exacte plaats in het bestand maakt niet uit) van het configuratiebestand voordat u het laadt. Hiermee geeft u HA toegang tot de ingebouwde LED en de ‘Flash’-drukknop.
output:
- platform: gpio
id: "led"
pin:
number: GPIO16
inverted: True
light:
- platform: binary
name: "LED"
output: "led"
binary_sensor:
- platform: gpio
name: "Flash pushbutton"
pin:
number: GPIO0
inverted: True
Merk op dat in dit fragment elk inspring-niveau twee (2) spaties is, wat betekent dat de regels ‘number: GPIOx’ en ‘inverted: True’ met zes spaties beginnen (aangezien ze drie niveaus van inspringen hebben, zie kader).
Deze configuratie kan ook overweg met een ESP-01-module als u ‘GPIO16’ verandert in ‘GPIO3’ en een LED plus serieweerstand (470 Ω of zo) tussen GPIO3 (RXD) en GND aansluit. Sluit ook een drukknop aan tussen GPIO0 en GND en een pullup-weerstand van 10 kΩ (of zo) tussen GPIO0 en 3V3. Druk niet op deze knop tijdens het opstarten van het apparaat.
Laad deze configuratie in het ESPHome-apparaat en wacht tot het herstart. De Home Assistant zou het nu moeten zien – het ESPHome-dashboard moet het als ‘Online’ weergeven – en, als u dat toestaat, een bedieningselement voor een lampje en een indicator voor de drukknop aanmaken. Als u eerst de lege configuratie hebt geladen, moet u eventueel naar het ‘Configuration’-menu van HA gaan om het op te zoeken in de ‘Devices’-lijst.
U kunt nu kaarten voor de bedieningselementen toevoegen aan HA’s ‘Overview’ (klik op de drie stippen en vervolgens ‘Configure UI’) en ga aan het automatiseren in de ‘Automation Editor’ in het Configuration-menu (‘Automations’). Ik laat dat verder aan u over want het spreekt voor zich en is een goed excuus om Home Assistant te leren kennen. En bovendien moeten we nog met MySensors aan de slag.
Bouw een MySensors WiFi-gateway
U hebt een gateway nodig om een MySensors-netwerk te bouwen en u hebt die ook nodig om verbinding te maken met andere (WiFi-)netwerken. Hiervoor heb ik een ESP8266-gebaseerde NodeMCU gebruikt omdat deze een SPI-poort heeft die we nodig hebben. Een andere optie is een ESP32-module te gebruiken. Eigenlijk zijn er veel opties, maar in dit artikel gaan we voor WiFi.
Verbind de SPI-poort met een nRF24L01+ module (figuur 6).
Het verdient aanbeveling om ook een elco (4,7...47 µF) met parallel daaraan een keramische condensator (100 nF of zo) tussen de VCC- en GND-pinnen van de nRF24-module te monteren. Dat is alle ‘elektronica’ die u nodig hebt.
Aan de softwarekant is een computer met de Arduino IDE vereist. Voeg aan de IDE de ESP8266 (of ESP32) core voor Arduino toe – alle details vindt u onder [6] – en de MySensors-bibliotheek (‘Sketch’ > ‘Include Library’ > ‘Manage Libraries…’). Laad het voorbeeld ‘GatewayESP8266’ (‘File’ > ‘Examples’ > ‘MySensors’) en voer de juiste SSID, wachtwoord en statische IP-adres in die u eerder in het configuration.yaml-bestand van HA hebt opgegeven. Laad de sketch in uw apparaat en uw gateway is klaar.
Vergeet niet dat een gateway (en repeater-nodes, die we hier niet behandelen) altijd ingeschakeld moet zijn en nooit mag slapen. Sensor-nodes daarentegen kunnen doen wat ze willen.
Mijn eerste MySensors-node
Het creëren van een MySensors-node verschilt niet van het bouwen van een gateway, behalve dat de ESP-module wordt vervangen door een Arduino-compatibel board waaraan sensoren en actuatoren zijn toegevoegd. Sluit een nRF24L01+ module op de SPI-poort van het board aan (plus de hiervoor genoemde condensatoren, zie figuur 7).
Laad een voorbeeldsketch uit de MySensors-voorbeeldbibliotheek, bij voorkeur een die lijkt op wat u probeert te bereiken. Merk op dat er meer voorbeelden beschikbaar zijn op de MySensors-website. De sketch moet worden aangepast aan de pinnummer(s) van uw perifere apparaat/apparaten, maar dat is eigenlijk alles. Laad de schets in uw apparaat en laat hem opstarten; hij wordt automatisch lid van het MySensors-netwerk (als de gateway is ingeschakeld). Echt waar.
Hoed u voor de protocolversie
Op dit punt werd ik met een probleem geconfronteerd: mijn apparaat, een extern relais, verscheen niet in Home Assistant. Uiteindelijk ontdekte ik dat dit iets te maken had met de gebruikte versie van de MySensors-API. Door het JSON-bestand te inspecteren (zie de paragraaf ‘MySensors integreren’), merkte ik dat de gateway kennelijk API of protocolversie 2.3.2 gebruikte. De MySensors-pagina op [7] heeft een voorbeeld bedoeld voor gebruik met API-versies 2.x. Toen ik die probeerde, verscheen mijn knooppunt in de lijst ‘Entities’ in het ‘Configuration’-menu van HA en kon ik er UI-kaarten voor maken.
Om een op V2.x gebaseerde node in HA te laten werken, moet die volgens [7] een initiële waarde vanuit de functie loop() verzenden. De voorbeeldsketches doen dat niet. Maar toen ik verder zocht, vermoedde ik dat een actuator-node een initiële waarde van HA moet opvragen (en misschien ook moet verzenden) voordat hij herkend wordt. Een sensor-node wordt gerapporteerd zodra die gegevens gaat verzenden. Het verzoek hoeft niet vanuit loop() te worden gedaan, maar gewoon ergens tijdens het opstartproces.
De speciale functies ‘before()’ en ‘presentation()’
Om V2.x-sketches te onderscheiden van oudere types, kunt u de functie presentation() zoeken. Als de sketch er een heeft, is hij V2 of hoger. Andersom geldt dit echter niet, aangezien presentation() wellicht is weggelaten. De present-instructies die gewoonlijk in deze functie worden gevonden, mogen niet worden weggelaten en moeten naar een andere functie worden verplaatst, bijvoorbeeld naar setup().
MySensors-sketches kunnen de functie before() hebben. Zowel before() als presentation() worden aangeroepen vóór setup(), en wel in de genoemde volgorde, dus before(), presentation(), setup() en tenslotte loop().
Het aanpassen van bestaande code aan uw hardware zou nu geen probleem meer mogen zijn. Er zijn veel voorbeelden voor allerlei populaire sensoren beschikbaar, in de Arduino-bibliotheek of online, dus neem eens een kijkje voordat u aan de slag gaat.
Tot hier
Tot zover deze inleiding tot eenvoudige domotica.
Bedenk dat dit overzicht niet uitputtend is en dat er misschien betere of gemakkelijkere manieren zijn om iets voor elkaar te krijgen. Mijn begrip van de betrokken componenten neemt in elk geval nog steeds toe.
Bovendien zijn er veel andere domotica-projecten die dezelfde of vergelijkbare dingen kunnen doen als die welke in dit artikel zijn genoemd. Sommige zijn misschien beter, andere zien er misschien mooier uit; ze hebben allemaal hun voor- en nadelen.
Omdat er zo veel zijn, is het moeilijk om een keuze te maken. In dit artikel heb ik er een paar genoemd die ik heb geprobeerd en goed bevonden voor de bouw van mijn domoticasysteem. Ik gebruik ze nog steeds en ik sta nog steeds versteld van de eindeloze mogelijkheden die ze bieden. En geen angst – ik houd hier nog lang niet mee op.
Bij Elektor Labs vindt u voorbeeldconfiguraties voor ESPHome- en MySensors-apparaten. Ook treft u daar een paar video’s aan.
----------------------------------------------------------------------------------------------------------------------
Wilt u meer van die fantastische Elektor-artikelen?
--> Neem vandaag nog een abonnement op Elektor - u mist nooit meer een artikel, project of handleiding!
----------------------------------------------------------------------------------------------------------------------