Hej @Jabol, @macek wydaje mi się, że znalazłem rozwiązanie problemu. Też chcę wykonać taką samą koncepcję w swoim domu
Przekaźnik EPN524 (lub EPN526 ale to tylko rózne napięcia sterowania) ma sterować światłem i ma być triggerowany przez włacznik dzwonkowy oraz dodatkowo z poziomu ESP/HA. ESP32 ma być “obok” i odczytywac stan z drugiego toru przekaźnika bistabilnego i na tej podstawie zwracać stan do HA. Wyłączenie HA/ESP nie może zakłócać / zmieniać stanu działania świateł.
W ESP u mnie to ma działać tak:
- gpio binary sensor odczyta stan z 2 toru przekaźnika (zarowkasensor)
- wirtualny przycisk (template) będzie znał stan na podstawie sensora i będzie go zmieniał na żądanie (zarowkaswitch)
- gpio output strzeli sygnał do przekaźnika (pośrednio strzelam do małego przekaźnika a ten dopiero hagera - przez różne napięcia) aby ten zmienił stan (symulacja przycisku dzwonkowego)
Straciłem kilka godzin na przeróżne koncepcje ale w końcu udało mi się osiągnąć cel (choć nie jest to rozwiązanie idealne którym należy się chwalić ale można się podzielić). Myślę, że da się to lepiej ograć ale dopiero zaczynam moją “przygodę”.
Problemem od strony ESP32 jest to, że w momencie bootowania uruchamia się event “turn_off_action” a ten wykonuje akcję i nie da się tego systemowo zmienić (ja nie potrafię…) więc trzeba to obejść. Utworzylem zmienną globalną (zarowkacounter) który jest w stanie okreścić, czy ten “event” został uruchomiony podczas bootowania czy podczas normalnej pracy. Trochę to jest druciarstwo ale nie znam innego rozwiązania. Może macie jakieś ciekawsze pomysly jak to obejść?
globals:
- id: zarowkacounter
type: int
restore_value: no
initial_value: '0'
binary_sensor:
- platform: gpio
name: "zarowkasensor"
id: zarowkasensor
pin:
inverted: true
number: GPIO21
mode:
input: true
pullup: true
switch:
- platform: template
id: zarowkaswitch
name: "zarowka switch"
lambda: |-
if (id(zarowkasensor).state) {
return true;
} else {
return false;
}
turn_on_action:
- lambda: ESP_LOGI("zarowkasensor", "-------------------turn_on_action, zarowka state -> %d, zarowkacounter -> %d", id(zarowkasensor).state, id(zarowkacounter));
- if:
condition:
lambda: 'return id(zarowkacounter) > 0;'
then:
- output.turn_on: zarowkaoutput
- delay: 500ms
- output.turn_off: zarowkaoutput
else:
- lambda: id(zarowkacounter) += 1; ESP_LOGI(""-------------------turn_on_action-boot-mode", "zarowkasensor -> %d", id(zarowkacounter));
# - switch.turn_off: button
turn_off_action:
- lambda: ESP_LOGI("zarowkasensor", "-------------------turn_off_action, zarowka state -> %d, zarowkacounter -> %d", id(zarowkasensor).state, id(zarowkacounter));
- if:
condition:
lambda: 'return id(zarowkacounter) > 0;'
then:
- output.turn_on: zarowkaoutput
- delay: 500ms
- output.turn_off: zarowkaoutput
else:
- lambda: id(zarowkacounter) += 1; ESP_LOGI(""-------------------turn_off_action-boot-mode", "zarowkasensor -> %d", id(zarowkacounter));
output:
- platform: gpio
id: zarowkaoutput
pin: GPIO02
W moim przypadku, za kazdym razem po resecie ESP wykonywany jest event:
[I][zarowkasensor:125]: -------------------turn_off_action, zarowka state -> 1, zarowkacounter -> 0
Dodałem sobie też logowanie na event “boot” i co ciekawe ten jest on ostatni a nie pierwszy co mnie dość dziwi… (normalnie bym zakładał, że pierw idzie event boot a potem eventy przycisków itp…):
[I][zarowkasensor:125]: -------------------turn_off_action, zarowka state -> 1, zarowkacounter -> 0
[I][turn_off_action-boot-mode:134]: zarowkasensor -> 1
[I][zarowkasensor:016]: ONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOT-zarowkacounter-> 1
logowanie:
on_boot:
then:
- lambda: ESP_LOGI("zarowkasensor", "ONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOTONBOOT-zarowkacounter-> %d", id(zarowkacounter));