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; @@ -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
bool maxTempReachedToday = false;
// Variables pour la gestion PWM avec timer (période 1s)
const unsigned long PWM_PERIOD = 1000; // Période de 1 seconde en ms
// Variables pour la gestion PWM avec timer (période 100ms)
const unsigned long PWM_PERIOD = 100; // Période de 100ms en ms
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 pwmElapsed = 0; // Temps écoulé dans le cycle actuel en ms
@ -415,12 +415,12 @@ bool checkAuthentication(AsyncWebServerRequest *request) { @@ -415,12 +415,12 @@ bool checkAuthentication(AsyncWebServerRequest *request) {
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() {
// ESP32: Protéger l'accès aux variables partagées
portENTER_CRITICAL_ISR(&timerMux);
pwmElapsed += 10;
pwmElapsed += 1;
// Si on dépasse la période, recommencer un nouveau cycle
if (pwmElapsed >= PWM_PERIOD) {
@ -449,7 +449,7 @@ void fetchEnphaseData() { @@ -449,7 +449,7 @@ void fetchEnphaseData() {
WiFiClientSecure client;
client.setInsecure(); // Ignorer la vérification du certificat SSL
HTTPClient http;
String url = "https://" + enphaseGatewayIP + "/ivp/meters/reports/consumption";
String url = "https://" + enphaseGatewayIP + "/ivp/meters/readings";
http.begin(client, url);
http.addHeader("Accept", "application/json");
http.addHeader("Authorization", "Bearer " + enphaseToken);
@ -460,14 +460,12 @@ void fetchEnphaseData() { @@ -460,14 +460,12 @@ void fetchEnphaseData() {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error && doc.is<JsonArray>() && doc.size() >= 2) {
float total = doc[0]["cumulative"]["currW"].as<float>();
float net = doc[1]["cumulative"]["currW"].as<float>();
solarProduction = round(total - net); // Production des panneaux arrondie
solarProduction = round(doc[0]["activePower"].as<float>()); // Production des panneaux arrondie
if (solarProduction < 0) {
solarProduction = 0; // Éviter les valeurs négatives
}
powerImport = round(net); // Consommation totale enedis arrondie
powerNetConsumption = round(total); // Consommation de la maison
powerImport = round(doc[1]["activePower"].as<float>()); // Consommation totale enedis arrondie
powerNetConsumption = round(powerImport+solarProduction); // Consommation de la maison
Serial.printf("Enphase - Total: %.1fW, Panneaux: %.1fW, Enedis: %.1fW\n",
powerNetConsumption, solarProduction, powerImport);
enphaseConnectionError = false;
@ -1599,15 +1597,15 @@ void setup() { @@ -1599,15 +1597,15 @@ void setup() {
Serial.print("Accédez à http://");
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
// Timer 0, prescaler 80 (80MHz / 80 = 1MHz = 1µs), compte vers le haut
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimerISR, true);
// Déclencher toutes les 10000µs = 10ms = 100Hz
timerAlarmWrite(timer, 10000, true);
// Déclencher toutes les 1000µs = 1ms = 1000Hz
timerAlarmWrite(timer, 1000, true);
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
// Priority: 2 (plus élevée que tskIDLE_PRIORITY=0 mais moins que le loop=1)

Loading…
Cancel
Save