NeoWeather: Ambient Weather indikator (7 / 7 steg)
Steg 7: Vad är Agent koden?
Agenten har två jobb:
- Prata med vädret under jorden för att få de senaste villkor
- Tjäna upp webben UI när det behövs så att användaren kan uppdatera platsen eller se utökade prognosen.
Låt oss gå vidare och hoppa över titta på "prepWebpage" för en stund. Ca 150 rader ner, ta en titt på getConditions.
Funktionen getConditions viktigaste delen ser ut så här:
lokala url = format ("%s/%s/conditions/q/%s.json", WUNDERGROUND_URL, WUNDERGROUND_KEY, safelocationstr);
lokala res = http.get(url, {}).sendsync();
Detta utdrag bygger en begäran URL från Weather Underground Apis bas-URL och din API-nyckel, och sedan skickar den och väntar på svar, som lagras i res. Om allt går väl, innehåller res all information du behöver om vädret som ett block av JSON, som vi lätt kan tolka:
lokala svar = http.jsondecode(res.body); < br > lokalt väder = response.current_observation;
LAT = weather.observation_location.latitude.tofloat();
LON = weather.observation_location.longitude.tofloat();
LOCATIONSTR = weather.observation_location.full;
Så småningom, agenten sätter ihop en prognos för loggarna, sedan skickar viktiga bit på enheten:
Device.send ("seteffect", {villkor = weather.weather, temperatur = weather.temp_c});
Bekant ut? Det är ett samtal mot "seteffect" hanteraren vi såg i enheten, där prognosen är analyserad och effekterna är inställda. Detta är var den kommer ifrån. Den andra parametern här är data enheten får: ett bord med två objekt, en för villkor strängen och en för aktuell temperatur.
Det andra jobbet av agent, som serverar web UI, hanteras precis nedanför getConditions, i http.onrequest. Detta är begäran allmänna HTTP-hanteraren kan du skriva den för att göra vad som helst du vill ha svar på många typer av HTTP-förfrågningar. Här är ganska enkel. Kontroll av vägen för att se om begäran kom in till någonstans mer specifik än bara agent URL. Det finns två alternativ här som utlöser specifika beteende. Om sökvägen är inställd på "getLocation", är det en begäran att se där nuvarande prognos är (troligen från webben UI):
om (sökvägen == "/ getlocation" || sökvägen == "/getlocation/") {< br > om (LAT == null || LON == null) {
getConditions();
}
resp.send (200, http.jsonencode ({"lat": LAT, "lon": LON, "namn": LOCATIONSTR}));
}
Likaså om sökvägen är "setLocation", är det en begäran att ändra prognostiserade platsen.
annars om (sökvägen == "/ setlocation" || sökvägen == "/setlocation/") {< br > LOCATIONSTR = req.body;
getConditions();
resp.send (200, http.jsonencode ({"lat": LAT, "lon": LON, "namn": LOCATIONSTR}));
hålla den senaste inställda platsen via ombud omstarter
SaveData.locationstr <-LOCATIONSTR;
Server.Save(SaveData);
}
Om ingen sökväg levereras alls, antar agenten det är en webbläsarbegäran, och händerna tillbaka en stor stor multiline sträng - som råkar vara en webbsida! Detta kan agenten agerar som en liten webbserver:
annat {< br > resp.send (200, webbsida);
}
Det är allt det finns till det - och Grattis på din nya väder gadget. Njut!