Managing ESPhome configs

Posted on So 27 November 2022 in Computer & Electronics

Wie Ihr Euch vielleicht erinnert, hatte ich ein kleines Gefrierschrank-Malheur das auf dem versehentlichen Ausschalten eines Smartplugs beruhte. Das ist natürlich ärgerlich! Und wenn ich so darüber nachdenke, wäre das auch sehr vermeidbar gewesen, wenn denn der Schalter am Smartplug deaktiviert gewesen wäre. Also habe ich mir ein alternatives Konfig-File für den nous A1T Smartplug gebaut, bei dem der Schalter inaktiv ist.

Da ich inzwischen diverse Geräte habe, auf denen eine ESPhome Firmware läuft habe ich mir ein modulares Konfigurationsschema eingerichtet und ich dachte mir, ich zeige Euch das heute mal.

Modularität

Praktischerweise ist es nämlich möglich, in ESPhome Config Files wieder andere Files zu importieren. Z.B. sieht mein Config File (espresso.yml) für den Sonoff S20, der die Espressomaschine steuert so aus:

substitutions:
  devicename: "espresso"

packages:
  base: !include lib/base.yml
  sonof-s20t: !include lib/sonoff-s20.yml

Das ist sehr übersichtlich. Hier werden nur Dinge konfiguriert, die spezifisch für genau dieses Gerät sind. Alles andere wird importiert. Auf diese Weise kann ich auch sehr bequem Updates oder Änderungen auf alle Geräte ausrollen und halte die Config-Dateien schön einfach.

In base.yml finden sich, wie schon angemerkt, die Konfigurationselemente, die für alle ESPhome Devices gelten. Z.B. die WLAN Konfiguration, Captive Portal Zugangsdaten etc.:

# common settings  for all ESP devices

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: on

  ap:
    ssid: "${devicename}-AP"
    password: !secret ap_password

api:
  password: !secret api_password

ota:
  password: !secret api_password

captive_portal:

time:
  - platform: homeassistant
    id: homeassistant_time

logger:

web_server:
  port: 80

sensor:
  - platform: wifi_signal
    name: "${devicename} - Wifi Signal"
    update_interval: 60s
    icon: mdi:wifi

  - platform: uptime
    name: "${devicename} - Uptime"
    update_interval: 60s
    icon: mdi:clock-outline

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "${devicename} - IP Address"
    ssid:
      name: "${devicename} - Wi-Fi SSID"
    bssid:
      name: "${devicename} - Wi-Fi BSSID"
  - platform: version
    name: "${devicename} - ESPHome Version"
    hide_timestamp: true

binary_sensor:
  - platform: status
    name: "${devicename} - Status"

Wie man sieht sind keine echten Passwörter hinterlegt und so kann ich diese Datei hier problemlos teilen. Letzte sind secrets.yml gespeichert (diesmal natürlich mit geänderten Passworten):

wifi_ssid: "mySSID"
wifi_password: "My wifipassword"
ap_password: "My Accesspoint password"
api_password: "My APIpassword"

Die Sonoff-S20 spezifischen Config Elemente stehen wiederum in sonoff-s20.yml:

# sonoff S20 common settings

esphome:
  name: $devicename
  comment: "Sonoff S20 Smartplug"
  name_add_mac_suffix: false

esp8266:
  board: esp8285
  restore_from_flash: true

binary_sensor:
- platform: gpio
  pin:
    number: GPIO0
    mode:
      input: true
      pullup: true
    inverted: true
  name: "Button"
  on_press:
    - switch.toggle: relay

switch:
- platform: gpio
  name: "${devicename} Relay"
  pin: GPIO12
  id: relay

Und mit der Zeit entsteht so ein hübsch aufgeräumter Baum von Config-Elementen:

.
├── dryer.yml
├── espresso.yml
├── freezer.yml
├── fridge.yml
├── lib
│   ├── base.yml
│   ├── nous-a1t-noswitch.yml
│   ├── nous-a1t.yml
│   ├── secrets.yaml
│   ├── sonoff-base.yml
│   └── sonoff-s20.yml
├── secrets.yaml -> lib/secrets.yaml
├── shop-heater.yml
├── washer.yml
└── wine-fridge.yml

Ein YAML File für jedes Gerät, das sich aus den generischen Configs im lib/ Folder bedient.

Und man kann sehen, dass ich nun für den nous A1T Smartplug eine alternative Config nous-a1t-noswitch.yml angelegt habe, die dem Knopf des Plugs keine Funktion zuweist, so dass man ihn nicht manuell schalten kann.