ESP32 als Komfortschalter für Stiegenhaus Licht

Möchte gerne mit einem ESP32 Mini D1 einen Komforschalter fürs Stiegenhauslicht realisieren. Ein Taster, 5 Lampen parallel.

Funktion 1: Bei Stromausfall Lampe immer aus
Funktion 2: Taster mit umschalten EIN/AUS muss immer funktionieren
Funktion 3: Bei Lampe EIN Zeit für wider aus 30s (zum testen)
Funktion 4: Bei drücken von 5sek Lampe 3x blinken und 1min ein

Da mein altes Logo nicht ewig überleben wird (schon 15Jahre auf Buckel und Netzteil schon ersetzt und wo habe ich nochmals das programm mit kabel an 9pol dsub) würde ich es gerne auf ein günstiges Teil umbauen.

Wer könnte da helfen, hab mich schon mit chat gpt4 etwas schlauer gemacht aber die funktionen laufen nicht so richtig.

Hier ist schon mal ein Programmbeispiel:

esphome:
  name: treppenhaus-licht
  friendly_name: Treppenhaus-Licht

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable Home Assistant API
api:
  encryption:
    key: "4cO321ej9fWCfGAxQ1p0sScsBbwt36wEt1Z5ehrS+vg="

ota:
  password: "935aab5c2baa499d02e9717bf5eb8408"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Treppenhaus-Licht"
    password: "s3R7rkheOm2B"

logger:
  level: DEBUG

captive_portal:

# Konstanten für GPIO-Pins
substitutions:
  taster_pin: GPIO21
  lampe_pin: GPIO18

globals:
  - id: kurze_druck_zeit
    type: string  # Ändern Sie den Typ auf "string"
    restore_value: no
    initial_value: "1s"  # Verwenden Sie Zeichenketten mit "s" als Einheit
  - id: lampe_kurz_zeit
    type: string  # Ändern Sie den Typ auf "string"
    restore_value: no
    initial_value: "30s"  # Verwenden Sie Zeichenketten mit "s" als Einheit
  - id: langer_druck_zeit
    type: string  # Ändern Sie den Typ auf "string"
    restore_value: no
    initial_value: "5s"  # Verwenden Sie Zeichenketten mit "s" als Einheit
  - id: lampe_lang_zeit
    type: string  # Ändern Sie den Typ auf "string"
    restore_value: no
    initial_value: "60s"  # Verwenden Sie Zeichenketten mit "s" als Einheit

binary_sensor:
  - platform: gpio
    pin:
      number: ${taster_pin}
      mode: INPUT_PULLUP
      inverted: True
    name: "Treppenhaus-Taster"
    id: Treppenhaus_Taster  # Fügen Sie diese Zeile hinzu
    filters:
      - delayed_on: 50ms
      - delayed_off: 50ms
    on_press:
      then:
        - logger.log: "Taster gedrückt"
        - switch.toggle: lampe
        - logger.log: "Lampe umgeschaltet"
        - delay: !lambda 'return id(kurze_druck_zeit);'
        - if:
            condition:
              - binary_sensor.is_off: Treppenhaus_Taster
            then:
              - logger.log: "Kurzes Drücken erkannt, Lampe für 30 Sekunden eingeschaltet"
              - switch.turn_on: lampe
              - delay: !lambda 'return id(lampe_kurz_zeit);'
              - switch.turn_off: lampe
              - logger.log: "Lampe nach 30 Sekunden ausgeschaltet"
            else:
              - delay: !lambda 'return id(langer_druck_zeit) - id(kurze_druck_zeit);'
              - logger.log: "Langes Drücken erkannt, Lampe für 1 Minute eingeschaltet"
              - switch.turn_on: lampe
              - delay: !lambda 'return id(lampe_lang_zeit);'
              - switch.turn_off: lampe
              - logger.log: "Lampe nach 1 Minute ausgeschaltet"

switch:
  - platform: gpio
    name: "Treppenhaus-Lampe"
    pin: ${lampe_pin}
    id: lampe
    restore_mode: ALWAYS_OFF

sensor:
  # Sensoren für die Anzeige der aktuellen Zeiteinstellungen
  - platform: template
    name: "Kurze Druck Zeit"
    id: kurze_druck_zeit_sensor
    lambda: 'return id(kurze_druck_zeit);'
    update_interval: 60s
  - platform: template
    name: "Lampe Kurz Zeit"
    id: lampe_kurz_zeit_sensor
    lambda: 'return id(lampe_kurz_zeit);'
    update_interval: 60s
  - platform: template
    name: "Langer Druck Zeit"
    id: langer_druck_zeit_sensor
    lambda: 'return id(langer_druck_zeit);'
    update_interval: 60s
  - platform: template
    name: "Lampe Lang Zeit"
    id: lampe_lang_zeit_sensor
    lambda: 'return id(lampe_lang_zeit);'
    update_interval: 60s

number:
  # Einstellbare Number-Entitäten für Home Assistant
  - platform: template
    name: "Einstellbare Kurze Druck Zeit"
    min_value: 1
    max_value: 600
    step: 1
    lambda: 'return id(kurze_druck_zeit);'
    set_action:
      - logger.log: "Kurze Druck Zeit geändert auf {:.0f} Sekunden"  # Log-Meldung für geänderte Variable
      - lambda: |-
          id(kurze_druck_zeit) = string(x) + "s";  # Umrechnung in Zeichenkette mit Einheit "s"
          id(kurze_druck_zeit_sensor).publish_state(id(kurze_druck_zeit));  # Aktualisieren Sie den Sensor
  - platform: template
    name: "Einstellbare Lampe Kurz Zeit"
    min_value: 10
    max_value: 3600
    step: 10
    lambda: 'return id(lampe_kurz_zeit);'
    set_action:
      - logger.log: "Lampe Kurz Zeit geändert auf {:.0f} Sekunden"  # Log-Meldung für geänderte Variable
      - lambda: |-
          id(lampe_kurz_zeit) = string(x) + "s";  # Umrechnung in Zeichenkette mit Einheit "s"
          id(lampe_kurz_zeit_sensor).publish_state(id(lampe_kurz_zeit));  # Aktualisieren Sie den Sensor
  - platform: template
    name: "Einstellbare Langer Druck Zeit"
    min_value: 10
    max_value: 600
    step: 10
    lambda: 'return id(langer_druck_zeit);'
    set_action:
      - logger.log: "Langer Druck Zeit geändert auf {:.0f} Sekunden"  # Log-Meldung für geänderte Variable
      - lambda: |-
          id(langer_druck_zeit) = string(x) + "s";  # Umrechnung in Zeichenkette mit Einheit "s"
          id(langer_druck_zeit_sensor).publish_state(id(langer_druck_zeit));  # Aktualisieren Sie den Sensor
  - platform: template
    name: "Einstellbare Lampe Lang Zeit"
    min_value: 60
    max_value: 1200
    step: 60
    lambda: 'return id(lampe_lang_zeit);'
    set_action:
      - logger.log: "Lampe Lang Zeit geändert auf {:.0f} Sekunden"  # Log-Meldung für geänderte Variable
      - lambda: |-
          id(lampe_lang_zeit) = string(x) + "s";  # Umrechnung in Zeichenkette mit Einheit "s"
          id(lampe_lang_zeit_sensor).publish_state(id(lampe_lang_zeit));  # Aktualisieren Sie den Sensor

:crayon:by HarryP: Codezeilen formatiert (bitte immer in </> einbinden)

Soo einfacher realisiert:

captive_portal:

number:
  - platform: template
    name: "Ausschaltzeit"
    id: ausschaltzeit
    min_value: 10
    max_value: 300
    step: 10
    unit_of_measurement: "s"
    icon: "mdi:timer"
    initial_value: 10
    set_action: 
      - lambda: |-
          id(ausschaltzeit).publish_state(x);
          
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO4
      mode: INPUT_PULLUP
      inverted: True
    name: "Taster Leuchte"
    on_press:
      then:
        - switch.toggle: leuchte_switch
        - delay: !lambda "return id(ausschaltzeit).state * 1000;"
        - if:
            condition:
              - switch.is_on: leuchte_switch
            then:
              - switch.turn_off: leuchte_switch

switch:
  - platform: gpio
    pin: GPIO9
    name: "Relais Leuchte"
    id: leuchte_switch
    on_turn_on:
      - lambda: !lambda |-
          // Leuchte beim Einschalten einschalten
          if (id(leuchte_switch).state) {
            id(leuchte_switch).turn_on();
          }
    on_turn_off:
      - lambda: !lambda |-
          // Leuchte beim Ausschalten ausschalten
          if (!id(leuchte_switch).state) {
            id(leuchte_switch).turn_off();
          }

Und automatisierung Für Schalter wider zurücksetzten bei vergessen:

alias: Automatische Ausschaltung der Stiegenhaus-Beleuchtung
description: ""
trigger:
  - platform: state
    entity_id: switch.stiegen_haus_relais_leuchte
    to: "on"
action:
  - delay:
      seconds: "{{ states('number.stiegen_haus_ausschaltzeit') | int }}"
  - service: switch.turn_off
    entity_id: switch.stiegen_haus_relais_leuchte
mode: single

:crayon:by HarryP: Codezeilen formatiert

Danke fürs formatieren, weis net wies geht