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

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Kaowiec
Posty: 76
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

wt lis 19, 2019 10:59 pm

Instrukcja dla wszystkich, którzy chcieliby zintegrować Suple z Applowym Homekitem.
Rozwiązanie praktycznie idealne - stabilność i niezawodność Supla połączona z wygodą Apple.
Teraz możemy zapanować nad wszystkimi niemal aspektami w automatyce domowej. Czego nie potrafi Supla - załatwi Homekit - sceny, zależności, reakcja na różne czynniki...
I jeszcze sobie można z Siri pogadać :)
Nie musimy mieć własnego serwera Supla, spokojnie może to być chmura. W zupełności powinien też wystarczyć Raspberry Pi Zero W za pięć dych :)
Integracja jest możliwa dzięki pomysłowi @Beku, który jest autorem supla-mqtt-client, to dzięki jego nieocenionej pomocy udało się 100% połączenie dwu platform. Link z którym trzeba się zapoznać: viewtopic.php?f=9&t=5462

Do rzeczy
Co potrzebujemy?
  • 1. rpi,
  • 2. supla-mqtt-client,
  • 3. homebridge oraz plugin homebridge-mqttthing
  • 4. mqtt broker
***Po napisaniu posta doszedłem do wniosku, że trzeba instalować w innej kolejności--> punkt 3 --> punkt 4 --> dopiero teraz punkt 2 jesli zrobimy w innej kolejnosci to w punkcie 2 bedziemy mieć błędy, które znikną dopiero po instalacji i uruchomieniu brokera***

To teraz instrukcje:
  • AD.2
Jeśli nie instalujemy supla-mqtt-client na rpi na którym mamy działającą instancje supla-serwer lub mamy wersję dockerową to prowdopodobnie przyda nam się:

Kod: Zaznacz cały

apt-get update \
    && apt-get install -y --no-install-recommends \
        git \
        make \
        gcc \
        g++ \
        libmysqlclient-dev \
        libssl-dev \
        wget \
        supervisor \
        ca-certificates \
        ssl-cert \
jeśli mamy suplę to powyższe możemy sobie podarować ale na pewno, dodatkowo powinniśmy zainstalować:

Kod: Zaznacz cały

sudo apt-get install libssl-dev 
teraz przechodzimy do instalacji supla-mqtt-client (więcej info tu: https://github.com/SUPLA/supla-core/blo ... /README.md )

Kod: Zaznacz cały

git clone https://github.com/SUPLA/supla-core.git
cd supla-core
git checkout -b mqtt-experimental remotes/origin/mqtt-experimental
cd ..
cd supla-core/supla-mqtt-client/Release
sudo make clean
sudo make all
Dostosowujemy odpowiednio config.
(poniżej moj config_template.yaml)

Kod: Zaznacz cały

mqtt:
  host: '192.168.0.99'
  port: 1883 
  commands_file_path: '/home/pi/supla-core/supla-mqtt-client/config/command.yaml'
  states_file_path: '/home/pi/supla-core/supla-mqtt-client/config/state.yaml' 
  client_name: 'supla_mqtt_client'
  protocol_version: 3
supla:
  port: 2016
  host: 'svrX.supla.org'
  location: 1594
  password: 'haslo_dla_smartfona'
  protocol_version: 11
Wchodzimy do katalogu, w którym wybudował się program (supla-core/supla-mqtt-client/Release) i wydajemy komendę:
./supla-mqtt-client -config /home/pi/supla-core/supla-mqtt-client/config/config_template.yaml

w konsoli powinniśmy zobaczyć to:

Kod: Zaznacz cały

pi@nazwa_Raspberry:~/supla-core/supla-mqtt-client/Release $ ./supla-mqtt-client -config /home/pi/supla-core/supla-mqtt-client/config/config_template.mlm
INFO[1574086997.830114] initializing main loop
INFO[1574086997.835865] Client GUID: 1F22D271D0393DSS36FC2F355BF7CCEE
INFO[1574086997.841099] SSL version: OpenSSL 1.1.0l  10 Sep 2019
INFO[1574086997.850215] Connecting...
Po przetestowaniu działania (pamiętamy, aby na supla-cloud włączyć rejestrację smartfonów!!!), możemy pokusić się o "autostart".
Aby uruchamiać wszystko jako usługę, która sama wstanie po crashu wykonaj poniższe kroki:

Kod: Zaznacz cały

sudo nano supla_mqtt.service
wklej do niego i odpowiednio dostosuj poniższy kod:

Kod: Zaznacz cały

[Unit]
Description=SUPLA MQTT Broker
After=network.target

[Service]
ExecStart=/home/pi/supla-core/supla-mqtt-client/Release/supla-mqtt-client -config /home/pi/config_template.yaml
WorkingDirectory=/home/pi/supla-core/supla-mqtt-client/Release
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

następnie skopiuj ten plik w następujący sposób:

Kod: Zaznacz cały


sudo cp supla_mqtt.service /etc/systemd/system
następnie sprawdź czy usługa się uruchamia poleceniem:

Kod: Zaznacz cały

sudo systemctl start supla_mqtt.service
aby sprawdzić czy działa klient możesz użyć polecenia:

Kod: Zaznacz cały

sudo journalctl -f -u supla_mqtt
wynik komendy powinien być podobny do tego, który już znasz

jeśli jest uruchomiony wykonaj

Kod: Zaznacz cały

sudo systemctl stop supla_mqtt.service
sprawdź czy się zatrzymał:

Kod: Zaznacz cały

sudo journalctl -f -u supla_mqtt
jeśli jest ok czyli usługa startuje i zatrzymuje się, pozostaje ją tylko zainstalować aby się uruchamiała przy starcie maliny

Kod: Zaznacz cały

sudo systemctl enable supla_mqtt.service
usługa powinna sama się restartować w przypadku crash'u.
możesz sprawdzić czy się uruchomiła, jesli nie, to ją uruchom (nie pamiętam czy trzeba)


  • AD.3
Przeczytajcie to: https://github.com/nfarina/homebridge/w ... spberry-Pi
a tu alternatywna metoda: https://www.heysiri.pl/blog/28-homebridge-w-10-minut - to wygodna opcja dla mniej zaawansowanych bo ma zaintalowany plugin oraz broker mqtt na standardowym porcie (1883).
Jeśli instalujemy sami to plugin instalujemy łatwo:

Kod: Zaznacz cały

sudo npm install -g homebridge-mqttthing
adres pluginu i jego opis: https://github.com/arachnetech/homebridge-mqttthing

poniżej fragment mojego config.json. Wszystkie urządzenia przetestowane i dzałają bez zarzutu:

Kod: Zaznacz cały

{
	"bridge": {
		"name": "HomebridgeMQTT",
		"username": "CC:22:3f:f3:fa:A1",
		"port": 51828,
		"pin": "031-45-154"
	},
	"description": "it's example, but working well, config for integration with SUPLA by supla-mqtt-client",
	"accessories": [
		{
			"accessory": "mqttthing",
			"type": "switch",
			"name": "przelacznik",
			"url": "http://192.168.0.31:1883",
			"username": "",
			"password": "",
			"topics": {
				"getOn": {
					"topic": "supla/channels/status/switch/17953",
					"apply": "return JSON.parse(message).on;"
				},
				"setOn": {
					"topic": "supla/channels/command/switch/17953",
					"apply": "return JSON.stringify({ id: 17953, on: message });"
				}
			},
			"integerValue": "false",
			"onValue": "1",
			"offValue": "0"
		},
		{
			"accessory": "mqttthing",
			"type": "occupancySensor",
			"name": "czujnik obecnosci",
			"url": "http://192.168.0.31:1883",
			"username": "",
			"password": "",
			"topics": {
				"getOccupancyDetected": {
					"topic": "supla/channels/status/1000/18470",
					"apply": "return JSON.parse(message).hi;"
				}
			},

			"integerValue": "false",
			"onValue": "1",
			"offValue": "0"
		},
		{
			"accessory": "mqttthing",
			"type": "temperatureSensor",
			"name": "Temperatura biura",
			"url": "http://192.168.0.31:1883",
			"username": "",
			"password": "",
			"topics": {
				"getCurrentTemperature": {
					"topic": "supla/channels/status/thermometer/15868",
					"apply": "return JSON.parse(message).temperature;"
				}
			}
		},
		{
		    	"accessory": "mqttthing",
    			"type": "windowCovering",
    			"name": "roleta",
    			"topics":
    			        {
        			"getCurrentPosition": 	{
							"topic": "supla/channels/status/rollershutter/31439",
							"apply": "return 100 - JSON.parse(message).shut;"
							},
        			"setTargetPosition":    {
							"topic": "supla/channels/command/rollershutter/31439",
							"apply": "return JSON.stringify({ id: 31439, shut:100 - message });"
							},
        			"getTargetPosition":    {
							"topic": "supla/channels/status/rollershutter/31439",
							"apply": "return 100 - JSON.parse(message).shut;"
							},
 
        			"getPositionState":     {
							"topic": "supla/channels/status/rollershutter/31439",
							"apply": "return 100 - JSON.parse(message).shut;"
							},
        			"setHoldPosition":      {
							"topic": "supla/channels/command/rollershutter/31439",
							"apply": "return JSON.stringify({ id: 31439, shut:100 - message });"
							}
            			},
    				"positionStateValues": [ "100", "0", "50" ]
		},
		{
		       "accessory": "mqttthing",
    		       "type": "garageDoorOpener",
    		       "name": "garaz",
     		       "topics":
     				{
        			"setTargetDoorState":   {
							"topic": "supla/channels/command/garagedoor/12",
							"apply": "return JSON.stringify({ id: 12, hi: message });"
				  			},
        			"getTargetDoorState":   {
						 	"topic": "supla/channels/status/garagedoor/12",
							"apply": "return JSON.parse(message).sensor_1;"
				    			},
        			"getCurrentDoorState":  {
				 			"topic": "supla/channels/status/garagedoor/12",
							"apply": "return JSON.parse(message).sensor_1;"
				    			},
        			"setLockTargetState":   {
							"topic": "supla/channels/command/garagedoor/12",
							"apply": "return JSON.stringify({ id: 12, hi: message });"
				  			},
        			"getLockTargetState":   {
				 			"topic": "supla/channels/status/garagedoor/12",
							"apply": "return JSON.parse(message).sensor_1;"
				    			},
       				"getLockCurrentState":  {
				 			"topic": "supla/channels/status/garagedoor/12",
							"apply": "return JSON.parse(message).sensor_1;"
				    			},
        			"getObstructionDetected":{
				 			"topic": "supla/channels/status/garagedoor/12",
							"apply": "return JSON.parse(message).online;"
				    			}
    				},
	    			"doorValues": [ "1", "1", "0", "0", "0" ]
    		},
		{
			"accessory": "mqttthing",
			"type": "temperatureSensor",
			"name": "kolejny termometr",
			"url": "http://192.168.0.31:1883",
			"username": "",
			"password": "",
			"topics": {
				"getCurrentTemperature": {
					"topic": "supla/channels/status/thermometer/4116",
					"apply": "return JSON.parse(message).temperature;"
				}
			}
		}
	],

	"platforms": []
}

  • AD.4 Instalacja mosquitto

Kod: Zaznacz cały

sudo apt install -y mosquitto mosquitto-clients
albo lepiej:

Kod: Zaznacz cały

sudo apt-get install mosquitto mosquitto-clients
Powinno się udać.
Jeśli tak - daj znać, jeśli nie, zanim napiszesz, przeczytaj jeszcze o poprzednim sposobie, może on pozwoli Ci zrozumieć w czym problem viewtopic.php?f=24&t=3809
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

pt lis 22, 2019 8:12 am

Potwierdzam, że zaproponowana integracja działa 🙂 zaletą tego rozwiązania jak i każdej integracji opartej na MQTT jest fakt, że klient nie musi się dopytywać supli o stan kanału, MQTT robi całą robotę, przez co cloud nie jest obciążony.
wojtek
Posty: 16
Rejestracja: czw paź 19, 2017 8:34 am

wt lis 26, 2019 11:40 am

robie komenda po komendzie, instalacja zatrzymuje się na tym:

Kod: Zaznacz cały

In file included from ../src/client_subscriber.h:25,
                 from ../src/client_loop.h:32,
                 from ../src/client_loop.cpp:19:
../src/json/jsoncons/json.hpp:10:10: fatal error: jsoncons/basic_json.hpp: Nie ma takiego pliku ani katalogu
 #include <jsoncons/basic_json.hpp>
          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [src/subdir.mk:51: src/client_loop.o] Błąd 1
Kaowiec
Posty: 76
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

wt lis 26, 2019 12:12 pm

Zobacz tu, bo kolega miał już podobny problem:
viewtopic.php?p=54443#p54443

...to tak na szybko...
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

wt lis 26, 2019 12:15 pm

Kaowiec pisze:
wt lis 26, 2019 12:12 pm
Zobacz tu, bo kolega miał już podobny problem:
viewtopic.php?p=54443#p54443

...to tak na szybko...
Potwierdzam - idź za tym wpisem. Mam już wgraną poprawkę ale czekam na zatwierdzenie. Do tego czasu możesz postępować jak w zacytowanym wpisie.
wojtek
Posty: 16
Rejestracja: czw paź 19, 2017 8:34 am

wt lis 26, 2019 12:44 pm

nadal bez zmian, poprowiłem jak poniżej:

Kod: Zaznacz cały

src/%.o: ../src/%.cpp
	@echo 'Building file: $<'
	@echo 'Invoking: Cross G++ Compiler'
	g++ -D__DEBUG=1 -D__NO_USER -D__NO_DATABASE -I../src/json$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

src/%.o: ../src/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: Cross GCC Compiler'
	gcc -D__DEBUG=1 -D__NO_DATABASE -D__NO_USER -I../src/json$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

wt lis 26, 2019 12:46 pm

wojtek pisze:
wt lis 26, 2019 12:44 pm
nadal bez zmian, poprowiłem jak poniżej:

Kod: Zaznacz cały

src/%.o: ../src/%.cpp
	@echo 'Building file: $<'
	@echo 'Invoking: Cross G++ Compiler'
	g++ -D__DEBUG=1 -D__NO_USER -D__NO_DATABASE -I../src/json$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

src/%.o: ../src/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: Cross GCC Compiler'
	gcc -D__DEBUG=1 -D__NO_DATABASE -D__NO_USER -I../src/json$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '
Nie poprawiłeś dobrze.

-I../src/json należy dodać jako kolejny parametr I a nie zastąpić ten co był.


Powinno być:

Kod: Zaznacz cały

  src/%.o: ../src/%.cpp
	@echo 'Building file: $<'
	@echo 'Invoking: Cross G++ Compiler'
	g++ -D__DEBUG=1 -D__NO_USER -D__NO_DATABASE -I../src/json -I$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

src/%.o: ../src/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: Cross GCC Compiler'
	gcc -D__DEBUG=1 -D__NO_DATABASE -D__NO_USER -I../src/json -I$(SSLDIR)/include -O0 -g3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '
	
wojtek
Posty: 16
Rejestracja: czw paź 19, 2017 8:34 am

wt lis 26, 2019 12:59 pm

OK teraz poszło, dzięki :) pisze tak aby było jasne dla reszty :)

w folderze /Release/src w pliku subdir.mk

linie 51 i 58 powinny wyglądać tak:

51:

Kod: Zaznacz cały

g++ -D__NO_DATABASE -D__NO_USER -I../src/json -Ijson$(SSLDIR)/include -O3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
58:

Kod: Zaznacz cały

gcc -D__NO_USER -D__NO_DATABASE -I../src/json -Ijson$(SSLDIR)/include -O3 -Wall -fsigned-char  -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
Beku
Posty: 331
Rejestracja: wt lis 06, 2018 1:49 pm

wt lis 26, 2019 1:00 pm

To generalnie jest automat i jak tylko mi zaakceptują zmianę to nie trzeba będzie nic poprawiać. Poza tym źle to poprawiłeś. Zerknij sobie na ten parametr -I w którym jest SSL tam ci niepotrzebnie został json.
mozimek
Posty: 20
Rejestracja: pt lut 26, 2016 3:48 pm

pt sty 03, 2020 8:09 am

Hej,
kompilacja supla-mqtt-client poszła bez problemu jednak moje mosquitto jest skonfigurowane z plikiem haseł a annonymous jest wyłączone. jak powinna wyglądać konfiguracja pliku konfiguracyjnego yaml w takim przypadku?
ODPOWIEDZ