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