Super ! Dzięki
SUPLA - MQTT - Homebridge... i mamy Hej Siri!
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.
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.
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.
6.
Wykonaj dostępny update.
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.
8.
Skonfiguruj synchronizację czasu z serwerem NTP. Ten krok jest ważny z racji wykorzystywania TLS przez serwer supli.
dodaj wpis pod [Time]
następnie:
Po restarcie sprawdzamy, czy czas został prawidłowo pobrany z serwera NTP. Interesuje nas Local Time.
9.
Instalacja homebridge:
10.
Uruchom MQTT w supla cloud w zakładce integracje. Koniecznie zapisz gdzieś hasło, bo po wygenerowaniu zobaczysz je tylko raz.
11.
Konfigurujemy mosquitto do działania jako bridge z MQTT supla.
Dodaj i edytuj poniższą konfigurację:
Następnie:
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.
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.
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.
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.
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.
14.
Przechodzimy do konfiguracji pluginu mqttthing w homebridge.
Tak wygląda przykładowa konfiguracja dla przełącznika (oświetlenie, gniazdka):
Przykład dla czujnika temperatury:
Przykład dla czujnika wilgotności:
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.
Zapisujemy config i wykonujemy restart serwisów homebridge za pomocą magicznego przycisku.
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.
Na koniec wykonaj ożywczy reboocik całego raspberry (sudo reboot przez ssh) i sprawdź, czy wszystko działa poprawnie.
Pozdro
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.
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
}
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
Wykonaj dostępny update.
Kod: Zaznacz cały
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
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
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
Kod: Zaznacz cały
NTP= pl.pool.ntp.org
następnie:
Kod: Zaznacz cały
sudo timedatectl set-ntp true
sudo reboot
Kod: Zaznacz cały
timedatectl status
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
Uruchom MQTT w supla cloud w zakładce integracje. Koniecznie zapisz gdzieś hasło, bo po wygenerowaniu zobaczysz je tylko raz.
11.
Konfigurujemy mosquitto do działania jako bridge z MQTT supla.
Kod: Zaznacz cały
sudo nano /etc/mosquitto/mosquitto.conf
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
Następnie:
Kod: Zaznacz cały
sudo service mosquitto restart
sudo service mosquitto status
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
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.
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
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.
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.
14.
Przechodzimy do konfiguracji pluginu mqttthing w homebridge.
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"
}
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"
}
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"
}
Zapisujemy config i wykonujemy restart serwisów homebridge za pomocą magicznego przycisku.
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.
Na koniec wykonaj ożywczy reboocik całego raspberry (sudo reboot przez ssh) i sprawdź, czy wszystko działa poprawnie.
Pozdro
Obecnie jest limit 5/IP. Będziemy sukcesywnie to zwiększać. Limit się pojawił po zaobserwowaniu dos-owych ataków.
Nie wiem. To wymaga obserwacji przez jakiś czas. Nie możemy dopuścić do zdosowania infrastruktury.
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"
}