ESPHome & HA & Brama & Sygnalizacja otwartości

Witam szanowne grono.
Męczę obecnie swoją bramę, którą na 90% mam ogarnięte sprzętowo. Programowo - zaczynam i mam pełno protez.
Obecnie sprawa wygląda tak:

  1. Centrala Nice MC424.
  2. Do niej idzie kabel, który, z jednej strony służy do sterowania bramą w trybie krok po kroku, z drugiej - odbieram sygnał o stanie bramy w ten sposób:
  3. Brama jest zamknięta - stan 0. Brama jest otwarta (niezależnie od postępu otwarcia) - stan 1. W trakcie ruchu sygnał jest pulsujący, z czego gdy pulsuje wolno, to brama się otwiera, a gdy pulsuje szybko, to brama się zamyka.
  4. Skoro to proteza, to mam jeszcze ze starych czasów, przycisk dzwonkowy, który wysyła do bramy sygnał do sterowania w trybie krok po kroku, ale wysyła sygnał z pominięciem HA, czyli może dojść do sytuacji, że ktoś otworzy bramę za pomocą tego przycisku, lub z pilota od bramy i HA o tym nie wie.

Pierwsze zadanie jakie sobie postawiłem, to sprawdzać czas trwania stanu wysokiego gdy brama jest otwarta. Zupełnie nie mam pojęcia jak do tego podejść. Chciałbym zrobić tak, że gdy brama jest otwarta przez X minut, to wyślij wiadomość z pytaniem, czy zamknąć bramę.
Zadanie nr 2:
Wykorzystując jeden przycisk dzwonkowy oraz sygnał zwrotny - mieć pełną informację czy brama się otwiera, zamyka, jest otwarta lub zamknięta. Oczywiście w tym momencie sygnał z przycisku od protezy będzie wysyłał sygnał do ESPHome, a nie bezpośrednio do centrali bramy.
Mam nadzieję, że nie zamieszałem za bardzo i będziecie mieli siły i chęci na tą batalię.

Mam chyba ten sam model i chciałem to samo osiągnąć do Supli.

Przekaźnik do OGI i Twojego odbiornika że względu na pulsowanie lampki i/lub mały pobór przez sbw-01 którego użyłem do Supli . Monter próbował innych akrobacji i stanęło na najbardziej oczywistym i stabilnym rozwiązaniu.

U mnie to pozwala widzieć stan w Supli jak otworze z Supli, domofonu czy pilota

Czytam teraz i widzę, że jasno nie określiłem się, co do sprzętu. Finalnie szykuję dedykowaną PCB z ESP32 i ekspanderami która ma “chodzić” na ESPHome.

Wydaje mi się, że to wiele nie zmienia, wyciągniecie informacji ze sterownika bramy i tak nie jest proste. Wg. mnie to żeby widzieć stan Zamknięte lub Otwarte, można właśnie użyć przekaźnika, którego potem podpinasz do ESP32, oszczędzi Ci to analizowania sygnałów z bramy. Nie rozwiąże to natomiast bezpośrednio problemu “Otwiera”/“Zamyka” , to można rozwiązać na dwa sposoby: softwarowo na postawie poprzedniego stanu, hardware’owo dodając dodatkowe kontaktrony, z których można wnioskować co robi brama.

@osromocon
Zacznij od tego

Tak. To było na mojej road map, ale przed ukończeniem tej drogi, chciałem mieć jak najszybciej powiadomienie o otwartej bramie przez jakiś czas. Kończę to ogarynać przez “zwykłą” automatyzację i badanie czasu od zmiany stanu czujnika z off na on.
Do puls width chyba muszę zmienić hardware bo obecnie wyjściowe nogi transoptora mam podłączone bezpośrednio między pin a masę, a następnie pin podciągnięty przez input_pullup. Z tego co wyczytałem, to puls width bada długość czasu stanu wysokiego, ja mam natomiast cały czas stan wysoki. Poprawcie mnie, jeśli błądzę.

To mierzy długość impulsu, jak sam napisałeś nie masz zawsze “jedynki”, musisz poeksperymentować (najpierw zebrać dane, a potem ogarnąć ich obróbkę, pewnie będzie potrzeba popracować nad parametrami, aby taki sensor działał optymalnie, bo chcesz wykryć 4 różne wartości, a właściwie 4 ich przedziały), jest szansa wykryć zarówno otwieranie zamykanie jak i stan w ten sposób (teoretyzuję, nie używam tego, ale widziałem kiedyś projekt… wiatromierza na tej bazie, chociaż akurat wiatromierz można ogarnąć zupełnie inaczej) - dlatego sugeruję to na początek, a nie jako gotowe i kompletne rozwiązanie.

hint: potrzeba wiedzy ile trwa przeciętnie otwieranie i zamykanie, update_interval moim zdaniem powinien nie być większy niż 1/4 tego czasu, musi być też przynajmniej odpowiednio większy od szerokości impulsu przy wolnym pulsowaniu (to taka wstępna interpolacja parametrów)

PS Być może da się uzyskać informacje ze sterownika bramy (wpinając się bezpośrednio w niego), ale nie zamieściłeś żadnej jego dokumentacji technicznej, a nie chciało mi się szukać…

Dobra. Wracam do tematu włączając pulse_width (wczoraj chciałem bez tego ale udało mi się ogarnąć samemu i mam niedosyt).
Pierwszy problem jest taki (i tu: STOP), że kompilator nie pozwala mi użyć dwa razy tego samego pinu. Część kodu odpowiedzialna za sensory:

  - platform: gpio
    id: gate_sensor
    name: "Czujnik otwarcia bramy"
    pin:
      number: D6
      mode:
        input: true
        pullup: True
      inverted: false
    filters:
      - delayed_on: 100ms

    on_press:
      then:
      - cover.template.publish:
          id: main_gate
          position: 1
    on_release:
      then:
        - cover.template.publish:
            id: main_gate
            position: 0

sensor:
  - platform: pulse_width
    pin: D6
    name: Pulse Width Sensor

a poniżej komunikat z ESPHome:


binary_sensor.gpio: [source plot-swiatlo.yaml:68]

  Pin 12 is used in multiple places.
  platform: gpio
  id: gate_sensor
  name: Czujnik otwarcia bramy
  pin:
    number: 12
    mode:
      input: True
      pullup: True
      output: False
      open_drain: False
      pulldown: False
      analog: False
    inverted: False
  filters:
    - delayed_on: 100ms
  on_press:
    - then:
        - cover.template.publish:
            id: main_gate
            position: 1.0
  on_release:
    - then:
        - cover.template.publish:
            id: main_gate
            position: 0.0
  disabled_by_default: False
sensor.pulse_width: [source plot-swiatlo.yaml:143]

  Pin 12 is used in multiple places.
  platform: pulse_width
  pin:
    number: 12
    mode:
      input: True
      output: False
      open_drain: False
      pullup: False
      pulldown: False
      analog: False
    inverted: False
  name: Pulse Width Sensor
  disabled_by_default: False
  force_update: False
  unit_of_measurement: s
  icon: mdi:timer-outline
  accuracy_decimals: 3
  state_class: measurement
  update_interval: 60s

Coś mi się obiło o oczy, że szansa jest w lambadach, ale czy również w tym przypadku?

Była przełomowa zmiana w grudniowym wydaniu:

image

To by się zgadzało, bo dla innej “automatyzacji” (mniej niezbędnej) też nie chciał przepuścić przy update jakiś czas temu, ale wówczas za bardzo mnie to nie bolało i nie szukałem przyczyny.
Kompilacja poszła z sukcesem.
To za tą pomoc - póki co - dziękuję, ale już ciśnie mi się kolejna prośba o podpowiedź - co dalej? Próbować przypisać, to, co wyłowię do kolejnych stanów? Jako tako wiem już jak przypisać do stanów OPEN lub CLOSED. Ale stanów “CLOSING” lub “OPENING” chyba w ESPHome nie ma. Czy coś kręcę?
[EDIT]
Dobra. Już jest kolejne pytanie.
Odnoszę wrażenie, że ESPHome “raportuje” długość trwania impulsu po zakończeniu “migania”. W trakcie migania - milczy. Na dodatek, nie zawsze reaguje. Przy (po) otwarciu zameldował długość impulsu ca. 400ms. Po Zamknięciu, nie zmienił się [edit] zmienił chwilę po tym jak zacząłem edytować posta. Czy ta bezwładność nie dyskwalifikuje rozwiązania.
P.S. Filtr mam teraz ustawiony na 30ms.
[EDIT]
Mam trop: update_interval.

Ja mam to tak zrobione u siebie na płytce jak poniżej:
image

Załączam grafikę aby łatwiej zrozumieć poniższy kod dla ESPHome:

GPIO12 - kontaktron brama - dla pozycji zamknięta. Przyjąłem, że jak nie jest zamknięta, to jest otwarta (logiczne :upside_down_face:).
GPIO13 - fotoIR - bariera IR w świetle bramy
GPIO4 - przekaźnik do sterowania stykiem OPEN/STOP/CLOSED/ w napędzie bramy
GPIO5 - przekaźnik do sterowania stykiem “fotokomórka” w napędzie bramy

Reszta chyba nie wymaga tłumaczenia…

substitutions:
  device_name: "esp12frelayx2"
  device_name_lower: "brama_foto"

esphome:
  name: ${device_name_lower}

esp8266:
  board: esp12e

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${device_name}
    password: "haslo"

captive_portal:

web_server:
  port: 80

time:
  - platform: homeassistant
    id: homeassistant_time

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO12
      mode: INPUT_PULLUP
      inverted: false
    name: "kontaktron brama"
    id: contact_sensor
    device_class: garage_door
  - platform: gpio
    pin:
      number: GPIO13
      mode: INPUT_PULLUP
      inverted: false
    name: "fotoIR"
    id: fotoIR_sensor
    device_class: safety
    on_press:
      then:
        - switch.turn_on: foto
    on_release:
      then:
        - switch.turn_off: foto

status_led:
  pin:
    number: GPIO2
    inverted: True

switch:
  - platform: gpio
    pin: GPIO4
    name: "Garage Door Relay"
    id: relay
    internal: true
  - platform: gpio
    pin: GPIO5
    name: "Garage Door foto"
    id: foto
    internal: true
cover:
  - platform: template
    device_class: garage
    name: "Garaż"
    id: template_cov
    lambda: |-
      if (id(contact_sensor).state) {
        return COVER_OPEN;
      } else {
        return COVER_CLOSED;
      }
    open_action:
      - switch.turn_on: relay
      - delay: 0.3s
      - switch.turn_off: relay
#    stop_action:
#      - switch.turn_on: relay
#      - delay: 0.3s
#      - switch.turn_off: relay
    close_action:
      - switch.turn_on: relay
      - delay: 0.3s
      - switch.turn_off: relay

button:
  - platform: restart
    name: "${device_name} Restart"
    device_class: "restart"

sensor:
  - platform: uptime
    name: "${device_name} Last Restart"
    update_interval: 300s
    device_class: "timestamp"
    entity_category: "diagnostic"
    unit_of_measurement: ""
    filters:
      - lambda: |-
          auto time = id(homeassistant_time).now();
          if (time.is_valid()) {
            return time.timestamp - x;
          } else {
            return {};
          }
  - platform: wifi_signal
    name: "${device_name} WiFi Signal"
    update_interval: 300s
    device_class: "signal_strength"
    entity_category: "diagnostic"

Rozumiem, że tą płytką sterujesz centralą bramy? Jeśli tak, to czy Twoja centrala działa sekwencyjnie, tj. otwórz/stop/zamknij/stop, czy masz osobny przekaźnik, który tylko otwiera i osobny, który tylko zamyka?
[EDIT]
Już wiem. Sory za lamerskie pytanie :wink:

Tak dokładnie mam tak ustawione działanie - sekwencyjnie. Czyli z przyciskiem na ścianie jest podłączony równolegle styk NO z jednego z przekaźników na tej płytce z ESP. Drugi przekaźnik odpowiada za przełożenie stanu bariery IR do odpowiedniego styku w napędzie bramy. Dzięki temu mam funkcjonalność bariery jako ochrony przed zamykaniem gdy autem wjadę za płytko do garażu lub jest jakaś przeszkoda w linii detekcji. Dodatkowo ta informacja jest dostępna w ESPHome i tym samym w HA, dzięki temu dorobiłem sobie też sygnalizator optyczny. Za jego pomocą wiem, że minąłem barierę, nie muszę wjeżdżać głębiej i nie ryzykuję obtarcia zderzaka przy zamykaniu bramy.
Opisałem wszystko na innym forum:

Mi wystarcza kawałek taśmy LED, przy wjeździe tyłem do garażu (świeci gdy bariera IR jest naruszona).


A dla mojej Pani popełniłem ten projekt działający perfekcyjnie (czujnik laserowy):

Wideo z pierwszych prób, pełna konfigurowalność obszarów i efektów taśmy.

Ha… klika lat już użytkuję bramę i tego nie zauważyłem :slight_smile:
Rzeczywiście “dekodowanie” pulsowania lampki radykalnie upraszcza układ i podłączenie sterownika jest praktycznie bezinwazyjne.
Czy masz już jakiś progres?.. bo jakoś nie mam czasu aby przysiąść a Twój pomysł mnie zaciekawił.

To zależy.
Sprzętowo mam ogarnięte, ale softwareowo jestem w polu.
Ostatnio zweryfikowałem swoje potrzeby, albo inaczej - uświadomiłem sobie, czego tak naprawdę potrzebuję.
Słabym punktem obecnego rozwiązania jest to, że impuls z centrali mówi, że brama jest otwarta. Czyli podczas zamykania/otwierania mam informację otwarta/zamknięta/otwarta/zamknięta… co nie jest prawdą. I dlatego chciałem aby HA/ESPHome wiedział, że gdy sygnał jest impulsowy to brama znajduje się w ruchu. Nie udało mi się pożenić długości impulsu ze stanem faktycznym. Stanąłem w punkcie gdzie impulsy przestają być impulsami a zmieniają się w stan ciągły - niski/wysoki.
Jako, że wszystko mi idzie opornie, stwierdziłem, że daruję sobie etap pożenienia długości trwania impulsu z faktycznym stanem bramy, a wprowadzę dodatkową zmienną, która będzie sprawdzana przez HA w momencie gdy ktoś wyzwala zdalnie otwieranie/zamykanie. No właśnie. Nie napisałem po co mi informacja o stanie rzeczywistym i to właśnie w momencie ruchu. To może przykład. Ktoś w domu otwiera bramę. Ja jadę autem i w momencie zbliżania się do domu, telefon wysyła sygnał, żeby otworzyć bramę. Skoro brama jest w ruchu, a HA widzi że przez tą mikrochwilkę brama jest zamknięta, to wyzwala mi kolejne jej otwieranie, czyli de facto, dochodzi do jej zatrzymania. Zdarzyło mi się tak raz, może dwa i siedzi mi to solą w oku.
No i - wracając - gdy brama jest w ruchu - będę sobie “wystawiał” dodatkową zmienną, która ma być sprawdzana przez co najmniej 2s po wydaniu polecenia zamknięcia/otwarcia. Jeśli zmienna ma stan False to włącz przekaźnik. Jeśli True, to ‘nic nie rób’ lub ‘wyzwól przekaźnik dwa razy’.
Mam nadzieję że da się to zrozumieć.

1 polubienie

Ok wszystko jest zrozumiałe… chodziło mi głównie o wykrywanie szerokości impulsu.
… no cóż najprościej to będzie zrobić w arduino i mqtt, ale trzeba się za to wziąć.

Wykrywać - wykrywam. Ale co dalej? Trzeba by dać kilka ifów, a w HA to jeszcze nie czuję gdzie i jak. Dlatego chcesz iść w arduino?

… bo to tylko parę linijek kodu.
Wada jest taka, że wszystko trzeba trzeba konfigurować “ręcznie” niektóre ustawienia nawet na etapie robienia kodu np. SSID.
Można oczywiście się bawić w jakiś serwerek ale dla jednej sztuki nie warto.
W arduino jest taka funkcja milis(), która zwraca systemowy znacznik czasu.
Wystarczy w przerwaniu wykryć zbocza impulsów i znasz czas jego trwania… a dalej już z górki.
Używam z lenistwa tasmote lub espeasy ale to jest armata …

A funkcja ESPHome pulse meter nie załatwia tu sprawy?

Nie rozumiem, nie cierpię, nie przekonasz mnie :crazy_face:
Nie jest to coś z czym miałem do czynienia całe życie.
Bez HA takie urządzenie jest sierotą.