Hopp til hovedinnhold

Det er lite som er like inspirerende som å kunne løse sine egne problemer med teknologi! Les om hvordan jeg, som ivrig toppturentusiast, har tilgjengeliggjort snøskredvarselet fra varsom.no som app til Garmin-klokker.

Når vinteren kommer, og det endelig kommer snø i fjellene, drar jeg på tur. Aller helst med toppturski på beina. Og når man går på topptur er det veldig lurt å ha kontroll på skredvarselet! NVE publiserer daglige skredvarsler for de fleste regioner i Norge mellom mellom 1. desember og 31. mai årlig på varsom.no, og disse varslene kan være livsviktig informasjon som bidrar både i turplanlegging, og til å ta trygge valg underveis på turen.

Inspirasjon 💡

Varsom tilbyr allerede apper for å lese skredvarselet på mobilen, men når eks-kollega Jonas Follesø lagde en app for å vise skredvarselet på Apple Watch, fikk jeg inspirasjon til å lage en app for Garmin også, siden jeg har vært fan av Garmin sine klokker helt siden jeg kjøpte min første fēnix for mange år siden.

Jeg hadde også flere ganger irritert meg over at Varsom sin iOS-app ikke synkroniserer varselet offline til telefonen. Det gjør at det er litt vanskelig å sjekke varselet ute i felt eller på parkeringen, hvis man skulle ha glemt å sjekke det før man drar hjemmefra. Derfor var en av hovedprioriteringene for appen min at varselet skulle synkroniseres til klokka, slik at man kunne få lest det også uten internett.

Monkey C, monkey do 🐒

Da jeg startet på prosjektet hadde jeg ingen tidligere erfaring med klokkeprogrammering av noe slag, og da iallefall ikke Garmin sitt økosystem. Det ble derfor tidlig klart at prosjektet kom til å ha en relativt bratt læringskurve.

For å programmere apper til klokkene tilbyr Garmin en SDK som benytter et hjemmesnekra programmeringsspråk som heter Monkey C 🐵. Monkey C er litt som om Javascript og Java fikk et barn sammen, så heldigvis føles språket relativt kjent hvis man har programmert med noen av de før. Visual Studio Code er den anbefalte IDEen å bruke, og Garmin har en offisiell plug-in som anbefales brukt til utvikling. Totalt sett har det gått veldig greit å komme i gang med, bortsett fra to ting: Minne og skjermplass.

Minne 💾

I tillegg til utfordringene med programmeringsspråk og SDK, ble det også ganske raskt klart at et av hovedproblemene med å få appen til å kjøre, kom til å være tilgjengelig minne på klokkene. Jeg ønsket å støtte så mange klokker som mulig når jeg først var i gang, og ble da raskt klar over at mange av de litt eldre klokkene har særdeles begrenset minnekapasitet. Noen klokker har så lite som 20kb(!) tilgjengelig minne når appen kjører.

Så på grunn av dette ble det raskt klart at jeg ble nødt til å skrive et proxy-API mellom Varsom sitt API og klokkene, slik at klokkene ikke gikk tom for minne når de spurte Varsom om skredvarselet. I tillegg måtte appen tilpasses relativt grundig slik at jeg ikke gjorde for mye fancy greier samtidig, og gikk tom for minne 💥.

Det var egentlig ganske artig å forholde seg til at man har en minnebegrensning, siden det er sjeldent man tenker på minnekostnaden av programmeringen man driver med i det daglige.

topptur
Sånn det skal være om vinteren ⛷️

Skjermplass ⌚️

En annen interessant problemstilling når man jobber med klokke som flate, er mengden tilgjengelig skjermplass. I det daglige er jeg vant med å å jobbe på vesentlig større flater, og jeg trenger egentlig aldri å tenke på om det jeg vil vise får plass på skjermen eller ikke. På klokker er det helt motsatt: Man har nesten ingen plass til å vise den informasjonen man vil.

Et skredvarsel består av flere deler. Det viktigste er selvsagt selve faregraden, som går fra 1 til 5, samt en beskrivende tekst. Men det er også en annen veldig viktig del av varselet: Aktuelle skredproblemer.

Skredproblemene for et gitt varsel sier noe mer spesifikt om hvilke farer som befinner seg i fjellet. Hvilke himmelretninger er farlige, hva slags type skred er forventet, og hvor høyt eller lavt må man befinne seg for å være i faresonen. Det var viktig for meg å få med disse skredproblemene inn i appen når jeg først skulle vise skredvarselet på klokka, og jeg ble derfor nødt til å legge inn en stor innsats for å få vist en oppsummering av skredproblemene uten at all skjermplass ble brukt opp.

Visning av faregrad på klokka
Visning av skredvarselet på klokka

Betaling 💸

Når jeg først måtte etablere en backend for å kunne støtte appen, bestemte jeg meg for at jeg ville ta litt betalt dersom den skulle ut til massene, slik at jeg kunne få dekket serverkostnader og litt til uten å gå i minus. Jeg endte derfor med en sum på 30kr per år for å bruke appen.

I motsetning til Apple og Google, tilbyr ikke Garmin noen direkte måte å ta betalt for apper på i sin app store, så det må man ordne selv.

Jeg hadde ingen erfaring med integrering mot betalingsløsninger, men Vipps virket som et naturlig alternativ, siden omtrent alle har det, og det er veldig enkelt for brukere å gjennomføre betalinger. Jeg integrerte derfor med Vipps som betalingsløsning, og i høst har jeg også integrert med Stripe, slik at også folk som ikke har Vipps kan få skaffet seg appen.

Backend ⚙️

Appen består av to deler: Selve klokke-appen, og en backend som ligger på skredvarsel.app. Backenden fungerer som API for klokka og frontend for betaling av abonnement.

Backenden er skrevet i .NET, med PostgreSQL som database, og Hangfire for å kjøre periodiske jobber for å synkronisere mot Vipps. Frontendløsningen er en veldig enkel React/Vite-app, som bruker Chakra UI som komponentbibliotek. Backenden integrerer med Vipps Recurring og Stripe Subscriptions for å gjennomføre betalinger, og man kan logge inn med Vipps, Google eller Facebook.

Ønsket mitt når jeg lagde backenden var å bruke flest mulig kjente teknologier, siden jeg allerede hadde mer enn nok med å lære meg Garmin SDKen og Monkey C for å lage klokkeappen.

Både appen og backenden er åpen kildekode, og kildekoden kan finnes på GitHub.

Status 🏔️

Jeg begynte å jobbe med appen i februar 2023, og satte meg et mål om å prøve å få lansert før skisesongen var over. I starten av april fikk jeg ut første versjon, og etter litt blæsting på diverse Facebook-grupper for toppturer, fikk jeg raskt mine første brukere. Jeg var også så heldig å få en artikkel om appen min i Fri Flyt, noe som virkelig satte fart på nedlastingene.

Jeg har lært masse om både klokkeprogrammering, små skjermer, minneoptimalisering, og integrasjon med betalingsløsninger. Alt i alt har det sålangt vært et veldig givende prosjekt, og det har gitt meg kunnskap som jeg allerede har fått bruk for i jobbsammenheng.

I tillegg til å kontinuerlig støtte nye klokker, har jeg i fremtiden planer om å få inn støtte for å automatisk velge region basert på GPS-posisjonen til klokken, samt støtte planlagte endringer som Varsom innfører rundt skredvarslingsregioner i 2024/2025 sesongen.

I skrivende stund har appen litt over 500 brukere, og ser ut til å fungere fint for de aller fleste. Den støtter omtrent alle Garmin-klokker som er lansert de siste 5 årene, og henter automatisk skredvarselet hver time hele vinteren. Så hvis du skal på topptur i vinter, ta en titt da vel?

Du finner mer informasjon her ➡️ skredvarsel.app

Liker du innlegget?

Del gjerne med kollegaer og venner