Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



KNMI weer api met j...
 
Deel:
Meldingen
Alles wissen

[Opgelost] KNMI weer api met json

25 Berichten
3 Gebruikers
1 Reactions
5,630 Bekeken
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Wie kan mij hierbij helpen?


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Hieronder zie je eerst een sketch die werkt maar dan met de openweathermap.org api.

Nu heb ik de inlogstring veranderd naar de KNMI api http://weerlive.nl/api/json-data-10min.php?key=xxxxxxxxx&locatie=Tilburg
en al veel uit geprobeerd om daar iets uit te krijgen maar helaas. Ik ben nu meer dan een week 8 uur per dag bezig om te zoeken
naar een oplossing . Ik denk dat iets in de json string die ik uitvraag niet goed is of wat dan ook.

Mijn vraag is om al is het maar 1 ding daar de juiste int root_temp = root["temp"]; Serial.println(root_temp); uitslag uit te krijgen.

Hieronder de werkende sketch die ik in een ESP8226 heb zitten:

#include <ESP8266WiFi.h

#include <ESP8266HTTPClient.h // http web access library

#include <ArduinoJson.h // JSON decoding library

const char * ssid = "xxxxxxx";

const char * password = "xxxxxxxxx";

void setup() {

  Serial.begin(115200);

  delay(500);

  Serial.print("Connecting.");

  WiFi.begin(ssid, password); // access Wi-FI point

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("connected\r\n");

}

void loop() {

    if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status

      HTTPClient http; //Declare an object of class HTTPClient

      // specify request destination

      http.begin("http://api.openweathermap.org/data/2.5/weather?q=Tilburg,n
        l & APPID = xxxxxxxx ");

        int httpCode = http.GET(); // send the request

        if (httpCode > 0) { // check the returning code

          String payload = http.getString(); //Get the request response
          payload

          DynamicJsonBuffer jsonBuffer(512);

          // Parse JSON object

          JsonObject & root = jsonBuffer.parseObject(payload);

          if (!root.success()) {

            Serial.println(F("Parsing failed!"));

            return;

          }

          float temp = (float)(root["main"]["temp"]) - 273.15; //
          get temperature

          int humidity = root["main"]["humidity"]; //
          get humidity

          float pressure = (float)(root["main"]["pressure"]) / 1000; //
          get pressure

          float wind_speed = root["wind"]["speed"]; //
          get wind speed

          int wind_degree = root["wind"]["deg"]; //
          get wind degree

          float feels_like = (float)(root["main"]["feels_like"]) -
            273.15; // get feel_like

          // print data

          Serial.println("Het weer NU in Tilburg");

          Serial.printf("Temperatuur = %.2f°C\r\n", temp);

          Serial.printf("Voelt als = %.2f°C\r\n", feels_like);

          Serial.printf("Vochtigheid = %d %%\r\n", humidity);

          Serial.printf("Luchtdruk = %.3f bar\r\n", pressure);

          Serial.printf("Wind snelheid = %.1f m/s\r\n", wind_speed);

          Serial.printf("Wind richting = %d°\r\n\r\n", wind_degree);

        }

        http.end(); //Close connection

      }

      delay(60000); // wait 1 minute

    }

Uitkomst seriele monitor:

Het weer NU in Tilburg

Temperatuur = 8.80°C

Voelt als = 4.23°C

Vochtigheid = 81 %

Luchtdruk = 1.033 bar

Wind snelheid = 5.1 m/s

Wind richting = 60°

Met de weerlive api en exact dezelfde sketch behalve het verkrijgen
van de uitkomst zie hieronder:

int root_temp = root["temp"];

int root_gtemp = root["gtemp"];

int root_samenv = root["samenv"];

int root_windr = root["windr"];

int root_windms = root["windms"];

int root_sunder = root["sunder"];

int root_verw = root["verw"];

int root_alarmtxt = root["alarmtxt"];

Serial.println(root_temp);

Serial.println(root_gtemp);

Serial.println(root_samenv);

Serial.println(root_windr);

Serial.println(root_windms);

Serial.println(root_sunder);

Serial.println(root_verw);

Serial.println(root_alarmtxt);

Krijg ik 8 nullen in de monitor

Met vriendelijke groet

Hans Bemelen

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

Ik heb even de API key uit de code gehaald en ik zag "if(http 0)" staan en ik denk dat dit "if(http>0)" moet zijn ... kan ook komen omdat ik de source even netjes formateerde.

Als ik de voorbeeld JSON bekijk (zelf met een eigen API key even geprobeerd) dan zie ik dit:

{
  "liveweer": [
    {
      "plaats": "Tilburg",
      "temp": "7.5",
      "gtemp": "4.9",
      "samenv": "Onbewolkt",
      "lv": "75",
      "windr": "NO",
      "windms": "4",
      "winds": "3",
      "windk": "7.8",
      "windkmh": "14.4",
      "luchtd": "1031.5",
      "ldmmhg": "774",
      "dauwp": "3",
      "zicht": "16",
      "verw": "Zonnig, in het uiterste noorden ook mist en laaghangende bewolking",
      "sup": "07:21",
      "sunder": "18:22",
      "image": "zonnig",
      "d0weer": "halfbewolkt",
      "d0tmax": "9",
      "d0tmin": "1",
      "d0windk": "2",
      "d0windknp": "6",
      "d0windms": "3",
      "d0windkmh": "11",
      "d0windr": "O",
      "d0neerslag": "0",
      "d0zon": "72",
      "d1weer": "halfbewolkt",
      "d1tmax": "13",
      "d1tmin": "0",
      "d1windk": "2",
      "d1windknp": "6",
      "d1windms": "3",
      "d1windkmh": "11",
      "d1windr": "O",
      "d1neerslag": "0",
      "d1zon": "60",
      "d2weer": "bewolkt",
      "d2tmax": "12",
      "d2tmin": "0",
      "d2windk": "2",
      "d2windknp": "4",
      "d2windms": "2",
      "d2windkmh": "7",
      "d2windr": "W",
      "d2neerslag": "10",
      "d2zon": "20",
      "alarm": "0"
    }
  ]
}

 

Alle data hangt onder het object "liveweer", maar ik zie in jouw code geen referentie naar "liveweer".
Nu kan het zijn dat dit niet nodig is, ik heb eigenlijk geen ervaring met ArduinoJSON.

Maar normaal gesproken staat "liveweer" in de root.

Dus

float temp = (float)(root["main"]["temp"]) - 273.15; //get temperature

 

zal dan niet werken. We moeten kijken naar liveweer.temp ipv main.temp.

Het is maar een gok hoor.

Probeer dit eens:

float temp = (float)(root["liveweer"]["temp"]) - 273.15; //get temperature

 

 


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Gaat niet werken...... helaas

Wat ik wil als uitkomst is de gegevens uit liveweer gebruiken omdat deze in het Nederlands zijn en ook niet verder berekend hoeven worden

Heb geprobeerd

float temp = (float)(root["liveweer"]["temp"]) - 273.15; //get temperature

met je laatste suggestie maar dan krijg ik gewoon Temperatuur =  - 273.15 uit dat is niet uit Liveweer denk ik.

 

 


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Veel reeds uitgeprobeerd maar nog steeds nullen uit de sketch:

JsonObject& liveweer = jsonBuffer.parseObject(payload);
// JsonObject& liveweer = root["liveweer"];
if (!liveweer.success()) {
Serial.println(F("Parsing failed!"));
return;
}

int liveweer_temp = liveweer["temp"];
int liveweer_gtemp = liveweer["gtemp"];
int liveweer_samenv = liveweer["samenv"];
int root_windr = liveweer["windr"];
int root_windms = liveweer["windms"];
int root_sunder = liveweer["sunder"];
int root_verw = liveweer["verw"];
int root_alarmtxt = liveweer["alarmtxt"];
Serial.println(liveweer_temp);
Serial.println(liveweer_gtemp);
Serial.println(liveweer_samenv);
Serial.println(root_windr);
Serial.println(root_windms);
Serial.println(root_sunder);
Serial.println(root_verw);
Serial.println(root_alarmtxt);
}


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

FYI: Ik ben al de hele morgen aan het rommelen om te kijken wat er fout gaat - ik probeer er vandaag op terug te komen!


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

Nou dat was wel een zware bevalling zeg ... maar ik heb gevonden waar het fout gaat.

Als eerste moeten we de array "liveweer" aanspreken, en daarvan het eerste element pakken ( [0] ). 
Nou,... dat moet je ook maar weten. (ik vond de uitleg hier, na lang zoeken)

Dan komt daar nog bij dat jouw code waarschijnlijk nog niet helemaal af was met het lezen van de waarden (zie ook hier).

Dit was leuk om uit te zoeken ... 👍 

Hier mijn werkende code.
Merk op: ik maak gebruik van de nieuwere stream methoden (StreamUtils library - via Tools -> Manage Libraries installeren).
Ik heb er ook een functie bij gemaakt die de windrichtingen omzet naar graden.

Uiteraard moet je zelf SSID (WIFISSID), WifiWachtwoord (WIFIWACHTWOORD), en jouw API key (JOUWAPIKEY) even intypen.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <StreamUtils.h>

#include <ESP8266HTTPClient.h>              // http web access library
#include <ArduinoJson.h>                    // JSON decoding library

// remove comment slashes to see debug output
// #define DEBUG

const char * ssid = "WIFISSID";
const char * password = "WIFIWACHTWOORD";

#define Richtingen 16
char * RichtingGraden [Richtingen][2] = { {"Noord", "0"     }, 
                                          {"NNO",   "22.5"  },
                                          {"NO",    "45"    },
                                          {"ONO",   "67.5"  },
                                          {"Oost",  "90"    },
                                          {"OZO",   "112.5" },
                                          {"ZO",    "135"   },
                                          {"ZZO",   "157.5" },
                                          {"Zuid",  "180"   },
                                          {"ZZW",   "202.5" },
                                          {"ZW",    "225"   }, 
                                          {"WZW"    "247.5" }, 
                                          {"West",  "270"   },
                                          {"WNW",   "292.5" },
                                          {"NW",    "315"   },
                                          {"NNW",   "337.5" } };

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.print("Connecting.");
  WiFi.begin(ssid, password);               // access Wi-FI point
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("connected\r\n");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {      // Check WiFi connection status

    HTTPClient http;                        // Declare an object of class HTTPClient
    http.useHTTP10(true); 
    http.begin("http://weerlive.nl/api/json-data-10min.php?key=JOUWAPIKEY&locatie=Tilburg");
    int httpCode = http.GET();              // send the request

    // for debugging, dumps HTTP result (JSON) to serial monitor
    #ifdef DEBUG
      Serial.printf("HTTP Return code = %d\r\n",httpCode);
    #endif
    
    if (httpCode > 0) {                     // check the returning code (>0 may not be correct)
      
      DynamicJsonDocument doc(2048);
      
      #ifdef DEBUG
        Serial.println("JSON Data:\r\n");
        ReadLoggingStream loggingStream(http.getStream(), Serial);
        Serial.println("\r\n\r\n");
        DeserializationError error = deserializeJson(doc, loggingStream);
      #else
        DeserializationError error = deserializeJson(doc, http.getStream());
      #endif
        
      if (error) {
        Serial.print("JSON Deserialization failed: ");
        Serial.println(error.f_str());
      }
      
      float temp          = (float)(doc["liveweer"][0]["temp"]);        // get temperature (Celcius)
      int humidity        = doc["liveweer"][0]["lv"];                   // get humidity (relatieve luchtvochtigheid)
      float pressure      = (float)(doc["liveweer"][0]["luchtd"]);      // get pressure (luchtdruk)
      float wind_speed    = doc["liveweer"][0]["windms"];               // get wind speed (in m/s)
      const char* winddirection = doc["liveweer"][0]["windr"];          // get wind degree (windrichting)
      float feels_like    = (float)(doc["liveweer"][0]["gtemp"]);       // get feel_like (gevoelstemperatuur)

      // print data
      Serial.println("Het weer NU in Tilburg");
      Serial.printf("Temperatuur = %.2f°C\r\n", temp);
      Serial.printf("Voelt als = %.2f°C\r\n", feels_like);
      Serial.printf("Vochtigheid = %d %%\r\n", humidity);
      Serial.printf("Luchtdruk = %.3f millibar (hPa)\r\n", pressure);
      Serial.printf("Wind snelheid = %.1f m/s\r\n", wind_speed);
      Serial.printf("Wind richting = %s (%s°)\r\n\r\n", winddirection, RichtingNaarGraden(winddirection)); 
    }

    http.end(); // Close connection
  }

  // note: volgens de JSON filenaam wordt dit elke 10 minuten geupdate ... 
  // dus 10 minuten wachten is misschien beter?
  delay(60000); // wait 1 minute  
}

char* RichtingNaarGraden(const char* WindRichting) {
  for(int Counter=0; Counter<Richtingen; Counter++) {
    if ( strcmp(WindRichting, RichtingGraden[Counter][0]) == 0 )
      return RichtingGraden[Counter][1];
  }
}

 

Voorbeeld output met debugging UIT:

Connecting....connected

Het weer NU in Tilburg
Temperatuur = 15.50°C
Voelt als = 14.10°C
Vochtigheid = 49 %
Luchtdruk = 1028.900 millibar (hPa)
Wind snelheid = 3.0 m/s
Wind richting = ZO (135°)

 

En met Debugging AAN ( "//" voor "#define DEBUG" weghalen):

Connecting..............connected

HTTP Return code = 200
JSON Data:
{ "liveweer": [{"plaats": "Tilburg", "temp": "15.6", "gtemp": "13.4", "samenv": "Onbewolkt", "lv": "49", "windr": "ZO", "windms": "4", "winds": "3", "windk": "7.8", "windkmh": "14.4", "luchtd": "1028.9", "ldmmhg": "772", "dauwp": "4", "zicht": "20", "verw": "Zonnig, op de Wadden kans op mist. Vannacht lokaal mist", "sup": "07:19", "sunder": "18:24", "image": "zonnig", "d0weer": "zonnig", "d0tmax": "14", "d0tmin": "1", "d0windk": "2", "d0windknp": "4", "d0windms": "2", "d0windkmh": "7", "d0windr": "ZO", "d0neerslag": "0", "d0zon": "90", "d1weer": "halfbewolkt", "d1tmax": "11", "d1tmin": "0", "d1windk": "2", "d1windknp": "4", "d1windms": "2", "d1windkmh": "7", "d1windr": "ZW", "d1neerslag": "20", "d1zon": "70", "d2weer": "halfbewolkt_regen", "d2tmax": "5", "d2tmin": "2", "d2windk": "2", "d2windknp": "6", "d2windms": "3", "d2windkmh": "11", "d2windr": "N", "d2neerslag": "60", "d2zon": "10", "alarm": "0"}]}

Het weer NU in Tilburg
Temperatuur = 15.60°C
Voelt als = 13.40°C
Vochtigheid = 49 %
Luchtdruk = 1028.900 millibar (hPa)
Wind snelheid = 4.0 m/s
Wind richting = ZO (135°)

 

Hopelijk helpt dit ... 😊 


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Mijn dank is groot Hans,

Ik ben er net achter gekomen door middel van arduinoJson 5 Assistant  te gebruiken (wist totaal niet dat deze bestond) hieronder twee regels:

JsonObject& liveweer_0 = root["liveweer"][0]; const char*

liveweer_0_plaats = liveweer_0["plaats"]; // "Tilburg"

Serial.println(liveweer_0_plaats);
Serial.println(liveweer_0_alarm);
Serial.println(liveweer_0_samenv);
Serial.println(liveweer_0_windr);
Serial.println(liveweer_0_windms);
Serial.println(liveweer_0_sunder);
Serial.println(liveweer_0_verw);

 

Seriele monitor:

Tilburg
0
Onbewolkt
ZO
4
18:24
Zonnig, op de Wadden kans op mist. Vannacht lokaal mist

Heb nog heel wat uit te zoeken maar samen gaan we op de koffie en dan komt het zeker goed!!!!!


   
Hans reageerde
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Weet alleen nog niet om het op opgelost te zetten


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

Graag gedaan 😊 

Handige truuk! Ik wist dat ook niet van die arduinoJson 5 Assistant.

Wat opgelost markeren: onder het eerste bericht staat een "opgelost" knopje - ik heb 'm al aangeklikt 😊 


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Hoi Hans, mag ik je nog vragen hoe ik andere gegevens uit je sketch krijg? want als ik onderstaande gebruik 

float plaats = (float)(doc["liveweer"][0]["plaats"]);
float temp = (float)(doc["liveweer"][0]["temp"]); // get temperature (Celcius)
float feels_like = (float)(doc["liveweer"][0]["gtemp"]); // get feel_like (gevoelstemperatuur)
int humidity = doc["liveweer"][0]["lv"]; // get humidity (relatieve luchtvochtigheid)
float pressure = (float)(doc["liveweer"][0]["luchtd"]); // get pressure (luchtdruk)
float wind_speed = doc["liveweer"][0]["windms"]; // get wind speed (in m/s)
const char* winddirection = doc["liveweer"][0]["windr"]; // get wind degree (windrichting)
float samenv = (float)(doc["liveweer"][0]["samenv"]); // samenvatting)

// print data
Serial.println(plaats);
Serial.printf("Temperatuur = %.2f°C\r\n", temp);
Serial.printf("Voelt als = %.2f°C\r\n", feels_like);
Serial.printf("Vochtigheid = %d %%\r\n", humidity);
Serial.printf("Luchtdruk = %.3f millibar (hPa)\r\n", pressure);
Serial.printf("Wind snelheid = %.1f m/s\r\n", wind_speed);
Serial.printf("Wind richting = %s (%s°)\r\n\r\n", winddirection, RichtingNaarGraden(winddirection));
Serial.printf("Samenvatting = \r\n", samenv);

Krijg ik dit als uitkomst:

0.00
Temperatuur   = 3.90°C
Voelt als     = 1.20°C
Vochtigheid   = 98 %
Luchtdruk     = 1021.700 millibar (hPa)
Wind snelheid = 3.0 m/s
Wind richting = Noord (0°)


Samenvatting  = 

 

Het lijkt heel wat wat ik doe misschien maar ik probeer van alles zonder echt te weten wat ik doe. Ik zou het op prijs stellen al maak je maar 1 regel of 2 als er verschil inzit voor de uitkomst Je hoeft niet alles uit te werken hoor 😉 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

Hoi PimoHans 😊 

Je hebt per ongeluk een tekst proberen om te zetten naar een floating point nummer met:

float samenv = (float)(doc["liveweer"][0]["samenv"]); // samenvatting)

 

Als je dit aanpast naar een "char* const" en de float-cast weglaat, dan zal het wel werken denk ik:

const char* samenv = doc["liveweer"][0]["samenv"]; // samenvatting

   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Het werkt Hans 🍻 

Tilburg
Temperatuur = 4.20°C
Voelt als = 0.90°C
Vochtigheid = 95 %
Luchtdruk = 1021.700 millibar (hPa)
Wind snelheid = 4.0 m/s
Wind richting = Noord (0°)
Geheel bewolkt

Zou o zo graag willen programmeren maar een schriftelijke cursus is te statisch misschien weet jij iets??

Maar in ieder geval weer hartelijk dank,

Hans

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2728
 

Hoi Hans!

Geweldig! Mooi om te horen! 👍 

Ja, een leraar naast je hebben staan werkt wel het beste als je iets nieuws wilt leren.

Persoonlijk, als tweede keuze, heb ik de voorkeur voor geschreven materiaal - ik heb ooit eens een kleine cursus voor m'n neefjes geschreven voor programmeren op de Arduino.
Niet helemaal wat je in gedachten had, maar misschien een alternatief tot je iets beters hebt gevonden.

Er staan op YouTube ook verschillende Arduino tutorials, maar ik kan daar zelf wat moeilijk mee overweg (herhaaldelijk terug spoelen om nog eens te horen wat ze zeggen of doen).
Misschien is dit iets voor je https://youtu.be/7TY-CsYACHI (heb wel het gevoel dat hij deels mijn cursus heeft gekopieerd 🤣 ).

Mocht je aan de slag gaan met een cursus en mocht je vragen hebben; stel ze gerust hier in het forum.
Ik probeer dagelijks vragen te beantwoorden. 😊 


   
BeantwoordenCiteren
(@pimohans)
Active Member
Deelgenomen: 4 jaar geleden
Berichten: 16
Topic starter  

Hoi Hans, kan er op bv "sup" uit de API  Zon op geschakeld worden? Of moet er een real time clock geïnstalleerd worden?

Zou dan bv en lamp kunnen uitschakelen en met sunder aan Of denk ik te simpel??


   
BeantwoordenCiteren
Pagina 1 / 2
Deel: