SUPLA - MQTT - Homebridge... i mamy Hej Siri!

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Luther
Posty: 98
Rejestracja: ndz lut 16, 2020 8:19 pm

dude pisze: ndz lut 21, 2021 8:38 am @PuteR @Luther Jak ogarnę temat z przejściem na broker z clouda to Wam pomogę :)
Super ! Dzięki
3x Pnw-01, 2x Row-01, 2x Row-02, 1x Row-07, 1x Slw-02, 1x Diw-01, Slw-01, Lew-02
Awatar użytkownika
artur_n
Posty: 435
Rejestracja: czw sie 17, 2017 2:24 pm
Lokalizacja: RJA

dude pisze: ndz lut 21, 2021 8:38 am @PuteR @Luther Jak ogarnę temat z przejściem na broker z clouda to Wam pomogę :)
I to się chwali, czekamy :D
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

dude pisze: ndz lut 21, 2021 8:38 am @PuteR @Luther Jak ogarnę temat z przejściem na broker z clouda to Wam pomogę :)
Super, również czekam z niecierpliwością 😊 dzięki
dude
Posty: 37
Rejestracja: czw wrz 03, 2020 8:02 pm

Niestety przejście na sam broker z supla cloud chyba nie będzie takie proste. Jest jakieś ograniczenie na ilość jednoczesnych połączeń do tego brokera. Konfiguracja pluginu mqttthing w homebridge została tak wymyślona, że nawiązywane jest tyle połączeń do brokera ile ma się tam dodanych urządzeń. Przy takim założeniu... zaczyna robić się kaszana. Jeżeli coś się zmieni w tym temacie, to tutorial zostanie zaktualizowany. Jak zrobicie konfigurację mosquitto i mqttthing tak jak przedstawiłem, to gdy pojawi się możliwość przejścia na broker bezpośrednio z clouda wystarczy zmienić w pluginie mqttthing URL serwera i poświadczenia. Tematy pozostaną bez zmian, a z tym jest najwięcej roboty jak się ma sporo urządzeń ;). Jeżeli Twoja sieć lokalna ma problemy z obsługą multicastów, to HomeKit nie będzie działał poprawnie. Wykorzystuję to rozwiązanie na raspberry pi 3b+, na pi zero też nie powinno być problemów.

Tutorial wykorzystuje mosquitto jako lokalny broker, oraz dodatkowo jako bridge dla brokera supli.
1.
Zainstaluj system na karcie przez Raspberry Pi Imager. Z listy dostępnych wybierz Raspberry Pi OS (other), a następnie Raspberry Pi OS Lite (32-bit). Wybierz podłączoną kartę pamięci z listy i zainstaluj obraz systemu. Wymagane jest połączenie z Internetem w celu pobrania obrazu przez program.
Obrazek

2.
Po zakończeniu roboty przez program, zrób na partycji boot plik o nazwie ssh (koniecznie bez rozszerzenia i bez zawartości). Pamiętaj, że domyślnie w windowsie nie są pokazywane rozszerzenia plików.

3.
Jeżeli masz możliwość, to raspberry podłącz do sieci przez kabel ethernet. Jeżeli musisz wykorzystywać wifi, to dodaj na partycji boot plik o nazwie wpa_supplicant.conf a następnie w pliku wpisz dane dostępowe do swojej sieci. Pamiętaj, żeby sprawdzić jakie pasmo obsługuje Twoje urządzenie (dla pi 3b+ to niestety tylko pasmo 2.4GHz) i wpisz dane do prawidłowego AP w przypadku podziału na pasma.

Kod: Zaznacz cały

country=PL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SSID_WIFI"
psk="HASŁO"
key_mgmt=WPA-PSK
}
4.
Włóż kartę do urządzenia i je uruchom. Na ruterze sprawdź jaki adres uzyskało urządzenie i zaloguj się przez ssh. Domyślne poświadczenia: użytkownik: pi, hasło: raspberry. Jeżeli masz możliwość, to wymuś statyczną dzierżawę przydzielonego adresu - raspberry zawsze otrzyma ten sam adres z serwera DHCP. Unikniesz problemów ze zmieniającym się adresem Twojego serwera.

5.
Sprawdź łączność z Internetem.

Kod: Zaznacz cały

ping -c 3 supla.org
6.
Wykonaj dostępny update.

Kod: Zaznacz cały

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
7.
Wyłącz zbędne moduły. Jeżeli nie używasz na raspberry bluetooth lub/i wifi, dodaj na końcu pliku /boot/config.txt poniższe wpisy. Spowoduje to niezaładowanie modułów bt oraz wifi przy następnym starcie systemu.

Kod: Zaznacz cały

dtoverlay=disable-wifi
dtoverlay=disable-bt
8.
Skonfiguruj synchronizację czasu z serwerem NTP. Ten krok jest ważny z racji wykorzystywania TLS przez serwer supli.

Kod: Zaznacz cały

sudo timedatectl set-timezone Europe/Warsaw
sudo nano /etc/systemd/timesyncd.conf
dodaj wpis pod [Time]

Kod: Zaznacz cały

NTP= pl.pool.ntp.org
Obrazek

następnie:

Kod: Zaznacz cały

sudo timedatectl set-ntp true
sudo reboot
Po restarcie sprawdzamy, czy czas został prawidłowo pobrany z serwera NTP. Interesuje nas Local Time.

Kod: Zaznacz cały

timedatectl status
Obrazek

9.
Instalacja homebridge:

Kod: Zaznacz cały

curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
sudo apt install -y nodejs gcc g++ make python net-tools
sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x
sudo hb-service install --user homebridge
sudo npm install -g homebridge-mqttthing
sudo apt-get install -y mosquitto mosquitto-clients
10.
Uruchom MQTT w supla cloud w zakładce integracje. Koniecznie zapisz gdzieś hasło, bo po wygenerowaniu zobaczysz je tylko raz.
Obrazek

11.
Konfigurujemy mosquitto do działania jako bridge z MQTT supla.

Kod: Zaznacz cały

sudo nano /etc/mosquitto/mosquitto.conf
Dodaj i edytuj poniższą konfigurację:

Kod: Zaznacz cały

connection supla_cloud
address MQTT_HOST:MQTT_PORT
topic supla/# in
topic supla/+/devices/+/channels/+/set/+ out
remote_username MQTT_USER
remote_password MQTT_PWD
bridge_capath /etc/ssl/certs
Obrazek

Następnie:

Kod: Zaznacz cały

sudo service mosquitto restart
sudo service mosquitto status
Jeżeli serwis jest na zielono jako active, running przechodzimy dalej.

12.
Testujemy lokalnego brokera.
Sprawdzamy nasłuch na porcie 1883/TCP na który będziemy lokalnie łączyć się do naszego brokera.

Kod: Zaznacz cały

netstat -an | grep 1883
Obrazek

Jeżeli w wyniku dostaniesz coś podobnego, to mosquitto nasłuchuje na tym porcie i jest gotowe do otwarcia połączenia.
Sprawdzamy możliwość połączenia do naszego serwera MQTT (lokalnego) za pomocą MQTT Explorer.
Obrazek

Po połączeniu sprawdzamy widoczność tematów z brokera supli. Jeżeli je widzimy, to nasz mqtt bridge działa poprawnie.

13.
Sprawdzamy działanie serwisu homebridge.

Kod: Zaznacz cały

hb-service status
Obrazek

Jeżeli wszystko z nim ok, to logujemy się na nasz serwer homebridge (http://adres_raspberry:8581). Domyślne poświadczenia - użytkownik: admin, hasło: admin. Przechodzimy do Ustawień homebridge i ustawiamy interfejs sieciowy oraz mDNS Advertiser na Ciao.
Obrazek

W ustawieniach homebridge-config-ui-x możemy zmienić port webpanelu np. na standardowy HTTP - 80. Wykonujemy ponowne uruchomienie homebridge (restart serwisów, nie reboot całego raspberry). Pamiętajmy, że jeżeli zmieniliśmy port, to musimy zmodyfikować adres w przeglądarce, bo webpanel się nie załaduje.
Obrazek

14.
Przechodzimy do konfiguracji pluginu mqttthing w homebridge.
Obrazek

Tak wygląda przykładowa konfiguracja dla przełącznika (oświetlenie, gniazdka):

Kod: Zaznacz cały

{
    "type": "switch",
    "name": "Urzadzenie",
    "url": "mqtt://127.0.0.1:1883",
    "mqttOptions": {
        "keepalive": 60
    },
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOnline": "supla/XXX/devices/XXX/channels/XXX/state/connected",
        "getOn": "supla/XXX/devices/XXX/channels/XXX/state/on",
        "setOn": "supla/XXX/devices/XXX/channels/XXX/set/on"
    },
    "confirmationIndicateOffline": true,
    "accessory": "mqttthing"
}
Przykład dla czujnika temperatury:

Kod: Zaznacz cały

{
    "type": "temperatureSensor",
    "name": "Temperatura",
    "url": "mqtt://127.0.0.1:1883",
    "mqttOptions": {
        "keepalive": 60
    },
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOnline": "supla/XXX/devices/XXX/channels/XXX/state/connected",
        "getCurrentTemperature": "supla/XXX/devices/XXX/channels/XXX/state/temperature"
    },
    "confirmationIndicateOffline": true,
    "accessory": "mqttthing"
}
Przykład dla czujnika wilgotności:

Kod: Zaznacz cały

{
    "type": "humiditySensor",
    "name": "Wilgotnosc",
    "url": "mqtt://127.0.0.1:1883",
    "mqttOptions": {
        "keepalive": 60
    },
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOnline": "supla/XXX/devices/XXX/channels/XXX/state/connected",
        "getCurrentRelativeHumidity": "supla/XXX/devices/XXX/channels/XXX/state/humidity"
    },
    "confirmationIndicateOffline": true,
    "accessory": "mqttthing"
}
Należy zmienić nazwę urządzenia oraz tematy MQTT. Tematy MQTT dla poszczególnych urządzeń wyciągniemy w prosty sposób przez MQTT explorer. Każde urządzenie dodajemy oddzielnie.
Obrazek

Zapisujemy config i wykonujemy restart serwisów homebridge za pomocą magicznego przycisku.

Obrazek

Jak skonfigurować inne urządzenia przez mqttthing znajdziesz na https://github.com/arachnetech/homebridge-mqttthing
15.
Możemy już próbować dodać nasz bridge do HomeKita. W przypadku problemów z automatycznym dodaniem przez zeskanowany QR, kod do dodania "ręcznego" jest wyświetlany poniżej oraz w konsoli homebridge.
Obrazek

Na koniec wykonaj ożywczy reboocik całego raspberry (sudo reboot przez ssh) i sprawdź, czy wszystko działa poprawnie.

Pozdro :D :D
Awatar użytkownika
pzygmunt
Posty: 18328
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Obecnie jest limit 5/IP. Będziemy sukcesywnie to zwiększać. Limit się pojawił po zaobserwowaniu dos-owych ataków.
dude
Posty: 37
Rejestracja: czw wrz 03, 2020 8:02 pm

pzygmunt pisze: ndz lut 21, 2021 5:48 pm Obecnie jest limit 5/IP. Będziemy sukcesywnie to zwiększać. Limit się pojawił po zaobserwowaniu dos-owych ataków.
No właśnie :D Zacząłem badać temat, jak mi losowe urządzenia działały przy takiej samej ich konfiguracji :D
Awatar użytkownika
artur_n
Posty: 435
Rejestracja: czw sie 17, 2017 2:24 pm
Lokalizacja: RJA

pzygmunt pisze: ndz lut 21, 2021 5:48 pm Obecnie jest limit 5/IP. Będziemy sukcesywnie to zwiększać. Limit się pojawił po zaobserwowaniu dos-owych ataków.
Czyli reasumując, działa to dalej "na około"? Kiedy można się spodziewać zwiększenia liczby połączeń?
dude
Posty: 37
Rejestracja: czw wrz 03, 2020 8:02 pm

artur_n pisze: ndz lut 21, 2021 7:06 pm Czyli reasumując, działa to dalej "na około"? Kiedy można się spodziewać zwiększenia liczby połączeń?
Tak, ale jednak trochę mniej "na około" z oficjalnym brokerem supli :D
Awatar użytkownika
pzygmunt
Posty: 18328
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Nie wiem. To wymaga obserwacji przez jakiś czas. Nie możemy dopuścić do zdosowania infrastruktury.
Awatar użytkownika
PuteR
Posty: 1421
Rejestracja: śr gru 06, 2017 10:07 am

Przy takim zapisie mam błąd składni, gdzie go popełniam?? Do tego dla samego czujnika temperatury jest OK. Widzę temperaturę i się ona odświeża. Jednak dla samego przełącznika już widzę że jego stan zmienia się w mqtt explorer jednak w cloud pozostaje bez zmian.

Kod: Zaznacz cały

{
    "type": "switch",
    "name": "Gniazdko",
    "url": "mqtt://127.0.0.1:1883",
    "mqttOptions": {
        "keepalive": 60
    },
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOnline": "supla/xxx/devices/xxx/channels/xxx/state/connected",
        "getOn": "supla/xxx/devices/xxx/channels/xxx/state/on",
        "setOn": "supla/xxx/devices/xxx/channels/xxx/state/on"
    },
    "confirmationIndicateOffline": true,
    "accessory": "mqttthing"
},

{
    "type": "temperatureSensor",
    "name": "Temperatura",
    "url": "mqtt://127.0.0.1:1883",
    "mqttOptions": {
        "keepalive": 60
    },
    "mqttPubOptions": {
        "retain": false
    },
    "topics": {
        "getOnline": "supla/xxx/devices/xxx/channels/xxx/state/connected",
        "getCurrentTemperature": "supla/xxx/devices/xxx/channels/xxx/state/temperature"
    },
    "confirmationIndicateOffline": true,
    "accessory": "mqttthing"
}

ODPOWIEDZ

Wróć do „Pomysły i koncepcje”