Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

p.kaczmarek2 25 Jan 2022 01:11 101133 1210
Nazwa.pl
  • [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Witajcie moi drodzy.
    Zapraszam na relację z postępów prac nad otwartym firmware dla BK7231T. Temat ten napisany będzie w formie tutoriala, przedstawię tu krok po kroku jak opracowałem własny, wieloplatformowy (działający na Windowsie i BK7231T) mini-serwer HTTP, system konfiguracji pinów przez panel WWW oraz jak połączyłem go z MQTT i docelowo z Home Assistant. Do tematu załączę pełne kody do pobrania i projekt Visual Studio dla tych którzy chcą się pobawić moim serwerem pod Windowsem.

    O co chodzi?
    W celu wyjaśnienia całej inicjatywy i celu projektu odsyłam do pierwszej części sprzed dwóch miesięcy:
    https://www.elektroda.pl/rtvforum/topic3850712.html
    Temat zakłada, że czytelnik przyswoił wiedzę z poprzedniej części!

    Zawartość tematu
    W tym temacie przedstawię:
    - jak napisać własny prosty mini-serwerek HTTP w języku C na Windowsie
    - jak przygotować ten serwerek by był wieloplatformowy i uruchomić go na WB2S/BK7231T
    - jak zorganizować sprytnie konfigurację pinów dla BK7231T w stylu Tasmoty
    - jak ostatecznie zorganizowałem konfigurację pinów oraz wsparcie dla MQTT dla mojego otwartego wsadu dla BK7231T
    - jak w przypadku bieżącej wersji projektu uruchomić mój wsad na własnym układzie z serii BK7231T (WB2S, WB3S, może inne) i podpiąć go do Home Assistant przez MQTT
    Czemu serwer będzie wieloplatformowy?
    Z następujących powodów:
    - pozwoli mi to wydajnie tworzyć stronkę WWW konfiguratora i zarządzania modułem BK7231T na Windowsie bez posiadania tego modułu fizycznie, bez potrzeby wgrywania na niego wsadu co trwa długo, itp.
    - pozwoli mi to użyć tego samego konfiguratora i strony w przypadku innej rodziny układów którą też zamierzam "otwierać", a konkretniej XR809
    - poniekąd wymusi to na mnie lepszą organizację projektu i utrzymywanie wszystkiego tak by się kompilowało na wszystkich platformach i podkreśli bardziej podział na moduły

    UWAGA - podstawy C i wyszukiwarki
    Temat postaram się przedstawić najbardziej ciekawie jak potrafię, ale z oczywistych względów nie mam jak tu tłumaczyć wszystkiego linia po linii, jak również nie będę tłumaczyć absolutnych podstaw C. W razie czego polecam zapoznać się z materiałami na temat samego tego języka oraz z dokumentacją Winsocka i działaniem HTTP oraz TCP. Dodatkowo w temacie pozwalam sobie na pewne uproszczenia, które nie powinny mieć miejsca w docelowym produkcie, takie jak np. używanie niebezpiecznej funkcji strcat (nie sprawdza ona czy w docelowym buforze jest miejsce na to co kopiujemy).

    Własny serwer HTTP - organizacja pracy
    Własny serwer HTTP postanowiłem napisać w Visual Studio C++ 2008 Express Edition. Jest to IDE w którym najwięcej pracowałem i znam je dość dobrze, więc wybór dla mnie był oczywisty, ale Wy możecie użyć dowolnego innego kompilatora C/C++.
    W tym IDE oczywiście tworzy się programy na Windowsa - serwer HTTP w początkowej fazie będzie tworzony i testowany na tej platformie.

    Własny serwer HTTP - punkt początkowy
    HTTP to protokół operujący na poziomie TCP (nie mylić z UDP). TCP zostało wybrane tutaj przez twórców HTTP ze względu na rzetelność transmisji, a dokładniej wsparcie retransmisji zagubionych pakietów, czego nie oferuje UDP (UDP jest bezpołączeniowe). Zaczniemy więc od prostego serwera TCP napisanego pod Winsockiem (który zasadniczo jest praktycznie 1:1 zgodny z socketami pod Linuxem i też tymi na BK7231T):
    Code: c
    Log in, to see the code

    Powyższy kod po uruchomieniu otwiera nasłuch na porcie 80 (nie możemy mieć go zajętego na naszej maszynie - jak mamy np. Apache (np. w pakiecie Xampp) to port będzie już zajęty i program go nie przejmie), dzięki czemu możemy do niego "zagadać" z przeglądarki internetowej (w zasadzie to można by użyć dowolnego innego portu - w adresie URL można zawrzeć port docelowy, ale nie komplikujmy).
    W razie pojawienia się klienta kod powyżej go obsługuje i utrzymuje z nim połączenie TCP.
    Najbardziej interesują nas trzy sekcje tego kodu.
    Tu następuje odebranie pakietu (recv blokuje program do momentu odebrania czegoś, choć w przypadku Berkeley sockets może być nieblokujące):
    Code: c
    Log in, to see the code

    Tu tworzymy tekst, który wyślemy:
    Code: c
    Log in, to see the code

    Tu go wysyłamy:
    Code: c
    Log in, to see the code

    Czy to działa?
    Uruchamiamy program:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    W przeglądarce trzeba wpisać jakiś adres. Można też wpisać IP. Nasze IP (te w sieci LAN - typu 192.168 itp) można poznać np. poprzez komendę ipconfig, ale przecież jest łatwiejszy sposób na odniesienie się do naszej maszyny. Można użyć adresu localhost, czyli 127.0.0.1:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Jak widzimy, serwer odpowiedział "This is an example reply from my server". A co odebrał?
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Widzimy tu treść przykładowego zapytania GET. Poniżej umieszczam ją jako tekst, dla wygody:
    
    GET / HTTP/1.1
    Host: 127.0.0.1
    Connection: keep-alive
    Cache-Control: max-age=0
    sec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="97", "Chromium";v="97"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: none
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Accept-Encoding: gzip, deflate, br
    Accept-Language: pl,en;q=0.9,en-GB;q=0.8,en-US;q=0.7
    

    Najważniejsza jest możliwość nawigowania po stronach - zobaczmy, jak zmieni się pakiet gdy zapytamy np. o podstronę index:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Nasz index pojawia się tutaj:
    
    GET /index HTTP/1.1
    Host: 127.0.0.1
    Connection: keep-alive
    

    A jak wygląda sytuacja z argumentami zapytania GET? To są te argumenty które nawet widzimy na Elektrodzie gdy piszemy wiadomość, np:
    
    https://www.elektroda.pl/rtvforum/privmsg.php?mode=reply&p=6195972
    

    Jak nasz serwer je wyświetli?
    W ten sam sposób:
    
    GET /rtvforum/privmsg.php?mode=reply&p=6195972 HTTP/1.1
    Host: 127.0.0.1
    Connection: keep-alive
    

    Zaraz się zajmiemy tego parsingiem, ale najpierw jeszcze drobna poprawka.
    Nasz program wyświetla dziwne znaki po odebranym pakiecie:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    To dlatego, że pakiet nie zawiera tzw. NULL terminating character, czyli bajtowego zera oznaczającego koniec napisu w ASCII. Dodamy je ręcznie:
    Code: c
    Log in, to see the code

    Dodałem ustawienie następnego kolejnego bajtu (spoza pakietu, bo adresujemy tablice w C od 0) na 0, czyli na te słynne NULL. Dodatkowo zmniejszyłem rozmiar dostępnego bufora o 1, by w razie czego nie wyjść poza jego zakres.

    Własny serwer HTTP - parsing bieżącej strony
    Parsing bieżącej strony, czyli wyłuskanie docelowego adresu zasobu na serwerze, zrealizuję całkiem od 0. Można to zrobić na różne sposoby, można skopiować ten adres do innej zmiennej (takie sprytniejsze strcpy), albo można go sprawdzać "w miejscu" i tylko otrzymywać rezultat true/false czy jest on zgodny z danym...
    Ale na początek musimy sprawdzić, czy to w ogóle jest zapytanie GET. Do tego przygotowałem własną funkcję http_startsWith:
    Code: c
    Log in, to see the code

    Funkcja po kolei porównuje dwa ciągi znaków, przechodzi znak po znaku. ++ zwiększa wskaźnik o jedną jednostkę (tutaj wskazuje na char, typ o rozmiarze bajta, więc o jeden bajt).
    Teraz obsługa pakietu wygląda tak:
    Code: c
    Log in, to see the code

    Program odrzucać będę zapytania bez nagłówka "GET". Teraz przejdźmy dalej, zróbmy funkcję, która sprawdza czy adres zasobu żądany przez klienta jest zgodny z daną nazwą:
    Code: c
    Log in, to see the code

    Funkcja działa podobnie jak poprzednia, z tą różnicą, że przerywa porównywanie w momencie napotkania spacji lub pytajnika. To dlatego, że w zapytaniu:
    
    https://www.elektroda.pl/rtvforum/privmsg.php?mode=reply&p=6196006
    

    adres zasobu (pliku php) kończy się przed pytajnikiem, dalej są argumenty GET.
    Spróbujmy użyć naszej funkcji:
    Code: c
    Log in, to see the code

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    To działa! Rozpoznaje o jaką stronę pytamy.

    Własny serwer HTTP - parsing argumentów
    Teraz pora wczytać jakoś argumenty które znajdują się po znaku zapytania w treści żądania GET. Format argumentów jest dość prosty, mamy znak zapytania, potem nazwę zmiennej, znak równości, wartość zmiennej i jeśli jest coś dalej, to znak & i następną zmienną.
    
    rtvforum/privmsg.php?mode=reply&p=6196006
    

    To też wczytamy samodzielnie. Tym razem jednak przerzucimy wartość zmiennej do osobnego bufora. W tym przypadku istnieje duże ryzyko problemów typu "buffer overflow" i w wersji produkcyjnej należy dokonać wszelkich starań by nie było to możliwe, ale w przypadku tej demonstracji nie będę tego głębiej omawiać. Dodam jedynie, że przekroczenie rozmiaru bufora pozwalać może nawet na zdalne wykonanie złośliwego kodu w naszym programie...
    Code: c
    Log in, to see the code

    Mam tutaj osobno funkcję sprawdzającą nazwę argumentu oraz osobno kopiującą jego zawartość do zewnętrznego bufora. Ważna jest tutaj obsługa znaków takich jak & i ' ' oraz bajtowe zero, które mówią nam, że musimy przerwać parsing.
    Nie twierdzę tutaj, że moje podejście jest najlepsze (bo tutaj iteruję w tym wywołaniu funkcji http_getArg wszystkie argumenty, a gdy będę chciał wczytać 5 argumentów różnych, to będę 5 razy od 0 iterować wszystkie), ale na taką skalę to nie ma żadnego znaczenia.
    W ramach demonstracji tego parsingu zróbmy prosty kalkulator:
    Code: c
    Log in, to see the code

    Program sprytnie sprawdza, czy oba argumenty są dostępne. Jeśli tak, to wyświetla ich sumę (atoi zamienia napis na integer, a sprintf zamienia m. in. integery na napis), a jeśli nie, to pokazuje odpowiedni komunikat:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Program działa! Nasz własny kalkulator napisany od 0 w HTTP już umie liczyć.
    Teraz jeszcze trzeba wysłać odpowiedź zgodnie ze sztuką... a nie jako zwykły napis.

    Własny serwer HTTP - wysyłanie odpowiedzi
    Co takiego powinien wysłać nam serwer w odpowiedzi na żądanie GET?
    Najlepiej przekonać się w praktyce. Użyłem do tego Wiresharka - narzędzia do przechwytywania pakietów:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Widać, że odpowiedź składa się z dwóch warstw:
    - warstwa HTTP
    - sama treść odpowiedzi (z reguły html, choć może też być obrazek, itp, w zależności od content type)
    Odpowiedź można uprościć do:
    
    HTTP/1.1 200 OK\r\n
    Content-Type: text/plain\r\n
    \r\n
    

    Najpierw mamy słynny kod 200 OK (analogicznie do 404 które pewnie kojarzycie), a potem rodzaj zawartości. Potem jedna pusta linia - ona też jest ważna.
    Wpiszmy to w kod:
    Code: c
    Log in, to see the code

    Oczywiście Content-type mogą też być inne (np. dla obrazka), ale tu tego nie potrzebujemy. Format text/plain będzie dla plików Javascript, które być może w przyszłości też się przydadzą.
    Oraz przygotujmy funkcję pomocniczą inicjującą nagłówek HTTP:
    Code: c
    Log in, to see the code

    No i zróbmy jakąś zawartość strony HTTP:
    Code: c
    Log in, to see the code

    Czy to działa?
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Nasza pierwsza strona HTML napisana na własnym serwerze HTTP już działa!

    Własny serwer HTTP - wieloplatformowość
    Odeszliśmy troszkę od tematu WB2S/BK7231T, ale teraz już pora do niego wrócić.
    Zastanówmy się - jak możemy zorganizować nasz serwer, by jednocześnie działał na Windowsie i na WB2S?
    Trzeba dokonać cięcia - wydzielamy rzeczy Windowsowe w jedno miejsce, w HTTPowe w drugie.
    Od teraz mój stary plik main.c (gdzie jest kod winsocka) nazywa się win_main.c i zawiera m. in:
    Code: c
    Log in, to see the code

    Funkcja HTTP_ProcessPacket jest w innym pliku, ona bierze za argument wejściowy pakiet oraz wyjściowy bufor (tak tak, trzeba potem dodać kontrolę czy nie przekraczamy zakresu).
    Funkcja HTTP_ProcessPacket od teraz jest w nowym pliku - new_http.c:
    Code: c
    Log in, to see the code

    Oczywiście trzeba też zrobić nagłówek (plik .h, header i móc go #include) - ale zakładam, że znamy C...
    Code: c
    Log in, to see the code

    Ta funkcja pozwala nam użyć naszego serwera na dowolnej platformie, w tym na BK7231T.
    Na BK7231T wpinamy się w kod TCP (tylko ustawiamy, by nasłuchiwał na porcie 80) w ten sposób:
    Code: c
    Log in, to see the code

    Kod z innych platform można też Visualu wyłączyć w ustawieniach pliku:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Albo poprzez preprocesor (to jest wygodne dla sekcji kodu):
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Potem w kodzie używamy:
    Code: c
    Log in, to see the code

    Instrukcje preprocesora wykonują się w trakcie kompilacji.
    I zasadniczo wszystko gotowe - serwer działa na dwóch platformach!
    Oczywiście, to nie jest takie proste jak się wydaje - w przypadku użycia wątków należy pamiętać m. in. o rozsądnym zarządzaniu zasobami oraz o tym, by nie używać niepoprawnie zmiennych globalnych, ale "thread-safety" to już na inny temat zostawię...

    Bardziej zaawansowane strony
    Analogicznie utworzyłem stronę konfiguracyjną dla mojego wsadu dla BK7231T:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Code: c
    Log in, to see the code

    Code: c
    Log in, to see the code

    Druga strona:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Code: c
    Log in, to see the code

    Myślę, że powyższe przykłady dobrze przedstawiają jak wygląda tworzenie HTML z poziomu kodu. Oczywiście w przypadku konfiguratora pinów jest to bardziej skomplikowane...

    Konfigurator pinów dla BK7231
    Temat HTML na razie możemy zamknąć. Drugą ważną rzeczą którą musiałem opracować dla własnego firmware był konfigurator pinów w stylu tego z Tasmoty. Podstawowe założenie było takie, że ma on działać też na Windowsie by można było wygodnie testować.
    Konfigurator Tasmoty wygląda tak:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Tak wygląda mój odpowiednik:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Puste pola to miejsce na numer kanału (przekaźnika), kanałów może być dowolna ilość (no dobra, w sumie to tylko 32, a czemu to wyjaśni się potem).
    Od strony implementacji zdecydowałem się reprezentować piny i kanały następującą strukturą:
    Code: c
    Log in, to see the code

    Roles to są role pinów, a channels to kanały.
    Role opisuje też enumeracja:
    Code: c
    Log in, to see the code

    Sufiks "_n" oznacza negację, czyli np. dioda LED która zamiast świecić się gdy dany kanał jest ustawiony na 1, to świeci się gdy ustawiony jest na 0.
    Z tych struktur można wyciągnąć już pewne wnioski:
    - możemy mieć kilka przekaźników na kanale 1 i one będą wspólnie pracować
    - typy Relay i LED tak naprawdę działają tak samo, są tylko dla wygody użytkownika rozdzielone
    - możemy mieć np. Relay bez przycisku (wtedy steruje się go tylko przez internet), jak również przycisk bez Relay/bez LED (co teraz się nie przyda, ale docelowo pewnie dodam możliwość wyzwalania zdarzeń)
    Nagłówek systemu pinów nazywa się new_pins.h i ma następującą treść:
    Code: c
    Log in, to see the code

    Funkcje powyżej stanowią interfejs pinów wywoływany z obsługi HTTP:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Sam kod generujący tę stronę przedstawiam poniżej:
    Code: c
    Log in, to see the code

    Przede wszystkim widać tutaj jak kod obsługi HTTP korzysta z interfejsu systemu pinów. Drugie co widzimy to to, że przyciski są generowane automatycznie na bazie tego co ustawił użytkownik. Kolejną rzeczą jest obsługa przełączania stanu przycisków - czyli odebranie argumentu GET i wywołanie CHANNEL_Toggle.
    Jest tu nieco miejsca na ulepszenia - teraz żądanie GET zawsze wykonuje toggle, więc jeśli po drodze ktoś inny nam przełączy przekaźnik to możemy być zaskoczeni, że pozornie "nie działa" chwilowo strona. Tak samo np. strona nie odświeża się sama (można dać javascript krótki by się sama odświeżała albo odświeżać jej samą część poprzez Ajax).
    Jeszcze popatrzmy na implementację konfiguratora, poniżej zrzut ekranu i kod:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Code: c
    Log in, to see the code

    Dla wygody dodałem wykrywanie tego ile rzeczywiście zmieniło się pól.
    UWAGA: To wszystko powyżej (razem z przełączaniem wartości kanałów/przekaźników) można w moim wsadzie testować w wersji na Windows! Nie trzeba nawet mieć WB2S by to rozwijać i nad tym pracować. Bardzo wygodne.

    Podpięcie obsługi pinów dla BK7231
    Mój konfigurator pinów wraz z serwerem HTTP działają w pełni na Windowsie. Jest to możliwe dlatego, że kod obsługi pinów powiązany z BK7231T jest odpowiednio wydzielony w pliku new_pins.c:
    Code: c
    Log in, to see the code

    Natomiast sama zmiana wartości kanału jest niezależna od platformy:
    Code: c
    Log in, to see the code

    Tak, jeden int reprezentuje wartości kanałów - jeden bit to jeden kanał. Dlatego limitem ilości kanałów jest teraz 32, 32 bity w integerze na platformie 32-bitowej.


    Podpięcie obsługi MQTT (wysyłanie zmian kanałów do serwera MQTT)
    O samym MQTT pisałem już w pierwszej części. Tutaj pokażę tylko kiedy i jak rozsyłana jest informacja o tym, że użytkownik nacisnął fizyczny przycisk na obudowie i zmienił stan urządzenia.
    Służy do tego ten callback (wskaźnik na funkcję):
    Code: c
    Log in, to see the code

    Zobaczmy, jak wygląda użycie CHANNEL_SetChangeCallback, już po stronie BK7231T, w tuya_device.c:
    Code: c
    Log in, to see the code

    Kod w powyższej wersji nie rozróżnia tego który kanał został zmodyfikowany, jedynie po prostu wykonuje MQTT publish wartości kanału pierwszego (CHANNEL_Check(1)) do serwera MQTT z którym jest połączony.

    Podpięcie obsługi MQTT (odbieranie poleceń z Home Assistant)
    Analogicznie zrealizowana jest komunikacja w drugą stronę. Od MQTT można odebrać polecenie zmiany wartości kanału na inną (na 1 lub 0) i wtedy musimy użyć CHANNEL_Set by ją propagować dalej do pinów.
    Odbiór tego przez MQTT wygląda tak:
    Code: c
    Log in, to see the code

    Mamy osobno funkcje dla publish (nazwa zmiennej) i data (jej wartość), ale w tej chwili tego nie używam by nie komplikować. Po prostu zakładam, że jest jeden kanał i to starcza dla prostych sytuacji.

    Możliwość zrobienia konfiguracji na sztywno w kodzie
    Bieżąca wersja projektu nie wspiera zapisu ustawień do pamięci Flash, więc warto jest skonfigurować wszystko pod nasze urządzenie w kodzie. U mnie wygląda to tak:
    Code: c
    Log in, to see the code

    Ustawienia powyżej działają dobrze na SmartSwitch Tuya WL-SW01_16 16A:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    Podłączenie do Home Assistant
    Podłączenie do Home Assistant jest bardzo proste. Wymaga modyfikacji pliku configuration.yaml, gdzie podajemy m. in. jakiego publish MQTT nasłuchujemy:
    
    switch:
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S" # Choose an easy-to-recognize name
        state_topic: "wb2s/get" # Topic to read the current state
        command_topic: "wb2s/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
    

    [i]UWAGA: ostateczna wersja kodu z tego tematu wymaga innego formatu nazw MQTT, już nie wb2s/get tylko wb2s/1/get gdzie 1 to nazwa kanału/przekaźnika, szczegóły później.
    Analogicznie, po stronie WB2S też trzeba uzupełnić namiary na nasz serwer MQTT oraz odpowiednio nazwy komend:
    Code: c
    Log in, to see the code

    Code: c
    Log in, to see the code

    Code: c
    Log in, to see the code

    Pełny kod w załączniku na końcu tematu.


    Prezentacja działania - wersja z jednym przekaźnikiem
    Poniżej prezentacja działania na filmiku:



    Jak widać (mam nadzieję - bo są problemy z odtwarzaczem elektrody na niektórych przeglądarkach) Home Assistant momentalnie reaguje na naciśnięcie przycisku fizycznego na urządzeniu, a urządzenie reaguje momentalnie na kliknięcie zmiany stanu na stronie Home Assistant. Komunikacja odbywa się sprawnie i szybko, jest bardzo responsywna.
    Jedyne czego brakuje to odświeżania własnej strony urządzenia, ale to można dodać dość łatwo poprzez skrypt JS.

    Wsparcie wielu przekaźników na jednym urządzeniu
    Wsparcie wielu przekaźników na jednym urządzeniu okazało się być dość proste do zrealizowania. Udało się to przede wszystkim dzięki tzw. MQTT wildcards, które pozwalają nasłuchiwać wielu tematów jednocześnie.
    Zmodyfikowane ustawienie subskrybcji z wildcard (znak +) wygląda tak:
    Code: c
    Log in, to see the code

    Ten kod powyżej służy do odbierania informacji o zmianach z Home Assistant przez MQTT.
    Samo odbieranie subskrybcji wymaga teraz wyłuskania i zapisania indeksu kanału (jak na razie zrobiłem to w banalny sposób, potem się poprawi):
    Code: c
    Log in, to see the code

    Wildcard (plus) zastępowany jest indeksem kanału.
    Samo rozgłoszenie zmiany z poziomu WB2S/WB3S wygląda teraz tak:
    Code: c
    Log in, to see the code

    Po prostu w wiadomości zachowywany jest też indeks kanału (przekaźnika).
    Do testów użyłem tego sterownika 4 przekaźników na WB3S:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Teraz też zmienia się sposób definiowania przekaźników w Home Assistant w configuration.yaml. Od teraz wygląda to tak:
    
    switch:
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S" # Choose an easy-to-recognize name
        state_topic: "wb2s/1/get" # Topic to read the current state
        command_topic: "wb2s/1/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S2" # Choose an easy-to-recognize name
        state_topic: "wb2s/2/get" # Topic to read the current state
        command_topic: "wb2s/2/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S3" # Choose an easy-to-recognize name
        state_topic: "wb2s/3/get" # Topic to read the current state
        command_topic: "wb2s/3/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S4" # Choose an easy-to-recognize name
        state_topic: "wb2s/4/get" # Topic to read the current state
        command_topic: "wb2s/4/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
    

    Kilka wyjaśnień:
    - "wb2s" tutaj to nazwa własna urządzenia (jak mamy dwa urządzenia, to trzeba będzie ją zmienić np. w kodzie...)
    - w nazwie "wb2s/X/get" znak X oznacza numer kanału (numer przekaźnika)
    - jak mamy pojedynczy przekaźnik, to używamy tylko "wb2s/1/get" oraz "wb2s/1/set"
    - wartości payload mówią co wysyłamy (lub odbieramy) by określić stan urządzenia, tutaj po prostu 1 lub 0
    Rezultat:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    Co wymaga moduł WB2S do uruchomienia?
    Nie do końca byłem pewny gdzie powinienem umieścić ten akapit, więc po prostu go tutaj zostawię.
    Otrzymałem od @pixelo kilka wylutowanych modułów WB2S, które są jak znalazł do testów.
    Sprawdziłem, że taki moduł nie wymaga żadnych zewnętrznych podłaczeń oprócz zasilania 3.3V do działania. Można go też łatwo programować.
    Poniżej fotorelacja z lutowania/uruchomienia:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Tak przygotowany moduł działa, jeden UART służy do programowania, drugi do odbierania logu.
    Samych połączeń nie opisuję, gdyż je opisywałem w pierwszym temacie z serii.

    Jak dodać wsparcie nowego urządzenia?
    Poniżej przedstawiam pełną instrukcję dodawania wsparcia nowego urządzenia z BK7231T do bieżącej wersji mojego projektu.
    1. Pobierz ostatnią wersję SDK z tego tematu (uzupełnij ją brakujący toolchain w \platforms\bk7231t\toolchain)
    2. Uzupełnij dane w apps\my_alpha_demo\src\tuya_device.c
    - SSID i hasło w connect_to_wifi
    - MQTT nazwę użytkownika i hasło w mqtt_connect_client_info_t
    - IP serwera MQTT w ipaddr_aton
    - opcjonalnie zmień nazwę urządzenia w pakietach MQTT w tuya_device.c, tzn. w "wb2s/+/set" zmień "wb2s" na unikalną nazwę, inną dla każdego urządzenia w Twojej sieci (analogicznie dla get)
    3. Uzupełnij konfigurację pinów w apps\my_alpha_demo\src\tuya_device.c w device_init:
    Code: c
    Log in, to see the code

    4. Skompiluj projekt "my_alpha_demo" wedle instrukcji stąd:
    https://www.elektroda.pl/rtvforum/topic3850712.html
    5. Wgraj "my_alpha_demo" wedle instrukcji stąd:
    https://www.elektroda.pl/rtvforum/topic3850712.html
    6. Uzupełnij configuration.yaml z Home Assistant wedle wzorca:
    
    switch:
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S" # Choose an easy-to-recognize name
        state_topic: "wb2s/1/get" # Topic to read the current state
        command_topic: "wb2s/1/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S2" # Choose an easy-to-recognize name
        state_topic: "wb2s/2/get" # Topic to read the current state
        command_topic: "wb2s/2/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S3" # Choose an easy-to-recognize name
        state_topic: "wb2s/3/get" # Topic to read the current state
        command_topic: "wb2s/3/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
        
      - platform: mqtt # Again, it's an MQTT device
        name: "WB2S4" # Choose an easy-to-recognize name
        state_topic: "wb2s/4/get" # Topic to read the current state
        command_topic: "wb2s/4/set" # Topic to publish commands
        qos: 1
        payload_on: 0 # or "on", depending on your MQTT device
        payload_off: 1 # or "off", depending on your MQTT device
        retain: true # or false if you want to wait for changes
    

    Gotowe!
    Konfigurator pinów jest dostępny, ale on nie zapisuje jeszcze ustawień w pamięci Flash, więc zasadniczo pozwala nam tylko się pobawić i poeksperymentować.

    Wsparcie testowania na systemie Windows
    Ostateczna wersja projektu (ta którą tu publikuję) wspiera wciąż kompilację serwera HTTP oraz systemu pinów/przekaźników/kanałów pod system Windows poprzez środowisko Visual Studio - po prostu otwieramy projekt myHTTP2022.vcproj z folderu my_alpha_demo i kompilujemy. Po uruchomieniu postawi on nam serwer na porcie 80 na naszej maszynie. Dzięki temu można znacznie łatwiej i szybciej rozwijać cały moduł HTTP z projektu, testować wyglądów różnych stron, zmieniać podział na podstrony, itp.

    Dalszy rozwój projektu
    Oczywiście to jest tylko wstępna wersja demonstracyjna i niedługo zamierzam dodać:
    - łatwiejszą obsługę urządzeń MQTT (losowa nazwa bazująca na adresie MAC urządzenia, możliwość zmiany tej nazwy przez WWW)
    - zapis ustawień do pamięci flash tak by nie trzeba było rekompilować projektu zawsze
    - system resetowania urządzenia i konfigurowania go przez otwartą sieć WiFi
    - wsparcie XR809 (ten sam kod HTTP będzie i organizacja dla dwóch różnych rodzin mikrokontrolerów)
    - być może przeniosę częściowo się na Ajaxa z tym panelem HTTP strony, chociażby dla odświeżania stanów przycisków/przekaźników...

    Wsparcie projektu
    Jeśli podoba Ci się pomysł i inicjatywa, to możesz wesprzeć projekt poprzez
    - testowanie (za jakiś czas założę repozytorium github pod oba projekty, bo robię też wsad open source dla XR809)
    - gromadzenie informacji w jakich urządzeniach są jakie moduły (możecie wysyłać zdjęcia, itp, chociażby w tym temacie. Wiem o liście https://templates.blakadder.com/ )
    - darowiznę paypal:
    https://paypal.me/openshwprojects

    (trochę tych różnych urządzeń jest a ja docelowo chcę przetestować ich jak najwięcej, zresztą dużo już teardown umieściłem w https://www.elektroda.pl/rtvforum/forum507.html , środki pójdą na zakup kolejnych urządzeń )
    - jeśli macie jakieś np. moduły z BK7231T które wam zostały po zamianie na ESP12F lub uszkodzone urządzenia smart itp to mogę je przyjąć do testów (kontakt PW)
    Jest znacznie więcej podobnych modułów do WB2S i WB3S, każdy z nich zamierzam docelowo wspierać.

    Podsumowanie
    W ten sposób projekt "uwolnienia" BK7231T zaczyna naprawdę nabierać kształtów. Z kilku prostych demek UDP, TCP, HTTP i MQTT prezentowanych w poprzedniej części udało mi się już zrobić pierwszy rzeczywiście praktyczny wsad, który w ostateczności można by już wykorzystywać w normalnym 'smart' domu do sterowania oświetleniem i nie tylko (jak nie dodamy Relay to możemy odczytywać stany "Buttonów" i na ich bazie działać w Home Assistant, więc czujnik otwarcia drzwi itp czy tam zalania też jest wspierany).
    To oczywiście nie jest koniec, następna aktualizacja wkrótce. Jeśli podoba się Wam inicjatywa to dajcie znać, muszę wiedzieć ile mamy potencjalnych użytkowników i jakie jest zainteresowanie całą ideą.
    Na koniec chciałbym podziękować @strigona i @PIXELLO za podarowanie mi modułów do testów.

    Cool? Ranking DIY
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • Nazwa.pl
  • #2
    lemgo
    Level 14  
    Dopóki kod, opis itp nie znajdzie się na jakimś publicznym repo - nie liczyłbym na jakikolwiek odzew
    Forum elektrody to nie jest najlepsze narzędzie do kolaboracji.

    Dlaczego tak archaiczne VS?

    Mogę zasugerować o kodzie jedno zdanie? Jakieś 30 lat temu odeszliśmy od deklarowania zmiennych na początku funkcji.
  • #3
    khoam
    Level 42  
    @p.kaczmarek2 Sądzę, że przydałaby się w kodzie drobna diagnostyka błędów w postaci sprawdzania wynika działania funkcji atoi(). Taka luźna uwaga ;)

    lemgo wrote:
    Jakieś 30 lat temu odeszliśmy od deklarowania zmiennych na początku funkcji.

    A kto konkretnie? :) Nie ma w tym nic niepoprawnego i jest to bardziej kwestia stylu.
  • #4
    mpier
    Level 28  
    p.kaczmarek2 wrote:
    - gromadzenie informacji w jakich urządzeniach są jakie moduły (możecie wysyłać zdjęcia, itp, chociażby w tym temacie.

    Hama 176581, LED, 10W, 806lm, E27: WB2L.
    Kupiłem w Biedronce za 14,99zł. Liczyłem na esp8266, podobno kiedyś takie robili.

    Pozdrawiam.
  • #5
    p.kaczmarek2
    Moderator Smart Home
    lemgo wrote:
    Dopóki kod, opis itp nie znajdzie się na jakimś publicznym repo - nie liczyłbym na jakikolwiek odzew

    Repozytorium będzie założone za kilka dni, bo już kilka osób o to pytało. Zwłoka jest zasadniczo stąd, że chciałem sobie zorganizować w jednym repo dwa projekty (wsparcie XR809 i BK7231T razem ze współdzielonym konfiguratorem) ale chyba na razie skupię się na BK...

    lemgo wrote:
    Dlaczego tak archaiczne VS?

    W przypadku tak prostego projektu jak jeden plik z Winsockiem + kilka plików z czystym C to naprawdę każdy nawet student powinien umieć sobie to skompilować w każdym innym VS czy tam Code Blocks, ja z 2008 korzystam z przyzwyczajenia i bo jest bardzo lekkie. Mam też oczywiście nowsze Visuale do poważniejszych projektów.

    lemgo wrote:
    Mogę zasugerować o kodzie jedno zdanie? Jakieś 30 lat temu odeszliśmy od deklarowania zmiennych na początku funkcji.

    Wydaje mi się, że w pewnych standardach się to nie skompiluje, np tutaj:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    khoam wrote:
    @p.kaczmarek2 Sądzę, że przydałaby się w kodzie drobna diagnostyka błędów w postaci sprawdzania wynika działania funkcji atoi(). Taka luźna uwaga ;)

    Akurat sprawdzania błędów w wielu miejscach nie robiłem, jeszcze nie jestem pewny na ile to się rozwinie i czy wszystko się sensownie ułoży. Mam taki zwyczaj, że jak robię na próbę czegoś prototyp to pomijam pewne rzeczy oraz daję optymistyczne założenia, że użytkownik np. na siłę nie przepełni mi bufora.


    mpier wrote:

    Hama 176581, LED, 10W, 806lm, E27: WB2L.
    Kupiłem w Biedronce za 14,99zł. Liczyłem na esp8266, podobno kiedyś takie robili.

    Super pomocna wiadomość, zobaczę czy u mnie są w sprzedaży, bo jakoś nigdy nie widziałem niczego smart u mnie w mieście w biedronkach. A może ktoś taka ma?

    WB2L jeszcze nie testowałem i z chęcią bym go sprawdził
  • Nazwa.pl
  • #7
    p.kaczmarek2
    Moderator Smart Home
    @Hellcube , przygotuj konwerter UART, podłącz go zgodnie z instrukcjami z pierwszej części i na razie zgraj bieżące oprogramowanie przez niego by mieć kopię zapasową.

    Nie widzę wyraźnie na zdjęciach oznaczeń elementów, ale ten duży układ to chyba mikrokontroler - HOLTEK BS6600? Jeśli to mikrokontroler a BK7231T komunikuje się z nim poprzez UART to trzeba będzie troszkę dopisać do bieżącej wersji oprogramowania, pewnie jakieś proste wsparcie TuyaMCU:
    https://tasmota.github.io/docs/TuyaMCU/#tuyasend-command

    Gdzie kupowałeś te włączniki, przydałby mi się jeden do testów, 100% zdalnie ciężko będzie uruchomić TuyaMCU na BK7231T a nie mam do dyspozycji żadnego podobnego smart device jak Twoje.

    Moje tematy o urządzeniach smart/wifi z komunikacją UART:
    https://www.elektroda.pl/rtvforum/topic3819498.html
    https://www.elektroda.pl/rtvforum/topic3825966.html
  • #8
    ex-or
    Level 28  
    p.kaczmarek2 wrote:
    Format text/plain będzie dla plików Javascript

    MIME type dla javascriptu to text/javascript
  • #9
    p.kaczmarek2
    Moderator Smart Home
    ex-or wrote:

    MIME type dla javascriptu to text/javascript

    Serio? Wygląda na to, że masz rację.
    O kurde, to w takim razie jestem w błędzie gdzieś od 5 lat, bo jak zaczynałem zabawę z HTTP na mikrokontrolerach, na PIC18F67J60 to w ich przykładzie (HTTPDemo od MikroC) skrypty JS latały na "text/plain". Dzięki za korektę. Ale grunt, że działało.
  • #10
    p.kaczmarek2
    Moderator Smart Home
    Duża aktualizacja - konfigurator działa, nie ma potrzeby kompilowania oprogramowania dla każdego użytkownika!

    Aktualna instrukcja instalacji (2022.01.28):
    1. Pobierz openbk7231t_20220128_UA.bin stąd:
    https://github.com/openshwprojects/OpenBK7231T/tree/master/releases
    2. Użyj metody z tego tematu, aby wypalić oprogramowanie układowe na BK7231T:
    https://www.elektroda.com/rtvforum/topic3850712.html
    UWAGA: zamiast ponownie zasilać chip, możesz spróbować zresetować go za pomocą pinu CEN
    3. Połącz się z utworzonym Wi-Fi:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    4. Skonfiguruj połączenie z Wi-Fi (nie wpisuj błędnie SSID/hasła):
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    BK nie zresetuje się teraz automatycznie, musisz sam go wyłączyć!
    5. Znajdź adres IP nowego urządzenia, które połączyło twoją sieć:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    6. Wpisz ten adres IP w przeglądarce, przejdź do Szybkiej konfiguracji, jeśli masz jedno z już przetestowanych urządzeń:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Lub ręcznie ustaw role pinów (może być konieczne ponowne włączenie urządzenia, aby w pełni zadziałało):
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Teraz możesz sterować przekaźnikami itp. z panelu WWW urządzenia:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    7. Skonfiguruj również połączenie MQTT:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    8 Teraz wygeneruj konfigurację Home Assistant - przejdź do generatora Home Assistant Cfg:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Skopiuj i wklej do configuration.yaml, ale nie powtarzaj słowa kluczowego "switches", powinno być tylko raz.
    Możesz zmienić wyświetlane nazwy urządzeń.
    9. Zrestartuj Home Assistant i oto jest:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    Jak dotąd brak obsługi TuyaMCU, brak PWM, ale to już wkrótce.

    PS: Istnieje prosty wbudowany mechanizm zabezpieczający przed awariami na wypadek utraty dostępu do Wi-Fi lub wprowadzenia błędnych danych kredytowych.
    Musisz mieć przynajmniej pin skonfigurowany jako przycisk.
    Włącz moduł, włącz i szybko wykonaj "podwójne kliknięcie" na przycisk wiele razy. Poczekaj kilka sekund, wyłącz układ, włącz ponownie i znów będzie to sieć o otwartym dostępie.
  • #12
    p.kaczmarek2
    Moderator Smart Home
    Protokół flashowania Bekena różni się od ESP, więc nie możesz po prostu użyć esptool.py lub czegoś podobnego. To musi być Beken Writer, dla Twojej wygody załączam kopię w tym poście.

    Był też użytkownik @btsimonh , który (jeśli dobrze pamiętam) przeportował/skompilował BK writera w Pythonie, ale do tej pory nie korzystałem z jego wersji.
  • #13
    MrTechGadget
    Level 2  
    Tego się obawiałem, widzę tylko plik binarny Windows, a nie Linuksa czy OSX, więc będę musiał wykopać urządzenie z Windowsem. Jeśli istnieje inna opcja, chciałbym ją wypróbować.
  • #14
    p.kaczmarek2
    Moderator Smart Home
    Wypróbujmy więc ten hid_download zmodyfikowany przez @btsimonh :

    https://github.com/btsimonh/hid_download_py

    "uruchom to, a następnie ponownie włącz urządzenie, powtarzając, aż zacznie migać"
    
    python uartprogram simon_light_pwm_demo_UA_1.0.0.bin -d com4 -w
    


    EDYTOWAĆ: WAŻNY lepiej jest zresetować moduł przez zerowanie tymczasowego CEN do masy zamiast całkowitego odłączenia zasilania. Odłączenie zasilania i ponowne podłączenie powoduje problemy ze stabilnością (czasami programowanie kończy się niepowodzeniem) na niektórych ściemniaczach LED WB3S PWM
  • #15
    btsimonh
    Level 11  
    używam mojego (bekena :) ) uartdownload wyłącznie z hi_download_py - ale w systemie Windows. Proszę zgłosić sukces na Linuksie? A jeśli ktoś spróbuje podłączyć RTS, proszę również zgłosić sukces na
    https://github.com/OpenBekenIOT/hid_download_py/issues
    lub zaktualizuj wiki....
    (Zauważ, że repozytorium zostało przeniesione....)
  • #16
    p.kaczmarek2
    Moderator Smart Home
    btsimonh wrote:
    używam mojego (bekena :) ) uartdownload wyłącznie z hi_download_py - ale w systemie Windows. Zgłoś sukces w systemie Linux


    Jeśli (mam na myśli @MrTechGadget) masz jakieś problemy z tym uartdownloadem beken python, zawsze mogę pomóc, mam pod ręką wiele maszyn wirtualnych z systemem Linux i jedną maszynę fizyczną. Jeden ma Ubuntu, drugi Debian itd...

    Rozpocząłem prace nad obsługą PWM i na razie się na tym skoncentruję:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Oto historia tego ściemniacza LED WB3S (wraz z NAPRAWĄ):
    https://www.elektroda.pl/rtvforum/topic3798114.html
    I to jest ściemniacz, który ma losowe problemy z programowaniem BKwriter podczas korzystania z metody ,,wyłącz i włącz". Ładnie się programuje, gdy zamiast tego używam metody ,,przeciągnij CEN do masy, aby zresetować".
  • #17
    ferbulous
    Level 15  
    Cześć, wielkie dzięki za udostępnienie tego
    Mam to urządzenie przełączające z wb3s
    Niektóre pytania dotyczące flashowania oprogramowania układowego
    Czy są jakieś piny, które muszę ściągnąć, tak jak musimy uziemić gpio z esp?
    Wygląda na to, że muszę tylko podłączyć się do poniższych pinów, zrestartować urządzenie i uruchomić bk-writer? [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
  • #18
    p.kaczmarek2
    Moderator Smart Home
    ferbulous wrote:
    Cześć, wielkie dzięki za udostępnienie tego

    Nie ma problemu, oprogramowanie układowe wkrótce stanie się bardziej wyszukane! Aktywnie poszukuję również kolejnych urządzeń do obsługi, mam nadzieję, że wkrótce dostanę kilka inteligentnych żarówek BK7231T. Zamieszczę tutaj zdjęcia, gdy paczki dotrą.

    Również prezentowa inteligentna wtyczka (wersja brytyjska) od @strigona jest wciąż w drodze do Polski!

    ferbulous wrote:

    Czy są jakieś piny, które muszę ściągnąć, tak jak musimy uziemić gpio z esp?

    Nie

    ferbulous wrote:

    Wygląda na to, że muszę tylko podłączyć się do poniższych pinów, zrestartować urządzenie i uruchomić bk-writer?

    Tak, a przez ,,reboot the device" najpierw miałem na myśli ,,power off and power on", ale teraz myślę, że lepszym sposobem jest zresetowanie/reboot z tymczasowym podłączeniem CEN do masy (pomyśl o tym jako o RESETIE).

    Jak na twoich zdjęciach, @ferbolous, czy mógłbyś pokazać całą planszę? Ale jeśli dobrze widzę, to masz urządzenie, które powinno być teraz w pełni obsługiwane. Układ SOIC wygląda dla mnie jak kontroler przycisków dotykowych, prosty kontroler przycisków dotykowych, który po prostu wysyła stan wysoki lub niski na każdy pin, aby był odczytywany jako przycisk WB3S. Powinien więc działać z aktualną wersją oprogramowania.
  • #19
    ferbulous
    Level 15  
    Dzięki, jeśli chodzi o piny 2tx, 2rx, czy muszę je jeszcze podłączyć do drugiego uarta?

    Mam też jakieś żarówki wifi, myślisz, że ten e14 może być BK7231T? Jak otworzyć metalową obudowę. Wyprowadzenia wyglądają podobnie

    I jest też ta żarówka gu10 ewelink, która korzysta z BL602. Zamówiłem kilka modułów ESP-01D, aby to zastąpić

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
  • #20
    pvxvictor
    Level 2  
    LSPA9
    aliexpress.com/item/4000478798085.html
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
  • #21
    p.kaczmarek2
    Moderator Smart Home
    pvxvictor wrote:
    LSPA9

    Dziękuję! To jest to czego chce.
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Zobaczmy, jak mój firmware działa na tej małej wtyczce.
    (dla przypomnienia - kupiłem go w serwisie eBay, ponieważ obsługuje płatności Paypal i mam na to darowizny, ale to ten sam model)
    Będzie to bardzo ciekawe, ponieważ do tej pory nie próbowałem BK7231N.

    ferbulous wrote:
    Dzięki, jeśli chodzi o piny 2tx, 2rx, czy muszę je jeszcze podłączyć do drugiego uarta?


    Drugi uart jest przydatny do debugowania, sprawdzania, czy uruchamia się oprogramowanie układowe itp., co się dzieje w przypadku problemów. Nie jest to wymagane, jeśli wszystko pójdzie dobrze

    Nie mam pojęcia o żarówkach.
    ferbulous wrote:
    BL602

    Nie widziałem wcześniej tego chipa. Póki co mam zamiar obsługiwać BK7231T i XR809:
    https://www.elektroda.com/rtvforum/topic3806769.html
    ale jeśli BL602 ma dostępny zestaw narzędzi, wsparcie może być również możliwe w przyszłości. Jak powiedziałem w pierwszym poście, mój główny serwer http i konfigurator to projekt wieloplatformowy (na przykład sam serwer może być uruchomiony w systemie Windows, przyspieszy CSS i HTML, a może projektowanie stron internetowych ajax - tak, wiem, obecny strona jest po prostu biało-czarna, ale to tylko dlatego, że zajęłoby to zbyt wiele czasu, aby była ładna w tej chwili).
  • #22
    pepesuriano
    Level 9  
    Cóż za wspaniała strona po otwarciu inteligentnej wtyczki i znalezieniu chipa WB2S! Gratulujemy wspaniałej pracy!!!

    Chciałbym podzielić się z nami opinią, próbując flashować moją inteligentną wtyczkę oznaczoną jako PF161 na obudowie, zrozumiałem, jak podłączyć RX, TX, 2RX i 2TX z tego postu (WB2S/BK7231 Tutorial - pisanie własnego oprogramowania - UDP/TCP/ HTTP/MQTT), ale nie było dla mnie jasne, gdzie mam podłączyć 5V, ponieważ moja płyta jest inna, oto kilka zdjęć:

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    Jakieś wskazówki gdzie wpiąć 5V?

    Twoje zdrowie
  • #23
    btsimonh
    Level 11  
    Uważaj na plik makefile SDK. Zapisuje i łączy WSZYSTKIE pliki obiektowe z Debug/objs po usunięciu referencji do folderów... więc wydaje mi się, że nie możesz mieć dwóch plików .C o tej samej nazwie - zostałyby nadpisane?
    Nie usuwa również plików .o /.d, a jeśli PRZENIESIESZ plik (np. przeniesiesz nagłówek z naszego folderu src do podfolderu, make odmawia kompilacji, ponieważ używa starych informacji o zależnościach - musisz usunąć Debug folder ORAZ wszystkie pliki .o w całym SDK, aby znów działał.
  • #24
    p.kaczmarek2
    Moderator Smart Home
    btsimonh wrote:

    Ponadto nie usuwa plików .o /.d, a jeśli PRZESUNĄSZ plik

    Jesteś pewien? Wolałbym powiedzieć, że sam skomentowałeś. usuwanie plików polecenie make w nieudanej próbie optymalizacji. Wciąż nie jestem pewien, ale wyraźnie pamiętam, że to robiłeś.

    Posiadanie dwóch plików .C o tej samej nazwie jest ogólnie uważane za złą praktykę.

    pepesuriano wrote:
    nie było dla mnie jasne, gdzie mam podłączyć 5V, skoro moja płytka jest inna, oto kilka zdjęć:

    Znowu uprzejmie proszę o zamieszczenie bardziej szczegółowych zdjęć, ponieważ nie widzę wyraźnie, co jest gdzie, na przykład, co to jest ten chip SOIC 8? Czy to jest sterownik zasilania? A może konwerter obniżający napięcie, który wytwarza 3,3V z 5V lub 12V?
    Ale po drugim spojrzeniu zauważyłem coś:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    Co to jest? Czy to nie LM1117?
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant


    Aktualizacja BK7231: Mamy postęp PWM! Dimmer działa, ale na razie tylko przez HTTP (MQTT wciąż czeka):
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
  • #25
    pepesuriano
    Level 9  
    Nie ma problemu! Proszę bardzo:

    SOIC8 wydaje się być BL 0937
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    A tym drugim był rzeczywiście AMS1117!
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    (Będę musiał kupić lupę do tych rzeczy :P )

    Twoje zdrowie
  • #26
    btsimonh
    Level 11  
    p.kaczmarek2 wrote:
    Jesteś pewien? Wolałbym powiedzieć, że sam skomentowałeś. usuwanie plików polecenie make w nieudanej próbie optymalizacji. Wciąż nie jestem pewien, ale wyraźnie pamiętam, że to robiłeś.

    tak, ale usunięto ,,echo" i nadal nie ma wyjścia.

    p.kaczmarek2 wrote:
    Posiadanie dwóch plików .C o tej samej nazwie jest ogólnie uważane za złą praktykę.

    nie - bez przeszukiwania całego sdk w celu uniknięcia duplikatów nie wiedzielibyśmy czego unikać. Te same pliki o nazwie C powinny działać z różnych folderów, ale nie jestem przekonany, że będą w tym repozytorium. Być może pliki nagłówkowe - ponieważ możesz nie wiedzieć, skąd pochodzą bez uwagi.

    Osobiście uważam, że powinniśmy zbudować bibliotekę z SDK - wtedy możemy po prostu połączyć naszą aplikację z tym.
  • #27
    boozeman
    Level 11  
    Cześć,

    Wkrótce spróbuję sflashować Nedis WIFIPO120FWT Smart Plug z miernikiem mocy.

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant

    Pinout oparty na WB2S:

    PWM0 = Led
    PWM1 = BL0937 CF
    PWM2 = BL0937 CF1
    PWM4 = BL0937 SEL
    PWM5 = Przekaźnik
    TX1 = przycisk
  • #28
    Glaedr304
    Level 1  
    Zostawiłem wiadomość w twoim poście na Reddicie o inteligentnych gniazdach, które używam przy użyciu interfejsu SPI. Przesyłam tutaj, jak prosiłeś. Musiałem wykluczyć linki, ponieważ moje konto jest zbyt nowe, dodałem więcej opisu, ponieważ prawdopodobnie było to konieczne.

    Kupiłem je na amazon, są to inteligentne wtyczki Aoycocr, były opakowanie 4, model to X5P. Na stronie tasmota udokumentowano, że kiedyś miały układy ESP, ale zostały niedawno zmienione.

    Dołączyłem to, co uważam za dwa najwyraźniejsze zdjęcia tego, o co prosiłeś, z pewnością mogę zrobić więcej zdjęć z większej liczby kątów, jeśli potrzebujesz.

    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
  • #29
    p.kaczmarek2
    Moderator Smart Home
    btsimonh wrote:

    Osobiście uważam, że powinniśmy zbudować bibliotekę z SDK - wtedy możemy po prostu połączyć naszą aplikację z tym.

    Dobry pomysł, możesz spróbować zmienić makefile, aby to zrobić, nadal skupiam się na obsłudze większej liczby urządzeń.


    boozeman wrote:

    Wkrótce spróbuję sflashować Nedis WIFIPO120FWT Smart Plug z miernikiem mocy.

    BL0937 nie jest jeszcze obsługiwany, ale spróbuję kupić to urządzenie i zacznę nad nim pracować. Mimo to dobrze jest wiedzieć, że BL0937 jest używany razem z BK7231T.

    Glaedr304 wrote:

    Kupiłem je na amazon, są to inteligentne wtyczki Aoycocr, były opakowanie 4, model to X5P. Na stronie tasmota udokumentowano, że kiedyś miały układy ESP, ale zostały niedawno zmienione.

    Nie martw się o utratę Tasmoty, postaram się stopniowo wdrażać wszystkie wymagane funkcje Tasmota w moim oprogramowaniu BK7231T.

    Jak na twoich zdjęciach... dokładnie tego potrzebowałem. Teraz spójrz:
    [BK7231T] Mój serwer HTTP, konfigurator, wsparcie MQTT z Home Assistant
    (pamiętaj, że to kropka oznacza pierwszy pinezkę, a nie kierunek etykiety!)
    Wyraźnie widzę, że oba porty UART są poprowadzone z chipa na drugą płytkę, czy jesteś w 100% pewien, że nie ma ich na spodzie płytki PCB?

    Założę się, że tak, ale jeśli nie, to @btsimonh wykonał świetną robotę z flasherem SPI.
  • #30
    pvxvictor
    Level 2  
    p.kaczmarek2 wrote:
    ale jeśli BL602 ma dostępny zestaw narzędzi, wsparcie może być również możliwe w przyszłości.

    BL602 IoT SDK (widelec Pine64) https://pine64.github.io/bl602-docs/#
    https://github.com/bouffalolab
    https://lupyuen.github.io/articles/book

    Quote:
    BL0937 nie jest jeszcze obsługiwany, ale spróbuję kupić to urządzenie i zacznę nad nim pracować.

    LSPA9 używany BL0937.
    https://github.com/openshwprojects/OpenBK7231T/tree/master/apps/bk7231t_bl0937_1_plug_demo
    I zacznij pracę w BLE.
    Ma WiFi OTA Tuya.