ESPHome - LEDs blinken nur kurz - Bitte um Hilfe bei Code

Servus in die Runde. Nach langen Stunden mit ChatGPT hoffe ich hier bei uns auf eine saubere Lösung.

Ich habe eine Mausefalle gebaut mit einem esp32/ESPHome.

Ein IR-Infrarot Hindernis-Erkennungssensor erkennt praktisch die Maus und triggert ein 5V-Relais mit einem Solenoid, der die Falle auslöst und ein Holzplättchen nach unten fallen lässt und die Maus ist einsperrt.

Ich möchte gerne, dass drei LEDs verschieden leuchten.

Wenn ausgelöst wird durch den IR-Sensor, soll der Solenoid einmalig auslösen und die rote LED dauerhaft leuchten.
Die weisse LED soll auch leuchten, jedoch nur für 1 Minute.
Am liebsten wäre mir ein Schieberegler für Home Assistant, mit dem ich die Leuchtdauer der weissen LED von 1-300 Minuten einstellen kann.

Der Touch-Sensor „Scharfmachen“ soll dann nur die rote und die weisse LED ausschalten, den Solenoid freigeben dass er wieder getriggert werden darf und eine grüne LED dauerhaft einschalten.
Der Solenoid darf nur 1x getriggert werden, dann nicht mehr, erst wenn er auch duch den Touch-Sensor freigegeben wurde.
(ansonsten rennt die Maus die ganze Zeit vorm IR-Sensor rum und der Solenoid wird die ganze Zeit getriggert - deshalb nur 1x bis zur freigabe mit dem Touch)

Das wärs eigentlich schon. Die rote LED soll signalisieren, dass der Solenoid ausgelöst hat und eine Maus gefangen sein sollte.
Die weisse LED beleuchtet den „Fangraum“, in den man durch ein Sichtfenster durchsehen kann.
Die grüne LED dauerhaft Bereitschaft.

Eigentlich könnte ich mir das scharfmachen auch sparen, aber wenn die Maus entnommen wurde sieht es einfach schöner aus wenn durch den Touch-Sensor die rote und weisse LED ausgeschaltet und eine grüne LED dauerhaft Bereitschaft signalisiert.

Das Problem bei meinem Code bisher ist, dass die rote und die weisse LED nur kurz aufblinken.
Der Solenoid schaltet einwandfrei, die grüne LED schaltet auch ein bei Touch,
nur die rote und weisse LED leuchten nicht dauerhaft wie gewünscht sondern blinken beide nur kurz auf.

Ein ganz einfacher Code auf dem esp32 zum Test für alle drei LEDs als Schalter, da lassen sich alle drei LEDs normal in Home Assistant ein-und ausschalten. Sie funktionieren also und lassen sich ansteuern über die GPIO.

Findet ihr den Fehler? ChatGPT und ich kommen hier überhaupt nicht mehr weiter.
Ich bekomme eine angebliche Verbesserung nach der anderen vorgeschlagen, jedoch bleibt das Problem stets das gleiche.

Ich hoffe dass ich keine wichtigen Angaben vergessen habe und bedanke mich vielmals im voraus.

captive_portal:

bluetooth_proxy:
  active: True

web_server:
  port: 80
    
button:
  - platform: restart
    name: "Mausefalle Neustart ESP32"

# LEDs als GPIO Outputs
output:
  - platform: gpio
    pin: 27
    id: led_rot

  - platform: gpio
    pin: 14
    id: led_gruen

  - platform: gpio
    pin: 33
    id: led_weiss

# Relais (Solenoid)
switch:
  - platform: gpio
    pin:
      number: 13
      inverted: false
    id: solenoid_relay
    name: "Solenoid Relais"
    restore_mode: ALWAYS_OFF

globals:
  - id: trap_armed
    type: bool
    restore_value: no
    initial_value: 'false'
  - id: trap_triggered
    type: bool
    restore_value: no
    initial_value: 'false'

binary_sensor:
  # Touch scharfstellen
  - platform: gpio
    pin: 25
    name: "Scharfstellen Touch"
    on_press:
      - script.execute: arm_trap

  # IR-Sensor
  - platform: gpio
    pin:
      number: 26
      inverted: true
    name: "IR-Sensor"
    on_press:
      - if:
          condition:
            lambda: 'return id(trap_armed) && !id(trap_triggered);'
          then:
            - script.execute: trigger_trap

script:
  - id: trigger_trap
    then:
      # Zuerst LEDs setzen
      - output.turn_on: led_rot     # Rot dauerhaft
      - output.turn_on: led_weiss   # Weiß an
      - output.turn_off: led_gruen  # Grün aus
      # Solenoid einmal schalten
      - switch.turn_on: solenoid_relay
      - delay: 300ms
      - switch.turn_off: solenoid_relay
      # Flags nach Schaltung setzen
      - lambda: |-
          id(trap_armed) = false;
          id(trap_triggered) = true;
      # Timer für weiße LED starten
      - script.execute: led_auto_off

  - id: arm_trap
    then:
      # LEDs sofort korrekt setzen
      - output.turn_off: led_rot
      - output.turn_on: led_gruen
      - output.turn_off: led_weiss
      # Flags zurücksetzen
      - lambda: |-
          id(trap_armed) = true;
          id(trap_triggered) = false;
      # Timer abbrechen
      - script.stop: led_auto_off

  - id: led_auto_off
    mode: restart
    then:
      - delay: 1min
      - output.turn_off: led_weiss

sensor:
  - platform: wifi_signal
    name: "WLAN Signal Mausefalle"
    update_interval: 60s

  - platform: uptime
    id: uptime_sensor
    update_interval: 60s
    internal: true

text_sensor:
  - platform: template
    name: "Betriebszeit Mausefalle"
    icon: "mdi:clock-start"
    update_interval: 60s
    lambda: |-
      int seconds = (int) id(uptime_sensor).state;
      int days = seconds / 86400;
      int hours = (seconds % 86400) / 3600;
      char buffer[16];
      snprintf(buffer, sizeof(buffer), "%dd %02dh", days, hours);
      return std::string(buffer);

Moin, ich nehme an, es geht um diesen Teil im Code. Was auffällig ist, die Leds werden eingeschaltet, aber am Ende der Passage wird das Script led_auto_off aufgerufen/ausgeführt. Ich denke dadurch werden die Leds nach dem Einschalten immer wieder ausgeschaltet. Du kannst ja mal testen, diese Zeile einfach herauszunehmen und schauen ob sie dann dauerhaft eingeschaltet sind.

Wenn das klappt, wissen wo man weiter machen kann. Dann könnte man wahrscheinlich mit script.wait: led_auto_off arbeiten. So müsste die Aktion von led_auto_off abgewartet werden bevor es mit dem Hauptskript weitergeht.

Vielen Dank für deine Antwort.
Ich habe den Teil rausgelöscht, leider noch immer das gleiche Problem.

Es sieht so aus als würden die LEDs mit dem Relais mitschalten.
Genau wenn das Relais triggert, gehen auch die LEDs kurz an und wieder aus.
Am Relais ist aber nur der Solenoid dran.
5V > COM > NO > Solenoid+ - Solenoid- - GND
Auf der anderen Seite komme ich vom esp32 mit 5V+, GND und gpio13 ins Relais.

Es ist zum Haare raufen.
Am Ende werde ich es wohl mit HomeAssistant und einer Automation lösen müssen.
Ich möchte einfach nur gerne dass die Mausefalle unabhängig von HA funktioniert.

Gefangen wird sie ja schon, nur die LEDs bekomme ich einfach nicht hin.

Edit:
Ich glaube ich habe es rausgefunden. Wenn ich vom Relais das Pluskabel entferne auf der esp32 Seite, dann funktionieren die LEDs und leuchten dauerhaft.
Ist das Relais das den Solenoid schaltet an den 5v+ dran, dann blinken die LEDs nur kurz.

Es ist also ein Stromproblem.

Ich bin mit DC+ vom Relais direkt am Netzteil an Plus. Es kann doch nicht sein dass ich für das Relais ein eigenes Netzteil brauche?

Na zumindest schon mal ein Ansatzpunkt.

Aber schon komisch, das Relais sollte über die 5v vom esp laufen und dann ein 3v Steuersignal bekommen um zu schalten, so hast du es ja auch beschrieben.

Wüsste ich auch erstmal nicht weiter. Würde glaube ich einfach mal ein anderes Relais zum Test nutzen. Muss ja dann stromseitig an irgendetwas liegen.

Ich bin gerade soweit genervt, dass ich den Code minimal mache.
LEDs sollen da sein, Solenoid und IR-Sensor auch.
Und dann mache ich es mit einer Automation in HomeAssistant.

Ich dachte ein paar LEDs leuchten lassen wäre recht einfach zu machen,
aber für einen Laien wie mich ist das schon zu hoch.

Dann läuft die Falle halt nicht autark sondern mein guter, „alter“ Home Assistant muss mit einer Automation herhalten.

1 „Gefällt mir“

Halb autark läuft sie ja trotzdem, nur halt die leider LEDs nicht.

Ja das stimmt. Gefangen wird sie, aber die LEDs wollen halt nicht.

Werde ich wohl oder übel Reißnägel reinkleben müssen als Signal statt der roten LED.
Dann höre ich die Maus wenigstens schreien und weiß wenn eine drinnensitzt :wink:

1 „Gefällt mir“

Hast du auch eine Freilaufdiode am Solenoid? Sonst stört evtl. die Induktionsspanunung den µC. Also kein Softwareproblem.

Nein, hatte ich nicht.

Nach einem längeren Geschreibsel mit Herrn GPT sind wir heute auch darauf gekommen,
dass solche Spitzen stören könnten und ich eine 1N5819 Schottky Diode einlöten muss.
Ein 100er Packerl ist schon bestellt und wird die Tage geliefert.

Danke trotzdem @stefan13 für deinen Hinweis.

Bin jetzt eh gewechselt von dem Kolbensole zu einem Elektromagneten.
Das funktioniert praktisch viel besser mit dem.