ESPHome klawisz dzwonkowy- fizyczny przycisk nie zmienia stanu

Hej

Chciałbym w piwnicy zainstalować Wemosa D1 mini z esphome i podłączyć do niego klawisz dzwonkowy aby przy jego pomocy włączać światło.
Miałoby to działać przy pomocy NR na zasadzie że gdy przełączyć na wemosie zmieni stan na ON to załączy się przekaźnik itd.

Problem mam jednak taki, że gdy zewrę pin D5 z masą to nie zmienia się stan przełącznika.
Nie wiem jak fizycznie to połączyć aby zmieniał się stan.
w esphome switch się tworzy, w HA też, ale nie mogę ogarnać fizyczniego klawisza.
Podpowie ktoś jak to zrobić albo czego brakuje ?
Kod esphome wygląda tak:

esphome:
  name: test2603

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "4641064c89268ecfa5b8ab5e55f53fdd"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Test2603 Fallback Hotspot"
    password: "4TIF7DKHtgt6"

captive_portal:
    
    
switch:
  - platform: gpio
    pin:
      number: D5
    name: Przysika_2603
    
web_server:
  port: 80

A podłączenie jest proste z D5 do klawisza dzwonkowego i od klawisza do masy.
Co robię nie tak lub jak to poprawnie zrobić?

Na moje oko to potrzebujesz binary_sensor, a nie switch (nie napisałeś wprawdzie gdzie ten przekaźnik i po co NR, ale chyba chcesz sprawdzać stan przycisku fizycznego podpiętego do GPIO14=D5)

więc zamiast

switch:
  - platform: gpio
    pin:
      number: D5
    name: Przysika_2603

powinno być coś takiego

binary_sensor:
  - platform: gpio
    pin:
      number: D5
    name: Przysika_2603

ewentualnie gdyby się zachowywał odwrotnie niż potrzebujesz

binary_sensor:
  - platform: gpio
    pin:
      number: D5
      inverted: true
    name: Przysika_2603

być może jeszcze coś trzeba będzie dodać (pullup jest chyba domyślnie), np. debounce

Popatrz sobie D1 mini WiFi ESP8266 połączony z modułem 4 przekaźników HW-316 tam koledzy mi tłumaczyli długo i wytrwale, może coś ci się przyda.

Chyba właśnie ma być binary_sensor. Zobaczyłem to w wątku

Jednak cały czas mi to działa na zasadzie-zwarte to jest ON, rozwarte OFF, czyli jak jakby musiał być włącznik bistabilny.
Ja potrzebuję to robić na włączniku monostabilnym.

Chodzi o to, że u góry schodów w piwnicy mam klawisz który steruje przekaźnikiem.
Na dole schodów nie mam przewodu do sterowania tym samym przekaźnikiem. Wszystko i tak by się schodziło do HA, więc wymyśliłem że zrobić taki przycisk i ustawie w NR że gdy się zmieni stan tego przycisku to HA załączy przekaźnik.
Nie mam jak przeciągnąć przewodu z góry na dół schodów :frowning:

Dostosuj do swojej fizycznego połączenia:

# przyciski dzwonkowe
binary_sensor:
  - platform: gpio
    name: "button 8"
    pin:
      pcf8574: pcf8574_1_inp
      number: 7
      mode: INPUT
      inverted: true
    on_press:
      then:
        - switch.toggle: relay8

# przekaźniki
switch:
  - platform: gpio
    name: "relay 8"
    id: relay8
    pin:
      pcf8574: pcf8574_2_out
      # Use pin number 0
      number: 7
      # One of INPUT or OUTPUT
      mode: OUTPUT
      inverted: true

Oczywiście na przycisku dzwonkowym możesz zaprogramować akcje typu multi-press (dwuklik, przytrzymanie itd).

Nic nie trzeba robić w NodeRED, ESPHome ma “logikę” żeby to zrobić z pomocą HA, z którym jest zintegrowany.

Nie musi być bistabilny, to jest najprostszy przykład jak eksponować stan przycisku, wewnątrz ESPHome masz dostępne proste automatyzacje i z niego możesz “wyprodukować” coś co zachowuje się inaczej.
Nadal nie wiadomo gdzie masz podpięty przekaźnik

  • jeśli to to samo ESP, to ma być na INNYM GPIO niż przycisk, a sam przycisk możesz wtedy zrobić internal
  • jeśli natomiast użyjesz innego ESP (bo jak zrozumiałem to ESP ma służyć jedynie do obsługi przycisku) to jednak najprościej użyć go w stanie “surowym” (wtedy oczywiście stan musi być eksponowany, bo automatyka odbędzie się gdzieś indziej więc na 100% nie internal) i np. podebrać za pomocą HA, a automatykę zrobić w drugim ESP (tam gdzie masz wpięty zarówno przycisk lokalny jak i sam przekaźnik).

Zrobiłem takie coś

# przyciski dzwonkowe
binary_sensor:
  - platform: gpio
    name: "button 8"
    pin:
      number: D5
      mode: INPUT
      inverted: true
    on_press:
      then:
        - switch.toggle: relay8

# przekaźniki
switch:
  - platform: gpio
    name: "relay 8"
    id: relay8
    pin:
      number: D7
      # One of INPUT or OUTPUT
      mode: OUTPUT
      inverted: true

I muszę robić zwarcie na masę i na 5v żeby zmienił się stan. Jeszcze czasem jest tak że nie działa to za każdym razem i się rozjeżdżają stany między button 8 a relay 8

Czyli np w sekcji switch w polu id: mam wpisać nazwę przekaźnika z HA? np switch.swiatlo_strych_2 ?

Przekaźnik jest podłączony pod arduino mega, a ono usb do HA. esphome ma służyć jak taki zdalny pilot do sterowania przekaźnikiem podłączonym do arduino mega.

Przecież masz przycisk dzwonkowy więc jego stan zmienia się w momencie przycisnięcia a potem wraca do stanu pierwotnego więc nic się nie rozjeżdża - wszystko działa prawidłowo, patrz na moje logi z ESPHome:

# stan: przekaźnik wyłaczony
# nacisnięcie przycisku:
12:49:32	[D]	[binary_sensor:036]	'button 1': Sending state ON
# wywołanie akcji dla on_press
12:49:32	[D]	[switch:021]		'relay 1' Toggling ON.
# przekaźnik włączony
12:49:32	[D]	[switch:037]		'relay 1': Sending state ON
# zwolnienie przycisku
12:49:32	[D]	[binary_sensor:036]	'button 1': Sending state OFF
# kolejne naciśnięcie przycisku powoduje wyłaczenie przekaźnika
12:49:36	[D]	[binary_sensor:036]	'button 1': Sending state ON
12:49:36	[D]	[switch:021]		'relay 1' Toggling OFF.
12:49:36	[D]	[switch:037]		'relay 1': Sending state OFF
12:49:36	[D]	[binary_sensor:036]	'button 1': Sending state OFF

Sorry ale się pogubiłem, na początku nie przedstawiłeś całego docelowego rozwiązania technicznego i dlatego teraz nie wszystko działa tak jak sobie to wyobrażasz, przedstawiając swój kod do ESPHome podałem je pod inne rozwiązanie niż Ty.

Napisałem o co mi chodzi ale może faktycznie trochę mało zrozumiale.

Podsumowując:
Na klatce schodowej jest światło podłączonego do przekaźnika w rozdzielni.
Przekaźnik jest podłączony do arduino mega, sterowany klawiszem dzwonkowym na górze schodów. Jeden klik światło się wł, drugi klik światło się wyłącza( sketch od GitHub - lkankowski/arduino-multi-relay2: Arduino Relay controling sketch with multiple button types (mono-/bi-stable, reed switch), multiple actions (click, double-click, long-click) and MySensors protocol (Serial and MQTT) ).
Podłączone do rpi przez usb, co dalej dodatkowe sterowanie przez HA.

Z racji tego, że na dole schodów nie ma kabla i nie mogę podłączyć klawisza chciałem do tego użyć esphome. Podłączyć do niego klawisz i jeden klik wł przekaźnik podłączony do arduino mega(np przy pomocy HA) a drugi klik go wyłączy.
Coś na zasadzie takiego pilota by to miało być, ale nie mam pomysłu już jak to zrobić.

Mam nadzieję że teraz w miarę jasno nakreśliłem o co mi chodzi i co chciałbym osiągnąć :slight_smile:

Czy ten kod jest w stanie mi w tym pomóc?
Wydawało mi się że gdy zwierałem np D5 z masą to robił się przekaźnik ON, a gdy zwierałem D5 z +5v to robił się OFF(lub odwrotnie)

Zróbmy krok do tyłu: a jak chcesz zasilić ten ESPHome z przyciskiem dzwonkowym i jak chcesz to wszystko zamontować? W puszcze natynkowej?

Mam to zamontowane już. Zasilanie jes z zasilacza usb.
Na tym esphome ogólnie mam teraz licznik impulsów do gazu i podłączony czujnik temperatury.
Dołożyć teraz chcę właśnie włącznik światła bo tego mi jeszcze brakuje tam :confused:
Wszystko jest teraz z puszcze, a pod puszką hermetyczny dzwonek do drzwi który ma robić za włącznik światła :slight_smile:
Wcześniej miałem to zrobione na espeasy i domoticzu, ale zrezygnowałem bo samoistnie się w nocy światło włączało więc odłączyłem i olałem. A teraz jak się przesiałem na HA to pomyślałem żeby to reaktywować

OK, teraz już mam pełny obraz całości :slight_smile:. Zacznijmy od kodu przycisku dzwonkowego w ESPHome:

# ESPHome configuration
binary_sensor:
  - platform: gpio
    pin:
      number: D5
      inverted: true
    name: button 1

Sprawdź czy przycisk pojawi się w HA, encja powinna mieć status off - wyłączony:
image

Jeżeli tak to naciśnij przycisk (nie zwalniaj) i potwierdź, że zmienił się stan przycisku w HA na on - ączony:
image
W kolejnym kroku dopisz do konfiguracji akcję on_press w momencie naciśnięcia przycisku:

# ESPHome configuration
binary_sensor:
  - platform: gpio
    pin:
      number: D5
      inverted: true
    name: button 1
    on_press:
      then:
        - homeassistant.service:
            service: switch.toggle
            data:
              entity_id: switch.0x04cf8cdf3c80318f

gdzie switch.0x04cf8cdf3c80318f to Twój przekaźnik w HA (“przekaźnik jest podłączony do arduino mega”). W ten sposób uzyskałeś to co chciałeś - “coś na zasadzie takiego pilota”, który znajduje się “na dole schodów”.

No i fajnie, już połowa sukcesu :slight_smile:
Ale i tak nie do końca jest jak powinno bo: :slight_smile:
esp się uruchamia, początkowo stan jest off. Zwieram D5+mase, zmienia się stan na ON oraz załącza się przekaźnik. Puszczam zwarcie. Stan jest dalej ON, światło świeci.
Teraz powinno być tak że zwieram ponownie D5+ masę i powinien się zmienić stan na OFF i światło powinno zgasnąć.
Dopiero to zwarciu D5 z +5v światło gaśnie i zmienia się stan na OFF.
A potem już się zaczyna chrzanić, Na esp jest stan OFF, światło świeci, zewrę piny to na esp jest ON a światło gaśnie.
I tak w koło :slight_smile:

Testuje to teraz na testowym esp jakiś na biurku, W HA się pojawia encja i jest z tej strony oki.
Problem jest tylko teraz że trzeba używać trzech pinów żeby załączyć i wyłączyć przekaźnik.
Teraz w ESP jest stan ON, w HA jest stan ON a światło nie świeci :slight_smile:

binary_sensor:
  - platform: gpio
    pin:
      number: D5
      inverted: true
    name: button 1
    on_press:
      then:
        - homeassistant.service:
            service: switch.toggle
            data:
              entity_id: switch.swiatlo_zewnatrz_2

Czy zweryfikowałeś wszystko jak prosiłem wcześniej bo wg Twojego opisu, może nie jest precyzyjny, coś nie działa jak należy. Aby zdiagnozować problem nie możesz pisać tak ogólnie: “Puszczam zwarcie. Stan jest dalej ON, światło świeci.” bo nie wiem czy stan `button 1’ jest nadal ON czy stan switcha w HA jest ON. Sorry ale diabeł tkwi w szczegółach, pokaż logi z ESPHome bo one nie kłamią :wink:.

Doczytaj jak to powinno być podłączone Push button with ESP32 - GPIO pins as digital input

Różna jest taka że nie mam założonego rezystora.
Czyli możliwe że to to psuje cały efekt? Sprawdzę po pracy

Zamiast rezystora wystarczy deklaracja pullupu (uwaga to rozwiązanie tylko na bardzo krótkie kable, jeśli przycisk jest daleko od płytki MUSI być fizyczny rezystor!) - to włączy rezystor wbudowany w ESP (to wymaga sprawdzenia dokumentacji czy użyte GPIO ma taką funkcję - ale chyba prościej włączyć i sprawdzić czy działa? - w linkach powyżej masz to opisane) wydawało mi się, że po zdeklarowaniu GPIO jako wejścia pullup jest domyślny, ale nie sprawdziłem tego (a jak się okazuje mam rezystor 100k podpięty do 3V3 w tym urządzeniu gdzie jawnie nie deklarowałem pullupu, ponadto styki switcha są zbocznikowane kondensatorem 100nF jako elektryczny filtr debounce).

Wydaje mi się że można włączyć pullup- tak przeglądałem Internet w tym kierunku i na pinie D5 włączali.
Wrócę z pracy i na biurku przetestuje to na jakimś innym wemosie.

edit.
Wróciłem po pracy :slight_smile:
Wygląda na to że teraz jest dobrze.
Kod wygląda tak :

binary_sensor:
  - platform: gpio
    pin:
      number: D5
      inverted: true
      mode:
        input: true
        pullup: true
    name: button 1
    on_press:
      then:
        - homeassistant.service:
            service: switch.toggle
            data:
              entity_id: switch.swiatlo_zewnatrz_2
    

Wcześniej zmyliło mnie to, że nie dodałem konkretnej encji którą ma sterować :slight_smile:
Idę testować dalej.
Dziękuję :slight_smile:

a możesz wstawić całość ?

4 posty zostały podzielonye na nowy temat: ESPHome - bezpośrednia komunikacja urządzeń

Dlaczego? Bo nie zadziała, czy jakiś inny powód?