LCD display voor Home Assistant

Lang, heel lang geleden, speelde ik al eens met een LCD display. Deze moest ik toen met belachelijk veel draadjes koppelen aan m’n computer via de LTP printerpoort of een seriele poort, dat ben ik even kwijt. Een hoop gedoe, maar wat een overwinning toen het uiteindelijk werkte. wat deed ik er vervolgens echt mee? Eigenlijk heel weinig, want wat moest ik erop tonen?

Inmiddels gebruik ik alweer een tijd lang Home Assistant voor alle thuis-automatisering. En met al het thuiswerken de laatste twee jaar, kreeg ik de behoefte aan een LCD display. Belangrijkste aanleiding was het feit dat ik de deurbel regelmatig niet hoorde tijdens de online overleggen voor mijn werk. En laat de deurbel nou net gekoppeld zijn aan Home Assistant…

De werking

Onder mijn beeldscherm heb ik nu een klein display, met achtergrond verlichting, waarop notificaties getoond worden. Ik heb de oplossing zo breed mogelijk toepasbaar gemaakt, dus niet alleen voor mijn deurbelperikelen.

In Home Assistant heb ik een Helper van het type Tekst gemaakt. Wanneer hier een tekst in wordt gezet, dan knippert de achtergrondverlichting van het display kort en blijft daarna branden. Op het display wordt de tekst één minuut lang op de display getoond. Daarna gaat de achtergrond verlichting weer uit en verdwijnt de tekst.

Het display geeft dus alleen wat weer, en heeft alleen de achtergrondverlichting aanstaan, wanneer er daadwerkelijk een notificatie weergegeven wordt. Het vullen van de Helper met de tekst om weer te geven op het display gebeurd uiteraard via Automatiseringen.

De gebruikte hardware

Omdat ik al een paar jaar knutsel met NodeMCU’s en Wemos D1’s, en dus lang geleden ook LCD displays, ben ik hiermee aan de slag gegaan in ESPhome. In mijn test-opstelling ben ik begonnen met een NodeMCU (die lag het dichtst in mijn buurt op dat moment). Later ben ik overgegaan naar een Wemos D1 mini, aangezien deze kleiner is en makkelijker in de behuizing past.

Voor de LCD display heb ik gekozen voor een eenvoudig display van 2 regels met 16 karakters per regel. Op de achterkant zit al een voorgesoldeerde I2C module. Dit zorgt ervoor dat je slechts vier draadjes hoeft aan te sluiten, in plaats van de tig draadjes waarmee in vroeger worstelde. Er zijn displays met meer karakters per regel en ook meer regels. Deze zijn ook prima bruikbaar, werken hetzelfde, alleen passen deze niet in de behuizing die ik gebruik.

Hieronder even de display zelf, de achterkant met de I2C module erop, de Wemos D1 mini en hoe de laatste twee aan elkaar geknoopt dienen te worden (let even op de kruising tussen GND en VCC/5V). Klik om te vergroten.

In ESPHome

De Wemos D1 mini heb ik geprogrammeerd in ESPHome, dit is een add-on in Home Assistant, voor wie het leuk vind om zelf elektronica te bouwen voor Home Assistant. Meer informatie en hoe te starten met ESPHome vind je op de website.

Voor de eerste keer dat je je programma laadt op je Wemos D1 of NodeMCU sluit je deze aan via USB op je Rasberry Pi waarop je Home Assistant draait of op de PC waarop je werkt. Let voor de laatste optie wel op dat je gebruik maakt van HTTPS (met een Synology NAS hoeft dat niet ingewikkeld te zijn) en een Chrome-browser (Google Chrome of Microsoft Edge bijvoorbeeld). Als dat is gelukt en je Wemos D1 of NodeMCU via Wifi bereikbaar is vanuit ESPHome, dan kan deze voortaan geprogrammeerd worden “over the air”.

ESPHome code

esphome:
  name: lcd-notification-display
  platform: ESP8266
  board: d1_mini
  on_boot:
    priority: -100.0
    then:
      - lambda: 'id(mydisplay).no_backlight();'

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "..."

wifi:
  ssid: "..."
  password: "..."

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "..."
    password: "..."

captive_portal:

i2c:
  sda: D4
  scl: D3

text_sensor:
  # Create text input helper in homeassistant and enter id below
  - platform: homeassistant
    entity_id: input_text.tekst_lcd_display
    id: lcd_text

  - platform: wifi_info
    ip_address:
      id: ip_address
      name: IP address
    mac_address:
      id: mac_address
      name: Mac address
    ssid:
      id: connected_ssid
      name: Network SSID
    bssid:
      id: connected_
      name: Network Mac

sensor:
  - platform: wifi_signal
    id: wifisignal
    name: wifi-signal
    update_interval: 300s

globals:
  - id: achtergrondlicht_aan
    type: bool
    initial_value: 'false'
  - id: knipperlicht_aan
    type: bool
    initial_value: 'false'

switch:
  - platform: template
    name: "Achtergrondlicht"
    id: achtergrondlicht
    restore_state: false
    turn_on_action:
      - globals.set:
          id: achtergrondlicht_aan
          value: 'true'
      - globals.set:
          id: knipperlicht_aan
          value: 'false'
      - lambda: |-
          id(mydisplay).backlight();
      - delay: 5s
      
    turn_off_action:
      - globals.set:
          id: achtergrondlicht_aan
          value: 'false'
      - lambda: |-
            id(mydisplay).no_backlight();
    lambda: |-
      return id(achtergrondlicht_aan);

  - platform: template
    name: "Knipperlicht"
    id: knipperlicht
    restore_state: false
    turn_on_action:
      - globals.set:
          id: knipperlicht_aan
          value: 'true'
      - globals.set:
          id: achtergrondlicht_aan
          value: 'false'
      - lambda: |-
          id(mydisplay).backlight();
      - delay: 0.75s
      - lambda: |-
          id(mydisplay).no_backlight();
      - delay: 0.75s
      - lambda: |-
          id(mydisplay).backlight();
      - delay: 0.75s
      - lambda: |-
          id(mydisplay).no_backlight();
      - delay: 0.75s
      - lambda: |-
          id(mydisplay).backlight();
    turn_off_action:
      - globals.set:
          id: knipperlicht_aan
          value: 'false'
      - lambda: |-
            id(mydisplay).no_backlight();
    lambda: |-
      return id(knipperlicht_aan);

display:
  - platform: lcd_pcf8574
    id: mydisplay
    dimensions: 16x2
    address: 0x27
    lambda: |-
      if(id(wifisignal).has_state()) {
        if (id(lcd_text).state != "") {
          it.print(0, 0, id(lcd_text).state.c_str());
        }
      } else {
        it.print("    Aan het       opstarten...");
      }

De wachtwoorden en de naam van het wifi-netwerk zijn in deze code verwijderd. Die dienen uiteraard wel inhoud te bevatten. Verder gebruik ik in deze code de verwijzing naar input_text.tekst_lcd_display, de Tekst helper die ik hieronder beschrijf. Mocht je die een andere naam + id geven, dan dient je dit in de code uiteraard ook aan te passen.

Wanneer het is gelukt om deze code te uploaden naar de Wemos D1 mini dan vind je in Home Assistant een nieuwe apparaat met de naam lcd-notification-display (tenzij je een andere naam gaf uiteraard) met twee schakelaars om het achtergrond licht te bedienen.

In Home Assistant

In Home Assistant maken we twee dingen aan; Een Helper van het type Tekst om de tekst die op het display getoond moet worden een plek in Home Assistant te geven. En een Automatisering die ervoor zorgt dat tekst ook daadwerkelijk op het display wordt getoond en de achtergrondverlichting aangaat of knippert.

De Tekst-helper

Deze is eenvoudig aan te maken door onder de Instellingen van Home Assistant te kiezen voor Automatiseringen & Scenes, en vervolgens naar de tab Helpers te gaan. Hier vind je de lijst met helpers die al zijn aangemaakt, en rechts onderin kan je kiezen om een nieuwe helper aan te maken. Vervolgens kies je voor het type Tekst.

De mijne heeft de naam tekst_lcd_display meegekregen, kies je een andere naam, vergeet dan niet om deze naam ook aan te passen in de ESPHome code en in de automatisering die hierna komt.

Verder heb ik een maximumlengte van 32 karakters opgegeven. Dit is omdat mijn display 2 regels x 16 karakters per regels = 32 karakters heeft. Neem je een ander display, dan kan dit dus afwijken. Geef je overigens geen maximum op, dan worden alle karakters die niet meer op je display passen gewoon weggelaten.

De automatisering

De automatisering ziet er in YAML als volgt uit, deze is zo eenvoudig te kopieren & te plakken.

alias: LCD notificaties
description: ''
trigger:
  - platform: state
    entity_id: input_text.tekst_lcd_display
    from: ''
condition:
  - condition: not
    conditions:
      - condition: state
        entity_id: input_text.tekst_lcd_display
        state: '{{""}}'
action:
  - delay:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 500
  - type: turn_on
    device_id: abcdefghijklmnopqurstuvwxyz
    entity_id: switch.knipperlicht
    domain: switch
  - delay:
      hours: 0
      minutes: 1
      seconds: 0
      milliseconds: 0
  - type: turn_off
    device_id: abcdefghijklmnopqurstuvwxyz
    entity_id: switch.knipperlicht
    domain: switch
  - service: input_text.set_value
    data:
      value: '{{""}}'
    target:
      entity_id: input_text.tekst_lcd_jos
mode: single

Effectief triggered deze automatisering wanneer de tekst-helper van leeg naar een ingevulde waarde gaat. Deze waarde wordt automatisch getoond op het display via de code in ESPhome. Deze automatisering activeerd de knop “Knipperlicht” om de achtergrond drie keer te laten knipperen en vervolgens nog een minuut lang continue te laten branden. Hierna wordt de achtergrond verlichting weer uitgezet en de waarde van de tekst-helper leeg gemaakt.

De huizing

Omdat het LCD display bij mij onder mijn zwarte beeldscherm staat, heb ik gekozen voor het zwart laten printen (dankjewel collega Roland!) van het volgende 3D model; https://www.thingiverse.com/thing:1755381

Het plaatsen van het display in de behuizing en het vastzetten ervan vraagt een klein beetje creativiteit, aangezien er geen schroefgaten o.i.d. in dit model zitten. Ik heb zelf gebruik gemaakt van plakbare zwarte tochtstrip om het display op de juiste hoogte te laten vallen in het gat. En ik heb vervolgens het lijmpistool ter hande genomen om het display aan de randen vast te zetten.

Tot slot heb ik wat plastic genomen om tussen de display en de Wemos D1 mini te plaatsen, zodat deze geen kortsluiting met elkaar maken o.i.d. En verder nog wat meer plastic om de behuizing te vullen, zodat er niets van binnen rammelt.

Het gebruik

Om vanuit automatiseringen een melding te plaatsen op het display dien je enkel de waarde van de tekst-helper te vullen met de tekst die je op het display wilt tonen.

Let hierbij wel op het volgende; het display dat ik gebruik kent regels van maximaal 16 karakters. Woorden die niet meer op een regel passen worden niet automatisch afgebroken naar de volgende regel. Wil je een woord laten beginnen op de nieuwe regel, dan zet je voor het woord een aantal spaties om de eerst regel op te vullen en het volgende woord netjes op de nieuwe regel te laten uitkomen. Dit vraagt soms even wat uitproberen om teksten netjes te laten verschijnen.

Wellicht kan dit nog mooier, suggesties hiervoor zijn welkom!

2 reacties

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.