Większość napędów bram garażowych i wjazdowych ma już przycisk ścienny. Jedno naciśnięcie i brama rusza, kolejne i staje albo zawraca. Ten sam przycisk może za nas wciskać ESP32 z przekaźnikiem, a dwa kontaktrony powiedzą Home Assistantowi, czy brama naprawdę jest otwarta czy zamknięta. Części kosztują niewiele, całość działa lokalnie i nie trzeba zakładać konta w chmurze producenta napędu.

Podłączenie to najprostsza część. Trudniej z tym, że napęd ma jeden przycisk i nie wie, o co nam chodziło. To samo polecenie, które otwiera zamkniętą bramę, równie dobrze zamknie otwartą, a impuls przekaźnika w złym momencie po ponownym uruchomieniu płytki może ruszyć bramę, kiedy nikogo nie ma w pobliżu. Większość tekstu dotyczy tego, jak uniknąć obu sytuacji.

Sprawdź, czego oczekuje napęd

Opisany niżej prosty sposób zakłada napęd sterowany jednym przyciskiem, który po prostu zwiera styk. Zachowanie opisane w projekcie esphome-gdo jest typowe: gdy brama jest zamknięta, naciśnięcie ją otwiera; gdy jest otwarta albo uchylona, naciśnięcie ją zamyka; naciśnięcie w trakcie otwierania ją zatrzymuje, a w trakcie zamykania - otwiera. Konkretny napęd może działać inaczej, zwłaszcza gdy przycisk zostanie wciśnięty w połowie ruchu. Zanim cokolwiek zautomatyzujesz, obserwuj go przez kilka cykli, używając przycisku ściennego.

Nie każdy napęd przyjmie zwykłe zwarcie styku. Autor tego samego projektu zaznacza, że przy napędach Chamberlain z Security+ 2.0 przekaźnik musi wciskać fizyczny przycisk na panelu ściennym, a przy Security+ 1.0, Genie i podobnych wystarczy zewrzeć zaciski sterujące w samym napędzie. Do napędów Chamberlain i LiftMaster lepiej pasuje płytka ratgdo z oprogramowaniem ESPHome, która obsługuje protokoły Security+ 1.0 i 2.0 bezpośrednio, niż goły przekaźnik.

W instrukcji napędu poszukaj wejścia na przycisk. Wiele napędów ma opisaną parę zacisków do zewnętrznego przycisku albo stacyjki na klucz. Tam podłącza się styki przekaźnika, równolegle do istniejącego przycisku, który dalej działa jak wcześniej.

Części i podłączenie

Potrzebne będą:

  • płytka ESP32 obsługiwana przez ESPHome;
  • moduł przekaźnika albo płytka z przekaźnikiem, który pewnie przełącza się sygnałem 3,3 V z GPIO;
  • dwa kontaktrony z magnesami, jeden do położenia całkowicie zamkniętego i jeden do całkowicie otwartego;
  • zasilacz 5 V przy napędzie i trochę przewodu niskonapięciowego.

Styki przekaźnika normalnie otwarty (NO) i wspólny (COM) podłącz do zacisków przycisku w napędzie. To styki bezpotencjałowe, więc ESP32 nie ma żadnego wspólnego obwodu z wejściem sterującym napędu.

Każdy kontaktron ma dwa przewody. Jeden podłącz do pinu GPIO, drugi do GND. Przy włączonym wewnętrznym rezystorze podciągającym pin ma stan wysoki, gdy kontaktron jest rozwarty, i niski, gdy magnes go zwiera. Kontaktron przykręć do ościeżnicy albo prowadnicy, a magnes do bramy, tak żeby spotkały się dokładnie w położeniu krańcowym, które ma być wykrywane. Jeśli brama na końcu ruchu lekko przejeżdża albo odbija, przesuwaj kontaktron, aż styk pozostanie zwarty po zatrzymaniu bramy.

Starannie wybierz pin przekaźnika

W dokumentacji przełącznika GPIO w ESPHome jest ostrzeżenie, które warto przeczytać dwa razy: przy resecie, zanim ruszy jakikolwiek kod ESPHome, piny GPIO przekaźnika mogą mieć aktywne rezystory podciągające, więc przekaźnik może się załączyć, zanim ESPHome zdąży go wyłączyć. Przy oświetleniu oznacza to krótkie mignięcie. Przy bramie garażowej - naciśnięcie przycisku przy każdym ponownym uruchomieniu płytki albo wgraniu aktualizacji.

Dlatego nie podłączaj przekaźnika do pinów konfiguracyjnych rozruchu (Espressif wymienia w oryginalnym ESP32 GPIO0, 2, 5, 12 i 15) ani do pinów, które według dokumentacji płytki zmieniają stan przy starcie. Potem to sprawdź: przy odłączonym napędzie kilkanaście razy odetnij i przywróć zasilanie płytki oraz wgraj aktualizację przez sieć, patrząc na diodę przekaźnika. Jeśli choć raz kliknie podczas startu, zmień pin, zanim podłączysz napęd.

Konfiguracja ESPHome

Zacznij od konfiguracji, którą tworzy kreator w ESPHome Device Builder (Wi-Fi, logowanie, API z szyfrowaniem, OTA), i dodaj poniższe fragmenty. Piny to przykład dla klasycznej płytki deweloperskiej ESP32, a czasy ruchu są tylko wartościami wyjściowymi: zmierz stoperem, ile brama faktycznie jedzie od pełnego zamknięcia do pełnego otwarcia.

switch:
  - platform: gpio
    pin: GPIO25
    id: door_relay
    restore_mode: ALWAYS_OFF
    on_turn_on:
      - delay: 500ms
      - switch.turn_off: door_relay

binary_sensor:
  - platform: gpio
    id: door_closed
    name: "Garage door closed contact"
    pin:
      number: GPIO26
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
      - delayed_on_off: 200ms
  - platform: gpio
    id: door_open
    name: "Garage door open contact"
    pin:
      number: GPIO27
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
      - delayed_on_off: 200ms

cover:
  - platform: feedback
    name: "Garage door"
    device_class: garage
    has_built_in_endstop: true
    open_duration: 18s
    close_duration: 18s
    open_endstop: door_open
    close_endstop: door_closed
    open_action:
      - if:
          condition:
            binary_sensor.is_off: door_open
          then:
            - switch.turn_on: door_relay
    close_action:
      - if:
          condition:
            binary_sensor.is_off: door_closed
          then:
            - switch.turn_on: door_relay
    stop_action:
      - switch.turn_on: door_relay

Nazwy w cudzysłowach możesz zmienić na polskie, na przykład „Brama garażowa”. Co robią poszczególne części:

  • Przekaźnik działa jak przycisk chwilowy. Blok on_turn_on wyłącza go po 500 ms, tak samo jak w przykładzie z dokumentacji ESPHome dla pilota bramy z jednym przyciskiem. Przełącznik ma id, ale nie ma name, więc zostaje wewnętrzny i nie pojawia się w Home Assistancie. Nikt nie zostawi go włączonego z poziomu panelu. ALWAYS_OFF to domyślny tryb przywracania stanu, ale wpisany jawnie od razu pokazuje intencję.
  • Kontaktrony mają odwróconą logikę (inverted), więc zwarty styk (magnes w pobliżu) daje stan ON. Filtr delayed_on_off przepuszcza tylko stan utrzymany przez 200 ms, co ukrywa drgania styku, gdy brama dojeżdża na miejsce.
  • Komponent feedback (bramy ze sprzężeniem zwrotnym) łączy czujniki położeń krańcowych z pomiarem czasu. Między położeniami krańcowymi szacuje położenie bramy na podstawie tego, jak długo jest w ruchu.

Dlaczego has_built_in_endstop jest tu kluczowe

Bez tej opcji komponent feedback wykonuje stop_action, gdy brama dojedzie do położenia krańcowego albo skończy się czas ruchu. Przy osobnym poleceniu zatrzymania to poprawne działanie. Przy jednym przycisku stop_action jest kolejnym naciśnięciem, więc brama dojechałaby do końca i od razu ruszyła z powrotem. Z has_built_in_endstop: true ESPHome zostawia zatrzymanie samemu napędowi i na końcu ruchu niczego nie wciska.

Ta sama opcja ma skutek uboczny: według dokumentacji polecenia otwarcia i zamknięcia są wtedy wykonywane bez sprawdzania bieżącego stanu. Polecenie zamknięcia wysłane do zamkniętej już bramy wcisnęłoby przycisk i ją otworzyło. Własne przyciski Home Assistanta nie pokazują przycisku zamknięcia, gdy wiadomo, że brama jest zamknięta, ale automatyzacja czy polecenie głosowe tego nie sprawdzą. Bloki if w open_action i close_action dodają ten warunek w samym ESP32: jeśli odpowiedni kontaktron już zgłasza położenie krańcowe, nic się nie dzieje.

Ograniczenia sterowania jednym przyciskiem

Trzeba wiedzieć, co ta konfiguracja wie, a czego nie. W położeniach krańcowych jest wiarygodna, bo stan potwierdza kontaktron. Pomiędzy nimi zgaduje.

  • Zatrzymanie to też naciśnięcie przycisku. Jeśli brama już stoi w połowie, polecenie zatrzymania ją uruchomi.
  • Polecenia w trakcie ruchu zależą od napędu. Gdy brama się otwiera, a wyślesz polecenie zamknięcia, napęd może się zatrzymać, zawrócić albo je zignorować, a kierunek ruchu zapamiętany przez ESPHome może rozminąć się z rzeczywistością. Komponent feedback ma opcję direction_change_wait_time, która przed zmianą kierunku wstawia polecenie zatrzymania. Pasuje to do napędów, które przy kolejnym naciśnięciu stają, ale sprawdź to na swojej bramie.
  • Ktoś może użyć przycisku ściennego albo pilota. Kontaktrony wychwycą to, gdy brama dojedzie do końca. Jeśli zatrzyma się w połowie, stan pozostanie nieznany, dopóki znów nie osiągnie położenia krańcowego.

Jeśli potrzebujesz wiarygodnych położeń pośrednich przy jednym przycisku, zajrzyj do pakietu esphome-gdo, który odwzorowuje kolejność naciśnięć i potrafi obliczyć, ile razy trzeba wcisnąć przycisk, albo do zewnętrznego komponentu autorstwa juaigl, który działa podobnie. W większości garaży liczy się tylko „otwarta” i „zamknięta”, a do tego dwa kontaktrony wystarczą.

W Home Assistancie

ESP32 pojawi się w menu urządzeń i usług (Settings > Devices & services) jako urządzenie ESPHome. Dzięki device_class: garage Home Assistant używa ikon bramy garażowej, a w edytorze automatyzacji udostępnia wyzwalacze i warunki dla bram garażowych, na przykład otwarcie bramy (Garage door opened). Oba czujniki kontaktronowe przydają się też osobno, na przykład na wykresie historii albo jako dodatkowy sygnał w automatyzacji.

Na początek przyda się automatyzacja, która powiadomi, że brama została otwarta i nikt jej nie zamknął:

alias: "Brama garażowa otwarta"
triggers:
  - trigger: state
    entity_id: cover.garage_door
    to: "open"
    for: "00:15:00"
actions:
  - action: notify.mobile_app_your_phone
    data:
      message: "Brama garażowa jest otwarta od 15 minut."

Zamień cover.garage_door i akcję powiadomienia na własną encję i telefon. Automatyczne zamykanie bramy o określonej godzinie łatwo dopisać, ale najpierw zastanów się, kto albo co może się wtedy pod nią znaleźć.

Bezpieczeństwo

Urządzenie, które otwiera dom, to nie miejsce na skróty.

  • Zachowaj klucz szyfrowania API i hasło OTA wygenerowane przez kreator. Nie dodawaj komponentu web_server z ESPHome bez uwierzytelniania, bo każdy w tej samej sieci mógłby wcisnąć przycisk z przeglądarki.
  • Uważaj z asystentami głosowymi. Home Assistant wymaga jawnego udostępnienia encji dla Assista, Asystenta Google czy Alexy, a jego dokumentacja jako jeden z powodów podaje właśnie bramy garażowe. Nie udostępniaj bramy, jeśli naprawdę tego nie potrzebujesz.
  • Zamykanie na odległość bez widoku na bramę to ryzyko. Przekaźnik robi to samo co przycisk ścienny, więc zabezpieczenia napędu powinny działać tak jak przy zwykłym naciśnięciu, ale sprawdź je, zanim zaczniesz na nich polegać. Kamera skierowana na bramę przydaje się, gdy zamykasz ją z daleka.
  • Instalacja 230 V zostaje przy napędzie. Wszystko w tym projekcie działa na niskim napięciu. Jeśli wejście przycisku jest tylko obok zacisków sieciowych, najpierw odłącz zasilanie napędu albo poproś o to kogoś z uprawnieniami.

Testy, zanim zaczniesz na tym polegać

  1. Przy odłączonym od napędu przekaźniku kilka razy uruchom ponownie ESP32 i wgraj aktualizację przez sieć. Przekaźnik nie może kliknąć.
  2. Porusz bramę ręcznie albo przyciskiem ściennym i sprawdź w logach ESPHome, że oba kontaktrony zmieniają stan we właściwym momencie.
  3. Podłącz przekaźnik i z Home Assistanta otwórz i zamknij bramę z obu położeń krańcowych.
  4. Wyślij polecenie zamknięcia do zamkniętej już bramy (na przykład w narzędziach, Settings > Tools > Actions, akcją cover.close_cover). Nic nie powinno się wydarzyć.
  5. Przerwij ruch przyciskiem ściennym i zobacz, jaki stan pokazuje Home Assistant. Będziesz wiedzieć, jak w takiej sytuacji zachowują się napęd i konfiguracja ESPHome.