ESPHome + przekaźniki bistabilne

Cześć posiadam instalacje w domu w oparciu o przekaźniki bistabilne HAGER EPN524.

Dotychczas działałem w oparciu o arduino + skrypt na nim zawarty.

Postanowiłem zmienic sprzęt i padło na płykę z ESP32.

Tym razem postanowiłem wszystko zakodować z użyciem ESPHome.

Niby znalazłem odpowiednie materiały wszystko zakodowałem… no ALE

Okazuje się że przy uruchamianiu płytki następuje chwilowe załączenie wszystkich wyjść i po chwili ich wyłączenie.

Po usunięciu z kodu

turn_off_action:
- switch.turn_on: OUT_01
- delay: 50ms
- switch.turn_off: OUT_01

problem nie występuje, ale również nie można wyłączyć przekaźników.

Ktoś ma jakiś pomysł gdzie jest problem?

@Jabol A co jest podłączne do wejścia IN_01? Przycisk dzwonkowy?

2 tor przekaźnika bistabilnego. Przekaźniki bistabilnego są sterowane bezpośrednio przez przyciski na ścianach, a drugi tor przekaźnika bistabilnego pozwala na odczyt stanu tego przekaźnika

:thinking: przyciski są bezpośrednio podłączone do obwodu zasilającego cewkę przekaźników (do A1-A2)?

Dokładnie tak, i właśnie płytka z esp32 za pomocą wyjść też może je włączyć i wyłączyć bo jest równolegle podłączone pod cewkę. Natomiast wejścia odczytują stan.

@Jabol czyli to taka hybryda, sterownik “doklejony” do istniejącej instalacji elektrycznej, w tej sytuacji nie ma pomysły jak to zrobić w ESPHome. Kiedyś miałem taki sam pomysł na smart home jak Ty ale ostatecznie zrezygnowałem z takiej koncepcji bo to ogranicza możliwości w sterowania. U siebie zrobiłem prosto: przyciski dzwonkowe podłączone do wejść sterownika z ESP, przekaźniki podłączone do wyjść sterownika, akcje na nacisnięcie przycisków powodują odpowiednie akcje na przekaźnikach.

Hej @Jabol, @macek wydaje mi się, że znalazłem rozwiązanie problemu. Też chcę wykonać taką samą koncepcję w swoim domu :slight_smile:

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