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