VIGTIGT: LÆS DETTE, før du beslutter dig for at bygge noget i denne retning. Denne enhed forbindes direkte til 230V, hvilket er livsfarligt at rode med! Jeg joker ikke – Det gør i bedste fald p*sseondt at få stød, og i værste fald DØR du af det. Du kan starte en brand og det kan man også DØ af! Du bør ikke rode med netspænding uden et minimum af viden&erfaring.
En af mine gode venner, Dan, står bag et nyt smart collaboration tool, Skarpline. Lidt alá 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 det, gik snakken om at kommunikere med Internet of Things fra en åben platform som Skarpline.
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 endte med en lidt mere generisk løsning, med muligheden for at tænde/slukke for et par strømudtag over internettet. 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 der ude som kunne tænke sig at lave noget tilsvarende? Man kan sikkert købe en kommerciel løsning billigere, men hvad sjovt 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.
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 sluttelig 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 så kan det fremme chancen for succes at vurdere de tilstedeværende ressourcer til gennemførslen.
– Antal udviklere til rådighed: 1 (og de udviklere jeg leder på arbejdet ville grine r**en i laser hvis jeg kalder mig software udvikler)
– Hvor mange procent af tiden kan dedikeres til opgaven: 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 = 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 så 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 se smuk ud (og det har intet at gøre med at jeg er dårlig til det visuelle design. INTET siger jeg!).
Så 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 driver kredslø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, så ville BOM-kosten samt den fysiske størrelse have betydning. Men da jeg mangler tid og til gengæld er lidt ligeglad med prisen per enhed, så vælger jeg en totalt overkill standard platform.
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 f.eks. 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) men kan også køre en begrænset version af windows 10. Jeg holder mig til linux.
Til vores formål er den mere end rigeligt. Der er 17 GPIO (general purpose i/o) pins til rådighed. Jeg skal kun bruge 2 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 software system, 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, så skal der bruges væsentlig mere tid på at tænke sikkerheden igennem. Min løsning er quick&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=<ACTION>&device=<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: http://www.nørdoteket.dk/index.php/gds-iot-api-beskrivelse/
Så rent softwaremæssigt kan vi konkludere, at vi har brug for en webserver og 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:
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å commandline på raspberry pi’en gennem ssh, og viden om hvordan en router konfigureres. Det ville ikke være en acceptabel løsning, hvis produktet skulle kommercialiseres. Pga. den begrænsede tid er det dog denne løsning jeg ender med at nøjes med.
Hvis nogle skulle have tid/lyst til at gøre det til et mere ’brugervenligt’ produkt ville jeg nok foreslå, at man implementerede WPS (wifi-protected-setup) funktionalitet, 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 indenfor 2 minutter, og så ville alt blive konfigureret automagisk.
Budget overslag:
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 incl forfradåser: 210 kr
2 relæer: 40 kr
En stump veroboard + diverse småkomponenter: 50 kr
En passende kasse: ca. 150 kr
I alt: ca. 950 kr
Er det egentlig dyrt? Denne kommercielle variant koster 1070 kr incl forsendelse, og har 4 programmerbare udtag.
Vi kan tilføje udtag til ca. 100-120 kr per udtag, så 4 udtag ville bringe vores pris op på omkring 1200 kr. For de 130 kr 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.