Vise Været Med Serverless og Farger

0
58

Jeg liker å jogge. Noen ganger er det kaldt ute. Noen ganger er det kaldt ute, men det ser ut som det er det ikke. Solen skinner, fuglene er chirping. Så du går ute i shorts og en t-skjorte og innse at du har omtrent 2 minutter før eksponering setter inn.

Jeg bestemte meg for å løse dette first world problem ved hjelp av en lyspære til å vise en viss farge, avhengig av hvilken temperatur det er ute. Det fungerer bedre enn jeg forventet, og det er å si noe fordi vanligvis ingenting virker ut som jeg vil ha det til.

Dette var et morsomt prosjekt å bygge, og siden det i hovedsak er en vertsbasert tjeneste som kjører på en timer, det er en perfekt use case for Serverless.

Nå tenker du kanskje, “um det, ville det ikke være enklere å bare sjekke været?” Vel, ville det, men da jeg ikke ville ha en unnskyldning for å kjøpe et dyrt lyspære eller skrive en artikkel med ordet “Serverless.”

Så la oss se på hvordan du kan bygge din egen Vær-Pære. Den endelige koden er ikke komplisert, men det har noen interessante stykker som er verdt å merke seg. Forresten, sa jeg nevne at det er Serverless?

Bygningen Været Pære

Det første du kommer til å trenge er pære. Du kan ikke ha Været Pære sans pære. Si ordet “bulb” høyt om 10 ganger og du vil merke hva en bisarr ord det er. Pære, pære, pære, pære — se? Merkelig.

Jeg bruker LIFX Mini Farge. Det er ikke *for* dyrt, men enda viktigere, det har en API som er vid åpen.

API har to metoder for godkjenning. Den første inneholder ordet “Email” og jeg er allerede lei for at du måtte lese det. Ikke bekymre deg, det er en enklere måte som ikke involverer OAu…. det som ikke vil bli navngitt.

Den andre måten er å registrere en søknad med LIFX. Du får tilbake en nøkkel, og alt du trenger å gjøre er å passere som nøkkel med noen HTTP-forespørsel. Det er det jeg bruker på denne demoen.

For eksempel, hvis vi ønsket å endre lyspære farge til blått, og vi kan bare passere farge: blå /state-endepunkt.

API støtter mange forskjellige farger formater, inkludert heter farger (for eksempel rød, blå), heksadesimale verdier, RBG, Kevlin, hue, lysstyrke og metning. Dette er viktig fordi det faktorer inn i det som viste seg å være den vanskeligste delen av dette prosjektet: å slå temperatur i farge.

Som Representerer Temperatur Med Farge

Hvis du noensinne har sett en værrapport, vil du bli kjent med hvordan dette meteorologi representerer værforhold med farge på et kart.

Vanligvis, dette er gjort for å visualisere nedbør. Du har trolig sett at illevarslende grønn stripe av stormer bærer ned på deg på et værkart mens du prøver å finne ut om du bør få i badekaret, fordi du er i bane av en tornado. Eller kanskje det er bare alle av oss uheldige sjeler her i Amerika ‘ s Tornado Alley.

Fargen er også brukt til å representere temperatur. Dette er nettopp hva jeg ønsket å gjøre med pære. Den tøffe ting er at det ikke synes å være en standardisert måte å gjøre dette på. Noen kart viser det som heldekkende farger i band. I dette tilfellet, blå kan representere band fra 0℉ – 32℉.

Andre har det som en gradientskala som er mer presis. Dette er hva jeg var tross for Været Pære.

Min første stikk på å løse dette på, var det bare å Google “temperatur fargeskala” og andre ulike versjoner av det aktuelle søkeordet. Jeg fikk tilbake mye informasjon om Kelvin.

Kelvin er en representasjon av temperaturen på en farge. Bokstavelig talt. For noen lyskilde (lyspære, sola, ect) den faktiske temperaturen av at kilden vil påvirke fargen på lyset den avgir. En ild brenner en gulaktig rød farge. Jo varmere at brann blir, jo mer det går mot hvite. Derfor sier, “varm hvit”. Så hvis noen sier noensinne “red hot” du kan korrigere dem foran alle, fordi den som ikke elsker en pedantic rykk?

Den LIFX pære støtter Kelvin, så kan du kanskje tror at dette vil fungere. Tross alt, dette er Kelvin-skalaen….

Problemet er at det er rett og slett ikke nok farge variasjon fordi disse er ikke faktiske fargene, men heller snev av farge som en light-emitting basert på “temperaturen”. Her er Kelvin fargehjulet som kommer med LIFX-appen.

Disse fargene er knapt skilles fra hverandre på pære. Ikke akkurat det jeg var ute etter.

Det etterlater meg med å prøve å konvertere farger til Hex, RGB-eller noen andre-format. Dette er tøft fordi hvor vil du begynne? Jeg brukte en pinlig tiden justere RGB-verdiane mellom blå for kaldt (0, 0, 255) og rødt for varmt (255, 0, 0). Det var omtrent på denne tiden at det gikk opp for meg at kanskje HSL ville være en bedre vei å gå her. Hvorfor? Fordi kulør er en hel mye enklere å forstå.

Hue

Kulør er en representasjon av fargen på en skala mellom 0 og 360. Dette er grunnen til at vi ofte ser farger representert på et hjul (360°). Det er et stort overforenkling, men med mindre du vil ha meg til å begynne å snakke om bølgelengder, la oss gå med definisjonen.

Kulør farge hjul ser ut som dette….

Hvis vi slår sammen det ut, det er lettere å samtale om.

Vi er klar til å konvertere temperatur til farge. Det første vi trenger å gjøre er å finne ut en innstilt temperatur. Jeg gikk med 0℉ til 100℉. Vi kan ikke regne med uendelig temperatur farge kombinasjoner. Tallene gå på for alltid, farger ikke. Det kan bare bli så varm før vår pære er bare lyse rødt hele tiden, og det er 100℉. Det samme er sant for kaldt.

Hvis lys blå representerer 0℉, jeg kan begynne på omtrent 200 mark på nyanse skala. Rødt vil representere 100℉. Du kan se at rødt er på begge ytterpunktene, slik at jeg kan gå enten til venstre ELLER høyre, avhengig av hvilke farger jeg vil bruke til å representere temperatur. Det er ikke det samme som farger de bruker i selve været, programmer, men hvem bryr seg? Tydeligvis ikke meg.

Jeg valgte å gå rett fordi det er ingen rosa på venstre og rosa er min favoritt farge. Jeg følte også liker rosa representerer varm litt bedre enn grønn. Grønt er regn og tornadoer.

Nå kan vi tilbake til hue basert på temperatur. Er du klar? Her går vi.

La oss late som det er en rask 50℉ utenfor.

Hvis 100℉ er den hotteste vi gå (360) og 0℉ er den kaldeste (200), så har vi en fargeskala på 160 poeng. For å finne ut hvor i at 160 poeng utvalg vi trenger å være, kan vi dele den gjeldende temperaturen ved øvre grense på 100℉ som vil gi oss den eksakte prosentandelen vi må flytte i vårt utvalg, eller 50%. Hvis vi går 50% av veien inn i en 160 poeng utvalg, som etterlater oss på 80. Siden vi starter på 200, som gir oss en nyanse av 280.

Det høres komplisert ut, men bare fordi ordet problemer i matematikk SUGE. Her er hvordan koden ser ut når alt er sagt og gjort…

la hue = 200 + (160 * ( temperatur / 100 ));

OK! Vi har fått en dynamisk farge skala basert på hue, og ville ikke du vet det, vi kan bare passere hue til LIFX som rett og slett som vi passerer en navngitt farge.

Nå trenger vi bare å finne ut hva den gjeldende temperaturen er tilbake i en fargetone og gjør at hvert par minutter. Serverless, her kommer vi!

Serverless Stoppeklokke

Serverless er alle raseri. Det er som HTML5 pleide å være: det spiller ingen rolle hva det er, betyr det bare at du vet ordet, og er ikke redd for å bruke det i et blogginnlegg.

For dette eksempelet, vil vi bruke Azure Funksjoner fordi det er støtte for timer utløser, og vi kan teste de timer utløser lokalt før vi distribuere ved hjelp av VS-Koden. En av de tingene om Serverless som irriterer meg å ingen ende er når jeg ikke kan debug det lokalt.

Ved å bruke Azure Funksjoner Core-Tools og Azure-Funksjoner Utvidelse for VS-Koden, kan jeg opprette en ny Serverless prosjektet, og velg en Tidtaker Utløse.

Tidtaker Utløser i Azure Funksjoner er angitt som Cron Uttrykk. Ikke bekymre deg, jeg visste ikke hva det var.

Cron Uttrykk tillate deg å bli svært spesifikk med intervall definisjon. Cron bryter ting ned til sekund, minutt, time, dag, måned, år. Så hvis du ønsker å kjøre noe hvert sekund, hvert minutt, hver time, hver dag, hvert år, uttrykket ville se ut som dette…

* * * * * *

Hvis du ønsker å kjøre det hver dag klokken 10:15, ville det se ut som dette…

* 15 10 * * *

Hvis du ønsker å kjøre det hver 5 minutter (som er hva Azure standard), angir du det ved å si: “når minuttene er delelig med 5.”

0 */5 * * * *

Ved anvendelsen av denne funksjonen, setter vi den til 2 minutter.

Jeg bruker en 2 minutters intervall for hvor ofte vi kan kalle været API for gratis 💰.

Få varsel Fra DarkSky

DarkSky har en herlig vær API som du kan ringe opp til 1000 ganger per dag for gratis. Hvis det er 1,440 minutter på en dag (og det er), som betyr at vi kan ringe DarkSky hver 1.44 minutter per dag, og bo i det fri sone. Jeg har nettopp rundet opp til 2 minutter fordi temperaturen ikke forandrer seg så fort.

Dette er hva vår funksjon ser ut som når vi kaller DarkSky API. Alle mine billetter, nøkler, breddegrad og lengdegrad innstillinger er i miljøvariabler så de ikke faste. De er angitt i lokal.innstillinger.json-fil. Jeg brukte axios for min HTTP-forespørsler, fordi det er en magisk magisk pakke.

const axios = kreve(‘axios’);

modul.eksport = function (kontekst, myTimer) {
// bygge opp DarkSky endpoint
la endepunkt = `${prosessen.konv.DS_API}/${prosessen.konv.DS_SECRET}/${prosessen.konv.LAT},
${prosessen.konv.LNG}`;

// bruker axios å ringe DarkSky for været
axios
.få(endepunkt)
.deretter(svar => {
la temp = Matematikk.runde(respons.data.for tiden.temperatur);

// TODO: Angir fargen på LIFX pære
})
.catch(err => {
sammenheng.logg(err.melding);
});
};

Nå som jeg har temperaturen, jeg må ringe LIFX API. Og ville ikke du vet det, noen har allerede opprettet en npm-pakke til å gjøre dette kalles lifx-http-api. Dette er grunnen til at du elsker JavaScript.

Innstillingen Pære Hue

Etter været resultatet kommer tilbake, jeg trenger å bruke den LIFX API eksempel og ringe setState metode. Denne metoden returnerer et løfte som betyr at vi trenger å hekke løfter. Hekkende lover kan få ut av hånden og kunne lande oss rett tilbake i innb. helvete, som er det vi prøver å unngå med løfter i første omgang.

I stedet, vi vil håndtere det første løftet, og deretter gå tilbake Løfte.alle som vi kan håndtere på en annen topp-nivå da. Dette hindrer oss fra hekkende deretter uttalelser.

Husk barn, løfter er bare sosialt akseptabelt tilbakering.

const axios = kreve(‘axios’);
const LIFX = kreve(‘lifx-http-api’);

la client = new LIFX({
bearerToken: prosessen.konv.LIFX_TOKEN
});

modul.eksport = function (kontekst, myTimer) {
// bygge opp DarkSky endpoint
la endepunkt = <code>${prosessen.konv.DS_API}/${prosessen.konv.DS_SECRET}/${
prosessen.konv.LAT
},${prosessen.konv.LNG}<code>;

// bruker axios å ringe DarkSky for været
axios
.få(endepunkt)
.deretter(svar => {
la temp = Matematikk.runde(respons.data.for tiden.temperatur);

// sørg for at temp er ikke over 100 fordi det er så høyt som vi kan gå
temp = temp < 100 ? temp : 100;

// bestemme hue
la hue = 200 + (160 * (temp / 100));

// gå tilbake Løfte.alle så vi kan løse på øverste nivå
tilbake Løfte.alle([
data,
klienten.setState(‘alle’, { color: <code>hue:${hue}<code> })
]);
})
.deretter(resultat => {
// resultat[0] inneholder darksky resultat
// resultat[1] inneholder LIFX resultat
sammenheng.logg(resultat[1]);
})
.catch(err => {
sammenheng.logg(err.melding);
});
};

Nå kan vi kjøre denne saken lokalt og se våre timer gjør det thang.

Det er det! La oss bruke den.

Distribusjon Av Været Pære

Jeg kan lage en nye Funksjoner prosjektet fra VS-Kode extension.

Jeg kan høyre-klikk på det for å “Åpne i portal”, der jeg kan definere en distribusjon kilde så det suger koden min i fra Github og distribuerer den. Dette er ideelt for nå når jeg trykker på en endring til Github, søknaden min blir automatisk redeployed.

All Hail Været Pære

Nå er det bare å lene seg tilbake og se på den myke gløden av Været Pære! Hvorfor ser på den faktiske temperaturen når du kan se på denne vakre nyanser av varm rosa i stedet?

Kan du gjette hva temperaturen er basert på hva du vet fra denne artikkelen? Personen som forlater en kommentar og får nærmest vil få en gratis LIFX lyspære fra meg (fordi jeg ❤️ alle dere), eller kostnaden av pære hvis du er utenfor USA (~$40).

Du kan få alle av koden for dette prosjektet fra Github.