Stap 7: Wat is in de Agent-Code?
De agent heeft twee banen:
- Praat met ondergrondse weer om de meest recente voorwaarden
- Serveer het web UI wanneer nodig zodat de gebruiker kan de locatie bijwerken of Zie de uitgebreide prognose.
Laten we gaan vooruit en ga kijken naar "prepWebpage" voor een moment. Ongeveer 150 lijnen naar beneden, neem een kijkje op getConditions.
Het belangrijkste stuk van de getConditions functie ziet er zo uit:
local url = format("%s/%s/conditions/q/%s.json", WUNDERGROUND_URL, WUNDERGROUND_KEY, safelocationstr); local res = http.get(url, {}).sendsync();
Dit fragment bouwt een aanvraag-URL van de Weather Underground API's basis-URL en uw API-sleutel, dan stuurt het en wacht op een antwoord, dat is opgeslagen in res. Als alles goed gaat, bevat res vervolgens alle gegevens die u nodig heeft over het weer als een blok voor JSON, dat we gemakkelijk kunnen ontleden:
local response = http.jsondecode(res.body);<br>local weather = response.current_observation; LAT = weather.observation_location.latitude.tofloat(); LON = weather.observation_location.longitude.tofloat(); LOCATIONSTR = weather.observation_location.full;
Uiteindelijk, de agent brengt samen een prognose voor de logs, dan stuurt de belangrijkste stuk op het apparaat:
device.send("seteffect", {conditions = weather.weather, temperature = weather.temp_c});
Kijken bekend? Dat is een oproep tegen de "seteffect"-handler zagen we in het apparaat, waar de prognose wordt geparseerd en de effecten zijn ingesteld. Dit is waar het vandaan komt. De tweede parameter hier is de gegevens die het apparaat ontvangt: een tabel met twee objecten, één voor de tekenreeks van de voorwaarden en één voor de huidige temperatuur.
De tweede taak van de agent, serveert het web UI, wordt rechts onder de getConditions, in http.onrequestbehandeld. Dit is de algemene HTTP-aanvraag-handler, en u kunt schrijven om te doen zo ongeveer alles wat die je in reactie op de vele soorten van HTTP-verzoeken wilt. Dit men is vrij eenvoudig. Het controleert het pad om te zien als het verzoek kwam ergens specifieker dan gewoon de URL van de agent. Er zijn hier twee opties die leiden specifieke gedrag tot zal. Als het pad is ingesteld op "getLocation", is het een verzoek om te zien waar de huidige voorspelling locatie is (waarschijnlijk uit het web UI):
if (path == "/getlocation" || path == "/getlocation/") {<br> if (LAT == null || LON == null) { getConditions(); } resp.send(200, http.jsonencode( { "lat":LAT,"lon":LON,"name":LOCATIONSTR } )); }
Ook als het pad is ingesteld op "setLocation", is het een verzoek aan de verwachte locatie wijzigen.
else if (path == "/setlocation" || path == "/setlocation/") {<br> LOCATIONSTR = req.body; getConditions(); resp.send(200, http.jsonencode( { "lat":LAT,"lon":LON,"name":LOCATIONSTR } )); // keep the latest user-set location through agent restarts savedata.locationstr <- LOCATIONSTR; server.save(savedata); }
Als geen pad wordt helemaal geleverd, de agent wordt verondersteld dat het een aanvraag van een browser, en handen terug een grote grote multiline string - dat gebeurt als een web-pagina! Hierdoor wordt de agent fungeren als een kleine webserver:
else {<br> resp.send(200, WEBPAGE); }
Dat is alles wat er is- en congrats op uw nieuwe gadget van het weer. Geniet van!