Cookies zijn vereist voor de werking van deze website. Schakel cookies in om deze website op de juiste manier te kunnen gebruiken. Lees meer hier.

Philips Somneo API Client

Toegevoegd op 2021-02-11 11:51:53 UTC


Project op GitHub.

Achtergrond

Mijn vriendin heeft onlangs een Philips Somneo Sleep & Wake-up Light aangeschaft die d.m.v. een app over wifi aangestuurd kan worden. Omdat Philips Hue lampen via een API aangestuurd kunnen worden was ik benieuwd of dat met Somneo lampen ook mogelijk zou zijn. Na wat zoeken bleek het dat er geen publiekelijk gedocumenteerde API voor Somneo apparaten beschikbaar was zoals voor Hue wel het geval is. Echter was het toch een aantal mensen gelukt om tegen het apparaat aan te praten. Ik werd nieuwsgierig en besloot zelf een poging te wagen.

Commando's achterhalen

Op het internet kon ik een klein aantal probeersels terug vinden van mensen die met de Somneo hebben geprobeerd te communiceren. Hierdoor kon ik er uit ophalen hoe het licht aangestuurd kan worden en hoe je de alarmen kunt uitlezen, maar niet heel veel meer dan dat. De belangrijkste bevinding was echter dat de Somneo via een REST API aangestuurd wordt waarbij JSON wordt uitgewisseld. Dit gaf me het idee om de communicatie tussen de app en de Somneo af te luisteren om zo meer te leren.

HTTP verkeer afluisteren

Door de SleepMapper app van Philips op mijn telefoon te installeren was het mogelijk om het HTTP verkeer tussen de app en de Somneo af te luisteren. Om dit voor elkaar te krijgen heb ik gebruik gemaakt van Fiddler. Deze biedt namelijk ook de mogelijkheid om een proxy op te zetten. Door deze proxy vervolgens op mijn telefoon in te stellen kon ik al het HTTP verkeer op mijn telefoon via Fiddler laten gaan en zien welke aanroepen de app richting Somneo maakt.

Functionaliteiten achterhalen

Door te kijken wat de app doorstuurt tijdens het gebruik was het redelijk gemakkelijk om dezelfde acties na te bootsen. Het lastigste was om uit te vogelen hoe de data aan elkaar geknoopt moest worden. De URL's en JSON zijn namelijk niet ontworpen om gebruiksvriendelijk te zijn voor andere ontwikkelaars, zoals voor bijvoorbeeld Hue lampen wel gedaan is. Zo wordt er gebruik gemaakt van korte parameter namen, van meestal niet meer dan 5 karakters lang. En je moet voor het ophalen van de alarmen meerdere URL's aanroepen die vervolgens arrays teruggeven met booleans en integers, zonder dat het meteen duidelijk is hoe dit met elkaar samenhangt. Dus er kwam wel wat trial-and-error bij kijken.

API client library

Uiteindelijk lukte het me om de functionaliteiten van de app na te bootsen en besloot ik om een API client library te ontwikkelen in .NET 5.0. Deze library heeft als doel om een client beschikbaar te stellen die makkelijk te implementeren is in een .NET applicatie. Zo zijn alle publieke klassen en methoden aangevuld met uitgebreide XML documentatie. De benamingen van de klassen, methoden en eigenschappen hebben namen die duidelijk maken wat ze doen.

De functionaliteiten die de client biedt komen grotendeels overheen met de functionaliteiten van de officiele app. Hier en daar zijn echter wel bepaalde functionaliteiten wat meer opgesplitst of samengevoegd om het gebruik duidelijker en makkelijker te maken. Uiteindelijk biedt de client functionaliteiten voor o.a. de volgende handelingen:

  • Het ophalen van informatie over het apparaat zelf, waaronder de productinformatie, wifi verbinding, firmware versie en meer;
  • Het uitlezen van de sensor data (licht, geluid, vochtigheid en temperatuur);
  • Het aansturen van het licht;
  • Instellen van het display;
  • Afspelen en bedienen van geluiden, de radio of een aangesloten apparaat;
  • Instellen van radiozenders;
  • Beheren van alarmen;
  • Aansturen van functionaliteiten om je te helpen in slaap te vallen.

Om de functionaliteiten makkelijk en snel uit te proberen is er ook een simpele console applicatie gemaakt om alle methoden van de client aan te roepen.

Doel van dit project

Er waren een paar redenen om dit project uit te voeren.

De eerste reden was nieuwsgierigheid. Tegenwoordig kan bijna alles wel aangestuurd worden via het internet, waaronder dus blijkbaar ook een wekker. Toen ik er eenmaal achter kwam dat er geen officiele API voor bestond maar het anderen wel was gelukt om het apparaat aan te sturen zag ik een uitdaging. En omdat er nergens een volledige client beschikbaar was vond ik het een leuk idee om dat zelf te ontwikkelen.

De tweede reden is home automation. Op het moment van schrijven sta ik op het punt om te verhuizen naar een nieuwe woning. Daar zal ik meer mogelijkheden hebben om te hobbyen met mijn eigen thuisnetwerk. Ook heb ik al eerder een Raspberry Pi aangeschaft om daar een beetje mee te kunnen hobbyen. Het lijkt me leuk om in de nieuwe woning wat meer apparaten aan elkaar te knopen en zo wat dingen in huis te automatiseren. Hoe een wekkerradio daar tussenpast? Tja, dat is een hele goeie vraag waar ik nog geen antwoord op kan geven. Maar ik zal eens kijken of ik wat leuks kan verzinnen!

Wesley Donker

Software Engineer

Nederland