ajustement des prévisions
This commit is contained in:
+382
-382
@@ -8,233 +8,233 @@
|
||||
|
||||
struct ForecastResult
|
||||
{
|
||||
QString message;
|
||||
int urgency = 0; // 0-5
|
||||
QString icons = ""; // "vert", "jaune", ...
|
||||
bool snowRisk = false;
|
||||
bool rainRisk = false;
|
||||
bool stormRisk = false;
|
||||
bool blackIce = false;
|
||||
QString prevision1h ="";
|
||||
quint8 confiance = 50;
|
||||
QString message;
|
||||
int urgency = 0; // 0-5
|
||||
QString icons = ""; // "vert", "jaune", ...
|
||||
bool snowRisk = false;
|
||||
bool rainRisk = false;
|
||||
bool stormRisk = false;
|
||||
bool blackIce = false;
|
||||
QString prevision1h ="";
|
||||
quint8 confiance = 50;
|
||||
};
|
||||
|
||||
class BarometerTrend : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BarometerTrend(QObject *parent = nullptr)
|
||||
: QObject(parent)
|
||||
{
|
||||
m_values.reserve(360 + 16); // évite reallocs fréquentes
|
||||
m_timestamps.reserve(360 + 16);
|
||||
restoreHistory();
|
||||
// Sauvegarde automatique toutes les 10 minutes
|
||||
m_saveTimer = new QTimer(this);
|
||||
connect(m_saveTimer, &QTimer::timeout, this, &BarometerTrend::saveHistory);
|
||||
m_saveTimer->start(10 * 60 * 1000);
|
||||
if (!m_saveTimer->isActive())
|
||||
{
|
||||
debug(DEBUGMACRO, "Le timer n'est pas démarré", ERROR);
|
||||
}
|
||||
}
|
||||
explicit BarometerTrend(QObject *parent = nullptr)
|
||||
: QObject(parent)
|
||||
{
|
||||
m_values.reserve(360 + 16); // évite reallocs fréquentes
|
||||
m_timestamps.reserve(360 + 16);
|
||||
restoreHistory();
|
||||
// Sauvegarde automatique toutes les 10 minutes
|
||||
m_saveTimer = new QTimer(this);
|
||||
connect(m_saveTimer, &QTimer::timeout, this, &BarometerTrend::saveHistory);
|
||||
m_saveTimer->start(10 * 60 * 1000);
|
||||
if (!m_saveTimer->isActive())
|
||||
{
|
||||
debug(DEBUGMACRO, "Le timer n'est pas démarré", ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
~BarometerTrend()
|
||||
{
|
||||
saveHistory();
|
||||
}
|
||||
void addPressure(double pressure_hPa)
|
||||
{
|
||||
debug(DEBUGMACRO, "adding pressure " + QByteArray::number(pressure_hPa), DEBUG);
|
||||
// Enregistrement de la nouvelle mesure
|
||||
m_values.append(pressure_hPa);
|
||||
m_timestamps.append(QDateTime::currentDateTime());
|
||||
~BarometerTrend()
|
||||
{
|
||||
saveHistory();
|
||||
}
|
||||
void addPressure(double pressure_hPa)
|
||||
{
|
||||
debug(DEBUGMACRO, "adding pressure " + QByteArray::number(pressure_hPa), DEBUG);
|
||||
// Enregistrement de la nouvelle mesure
|
||||
m_values.append(pressure_hPa);
|
||||
m_timestamps.append(QDateTime::currentDateTime());
|
||||
|
||||
// Limiter la taille de l’historique à 3 heures (360 mesures à 30s d’intervalle)
|
||||
const int maxSamples = 360;
|
||||
while (m_values.size() > maxSamples)
|
||||
{
|
||||
m_values.removeFirst();
|
||||
m_timestamps.removeFirst();
|
||||
}
|
||||
}
|
||||
// Limiter la taille de l’historique à 3 heures (360 mesures à 30s d’intervalle)
|
||||
const int maxSamples = 360;
|
||||
while (m_values.size() > maxSamples)
|
||||
{
|
||||
m_values.removeFirst();
|
||||
m_timestamps.removeFirst();
|
||||
}
|
||||
}
|
||||
|
||||
double currentPressure() const
|
||||
{
|
||||
return m_values.isEmpty() ? 0.0 : m_values.last();
|
||||
}
|
||||
double currentPressure() const
|
||||
{
|
||||
return m_values.isEmpty() ? 0.0 : m_values.last();
|
||||
}
|
||||
|
||||
// Moyenne glissante sur les dernières N mesures (par ex. 5 minutes)
|
||||
double smoothedPressure(int samples = 10) const
|
||||
{
|
||||
if (m_values.isEmpty())
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
int n = qMin(samples, m_values.size());
|
||||
double sum = 0.0;
|
||||
for (int i = m_values.size() - n; i < m_values.size(); ++i)
|
||||
sum += m_values[i];
|
||||
debug(DEBUGMACRO, "smoothed pressure : " + QByteArray::number(sum/n), DEBUG);
|
||||
return sum / n;
|
||||
// Moyenne glissante sur les dernières N mesures (par ex. 5 minutes)
|
||||
double smoothedPressure(int samples = 10) const
|
||||
{
|
||||
if (m_values.isEmpty())
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
int n = qMin(samples, m_values.size());
|
||||
double sum = 0.0;
|
||||
for (int i = m_values.size() - n; i < m_values.size(); ++i)
|
||||
sum += m_values[i];
|
||||
debug(DEBUGMACRO, "smoothed pressure : " + QByteArray::number(sum/n), DEBUG);
|
||||
return sum / n;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Retourne la pression moyenne autour d'un instant cible (fenêtre +/- windowSecs)
|
||||
double pressureAround(const QDateTime &target, int windowSecs = 60) const
|
||||
{
|
||||
if (m_values.isEmpty()) return 0.0;
|
||||
const QDateTime from = target.addSecs(-windowSecs);
|
||||
const QDateTime to = target.addSecs(+windowSecs);
|
||||
double sum = 0.0;
|
||||
int count = 0;
|
||||
for (int i = 0; i < m_timestamps.size(); ++i) {
|
||||
if (m_timestamps[i] >= from && m_timestamps[i] <= to) {
|
||||
sum += m_values[i];
|
||||
++count;
|
||||
}
|
||||
}
|
||||
if (count == 0) {
|
||||
// pas d'échantillon proche -> fallback sur la valeur la plus proche dans le passé
|
||||
for (int i = m_timestamps.size() - 1; i >= 0; --i) {
|
||||
if (m_timestamps[i] <= target) {
|
||||
return m_values[i];
|
||||
}
|
||||
}
|
||||
return m_values.first();
|
||||
}
|
||||
return sum / count;
|
||||
}
|
||||
|
||||
// Variation de pression sur N heures (ex: 1 ou 3)
|
||||
double deltaPressureHours(double hours) const
|
||||
{
|
||||
if (m_values.size() < 2) return 0.0;
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
QDateTime past = now.addSecs(-qRound(hours * 3600.0));
|
||||
double p_now = smoothedPressure(); // moyenne récente (~5 min)
|
||||
double p_past = pressureAround(past, 60); // moyenne autour de l'instant passé
|
||||
double delta = p_now - p_past;
|
||||
// debug(DEBUGMACRO, "delta " + QByteArray::number(hours) + "h : " + QByteArray::number(delta), DEBUG);
|
||||
return delta;
|
||||
}
|
||||
|
||||
// helpers spécifiques
|
||||
double deltaPressure3h() const { return deltaPressureHours(3.0); }
|
||||
double deltaPressure1h() const { return deltaPressureHours(1.0); }
|
||||
|
||||
ForecastResult forecast(double temperatureC, double humidityPercent) const
|
||||
{
|
||||
ForecastResult r;
|
||||
|
||||
r.confiance = 50;
|
||||
double p = currentPressure();
|
||||
double d = deltaPressure3h();
|
||||
double d3 = deltaPressure3h();
|
||||
double d1 = deltaPressure1h();
|
||||
// Retourne la pression moyenne autour d'un instant cible (fenêtre +/- windowSecs)
|
||||
double pressureAround(const QDateTime &target, int windowSecs = 60) const
|
||||
{
|
||||
if (m_values.isEmpty()) return 0.0;
|
||||
const QDateTime from = target.addSecs(-windowSecs);
|
||||
const QDateTime to = target.addSecs(+windowSecs);
|
||||
double sum = 0.0;
|
||||
int count = 0;
|
||||
for (int i = 0; i < m_timestamps.size(); ++i) {
|
||||
if (m_timestamps[i] >= from && m_timestamps[i] <= to) {
|
||||
sum += m_values[i];
|
||||
++count;
|
||||
}
|
||||
}
|
||||
if (count == 0) {
|
||||
// pas d'échantillon proche -> fallback sur la valeur la plus proche dans le passé
|
||||
for (int i = m_timestamps.size() - 1; i >= 0; --i) {
|
||||
if (m_timestamps[i] <= target) {
|
||||
return m_values[i];
|
||||
}
|
||||
}
|
||||
return m_values.first();
|
||||
}
|
||||
return sum / count;
|
||||
}
|
||||
|
||||
debug(DEBUGMACRO, "current pressure : " + QByteArray::number(p) + " - delta pressure 3h" + QByteArray::number(d), DEBUG);
|
||||
// Variation de pression sur N heures (ex: 1 ou 3)
|
||||
double deltaPressureHours(double hours) const
|
||||
{
|
||||
if (m_values.size() < 2) return 0.0;
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
QDateTime past = now.addSecs(-qRound(hours * 3600.0));
|
||||
double p_now = smoothedPressure(); // moyenne récente (~5 min)
|
||||
double p_past = pressureAround(past, 60); // moyenne autour de l'instant passé
|
||||
double delta = p_now - p_past;
|
||||
// debug(DEBUGMACRO, "delta " + QByteArray::number(hours) + "h : " + QByteArray::number(delta), DEBUG);
|
||||
return delta;
|
||||
}
|
||||
|
||||
// build icon list to produce colorCode
|
||||
QStringList icons;
|
||||
// helpers spécifiques
|
||||
double deltaPressure3h() const { return deltaPressureHours(3.0); }
|
||||
double deltaPressure1h() const { return deltaPressureHours(1.0); }
|
||||
|
||||
// Logique combinée pression / tendance
|
||||
ForecastResult forecast(double temperatureC, double humidityPercent) const
|
||||
{
|
||||
ForecastResult r;
|
||||
|
||||
r.confiance = 50;
|
||||
double p = currentPressure();
|
||||
double d = deltaPressure3h();
|
||||
double d3 = deltaPressure3h();
|
||||
double d1 = deltaPressure1h();
|
||||
|
||||
debug(DEBUGMACRO, "current pressure : " + QByteArray::number(p) + " - delta pressure 3h" + QByteArray::number(d), DEBUG);
|
||||
|
||||
// build icon list to produce colorCode
|
||||
QStringList icons;
|
||||
|
||||
// Logique combinée pression / tendance
|
||||
if (p < 990 && d3 <= -3.0)
|
||||
{
|
||||
r.message = "- Tempête ou orage";
|
||||
r.urgency = 5;
|
||||
icons << "cloud_with_lightning";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Très beau temps durable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Beau temps durable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
{
|
||||
r.message = "- Tempête ou orage";
|
||||
r.urgency = 5;
|
||||
icons << "cloud_with_lightning";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Très beau temps durable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Beau temps durable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && (d3 <= +1.0 && d3 >= -1.0))
|
||||
{
|
||||
r.message = "- Beau temps stable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 < -3.0)
|
||||
{
|
||||
r.message = "- Beau, mais rapide dégradation";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && d3 < -1.0)
|
||||
{
|
||||
r.message = "- Beau, mais possible dégradation";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_small_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1020 && (d3 <= 1.0 && d3 >= -1.0))
|
||||
{
|
||||
r.message = "- Beau temps stable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
}else if (p >= 1015 && d3 < -3.0)
|
||||
{
|
||||
r.message = "- Beau, mais rapide dégradation";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1010 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Nuageux, rapide amélioration";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_small_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1010 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Nuageux, en amélioration";
|
||||
r.urgency = 0;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1010 && d3 <= -3.0)
|
||||
{
|
||||
r.message = "- Nuageux, fort risque de pluie ou vent";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1010 && d3 <= -1.0)
|
||||
{
|
||||
r.message = "- nuageux, risque de pluie ou vent";
|
||||
r.urgency = 2;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1010 && (d3 <= 1.0 && d3 >= 1.0))
|
||||
{
|
||||
r.message = "- Nuageux avec des éclaircies";
|
||||
r.urgency = 2;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Variable, amélioration rapide";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Variable, tendance au beau";
|
||||
r.urgency = 0;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 <= -3.0)
|
||||
{
|
||||
r.message = "- Pluie ou perturbation, dégradation rapide";
|
||||
r.urgency = 4;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 <= -1.0)
|
||||
{
|
||||
}else if (p >= 1015 && d3 < -1.0)
|
||||
{
|
||||
r.message = "- Beau, mais possible dégradation";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_small_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1015 && (d3 <= 1.0 && d3 >= -1.0))
|
||||
{
|
||||
r.message = "- Beau temps stable";
|
||||
r.urgency = 0;
|
||||
icons << "sunny";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1005 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Nuageux, rapide amélioration";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_small_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1005 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Nuageux, en amélioration";
|
||||
r.urgency = 0;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1005 && d3 <= -3.0)
|
||||
{
|
||||
r.message = "- Nuageux, fort risque de pluie ou vent";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1005 && d3 <= -1.0)
|
||||
{
|
||||
r.message = "- nuageux, risque de pluie ou vent";
|
||||
r.urgency = 2;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1005 && (d3 <= 1.0 && d3 >= 1.0))
|
||||
{
|
||||
r.message = "- Nuageux avec des éclaircies";
|
||||
r.urgency = 2;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Variable, amélioration rapide";
|
||||
r.urgency = 4;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Variable, tendance au beau";
|
||||
r.urgency = 0;
|
||||
icons << "sun_behind_large_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 <= -3.0)
|
||||
{
|
||||
r.message = "- Pluie ou perturbation, dégradation rapide";
|
||||
r.urgency = 4;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && d3 <= -1.0)
|
||||
{
|
||||
r.message = "- Pluie ou perturbation";
|
||||
r.urgency = 2;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
r.urgency = 2;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p >= 1000 && (d3 <= 1.0 && d3 >= -1.0))
|
||||
{
|
||||
r.message = "- Pluie ou perturbation stable";
|
||||
@@ -242,23 +242,23 @@ public:
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && d3 >= +3.0)
|
||||
{
|
||||
r.message = "- Pluie avec accalmie temporaire, amélioration rapide";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Pluie avec accalmie temporaire";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && d3 <= -1.0)
|
||||
{
|
||||
r.message = "- Mauvais temps durable";
|
||||
r.urgency = 4;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
{
|
||||
r.message = "- Pluie avec accalmie temporaire, amélioration rapide";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && d3 >= +1.0)
|
||||
{
|
||||
r.message = "- Pluie avec accalmie temporaire";
|
||||
r.urgency = 1;
|
||||
icons << "sun_behind_rain_cloud";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && d3 <= -1.0)
|
||||
{
|
||||
r.message = "- Mauvais temps durable";
|
||||
r.urgency = 4;
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}else if (p < 1000 && (d3 <= 1.0 && d3 >= -1.0))
|
||||
{
|
||||
r.message = "- Mauvais temps stable";
|
||||
@@ -268,185 +268,185 @@ public:
|
||||
}
|
||||
|
||||
/*if (qAbs(d3) < 1)
|
||||
{
|
||||
r.message += "- Stable, pas de changement significatif";
|
||||
r.urgency = 0;
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
{
|
||||
r.message += "- Stable, pas de changement significatif";
|
||||
r.urgency = 0;
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}*/
|
||||
|
||||
// Risque de neige
|
||||
if (p < 1000 && d3 < -1.0 && temperatureC <= 1.0 && humidityPercent > 80.0)
|
||||
{
|
||||
r.snowRisk = true;
|
||||
r.message += "- Risque de neige";
|
||||
r.urgency = qMax(r.urgency, 3);
|
||||
icons << "snowflake";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
// Risque de pluie
|
||||
else if (p < 1010 && d3 < -1.0 && temperatureC > 1.0 && humidityPercent > 70.0)
|
||||
{
|
||||
r.rainRisk = true;
|
||||
r.message += "- Risque de pluie";
|
||||
// Risque de neige
|
||||
if (p < 1000 && d3 < -1.0 && temperatureC <= 1.0 && humidityPercent > 80.0)
|
||||
{
|
||||
r.snowRisk = true;
|
||||
r.message += "- Risque de neige";
|
||||
r.urgency = qMax(r.urgency, 3);
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
icons << "snowflake";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
// Risque d’orage
|
||||
if (p < 995 && d3 < -3.0 && temperatureC > 20.0 && humidityPercent > 70.0)
|
||||
{
|
||||
r.stormRisk = true;
|
||||
r.message += "- Risque d’orage";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
icons << "cloud_with_lightning";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
if (temperatureC <= 0.5 && humidityPercent >= 85.0) {
|
||||
// conditions classiques de gel
|
||||
if (d3 >= -1.0 && d3 <= +1.0)
|
||||
{
|
||||
r.blackIce = true; // temps stable = ciel clair = refroidissement
|
||||
}else if (d < -1 && p > 995)
|
||||
{
|
||||
r.blackIce = true; // arrivée d'air humide froid
|
||||
}
|
||||
}
|
||||
|
||||
if (r.blackIce)
|
||||
{
|
||||
r.message += "- Risque de verglas";
|
||||
icons << "ice_cube";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
// --- Prévision à 1 heure ---
|
||||
if (d <= -1.5 && p < 1010 && humidityPercent > 80.0)
|
||||
{
|
||||
r.prevision1h = "- Pluie probable dans l'heure";
|
||||
// Risque de pluie
|
||||
else if (p < 1010 && d3 < -1.0 && temperatureC > 1.0 && humidityPercent > 70.0)
|
||||
{
|
||||
r.rainRisk = true;
|
||||
r.message += "- Risque de pluie";
|
||||
r.urgency = qMax(r.urgency, 3);
|
||||
r.confiance = 80;
|
||||
}else if (d >= +1.5 && p > 1015)
|
||||
{
|
||||
r.prevision1h = "- mélioration probable dans l'heure";
|
||||
r.confiance = 85;
|
||||
}else if (qAbs(d1) < 0.3 && qAbs(temperatureC) < 0.5)
|
||||
{
|
||||
r.prevision1h = "- Conditions stables pour la prochaine heure";
|
||||
r.confiance = 70;
|
||||
}else if (temperatureC < 0 && humidityPercent > 85)
|
||||
{
|
||||
r.prevision1h = "- Possible formation de givre ou verglas dans l'heure";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
r.confiance = 75;
|
||||
}else
|
||||
{
|
||||
r.prevision1h = "- pas de changements dans l'heure";
|
||||
r.urgency = qMax(r.urgency, 2);
|
||||
r.confiance = 85;
|
||||
}
|
||||
icons << "cloud_with_rain";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
// Risque d’orage
|
||||
if (p < 995 && d3 < -3.0 && temperatureC > 20.0 && humidityPercent > 70.0)
|
||||
{
|
||||
r.stormRisk = true;
|
||||
r.message += "- Risque d’orage";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
icons << "cloud_with_lightning";
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
if (temperatureC <= 0.5 && humidityPercent >= 85.0) {
|
||||
// conditions classiques de gel
|
||||
if (d3 >= -1.0 && d3 <= +1.0)
|
||||
{
|
||||
r.blackIce = true; // temps stable = ciel clair = refroidissement
|
||||
}else if (d < -1 && p > 995)
|
||||
{
|
||||
r.blackIce = true; // arrivée d'air humide froid
|
||||
}
|
||||
}
|
||||
|
||||
if (r.blackIce)
|
||||
{
|
||||
r.message += "- Risque de verglas";
|
||||
icons << "ice_cube";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
}
|
||||
|
||||
// --- Prévision à 1 heure ---
|
||||
if (d <= -1.5 && p < 1010 && humidityPercent > 80.0)
|
||||
{
|
||||
r.prevision1h = "- Pluie probable dans l'heure";
|
||||
r.urgency = qMax(r.urgency, 3);
|
||||
r.confiance = 80;
|
||||
}else if (d >= +1.5 && p > 1015)
|
||||
{
|
||||
r.prevision1h = "- mélioration probable dans l'heure";
|
||||
r.confiance = 85;
|
||||
}else if (qAbs(d1) < 0.3 && qAbs(temperatureC) < 0.5)
|
||||
{
|
||||
r.prevision1h = "- Conditions stables pour la prochaine heure";
|
||||
r.confiance = 70;
|
||||
}else if (temperatureC < 0 && humidityPercent > 85)
|
||||
{
|
||||
r.prevision1h = "- Possible formation de givre ou verglas dans l'heure";
|
||||
r.urgency = qMax(r.urgency, 4);
|
||||
r.confiance = 75;
|
||||
}else
|
||||
{
|
||||
r.prevision1h = "- pas de changements dans l'heure";
|
||||
r.urgency = qMax(r.urgency, 2);
|
||||
r.confiance = 85;
|
||||
}
|
||||
|
||||
|
||||
// --- Ajustement de confiance selon stabilité barométrique ---
|
||||
if (qAbs(d) > 3.0)
|
||||
{
|
||||
r.confiance -= 15; // variations trop fortes → prévision moins fiable
|
||||
}
|
||||
if (p < 990 || p > 1030)
|
||||
{
|
||||
r.confiance -= 10; // situations extrêmes, moins prédictibles
|
||||
}
|
||||
if (r.blackIce)
|
||||
{
|
||||
r.confiance += 5; // phénomène local très probable
|
||||
}
|
||||
r.confiance = qBound((quint8)0, r.confiance, (quint8)100); // borne entre 0 et 100
|
||||
// --- Ajustement de confiance selon stabilité barométrique ---
|
||||
if (qAbs(d) > 3.0)
|
||||
{
|
||||
r.confiance -= 15; // variations trop fortes → prévision moins fiable
|
||||
}
|
||||
if (p < 990 || p > 1030)
|
||||
{
|
||||
r.confiance -= 10; // situations extrêmes, moins prédictibles
|
||||
}
|
||||
if (r.blackIce)
|
||||
{
|
||||
r.confiance += 5; // phénomène local très probable
|
||||
}
|
||||
r.confiance = qBound((quint8)0, r.confiance, (quint8)100); // borne entre 0 et 100
|
||||
|
||||
// --- Résultat complet ---
|
||||
if (!r.prevision1h.isEmpty())
|
||||
{
|
||||
r.message += "\n**Prévision dans l'heure**";
|
||||
r.message += "\n" + r.prevision1h;
|
||||
r.message += "\n- Probabilité " + QByteArray::number(r.confiance) + "%";
|
||||
}
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
// --- Résultat complet ---
|
||||
if (!r.prevision1h.isEmpty())
|
||||
{
|
||||
r.message += "\n**Prévision dans l'heure**";
|
||||
r.message += "\n" + r.prevision1h;
|
||||
r.message += "\n- Probabilité " + QByteArray::number(r.confiance) + "%";
|
||||
}
|
||||
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
|
||||
|
||||
if (!icons.isEmpty()) r.icons = icons.join(",");
|
||||
if (!icons.isEmpty()) r.icons = icons.join(",");
|
||||
|
||||
return r;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
private:
|
||||
QVector<double> m_values;
|
||||
QVector<QDateTime> m_timestamps;
|
||||
QTimer *m_saveTimer;
|
||||
QVector<double> m_values;
|
||||
QVector<QDateTime> m_timestamps;
|
||||
QTimer *m_saveTimer;
|
||||
|
||||
private slots:
|
||||
void saveHistory()
|
||||
{
|
||||
QJsonArray array;
|
||||
for (int i = 0; i < m_values.size(); ++i)
|
||||
{
|
||||
QJsonObject obj;
|
||||
obj["timestamp"] = m_timestamps[i].toString(Qt::ISODate);
|
||||
obj["pressure"] = m_values[i];
|
||||
array.append(obj);
|
||||
}
|
||||
void saveHistory()
|
||||
{
|
||||
QJsonArray array;
|
||||
for (int i = 0; i < m_values.size(); ++i)
|
||||
{
|
||||
QJsonObject obj;
|
||||
obj["timestamp"] = m_timestamps[i].toString(Qt::ISODate);
|
||||
obj["pressure"] = m_values[i];
|
||||
array.append(obj);
|
||||
}
|
||||
|
||||
QJsonDocument doc(array);
|
||||
QFile file("/usr/local/share/pws2mqtt/barometer_history.json");
|
||||
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||
{
|
||||
file.write(doc.toJson());
|
||||
file.close();
|
||||
debug(DEBUGMACRO, "Barometer history saved (" + QByteArray::number(m_values.size()) + " samples)", DEBUG);
|
||||
}else
|
||||
{
|
||||
debug(DEBUGMACRO, "File not open : " + file.errorString() , WARNING);
|
||||
}
|
||||
}
|
||||
QJsonDocument doc(array);
|
||||
QFile file("/usr/local/share/pws2mqtt/barometer_history.json");
|
||||
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||
{
|
||||
file.write(doc.toJson());
|
||||
file.close();
|
||||
debug(DEBUGMACRO, "Barometer history saved (" + QByteArray::number(m_values.size()) + " samples)", DEBUG);
|
||||
}else
|
||||
{
|
||||
debug(DEBUGMACRO, "File not open : " + file.errorString() , WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
void restoreHistory()
|
||||
{
|
||||
QFile file("/usr/local/share/pws2mqtt/barometer_history.json");
|
||||
if (!file.exists())
|
||||
{
|
||||
debug(DEBUGMACRO, "File not open : " + file.errorString() , WARNING);
|
||||
return;
|
||||
}
|
||||
if (file.open(QIODevice::ReadOnly))
|
||||
{
|
||||
QByteArray data = file.readAll();
|
||||
file.close();
|
||||
void restoreHistory()
|
||||
{
|
||||
QFile file("/usr/local/share/pws2mqtt/barometer_history.json");
|
||||
if (!file.exists())
|
||||
{
|
||||
debug(DEBUGMACRO, "File not open : " + file.errorString() , WARNING);
|
||||
return;
|
||||
}
|
||||
if (file.open(QIODevice::ReadOnly))
|
||||
{
|
||||
QByteArray data = file.readAll();
|
||||
file.close();
|
||||
|
||||
QJsonDocument doc = QJsonDocument::fromJson(data);
|
||||
if (!doc.isArray()) return;
|
||||
QJsonDocument doc = QJsonDocument::fromJson(data);
|
||||
if (!doc.isArray()) return;
|
||||
|
||||
QJsonArray array = doc.array();
|
||||
for (const QJsonValue &val : array)
|
||||
{
|
||||
QJsonObject obj = val.toObject();
|
||||
double pressure = obj["pressure"].toDouble();
|
||||
QDateTime ts = QDateTime::fromString(obj["timestamp"].toString(), Qt::ISODate);
|
||||
if (ts.isValid())
|
||||
{
|
||||
m_values.append(pressure);
|
||||
m_timestamps.append(ts);
|
||||
}
|
||||
}
|
||||
QJsonArray array = doc.array();
|
||||
for (const QJsonValue &val : array)
|
||||
{
|
||||
QJsonObject obj = val.toObject();
|
||||
double pressure = obj["pressure"].toDouble();
|
||||
QDateTime ts = QDateTime::fromString(obj["timestamp"].toString(), Qt::ISODate);
|
||||
if (ts.isValid())
|
||||
{
|
||||
m_values.append(pressure);
|
||||
m_timestamps.append(ts);
|
||||
}
|
||||
}
|
||||
|
||||
// On ne garde que les 3 dernières heures
|
||||
QDateTime limit = QDateTime::currentDateTime().addSecs(-3 * 3600);
|
||||
while (!m_timestamps.isEmpty() && m_timestamps.first() < limit)
|
||||
{
|
||||
m_timestamps.removeFirst();
|
||||
m_values.removeFirst();
|
||||
}
|
||||
// On ne garde que les 3 dernières heures
|
||||
QDateTime limit = QDateTime::currentDateTime().addSecs(-3 * 3600);
|
||||
while (!m_timestamps.isEmpty() && m_timestamps.first() < limit)
|
||||
{
|
||||
m_timestamps.removeFirst();
|
||||
m_values.removeFirst();
|
||||
}
|
||||
|
||||
debug(DEBUGMACRO, "Barometer history restored (" + QByteArray::number(m_values.size()) + " samples)", DEBUG);
|
||||
}
|
||||
}
|
||||
debug(DEBUGMACRO, "Barometer history restored (" + QByteArray::number(m_values.size()) + " samples)", DEBUG);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user