NodeMcu Accuweather könyvtár bemutatása

Kedves Olvasó. Ez a bejegyzés azért íródik, mert része egy olyan másik bemutató projektnek, aminek a keretein belül nem lett volna elég tér a részletek bemutatására.

Keresgéltem a neten, hogy hogyan tudnék egy olyan időjárás előrejelzőt készíteni, ami valamelyik szolgáltatótól kapja a meteorológia információkat. Sajnos az időkép.hu és a köpönyeg.hu nem rendelkezek erre alkalmas API-val. A keresésem eredményeképpen 2 szolgáltató jöhetett szóba. Az egyik az OpenWeatherMap volt, a másik pedig az AccuWeather. Lényegében mind a két megoldáshoz találtam kész könyvtárat, de valamiért engem az AccuWeather féle megoldás vonzott inkább. Mivel a másikat nem próbáltam, ezért nem tudom, hogy mik lettek volna a buktatók az OpenWeatherMap API-val, ezért efelől nem szeretnék és nem is tudok nyilatkozni. Bevezetésnek legyen elég ennyi, lássuk a leírást.

OpenWeatherMap Library

AccuWeather Library

JSON Library

Nekünk csak az alább megosztott 2 könyvtárra lesz szükségünk. Az AccuWeather-re és a JSON streamer-re. Nézzük mik a kezdő lépések. 

1. Regisztrálnunk kell az AccuWeather-re és szereznünk kell egy API kulcsot. — Regisztráció — 

Amennyiben a regisztrációval megvagyunk. Jelentkezzünk be, és hozzuk lére az API-t, amit használni fogunk.

Nálam már látható, hogy létre van hozva egy api, amit a teszteléshez használtam. Viszont értelemszerűen az “Add a new App” gombra kattintva ezt most is el kell követni. Sajnos az ingyenes verzió alkalmazása esetén, csak egy alkalmazást hozhatunk létre.

Az alkalmazás nevét leszámítva, ezekkel a paraméterekkel hozzuk létre az alkalmazásunkat.

Itt ezzel a részével a dolognak végeztünk is. Az oldal tetején linkelt két könyvtárat telepítsük fel és utána másoljuk be a kódunkat.

#include <JsonListener.h>
#include "AccuWeatherLibrary.h"

AccuweatherDailyData dataD[2];
AccuweatherHourlyData dataH;
AccuweatherCurrentData dataC;

Accuweather aw("AccuWeather_API_KEY", 187423, "hu-hu", true);

void setup() {
  Serial.begin(115200);
  WiFi.begin("Aloha", "deepdish");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println(".");
    delay(100);
  }
  //----------------------------------------//
  Serial.println(String(ESP.getFreeHeap()));
  int timeStart = millis();
  
  //-----------Aktuális időjárás-----------//
  int aktualis = aw.getCurrent(&dataC);
  if (aktualis != 0)
  {
    Serial.println("ERROR");
    Serial.println(aktualis);
    return;
  }
  while (aw.continueDownload() > 0){}
  print_dataC();
  Serial.println(String(ESP.getFreeHeap()));
  timeStart = millis() - timeStart;
  
  //-----------Egyórás előrejelzés-----------//
  int egyoras = aw.getHourly(&dataH,1);
  if (egyoras != 0)
  {
    Serial.println("ERROR");
    Serial.println(egyoras);
    return;
  }
  while (aw.continueDownload() > 0){}
  print_dataH();
  timeStart = millis() - timeStart;
  Serial.println(String(ESP.getFreeHeap()));
  
  //----------Többnapos előrejelzés-----------//
  int tobbnapos = aw.getDaily(dataD,2); 
  if (tobbnapos != 0)
  {
    Serial.println("ERROR");
    Serial.println(tobbnapos);
    return;
  }
  while (aw.continueDownload() > 0){}
  print_dataD();
  timeStart = millis() - timeStart;
  Serial.println(String(ESP.getFreeHeap()));
}

void loop() 
{

}

void print_dataC()
{
  Serial.println(" ----------------  Aktuális időjárás ---------------- ");
  Serial.println("Idő és dátum: "+String (dataC.LocalObservationDateTime));
  Serial.println("Unix Idő: "+String (dataC.EpochTime));
  Serial.println("Szöveges időjárás: "+String (dataC.WeatherText));
  Serial.println("Hőmérséklet: "+String (dataC.Temperature)+" °C");
  Serial.println("Relatív hőérzet: "+String (dataC.RealFeelTemperature)+" °C");
  Serial.println("Relatív hőérzet: "+String (dataC.RealFeelTemperatureShade)+" °C");
  Serial.println("Relatív páratartalom: "+String (dataC.RelativeHumidity)+" %");
  Serial.println("Szélirány: "+String (dataC.WindDirection)+" °");
  Serial.println("Szélsebesség: "+String (dataC.WindSpeed)+" km/h");
  Serial.println("Széllökések sebessége: "+String (dataC.WindGustSpeed)+" km/h");
  Serial.println("UV index: "+String (dataC.UVIndex));
  Serial.println("UV index szövegesen: "+String (dataC.UVIndexText));
  Serial.println("Látótávolság: "+String (dataC.Visibility)+" km");
  Serial.println("Felhő réteg: "+String (dataC.CloudCover)+" %");
  Serial.println("Légnyomás: "+String (dataC.Pressure));
  
}

void print_dataH(){
  Serial.println("--------------------- A következő egy órában várható ---------------------");
  Serial.println("Várható hőmérséklet : "+String (dataH.Temperature)+" °C");
  Serial.println("Relatív hőérzet: "+String (dataH.RealFeelTemperature)+" °C");
  Serial.println("Szélsebesség: "+String (dataH.WindSpeed)+" km/h");
  Serial.println("Szélirány: "+String (dataH.WindDirection)+" °");
  Serial.println("Széllökések sebessége: "+String (dataH.WindGustSpeed)+" km/h");
  Serial.println("Relatív páratartalom: "+String (dataH.RelativeHumidity)+" %");
  Serial.println("Látótávolság: "+String (dataH.Visibility)+" km");
  Serial.println("UV index: "+String (dataH.UVIndex));
  Serial.println("UV index szövegesen: "+String (dataH.UVIndexText));
  Serial.println("Csapadék valószínűsége: "+String (dataH.PrecipitationProbability)+" %");
  Serial.println("Eső valószínűsége: "+String (dataH.RainProbability)+" %");
  Serial.println("Hó valószínűsége: "+ String (dataH.SnowProbability)+" %");
  Serial.println("Jég valószínűsége: "+ String (dataH.IceProbability)+" %");
  Serial.println("Csapadék mértéke: "+String (dataH.TotalLiquid)+" mm");
  Serial.println("Hó: "+String (dataH.Rain)+" mm");
  Serial.println("Hó: "+String (dataH.Snow)+" mm");
  Serial.println("Jég: "+String (dataH.Ice)+" mm");
  Serial.println("Felhőtakaró: "+String (dataH.CloudCover)+" %");
}

void print_dataD(){
  Serial.println("\n\n====Holnap====");
  Serial.println("Minimum hőmérséklet : "+String (dataD[0].TempMin));
  Serial.println("Maximum hőmérséklet : "+String (dataD[0].TempMax));
  Serial.println("Minimum hőmérséklet hőérzet alapján : "+String (dataD[0].RealFeelTempMin));
  Serial.println("Maximum hőmérséklet hőérzet alapján: "+String (dataD[0].RealFeelTempMax));
  Serial.println("Napos órák száma: "+String (dataD[0].HoursOfSun));
  Serial.println("Napkelte Unix idő szerint: "+String (dataD[0].SunRise));
  Serial.println("Napnyugta Unix idő szerint: "+String (dataD[0].SunSet));
  
  Serial.println("\n\n====Holnap napközben:====");
  Serial.println("Szöveges időjárás: "+String (dataD[0].Day.LongPhrase));
  Serial.println("Jég: "+String (dataD[0].Day.Ice));
  Serial.println("Eső: "+String (dataD[0].Day.Rain));
  Serial.println("Hó: "+String (dataD[0].Day.Snow));
  Serial.println("Csapadék mértéke: "+String (dataD[0].Day.TotalLiquid));
  Serial.println("Látótávolság: "+String (dataD[0].Day.Visibility));
  Serial.println("Széllökések sebessége: "+String (dataD[0].Day.WindGustSpeed));
  Serial.println("Szélsebesség: "+String (dataD[0].Day.WindSpeed));
  Serial.println("Szélirány: "+String (dataD[0].Day.WindDirection));
  Serial.println("Felhőtakaró: "+String (dataD[0].Day.CloudCover));
  Serial.println("Csapadék valószínűsége: "+ String (dataD[0].Day.PrecipitationProbability));
  Serial.println("Eső valószínűsége: "+String (dataD[0].Day.RainProbability));
  Serial.println("Hó valószínűsége: "+ String (dataD[0].Day.SnowProbability));
  Serial.println("Jég valószínűsége: "+ String (dataD[0].Day.IceProbability));
  Serial.println("Villámlás és Vihar valószínűsge: "+ String (dataD[0].Day.ThunderstormProbability));
  
  Serial.println("\n\n====Holnap éjszaka:====");
  Serial.println("Szöveges időjárás: "+String (dataD[0].Night.LongPhrase));
  Serial.println("Jég: "+String (dataD[0].Night.Ice));
  Serial.println("Eső: "+String (dataD[0].Night.Rain));
  Serial.println("Hó: "+String (dataD[0].Night.Snow));
  Serial.println("Csapadék mértéke: "+String (dataD[0].Night.TotalLiquid));
  Serial.println("Látótávolság: " +String (dataD[0].Night.Visibility));
  Serial.println("Széllökések sebessége: " +String (dataD[0].Night.WindGustSpeed));
  Serial.println("Szélsebesség: "+String (dataD[0].Night.WindSpeed));
  Serial.println("Szélirány: "+String (dataD[0].Night.WindDirection));
  Serial.println("Felhőtakaró: "+String (dataD[0].Night.CloudCover));
  Serial.println("Jég valószínűsége: " +String (dataD[0].Night.IceProbability));
  Serial.println("Csapadék valószínűsége: "+ String (dataD[0].Night.PrecipitationProbability));
  Serial.println("Eső valószínűsége: "+String (dataD[0].Night.RainProbability));
  Serial.println("Hó valószínűsége: "+ String (dataD[0].Night.SnowProbability));
  Serial.println("Villámlás és Vihar valószínűsge: "+ String (dataD[0].Night.ThunderstormProbability));
 
  Serial.println("\n\n====Holnap után====");
  Serial.println("Minimum hőmérséklet : "+String (dataD[1].TempMin));
  Serial.println("Maximum hőmérséklet : "+String (dataD[1].TempMax));
  Serial.println("Minimum hőmérséklet hőérzet alapján : "+String (dataD[1].RealFeelTempMin));
  Serial.println("Maximum hőmérséklet hőérzet alapján: "+String (dataD[1].RealFeelTempMax));
  Serial.println("Napos órák száma: "+String (dataD[1].HoursOfSun));
  Serial.println("Napkelte Unix idő szerint: "+String (dataD[1].SunRise));
  Serial.println("Napnyugta Unix idő szerint: "+String (dataD[1].SunSet));
 
  Serial.println("\n\n====Holnap után napközben====");
  Serial.println("Szöveges időjárás: "+String (dataD[1].Day.LongPhrase));
  Serial.println("Jég: "+String (dataD[1].Day.Ice));
  Serial.println("Eső: "+String (dataD[1].Day.Rain));
  Serial.println("Hó: "+String (dataD[1].Day.Snow));
  Serial.println("Csapadék mértéke: "+String (dataD[1].Day.TotalLiquid));
  Serial.println("Látótávolság: "+String (dataD[1].Day.Visibility));
  Serial.println("Széllökések sebessége: "+String (dataD[1].Day.WindGustSpeed));
  Serial.println("Szélsebesség: "+String (dataD[1].Day.WindSpeed));
  Serial.println("Szélirány: "+String (dataD[1].Day.WindDirection));
  Serial.println("Felhőtakaró: "+String (dataD[1].Day.CloudCover));
  Serial.println("Csapadék valószínűsége: "+ String (dataD[1].Day.PrecipitationProbability));
  Serial.println("Eső valószínűsége: "+String (dataD[1].Day.RainProbability));
  Serial.println("Hó valószínűsége: "+ String (dataD[1].Day.SnowProbability));
  Serial.println("Jég valószínűsége: "+String (dataD[1].Day.IceProbability));
  Serial.println("Villámlás és Vihar valószínűsge: "+ String (dataD[1].Day.ThunderstormProbability));
  
  Serial.println("\n\n====Holnap után éjszaka====");
  Serial.println("Szöveges időjárás: "+String (dataD[1].Night.LongPhrase));
  Serial.println("Jég: "+String (dataD[1].Night.Ice));
  Serial.println("Eső: "+String (dataD[1].Night.Rain));
  Serial.println("Hó: "+String (dataD[1].Night.Snow));
  Serial.println("Csapadék mértéke: "+String (dataD[1].Night.TotalLiquid));
  Serial.println("Látótávolság: "+String (dataD[1].Night.Visibility));
  Serial.println("Széllökések sebessége: "+String (dataD[1].Night.WindGustSpeed));
  Serial.println("Szélsebesség: "+String (dataD[1].Night.WindSpeed));
  Serial.println("Szélirány: "+String (dataD[1].Night.WindDirection));
  Serial.println("Felhőtakaró: "+String (dataD[1].Night.CloudCover));
  Serial.println("Jég valószínűsége: " +String (dataD[1].Night.IceProbability));
  Serial.println("Csapadék valószínűsége: "+ String (dataD[1].Night.PrecipitationProbability));
  Serial.println("Eső valószínűsége: "+String (dataD[1].Night.RainProbability));
  Serial.println("Hó valószínűsége: "+ String (dataD[1].Night.SnowProbability));
  Serial.println("Villámlás és Vihar valószínűsge: "+ String (dataD[1].Night.ThunderstormProbability));
}

Adnék egy kis magyarázatot a paraméterezéshez. A soros kiíratáshoz és a változók megadásához gondolom nincs szükség magyarázatra. Minden adja magát. Ezért csak API paraméterezést írom le.

Accuweather aw("AccuWeather_API_KEY", 187423, "hu-hu", true);

Itt a megadható paraméterek között az API kulcs, és “true” nem változik. 187423 a város kód, másnéven geokód, a “hu-hu” pedig a lekért adatok nyelvi kódja.

Ezek a nyelvi kódok érhetőek el.

A geokódokat a legkönnyebben az oldalon érhetjük el, egy kereséssel. Én Vácrátótra kerestem rá, mert ma oda megyünk a Nemzeti Botanikus Kertbe.

A geokódot az URL-ből nyerhetjük ki.

A geokód: 1249081

Ha már Vácrátótot választottam, akkor nézzük a soros kimenetet Vácrátótra.

Egy apró észrevételt még tennék a könyvtárral kapcsolatban. Az AccuWeather API nem szolgáltat pontos UNIX időt. Valamivel több mint 10 perc késéssel kapjuk ezt az infót. Ezért erre abszolút nem ajánlanám. Arról nem is beszélve, hogy csak 50 ingyenes lekérdezésünk van egy napra. Tehát fél óránként jutnánk a pontatlan időhoz. Ellenben a napkelte és a napnyugta információt azt pontosan kapjuk.

Ennek a teszteléséhez ajánlom a következő oldalt: https://www.epochconverter.com/

A következő bejegyzésben egy Mini időjárás előrejelzőt mutatok be, ami egy + oled kijelzővel készült. Ott megoldódik a pontos Unix idő lekérdezése, és az is, hogy a program, csak fél óránként hívja le az AccuWeather API információt. Viszont abban a posztban már nem szeretnék kitérni az AccuWeather használatára, ezért készítettem a bővebb összefoglalót. Remélem hasznos volt. 

(Statisztika: 97 megtekintés)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.