ESPHome kan ook kleine displays aansturen die je vervolgens via Home Assistant van gegevens kunt voorzien. Wij gebruiken bijvoorbeeld een klein OLED-display om de tijd, de status van de led, het accuniveau van een smartphone en een tekstbericht weer te geven dat in Home Assistant kan worden ingesteld. De volledige lijst van displays die ESPHome ondersteunt, is te vinden bij de documentatie.
We hebben gekozen voor het model SSD1306, dat als merkloos product verkrijgbaar is voor zo’n 6 euro. Dat kleine grafische display (0,9 inch) heeft een resolutie van 128×64 pixels. In tegenstelling tot andere displays, die 10 pinnen nodig hebben, wordt dat display met SSD1306-chip via het I2C-protocol aangestuurd met maar twee signaallijnen, data en klok (SDA en SCL), die zich op pin D1 en D2 van de NodeMCU bevinden. Daarnaast zijn er nog aansluitingen voor de voedingsspanning (3V) en de massa (GND). Je kunt de display aansluiten op een ESPHome-module zoals de NodeMCU.
Stap 1: YAML-bestand uitbreiden
Breid eerst het YAML-bestand van de ESPHome-module uit met het activeren van I2C, zodat de module de bus scant op apparaten:
i2c:
sda: D1
scl: D2
Stap 2: aansluiten op ESP-module
Sluit de vier aansluitingen van het display aan op de (van de voeding losgekoppelde) ESP-module. Sluit hem dan opnieuw aan op de usb-poort en upload de nieuwe software, zodat je het opstartproces met I2C-scan kunt volgen in de automatisch geopende log. Als het display correct is aangesloten, wordt het adres ervan gevonden en in de log weergegeven:
[C][i2c:028]: I2C Bus:
[C][i2c:029]: SDA Pin: GPIO4
[C][i2c:030]: SCL Pin: GPIO5
[C][i2c:031]: Frequency: 50000 Hz
[I][i2c:033]: Scanning i2c bus for »active devices…
[I][i2c:040]: Found i2c device at »address 0x27
Dat adres (0x3C in ons voorbeeld) heb je nodig voor de displaydefinitie, die je aan het eind van het YAML-bestand zet:
display:
– platform: lcd_pcf8574
dimensions: 20×4
address: 0x27
lambda: |-
it.print(4, 0, “Hello World!”);
it.printf(0, 1, “LED ist %s”, »id(ledblue).state ? “an” : “aus” );
Stap 3: definieer de gegevens
Definieer de gegevens volgens de datasheet van je display (zie de voorbeeldcode in de documentatie van ondersteunde displays) – in ons geval een SSD1306 met 128 kolommen en 64 regels – en het address zoals weergegeven door de I2C-scan. Met lambda wordt een sectie voor instructies in C++ geopend. Het wordt bij het interpreteren van de YAML-code in het resulterende C++ programma ingevoegd. ESPHome heeft die optie omdat sommige instructies de grenzen overschrijden van de programmalogica die in YAML kan worden weergegeven. Gebruik lambda echter alleen als het niet anders kan, zodat het YAML-bestand overzichtelijk blijft.
Stap 4: huidige tijd weergeven
In ons voorbeeld wordt lambda gebruikt vanwege de meer individuele ontwerpmogelijkheden (o.a. fonts) van de print-instructies in C++ die nodig zijn voor de uitvoer naar het display. De eerste twee argumenten specificeren de eerste kolom en de eerste regel (tellen begint met 0) van de uitvoer. Daarna volgt (in ons geval) de font-ID en de weer te geven string. De font-ID moet bovenin de code gedefinieerd zijn (zie de voorbeeldcode van het display). Moet de waarde van een variabele in de string verschijnen, dan gebruik je printf. In het bovenstaande voorbeeld wordt de logische toestand van de schakelaar met de ID ledblue geëvalueerd en afhankelijk van het resultaat (true of false) wordt de juiste string geselecteerd. Om in plaats van ‘Hello World’ de huidige tijd weer te geven, kun je het voorbeeld uitbreiden met de tijd-query van Home Assistant. Pas daarvoor in de time-configuratie in het YAML-bestand de specificatie van het platform aan en wijs een variabelenaam (ID) toe:
time:
– platform: homeassistant
id: time
De variabele time bevat dan de actuele datum en tijd (als Unix-timestamp). De tijd in het gebruikelijke formaat wordt via een C++ instructie naar het display geschreven. Vervang de ‘Hello World’-regel van het display van hierboven door deze regel:
it.strftime(0, 0, “Tijd: %H:%M:%S”»,
id(time).now());
Na het flashen van de firmware synchroniseert ESPHome zichzelf met HA en zet de tijd op het display.
Stap 5: het accuniveau opvragen
Om het accuniveau op te vragen, heb je zijn entiteits-ID nodig: via ‘Instellingen / Entiteiten’ in de webinterface, typ in het zoekveld ‘accu’ in om de ID van het oplaadniveau te vinden – in ons voorbeeld sensor.gt_i9505_batterijniveau. Sommige besturingssystemen gebruiken intern Engelse benamingen – als je niets vindt met accu of batterij, probeer dan battery. Hiermee kun je op de ESPHome-module een geschikte sensor aanmaken die de waarde van de HA-server overneemt en die onder de lokale variabele accu beschikbaar stelt:
display:
– platform: lcd_pcf8574
dimensions: 20×4
address: 0x27
lambda: |-
it.strftime(0, 0, “Time: %H:»%M:%S”, id(time).now());
it.printf(0, 1, “LED is %s”, »id(ledblue).state ? “aan” : “uit” );
it.printf(0, 2, “Accu: %.1f %%”», id(accu).state );
sensor:
– platform: homeassistant
id: accu
entity_id: sensor.»sm_a520f_batterijniveau
Stap 6: tekstbericht instellen
Voor de berichttekst in de laatste regel kunnen alle apparaten of sensors van je Home Assistant-instantie als bron dienen. In ons voorbeeld gebruiken we een keuzelijst in de HA-interface met verschillende voorbereide teksten. Je hebt een tekstveld nodig om dat te laten werken. Via ‘Instellingen / Helpers / Helper toevoegen’ krijg je een lijst met verschillende opties. Met Tekst kun je een vrij tekstveld maken, maar voor ons voorbeeld is de optie Keuzelijst geschikter. Geef de helper een naam, bijvoorbeeld ‘OLED-bericht’.
Daaronder kun je onder Opties teksten toevoegen, bijvoorbeeld ‘Bericht 1’, ‘Bericht 2’ en ‘Geen bericht’. Nadat je die helper met Aanmaken hebt opgeslagen, kom je in een lijst terecht waarin je de net aangemaakte helper kunt selecteren. Daarna voeg je de sectie text_sensor toe aan het YAML-bestand, zodat die data van Home Assistant kan aannemen. Een tekstsensor kan alfanumerieke tekens leveren, terwijl een normale sensor alleen cijfers levert:
text_sensor:
– platform: homeassistant
id: oled1
entity_id: input_select.oled_bericht
Je kunt de ID vrij kiezen – de entity_id is de ID van de Home Assistant-helper die je zojuist hebt gemaakt. Je vindt die in je HA-systeem op de lijst Helpers onder Entiteits-ID of rechtstreeks in de helper wanneer je die opent met een dubbelklik. Om ervoor te zorgen dat ESPHome de tekst naar het display overbrengt, voeg je een extra regel in het lambda-gebied van display in:
it.printf(0, 1, “%s”, »id(oled1).
state.c_str());
Stap 7: test de functies
ESPHome leest de sensor oled1 en zet de tekst om in een C-string. Wanneer het bijgewerkte YAML-bestand geüpload is en er weer verbinding is met Home Assistant, wordt het bericht dat momenteel in de helper is geselecteerd op het display weergegeven. Test de functie door een ander bericht te selecteren uit de keuzelijst. Daarna kun je het tekstveld eventueel toevoegen aan een (nieuw) dashboard. Een geschikt kaarttype is Entiteiten, die je bijvoorbeeld de titel Tekstselectie kunt geven.
Meer van dit soort Raspberry Pi Projects?
,Schrijf je in voor de gratis nieuwsbrief: