"Küchenbrett" als Interface, das nicht nach Interface aussieht





Ich wollte ein Home-Assistant-Interface bauen, das möglichst wenig nach Technik aussieht. Hardware ein ESP32, der 6 LEDs und sechs Cent-Münzen als Touch-Sensoren hinter Holz steuert. Damit die Touch-Positionen sichtbar sind und das Licht sauber durchscheint, habe ich jeweils ein 2 mm Loch über LED & Münze gebohrt.
Programmiert ist der ESP32 mit ESPhome.
Die Holzarbeiten sind noch nicht perfekt – aber fürs Erste läuft das Setup stabil und erfüllt genau den Zweck.

LED 1 / Touch 1 – Spülmaschine (+ Nachtruhe)
LED zeigt Status: gelb = läuft, grün = fertig (Tür zu). 23:00–06:30 bleibt die LED grundsätzlich aus. (Touch 1 ist aktuell frei.)

LED 2 / Touch 2 – Abendbeleuchtung
LED zeigt „Abendbeleuchtung aktiv“. Touch: dreifaches grünes Bestätigungsblinken, dann entweder Szene an (vorher EG+Garage aus) oder alles wieder aus.

LED 3 / Touch 3 – Müll-Erinnerung
Ab 16:00 leuchtet die LED, wenn „Morgen“ Abholung ist. Touch bestätigt (dreifach grün) → LED aus; Reset täglich um 04:00.

LED 4 / Touch 4 – Haustür
LED rot bei offener Haustür. Touch öffnet (Unlatch), wenn Schloss nicht „locked“ ist; mit grünem Bestätigungsblinken.

LED 5 / Touch 5 – Garagentor (Roma)
LED rot bei offener Garage. Touch toggelt Tor-Relais; danach wird die LED auf den tatsächlichen Sensorstatus synchronisiert.

LED 6 / Touch 6 – Einfahrtstor
LED rot bei offener Einfahrt. Touch toggelt Tor-Relais; LED wird anschließend gegen den echten Status gestellt.

Für die, die es interessiert: Hier die YAML für den ESP32:

esphome:
  name: kuechenbrett
  friendly_name: Küchenbrett ESP32

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:

ota:
  platform: esphome
  password: "******"

wifi:
  ssid: "*******"
  password: "*******"
  ap:
    ssid: "Kuechenbrett Fallback"
    password: "*******"

captive_portal:

# Touch-Hub (für kapazitive Tasten)
esp32_touch:
  setup_mode: false


# LED-Streifen (6 Pixel an GPIO16)
light:
  - platform: neopixelbus
    id: ledstrip
    name: "ESP32 LED & Touch – Streifen"
    pin: GPIO16
    num_leds: 6
    type: GRB
    variant: WS2812
    method:
      type: esp32_rmt
      channel: 0
    effects:
      - addressable_rainbow:
      - addressable_scan:

  # LEDs als einzelne Leuchten
  - platform: partition
    id: led_1
    name: "LED 1"
    segments:
      - id: ledstrip
        from: 0
        to: 0
    default_transition_length: 0ms

  - platform: partition
    id: led_2
    name: "LED 2"
    segments:
      - id: ledstrip
        from: 1
        to: 1
    default_transition_length: 0ms

  - platform: partition
    id: led_3
    name: "LED 3"
    segments:
      - id: ledstrip
        from: 2
        to: 2
    default_transition_length: 0ms

  - platform: partition
    id: led_4
    name: "LED 4"
    segments:
      - id: ledstrip
        from: 3
        to: 3
    default_transition_length: 0ms
    
  - platform: partition
    id: led_5
    name: "LED 5"
    segments:
      - id: ledstrip
        from: 4
        to: 4
    default_transition_length: 0ms
    
  - platform: partition
    id: led_6
    name: "LED 6"
    segments:
      - id: ledstrip
        from: 5
        to: 5
    default_transition_length: 0ms

# Touch-Eingänge (T0=GPIO4, T3=GPIO15, T4=GPIO13, T5=GPIO12, T7=GPIO27, T9=GPIO32)
binary_sensor:
  - platform: esp32_touch
    name: "Touch 1"
    pin: T0            # = GPIO4
    threshold: 900
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

  - platform: esp32_touch
    name: "Touch 2"
    pin: T3            # = GPIO15
    threshold: 900
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

  - platform: esp32_touch
    name: "Touch 3"
    pin: T4            # = GPIO13
    threshold: 900    # Messen und nach Bedarf anpassen!
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

  - platform: esp32_touch
    name: "Touch 4"
    pin: T5            # = GPIO12
    threshold: 900     # Messen und nach Bedarf anpassen!
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

  - platform: esp32_touch
    name: "Touch 5"
    pin: T7           # = GPIO27
    threshold: 900     # Messen und nach Bedarf anpassen!
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

  - platform: esp32_touch
    name: "Touch 6"
    pin: T9           # = GPIO32
    threshold: 1000     # Messen und nach Bedarf anpassen!
    filters:
      - delayed_on: 30ms
      - delayed_off: 120ms

10 „Gefällt mir“

Tolles Projekt gefällt mir. :+1:t2:

Das sieht doch schon mal ganz gut aus. :+1:

Super … gefällt mir :slight_smile:

Auf jeden Fall mal was anderes! Alleine deswegen schon ein Hingucker! :+1:

Wie funktioniert der Touch sensor? Kannst du da ein paar Zeilen schreiben? :blush::+1:

Hardware: Draht an Münze gelötet und mit Pin am ESP32 verbunden.

Software: Das findest Du in meinem ersten Beitrag oben im YAML-Block für den ESPhome-build. :wink:

Allgemeine Definition:

Und dann einmal den “binary_sensor” erstellen und je Taste einen Block darunter. Ich habe diese Pins auf dem ESP32 genutzt: (T0=GPIO4, T3=GPIO15, T4=GPIO13, T5=GPIO12, T7=GPIO27, T9=GPIO32)

Wenn Du das Ganze in ESPhome so anlegst, erscheinen die Entitäten direkt in Homeassistant.

Ergänzung: Wenn Ihr das ganze per USB lokal flasht, dann seht ihr bei

setup_mode: true

Die Werte der einzelnen Sensoren. Am besten im eingebauten Zustand die Werte mit und ohne Berührung auf der Außenseite auslesen und Mitteln. Dann den Durchschnitt von “Wert Finger” und “Wert kein Finger” als Threshold nehmen und dann ggf. noch nachjustieren (feuchte Finger, warm/kalt…).

Wenn alles wie gewünscht funktioniert dann wider zurück auf
setup_mode: false
und erneut flashen.

Meine LEDs waren übrigens einfach ein Reststreifen aus einem WLED-Projekt.

Und wie drückst du jetzt auf die Münze, wenn die auf der Rückseite der Holz verkleidung sitzt?

Gar nicht. Ich berühre nur die Holzverkleidung auf der Vorderseite. Hab hinter den Münzen das Material aber auf ca. 1,5 mm Stärke runter gefräst.