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

Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant

p.kaczmarek2 23 Paź 2025 10:08 1158 2

TL;DR LABEL_AI_GENERATED

  • Pokazuje użycie mqtt.js jako klienta MQTT w przeglądarce do łączenia się z brokerem Mosquitto z Home Assistant.
  • Połączenie działa przez WebSocket, więc wystarcza statyczny plik HTML bez Node.js i bez serwera po stronie backendu.
  • Do demonstracji wykorzystano port o jeden większy niż ten używany do MQTT przez TCP.
  • Po poprawnej konfiguracji witryna odbiera komunikaty z Home Assistant i publikuje dane w drugą stronę.
  • Trzeba podać w kodzie adres brokera, login i hasło, więc te dane są widoczne w źródle strony.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
Słuchaj:
  • Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Przedstawię tutaj jak można łatwo nawiązać połączenie z brokerem MQTT z poziomu przeglądarki internetowej. Wykorzystam do tego gotową bibliotekę MQTT łączącą się z brokerem poprzez mechanizm WebSocket i zademonstruję, jak można jej użyć do odbierania i wysyłania danych poprzez Mosquitto zainstalowany razem z Home Assistant.

    UWAGA: Ta prezentacja dotyczy skryptów JS uruchamianych po stronie klienta, czyli w samej przeglądarce. Nie potrzeba tu Node.js ani żadnych podobnych mechanizmów. Wystarczy plik HTML luzem uruchomiony bez żadnego serwera, zadziała to nawet ze statycznym hostingiem takim jak GH Pages od GitHub.
    Przeglądarki internetowe nie dają możliwości bezpośredniego nawiązania połączenia po TCP, więc MQTT.js korzysta z mechanizmu tzw. WebSocket. Na szczęście Mosquitto z HA używany do prezentacji też wspiera WebSockety, choć może pojawić się potrzeba konfiguracji tego w mosquitto.conf.

    UWAGA - pełny kod jest w załączniku!

    Przygodę zaczynamy w kodzie HTML - można tu sobie pomagać narzędziami AI, tak by szybko całość złożyć w oparciu o gotowe style CSS, przykładowo z Bootstrapa. Nas interesuje jednak sam MQTT. Załączamy najpierw bibliotekę:
    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod

    Trzeba tu będzie podać namiary na nasz serwer MQTT - razem z użytkownikiem i hasłem. Należy pamiętać, że wszystko będzie widoczne w źródle strony dla klienta, więc to podejście nie sprawdzi się w niektórych sytuacjach, ale tu nie uznaję tego za problem. Po prostu dałem użytkownikowi pole na wpisanie własnych informacji:
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Teraz trzeba obsłużyć przycisk "Connect", czyli nawiązać połączenie. Całość sprowadza się do pobrania danych z obiektów DOM w momencie kliknięcia:
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Link tworzony jest z prefixem ws, czyli standard WebSocket. Jako argumenty podawana jest nazwa użytkownika i hasło. Po rozpoczęciu łączenia (funkcja connect nie jest blokująca) można ustawić callbacki obsługujące różne zdarzenia MQTT. Oto przykładowa implementacja dla demonstracyjnej strony:
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Zostają jeszcze dwie operacje, których nie można zrobić poprzez callbacki. Najpierw subskrypcja dla danego tematu (rozpoczęcie nasłuchiwania):
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Potem publikowanie danych na wybranym temacie:
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    To w zasadzie wszystko z implementacji.

    Teraz pora na demonstracje.
    Najpierw połączenie - po podaniu poprawnych danych powinno się wszystko udać za pierwszym razem. Nic nie musiałem konfigurować w HA, wsparcie WebSocketów miałem już tam włączone. Po prostu podałem port o jeden większy niż ten, który służy do MQTT przez TCP.
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Teraz można sprawdzić, czy nasza witryna widzi to, co opublikuje Home Assistant:
    Tutorial mqtt.js, czyli klient MQTT w Javascript - jak podłączyć przeglądarkę do Home Assistant
    Interfejs subskrypcji MQTT z wprowadzonym tematem i logami statusu
    Potem pozostaje test w drugą stronę - witryna publikuje, HA odbiera:
    Interfejs publikowania MQTT z polem tematu, wiadomości i przyciskiem Publish
    Odebrana wiadomość MQTT w przeglądarce z tematu someRandomTest/test

    Podsumowując, wsparcie standardu WebSocket w MQTT pozwala nam na podłączenie się do brokera z poziomu przeglądarki. Uzyskujemy w ten sposób pełnoprawną komunikację, włącznie z możliwości nasłuchiwania i publikacji danych. Wykonywanie skryptów po stronie serwera jest wtedy zbędne - wystarczy statyczny hosting HTML.
    Pokazany tu przykład można by rozwinąć i zrobić z niego pełen kontroler przykładowych urządzeń, ale to innym razem.
    Czy widzicie zastosowanie dla połączenia MQTT nawiązanego z poziomu przeglądarki (klienta)?

    Pełen program demonstracyjny w załączniku - nie potrzeba serwera, można pobrać plik HTML i uruchomić go luzem z dysku, albo umieścić na jakimś statycznym hostingu.
    Załączniki:
    • mqttjs.zip (1.69 KB) Musisz być zalogowany, aby pobrać ten załącznik.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14798 postów o ocenie 12956, pomógł 659 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • #2 21729640
    krzbor
    Poziom 29  
    Posty: 1787
    Pomógł: 43
    Ocena: 1073
    p.kaczmarek2 napisał:
    Trzeba tu będzie podać namiary na nasz serwer MQTT - razem z użytkownikiem i hasłem. Należy pamiętać, że wszystko będzie widoczne w źródle strony dla klienta, więc to podejście nie sprawdzi się w niektórych sytuacjach, ale tu nie uznaję tego za problem.

    To największy problem tego rozwiązania. Nadaje się do testów, ale do użycia "produkcyjnego" nawet w warunkach domowych jest to niebezpieczne. Ja w moim rozwiązaniu użyłem PHP, który odpowiada za komunikację z serwerem MQTT. HTML/Javascript komunikują się wyłącznie ze skryptem PHP, który ukrywa login, hasło, a nawet IP Mosquito.
  • #3 21729806
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    >>21729640 kilka miesięcy temu przebudowałem moją stacje meteo, zbudowaną na malincę z jednolitego programu na zespół trzech usług komunikujących się po MQTT. Jedna z tych usług to prosty serwer www - obsługuje statyczne pliki i udostępnia 1 endpoint, który przekierowuje websocket mosquitto. Sama komunikacja wewnętrzna idzie bezpośrednio po porcie od MQTT, websocket to dodatkowy interfejs, który ma swoją konfigurację, gdzie można zdefiniować, które komunikaty może przyjmować i które wysyłać. Dzięki temu z zewnątrz jest ograniczony dostęp. W zasadzie oddzielny serwer www nie jest niezbędny bo sam mosquitto może udostępnić pliki, ale działa to słabo.
    Pierwsza usługa czyta sensor, robi elementarne uśrednianie i co ok 10sekund wysyła aktualne wyniki. Druga czyta te wyniki i notuje min, max, średnią oraz tworzy historię, trzecia to już opisany serwer www. Cała logika i grafika wyświetlania jest w plikach www - HTML, CSS i js.
    Napisałem to z dużą pomocą Gemini, ale pilnowałem by było "po mojemu". Programy korzystają z mosquitto na różne sposoby: niektóre asynchronicznie (mosquitto ma własny wątek) inne synchronicznie na select.
Słuchaj:
REKLAMA