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,842 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2762
 

Dat kan zeer zeker .... maar ik vrees dat je dan wel een bron moet hebben waar je de tijd vandaan haalt.

Een Realtime Clock is zeker een optie ... maar misschien kun je de actuele tijd ergens op het Internet vandaan plukken.
Helaas bevat de JSON van de weerlive.nl niet de huidige tijd, anders kon je dat elke keer als je de data ophaalt vergelijken met sup en sunder.

Twee voorbeelden waar je misschien iets mee kunt:

http://worldtimeapi.org/api/timezone/Europe/Amsterdam.txt

3de regel, maar je moet dan wel even rommelen om de tijd eruit te krijgen

abbreviation: CET
client_ip: 185.92.69.87
datetime: 2021-03-15T14:31:59.261087+01:00
day_of_week: 1
day_of_year: 74
dst: false
dst_from: 
dst_offset: 0
dst_until: 
raw_offset: 3600
timezone: Europe/Amsterdam
unixtime: 1615815119
utc_datetime: 2021-03-15T13:31:59.261087+00:00
utc_offset: +01:00
week_number: 11

 

of

http://worldclockapi.com/api/json/cet/now

Waarbij je JSON kunt gebruiken, maar ook hier moet je even prullen om de tijd eruit te halen

{
  "$id": "1",
  "currentDateTime": "2021-03-15T14:31+01:00",
  "utcOffset": "01:00:00",
  "isDayLightSavingsTime": false,
  "dayOfTheWeek": "Monday",
  "timeZoneName": "Central Europe Standard Time",
  "currentFileTime": 132602922774084580,
  "ordinalDate": "2021-74",
  "serviceResponse": null
}

 


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

Hans erg bedankt voor de voorbeelden waarom ik vroeg maar ...hier moet ik echt lossen want dit gaat ver boven mijn pet op dit moment.

Met dezelfde sketch maar een ander adres http://data.meteoserver.nl/api/liveweer_synop.php?pc=5045CA&key= en door het groter maken van de doc naar 6144 krijg ik nu in mijn seriële monitor:

time = 16-03-2021 08:28:03
Zon komt op = 06:49
Zon gaat onder om = 18:48       is hier wel mee te werken om te kunnen schakelen  en bijvoorbeeld maar om de 2 of 4 uur te updaten van de weersite?  hartelijke groet, Hans


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

Gaat soms nog fout omdat het een https verbinding moet zijn de link hierboven werkt soms wel meestal niet


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

ESP8266 en HTTPS was nog niet zo'n eenvoudige om aan de gang te krijgen (veel voorbeelden maken het voor onze toepassing veel moeilijker, en langzamer, dan nodig is). Ik heb het eerdere voorbeeld aangepast voor https gebruik.

Ik heb geen API key voor meteoserver.nl - ik heb er wel een aangemaakt, maar kreeg vervolgens de melding dat ik er voor moest betalen, en daar had ik dus even geen zin in. 🤣 

Ik heb dus de weerlive.nl gepakt wat ook met https werkt (ik vermoed dat ook hun in de toekomst http ondersteuning laten vallen).

Daarnaast pik ik de tijd van een NTP server (zomer en wintertijd correctie nog niet toegepast!) om de tijd op te halen en vervolgens te bepalen of het dag of nacht is.

Ik neem aan dat je hier iets mee kunt, of stukken hergebruiken als je een andere methode wilt gebruiken (b.v. meteoserver). 😊 

 

Ook als downloadbare INO: 

 

#include <ESP8266WiFi.h>

#include <WiFiClient.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>

#include <StreamUtils.h>

#include <NTPClient.h> // don't forget to install the NTPClient

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

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "nl.pool.ntp.org", 0); // take this NTP server so we do not need to calculate an offset

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

const char* ssid = "SkyNet";
const char* password = "22101967";
const char* weatherURL = "https://weerlive.nl/api/json-data-10min.php?key=19970382d1&locatie=Tilburg";

int timeHours;
int timeMinutes;

int SupHours;
int SupMinutes;

int SunderHours;
int SunderMinutes;

boolean SunIsUp;

#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("\n\rConnecting.");

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

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

  timeClient.begin();
}

void loop() {
  // Update time - sometimes, only at first read, this returns 00:00 (incorrectly)
  timeClient.update();
  timeHours = timeClient.getHours();
  timeMinutes = timeClient.getMinutes();
  
  Serial.println("-----------------------------------------------------------");
  Serial.printf("Current Time : %02d:%02d  (without daylight saving correction!)\n\r", timeHours, timeMinutes);
  Serial.println("-----------------------------------------------------------");
  
  std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
  client->setInsecure();
  
  if (WiFi.status() == WL_CONNECTED) {      // Check WiFi connection status

    HTTPClient http;                        // Declare an object of class HTTPClient
    http.begin(*client, weatherURL);
    
    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.print("JSON Data: ");
        ReadLoggingStream loggingStream(http.getStream(), Serial);
        DeserializationError error = deserializeJson(doc, loggingStream);
        Serial.println("\n\r-----------------------------------------------------------");
      #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)

      const char* ZonsOpgang = doc["liveweer"][0]["sup"];
      const char* ZonsOndergang = doc["liveweer"][0]["sunder"];
      
      // 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", winddirection, RichtingNaarGraden(winddirection));
      Serial.printf("Zonsopgang    = %s\r\n", ZonsOpgang);
      Serial.printf("Zonsondergang = %s\r\n\r\n", ZonsOndergang);

      // Convert SUP and SUNDER strings to number we can calculate with
      sscanf(ZonsOpgang, "%02d:%02d", &SupHours, &SupMinutes);
      sscanf(ZonsOndergang, "%02d:%02d", &SunderHours, &SunderMinutes);
      
      // See if we're dealing with daytime (I hope I did that right)
      SunIsUp = (  ( (timeHours>SupHours) || ( (timeHours==SupHours) && (timeMinutes>=SupMinutes) ) ) &&
                   ( (timeHours<SunderHours) || ( (timeHours==SunderHours) && (timeMinutes<=SunderMinutes) ) ) );

      if(SunIsUp) {
        Serial.println("The Sun is UP (daytime)"); // Do something here; eg. switch lights OFF
      } else {
        Serial.println("The Sun is DOWN (nighttime)"); // Do something here; eg. switch lights ON
      }
      
    }

    http.end(); // Close connection
  }

  // note: seems per documentation that the JSON data is only updated every 10 minutes, 
  // so it is probably better set the the interval to 10 minutes as well
  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];
  }
}

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

Hans, ik ga er mee aan de gang en hier werkt het. Ga nu kijken of ik iets kan schakelen ..........


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

Mooi!

Niet vergeten dat zomer- en wintertijd dus nog gecorrigeerd moet worden.

Veel plezier ermee! 😊 


   
BeantwoordenCiteren
(@Anoniem)
Deelgenomen: 1 seconde geleden
Berichten: 0
 

hallo naast de interactieve selectiepagina is het ook mogelijk om de selectie vanuit een script te benaderen, bijvoorbeeld met wget. Aangezien het selectieformulier via de POST-methode werkt, moeten de selectieparameters worden doorgegeven als "POST-gegevens". In wget ziet het er als volgt uit:

wget -O bestand --no-check-certificaat --post-data = "variabele = waarde & variabele = waarde & ...." https://www.daginformatie.knmi.nl/klimatologie/daginformatie
(om het zoekresultaat in het opgegeven bestand te corrigeren. Als "bestand" wordt vervangen door "-", wordt de uitvoer naar STDOUT gestuurd).


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

Goede info 👍

N.b. Helaas is wget alleen onder Linux standaard aanwezig en dus niet onder Windows (download wget for Windows) of MacOS (kan via Homebrew).


   
BeantwoordenCiteren
(@Anoniem)
Deelgenomen: 1 seconde geleden
Berichten: 0
 

Mooi om te zien dat dit probleem opgelost is, ik heb nog wat vragen. Had het geholpen om gebruik te maken van een low code voor het bouwen van de API koppeling? Dit zou in principe sneller moeten werken. Ik kon het niet terugvinden maar misschien heb je hier al wel gebruik van gemaakt, in dat geval ben ik benieuwd naar welke tool je gebruikt hebt. Ik probeer wat meer over coderen te leren, daarom vind ik het erg interessant om dit soort oplossingen zoals dit draadje te lezen.


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

Alles loopt op een ESP8266 - er is geen gebruik gemaakt van een low-code tool. 
Van wat ik begrijp van low-code tools is dat het misschien makkelijker maakt om een verbinding te bouwen, maar sneller zal het niet, of niet altijd, zijn. Hoe hoger het abstractie level, hoe "slordiger" de code omgaat met resources.

De tool die hier gebruikt wordt is de standaard Arduino IDE, en we coderen redelijk dicht tegen de hardware aan.


   
BeantwoordenCiteren
Pagina 2 / 2
Deel: