Brama Przesuwna + ESPHome lub Tasmota + NodeMCU ESP8266

Zabranie 24V z zacisków 40/41 przy stanie “Zamknięta” to nawet zaleta, bo można to wykorzystać do statusu bramy. Zasilanie shelly z 230V prawie niczego nie zmienia, robocze styki przekaźnika I ,0, są odseparowane od 230V , więc spokojnie można je podłączyć pod zaciski IMPULS. Status bramy jak już wspomniałem, cewka przekaźnika 24V do 40/41 , styki robocze muszą podawać / zabierać fazę 230V, na zacisk SW. Cała konfiguracja jak odseparowanie SW od przekaźnika , timer itd, identycznie jak przy zasilaniu niskim napięciem

1 Like

To byłoby super, mógłbym w końcu “wyrzucić” Aqara door & window contact sensor. Zrozumiałem, że mogłoby to być coś w ten deseń?

Schemat obrazkowy jest jak najbardziej OK . Pamiętaj tylko odseparować SW od przekaźnika. Albo wgraj ESPhome i skonfigurujesz jak chcesz :slight_smile: Powodzenia

Jutro przyjdą paczki więc pewnie już wkrótce się za to zabiorę. Mam pytanie czy stan SW jest domyślnie włączony w shelly czy też trzeba go włączyć i czy to jest ten parametr ?

Domyślnie SW ustawiony jest na przełączanie (Toggle switch) , więc trzeba go ustawić jak w tym linku Shelly1 configured as detached edge switch - #3 by jackeroo_marc - Configuration - Home Assistant Community

Tak wiem, czytałem co napisałeś, powinien być “Detached” + timer. Źle zadałem pytanie. Chciałem zapytać jak odczytać stan bramy. Po podłączeniu jak na moim “obrazku” działa otwórz/stop/zamknij (encja → switch.shelly1_123456789aaa, natomiast nie widzę nic oprócz domyślnie wyłączonej encji w HA (binary_sensor.shelly1_123456789aaa_input), która się nie zmienia gdy brama się otwiera, stąd moje pytanie. Jeśli ta encja powinna podawać stan bramy to sprawdzę za widoku czy w momencie otwierania napięcie sterowania jest podawane na cewkę i czy faza pojawia się na SW.

Ok teraz wiem co miałeś na myśli, encja input ( domyślnie wyłączona), wykryta jako Sensory. Po włączeniu w HA i zmianie klasy urządzenia, powinna reagować na podanie fazy na SW.


W aplikacji shelly , powinna też reagować ikona przełącznika , a konkretnie zaznaczona część na pomarańczowo , zmienia kolor na niebieski po podaniu fazy na SW.

O Panowie, widzę tu dobre rozkminy.
Chcę również swoja bramę wjazdową zrobić smart (Came BXV), a ze mam w szufladzie moduł HW-622 (Introducing: The Relay Module HW-622 - ayatec.eu)
tu schemat:

to dopiąłem do niego drugi PC817 , wywaliłem diodę D5 z płytki przed oryginalnym modułem PC817, dolutowałem się do GPIO12, 13 i 14 i teraz czytam stany kiedy brama jest otwarta, zamknięta, kiedy się otwiera(ruch) i kiedy zamyka(ruch).
Jako, że mam przełącznik schodowy podpięty do automatu w garażu, aby bramę ręcznie otworzyć, brama działa w trybie open-stop-close i nie chciałbym zmieniać na 3-przyskowe fizyczne sterowanie bo i pilot dwuprzysiskowy ogarnia mi i bramę garażową i wjazdową.
Kto pomoże z kodem EPShome aby zrobić total smart? :slight_smile:
chodzi o to, że czasem wracając do domu, brama jest w pół otwarta, klikam skrót na fonie i brama się zamyka zamiast otworzyć.
Chciałbym aby to działało na tyle inteligentnie, aby mieć przycisk otwórz i zamknij, by działały w zależności jaki jest stan bramy, czyli jeżeli była otwierana i zatrzymana w połowie, to jak kliknę otwórz, to aby faktycznie HW622 zwarł styki 3 razy - pierwszy zamyka, drugi stopuje a trzeci otwiera zgodnie z wybranym przyciskiem.
niestety mimo pomocy AI nie jestem w stanie tego dobrze ogarnąć.

Drugi problem, to taki, że stany na binary-sensor “migotają”, podpiąłem sie przez rezystory 560ohm do końcówek kontraktona i dałem

    filters:
      - delayed_on: 150ms
      - delayed_off: 150ms

Nawet pomogło, ale przy czytaniu is_gate_opening/is_gate_closing (podpięte przez 10kohm, oryginalnie na płytce HW622) binary-sensor robi dyskotekę gdy brama dojeżdża do krańców.
@isom1266 może Ty pomożesz, bo przy sterowniku nawadniania od razy rozkminiłeś problem :slight_smile:

Mój aktualny kod:

globals:
  - id: last_gate_direction
    type: std::string
    restore_value: no
    initial_value: '"stopped"'

binary_sensor:
  - platform: gpio
    id: is_gate_opening
    name: is_gate_opening
    pin:
      number: GPIO5
      mode:
        input: true
        pullup: true
      inverted: true
    on_press:
      then:
        - lambda: 'id(last_gate_direction) = "opening";'

  - platform: gpio
    id: is_gate_closing
    name: is_gate_closing
    pin:
      number: GPIO14
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
      - delayed_on: 150ms
      - delayed_off: 150ms
    on_press:
      then:
        - lambda: 'id(last_gate_direction) = "closing";'

  - platform: gpio
    id: is_gate_open
    name: is_gate_open
    pin:
      number: GPIO13
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
      - delayed_on: 150ms
      - delayed_off: 150ms
  - platform: gpio
    id: is_gate_closed
    name: is_gate_closed
    pin:
      number: GPIO12
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
      - delayed_on: 150ms
      - delayed_off: 150ms
cover:
  - platform: template
    device_class: gate
    name: "ParkingGate"
    id: parking_gate
        
    lambda: |-
      if (id(is_gate_open).state) {
        return COVER_OPEN;
      } else if (id(is_gate_closed).state) {
        return COVER_CLOSED;
      } else {
        return COVER_OPEN;  // lub CLOSED - wg preferencji
      }

    open_action:
      then:
        - if:
            condition:
              binary_sensor.is_on: is_gate_closed
            then:
              - logger.log: "Brama zamknięta – otwieram"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
        - if:
            condition:
              binary_sensor.is_on: is_gate_closing
            then:
              - logger.log: "Brama się zamyka – zatrzymuję i otwieram"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
              - delay: 400ms
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
        - if:
            condition:
              and:
                - binary_sensor.is_off: is_gate_opening
                - binary_sensor.is_off: is_gate_closing
                - lambda: 'return id(last_gate_direction) == "closing";'
            then:
              - logger.log: "Brama zatrzymana podczas zamykania – otwieram"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

    close_action:
      then:
        - if:
            condition:
              binary_sensor.is_on: is_gate_open
            then:
              - logger.log: "Brama otwarta – zamykam"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
        - if:
            condition:
              binary_sensor.is_on: is_gate_opening
            then:
              - logger.log: "Brama się otwiera – zatrzymuję i zamykam"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
              - delay: 400ms
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
        - if:
            condition:
              and:
                - binary_sensor.is_off: is_gate_opening
                - binary_sensor.is_off: is_gate_closing
                - lambda: 'return id(last_gate_direction) == "opening";'
            then:
              - logger.log: "Brama zatrzymana podczas otwierania – zamykam"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

    stop_action:
      then:
        - if:
            condition:
              or:
                - binary_sensor.is_on: is_gate_opening
                - binary_sensor.is_on: is_gate_closing
            then:
              - logger.log: "Zatrzymuję bramę"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
              - lambda: 'id(last_gate_direction) = "stopped";'
            else:
              - logger.log: "Brama nie jest w ruchu – pomijam STOP"


button:
  - platform: template
    name: "Brama Otwórz"
    icon: mdi:gate-open
    on_press:
      then:
        - cover.open: parking_gate

  - platform: template
    name: "Brama Zamknij"
    icon: mdi:gate
    on_press:
      then:
        - cover.close: parking_gate

  - platform: template
    name: "Brama Zatrzymaj"
    icon: mdi:stop
    on_press:
      then:
        - cover.stop: parking_gate

Aktualnie brama działa tak, że działa otwórz i zamknij gdy jest w skrajnych pozycjach. Gdy się otwiera, działa również przycisk zamknij oraz zatrzymaj. Gdy otwiera się i kliknę zatrzymaj to już brak reakcji na otwórz/zamknij/zatrzymaj. Dopiero “Gate control toggle” czyli “surowe” zwarcie styków zamyka/otwiera gdy była wcześniej w ruchu zatrzymana.

OFF TOPIC (bo dołożyłeś własne PC817 to chyba nie ma sensu zostawiania zabezpieczenia na jednym)

D5 to transil mający zapobiec spaleniu PC817, jeśli masz problemy z niezgodnością poziomów logiki (za wysokim napięciem na kontaktronie czy tam przycisku) należało dobrać rezystor i ewentualnie użyć diodę impulsową szeregowo z wejściem


na te kontaktrony idzie jakieś napięcie z fabrycznego sterownika bramy? czy to tylko dokładka dla samego ESP (warto wiedzieć dlaczego akurat 560R)

bazowałem na tym schemacie:


z tego projektu: Introducing CHAI - a CAME gate controller to Home Assistant Interface - Vince's thoughts
PC817 są tak samo połączone jak na powyższym schemacie, dałem jeszcze rezystro przed drugim PC817 wiec są dwa, jeden oryginalny (10k- pomierzone, mimo ze na schemacie jest 4,7k) na HW622, a drugi dołożony. GND_EXT używam właśnie jako N_Pole.
Dałem większe filtry w kodzie (400ms) i już nie ma dyskoteki. teraz tylko kod do poprawy związany z odczytaniem stanów i poprawnym sterowaniem.

Ok! rozkminilismy z Gemini kod, trochę musiałem mu pomóc bo miał problem z krokowym sterowaniem, ale działa, poniżej wrzucam kod.
Teraz pytanie- jak ogarnąć aby ikonka:
Zrzut ekranu_10-6-2025_133558_192.168.1.166

otwierania byla aktywna podczas ruchu? aktualnie staje sie nieaktywna jak otwieram bramę i po “stop” pozostaje nieaktywna. moge tylko zamknąć a nie mogę otworzyć do końca.

cover:
  - platform: template
    device_class: gate
    name: "ParkingGate"
    id: parking_gate

    lambda: |-
      if (id(is_gate_open).state) {
        return COVER_OPEN;
      } else if (id(is_gate_closed).state) {
        return COVER_CLOSED;
      } else {
        return COVER_OPEN;
      }

    open_action:
      then:
        # 1. Otwieranie, gdy brama jest całkowicie ZAMKNIĘTA
        - if:
            condition:
              binary_sensor.is_on: is_gate_closed
            then:
              - logger.log: "Brama zamknięta – otwieram"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

        # 2. Odwrócenie kierunku, gdy brama się ZAMYKA
        - if:
            condition:
              binary_sensor.is_on: is_gate_closing
            then:
              - logger.log: "Brama się zamyka – zatrzymuję i otwieram"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
              - delay: 400ms
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

        # 3. Obsługa ZATRZYMANEJ bramy w położeniu pośrednim
        - if:
            condition:
              and:
                - binary_sensor.is_off: is_gate_opening
                - binary_sensor.is_off: is_gate_closing
                - binary_sensor.is_off: is_gate_open
                - binary_sensor.is_off: is_gate_closed
            then:
              # Brama stoi. Sprawdzamy, co robiła ostatnio.
              - if:
                  condition:
                    lambda: 'return id(last_gate_direction) == "opening";'
                  then:
                    # Ostatnio się otwierała, więc WZNAWIAMY otwieranie
                    - logger.log: "Brama zatrzymana podczas otwierania – wznawiam otwieranie"
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
                    - delay: 400ms
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
                    - delay: 400ms
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
              - if:
                  condition:
                    lambda: 'return id(last_gate_direction) == "closing";'
                  then:
                    # Ostatnio się zamykała, więc ODWRACAMY kierunek i otwieramy
                    - logger.log: "Brama zatrzymana podczas zamykania – otwieram"
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle

    close_action:
      then:
        # 1. Zamykanie, gdy brama jest całkowicie OTWARTA
        - if:
            condition:
              binary_sensor.is_on: is_gate_open
            then:
              - logger.log: "Brama otwarta – zamykam"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

        # 2. Odwrócenie kierunku, gdy brama się OTWIERA
        - if:
            condition:
              binary_sensor.is_on: is_gate_opening
            then:
              - logger.log: "Brama się otwiera – zatrzymuję i zamykam"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
              - delay: 400ms
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle

        # 3. Obsługa ZATRZYMANEJ bramy w położeniu pośrednim
        - if:
            condition:
              and:
                - binary_sensor.is_off: is_gate_opening
                - binary_sensor.is_off: is_gate_closing
                - binary_sensor.is_off: is_gate_open
                - binary_sensor.is_off: is_gate_closed
            then:
              # Brama stoi. Sprawdzamy, co robiła ostatnio.
              - if:
                  condition:
                    lambda: 'return id(last_gate_direction) == "closing";'
                  then:
                    # Ostatnio się zamykała, więc WZNAWIAMY zamykanie
                    - logger.log: "Brama zatrzymana podczas zamykania – wznawiam zamykanie"
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
                    - delay: 400ms
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
                    - delay: 400ms
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle
              - if:
                  condition:
                    lambda: 'return id(last_gate_direction) == "opening";'
                  then:
                    # Ostatnio się otwierała, więc ODWRACAMY kierunek i zamykamy
                    - logger.log: "Brama zatrzymana podczas otwierania – zamykam"
                    - output.turn_on: gate_control_toggle
                    - delay: 100ms
                    - output.turn_off: gate_control_toggle

    stop_action:
      then:
        # Ta sekcja jest już poprawna - zatrzymuje bramę tylko gdy jest w ruchu
        # i co najważniejsze, nie kasuje `last_gate_direction`
        - if:
            condition:
              or:
                - binary_sensor.is_on: is_gate_opening
                - binary_sensor.is_on: is_gate_closing
            then:
              - logger.log: "Zatrzymuję bramę"
              - output.turn_on: gate_control_toggle
              - delay: 100ms
              - output.turn_off: gate_control_toggle
            else:
              - logger.log: "Brama nie jest w ruchu – pomijam STOP"

Edit:
Ok, mam :slight_smile:

cover:
  - platform: feedback
1 Like

kolejny OT

Ta wartość nie jest krytyczna - dobiera się ją do napięcia, dla zachowania 2 warunków

  1. by nie przekroczyć dopuszczalnego prądu przewodzenia diody IR (ten wcześniej wspomniany transil ma zabezpieczać właśnie przed ewentualnymi przepięciami - wartość rezystora jest dobrana dla napięć rzędu 3V-5V, jeśli masz tam inne przyjmij spadek na diodzie rzędu 1.5V i przelicz)
  2. tak by prąd LED IR był w zakresie wysterowania fototranzystora (dlatego wartość rezystancji nie może być dowolnie duża)

generalnie transoptory mają dość duże rozrzuty parametrów, więc wykonania pojedyncze i podwójne są selekcjonowane do kilku grup w/g wzmocnienia (więc projektując “bardziej po papiesku” ten rezystor dobiera się oprócz napięcia jeszcze do grupy wzmocnienia by uzyskać najbardziej pożądane parametry przejściowe - mimo zasadniczo zastosowania binarnego transoptor działa analogowo i nawet w pewnym zakresie można go używać do przesyłania sygnału analogowego).

Rezystory R5 i R6 służą tutaj do tłumienia zakłóceń na liniach sygnałowych (oprócz tego są bez funkcji, bo wykorzystany jest słaby pullup wbudowany w MCU), zbyt duża wartość rezystancji będzie przeszkadzała w poprawnym wykrywaniu zwarcia. Odporność na zakłócenia można też zwiększyć stosując mocniejszy fizyczny pullup zamiast wbudowanego w MCU.

Jeśli przyciski/kontaktrony są podłączone do jeszcze jakiegoś innego układu należy sprawdzić rzeczywiste napięcia na nich występujące.

Autor artykułu pomierzył istotne miejsca, i u niego
na przyciskach sterujących jest

A few measurements indicate that the controller has pull-ups of 4.7KOhm to 5V on each contact,

a na złączu silnika (z którego są zasilane LEDy w transoptorach!)

The measured DC voltage across terminals M/N is:

30V when opening at full speed
15V when opening at half-speed (approaching fully open)
0V when the gate is not moving
-15V when closing at half-speed (approaching fully closed)
-30V when closing at full speed

więc tu musisz zmierzyć u siebie i dobrać takie wartości by nie puścić z dymem diod w transoptorach (no chyba, że masz identyczny sterownik to załóżmy, że są to takie same napięcia i gość przeliczył rezystory)

Tu jest też taka kwestia, że przeciwsobne połączenie transoptorów zabezpiecza im nawzajem diody LED IR przed przebiciem wstecznym (jeśli nie łączysz ich identycznie, to wejście każdego musi być zabezpieczone minimum diodą impulsową wstawioną w kierunku przeciwsobnym do diody IR, czyli tutaj w kierunku zaporowym; uwaga - diody impulsowe są zbędne i niepożądane jeśli transoptory mają wejścia połączone równolegle przeciwsobnie).
Tak w kwestii rezystora 1.5k to dla 30V można przyjąć, że prąd przewodzenia LED w transoptorach będzie koło 20mA (Everlight EL817 czyli takie mniej więcej bliźniaki twoich wytrzymują do 60mA, więc 20mA jest dla nich OK)

1 Like

Ja swego czasu zrobiłem sterownik do bramy garażowej wykorzystujący ESP32-C3 Super Mini. Można go zintegrować z zewnętrznym przyciskiem oraz odbiornikiem pilotów (np. takim: https://allegro.pl/oferta/radiowy-sterownik-do-bram-inel-ors-x1t-10559594952). Projekt wykorzystuje miernik prądu do wykrycia pełnego otwarcia/zamknięcia bramy.

Schemat, projekt PCB i kod ESPHome można znaleźć tu: GitHub - macdems/Garage

Jeśli ktoś jest zainteresowany, chętnie podam więcej szczegółów (np. kompletny BOM).

2 Likes

Straszne dzięki za garść, a może i dwie, pełnych informacji. Całe szczęście mam ten sam automat Came, stad bazowałem właśnie na tym schemacie. możliwe ze dyskotekę na odczytach binary_sensor miałem przez to, że przewód między esp a automatem ma jakies 10m długości w dodatku jest to przewód ziemny 10 żyłowy. Dyskotekę ogarnąłem filtrem w kodzie, czy poprawnie prądowo - nie wiem, za cienki jestem. Ale działa :slight_smile:

Możliwe, mógłbyś ewentualnie dołożyć rezystory pullup.
Jeśli ten przewód to skrętka, to można każdy przewód sygnałowy puścić jako parą z masą (jeśli masz tam dość żył), ale skoro filtr załatwił sprawę, to nie wiem czy jest o co walczyć (szczególnie, że przyczyna może być inna).