ESP32 | ESPHome: Nachtlicht- und Temperatursensorsteuerung im Jugendzimmer

- Veröffentlicht unter Makerspace von

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


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. Front Rückseite


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).