logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Przeróbka pilota RF od rolet tak aby działał z WiFi i Home Assistant

p.kaczmarek2 31 Sie 2024 19:04 1863 2
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • Pilot do rolet podłączony do modułu WiFi i zewnętrznego zasilania
    Wiele kontrolerów rolet jest dostarczanych z pilotami RF, ale bez łączności Wi-Fi, więc nie można ich łatwo sparować z Home Assistant. Na szczęście zawsze można po prostu wstrzyknąć zdalne naciśnięcia przycisków i przechwycić stany diod LED za pomocą prostego dodatku w postaci modułu WiFi. Poniżej pokażę jak zrobić to krok po kroku w OpenBeken.

    Projekt został wykonany przez @DeDaMrAz, ja tylko zajmuję się wsparciem i dokumentacją.

    W sumie jest 5 rolet. Mają one jednego wspólnego pilota.
    Pilot ma 5 przycisków:
    - prawy/lewy (do wyboru migawki)
    - góra/dół (do otwierania/zamykania)
    - środkowy (zatrzymanie)
    Co więcej, pilot RF ma również prostą informację zwrotną LED (pięć diod LED), która mówi nam, którą roletą aktualnie sterujemy.
    Diody LED wskazują albo indeks pomieszczenia (świeci się jedna z diod LED), albo specjalny tryb "wszystkie pomieszczenia" (świecą się wtedy wszystkie diody LED).

    Łącznie jest to 10 GPIO - 5 wyjść (do sterowania przyciskami) i 5 wejść (do odczytu diod LED).
    Otwórzmy pilota i zajrzyjmy do środka:
    Obraz płytki drukowanej z baterią i pięcioma przyciskami. Zdjęcie płytki elektronicznej pilota RF z widocznym miejscem na baterię.
    Możemy również nałożyć oba obrazy na jeden obraz, aby uzyskać większą przejrzystość:
    Obraz płytki drukowanej z przylutowanymi elementami, w tym gniazdo na baterię i miejsca na przyciski.
    Następnym krokiem jest ustalenie, jak odczytywać diody LED i przyciski sterujące. Musimy znaleźć punkty, w których możemy przylutować przewody:
    Wnętrze pilota do zdalnego sterowania roletami z widocznymi komponentami elektronicznymi. .
    Nie chcieliśmy zepsuć pilota, ani uczynić go bezużytecznym bez dodatku WiFi, więc zdecydowaliśmy się poprowadzić sygnały do męskiego złącza pinowego:
    Wnętrze pilota z opisanymi punktami lutowniczymi .
    Nadszedł czas na lutowanie. Najpierw przewody zostały przylutowane do pinów:
    Wnętrze otwartego pilota do rolet z przylutowanymi kolorowymi przewodami .
    Następnie zostały one starannie zwarte i przylutowane do odpowiednich padów:
    Moduł pilota zdalnego sterowania z przylutowanymi przewodami .
    Pilot do rolet z otwartą obudową, ukazujący wewnętrzne okablowanie i baterię. Widok wnętrza pilota zdalnego sterowania z podłączonymi kolorowymi przewodami.
    Następnym krokiem jest część WiFi. Możemy użyć dowolnego urządzenia OBK, ale kolega miał pod ręką kilka przerobionych NodeMCU. @DeDaMrAz zdecydował się na użycie PC817 dla przycisków, jednak moim zdaniem nie było to konieczne - zależy to od sposobu podłączenia przycisków.
    Schemat połączeń płytki NodeMCU z modułem WiFi i przyciskami
    Tak więc, oto płytka WiFi:
    Płytka prototypowa zlutowana z różnokolorowymi przewodami.
    Moduł WiFi CB3S na płytce prototypowej
    Płytkę można bezproblemowo podłączyć do pilota, a pilot pozostaje nienaruszony:
    Pilot do rolet podłączony do modułu WiFi z wielokolorowymi kablami. .
    Należy tylko pamiętać, że zalecałbym wyjęcie baterii przed podłączeniem zewnętrznego zasilania.

    Teraz część sprzętowa jest gotowa. Trzeba jeszcze napisać skrypt dla OpenBeken. Kodowanie w C nie jest wymagane!
    Konfiguracja GPIO:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zaczynamy więc od włączenia niestandardowych przycisków, czyli sterownik httpButtons:
    
    startDriver httpButtons
    
    .
    Następnie dodajemy obsługę zmian kanałów (zdarzenia), aby kanały "przycisków" powróciły do 0 po krótkiej chwili:
    
    addChangeHandler Channel1 == 1 addRepeatingEvent 0.2 1 setChannel 1 0
    addChangeHandler Channel2 == 1 addRepeatingEvent 0.2 1 setChannel 2 0
    addChangeHandler Channel3 == 1 addRepeatingEvent 0.2 1 setChannel 3 0
    addChangeHandler Channel4 == 1 addRepeatingEvent 0.2 1 setChannel 4 0
    addChangeHandler Channel5 == 1 addRepeatingEvent 0.2 1 setChannel 5 0
    

    Powyższy kod zakłada, że kanały 1-5 mają role Rel (piny wyjściowe).

    Następnie obsługujemy odczyt z kanałów pinów dInput, aby odczytać stany diod LED:
    
    //test for reading LED's from remote
    addChangeHandler Channel6 == 1 setButtonColor 6 BLUE
    addChangeHandler Channel6 == 0 setButtonColor 6 GREEN 
    addChangeHandler Channel7 == 1 setButtonColor 7 BLUE
    addChangeHandler Channel7 == 0 setButtonColor 7 GREEN
    addChangeHandler Channel8 == 1 setButtonColor 8 BLUE
    addChangeHandler Channel8 == 0 setButtonColor 8 GREEN
    

    Po prostu ustawiają kolory przycisków, abyśmy wiedzieli, który pokój kontrolujemy.

    Wreszcie, przyciski:
    
    //buttons
    setButtonLabel 1 "STOP"
    setChannelLabel 1 STOP
    setButtonColor 1 RED
    setButtonEnabled 1 1
    setButtonCommand 1 "setChannel 1 1"
    
    setButtonLabel 2 "UP"
    setChannelLabel 2 UP
    setButtonEnabled 2 1
    setButtonColor 2 ORANGE
    setButtonCommand 2 "setChannel 2 1"
    
    setButtonLabel 3 "DOWN"
    setChannelLabel 3 DOWN
    setButtonColor 3 ORANGE
    setButtonEnabled 3 1
    setButtonCommand 3 "setChannel 3 1"
    
    setButtonLabel 4 "LEFT"
    setChannelLabel 4 LEFT
    setButtonColor 4 GREEN
    setButtonEnabled 4 1
    setButtonCommand 4 "setChannel 4 1"
    
    setButtonLabel 5 "RIGHT"
    setChannelLabel 5 RIGHT
    setButtonColor 5 GREEN
    setButtonEnabled 5 1
    setButtonCommand 5 "setChannel 5 1"
    

    W powyższym kodzie 5 przycisków naśladuje przyciski pilota zdalnego sterowania.

    Mamy również dodatkowe przyciski, które służą do sygnalizowania, który pokój jest aktywny:
    
    setButtonLabel 6 "OFFICE"
    setChannelLabel 6 OFFICE
    setButtonColor 6 GREEN
    setButtonEnabled 6 1
    //setButtonCommand 6 ""
    
    setButtonLabel 7 "ROOM 1"
    setChannelLabel 7 ROOM 1
    setButtonColor 7 GREEN
    setButtonEnabled 7 1
    
    setButtonLabel 8 "ROOM 2"
    setChannelLabel 8 ROOM 2
    setButtonColor 8 GREEN
    setButtonEnabled 8 1
    
    // NOTE: we didn't actually add here room 3, but it could be easily implemented if needed
    
    
    .
    Nie mają one ustawionych zdarzeń kliknięcia, po prostu zmieniają kolor, gdy dany pokój jest aktywny.

    Na koniec dodajemy dodatkowy przycisk, aby zapamiętać ostatnio wybrany pokój:

    
    setButtonLabel 9 "LAST SELECTION"
    setButtonColor 9 green
    setButtonEnabled 9 1
    
    
    .
    Po zapaleniu się danej diody LED zmieniamy etykietę:
    
    addChangeHandler Channel4 == 1 if $CH9==0 then NONE
    addChangeHandler Channel5 == 1 if $CH9==0 then NONE
    // last selection
    addChangeHandler Channel6 == 1 setButtonLabel 9 "OFFICE"
    addChangeHandler Channel7 == 1 setButtonLabel 9 "ROOM 1"
    addChangeHandler Channel8 == 1 setButtonLabel 9 "ROOM 2"
    addChangeHandler Channel9 != 0 setButtonLabel 9 "ALL"
    
    .
    Mamy również funkcję śledzenia sprawdzania, czy pilot jest podłączony do OBK:
    
    setButtonLabel 10 "NOT DETECTED"
    setChannelLabel 10 DETECTION
    setButtonColor 10 RED
    setButtonEnabled 10 1
    addChangeHandler Channel10 == 1 setButtonColor 10 GREEN
    addChangeHandler Channel10 == 0 setButtonColor 10 RED
    addChangeHandler Channel10 == 1 setButtonLabel 10 "DETECTED"
    addChangeHandler Channel10 == 0 setButtonLabel 10 "NOT DETECTED"
    

    Musimy również obsłużyć dodatkowy stan, w którym wszystkie diody LED są zapalone, co oznacza, że wszystkie rolety będą teraz sterowane:
    
    again:
    if $CH6==1&&$CH7==1&&$CH8==1 then "setChannel 9 1" else "setChannel 9 0"
    delay_s 1
    goto again
    

    A oto panel OBK (niektóre przyciski nie są w języku angielskim, ale to tylko demonstracja):
    Zrzut ekranu interfejsu użytkownika z przyciskami sterującymi roletami.
    Ważne jest, aby pamiętać, że pierwsze przyciski są rzeczywiście klikalne i wysyłają zdarzenia, podczas gdy dalsze przyciski tylko naśladują stan diod LED.

    Pracujemy również nad integracją HA, ale nie jest ona jeszcze w pełni gotowa. Oto jak automatyczne wykrywanie HASS widzi to urządzenie:
    Zrzut ekranu interfejsu sterowania roletami z urządzeniem BK7231N.
    Poniższe daje nam już możliwość sterowania roletami z tego miejsca, ale jest o wiele więcej do poprawienia wkrótce.

    Dalsze ulepszenia mogą obejmować:
    - zmiany w logice generycznej, lepsze śledzenie stanu (jeśli wykryjemy dalsze przypadki brzegowe...)
    - lepsza strona OBK, być może poprzez interfejs rest:
    https://www.elektroda.com/rtvforum/topic3971355.html
    - lepszy interfejs HA (prawdopodobnie poprzez niestandardowy yaml)
    Oczywiście powinno być również możliwe bezpośrednie sterowanie RF (za pomocą niektórych modułów odbiornika / nadajnika RF), ale nie był to zakres tego tematu.

    Podsumowując - to podejście pozwala "porwać" dowolne urządzenie zdalne i przekonwertować je na WiFi. Nie ogranicza się to tylko do rolet, to samo można zrobić z ogrzewaniem, chłodzeniem, klimatyzacją, monitorowaniem PV itp. i tak dalej.
    Pokazany tutaj projekt jest już funkcjonalny, ale wkrótce możemy go jeszcze bardziej ulepszyć i opublikować rozszerzoną wersję - bądź na bieżąco!

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • #2 21210961
    DeDaMrAz
    Poziom 17  
    Uwaga na temat tego projektu, jest on wciąż w fazie bardzo intensywnego rozwoju i dostosowuję rzeczy w locie i wciąż nad tym pracuję, ale ostatecznie celem jest dodanie tego do HA i sprawienie, by działało w 100%. Będę publikował aktualizacje, jeśli ktoś jest zainteresowany.

    Wielkie dzięki dla @p.kaczmarek2 za pomoc w tym!

    Dodano po 1 [godzinie] 44 [minutach]:

    Zmieniłem nieco projekt, aby lepiej obsługiwać diody LED i dodałem funkcję wykrywania:

    Płytka drukowana z komponentami elektronicznymi i uchwytem na baterię.

    Zapewni mi to lepszy odczyt, ponieważ teraz odczytuję przed diodami LED, dzięki czemu mój sygnał ma większą spójność i nie ma w nim odchylenia napięcia LED.

    Zmieniono również schematy/okablowanie dla funkcji wykrywania:

    Schemat układu z modułem CB3S NodeMCU i optoizolatorami PC817

    Ciąg dalszy nastąpi...
  • #3 21213596
    DeDaMrAz
    Poziom 17  
    To było dość interesujące i świetne doświadczenie edukacyjne dla mnie, ukończyłem to, co miałem na myśli i podzielę się teraz więcej szczegółami. Pamiętaj, że ten projekt był w dużym stopniu zależny od urządzenia, z którego korzystam, ale ogólnie było to świetne doświadczenie i zasadniczo ta metoda "wysokiego podnośnika" powinna działać na dowolnym urządzeniu.

    Oto konfiguracja pinów, której ostatecznie użyłem.

      ],
      "pins": {
        "6": "Rel;3",
        "7": "dInput_NoPullUp;7",
        "8": "dInput_NoPullUp;8",
        "9": "dInput_n;10",
        "14": "Rel;4",
        "20": "Rel;5",
        "22": "dInput_NoPullUp;6",
        "24": "Rel;1",
        "26": "Rel;2"
      },


    Wybór pinów był kwestią zabawy z urządzeniem i pomiaru poziomów na nim, wybrałem dInput_n dla P9 jako pin detekcji, ponieważ była to najlepsza opcja dla mnie i logiki w autoexec. W przypadku innych wejść wykorzystałem opcję NoPullUp, ponieważ podłączyłem podciągnięcia pilota i dzięki temu uzyskałem znacznie bardziej spójne odczyty i brak fałszywych odczytów w przypadku, gdy wszystkie 5 diod LED było włączonych. Przekaźniki są oczywistym wyborem dla wyjść (naciśnięcia przycisków), ponieważ steruję transoptorami PC817 za pomocą tych pinów.

    To będzie mój ostateczny autoexec z nieco skomentowanym kodem:

    startDriver httpButtons
    
    //shortest time to pulse the channels
    addChangeHandler Channel1 == 1 addRepeatingEvent 0.2 1 setChannel 1 0
    addChangeHandler Channel2 == 1 addRepeatingEvent 0.2 1 setChannel 2 0
    addChangeHandler Channel3 == 1 addRepeatingEvent 0.2 1 setChannel 3 0
    addChangeHandler Channel4 == 1 addRepeatingEvent 0.2 1 setChannel 4 0
    addChangeHandler Channel5 == 1 addRepeatingEvent 0.2 1 setChannel 5 0
    
    //test for reading LED's from remote
    addChangeHandler Channel6 == 0 setButtonColor 6 BLUE
    addChangeHandler Channel6 == 1 setButtonColor 6 GREEN 
    addChangeHandler Channel7 == 0 setButtonColor 7 BLUE
    addChangeHandler Channel7 == 1 setButtonColor 7 GREEN
    addChangeHandler Channel8 == 0 setButtonColor 8 BLUE
    addChangeHandler Channel8 == 1 setButtonColor 8 GREEN
    
    //buttons setup
    
    setButtonLabel 1 "UP"
    setChannelLabel 1 UP
    setButtonColor 1 ORANGE
    setButtonEnabled 1 1
    setButtonCommand 1 "setChannel 1 1"
    
    setButtonLabel 2 "STOP"
    setChannelLabel 2 STOP
    setButtonColor 2 RED
    setButtonEnabled 2 1
    setButtonCommand 2 "setChannel 2 1"
    
    setButtonLabel 3 "DOWN"
    setChannelLabel 3 DOWN
    setButtonColor 3 ORANGE
    setButtonEnabled 3 1
    setButtonCommand 3 "setChannel 3 1"
    
    setButtonLabel 4 "LEFT"
    setChannelLabel 4 LEFT
    setButtonColor 4 GREEN
    setButtonEnabled 4 1
    setButtonCommand 4 "setChannel 4 1"
    
    setButtonLabel 5 "RIGHT"
    setChannelLabel 5 RIGHT
    setButtonColor 5 GREEN
    setButtonEnabled 5 1
    setButtonCommand 5 "setChannel 5 1"
    
    setButtonLabel 6 "OFFICE"
    setChannelLabel 6 OFFICE
    setButtonColor 6 GREEN
    setButtonEnabled 6 1
    
    
    setButtonLabel 7 "ROOM 1"
    setChannelLabel 7 ROOM 1
    setButtonColor 7 GREEN
    setButtonEnabled 7 1
    
    
    setButtonLabel 8 "ROOM 2"
    setChannelLabel 8 ROOM 2
    setButtonColor 8 GREEN
    setButtonEnabled 8 1
    
    //various aliases for detection and led readings
    alias NONE setButtonLabel 9 "NONE"
    alias DETECTED backlog setButtonLabel 10 "DETECTED"; setButtonColor 10 GREEN
    alias NOT_DETECTED backlog setButtonLabel 10 "NOT DETECTED"; setButtonColor 10 RED
    alias ZERO setChannel 11 0
    
    setButtonLabel 9 "LAST SELECTION"
    setButtonColor 9 GREEN
    setButtonEnabled 9 1
    addChangeHandler Channel4 == 1  if $CH9==0 then NONE
    addChangeHandler Channel5 == 1  if $CH9==0 then NONE
    addChangeHandler Channel6 == 1 setButtonLabel 9 "OFFICE"
    addChangeHandler Channel7 == 1 setButtonLabel 9 "ROOM 1"
    addChangeHandler Channel8 == 1 setButtonLabel 9 "ROOM 2"
    addChangeHandler Channel9 != 1 setButtonLabel 9 "ALL"
    
    setButtonLabel 10 "NOT DETECTED"
    setChannelLabel 10 DETECTION
    setButtonColor 10 RED
    setButtonEnabled 10 1
    
    
    //reporting the state to HA
    addChangeHandler Channel6 == 0 setChannel 11 1
    addChangeHandler Channel7 == 0 setChannel 11 2
    addChangeHandler Channel8 == 0 setChannel 11 3
    addChangeHandler Channel9 == 1 setChannel 11 4
    addChangeHandler Channel4 == 1  if $CH9==0 then ZERO
    addChangeHandler Channel5 == 1  if $CH9==0 then ZERO
    setChannelLabel 11 SELECTION
    //publishChannel 11
    
    //loop for reading states of led's and detection
    again:
    if $CH6==0&&$CH7==0&&$CH8==0 then "setChannel 9 1" else "setChannel 9 0" 
    if $CH10==0 then DETECTED else NOT_DETECTED
    delay_s 2
    goto again


    Jedną rzeczą, o której należy wspomnieć, jest to, że ustawiłem CH11 jako ReadOnly, dzięki czemu mogę opublikować wartość do HA i przekonwertować ją na sensowny odczyt za pomocą pewnych dostosowań w pliku configuraion.yaml.

    sensor:
      - platform: template
        sensors:
          location_status:
            friendly_name: "Last used"
            value_template: >
              {% set value = states('sensor.shutters_west_selection') %}
              {% if value == '0' %}
                NONE
              {% elif value == '1' %}
                OFFICE
              {% elif value == '2' %}
                ROOM 1
              {% elif value == '3' %}
                ROOM 2
              {% elif value == '4' %}
                ALL
              {% else %}
                UNKNOWN
              {% endif %}


    Stworzyłem szablon "ostatnio używany", którego mogę następnie użyć do odczytu CH11 i przekonwertować go na tekst zamiast liczb.

    Urządzenie w HA zostało wykryte:

    Widok interfejsu użytkownika przedstawiający informacje o urządzeniu BK7231N, sterowanie, automatyzacje, sceny, skrypty i diagnostykę.

    Karta niestandardowa na pulpicie nawigacyjnym HA z używanym szablonem:

    Interfejs kontrolny „Shutters West” w systemie Home Assistant z przyciskami i stanami detekcji

    Ostatecznie zdecydowałem się stworzyć niestandardową obudowę drukowaną w 3D i przeszedłem kilka iteracji projektu, aby potwierdzić wymiary i tolerancje, myślę, że zajęło mi to 8 lub 9 poprawek. Skończyło się na tym dla mojego ostatecznego projektu.

    Prezentacja projektu obudowy 3D Projekt obudowy urządzenia w SketchUp

    Zrobiłem to w SketchUp (bo jestem do tego przyzwyczajony) i załączam pliki zarówno oryginalne, jak i wyeksportowane STL.

    I na koniec tak wygląda urządzenie wraz ze stroną główną OBK:

    Białe urządzenie elektroniczne z przyciskami w obudowie 3D.
    Interfejs graficzny z przyciskami do sterowania kanałami

    Wszystko działa zgodnie z przeznaczeniem wraz z integracją i kontrolą HA.
REKLAMA