Hinweis: Der Beitrag wurde von KI entworfen und manuell nachbearbeitet. Er basiert auf einem real aufgebauten Projekt; Zugangsdaten wurden anonymisiert.
🛒 = Affiliate-Link (Werbung). Wenn du über diesen Link etwas kaufst, erhalte ich eine kleine Provision – für dich bleibt der Preis gleich.
Projektziel
Ein ESP32 mit ESPHome steuert das Nachtlicht (12 V LED-Streifen) und misst Temperatur sowie Helligkeit. Die Logik läuft vollständig lokal in Home Assistant.
Hardware
- ESP32 DevKit (Wi-Fi)🛒
- 12 V Netzteil
- DC-DC Step-Down (12 V → 5 V)🛒 für ESP32
- 3,3V-Relaismodul (oft funktionieren auch 5V-Modelle🛒, muss mindestens 12 V DC schalten können) zum Schalten des 12 V-LED-Streifens
- DS18B20-Temperatursensor🛒 + 4,7 kΩ Pull-Up
- LDR + 10 kΩ als Spannungsteiler
- Meist gemeinsame Masse für 12 V/5 V/3,3 V, je nach Step-Down-Modul eventuell auch getrennte Masse für 12 V (im Schaltbild gestrichelt dargestellt)

ESPHome-Konfiguration
esphome:
name: juniorroom
esp32:
board: esp32dev
framework:
type: esp-idf # stabilerer ADC als Arduino
wifi:
ssid: "DEIN_WLAN"
password: "GEHEIM"
power_save_mode: none
logger:
api:
ota:
platform: esphome
password: "DEIN_OTA_PASSWORT"
# OneWire-Bus für den DS18B20
one_wire:
- platform: gpio
pin: 4
id: bus_a
sensor:
# Temperatur (DS18B20)
- platform: dallas_temp
one_wire_id: bus_a
name: "Temperatur Zimmer Junior"
# Helligkeit (LDR + 10k Teiler an GPIO34)
- platform: adc
pin: GPIO34
force_update: true
# Wichtig: Ohne force_update sendet ESPHome nur bei Wertänderung.
# Bleibt das Licht lange konstant, kommen in HA keine neuen Samples an
# und gleitende Mittelwerte/Statistiken laufen nicht weiter.
name: "Lichtstärke Zimmer Junior"
update_interval: 1s
attenuation: 12db
unit_of_measurement: "lux"
filters:
- lambda: |-
// Spannung vom ADC
float v = x;
// Spannungsteiler: LDR oben, 10k unten
float R = 10000.0f * (3.3f - v) / v;
// Grobe Kennlinie; Faktor/Exponent empirisch anpassen
float lux = 30.0f * powf((10000.0f / R), 1.3f);
return lux;
- exponential_moving_average:
alpha: 0.95
send_every: 1
switch:
- platform: gpio
pin: GPIO25
inverted: true
# Nur setzen, wenn das Relais sonst "falsch herum" schaltet
# (z. B. bei HA "AUS" tatsächlich AN zieht). Dann kehrt
# inverted: true die Logik um: An = an, Aus = aus.
name: "Relais Nachtlicht Junior"
id: relais_nachtlicht_junior
restore_mode: RESTORE_DEFAULT_OFF
# Optional: lokaler Webserver zum Debuggen
web_server:
port: 80
Home-Assistant-Automationen
Nachtlicht bei Dämmerung
alias: Nachtlicht Junior bei Dämmerung
description: "Schaltet das Nachtlicht ein, wenn es dunkel wird und Junior zu Hause ist."
triggers:
- entity_id: sensor.dammerungsschalter_junior_lichtstarke
to: "off"
trigger: state
conditions:
- condition: state
entity_id: person.junior
state: "home"
actions:
- target:
entity_id: switch.juniorroom_relais_nachtlicht_junior
action: switch.turn_on
mode: single
Thermostat-Offset sanft anpassen
alias: Thermostat-Offset Junior anpassen
description: |
Gleicht den DS18B20-Sensor mit dem Heizkörperthermostat ab (max ±1 °C pro Durchlauf).
triggers:
- seconds: /30
trigger: time_pattern
actions:
- variables:
ds18b20: "{{ states('sensor.juniorroom_temperatur_zimmer_junior') | float(0) }}"
thermo_corr: "{{ state_attr('climate.heizung_junior', 'current_temperature') | float(0) }}"
current_offset: "{{ states('number.hzg_junior_offset') | float(0) }}"
diff: "{{ ds18b20 - thermo_corr }}"
- condition: template
value_template: "{{ diff | abs < 5 }}"
- target:
entity_id: number.hzg_junior_offset
action: number.set_value
data:
value: "{{ (current_offset + diff / 2) | round(1) }}"
mode: single
Hardware-Aufbau
Ich habe die Hardware auf einer kleinen Lochrasterplatine verlötet und diese in einem Kunststoffgehäuse verbaut. Alle Anschlüsse, die nach außen gehen (Eingänge vom Netzteil, Ausgänge zum LED-Streifen, Ausgänge zum Temperaturfühler) sind über Lüsterklemmen herausgeführt. Den LDR (Fotowiderstand) habe ich hinter einem kleinen Loch direkt so ins Gehäuse geklebt, dass er "eine gute Sicht" ins Zimmer hat.

Erfahrungen / Stolperfallen
- LDR-Werte stark vom Einbauwinkel abhängig → Faktor/Exponent empirisch trimmen.
- DS18B20: saubere Lötstellen, Leitung kurz halten; 4,7 kΩ Pull-Up nicht vergessen.
- Netzteile: billige 12 V-Adapter brummen teils unter Last.
- force_update: nötig, damit HA gleitende Mittelwerte bei konstantem Licht weiterberechnet.
- inverted: nur aktivieren, wenn das Relais aktiv-LOW ist und sonst „verkehrt“ schaltet.
Fazit
Wenig Hardware + etwas YAML = stabile, lokale Automatisierung für Licht und Temperatur. Leicht erweiterbar (z. B. Luftfeuchte, Bewegung, Anzeige im Dashboard).