Maak je eigen controller voor Home Assistant
Je maakt je huis veel slimmer met slimme schakelaars en Home Assistant. Maar huisgenoten stellen het niet altijd op prijs als er complexe handelingen nodig zijn om bijvoorbeeld een automatisering te starten of alleen maar een lamp aan te zetten. Daarom gaan we in deze basiscursus een controller maken die nauw samenwerkt met Home Assistant. Met de controller kun je eenvoudig apparaten omschakelen, een automatisering starten of de status van apparaten weergeven. Voor weinig geld is je huis niet alleen slim, maar óók nog makkelijk te bedienen.
Wie eenvoudig apparaten wil omschakelen, een automatisering wil starten of de status van apparaten wil weergeven opgelet! In dit artikel leggen wij jou uit hoe je een controller kan maken die nauw samenwerkt met jouw Home Assistant. We bespreken:
- Het downloaden van code
- Het opzetten van een controller
- ESPHome
- Automatisering
Wil jij meer leren over slimme apparaten? Lees dan: Slimme tips voor slimme apparaten
Code downloaden
In deze basiscursus worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code ook downloaden en daarna bekijken of kopiëren. Zie het bestand code-hacontrol.txt, beschikbaar via https://kwikr.nl/codehacontrol.
Het is erg leuk om te automatiseren met Home Assistant. Alleen is het niet zo praktisch als je vervolgens de browser of een app moet starten om bijvoorbeeld een lamp te bedienen, een automatisering te starten of een bepaalde temperatuursensor uit te lezen. Er gaat weinig boven een simpele knop of een duidelijk schermpje. Daarom gaan we in deze basiscursus een controller maken die nauw samenwerkt met Home Assistant. Hiermee bedoelen we een klein kastje waarin je bijvoorbeeld drukknoppen, lampjes, een klein schermpje of sensoren voor beweging en temperatuur inbouwt. Het technische hart is een ESP32-microcontroller met ESPHome erop geïnstalleerd. Omdat de controller samenwerkt met Home Assistant kun je nu flexibel bijvoorbeeld een bepaald (slim) apparaat in je huis omschakelen, een automatisering activeren, de status van apparaten aangeven via leds of informatie weergeven op het display.
De ESPHome-software
De trouwe lezer zal eerder van ESPHome hebben gehoord. Met deze software kun je eenvoudig een microcontroller zoals de ESP8266 of ESP32 programmeren zonder dat je écht hoeft te programmeren. Via configuratiebestanden geef je aan wat voor componenten je hebt aangesloten en hoe er verbinding met je netwerk en met Home Assistant moet worden gemaakt. ESPHome schrijft deze configuratie dan naar de microcontroller. Wijzigingen kun je daarna zelfs op afstand ofwel ‘over-the-air’ maken. De microcontroller kun je eenvoudig toevoegen aan Home Assistant en zal hier daarna ook nauw mee samenwerken. We maakten in Computer!Totaal al eens een luchtkwaliteitsmonitor op basis van ESPHome. Die brengt voornamelijk sensorgegevens over naar Home Assistant, zodat je een goed beeld hebt van de luchtkwaliteit in een bepaalde ruimte. Raadpleeg dit uitgebreide artikel als je meer details nodig hebt (https://kwikr.nl/luchtmon), want in deze basiscursus geven we alleen beknopte aanwijzingen voor de installatie en het gebruik van ESPHome.
De ESPHome-software
De trouwe lezer zal eerder van ESPHome hebben gehoord. Met deze software kun je eenvoudig een microcontroller zoals de ESP8266 of ESP32 programmeren zonder dat je écht hoeft te programmeren. Via configuratiebestanden geef je aan wat voor componenten je hebt aangesloten en hoe er verbinding met je netwerk en met Home Assistant moet worden gemaakt. ESPHome schrijft deze configuratie dan naar de microcontroller. Wijzigingen kun je daarna zelfs op afstand ofwel ‘over-the-air’ maken. De microcontroller kun je eenvoudig toevoegen aan Home Assistant en zal hier daarna ook nauw mee samenwerken. We maakten in Computer!Totaal al eens een luchtkwaliteitsmonitor op basis van ESPHome. Die brengt voornamelijk sensorgegevens over naar Home Assistant, zodat je een goed beeld hebt van de luchtkwaliteit in een bepaalde ruimte. Raadpleeg dit uitgebreide artikel als je meer details nodig hebt (https://kwikr.nl/luchtmon), want in deze basiscursus geven we alleen beknopte aanwijzingen voor de installatie en het gebruik van ESPHome.
01 Microcontroller en voeding
In deze basiscursus kiezen we de ESP32 als microcontroller, verkrijgbaar vanaf ongeveer 5 euro. Die is wat krachtiger en heeft meer interfaces dan de ESP8266. Ook de extra GPIO-pinnen zijn prettig. Die kun je als ingang gebruiken voor bijvoorbeeld een drukknop of bewegingssensor, maar ook als uitgang voor het aanzetten van een led. Als voeding gebruiken we een aparte 5V-netadapter. Die hoeft niet veel stroom te leveren. Zo’n 250 mA voor de ESP32 en tot 20 mA voor elke led is voldoende. Een netadapter die 9 of 12 volt levert is meestal ook geschikt, maar controleer de vereisten voor de specifieke ESP32-controller die jij gekocht hebt. Intern brengt de ESP32 de aangeboden spanning overigens terug naar 3,3 volt, dat is waar de microcontroller zelf op werkt. Die spanning wordt ook aan de uitgangen aangeboden. De bewegingssensor die we gebruiken vraagt zo’n 5 tot 20 volt en zullen we daarom vanaf de ingangsspanning voeden. Heb je meer aansluitingen nodig dan de microcontroller je geeft? We laten zien hoe je dat met een I/O-expander kunt oplossen.
02 Opzet maken
Het is handig om eerst een opzet voor de controller te maken met de gewenste functies. Zelf plaatsen we bovenaan een rij met acht drukknoppen met led. Met deze drukknoppen schakelen we specifieke apparaten in of uit, waarbij de led de status van dat apparaat aangeeft. We noemen deze A1 t/m A8. Daaronder plaatsen we acht simpele drukknoppen die we B1 t/m B8 noemen. We gebruiken ze om bepaalde automatiseringen in Home Assistant te starten. Denk aan het instellen van de airco op een bepaalde temperatuur of het aan- of uitzetten van een hele reeks apparaten in één keer. Deze automatiseringen stellen we in Home Assistant zelf in. Jouw controller kan natuurlijk andere afmetingen hebben. Uiteraard kun je ook altijd meerdere kleinere controllers maken voor verschillende ruimtes. Je kunt ook sensoren inbouwen, bijvoorbeeld voor temperatuur of beweging, of een klein schermpje.
03 Behuizing
Als je een idee hebt van de functies van je controller en de vereiste ruimte kun je een behuizing zoeken. Dat is in dit project ook de voornaamste kostenpost. Een aanrader is de lijn van de Duitse fabrikant Bopla die je bij Conrad kunt bestellen. Als je op ‘bopla bop’ zoekt, vind je meerdere opties. Bij het project hebben we de Bopla Bop 7.0 PQ-9016 consolebehuizing gebruikt (ongeveer 28 euro) die is 215 × 150 × 53 mm groot, in de kleur wit. Er is ook een zwarte uitvoering, de PQ-9005. Ook zijn er smallere uitvoeringen of juist grotere exemplaren. Let erop dat de behuizing diep en hoog genoeg is voor de componenten die je wilt inbouwen. De behuizing heeft een handig deksel dat je er af kunt schroeven zodat je de vereiste gaten kunt boren.
04 Gereedschap
Veel gereedschap heb je niet nodig voor dit project. Een boormachine met een setje boren is genoeg, bijvoorbeeld metaalboren. Heel praktisch is een stapboor of trapboor. Dat is een boor waarmee je meerdere diameters kunt boren, zolang het niet te dik materiaal is. Je kunt daar ook meteen een beetje de bramen mee af frezen. Bovendien kun je grotere diameters boren dan de standaard boren die in je boormachine passen. Een schuifmaat is erg handig om de diameter van je componenten te meten als je die niet kent. Ook een multimeter is praktisch om spanning na te meten, zeker als iets niet werkt. Een soldeerbout met wat soldeertin is nodig om verbindingen te maken (zie ook het artikel over solderen op onze website: https://kwikr.nl/sold). Voor de verbindingen gaan we eenvoudige jumperdraden gebruiken met in ieder geval één vrouwelijke connector voor in de ESP32. Je zou ook een vrouwelijke voedingsaansluiting kunnen maken aan de achterkant van de behuizing waar je de connector van de netadapter in kunt steken.
05 Simpele drukknoppen
We gebruiken in het project componenten met ronde doorgang, zodat we alleen gaten in de juiste diameter hoeven te boren. Merk op dat we specifiek drukknoppen kiezen en geen schakelaars (zie het kader ‘Geen schakelaars, maar drukknoppen!’). We gebruiken eenvoudige kleurrijke drukknoppen met een doorgang van 16 mm. Je kunt deze op AliExpress voor weinig geld bestellen (ongeveer 0,25 euro per stuk), maar door de toegenomen verzendkosten via dergelijke routes kun je ook overwegen ze gewoon te bestellen via een Nederlandse (online) knutselwinkel. Let erop dat de drukknoppen wel minimaal 2 cm ruimte nodig hebben op je voorpaneel. Er zijn ook kleinere drukknoppen die uiteraard minder ruimte nodig hebben, maar de bediening wordt wat krampachtiger.
Geen schakelaars, maar drukknoppen!
In onze controller gebruiken we alleen drukknoppen en geen schakelaars. Deze eigenschap wordt ook wel ‘momentary press’ genoemd. Ze veren in feite na het indrukken weer terug, terwijl een schakelaar ingedrukt blijft ofwel in één stand blijft staan. Dat laatste zou in een controller niet logisch zijn, omdat apparaten meestal ook buiten Home Assistant om aan- of uitgezet zullen worden. De stand van de schakelaar correspondeert dan niet meer met de werkelijke status. Na het indrukken laten we Home Assistant simpelweg de status omschakelen, dus van aan naar uit of andersom. Een drukknop met led is heel praktisch omdat je via die led kunt laten zien of het apparaat aan staat. Uiteraard zorgen we dat de led ook de juiste status aanneemt als je een apparaat elders plek bedient. We laten de microncontroller hiervoor reageren op evenementen in Home Assistant.
©PXimport
06 Drukknoppen met led
De drukknoppen met ingebouwde led hebben ook een diameter van 16 mm. Bij beperkte ruimte kan 12 mm ook, maar die zijn minder prettig te bedienen voor grotere vingers. Bij de bestelling van de drukknoppen moet je opletten dat de led voor 3,3 volt geschikt is. Dat is immers de spanning aan de uitgang van de microcontroller. Vaak kun je de spanning en kleur kiezen bij het bestellen. De led mag tot z’n 20 mA aan stroom verbruiken. Als echt meer nodig is, kun je dat met een transistor oplossen. Die kan met een lage stroom uit de microcontroller een grotere stroom schakelen. Vooral voor bijvoorbeeld een relais zal dit nodig zijn. Overigens zou je in plaats van een verlichte drukknop ook een losse signaal-led kunnen gebruiken (ook weer voor de juiste spanning) of een led waar je zelf een passende weerstand bij uitrekent, in dit geval veelal zo’n 220 tot 500 ohm.
07 Verbindingen maken
Voor elke drukknop heb je één GPIO-pin nodig die we straks als ingang instellen. Voor de drukknoppen met led heb je aanvullend nog een GPIO-pin als uitgang nodig voor de led. Je kunt de GPIO-pinnen van de ESP32 gebruiken, maar ook van een I/O-expander (zie het kader ‘Een I/O-expander gebruiken’). Omdat deze I/O-expander iets minder stroom kan leveren dan de ESP32 gebruiken we deze bij voorkeur voor drukknoppen en niet voor de leds. Een jumperdraad is zoals gezegd erg praktisch om verbindingen te maken. Soldeer deze aan één kant aan de drukknop en steek de vrouwelijke kant in de GPIO-pin op de ESP32 of de I/O-expander.
De andere aansluiting op de drukknop verbind je met ground (GND). Omdat we een hele reeks drukknoppen hebben, kun je deze allemaal met elkaar doorverbinden. Het aansluiten is dus eenvoudig, maar bereid je voor op spaghetti van verbindingen bij veel componenten!
Een I/O-expander gebruiken
Als je meer GPIO-pinnen nodig hebt is een GPIO-expander erg praktisch. In ons project gebruiken we daarom de SX1509-expander. Je werkt via de I2C-interface. Je sluit hem via SDA en SCL aan op deze interface op de ESP32. Voor SDA gebruik je GPIO 21 en voor SCL is dat GPIO 22. Ook verbind je de I/O-expander met GND en 3,3 volt. Je kunt nu de genummerde pinnen op de SX1509 (0 t/m 15) als extra GPIO-pinnen gebruiken. In ons project gebruiken we de I/O-expander voor de twee rijen met acht schakelaars. Dezelfde SDA- en SCL-pin zou je voor bijvoorbeeld een temperatuursensor kunnen gebruiken. Het is wel belangrijk dat die een ander adres gebruikt. Het instellen van het adres gaat veelal via jumpers. We gebruiken de SX1509 op het standaardadres 0x3E. Dit zullen we straks in het configuratiebestand voor ESPHome aangeven.
08 ESPHome installeren
We hebben ESPHome onder Windows geïnstalleerd. Via https://kwikr.nl/espinstall vind je de instructies. Het komt erop neer dat je Python installeert en aan de path-variabele toevoegt, zodat je de pakketbeheerder in elke map op je pc kan aanroepen via de Opdrachtprompt met de opdracht pip3. Installeer dan ESPHome met:
pip3 install wheel
pip3 install esphome
Het is handig om een mapje te maken voor je project. Navigeer met de Opdrachtprompt naar die map. Controleer met de opdracht esphome version of ESPHome aanroepbaar is. Daarna kun je via de wizard een script maken dat als basis kan dienen.
09 Script maken
In de hiervoor gemaakte map gaan we het script maken met de opdracht:
esphome wizard controller.yaml
Je kunt ook een andere naam gebruiken. In de wizard voer je de gewenste naam in, het type microcontroller (ESP32) en de naam van je ontwikkelbordje, in ons voorbeeld is dat esp32doit-devkit-v1. Verder geef je de wifi-naam van je netwerk op en het wachtwoord. Optioneel kun je een wachtwoord opgeven voor het verbinden met de ESP32. Dit laten we achterwege. Er wordt nu een configuratiebestand controller.yaml gemaakt waar we verder aan gaan werken. Dit bestand is in het YAML-formaat. Als je met Home Assistant hebt gewerkt, zul je er wellicht vertrouwd mee zijn. In dit bestand gaan we aangeven welke componenten zijn aangesloten en inhaken op gebeurtenissen in Home Assistant.
10 SX1509 toevoegen
We gaan het zojuist gemaakte script verder aanvullen. Als eerste zullen we de I/O-expander toevoegen, de SX1509. Hiervoor voeg je eerst de I2C-component toe aan ESPHome en definieer je vervolgens de SX1509 zelf met een ID (waar we straks naar verwijzen) en het gebruikte adres. We gebruiken de GPIO-pinnen van de SX1509 individueel, maar je zou ook voor een 8x8-matrix kunnen kiezen, voor tot 64 drukknoppen! Bij ESPHome kun je daar meer over lezen.
De toevoeging in het bestand controller.yaml wordt:
# i2c voor connectie met SX1509
i2c:
sda: 21
scl: 22
# sx1509 op default adres (aan te passen via jumpers)
sx1509:
- id: sx1509_hub1
address: 0x3E
11 Leds toevoegen
We gaan nu eerst de acht leds toevoegen die in de eerste acht drukknoppen in de controller zitten. We noemen deze A1 t/m A8. Je begint hiervoor in je configuratiebestand met een regel switch: waar je vervolgens alle schakelaars onder zet. Hier zie je alleen de eerste led die op GPIO-pin 16 is aangesloten. Voor de andere leds gebruiken we GPIO 17, 18, 19, 23, 25, 26 en 27.
switch:
- platform: gpio
pin: 16
id: led_a1
name: "LED A1"
12 Drukknoppen toevoegen
We gaan nu de drukknoppen toevoegen. Hiervoor gaan we een GPIO-pin als ingang configureren en de interne pull-up-weerstand gebruiken. In ESPHome noemen we het een binary-sensor. In je script begin je met een regel binary_sensor:. Daaronder voeg je dan de drukknoppen toe. In onderstaande voorbeeld zijn twee drukknoppen aangesloten. De eerste is verbonden met GPIO 12 op de ESP32 en de tweede met pin 0 op de SX1509. Zelf hebben we gekozen om de eerste zestien drukknoppen aan te sluiten op pinnen 0 t/m 15 op de SX1509.
binary_sensor:
- platform: gpio
pin:
number: 12
mode:
input: true
pullup: true
inverted: true
name: "Pin A1"
- platform: gpio
name: "SX1509 Pin A1"
pin:
sx1509: sx1509_hub1
# Gebruik pin 0 op de SX1509
number: 0
mode:
input: true
pullup: true
inverted: true
13 Status van Home Assistant
We willen de status van bepaalde apparaten weergeven via leds. Daarom voegen we die apparaten die al in Home Assistant bekend zijn ook toe aan de configuratie van ESPHome. Doet dit ook weer onder het kopje binary_sensor:, maar nu met Home Assistant als platform. Het onderstaande voorbeeld dient voor de status van een versterker die in dit geval is voorzien van een Sonoff Basic met de Tasmota-firmware. Maar ook andere slimme stekkers zoals de Shelly Plug en TP-Link HS110 werken prima, of verlichting met WLED. Cruciaal is dat je de entity_id overneemt van Home Assistant. Voor de versterker is dat switch.kantoorversterker. Bij name en id vul je een herkenbare naam voor gebruik binnen ESPHome in. Met on_state: kunnen we vervolgens reageren op statusveranderingen in Home Assistant. Hier stellen we in dat de schakelaar met de ID led_a1, die we bij de bewuste led hebben ingevuld (zie paragraaf 11), de status van de versterker moet volgen (aan of uit). Voor de andere apparaten ziet het er vergelijkbaar uit.
- platform: homeassistant
name: "kantoorversterker"
id: kantoorversterker
entity_id: switch.kantoorversterker
on_state:
then:
# kantoorversterker aan, dan led A1 aan
- if:
condition:
and:
- binary_sensor.is_on: "kantoorversterker"
then:
- switch.turn_on: led_a1
- if:
# kantoorversterker uit, dan led A1 uit
condition:
and:
- binary_sensor.is_off: "kantoorversterker"
then:
- switch.turn_off: led_a1
14 Initialisatie na het starten
Als je de controller aanzet, zul je merken dat de leds uitstaan. Er gebeurt pas iets als de status van een apparaat in Home Assistant verandert. Daarom voegen we enkele regels toe als initialisatie bij het starten van de controller. Dit doe je onder het kopje esphome: dat je bovenaan in het script vindt, onder on_boot:. We beginnen met een vertraging van 20 seconden, zodat de microcontroller de tijd krijgt om verbinding met Home Assistant te maken. In dit voorbeeld controleren we de status van de kantoorversterker en schakelen de led led_a1 naar gelang de status. Voor de andere apparaten ziet het er vergelijkbaar uit.
esphome:
name: controller
on_boot:
then:
- delay: 20s
# A1 - Kantoorversterker aan, dan LED A1 aan
- if:
condition:
and:
- binary_sensor.is_on: "kantoorversterker"
then:
- switch.turn_on: led_a1
# A1 off - Kantoorversterker uit, dan LED A1 uit
- if:
condition:
and:
- binary_sensor.is_off: "kantoorversterker"
then:
- switch.turn_off: led_a1
15 Toevoegen aan Home Assistant
Als je klaar bent met de configuratie kun je deze compileren en uploaden met:
esphome controller.yaml run
Je kunt de controller als alles goed is gegaan toevoegen aan Home Assistant. Hiervoor ga je via de instellingen naar Apparaten en Diensten en kies je Integratie toevoegen. Zoek naar ESPHome, vul de hostnaam of het ip-adres in, en kies Opslaan. Na het toevoegen van de controller zijn alle componenten als entiteit binnen Home Assistant beschikbaar en kun je bijvoorbeeld reageren op het indrukken van een knop, zoals we zullen laten zien.
16 Automatiseringen maken
Via automatiseringsregels kan Home Assistant reageren op het indrukken van knoppen. Als voorbeeld maken we een automatisering voor de eerste knop die de versterker omschakelt. Ga naar Instellingen / Automatiseringen & Scènes, kies Automatisering toevoegen en dan Begin met een lege automatisering. Geef de automatisering een naam. Onder Triggers zoek je de entiteit op. In ons voorbeeld is dat binary_sensor.sx1509_pin_a1. Bij Van voer je off in en bij Naar vul je on in. De automatisering wordt dan uitgevoerd als de drukknop wordt ingedrukt. Onder Acties kiezen we bij Type actie voor Apparaat. Selecteer het apparaat (in dit voorbeeld kantoorversterker) en kies bij Actie voor Omschakelen kantoorversterker.
Voor alle andere drukknoppen kun je hetzelfde doen. Uiteraard kun je meerdere acties toevoegen. Zo gebruiken we enkele van de simpele drukknoppen (B1 t/m B8) als een ‘master’ om een hele reeks apparaten aan of juist uit te zetten. Je kunt natuurlijk alle mogelijkheden van Home Assistant en de aangesloten apparaten benutten bij het maken van automatiseringen.
Uitbreiden met bewegingssensor
Een bewegingssensor is een handige toevoeging in elke controller. Je kunt hiermee detecteren of iemand aanwezig is en op basis daarvan bepaalde apparaten aan- of uitzetten. Als bewegingssensor is de HC-SR501 heel geschikt. Die gedraagt zich overigens als schakelaar en voeg je toe onder het kopje binary_sensor:, zoals:
- platform: gpio
pin: 5
name: "${node_name} pir"
device_class: motion
Op het printplaatje van deze bewegingssensor vind je twee potmeters. Met de eerste kun je de gevoeligheid instellen. Met de tweede stel je in hoelang de schakelaar ‘aan’ moet blijven na het detecteren van beweging. Let op dat de genoemde HC-SR501 5 tot 20 volt nodig heeft. Sluit deze daarom op de ingangsspanning aan.