Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Arduino IDE - board: ESP32 Dev Module of DOIT ESP32 DEVKIT V1
- De ESP moet de huidige tijd hebben, om de string te
- kunnen samenstellen om de juiste link aan te maken (voorbeeld):
- https://api.energy-charts.info/price?bzn=BE&start=1715503187&end=1715632787
- =====================================================================================
- In de JSON die geretourneerd wordt zit per paar
- - UNIX-tijd (epochtijd: aantal seconden sinds 1/1/1970 middernacht), per uur oplopend
- - de prijs per MWh voor dat uur
- =====================================================================================
- Zie https://shorturl.at/gjlLX voor een grafische weergave van dezelfde gegevens
- De API geeft niet altijd evenveel elementen terug. Dit varieert per uur tussen 36 en
- 11 items. De code moet daar uiteraard op inspelen.
- Elk uur (HH:01:08) wordt de ESP herstart (opzettelijk niet HH:00:00 gekozen)
- */
- #include <WiFiManager.h> // https://github.com/tzapu/WiFiManager/
- #include <ArduinoJson.h> // https://github.com/bblanchon/ArduinoJson
- #include <HTTPClient.h> // voor de verbinding met de API
- WiFiManager myWiFi;
- #define API_ITEMS 36 // max aantal API-records die je wil verwerken
- struct tm tInfo; // https://cplusplus.com/reference/ctime/tm/
- const char* time_Zone = "CET-1CEST,M3.5.0,M10.5.0/3"; // https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
- const char* verbind[] = { "WiFi: geen verbinding", "Verbind met hotspot", "Stroom_ESP", "En start een browser op adres",
- "192.168.4.1", "om netwerk en paswoord in te brengen" };
- double prijzen[API_ITEMS]; // voor de stroomprijzen
- time_t epo[API_ITEMS]; // voor de resp. epochtijden
- String mijnLink = "https://api.energy-charts.info/price?bzn=BE&start="; // wordt verderop aangevuld met de tijden
- void setup() {
- Serial.begin(115200); // geen delay nodig na deze lijn want myWiFi.autoConnect vertraagt voldoende
- myWiFi.setAPCallback(toonBerichtGeenVerbinding); // indien geen WiFi gevonden wordt
- myWiFi.autoConnect("Stroom_ESP"); // verbind met WiFi, indien niet gelukt start AP met naam "Stroom_ESP"
- configTzTime(time_Zone, "be.pool.ntp.org"); // tijdzone en SNTP-server instellen
- getLocalTime(&tInfo); // huidige lokale tijd opvragen
- time_t now; // time_t is eigenlijk een uint32_t
- time(&now); // epochtijd toekennen
- mijnLink = mijnLink + String(now + 3600) + "&end=" + String(now + (API_ITEMS * 3600));
- toonData();
- }
- void loop() {
- getLocalTime(&tInfo); // SNTP synchronisatie bij opstart en daarna elke 3 uur (op een ESP32)
- if ((tInfo.tm_min == 1) && (tInfo.tm_sec == 8)) ESP.restart();
- }
- void toonData() {
- Serial.println(mijnLink);
- if (mijnLink.length() > 51) { // lege invoer niet versturen (bvb. als SNTP een timeout geeft)
- get_JsonData();
- for (uint8_t i = 0; i < 80; i++) Serial.print("="); // lijntje trekken
- Serial.println("\nStroomprijzen groothandel (tijden in lokale Belgische tijd)");
- for (uint8_t i = 0; i < 80; i++) Serial.print("=");
- Serial.println();
- for (uint8_t i = 0; i < API_ITEMS; i++) {
- if (epo[i]) { // er worden niet altijd evenveel waarden geretourneerd door de API - lege items niet weergeven
- Serial.printf("%02d. ", i + 1);
- struct tm* cor; // om de epochtijden uit de API om te zetten naar tm-structuur in lokale tijd
- cor = localtime(&epo[i]); // tijden in de lijst aanpassen aan lokale tijd / zomertijd / wintertijd
- Serial.printf("%02d-%02d-%02d %02d:%02d", cor->tm_mday, cor->tm_mon + 1, cor->tm_year + 1900, cor->tm_hour, cor->tm_min);
- Serial.println(" --> " + String(prijzen[i]) + " Eur/MWh");
- }
- }
- for (uint8_t i = 0; i < 80; i++) Serial.print("=");
- Serial.println();
- }
- }
- void get_JsonData() {
- HTTPClient http;
- http.begin(mijnLink);
- if (http.GET() == 200) { // als de verbinding ok is
- DynamicJsonDocument doc(4096); // kies deze waarde groot genoeg om de data te bevatten
- auto error = deserializeJson(doc, http.getString());
- if (error) {
- Serial.print(F("deserializeJson() failed with code "));
- Serial.println(error.c_str());
- }
- for (uint8_t i = 0; i < API_ITEMS; i++) {
- prijzen[i] = doc["price"][i];
- epo[i] = doc["unix_seconds"][i];
- }
- } else Serial.println("Error in API response");
- http.end();
- }
- void toonBerichtGeenVerbinding(WiFiManager* myWiFi) {
- for (uint8_t i = 0; i < 6; i++) Serial.println(verbind[i]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement