Sesam

  • Low voltage, Arduino, C++, MQTT, Docker, Node, NextJS, TypeScript, React

Sesam er KodeWorks egenutviklede interne system for dørlås og ringeklokke. Både hardware og software er utviklet helt fra scratch av KodeWorks.

Når man er mellom kundeoppdrag i KodeWorks, er faglig utvikling i fokus. Samtidig kan også ekte verdiskapning være en del av det faglige opplegget. På kontoret i Oslo fikk Jan og Simen en interessant oppgave i det å modernisere dørlåssystemet på huset.

Bruken av konvensjonelle nøkler i en kontorsammenheng medfører ulemper. Man må ha oversikt over hvilke personer som har nøkler, og fornye disse om de går tapt. Tap av nøkler gjør det vanskeligere for enkeltpersoner å få tilgang på kontoret, og kan i verste fall utgjøre en stor sikkerhetsrisiko.

Dagens eksisterende løsninger for styring av dørlåser tilbyr kodelåser, adgangskort, alarmstyring via nettapp og annen funksjonalitet, men krever samtidig at man går fysisk til verks på dørene i bygget. Da vårt mål var en løsning tilpasset våre behov, og med lavest mulig grad av utvidelse av fysiske låser, dører og kretser i bygget, fremsto det å lage løsningen selv fra bunnen av som det beste alternativet.

sesam-2.jpg

Jan og Simen gikk dermed inn i prosjektet med mål om å lage en løsning som kunne styre dørlåsene på kontoret med en nettapplikasjon. Det ble altså nødvendig å bygge en løsning fra bunnen, som i én ende kunne slutte kretsene til to dørlåser og lese dørklokkesignalet, og på den andre enden kunne tilby sluttbrukeren et intuitivt brukergrensesnitt for nettopp dette.

Dermed skulle altså Sesam, vårt eget dørlåssystem, se dagens lys.

Etter daværende løsning ble dørlåsene for indre og ytre dør styrt ved å slutte to forskjellige elektriske kretser. Krets for indre dør lå eksponert i et eget eksisterende relé, og krets for ytre dør kunne aksesseres via callinganlegget på huset.

sesam-3.jpg

Etter litt konsultasjon med Thomas i KodeWorks ble tre loddepunkter på PCBen til callinganlegget identifisert. Ett til jording, et som slutter kretsen til dørlåsen og et som settes under spenning når dørklokka aktiveres fra utsiden. Det ble bestemt at disse kretsene skulle sluttes ved bruk av reléer, og en enkel måte å gjøre dette på er å styre disse feks med en Arduino. Dermed ble løsningen å sette opp to Arduinoer med hvert sitt relé, en til hver dør. Arduinoen for ytre dør, som med sin tilknytning til callinganlegget også kunne lytte pål dørklokkesignalet, ble også koblet opp til å registrere når dette signalet er aktivt, for å kunne melde dette videre til backend.

Dermed var løsningen for å kontrollere dørlåser og registrere dørklokkesignal på plass. På lokalnettet på huset var det altså tre komponenter som nå skulle kommunisere - Sesam-serveren og to Arduinos. Til kommunikasjon mellom disse komponentene ble MQTT-protokollen valgt. MQTT blir gjerne valgt i IoT-løsninger med mange enheter og store datamengder da den i utgangspunktet er en lettvekt-protokoll der pub/sub-rutinen hos en enkeltenhet skjer uavhengig av andre enheters tilkobling til en sentral MQTT-broker. Samtidig tilbyr MQTT høy justerbarhet for parametre som øker integriteten i dataoverføringen eller tar vare på pakker ved tapt forbindelse. Dette senker ytelsen i større systemer, men er nyttig i småskala applikasjoner der integriteten i dataoverføringen må kunne garanteres.

Backenden bruker Node.js med Express, og tilbyr et RESTful HTTP API til frontend, som er en nettapplikasjon skrevet med React. NextJS blir brukt til å tilby alle sider i nettappen, som følger det nye visuelle designet til KodeWorks. Videre kommuniserer backenden beskjeder til mikrokontrollere via MQTT-protokollen. En lokal MQTT-broker kjører i en egen Docker-container, og distribuerer meldinger om dørklokker, åpning og låsing av dører, og heartbeat-meldinger frem og tilbake mellom mikrokontrollere og backend.

sesam-1.jpg

Til autentisering og autorisering blir Google OAuth brukt, slik at kun brukere med KodeWorks-mail kan logge seg inn. Dette ble satt opp i Google Cloud Console, og Google Admin SDK ble deretter brukt til å sjekke om en bruker er en del av enten Trondheim eller Oslo-gruppa i KodeWorks. Dette er for å sikre at kun personer med faktisk tilknytning til bedriften får tilgang til å løse opp dørene. Gitlabs CI/CD Pipelines er blitt brukt til å deployere appen automatisk til serveren.

Når en bruker trykker på døråpningsknappen, forventer man å få en visuell tilbakemelding på at noe skjer. I Sesam er dette gjort ved at backend mottar en melding fra den aktuelle mikrokontrolleren i dét døra åpnes, og dermed låser knappen i appen helt til backend mottar melding om at dørlåsen igjen er lukket. Denne kommunikasjonen gjøres med Websockets, og en naturlig videreføring av dette ble at knappen hos samtligere brukere låses dersom én bruker aktiverer knappen i sin klient. En kan naturligvis argumentere for at sanntidsoppdatering på en app som styrer to dører i samme lokale ikke er høyst nødvendig, men på den annen side gjenspeiler det brukervennlighet som prinsipp, og det er alltid lurt å ha i hodet. Et eget administratorvindu ble også utviklet. Dette gir enkelte brukere tilgang til statistikk på bruken av Sesam, samt å stenge/åpne hele tjenesten for bruk.

Til slutt har dessuten en svært viktig del av prosjektet vært jobben som ble gjort i forkant. Ved prosjektstart ble Jan og Simen presentert en svært godt utarbeidet prosjektbeskrivelse. Denne inneholdt en klar beskrivelse av produktet, samt funksjonelle og ikke-funksjonelle krav til både produkt og gjennomføring av prosjektet. En såpass godt formulert samling av krav og rammer gir utvikleren muligheten til å stille kritiske spørsmål, presentere alternative løsninger og danne seg et helhetlig bilde av produktet i innledningsfasen, og legger til rette for en synlig prosess og produktiv kommunikasjon. Jan og Simen kan dermed se tilbake på et lærerikt prosjekt og godt gjennomført prosjekt.