Advertisement
jgoy

Stroomprijzen API - ESP32 Serial Monitor

May 10th, 2024 (edited)
856
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.76 KB | Source Code | 0 0
  1. /*
  2.  Arduino IDE - board: ESP32 Dev Module of DOIT ESP32 DEVKIT V1
  3.  De ESP moet de huidige tijd hebben, om de string te
  4.  kunnen samenstellen om de juiste link aan te maken (voorbeeld):
  5.  https://api.energy-charts.info/price?bzn=BE&start=1715503187&end=1715632787
  6.  =====================================================================================
  7.  In de JSON die geretourneerd wordt zit per paar
  8.  - UNIX-tijd (epochtijd: aantal seconden sinds 1/1/1970 middernacht), per uur oplopend
  9.  - de prijs per MWh voor dat uur
  10.  =====================================================================================
  11.  Zie https://shorturl.at/gjlLX voor een grafische weergave van dezelfde gegevens
  12.  De API geeft niet altijd evenveel elementen terug. Dit varieert per uur tussen 36 en
  13.  11 items. De code moet daar uiteraard op inspelen.
  14.  
  15.  Elk uur (HH:01:08) wordt de ESP herstart (opzettelijk niet HH:00:00 gekozen)
  16. */
  17.  
  18. #include <WiFiManager.h>  // https://github.com/tzapu/WiFiManager/
  19. #include <ArduinoJson.h>  // https://github.com/bblanchon/ArduinoJson
  20. #include <HTTPClient.h>   // voor de verbinding met de API
  21.  
  22. WiFiManager myWiFi;
  23.  
  24. #define API_ITEMS 36                                   // max aantal API-records die je wil verwerken
  25. struct tm tInfo;                                       // https://cplusplus.com/reference/ctime/tm/
  26. const char* time_Zone = "CET-1CEST,M3.5.0,M10.5.0/3";  // https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  27. const char* verbind[] = { "WiFi: geen verbinding", "Verbind met hotspot", "Stroom_ESP", "En start een browser op adres",
  28.                           "192.168.4.1", "om netwerk en paswoord in te brengen" };
  29. double prijzen[API_ITEMS];                                               // voor de stroomprijzen
  30. time_t epo[API_ITEMS];                                                   // voor de resp. epochtijden
  31. String mijnLink = "https://api.energy-charts.info/price?bzn=BE&start=";  // wordt verderop aangevuld met de tijden
  32.  
  33. void setup() {
  34.   Serial.begin(115200);                             // geen delay nodig na deze lijn want myWiFi.autoConnect vertraagt voldoende
  35.   myWiFi.setAPCallback(toonBerichtGeenVerbinding);  // indien geen WiFi gevonden wordt
  36.   myWiFi.autoConnect("Stroom_ESP");                 // verbind met WiFi, indien niet gelukt start AP met naam "Stroom_ESP"
  37.   configTzTime(time_Zone, "be.pool.ntp.org");       // tijdzone en SNTP-server instellen
  38.   getLocalTime(&tInfo);                             // huidige lokale tijd opvragen
  39.   time_t now;                                       // time_t is eigenlijk een uint32_t
  40.   time(&now);                                       // epochtijd toekennen
  41.   mijnLink = mijnLink + String(now + 3600) + "&end=" + String(now + (API_ITEMS * 3600));
  42.   toonData();
  43. }
  44.  
  45. void loop() {
  46.   getLocalTime(&tInfo);  // SNTP synchronisatie bij opstart en daarna elke 3 uur (op een ESP32)
  47.   if ((tInfo.tm_min == 1) && (tInfo.tm_sec == 8)) ESP.restart();
  48. }
  49.  
  50. void toonData() {
  51.   Serial.println(mijnLink);
  52.   if (mijnLink.length() > 51) {  // lege invoer niet versturen (bvb. als SNTP een timeout geeft)
  53.     get_JsonData();
  54.     for (uint8_t i = 0; i < 80; i++) Serial.print("=");  // lijntje trekken
  55.     Serial.println("\nStroomprijzen groothandel (tijden in lokale Belgische tijd)");
  56.     for (uint8_t i = 0; i < 80; i++) Serial.print("=");
  57.     Serial.println();
  58.     for (uint8_t i = 0; i < API_ITEMS; i++) {
  59.       if (epo[i]) {  // er worden niet altijd evenveel waarden geretourneerd door de API - lege items niet weergeven
  60.         Serial.printf("%02d. ", i + 1);
  61.         struct tm* cor;            // om de epochtijden uit de API om te zetten naar tm-structuur in lokale tijd
  62.         cor = localtime(&epo[i]);  // tijden in de lijst aanpassen aan lokale tijd / zomertijd / wintertijd
  63.         Serial.printf("%02d-%02d-%02d %02d:%02d", cor->tm_mday, cor->tm_mon + 1, cor->tm_year + 1900, cor->tm_hour, cor->tm_min);
  64.         Serial.println(" --> " + String(prijzen[i]) + " Eur/MWh");
  65.       }
  66.     }
  67.     for (uint8_t i = 0; i < 80; i++) Serial.print("=");
  68.     Serial.println();
  69.   }
  70. }
  71.  
  72. void get_JsonData() {
  73.   HTTPClient http;
  74.   http.begin(mijnLink);
  75.   if (http.GET() == 200) {          // als de verbinding ok is
  76.     DynamicJsonDocument doc(4096);  // kies deze waarde groot genoeg om de data te bevatten
  77.     auto error = deserializeJson(doc, http.getString());
  78.     if (error) {
  79.       Serial.print(F("deserializeJson() failed with code "));
  80.       Serial.println(error.c_str());
  81.     }
  82.     for (uint8_t i = 0; i < API_ITEMS; i++) {
  83.       prijzen[i] = doc["price"][i];
  84.       epo[i] = doc["unix_seconds"][i];
  85.     }
  86.   } else Serial.println("Error in API response");
  87.   http.end();
  88. }
  89.  
  90. void toonBerichtGeenVerbinding(WiFiManager* myWiFi) {
  91.   for (uint8_t i = 0; i < 6; i++) Serial.println(verbind[i]);
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement