Supla - integracja z Apple Homekit & Siri przez Homebridge

Kaowiec
Posty: 78
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

Supla z Homekit przez Homebridge na iOS działa idealnie. Możecie zapalać i gasić światła za pomocą Siri, otwierać rolety, garaż i bramę, sterować czajnikiem :)
Dodatkowo zyskujecie pełną automatyzację np.: wracając wieczorem do domu zapalą się światła albo otwierając bramę zapalicie światła na podjeździe i w przedpokoju...
Jest to rozwiązanie przejściowe - czekamy na natywne wsparcie dla Homekita przez Suple.
Mamy coś "na dziś" - rozwiązanie dla niecierpliwych.
Z pomocą przyjdzie oczywiście @fracz i jego skrypty. Ale nie tylko skrypty.

Co potrzebujecie:
1. Własny serwer Supla oraz Supla-Script - wersje docker (certyfikaty nie są obowiązkowe),
2. Homebridge
3. Plugin homebridge-http-webhooks,
4. SimulateEvents do pokazywania stanów poszczególnych urządzeń Supla - dzięki @fracz

Instalacja:
1. Instalujecie Supla i Supla-Script w wersji dockerowej - jak to zrobić czytajcie na forum viewtopic.php?f=40&t=2695 albo lepiej viewtopic.php?f=40&t=2675
Dodajecie oczywiście urządzenia do waszego serwera Supla i sprawdzacie czy działa(ją) :)
2. Instalujecie Homebridge. Instalacja jest dokładnie opisana w podanym poniżej linku. Na czystym raspibianie nie napotkałem chyba nigdy problemów... tutaj stosowny filmik https://www.youtube.com/watch?v=g4Smfn1Q5Qc
3. Instalujecie plugin, zgodnie z instrukcją instalacji podanej na stronie pluginu. Poniżej wkleiłem też cały moj config.json - jeśli go przekleicie do siebie, na pewno Wam zadziała. W pliku config.json zauważycie np. port serwera/klienta webhookowego, który jest integralną częścią pluginu homebridge-http-webhooks. "webhook_port":"51827". Dodatkowo zwróćcie uwagę na "id":dowolna_nazwa_waszego_virtualnego_urzadzenia_ktore_laczycie_z_Supla" (u mnie np.: "garagedooropener1") - będziecie z tego korzystać przy konfiguracji.
Po skonfigurowaniu "Homebridge" - iPhonik w łapki, i w aplikacji "Dom" dodajecie "Homebridge" do iPhona.

To pierwszy etap. Jeśli przez niego właściwie przebrnęliście, to macie na swoim iPhonie, w aplikacji Dom: 8 urządzeń i jeden węzeł "Homebridge" (o ile macie mój config.json). Urządzenia oczywiście nie robią nic... jeszcze :)
Za to w pełni działają Supla i Supla-Script.

Idziemy dalej:
Etap drugi
Konfiguracja Supla-Script
Tworzymy nową scenę. Np. "Światło Taras ON" do zapalania świateł na tarasie. Robimy to tak jak opisane w wątku o supla-scripts. Zaznaczamy (to ważne) "scena dostępna pod publicznym adresem". Dodatkowo w polu "Odpowiedź" w nawiasach [[kwadratowych]] wpisujemy adres webhooka, jaki nam zmieni stan urządzenia w aplikacji na iOS. U mnie, w przypadku jednej z lamp, w pliku z config.json, jest to adres: [[http://test:test@adres-ip-mojego-raspbe ... state=true]]. ((((Ostatecznie zrezygnowałem z test:test@ - bo i tak wszystko uruchamiany w naszej sieci LAN a w dodatku wysyłanie loginu i hasła w url'u jest... głupie. Wywaliłem też "http_auth_user": "test", "http_auth_pass": "test", z pliku config.json))))

Teraz przechodzimy do naszego config.json. Odszukujemy sekcję "lights" i w linii zaczynającej się od "on_url": podmieniamy mój adres na ten nowowygenerowany w supla-scripts, adres publiczny.
Potem robimy kolejną scenę: "Światło Taras OFF" i, jej publiczny link, wklejamy do linii "off_url": zamiast mojego adresu. W polu "Odpowiedź" wpisujemy [[http://test:test@adres-ip-mojego-raspbe ... tate=false]]

Pozostałe urządzenia Supla dodajemy podobnie ==>> Czyli najpierw scena w Sulpa-Scripts, ==>> potem config.json.

Mamy do dyspozycji sporo typów urządzeń. Dopasowanie ich do naszych potrzeb nie powinno nastręczać problemów (lights, switch, pushbutton, outlet... garage).

Bramę lub garaż proponuję męczyć dopiero po poprawnym skonfigurowaniu światełek - problemem jest prezentacja ich aktualnego stanu.
Oczywiście nie jest to superobowiązkowe ale bez aktualnego stanu, trudno będzie poproscić Siri, o otwarcie bramy, zanim dojedziemy do domu. Może się okazać, że brama była otwarta i właśnie ją zamknęliśmy... :)


Z garażem (lub bramą) jest trochę więcej roboty, bo tam musimy (oszukać) ustawić stan bramy, oraz mieć link z Supla-Script, do sterowania bramą.
Postaram się wytłumaczyć.
Problemem jest fakt, że Homekit potrzebuje do prawidłowego sterowania bramą, jej stan obecny i końcowy, oraz info, czy przypadkiem nie ma ona przeszkody. Tu z pomocą przyjdą oczywiście sceny w skryptach.
Robimy scenę "Otwórz bramę". W polu "odpowiedź" musimy podać najpierw "targetstate", potem "obstruction" (składnię linku sprawdzcie na stronie pluginu). Jeśli nie uruchamiamy SimulateEvents to musimy jeszcze w tym samym miejscu podać "currentstate". U mnie jest link: [[http://192.168.0.31:51827/?accessoryId= ... oorstate=0]],[[http://192.168.0.31:51827/?accessoryId= ... detected=0]] - czyli bez currentstate.

W skrócie - dwa linki, gdy mamy skonfigurowane SimulateEvents (lub trzy gdy nie mamy... ja mam, dałem dwa linki) z: targetstate=1,obstruction=0-(i_ewentualnie currentstate=1 dla wersji bez SE). W kolejnej scenie "Zamknij bramę" odpowiedź ustawiamy na przeciwną (targetstate=0,obstruction=0-(i_ewentualnie currentstate=0)

Jeśli wszystko Wam działa to potraficie włączać oświetlenie tarasu i je wyłączać. Niecierpliwi otwierają garaż :) Niestety nie możecie sprawdzić czy światła faktycznie świecą czy są zgaszone.
Do tego potrzeba nam jeszcze jednej rzeczy - SimulateEvents

SimulateEvents sprawdza stan urządzenia w Waszym lokalnym serwerze Supla
Na szczęście @fracz to opisał więc dam link viewtopic.php?f=24&t=3791 .

Zauważcie. Ja sterując bramą daję dwa linki. Jeden z targetstate, drugi obstruction. Trzeci załatwia SimulateEvents (currentstate), powtarzajac wcześniej targetstate i obstruct. U mnie działa ze to 100% skutecznością.
Na samym dole posta jest mój config events.yml.



W Supli i homekicie mamy też sensory (np. humidity, temperature, smoke, motion itd) - sensory konfigurujemy nieco inaczej, bo potrzeba znać ich stan. Do tego także wykorzystamy Supla-Scripts i SimulateEvents ale dopiero jak @fracz doda ten ficzer
Postaram się to opisać jak SimulateEvents będzie gotowe na czujniki.
Tymczasem walczcie i dajcie znać jak idzie :)
W dniu pisania postu, u mnie, działa to wszystko już na tyle długo, że przyjmuję, iż jest stabilne

************
************
************

Linki:
Homebridge - strona programu https://github.com/nfarina/homebridge
Homebrigge - instalacja na Raspberry Pi https://github.com/nfarina/homebridge/ ... pberry-Pi
plugin Homebridge-http-webhooks - https://github.com/benzman81/homebridge-http-webhooks
SimulateEvents - link viewtopic.php?f=24&t=3791


************
************
************

Mój config.json:

Kod: Zaznacz cały

{
"bridge": {
	"name": "Homebridge",
	"username": "AC:27:93:FE:CF:39",
	"port": 57117,
	"pin": "031-45-154"
          },

   "description": "This is a webhook for Supla",

   "accessories": [],

    "platforms": [
            {
                "platform": "HttpWebHooks",
                "webhook_port": "51827",
                "cache_directory": "/home/pi/.node-persist/storage", 
                "http_auth_user": "test",
                "http_auth_pass": "test",
                "sensors": 
                [],
                "switches": 
                [],
		"lights": [
                    {
                    "id": "light1",
                    "name": "Oswietlenie Taras",
                    "on_url": "http://192.168.200.212/api/scenes/public/ab7a0733-fc37-4736-a67d-3ffa58a869ba",
                    "on_method": "GET",
                    "off_url": "http://192.168.200.212/api/scenes/public/c6c464ba-7816-44a3-9bef-06f1f5382939",
                    "off_method": "GET"
                    }
                ],
                "pushbuttons":
                [
                    {
                    "id": "pushbutton1",
                    "name": "Main Door",
                    "push_url": "https://192.168.200.212/api/scenes/public/a2b34e70-6cdb-4b54-a214-30f8e223eef6",
                    "push_method": "GET"
                    },
{
                    "id": "pushbutton2",
                    "name": "Second Door",
                    "push_url": "https://192.168.200.212/api/scenes/public/d5fb6792-ade7-4916-8986-968c61db9e13",
                    "push_method": "GET"
                    }
,
{
                    "id": "pushbutton2",
                    "name": "Accesory Door",
                    "push_url": "https://192.168.200.212/api/scenes/public/6cdac503-76d5-485b-928b-85b610a2d7d1",
                    "push_method": "GET"
                    }
                ],
                
                "garagedooropeners":
                [
                    {
                        "id": "garagedooropener1",
                        "name": "Gate",
                        "open_url" : "http://192.168.200.212/api/scenes/public/29ce949f--43d5-9976-c26ae699589a",
                        "open_method" : "GET",
                        "close_url" : "http://192.168.200.212/api/scenes/public/29ce949f--43d5-9976-c26ae699589a",
                        "close_method" : "GET"
                    },
{
                        "id": "garagedooropener2",
                        "name": "W Garage",
                        "open_url" : "https://192.168.200.212/api/scenes/public/a2b34e70--4b54-a214-30f8e223eef6",
                        "open_method" : "GET",
                        "close_url" : "https://192.168.200.212/api/scenes/public/a2b34e70--4b54-a214-30f8e223eef6",
                        "close_method" : "GET"
                    },
{
                        "id": "garagedooropener3",
                        "name": "P Garage",
                        "open_url" : "https://192.168.200.212/api/scenes/public/d5fb6792-ade7--8986-968c61db9e13",
                        "open_method" : "GET",
                        "close_url" : "https://192.168.200.212/api/scenes/public/d5fb6792-ade7--8986-968c61db9e13",
                        "close_method" : "GET"
                    },
{
                        "id": "garagedooropener4",
                        "name": "Slow Gate",
                        "open_url" : "https://192.168.200.212/api/scenes/public/6cdac503-76d5--928b-85b610a2d7d1",
                        "open_method" : "GET",
                        "close_url" : "https://192.168.200.212/api/scenes/public/6cdac503-76d5--928b-85b610a2d7d1",
                        "close_method" : "GET"
                    }
                ]
          }]
}


Mój events.yml (Uwaga. Mam dwa serwery webhookowe dlatego webhooks są podwójne - na port 51827 oraz 61827):

Kod: Zaznacz cały

events:
  - condition: state(1).on
    time_conditions: "* * * * *" 
    webhooks:  ["http://192.168.0.31:51827/?accessoryId=light1&state=true","http://192.168.0.31:61827/?accessoryId=light1&state=true"]
    
  - condition: not state(1).on
    time_conditions: "* * * * *"
    webhooks: ["http://192.168.0.31:51827/?accessoryId=light1&state=false","http://192.168.0.31:61827/?accessoryId=light1&state=false"]

  - condition: state(11).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener1&targetdoorstate=1","http://192.168.0.31:51827/?accessoryId=garagedooropener1&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener1&currentdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener1&targetdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener1&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener1&currentdoorstate=1"]
  
  - condition: not state(11).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener1&targetdoorstate=0","http://192.168.0.31:51827/?accessoryId=garagedooropener1&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener1&currentdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener1&targetdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener1&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener1&currentdoorstate=0"]

  - condition: state(14).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener2&targetdoorstate=1","http://192.168.0.31:51827/?accessoryId=garagedooropener2&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener2&currentdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener2&targetdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener2&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener2&currentdoorstate=1"]

  - condition: not state(14).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener2&targetdoorstate=0","http://192.168.0.31:51827/?accessoryId=garagedooropener2&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener2&currentdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener2&targetdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener2&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener2&currentdoorstate=0"]

  - condition: state(17).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener3&targetdoorstate=1","http://192.168.0.31:51827/?accessoryId=garagedooropener3&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener3&currentdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener3&targetdoorstate=1","http://192.168.0.31:61827/?accessoryId=garagedooropener3&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener3&currentdoorstate=1"]

  - condition: not state(17).hi
    webhooks: ["http://192.168.0.31:51827/?accessoryId=garagedooropener3&targetdoorstate=0","http://192.168.0.31:51827/?accessoryId=garagedooropener3&obstructiondetected=0","http://192.168.0.31:51827/?accessoryId=garagedooropener3&currentdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener3&targetdoorstate=0","http://192.168.0.31:61827/?accessoryId=garagedooropener3&obstructiondetected=0","http://192.168.0.31:61827/?accessoryId=garagedooropener3&currentdoorstate=0"]
 
CWIARTEK
Posty: 2
Rejestracja: wt gru 04, 2018 10:08 pm

Witam. Męczyłem ostatnio sterowanie bramy wjazdowej wg powyższej instrukcji. Wszystko działa oprócz wyświetlania otwartej bramy. Sterownik zamel SBW-01, na malinie zainstalowane SUPLA Cloud i scripts, zrobione eventy i w aplikacji DOM na ios otwieranie i zamykanie działa jedynie problem w wyświetlaniu stanu "otwarty". Na aplikacji supla pokazuje stan otwarty-zamknięty.
Kaowiec
Posty: 78
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

Słaby ze mnie support bo przeoczyłem Twoj post...

Jeśli nadal nie poradziłeś sobie z ustawieniem stanu bramy - daj znać.
Najpierw jednak spróbuj sprawdzić czy masz dobrze ustawione:
1.Skrypty -
linki w scenie "Otwieranie bramy" w tej kolejności:
[...targetdoorstate=0...], [...obstructiondetected=0...]
w scenie "Zamykanie bramy"
[...targetdoorstate=0...], [...obstructiondetected=0...]
Czy masz osobne sceny do otwierania i do zamykania?
2.Homebridge
w config.json odpowiednie linki do zamykania i otwierania (dwa różne linki mimo, że scena zawsze jest otwórz/zamknij!)
3.SimulateEvents
linki dla:
- condition: state(XX).hi --> targetdoorstate=1, obstructiondetected=0, currentdoorstate=1

- condition: not state(XX).hi --> targetdoorstate=0. obstructiondetected=0, currentdoorstate=0


Ma działać!
:)
slojo
Posty: 7
Rejestracja: sob sty 12, 2019 10:02 pm

Witam wszystkich,

Mam pytanie odnośnie autoryzacji.

Czy istnieje możliwość żeby zamiast public, użyć linka ze sceny z autoryzacją w homebridge ?

Czyli chciałbym dodać do webhooks token bearer dla get'a s SUPLA Scripts.

Pozdrawiam
Kaowiec
Posty: 78
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

slojo pisze: śr sty 16, 2019 11:32 pm
Mam pytanie odnośnie autoryzacji.

Czy istnieje możliwość żeby zamiast public, użyć linka ze sceny z autoryzacją w homebridge ?

Czyli chciałbym dodać do webhooks token bearer dla get'a s SUPLA Scripts.
Nie da się ponieważ bearer nie jest obsługiwany przez homebridge-webhooks.
Dlatego właśnie, ze względu na bezpieczeństwo, to rozwiązanie sprawdza się wyłącznie w sieci lokalnej.

Druga sprawa - odpytywanie o stan (SimulateEvents) działa tez tylko na własnej instancji clouda i skryptów.
slojo
Posty: 7
Rejestracja: sob sty 12, 2019 10:02 pm

Kaowiec pisze: czw sty 17, 2019 12:15 pm Druga sprawa - odpytywanie o stan (SimulateEvents) działa tez tylko na własnej instancji clouda i skryptów.
Dzięki, także trzeba by coś na szybko do homebridga zrobić żeby działało.
Ten 2 argument nie jest w w żaden sposób połączony z problemem bo nic nie stoi na przeszkodzie żeby scripts i cloud miało domenę na własnej instancji.
Drail
Posty: 39
Rejestracja: ndz sty 24, 2016 11:26 pm

W jaki sposób odpytujesz o status przełącznika?
Kaowiec
Posty: 78
Rejestracja: śr lip 26, 2017 8:15 am
Lokalizacja: Czernichów

Drail pisze: śr maja 29, 2019 8:09 pm W jaki sposób odpytujesz o status przełącznika?
Wszystko masz w pierwszym poście.
Dodam tylko, ze nie działało mi to rozwiązanie na najnowszej wersji supla i SimulateEvents (o przyczyny pytaj autorów - ja poddałem się po trzech tygodniach prób).
Drail
Posty: 39
Rejestracja: ndz sty 24, 2016 11:26 pm

Wiem że mam w pierwszym poście, nie działa mi odpytywanie o status, dlatego dopytuje czy ktoś to jakoś rozwiązał. Wydaje mi się że chodzi o odpowiedź statusu, plugin nie przyjmuje tego w takiej formie.
myrcin
Posty: 55
Rejestracja: pt cze 07, 2019 9:08 am

Dopiero zacząłem konfigurować własny serwer Supla Cloud i Scripts ale robię to właśnie aby zintegrować z Apple Home kit. Jednak czegoś tutaj nie rozumiem. Piszesz, że ze względu na wykorzystywanie publicznych linków aby było bezpiecznie to ma to sens tylko w sieci LAN. Jednak chwilę wcześniej piszesz o proszeniu Siri o otwarcie bramy zanim dojedziemy do domu?

Przyznam, że nie ogarniam jak działa Home Kit więc może to jest tak, że Siri przez iCloud zakomunikuje do Homebridge aby ten otworzył bramę? Tylko to by znaczyło, że ten HomeBridge jednak musi mieć dostęp do internetu bo w założeniu Supla i Supla Scripts są tylko w LAN? Czy ja coś tu namieszałem?
ODPOWIEDZ

Wróć do „Projekty użytkowników”