Browse Source

Changement endpoint enphase api

Passage de la fréquence PWM pour le SSR de 100Hz à 1000Hz
master
scayac 6 days ago
parent
commit
dc83228eeb
  1. 26
      src/main.cpp

26
src/main.cpp

@ -74,8 +74,8 @@ unsigned long otaRebootTime = 0;
// Variable pour le mode JOUR - mémoriser si la température max a été atteinte aujourd'hui // Variable pour le mode JOUR - mémoriser si la température max a été atteinte aujourd'hui
bool maxTempReachedToday = false; bool maxTempReachedToday = false;
// Variables pour la gestion PWM avec timer (période 1s) // Variables pour la gestion PWM avec timer (période 100ms)
const unsigned long PWM_PERIOD = 1000; // Période de 1 seconde en ms const unsigned long PWM_PERIOD = 100; // Période de 100ms en ms
volatile unsigned long pwmCycleCount = 0; // Compteur de cycles PWM volatile unsigned long pwmCycleCount = 0; // Compteur de cycles PWM
volatile unsigned long pwmOnTime = 0; // Temps ON en ms pour le cycle actuel volatile unsigned long pwmOnTime = 0; // Temps ON en ms pour le cycle actuel
volatile unsigned long pwmElapsed = 0; // Temps écoulé dans le cycle actuel en ms volatile unsigned long pwmElapsed = 0; // Temps écoulé dans le cycle actuel en ms
@ -415,12 +415,12 @@ bool checkAuthentication(AsyncWebServerRequest *request) {
return false; return false;
} }
// Interruption timer appelée toutes les 10ms (100Hz) pour gérer le PWM // Interruption timer appelée toutes les 1ms (1000Hz) pour gérer le PWM
void IRAM_ATTR onTimerISR() { void IRAM_ATTR onTimerISR() {
// ESP32: Protéger l'accès aux variables partagées // ESP32: Protéger l'accès aux variables partagées
portENTER_CRITICAL_ISR(&timerMux); portENTER_CRITICAL_ISR(&timerMux);
pwmElapsed += 10; pwmElapsed += 1;
// Si on dépasse la période, recommencer un nouveau cycle // Si on dépasse la période, recommencer un nouveau cycle
if (pwmElapsed >= PWM_PERIOD) { if (pwmElapsed >= PWM_PERIOD) {
@ -449,7 +449,7 @@ void fetchEnphaseData() {
WiFiClientSecure client; WiFiClientSecure client;
client.setInsecure(); // Ignorer la vérification du certificat SSL client.setInsecure(); // Ignorer la vérification du certificat SSL
HTTPClient http; HTTPClient http;
String url = "https://" + enphaseGatewayIP + "/ivp/meters/reports/consumption"; String url = "https://" + enphaseGatewayIP + "/ivp/meters/readings";
http.begin(client, url); http.begin(client, url);
http.addHeader("Accept", "application/json"); http.addHeader("Accept", "application/json");
http.addHeader("Authorization", "Bearer " + enphaseToken); http.addHeader("Authorization", "Bearer " + enphaseToken);
@ -460,14 +460,12 @@ void fetchEnphaseData() {
JsonDocument doc; JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload); DeserializationError error = deserializeJson(doc, payload);
if (!error && doc.is<JsonArray>() && doc.size() >= 2) { if (!error && doc.is<JsonArray>() && doc.size() >= 2) {
float total = doc[0]["cumulative"]["currW"].as<float>(); solarProduction = round(doc[0]["activePower"].as<float>()); // Production des panneaux arrondie
float net = doc[1]["cumulative"]["currW"].as<float>();
solarProduction = round(total - net); // Production des panneaux arrondie
if (solarProduction < 0) { if (solarProduction < 0) {
solarProduction = 0; // Éviter les valeurs négatives solarProduction = 0; // Éviter les valeurs négatives
} }
powerImport = round(net); // Consommation totale enedis arrondie powerImport = round(doc[1]["activePower"].as<float>()); // Consommation totale enedis arrondie
powerNetConsumption = round(total); // Consommation de la maison powerNetConsumption = round(powerImport+solarProduction); // Consommation de la maison
Serial.printf("Enphase - Total: %.1fW, Panneaux: %.1fW, Enedis: %.1fW\n", Serial.printf("Enphase - Total: %.1fW, Panneaux: %.1fW, Enedis: %.1fW\n",
powerNetConsumption, solarProduction, powerImport); powerNetConsumption, solarProduction, powerImport);
enphaseConnectionError = false; enphaseConnectionError = false;
@ -1599,15 +1597,15 @@ void setup() {
Serial.print("Accédez à http://"); Serial.print("Accédez à http://");
Serial.println(WiFi.localIP()); Serial.println(WiFi.localIP());
// Initialiser le timer pour le PWM (interruption toutes les 10ms = 100Hz) // Initialiser le timer pour le PWM (interruption toutes les 1ms = 1000Hz)
// ESP32: Utiliser hw_timer // ESP32: Utiliser hw_timer
// Timer 0, prescaler 80 (80MHz / 80 = 1MHz = 1µs), compte vers le haut // Timer 0, prescaler 80 (80MHz / 80 = 1MHz = 1µs), compte vers le haut
timer = timerBegin(0, 80, true); timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimerISR, true); timerAttachInterrupt(timer, &onTimerISR, true);
// Déclencher toutes les 10000µs = 10ms = 100Hz // Déclencher toutes les 1000µs = 1ms = 1000Hz
timerAlarmWrite(timer, 10000, true); timerAlarmWrite(timer, 1000, true);
timerAlarmEnable(timer); timerAlarmEnable(timer);
Serial.println("Timer PWM initialisé (100Hz)"); Serial.println("Timer PWM initialisé (1000Hz)");
// Créer la tâche FreeRTOS pour Enphase sur le cœur 1 // Créer la tâche FreeRTOS pour Enphase sur le cœur 1
// Priority: 2 (plus élevée que tskIDLE_PRIORITY=0 mais moins que le loop=1) // Priority: 2 (plus élevée que tskIDLE_PRIORITY=0 mais moins que le loop=1)

Loading…
Cancel
Save