Artikel top billede

Gør det selv-IoT, del 1: Sådan bygger du en dims, der kan aktivere andre dimser over internettet

Klumme: Internet of Things er tidens store buzzword, men kan man selv ved hjælp af lidt fingersnilde strikke en IoT-løsnings sammen, som kan tilgås fra en åben platform? Følg første del af det store selvbyggerprojekt.

En af mine gode venner, Dan, står bag et nyt smart collaboration tool, Skarpline. Lidt a lá Sharepoint, bare meget bedre.

Over en øl i juleferien kom vi til at snakke lidt om det, og i den sammenhæng kom det frem, at Dan ville implementere ny funktionalitet, hvor Skarpline kan kommunikere med og kontrollere eksterne systemer.

Til det havde Dan brug for noget, der kunne bruges til at demonstrere den funktonalitet, og "du dimser jo med alt muligt, så kan du ikke lige strikke noget hardware sammen...".

Og før vi vidste af det, gik snakken om at kommunikere med Internet of Things fra en åben platform som Skarpline.

Endnu et godt projekt

Vi nørder er hjælpsomme væsener, så selvfølgelig greb jeg chancen for tilføje et nyt projekt til den stadigt voksende bunke af halvfærdige projekter, der hober sig op i kælderen.

En brainstorm over flere øller startede med den obligatoriske kaffemaskine, men det endte med en lidt mere generisk løsning med muligheden for at tænde og slukke for et par strømudtag over internettet. Og man kan jo stadig tilslutte en kaffemaskine til strømudtaget!

Det er et sjovt lille projekt, og jeg vil benytte lejligheden til at beskrive det for jer. Mon ikke, der er andre derude, som kunne tænke sig at lave noget tilsvarende?

Og man kan sikkert købe en kommerciel løsning billigere, men hvad sjov er der ved det?

IoT er et af tidens helt store buzzwords, og i modsætning til et af de andre populære buzzwords, big data, der også giver gode point i BS-bingo spillet, så er IoT et område, hvor en GDS'er har god mulighed for at lave lidt hjemme-sjov, som oven i købet kan have god praktisk anvendelse.

Derfor er denne artikel den første i en lille serie på fire, hvor jeg beskriver projektet.

De grundlæggende valg

Første del, som du læser lige nu, handler om at foretage nogle grundlæggende valg og fastlægge af en rudimentær kravspecifikation, og jeg vil skrive lidt om de tanker, jeg gør mig om implementeringen.

I den næste del vil jeg finde loddekolben frem og strikke noget hardware sammen.

Tredje afsnit kommer til at handle om konfiguration af platform og installation af den nødvendige støttesoftware, og slutteligt vil jeg i fjerde del fatte tastaturet og bikse en omgang spaghettikode sammen.

Kravspec

Nu skal jeg blæse bukserne af jer alle med den vildeste dims, i nogensinde har set. Den vil få en kompleksitet og et featuresæt, der får cockpittet i en Boeing Dreamliner til at ligne instrumentpanelet i Fred Flintstones bil, og et industrielt design der er så smukt, at Steve ville have ansat mig på stedet ...

Bzzzt (Steen skifter til realistisk chef-rolle)

Når et projekt skal scopes, kan det fremme chancen for succes at vurdere de tilstedeværende ressourcer til gennemførelsen.

  • Antal udviklere til rådighed? Én - (og de udviklere, jeg leder på arbejdet, vil grine r**en i laser, hvis jeg kalder mig softwareudvikler) 
  • Hvor mange procent af tiden kan dedikeres til opgave? Aftener og weekender.
  • Har du andet at lave i din fritid? Hustru+barn+husejer+frivilligt arbejde+stor have+ ...
  • Historisk evne til at færdiggøre den slags projekter? Pinligt ringe! Færdig er som regel lig med løs printplade med fuglerede af ledninger strittende i alle retninger.
Godt så!

Bzzzt (Steen skifter tilbage til en mere realistisk "udvikler"-rolle)

Således ydmyget på skrift for egen hånd, kan vi begynde at scope projektet. Hvad skal vi bruge?

Hardware

Jeg skal altså lave en dims, som kan tænde og slukke for to strømudtag via internettet, og grundet begrænset tid til opgaven vil jeg tillade mig at nøjes med en indkapsling med fokus på sikkerhed mod elektrisk stød (så færdig har jeg aldrig prøvet at være før), snarere end at resultatet ser smukt ud (og det har intet at gøre med, at jeg er dårlig til det visuelle design. INTET siger jeg!).

Så jeg må en tur i Harald Skrald for at skaffe et par LK-udtag og forfra-dåser samt en tur på nettet for at finde en passende plastkasse, som kan rumme herligheden.

En af de mange skuffer i kælderen indeholder nogle 230V/10A relæer. Der skal sikkert laves lidt driverkredsløb, men det kan klares med et par standard-transistorer og et par dioder (skuffe nummer 2). Så langt, så godt

Hvis nu jeg havde masser af tid, og jeg ville lave et kommercielt produkt, ville BOM-kosten samt den fysiske størrelse have betydning.

Men da jeg mangler tid og til gengæld er lidt ligeglad med prisen pr. enhed, vælger jeg en totalt overkill-standardplatform.

Der er masser af muligheder at vælge mellem. Jeg vælger at benytte en Raspberry Pi til formålet. Hvorfor? Der var en i skuffen!

En Raspberry Pi er et fantastisk anvendeligt lille print, der indeholder en komplet computer med Ethernet, usb og HDMI.

Mange benytter dem til for eksempel mediecentre, og jeg bruger selv et par stykker i mit IHC-projekt derhjemme (som jeg måske en gang i fremtiden vil skrive lidt om).

Raspberry Pi er bygget op omkring en 700 MHz ARM-processor og kører typisk Linux (Raspbian, baseret på Debian). Den kan også køre en begrænset version af Windows 10, men jeg holder mig til Linux.

Til vores formål er den mere end rigeligt. Der er 17 GPIO-pins (general purpose i/o) til rådighed. Jeg skal kun bruge to til relæerne.

Jeg kan vælge at bruge Ethernet til at forbinde til internettet, eller jeg kan sætte en wifi-dongle i USB-porten. Der er jo ikke nødvendigvis et Ethernetstik lige der, hvor dimsen skal placeres, så jeg vælger at bruge WiFi.

Da man har en Linux under motorhjælpen, er der fra scratch adgang til den fulde pallette af værktøjer, som man har på sin almindelige Linuxkværn. Det gør det meget nemmere, når vi skal til at kode.

Hermed har vi nogenlunde styr på hardwaren.

Software

Da enheden skal kontrolleres af et andet softwaresystem, skal vi definere et API (Application Programming Interface), så udvikleren i den anden ende ved, hvordan han skal sende en kommando, og hvilke resultater han kan forvente retur.

Dernæst - da enheden skal kunne kontrolleres via internettet - skal vi have et vist minimum af sikkerhed, så en tilfældig fremmed ikke lige pludselig kan tænde for dine elektriske apparater.

Jeg forestiller mig i første omgang bare at implementere en basal brugervalidering og bruge SSL.

(Bemærk: Hvis dette skulle blive til et kommercielt produkt, skal der bruges væsentlig mere tid på at tænke sikkerheden igennem. Min løsning er quick and dirty.)

Brugervalideringen laver vi som http-digest, der sikrer, at passwordet ikke sendes som klartekst.

Man kunne argumentere for, at hvis vi kører HTTPS, så er det unødvendig med yderligere kryptering af password. Til det vil jeg blot svare https://xkcd.com/1354/

Selve API'et kan laves simpelthen ved at kalde en webside, hvor kommando og parametre er en del af selve URL'en. Websiden returnerer så et svar.

https://example.dk/control.php?action=&device=

Hvor ACTION kan tage følgende værdier:
ON: Tænd enhed
OFF: Sluk enhed
STATUS: Er enhed tændt eller slukket?

Og DEVICE er den konkrete enhed, man ønsker at tænde/slukke. Vi laver to udtag, så DEVICE kan antage værdierne 1 eller 2.

Returværdien kan være f.eks. DEVICE_1_ON, OFF eller en fejlmeddelelse.

API-dokumentet i sin helhed kan I læse her.

Så rent softwaremæssigt kan vi konkludere, at vi har brug for en webserver, og at den skal køre https. Jeg vælger at skrive koden i php, da det er det sprog til web-serverside, som jeg har mest erfaring med at bruge. 

Vælg det sprog, som du er tryg ved at bruge. Der er ingen krav til performance eller særlig speciel funktionalitet i vores tilfælde, så 'anything goes.'

Afgrænsninger

Hvis dimsen skal kunne installeres og benyttes af folk uden særlig kompetence, bør der tænkes over, hvordan installationsprocessen kan gøres simpel.

Antaget at vi vælger at benytte WiFi, er installationstrinene følgende:

1. Konfigurer WiFi til SSID og WPA-key, som WiFi-routeren benytter.
2. Konfigurer routeren til at reservere en bestemt IP-adresse til dimsen.
3. Konfigurer en ny NAT-regel i WiFi-routeren, som peger en port ned mod dimsens IP.

Det involverer, at man skal tilgå command line på Raspberry Pi'en gennem ssh og besidder viden om, hvordan en router konfigureres.

Det ville ikke være en acceptabel løsning, hvis produktet skulle kommercialiseres. På grund af den begrænsede tid er det dog denne løsning, jeg ender med at nøjes med.

Hvis nogle skulle have tid og lyst til at gøre det til et mere 'brugervenligt' produkt, ville jeg nok foreslå, at man implementerede WPS-funktionalitet (WiFi protected setup), så WiFi kan konfigureres med et tryk på en knap.

Dernæst ville jeg implementere en basis-UPnP-funktion, så dimsen selv kan åbne en port i routeren via UPnP-IGD. Det ville betyde, at alt hvad brugeren skal gøre for at installere er at trykke på WPS-knapperne på dimsen og routeren inden for to minutter, og så ville alt blive konfigureret automagisk.

Budgetoverslag

Med ovenstående beslutninger burde vi kunne lave et nogenlunde budgetoverslag.

Da jeg har en del af stumperne allerede bliver det selvfølgelig billigere for mig, men hvis du skulle ud og købe alt så vil dette være den omtrentlige omkostning (du kan helt sikkert finde nogle af tingene billigere, hvis du gør dig den ulejlighed at shoppe lidt rundt).

Raspberry pi incl SD-kort: 350 kr
Wifi-dongle: 150 kr
2 strømudtag inklusivl forfradåser: 210 kr
2 relæer: 40 kr
En stump veroboard + diverse småkomponenter: 50 kr
En passende kasse: cirka 100 kr

I alt: cirka 900 kr

Er det egentlig dyrt? Denne kommercielle variant koster 1070 kr incl forsendelse, og har fire programmerbare udtag.

Vi kan tilføje udtag til ca. 100-120 kroner pr. udtag, så fire udtag ville bringe vores pris op på omkring 1.150 kroner. For de 70 kroner i mérpris får vi jo oceaner af sjov og spas med elektronik og programmering oven i hatten!

Og så er det smukke ved DIY, at man kan lave lige præcis de bizarre specialfunktioner, som man har lyst til. Jeg synes altid, jeg rammer ind i en eller anden irriterende begrænsning, når jeg leger med hyldevarer.

En sidste fordel er bedre privacy, da du med din egen dims ikke risikerer at dele information med en tilfældig virksomhed om dine vaner derhjemme.

That's it, folks. Næste skridt at få skaffet de ting, jeg mangler, og konfigurere Raspberry Pi'en. Det skriver jeg mere om i næste afsnit.

Husk, I kan følge mig på Facebook, hvor jeg skriver løst og fast om teknologi, og hvor I kan komme med forslag til emner som jeg kan tage op i klummen: 

Min lille private teknologiske losseplads finder I her, hvor jeg dumper de artikler, jeg har skrevet, og diverse andet snask - alt sammen med primær fokus på teknologi.