added: prevision1h
This commit is contained in:
1 parent
a8819971d7
commit
6f28fd5001
9 files changed
+132
-60
No files matched your search
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -1,8 +1,6 @@
|
||||
#ifndef VERSION_H
|
||||
#define VERSION_H
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
std::string version = "1.0.54";
|
||||
|
||||
#endif // VERSION_H
|
||||
Reference in new issue
Block a user