Nieprzypadkowo się mówi, że tymczasowe rozwiązania często stają się rozwiązaniami stałymi, i to nie tylko z powodu przyzwyczajenia. I tak właśnie było z dzwonkiem na furtce – po przeprowadzce, by był tymczasowy dzwonek, wykorzystałem istniejący przycisk, do którego doprowadziłem zasilanie 5V i dodałem najzwyklejszy buzzer (brzęczyk), który sobie popiskiwał, gdy ktoś nacisnął przycisk, tym samym zamykając obwód. Proste, ale skuteczne, bo nawet swój system zasilania awaryjnego posiadał, w postaci układu z akumulatorkiem 18650. W końcu jednak nadeszła pora, by brzęczyk był bardziej smart.

Inteligenty dzwonek na bazie ESP8266, ESPHome i Home Assistant

Uznałem, że skoro w znajdującej się przy „brzęczyku” szafce od bezpieczników mam i tak układ ESP8266, który odpowiada za odczytywanie liczników (wsparty modułem LM393 dla licznika prądu, i CC1101 dla licznika wody), to właściwie czemu nie wykorzystać tego ESP8266 również do obsługi dzwonka, bo w końcu wystarczy dodać buzzer (brzęczyk) oraz podłączyć przycisk.

Szybko jednak się okazało, że to niekoniecznie będzie takie proste, bo układ CC1101 to SPI, a więc zabrał całkiem pokaźną liczbę dostępnych GPIO, a do tego nie każdy GPIO może być dowolnie wykorzystywany. Na szczęście chwila czytania dokumentacji i udało się wytypować dwa GPIO, które można było wykorzystać. I tak po krótkiej chwili i kilku testach, w Home Asisstant pojawił się nowy „inteligentny dzwonek”, bazujący na ESPHome:

Całego kodu, jak i wszystkich automatyzacji nie będę pokazywał, bo wdrożyłem tu kilka mechanizmów dostosowanych do swoich potrzeb i możliwości (np. opcje związane z kamerą i rozbudowanymi powiadomieniami, działającymi zależnie od dodatkowych czynników/warunków). Natomiast pokażę niezbędne elementy, by taki „smart dzwonek” przygotować.

Standardowo, w kodzie będę korzystał ze zdefiniowanych nazw, a więc:

substitutions:
  device_name: esph04 # ${device_name}
  friendly_name: ESPH04 # ${friendly_name}
  device_id: esph04 # ${device_id}
  device_description: "Dzwonek"

Z racji tego, że to ESP8266, a nie ESP32, to dodałem obsługę zapisywania ustawień w pamięci układu, co 30 minut, by też nie obciążać zbytnio pamięci:

esp8266:
  board: nodemcuv2
  restore_from_flash: true

preferences:
  flash_write_interval: 30min

A skoro to dzwonek, to musi być buzzer, czyli brzęczyk, oraz kod do jego obsługi:

output:
  - platform: esp8266_pwm
    pin: D8
    id: ${device_id}_buzzer_output

rtttl:
  output: ${device_id}_buzzer_output

Jak już napisałem wcześniej, w GPIO za  bardzo nie mogłem grymasić, więc wziąłem, co było, czyli w tym przypadku pin D8, do którego podłączyłem zasilanie buzzera (+), oraz pin GND, który poszedł do „minusa” na buzzerze. Dodałem też moduł „rtttl”, bo zamiast zwyczajnie piszczeć, będzie muzyczka. Jak szaleć, to szaleć… ;-)

Dalej wirtualny przycisk, którego wirtualne naciśnięcie powoduje odtworzenie wybranej melodyjki. Dla przykładu niech to będzie Take On Me:

button:
  - platform: template
    name: "${friendly_name} Buzzer Button"
    id: ${device_id}_buzzer_button
    on_press:
      - rtttl.play: 'TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5'

I rzecz dla mnie ważna, czyli wirtualny przełącznik, za pomocą którego mogę zarządzać, czy ESP8266 ma sygnalizować naciśnięcie przycisku dzwonka, czy ma działać w trybie cichym, a obsługą sygnalizacji zajmie się już Home Assistant:

switch:
  - platform: template
    name: "${friendly_name}: Bell ESPH Switch"
    id: ${device_id}_bell_esph_switch
    icon: "mdi:bell-circle-outline"
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON

Bo całość jest tak pomyślana, by ESP8266 z ESPHome mógł sygnalizować, że ktoś dzwoni przy furtce niejako samodzielnie, nawet gdyby z jakiegoś powodu serwer z Home Assistant był niedostępny. A jednocześnie mogę za pomocą przełącznika przełączyć układ w swego rodzaju tryb cichy.

No i tak dochodzimy do najważniejszego elementu w przypadku dzwonka, czyli obsługi przycisku dzwonka. Tym razem fizycznego, do czego przyda się moduł „binary_sensor”:

binary_sensor:
  - platform: status
    name: "${friendly_name} Status"
  - platform: gpio
    pin:
      number: GPIO1 # TX
      inverted: true
      mode:
        input: true
        pullup: true
    name: "${friendly_name} Bell Button"
    id: ${device_id}_bell_btn
    icon: "mdi:bell-circle"
    filters:
      - delayed_on: 10ms
      - delayed_off: 30s
    on_press:
      then:
        - if:
            condition:
              - switch.is_on: ${device_id}_bell_esph_switch
            then:
              - button.press: ${device_id}_buzzer_button

Zasada działania jest prosta, czyli przycisk podłączyłem do portu GPIO1 (TX), bo akurat był jeszcze dostępny, do tego pozwalał na wykorzystanie w takim celu, i masy (GND), co powoduje zamknięcie obwodu w momencie naciśnięcia przycisku dzwonka i sensor staje się aktywny, a więc „ktoś dzwoni”. Zamiast „on_press” można użyć „on_release”.

Z rzeczy istotnych, to jest tu zastosowany filtr „delayed_on” ustawiony na 10 milisekund, by eliminować „niby naciśnięcia przycisku”, powodowane przez różne zakłócenia. U mnie 10 milisekund się sprawdza, ale w razie potrzeby można dać dłuższy czas. Filtr „delayed_off” natomiast ma nawet nie tyle dać czas, by na pewno wszystkie automatyzacje zdążyły „zauważyć”, że przycisk został naciśnięty, ile wyeliminować akcje w sytuacji, gdy ktoś w krótkim czasie naciśnie przycisk kilkukrotnie, co jest chyba dość powszechne, a czego w przypadku „inteligentnego dzwonka” raczej nie potrzebujemy.

Dalej – po weryfikacji, czy ESP8266/ESPHome ma bezpośrednio sygnalizować, że ktoś dzwoni, następuje wywołanie wirtualnego przycisku, co powoduje uruchomienie sygnalizacji za pomocą buzzera (brzęczyka).

I jeśli chodzi o podstawy, to właściwie wszystko. Dalej, to już każdy wedle swoich potrzeb może kod rozbudować, czy też dodać np. różnego rodzaju automatyzacje w Home Assistant.

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej