Zo maak je met ESPHome apparaten geschikt voor je smarthome
ESPHome is een handig programma om je eigen smarthome-apparaten te maken die met Home Assistant kunnen communiceren. Oorspronkelijk werden alleen ESP8266- en ESP32-microcontrollerbordjes ondersteund, maar ondertussen zijn ook de Raspberry Pi Pico W en andere bordjes met de RP2040-microcontroller hiervoor geschikt.
In dit artikel gaan we aan de slag met ESPHome op een Raspberry Pi Pico W en laten we zien waarop je zoal moet letten:
- ESPHome installeren op Raspberry Pi
- Led laten knipperen
- Led van kleur laten veranderen
- I2C-sensor aansluiten (voor bijvoorbeeld temperatuur, luchtvochtigheid en luchtdruk)
Ook interessant: Zo breid je met microcontrollers je computer uit met extra functies
Code downloaden In dit artikel worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Zie het bestand esphomecode.txt voor de stukken code die in dit artikel genoemd worden.
Met ESPHome, van de makers van het opensource-domoticaproject Home Assistant, maak je je eigen smarthome-apparaten met een ontwikkelbordje en wat sensoren, drukknoppen of leds. In tegenstelling tot andere oplossingen, zoals Arduino of MicroPython, hoef je met ESPHome niet te programmeren, maar definieer je de verschillende aangesloten elektronische componenten en hun gedrag in een configuratiebestand dat het YAML-formaat volgt. ESPHome genereert dan hieruit de programmacode, compileert die tot een firmwarebestand en installeert dat op het apparaat.
Je hebt allereerst een ondersteund ontwikkelbordje nodig of een commercieel product waarin een ondersteunde chip zit. ESPHome is, zoals de naam al aangeeft, oorspronkelijk ontwikkeld voor Espressifs ESP8266- en ESP32-microcontrollers. Sinds ESPHome 2022.11 is ook de RP2040 ondersteund, de chip in de populaire Raspberry Pi Pico W. Nog niet alles wat met Espressifs-chips werkt, functioneert op de RP2040. Er zijn ook minder voorbeeldconfiguraties voor de RP2040 te vinden. Vandaar dat we je in dit artikel hiermee op weg helpen.
1 ESPHome installeren
Er zijn diverse manieren om ESPHome te installeren: als Python-pakket, als Docker-image of als Home Assistant-add-on. We gaan hier uit van die laatste manier, die de beste integratie met Home Assistant biedt. Bovendien ondersteunt de wizard op de opdrachtregel op het moment van schrijven nog niet de RP2040. Het dashboard werkt ook wel op de opdrachtregel, maar de add-on biedt net iets meer integratie met Home Assistant.
Ga in de webinterface van Home Assistant in de linkerzijbalk naar Instellingen / Add-ons en klik dan rechts onderaan op Add-on Winkel. Klik op ESPHome en dan op Installeer. Nadat de add-on is geïnstalleerd, schakel je Start bij opstarten in, zodat de add-on automatisch samen met Home Assistant zelf opstart. Schakel ook Weergeven in zijbalk in. Je kunt dan altijd eenvoudig het dashboard van ESPHome openen door in de zijbalk op ESPHome te klikken.
Raspberry Pi Pico W
Die heb je nodig voor dit project!
2 Apparaatconfiguratie aanmaken
Als je het dashboard hebt geopend, klik je rechtsonder op New device en vervolgens op Continue. Geef je apparaat een naam, klik op Next en kies als apparaattype Raspberry Pi Pico W. ESPHome maakt nu een minimale configuratie en toont een encryptiesleutel om de communicatie met Home Assistant te versleutelen. Die vinden we later ook in de configuratie terug, dus negeer dit gerust. Klik tot slot op Install.
ESPHome biedt verschillende manieren aan om de firmware op je Raspberry Pi Pico W te installeren, maar niet alle manieren zijn altijd mogelijk. Omdat er nog geen ESPHome-firmware op je Raspberry Pi Pico W staat, is de eerste methode (via wifi) nog niet mogelijk. De optie Plug into the computer running ESPHome Dashboard is om dezelfde reden ook niet beschikbaar. Je kunt echter altijd kiezen voor Manual download. Deze optie geeft je instructies over hoe je de installatie moet uitvoeren. Ondertussen genereert ESPHome de firmware, wat overigens een hele tijd kan duren als je Home Assistant op een Raspberry Pi draait.
3 Firmware installeren
Koppel je Raspberry Pi Pico W los van de usb-poort van je computer, houd de BOOTSEL-knop ingedrukt terwijl je het bordje opnieuw aansluit en laat dan de knop weer los. Hierdoor verschijnt er een schijf met de naam RPI-RP2 in je bestandsbeheerder. Klik in het ESPHome-dashboard op Download project en sleep het .uf2-bestand naar de schijf in je bestandsbeheerder. Zodra de schijf verdwijnt, draait je Raspberry Pi Pico W de ESPHome-firmware en kun je op Close klikken.
Als je nu in het dashboard van ESPHome op Logs klikt bij het kadertje van je Raspberry Pi Pico W-configuratie, zie je de logs die het bordje uitstuurt, naar keuze via usb of wifi. En met een klik op Edit bekijk je de standaardconfiguratie die ESPHome voor je apparaat heeft aangemaakt.
Wat werkt er nog niet? De ondersteuning van de RP2040 in ESPHome is nog relatief nieuw. Daardoor werkt sommige functionaliteit die je als vanzelfsprekend zou beschouwen op de ESP8266 en ESP32 nog niet. We beschrijven hier de toestand in ESPHome 2023.8. Mogelijk is de ondersteuning al uitgebreid tegen dat je dit leest. De belangrijkste functionaliteit die je moet missen, is MQTT en bluetooth low-energy.
Op RP2040-microcontrollerbordjes met een andere wifi-chip dan die van de Raspberry Pi Pico W is ook geen wifi ondersteund, wat ze heel wat minder nuttig maakt. En wat wel werkt, is natuurlijk minder lang getest dan op de ESP8266 en ESP32. Desondanks is ESPHome al heel bruikbaar op de Raspberry Pi Pico W.
4 Led knipperen
Het eerste wat je weleens zult willen doen met een Raspberry Pi Pico W, is de ingebouwde led gebruiken, bijvoorbeeld om je iets te melden. Dat kan in ESPHome met de component output van het platform gpio waarvoor je het juiste pin-nummer instelt. Voor de Raspberry Pi Pico (de versie zonder wifi) is de ingebouwde led aangesloten op GPIO25. Bij de Raspberry Pi Pico W is de ingebouwde led aangesloten op de wifi-chip, de Infineon CYW43439. ESPHome definieert hiervoor een pseudo-pin, GPIO32. Maar het programma definieert ook een alias LED die op beide bordjes naar het juiste pinnummer verwijst.
Open dus de configuratie van je Raspberry Pi Pico W in het dashboard met een klik op Edit bij het kadertje en voeg aan het einde de volgende YAML-code toe:
Dit definieert een uitvoer met id genaamd led die naar de ingebouwde led verwijst, en elke seconde de led een halve seconde inschakelt en een halve seconde uitschakelt. Let op dat je de spaties van de inspringingen correct overneemt, want daarvoor is YAML zeer gevoelig. Klik bovenaan rechts op Install en kies Wirelessly om de nieuwe firmware via wifi op je Raspberry Pi Pico W te installeren.
5 Led dimmen
Met een GPIO-uitvoer kun je een GPIO-pin aan- of uitzetten door er een spanning van 3,3 V respectievelijk 0 V (GND) op te zetten. Dat zal een erop aangesloten led dus ontsteken respectievelijk doven. Maar met PWM (pulse-width modulation) kun je een deel van de tijd 3,3 V en een deel van de tijd 0 V op de pin zetten. Door de verhouding tussen beide tijden te variëren, zal een aangesloten led zwakker of sterker schijnen. Zo kun je dus een led dimmen.
De ingebouwde led van de Raspberry Pi Pico W ondersteunt geen PWM, maar als je op elk van de andere GPIO-pinnen een led aansluit, kun je die dimmen. Steek je Raspberry Pi Pico W hiervoor in een breadboard en sluit de anode (het langere pootje) van een led op GPIO15 van de Raspberry Pi Pico W aan. Verbind dan de kathode (het kortere pootje) via een weerstand van 220 Ω met een van de GND-pinnen van de Raspberry Pi Pico W. Voeg dan de volgende code aan je ESPHome-configuratie toe (en verwijder de vorige code voor de ingebouwde led):
Dimmen vanuit Home Assistant
Sluit je Raspberry Pi Pico W nu weer via usb aan. Nadat je deze firmware hebt geïnstalleerd, is het tijd om je ESPHome-apparaat aan Home Assistent toe te voegen. Normaal gesproken krijg je linksonder bij Meldingen al een melding dat Home Assistant een nieuw apparaat van het type ESPHome heeft ontdekt. Klik op Check it out en daarna in het kader van het ontdekte apparaat op Configureren. Bevestig dat je het apparaat wilt toevoegen. Daarna vind je hem bij de apparaten van Home Assistant en kun je de led met de schuifbalk dimmen.
7 Ledstrip
ESPHome ondersteunt al even adresseerbare ledstrips met RGB-leds, zoals de NeoPixels. Maar de componenten NeoPixelBus en FastLED die het daarvoor gebruikt op een ESP8266 en ESP32 werken niet op een RP2040. Daarvoor gebruik je bij een Raspberry Pi Pico W een component light met het platform genaamd rp2040_pio_led_strip, dat gebruikmaakt van PIO (Programmable Input Output) op de RP2040. Zo stuur je bijvoorbeeld een ledstrip met acht WS2812B-leds aan op pin 15:
Ontkoppel je Raspberry Pi Pico W en verwijder eventueel aangesloten componenten. Verbind dan de pin DIN of DI van de ledstrip met GPIO15 van de Raspberry Pi Pico W, GND met GND en de voedingspin (in ons voorbeeld als 4-7VDC aangeduid) met de pin VBUS van de Raspberry Pi Pico W (daarop staat 5 V van de usb-aansluiting). Sluit dan je Raspberry Pi Pico W weer aan en schrijf de firmware erheen. Je kunt nu de kleuren van de ledstrip in Home Assistant aansturen.
Lees ook: Ledstrips voor buiten
Aan de slag met programmeerbare buitenverlichting
8 I²C-apparaten
Iets anders waar je bij de Raspberry Pi Pico W zeker rekening mee dient te houden, is de I²C-bus. Heel wat componenten sluit je aan via I²C. Die gebruiken naast een voedingspin en GND twee pinnen: SDA om data uit te wisselen en SCL voor een kloksignaal. Maar ESPHome ondersteunt alleen I²C op pinnen die als I2C0 zijn aangeduid op de pinout. Dat betekent dus dat alleen de volgende combinaties bruikbaar zijn voor SDA/SCL: GPIO0/GPIO1, GPIO4/GPIO5, GPIO8/GPIO9, GPIO12/GPIO13, GPIO16/GPIO17 of GPIO20/GPIO21.
De meeste pinnen op de Raspberry Pi Pico W kun je voor meerdere doeleinden gebruiken. Omdat GPIO20/GPIO21 alleen voor I2C0 SDA/I2C0 SCL zijn aangeduid en geen alternatieve functies hebben, zijn deze aan te raden als je I²C op de Raspberry Pi Pico W wilt gebruiken. Zo houd je de andere pinnen vrij voor andere mogelijke doeleinden.
Let op: ESPHome zal niet opstarten wanneer je niet-ondersteunde I²C-pinnen definieert. Je kunt de firmware in dat geval ook niet meer via wifi of usb updaten. Ben je in deze ongelukkige situatie verzeild geraakt, voer dan een handmatige update uit via het .uf2-bestand met een correcte configuratie. Daarna start ESPHome wel weer op.
9 I²C-sensor aansluiten
Als voorbeeld van het gebruik van I²C sluiten we een BME280-sensor aan, die de temperatuur, luchtvochtigheid en luchtdruk meet. Ontkoppel je Raspberry Pi Pico W en sluit SDA van de sensor op GPIO20 aan (let op: in de Adafruit-versie van het BME280-sensorbordje SDI genoemd), SCL op GPIO21 (bij Adafruit SCK genoemd), GND op GND en VIN op 3V3. Voeg dan de volgende ESPHome-configuratie toe:
Hoe gezond is jouw omgeving?
Je meet het met een luchtkwaliteitsmeter
Het adres is 0x77 voor het Adafruit-BME280-sensorbordje. Heb je een BME280-sensorbordje van een andere fabrikant, dan is het adres waarschijnlijk 0x76. Installeer deze firmware op je Raspberry Pi Pico W en bekijk daarna aandachtig de logs. Krijg je te zien dat ESPHome je sensor niet vindt, verander dan het I²C-adres en/of kijk de verbindingen nog eens goed na.
10 RP2040-ondersteuning
Als je aandachtig de configuratie bekijkt die het ESPHome-dashboard voor je genereert, zie je dat in de platformconfiguratie het volgende staat:
Onder de motorkap maakt ESPHome gebruik van PlatformIO, maar die ondersteunt de Raspberry Pi Pico W officieel nog niet. Daarom dat ESPHome voor de RP2040-microcontroller de versie van Max Gerhardt gebruikt, die je in de code hierboven bij platform_version ziet staan. Gerhardt heeft niet alleen ondersteuning voor de Raspberry Pi Pico W toegevoegd, maar ook voor andere ontwikkelbordjes met de RP2040-chip.
Helaas kun je op deze manier niet een bordje zoals de Arduino Nano RP2040 Connect met wifi gebruiken in ESPHome. Die gebruikt immers de u-blox NINA-W102 voor wifi in plaats van de Infineon CYW43439 van de Raspberry Pi Pico W. Maar je kunt wel een bordje zonder wifi gebruiken, al zal dat dan niet met Home Assistant kunnen communiceren.
11 RP2040 zonder wifi
Een van die ontwikkelbordjes met een RP2040 zonder wifi is de XIAO RP2040 van Seeed Studio. Op het bordje is een WS2812-RGB-led gemonteerd, die is verbonden met GPIO12. De led moet je overigens eerst nog inschakelen door GPIO11 aan te zetten. Verder is het bordje op twee rijen voorzien van in totaal 14 GPIO-pinnen waarop je externe componenten kunt aansluiten.
Dat maakt dat je met dit minuscule bordje talloze zaken kunt automatiseren. Sluit bijvoorbeeld een sensor aan en verander de kleur van de RGB-led, afhankelijk van het overschrijden van een drempelwaarde. ESPHome maakt dit vrij eenvoudig, omdat je hiermee ook lokaal op het microcontrollerbordje zaken kunt automatiseren zonder dat er wifi-communicatie met Home Assistant nodig is. Het gebrek aan wifi op RP2040-bordjes hoeft je dus niet tegen te houden om ESPHome in te zetten.
12 Kleureffecten
Als voorbeeld tonen we hoe je de RGB-led van de XIAO RP2040 aanstuurt in ESPHome:
Merk op dat we hier geen wifi configureren en dat we het bordje als seeed_xiao_rp2040 aanduiden. De RGB-led configureren we als een rp2040_pio_led_strip op pin 12 met één led en een lichteffect dat willekeurige kleuren toont. Na het opstarten van de microcontroller schakelen we pin 11 in en starten we daarna het effect. Sla dit bestand op en installeer het handmatig op de XIAO RP2040.