ESPHome + ESP8266 jako zdalne sterowanie bramy

Hej,
Bardzo dawno temu zrobiłem sobie PCB pod ESP8266 do sterowania bramą, tzn. główny sterownik działa z bramą, a ten mój podłączony pod wejście zewnętrznego przycisku ma za zadanie uruchamiać tylko bramę. Teraz chciałbym tego użyć do Home Assistant gdzie będę mógł otworzyć bramę oraz sprawdzić stan bramy (brama jest wspólna na sześć rodzin)
Podpowiedzcie czy to co skleciłem będzie OK.

###################################################################################################################################################

#--  konfiguracja modułu
esphome:
  name: brama                                           # nazwa
  friendly_name: Brama                                  # nazwa używana w Home Assistant

#--  moduł ESP
esp8266:
  board: esp01_1m                                       # ESP-07

#--  włącz logi
logger:

#--  włącz API Home Assistant
api:
  encryption:
    key: "v6LtRbeyiUrQgMkIbbQ9YfgvIyj36d2OANgplKuWGEg=" # klucz API

#--  OTA
ota:
  password: "d150c3dd8d9c6f6e166ec7aa96d1c092"          # hasło OTA

#--  konfiguracja Wi-Fi
wifi:
  ssid: !secret wifi_ssid                               # nazwa sieci Wi-Fi
  password: !secret wifi_password                       # hasło sieci Wi-Fi

#--  ta sekcja może zostać usunięta w celu włączenia DHCP
  manual_ip:                                            # statyczna konfiguracja sieci
    static_ip: 192.168.1.122                            # IP modułu
    gateway: 192.168.1.1                                # IP bramy/routera
    subnet: 255.255.255.0                               # maska sieci

#--  konfiguracja AP
  ap:
    ssid: "Brama"                                       # nazwa AP
    password: !secret ap_password                       # hasło AP

#--  włącz rezerwowy hotspot (portal przechwytujący) na wypadek awarii połączenia Wi-Fi
captive_portal:

#--  
web_server:
    port: 80
    auth:
      username: "admin"
      password: !secret web_server_password

###################################################################################################################################################

# piny GPIO
# GPIO  0 - przycisk (flash)
# GPIO  4 - czujnik/krańcówka 
# GPIO  5 - przekaźnik
# GPIO 12 - LED przekaźnik
# GPIO 13 - LED czujnik/krańcówka 
# GPIO 14 - LED Wi-Fi

###################################################################################################################################################

text_sensor:

#--  uptime  
  - platform: template
    name: Uptime
    id: uptime_human
    icon: mdi:clock-start

###################################################################################################################################################

sensor:        

#--  uptime
  - platform: uptime
    name: Uptime
    id: uptime_sensor
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();

#--  signał Wi-Fi                                           
  - platform: wifi_signal
    name: Sygnał Wi-Fi
    device_class: signal_strength
    entity_category: diagnostic   

###################################################################################################################################################

switch:

#--  restart modułu
  - platform: restart                                   # restart ESP
    name: Restart                                       # nazwa czujnika - pojawi w Home Assistant  

#--  kontrolka LED dla załączonego przekaźnika 
  - platform: gpio
    id: led_pk
    pin: 12
    inverted: yes
   
#--  kontrolka LED dla otwarcia bramy    
  - platform: gpio
    id: led_status
    pin: 13
    inverted: yes

#--  kontrolka LED dla połaczenia modułu z siecią Wi-Fi
  - platform: gpio
    id: led_wifi
    pin: 14
    inverted: yes

#--  przekaźnik uruchamiający bramę - załączenie na ustalony czas
  - platform: gpio                                      
    id: brama_start                                     # identyfikator
    name: Start                                         # nzwa jaka pojawi się w Home Assistant   
    icon: mdi:refresh-auto                              # ikona
    pin: GPIO5                                          # nr GPIO dla przekaźnika
    on_turn_on:                                         # gdy został załączony przekaźnik
      - switch.turn_on: led_pk                          # włącz LED przekaźnk
      - delay: 1s                                       # odczekaj ustalony czas
      - switch.turn_off: brama_start                    # wyłącz przekaźnik
      - switch.turn_off: led_pk                         # wyłącz LED przekaźnik
    restore_mode: ALWAYS_OFF                            # przekaźnik zawsze wyłączony (włączenie/reset ESP)

###################################################################################################################################################

binary_sensor:

#--  krańcówka 
  - platform: gpio                                      
    id: brama_status                                    # identyfikator
    name: Status                                        # nzwa jaka pojawi się w Home Assistant
    #icon: mdi:gate                                      # ikona
    device_class: lock 
    pin:                                                # konfiguracja GPIO
      number: GPIO4                                     # nr GPIO dla przycisku
      mode:                                             # konfiguracja przycisku
        input: true                                     # GPIO jako wejście
        pullup: true                                    # wewnętrzne podciągnęcie GPIO (pull-up)         
      inverted: True                                    # odwrócenie
    filters:                                            # filtr aby odbić wciśnięcie przycisku      
      - delayed_on: 50ms                                # odczekaj 50ms
      - delayed_off: 50ms                               # OK, to nie zakłócenia, a wciśnięty przycisk  
    on_press:                                           # gdy przycisk został nacisnięty
      - switch.turn_on: led_status                      # włącz LED przekaźnk
    on_release:
      - switch.turn_off: led_status                     # włącz LED przekaźnk

#--  włączenie przekaźnika po naciśnięciu przycisku fizycznego
  - platform: gpio                                      
    id: przycisk                                        # identyfikator
    name: Przycisk                                      # nzwa jaka pojawi się w Home Assistant
    icon: mdi:button-pointer                            # ikona
    pin:                                                # konfiguracja GPIO
      number: GPIO0                                     # nr GPIO dla przycisku
      mode:                                             # konfiguracja przycisku
        input: true                                     # GPIO jako wejście
        pullup: false                                   # zewnętrzne podciągnęcie GPIO (pull-up) 
      inverted: True                                    # odwrócenie
    filters:                                            # filtr aby odbić wciśnięcie przycisku      
      - delayed_on: 50ms                                # odczekaj 50ms
      - delayed_off: 50ms                               # OK, to nie zakłócenia, a wciśnięty przycisk  
    on_press:                                           # gdy przycisk został nacisnięty
      - switch.turn_on: brama_start                     # włącz przekaźnik
      
###################################################################################################################################################

interval:
  - interval: 1s                                        # wykonaj co 1 sekundę
    then:
      if:                                               # jeżeli
        condition:
          wifi.connected:                               # połączenie z Wi-Fi
        then:                                           
          - if:
              condition:
                api.connected:                          
              then:                                     # jeżeli połączono z Wi-Fi
                - switch.turn_on: led_wifi              # to włącz LED Wi-Fi
              else:                                     # jeśli nie ma połączenia z HA to mrugaj LED Wi-Fi
                - switch.turn_on: led_wifi              # włącz LED Wi-Fi
                - delay: 500ms                          # odczekaj
                - switch.turn_off: led_wifi             # wyłącz LED Wi-Fi
                - delay: 500ms                          # odczekaj
        else:                                           # jeżeli nie połączono z Wi-Fi (automatycznie z HA również nie)
          - switch.turn_off: led_wifi                   # to wygaś LED Wi-Fi

###################################################################################################################################################

A teraz pytania:

  • co można poprawić w moim kodzie?
  • co zrobić aby mój kod wczytał aktualny stan krańcówki po uruchomieniu? teraz prawdziwy stan się pokazuje dopiero jak rozepnę i wepnę krańcówkę
  • jak zrobić (czy w ogóre się da) jakąś prostą stronę gdzie będzie jakiś większy guzik, który uruchomi bramę oraz pokaże status bramy zamknięta/otwarta.
  • czy można jakoś zrobić dodatkowe opcje jak AP? Chodzi o to, że chciałbym podzielić się z sąsiadami możliwością otwierania bramy przez telefon, ale nie koniecznie chcę się dzielić internetem czy dostępem do Home Assistant
    *na tą chwilę całość męczę na stole bez fizycznego podłączenia do sterownika bramy


użyłeś on_press/on_release one tak działają - tylko przy zmianie stanu wejściowego

publish_initial_state powinno rozwiązać problem nr 2

gdyby się nie udało, to można to obejść przez on_loop (ale to takie nieeleganckie rozwiązanie i może wywoływać inne problemy)


Tak poza konkurencją (tzn. problem nr 1), to

  • krańcówka nie jest zamkiem, więc raczej niepoprawna klasa urządzenia (o ile się nie mylę ESPHome póki co ignoruje specyfikę działania zamków, to HA chyba już nie bardzo)
  • definicja płytki moglaby być esp07 zamiast esp01_1m (w tym wypadku nie robi to różnicy innej niż estetyczna, ale dla modułu ESP07s już by robiło różnicę - flash zostałby inaczej podzielony)
  • pewnie można sporo doszlifować - przejrzyj inne podobne projekty na bazie ESPHome dostępne w sieci, oraz bazę przykładów - często są fajne rozwiązania wręcz gotowe do wykorzystania

Problem 3 - bardziej intuicyjny wygląd przycisku ma stara wersja portalu

web_server:
  version: 1

oprócz tego można modyfikować css (ale mnie nie pytaj jak, cośtam na temat jest w dokumentacji, ale skupiają się głównie na tym jak załączyć własny do firmware)


Problem 4 w kwestii AP jest nierozwiązywalny (nie wystawisz AP w trakcie normalnej pracy), a jeśli taka opcja w ogóle kiedyś się pojawi w ESPHome, to na moje oko nie będzie dotyczyła ESP82xx (sprzętowo (+programowo oczywiście) jest to możliwe w ESP32, ale nie ma wsparcia w ESPHome).

Co do rozwiązań alternatywnych to za późno, żeby siedzieć i opisywać możliwe opcje (jeśli domofony są z przyciskiem bramy to po module dla każdego chętnego i niech sobie organizuje dostęp, będziesz miał z sąsiadami więcej problemu niż to wszystko warte - przede wszystkim czeka Cię świadczenie wsparcia technicznego do końca świata albo i dłużej :P, wystarczyło użyć sterownika bramy z opcją dodatkowych pilotów).


PS Jak się sprawdza ten przekaźnik 5V przy zasilaniu 3V3?

1 polubienie

Wygląda na to, że działa jak chciałem :wink:

Jakiej klasy użyć aby było poprawnie?
Nie widzę nic związanego z bramą, jest tylko brama garażowa.

Rzeczywiście, pierdoła, a jednak lepiej to wygląda.

Już sporo się tego naoglądałem i dzięki temu wyszło mi to co pokazałem i nawet zaczęło to wszystko działać.

Jeżeli nie da rady mieć AP to i pomysł ze stroną nieaktualny.

Tu bardziej chodziło o podzielenie się z sąsiadami “bajeranckiego” otwierania bramy poprzez telefon, ale chyba masz rację, że to zawsze komuś coś nie zadziała, coś nie będzie pasować i dam sobie z tym spokój - podłączając bramę pod HA ja będę miał wszystko jak sobie wymyśliłem.
Sprawę dodatkowych pilotów rozwiązałem dodatkowym modułem od Elmes.

Ten przekaźnik był tylko do zdjęcia (nawet nie był wlutowany) Zamontowany jest tego samego typu i koloru, ale z cewką 3V - nie pamiętam teraz dokładnego modelu.

edyta
Przekaźnik to SRD-03VDC-SL-C

1 polubienie

Dowolnej, która pasuje - do krańcówki nie pasuje żadna wprost (nie siedzę teraz z nosem w dokumentacji), ale skoro to czujnik otwarcia to drzwi lub okno, są najbliższą klasą urządzenia zgodną z zachowaniem czujnika (ponadto klasa nie jest obowiązkowa, a ikony możesz podmienić - obsługiwane są wszelkie typowe mdi:).


A teraz nieco z innej beczki

Jest taki polski projekt Supla, ma już “sporo lat na karku”, prężne forum i “w standardzie” ma dostęp chmurowy z własną aplikacją (jest też pod iOS) lub inną aplikacją zgodną z Supla - ja znam Nice WiFi i na bazie tej chmury+aplikacji można zorganizować bajerancki dostęp z apką dla kilku osób, a jakiś czas temu dorobił się paru nowych bajerów - integracji po MQTT (również z HA - więc w ten sposób byś sobie mógł zintegrować w HA bez konieczności udostępniania własnej sieci itp. itd.), a także webowego generatora firmware, więc może dasz radę sobie wygenerować coś do swojej konstrukcji modułu
https://gui-generic-builder.supla.io/

1 polubienie

Czyli mówisz, że lepiej będzie nie ustawiać klasy urządzenia, a ikonę tylko?
Tylko tak z drugiej strony… Ustawiając klasę to zmienia mi się też ikonka, np. lock - mam zamkniętą/otwartą kłódkę. Coś jeszcze nad tym pomyślę, bo to i tak tylko pierdoła.

Dokończyłem drugi temat w poście wyżej, bo przedwcześnie kliknąłem w Odpowiedz :stuck_out_tongue:

Klasę należy ustawiać tam gdzie istnieje pasująca i to nie jest tylko kwestia ikonki (z innych systemów niż HA wiem, że zamki zachowują się inaczej niż drzwi i okna, nie sądzę aby obsługa w HA została daleko w tyle za innymi), oraz tam gdzie to cokolwiek daje (możesz ustawić np. jako czujnik drzwi i nadpisać ikonę) - tu to tylko kwestia krańcówki, ale nie zastanawiałem się nad całością urządzenia - rozwiązanie dla bramy u siebie planuję na przyszły rok (muszę dokończyć wszystko inne co mam porozgrzebywane…).

Jak to przeczytałem to mnie olśniło… przecież ja mogę dodać klasę urządzenia oraz podmienić ikonę - wcześniej robiłem to lub to.
Czyli jak sobie dodałem:

    icon: mdi:gate                                     
    device_class: opening

to otrzymuję:
Bez tytułu
*nie wiem jak jest w drugą stronę bo jestem poza domem, ale domyślam się, że będzie “zamknięte”

Całość urządzenia (od tego powinienem zacząć) to jest dodatek do istniejącej bramy. Mój moduł ma za zadanie tylko i aż kliknąć przekaźnikiem aby brama się otworzyła - ogólnie brama działa tak, że klikając na guzik w pilocie jest kolejno start/stop/rusz w przeciwną stronę - zaprogramowałem bramę na automatyczne zamykanie po minucie i wszyscy są zadowoleni, ponieważ klikamy aby brama się otworzyła, wyjeżdzamy autem, a brama ma się sama zamknąć.

Mój moduł ma na pokładzie:

  • guzik do załączenia przekaźnika na ustalony czas - w sumie zbędny, ale tak sobie wykombinowałem, że jak i tak jest to niech coś robi
  • przekaźnik, aby móc załączać bramę
  • krańcówkę aby wiedzieć czy brama jest otwarta
  • diodę, która sygnalizuje połączenie z Wi-Fi oraz połączenie z HA: nie świeci to brak połączenia z siecią Wi-Fi, mruga czyli połączył się z siecią Wi-Fi, ale nie z HA oraz gdy świeci to połączył się z siecią Wi-Fi i HA
  • diodę, która sygnalizuje otwarcie bramy, zwarta krańcówka
  • diodę, która sygnalizuje załączenie przekaźnika

Większość tego, co teraz uzupełniłeś widać z YAMLa, jakkolwiek PCB to chyba projektowałeś pod jakieś inne rozwiązanie programowe (bo w 2017 moim zdaniem projekt ESPHome jeszcze nie istniał, wydaje mi się że jego początki to 2018, a zdatny do użytku był gdzieś w 2019), w sumie to intryguje mnie ta tulejka (czy to uszkodzone gniazdo antenowe?).

Natomiast w kwestii udoskonaleń - no nie zastanawiałem się nad tym głęboko, ale z pewnością jest tu miejsce na jakąś drobną automatyzację - choćby pilnującą wciskania przycisku fizycznego (czy wirtualnego) by nie został uruchomiony przy otwartej bramie, bądź wręcz uruchamianie ponownego otwarcia po zamknięciu, jeśli został wciśnięty w czasie gdy brama nie była zamknięta, z jednym przekaźnikiem to tu się nie poszaleje…
(mając więcej wyjść można by zaszaleć na sterowanie wejściami Open/Close/Stop i przejęciem części automatyki sterowania włącznie z obsługą np. permanentnego otwarcia po wielokliku itp. tak swoją drogą zamiast przekaźnika często można w obwodzie wykonawczym użyć tranzystory w układzie OC w celu łączenia się z wejściami innego sterownika).

W kwestii wykorzystania GPIO0 jako wejścia przycisku lokalnego, to z jednej strony jest to optymalizacja liczby elementów, z drugiej przy niekorzystnym splocie okoliczności można niechcący wprowadzić ESP w tryb programowania (w przypadku przycisku jest to prawdopodobieństwo bliskie zera, czyli konstrukcja jest przemyślana, ale widywałem już pomysły gdy ludzie na piny używane przy rozruchu podpinali np. czujniki kontaktronowe, które gwarantowały nieudane bootowanie np. po zaniku i powrocie zasilania).

PS Ciągnąc temat udostępnienia rozwiązania sąsiadom tak by nie udostępniać własnej sieci przemknął mi przez głowę jeszcze jeden pomysł (w sumie to Supla mnie trochę zainspirowała) - można wykorzystać zdalny broker MQTT do sterowania, o ile broker publiczny to słabe rozwiązanie na sterowanie czymkolwiek (bo każdy może się nim bawić), to przyszły mi do głowy prywatne (niepubliczne) brokery dostępne chmurowo, które mają jakieś niewielkie darmowe plany, nie korzystałem dotąd z tych rozwiązań, ale wydają się być sensowne