added: prevision1h

This commit is contained in:
DTux committed 2025-10-18 14:49:24 +02:00
1 parent a8819971d7
commit 6f28fd5001
9 files changed
+132 -60

No files matched your search

+330
View File
@@ -0,0 +1,330 @@
#pragma once
#include "pws2mqtt.h"
#include <QObject>
#include <QVector>
#include <QDateTime>
#include <QtMath>
struct ForecastResult
{
QString message;
int urgency = 0; // 0-5
QString colorCode = ""; // "vert", "jaune", ...
bool snowRisk;
bool rainRisk;
bool stormRisk;
bool blackIce;
QString prevision1h;
quint8 confiance;
};
class BarometerTrend : public QObject
{
Q_OBJECT
public:
explicit BarometerTrend(QObject *parent = nullptr)
: QObject(parent)
{}
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();
}
}
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;
}
// Variation de pression sur les dernières 3h
double deltaPressure3h() const
{
if (m_values.size() < 2)
{
return 0.0;
}
QDateTime now = QDateTime::currentDateTime();
QDateTime target = now.addSecs(-3 * 3600);
// Cherche la valeur la plus proche d’il y a 3 heures
int idx = -1;
for (int i = 0; i < m_timestamps.size(); ++i)
{
if (m_timestamps[i] >= target)
{
idx = i;
break;
}
}
if (idx == -1)
{
idx = 0; // Pas assez vieux, on prend la plus ancienne
}
double p_now = smoothedPressure();
double p_past = m_values[idx];
debug(DEBUGMACRO, "delta pressure : " + QByteArray::number(p_now - p_past), DEBUG);
return p_now - p_past;
}
ForecastResult forecast(double temperatureC, double humidityPercent) const
{
ForecastResult r;
double p = currentPressure();
double d = deltaPressure3h();
r.snowRisk = false;
r.rainRisk = false;
r.stormRisk = false;
r.blackIce = false;
debug(DEBUGMACRO, "current pressure : " + QByteArray::number(p) + " - delta pressure 3h" + QByteArray::number(d), DEBUG);
// Logique combinée pression / tendance
if (p >= 1020 && d >= +3)
{
r.message = "- Très beau temps durable \n";
r.urgency = 0;
r.colorCode = "sunny";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1020 && d >= +1)
{
r.message = "- Beau temps durable \n";
r.urgency = 0;
r.colorCode = "sunny";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1020 && d < -3)
{
r.message = "- Beau, mais rapide dégradation \n";
r.urgency = 4;
r.colorCode = "sun_behind_large_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1020 && d < -1)
{
r.message = "- Beau, mais possible dégradation \n";
r.urgency = 1;
r.colorCode = "sun_behind_small_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
/*}else if (p >= 1020 && d < 0.5)
{
r.message = "- Beau temps \n";
r.urgency = 0;
r.colorCode = "sunny";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);*/
}else if (p >= 1010 && d >= +3)
{
r.message = "- Nuageux, rapide amélioration \n";
r.urgency = 4;
r.colorCode = "sun_behind_small_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1010 && d >= +1)
{
r.message = "- Nuageux, en amélioration \n";
r.urgency = 0;
r.colorCode = "sun_behind_large_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1010 && d <= -3)
{
r.message = "- Nuageux, fort risque de pluie ou vent \n";
r.urgency = 4;
r.colorCode = "sun_behind_rain_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1010 && d <= -1)
{
r.message = "- nuageux, risque de pluie ou vent \n";
r.urgency = 2;
r.colorCode = "sun_behind_rain_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1010 && d <= 0.5)
{
r.message = "- Nuageux avec des éclaircies \n";
r.urgency = 2;
r.colorCode = "sun_behind_large_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1000 && d >= +3)
{
r.message = "- Variable, amélioration rapide \n";
r.urgency = 4;
r.colorCode = "sun_behind_large_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1000 && d >= +1)
{
r.message = "- Variable, tendance au beau \n";
r.urgency = 0;
r.colorCode = "sun_behind_large_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1000 && d <= -3)
{
r.message = "- Pluie ou perturbation, dégradation rapide \n";
r.urgency = 4;
r.colorCode = "cloud_with_rain";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p >= 1000 && d <= -1)
{
r.message = "- Pluie ou perturbation \n";
r.urgency = 2;
r.colorCode = "cloud_with_rain";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p < 990 && d <= -3)
{
r.message = "- Tempête ou orage \n";
r.urgency = 5;
r.colorCode = "cloud_with_lightning";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p < 1000 && d >= +3)
{
r.message = "- Pluie avec accalmie temporaire, amélioration rapide \n";
r.urgency = 1;
r.colorCode = "sun_behind_rain_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p < 1000 && d >= +1)
{
r.message = "- Pluie avec accalmie temporaire \n";
r.urgency = 1;
r.colorCode = "sun_behind_rain_cloud";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}else if (p < 1000 && d <= -1)
{
r.message = "- Mauvais temps durable \n";
r.urgency = 4;
r.colorCode = "cloud_with_rain";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}
if (qAbs(d) < 1)
{
r.message += "- Stable, pas de changement significatif \n";
r.urgency = 0;
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}
// Risque de neige
if (p < 1000 && d < -1 && temperatureC <= 1.0 && humidityPercent > 80.0)
{
r.snowRisk = true;
r.message += "- Risque de neige \n";
r.urgency = qMax(r.urgency, 3);
r.colorCode += "snowflake,";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}
// Risque de pluie
else if (p < 1010 && d < -1 && temperatureC > 1.0 && humidityPercent > 70.0)
{
r.rainRisk = true;
r.message += "- Risque de pluie \n";
r.urgency = qMax(r.urgency, 2);
r.colorCode += "cloud_with_rain,";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}
// Risque d’orage
if (p < 995 && d < -3 && temperatureC > 20.0 && humidityPercent > 70.0)
{
r.stormRisk = true;
r.message += "- Risque d’orage \n";
r.urgency = qMax(r.urgency, 4);
r.colorCode += "cloud_with_lightning,";
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
}
if (temperatureC <= 0.5 && humidityPercent >= 85.0) {
// conditions classiques de gel
if (d >= -1 && d <= +1)
{
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 \n";
r.colorCode += "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)
{
r.prevision1h = "☔ Pluie probable dans l’heure \n";
r.urgency = qMax(r.urgency, 4);
r.confiance = 80;
}else if (d >= +1.5 && p > 1015)
{
r.prevision1h = "🌤 Amélioration probable dans l’heure \n";
r.confiance = 85;
}else if (qAbs(d) < 0.3 && qAbs(temperatureC) < 0.5)
{
r.prevision1h = "⛅ Conditions stables pour la prochaine heure \n";
r.confiance = 70;
}else if (temperatureC < 0 && humidityPercent > 85)
{
r.prevision1h = "❄️ Possible formation de givre ou verglas dans l’heure \n";
r.urgency = qMax(r.urgency, 4);
r.confiance = 75;
}
// --- 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 += "**Prévision dans l'heure** \n";
r.message += r.prevision1h;
r.message += "- " + QByteArray::number(r.confiance) + "% \n";
}
debug(DEBUGMACRO, "message : " + r.message, DEBUG);
return r;
}
private:
QVector<double> m_values;
QVector<QDateTime> m_timestamps;
};
+1 -5
View File
@@ -1,5 +1,4 @@
#ifndef HTTPSERVER_H
#define HTTPSERVER_H
#pragma once
#include <QtHttpServer/QHttpServer>
@@ -9,6 +8,3 @@ class HttpServer : QObject
public:
int port = 5000;
};
#endif // HTTPSERVER_H
+1 -1
View File
@@ -103,7 +103,7 @@ void debug(QString debugHeader, QString msg, uint8_t level, QByteArray property)
if ((debugLevel & level) == 4)
{
qInfo("%s%s WARNING: %s%s", debugHeader.toStdString().c_str(), ORANGE, msg.toStdString().c_str(), NORMAL);
notify (debugHeader + " - " + msg);
notify (debugHeader + " - " + msg);
}
if ((debugLevel & level) == 8)
{
+1 -4
View File
@@ -1,5 +1,4 @@
#ifndef MQTT_H
#define MQTT_H
#pragma once
#include <cstring>
#include <cstdio>
@@ -187,5 +186,3 @@ class MqttClient : public QObject
// void updateMessage();
};
#endif //MQTT_H
+9 -5
View File
@@ -323,7 +323,7 @@ void Pws2mqtt::parseData(QList<std::pair<QString, QString>> queryList)
if (prevision != newPrevision)
{
prevision = newPrevision;
propertyList["prevision"] = "- " + prevision + " \n";
propertyList["prevision"] = prevision;
priority = setPriority(priority, ret.urgency);
tag += ret.colorCode;
}
@@ -393,8 +393,12 @@ void Pws2mqtt::parseData(QList<std::pair<QString, QString>> queryList)
}
debug(DEBUGMACRO, "Name = " + name + ", value = " + value, DEBUG);
notif += propertyList[name];
}
if (! (name == "prevision"))
{
notif += propertyList[name];
}
}
notif += "**Prévisions** \n" + propertyList["prevision"];
debug(DEBUGMACRO, "calling notify with notif = #" + notif + "#", DEBUG);
if (changed)
{
@@ -608,7 +612,7 @@ bool compare (double value, double currentValue, double ecart)
QString formatNotifString (QString name, QString unit ,QByteArray value)
{
QString text = "- " + name + " : " + value;
QString text = "- " + name + " : " + value;
if (!unit.isEmpty())
{
text += unit;
@@ -630,7 +634,7 @@ void notify(QString notif, QString priority, QString inputPath, QString tag)
std::string readBuffer;
priority = "Priority: " + priority;
debug (DEBUGMACRO, "notifying at priority " + priority + " - message : " + notif, DEBUG);
debug (DEBUGMACRO, "notifying at priority " + priority + "with tag : " + tag + " - message : " + notif, DEBUG);
// Initialise libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
+1 -3
View File
@@ -1,5 +1,4 @@
#ifndef PWS2MQTT_H
#define PWS2MQTT_H
#pragma once
#include <QString>
#include <QByteArray>
@@ -65,4 +64,3 @@ void rotateAndSaveImage(const QString &inputPath, const QString &outputPath, qre
double windChill(double airT, double vent);
double calculerHumidex(double temperature, double humiditeRelative);
#endif // PWS2MQTT_H
+1 -3
View File
@@ -1,8 +1,6 @@
#ifndef VERSION_H
#define VERSION_H
#pragma once
#include <string>
std::string version = "1.0.54";
#endif // VERSION_H