agreg-project-embedded/lib/SimuGaz/simugaz.cpp

50 lines
1.6 KiB
C++
Raw Normal View History

#include <simugaz.h>
#define INITIAL_PULSE_CNT 185432
#define INITIAL_SECONDS 0
#define AVERAGE_DAILY_CONSUMPTION 2.66f
// Source : opendata.grdf.fr/explore/dataset/correction_climatique_grdf/
// Profil résidentiel chauffage (P011), moyenne 2019-2023, normalisée sur 12 mois
static const float GRDF_MONTHLY_COEFF[12] = {
2.21f, // Janvier
2.05f, // Février
1.62f, // Mars
0.97f, // Avril
0.55f, // Mai
0.22f, // Juin
0.15f, // Juillet
0.17f, // Août
0.38f, // Septembre
0.85f, // Octobre
1.52f, // Novembre
2.11f, // Décembre
};
// Base annuelle : 972 m³/an pour 100m² (CRE)
// - base mensuelle moyenne = 81 m³/mois
// - base journalière moyenne = 2.66 m³/j
RTC_DATA_ATTR uint32_t pulseCount = INITIAL_PULSE_CNT;
RTC_DATA_ATTR uint32_t totalSeconds = INITIAL_SECONDS;
uint32_t simulateGasPulses(uint32_t intervalSeconds)
{
totalSeconds += intervalSeconds;
uint32_t month = (totalSeconds / (86400UL * 30UL)) % 12;
float dailyBase = AVERAGE_DAILY_CONSUMPTION * GRDF_MONTHLY_COEFF[month];
// Variabilité journalière ±15%
float dailyVariation = 1.0f + 0.30f * ((float)(esp_random() % 1000) / 1000.0f - 0.5f);
// Résolution compteur Gazpar : 0.010 m³ par impulsion
float incrementM3 = dailyBase * intervalSeconds / 86400.0f * dailyVariation;
uint32_t incrementPulses = (uint32_t)(incrementM3 / 0.010f);
pulseCount += incrementPulses;
Serial.printf("[GAZ] Incrément de %lu impulsions - Total : %lu impulsions (%.3f m³)\n", incrementPulses, pulseCount, pulseCount * 0.010f);
return pulseCount;
}