Mit arbejde med at integrere alt hvad jeg ejer i mit Smart Home setup griber ofte om sig. Som den Apple fanboy jeg er er mit primære formål at få det hele til at spille med Apple HomeKit. I denne verden hvor alt praktisk talt spiller med Alexa og Google Assistant out-of-the-box, er det blevet lidt af en mission.
Denne gang har jeg kastet min energi over mit alarmsystem fra SikkertHjem, modellen S6 Evo.
Alarmen har en kontrolenhed der er tilkoblet internettet og bl.a. kan styres via en App. Dette betyder at kommandoerne til systemet er ude og vende omkring en server på www et sted. Ligeledes betyder dette at der er en API. Min første tanke er at jeg må kunne udnytte denne, eller alternativt lave et man-in-the-middle attack, så jeg kan få kontrollen over enheden den vej.
Step 1: API adgang
Mit første indgangspunkt er at få styr på API’en. Hvis jeg kan kommunikere med denne, kan jeg formentlig alt jeg skal bruge.
SikkertHjem oplyser intet om hvordan backenden fungerer, så her er ingen hjælp at hente. Jeg ved at deres hardwareleverandør hedder Dinsafer og en hurtig googlesøgning bekræfter mig i dette. Dinsafer annoncerer selv at de har en API og stiller et SDK til rådighed, men man skal tilsyneladende være del af en inderkreds for at få fingre i dette (læs: ikke offentligt tilgængeligt) for jeg kan ikke finde det nogen steder. Jeg har forsøgt at kontakte Dinsafer, men de er ikke vendt tilbage på mine henvendelser. SikkertHjem er heller ikke til meget hjælp her.
Derfor kastede jeg mig over et forsøg på at reverse-engineere API’en. Til dette tager jeg udgangspunkt i S6 appen på min iPhone. Jeg gør brug af et stykke proxy software kaldet Charles hvilket giver mig mulighed for at sniffe al trafik der går ind og ud fra telefonen.
Straks jeg åbner min app, begynder den at kommunikere med dinsafer’s server i Kina - umiddelbart uden nogen godkendelse, da jeg ikke finder en authentication header, hvilket jeg havde forventet. Her burde have været et token der skulle sendes med en hver forespørgsel, så der den vej er styr på sikkerheden. Når jeg gennemlæser den kommunikation der går frem og tilbage opdager jeg her en anden måde at håndtere dette på. Der sendes et JSON objekt i klartekst, der indeholder forskellige attributter der definerer hvilken kommando der sendes og modtages. Den væsentlige attribut hedder “JSON” og indeholder selve kommandoen. Desværre viser denne sig at indeholder en krypteret tekststreng, som er hele humlen i dette. Jeg har prøvet med diverse gængse dekrypteringsmetoder og må konstatere at jeg formentlig mangler en krypteringsnøgle - et salt til mit hash. Mit bedste bud er at den er unik for det enkelte system og formentlig er et eller andet hardware id. Svaret ligger formentlig tættere end jeg lige regner med, men hvilken algoritme der så er brugt, eller om jeg måske er nødt til at skille alarmen ad for at finde det - den vej har jeg ikke tid til at gå på nuværende tidspunkt. Så, resultatet for nuværende: Blindgyde.
Step 2: Eksternt hardware
Desværre lykkedes det mig ikke at knække API‘en med den tid jeg har haft til rådighed, så jeg har valgt at kigge andre veje.
For at få en succesful integration til HomeKit skal jeg kunne tre overordnede ting:
- Hente status fra alarmen
- Aktivere alarmen
- Deaktivere alarmen
Adj. 1 er til enhver tid nødvendig for at noget Home appen kan vise den korrekte status for systemet. Til dette formål benytter jeg mig af en SMS gateway jeg “tilfældigvis” har liggende. Dette er en professionel model med RS232 interface, ekstern antenne og alt muligt funky, men et almindelig 3G modem kan også bruges, lidt afhængig af modellen.
Min gateway er styret af en SQL server, hvor ind- og udgående beskeder lagres. Jeg har derfor tilmeldt min SMS gateway som bruger af alarmsystemet og bedt om at den skal modtage samtlige typer beskeder fra systemet. Da S6 systemet understøtter at udsende statusbeskeder via SMS fungerer dette ganske glimrende. Hver gang alarmen skifter status, sendes en SMS til min gateway, som gemmer beskeden på min SQL server. Jeg har nu derfor altid alarmens aktuelle status til rådighed.
Adj. 2 og adj. 3 kræver lidt mere kreativitet. Hvor det gamle G5 system fra SikkertHjem var to-vejs SMS styret, hvor jeg kunne slå alarmen til og fra via sms, understøtter S6 systemet kun udsendelse, så dette er desværre ikke en indgang til at styre panelet. Heldigvis har SikkertHjem været så flinke at sørge for at det gamle tilbehør fra G5 systemet er understøttet af S6 panelet, heriblandt fjernbetjeningerne. Disse er almindelige 433 MHz fjernbetjeninger uden rullende kode. Dette er væsentligt, for det giver mig mulighed for at kopiere en af disse. Igen har jeg “tilfældigvis” et stykke isenkram liggende der kan klare denne opgave. En Sonoff RF Gateway er en fiks lille dims. Det er et stykke hardware der kan modtage og sende signaler på 433 MHz. Hvis der ikke benyttes rullende koder kan enhver 433 MHz fjernbetjening indlæres og kopieres. Problemet er blot at man skal bruge den tilhørende eWeLink app og at her kun er Google Assistant integration. Hurra for andre nørder. Selvfølgelig findes der en bred vifte af custom firmware der kan afhjælpe dette. Jeg har derfor flashet min Sonoff RF Gateway med Tasmota firmware, hvilket bl.a. inkluderer en indbygget webserver med API. Jeg har her indkodet min ene G5 fjernbetjening så jeg kan udgive mig for tre af dennes tastetryk: Aktiver, deaktiver og “hjemme”.
Sammenhængen
Alt dette skal nu kobles sammen.
Til dette formål benytter jeg mig af endnu en fantastisk ting: Homebridge. Homebridge er en software bridge der kan parres med Apple HomeKit og som kan stort set alt, da der er et kæmpe Community der skriver plug-ins til denne. Jeg kører min Homebridge fra en Linux server jeg har, men til dem der ikke lige har en Linux server stående, så kører det ganske glimrende fra en Raspberry Pi. Jeg har på min Homebridge installeret et plugin der hedder homebridge-http-securitysystem. Dette plugin sørger for at oprette alarmsystemet i HomeKit med de korrekte notifikationer, ikoner og knapper. Det eneste jeg skal gøre er at give det en håndfuld links der via et almindeligt http GET request kan gøre det jeg har brug for.
Til dette formål har jeg lavet et .NET website der håndterer at hente status fra min SQL server samt sende kommandoer til min Sonoff RF Gateway, der igen videresender disse til S6 systemet som et tryk på fjernbetjeningen.
Hurra! Jeg kan nu via en SMS gateway, SQL Server, .NET webapplikation, Linux server, 433 MHz RF gateway og en pokkers masse research timer præsentere en fungerende HomeKit integration til SikkertHjem S6 Evo systemet. Kompliceret og omfangsrigt? Det må man sige. Tilfredsstillende? Også i den grad. Let tilgængeligt? Ikke det fjerneste.
Til mit held arbejder jeg til dagligt med API’er og øvelsen at flytte data mellem forskellige typer systemer og applikationer. Mit netværk af andre IT tosser i Nordjylland gør at mit grundlager af forskelligt hardware er større end de flestes, hvilket muliggør mange af disse projekter.
Afsluttende kommentarer
Hvis SikkertHjem eller Dinsafer ønsker at udlevere udlevere API dokumentationen til S6 systemet, så kan integrationen formentlig klares uden eksternt hardware (dog stadig med Homebridge plugin og webapplikation), hvilket vil være en mere ønskeligt scenarie. For at få en direkte HomeKit integration kræver det, mig bekendt, at HomeKit kan kommunikere direkte med S6 boksen - dvs. uden at gøre brug af Dinsafers API. Jeg har gået enkelte skridt i denne retning, men er hverken kommet i kontakt med boksen via ssh, telnet eller http. Desuden er der formentlig andre i husstanden der ikke sætter alt for stor pris på jeg begynder at tage systemet offline i længere tid af gangen til alle mulige eksperimenter. Så hvorvidt den direkte kommunikation til S6 boksen er en mulighed, ved jeg endnu ikke men måske en af jer der læser med har tiden til at forfølge dette. Grundet små børn er tid ikke noget jeg har super meget af på nuværende tidspunkt.