From 9ff9af105d32a0dc4d756bc4f778b39ee623c7de Mon Sep 17 00:00:00 2001 From: Daniel Tartavel Date: Mon, 13 Oct 2025 22:24:44 +0200 Subject: [PATCH] fonctionnelle --- fleche.png | Bin 0 -> 41043 bytes main.cpp | 2 +- pws2mqtt-qt.pro | 31 ---- pws2mqtt-qt.pro.user | 404 ------------------------------------------- pws2mqtt.cpp | 173 ++++++------------ pws2mqtt.h | 2 +- version.h | 2 +- 7 files changed, 52 insertions(+), 562 deletions(-) create mode 100644 fleche.png delete mode 100644 pws2mqtt-qt.pro delete mode 100644 pws2mqtt-qt.pro.user diff --git a/fleche.png b/fleche.png new file mode 100644 index 0000000000000000000000000000000000000000..2d633fe45aa71d432f7c6d249abe2dc10fdd8e0b GIT binary patch literal 41043 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 - notify (QString("Program started"), "default"); + //notify (QString("Program started"), "default"); a.exec(); diff --git a/pws2mqtt-qt.pro b/pws2mqtt-qt.pro deleted file mode 100644 index c346d13..0000000 --- a/pws2mqtt-qt.pro +++ /dev/null @@ -1,31 +0,0 @@ -QT = gui -QT += network -QT += core -QT += mqtt -QT += httpserver - -LIBS += -lcurl - -CONFIG += c++17 console -CONFIG -= app_bundle - -# You can make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -SOURCES += \ -main.cpp \ -mqtt.cpp \ -pws2mqtt.cpp - -# Default rules for deployment. -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target - -HEADERS += \ -httpserver.h \ -mqtt.h \ -pws2mqtt.h \ -version.h - diff --git a/pws2mqtt-qt.pro.user b/pws2mqtt-qt.pro.user deleted file mode 100644 index c8d942e..0000000 --- a/pws2mqtt-qt.pro.user +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - EnvironmentId - {db2284ae-177e-4753-8e1e-1e0e73c52ae1} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - false - true - false - 0 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 1 - - - - true - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Qt 6.4.1 (qt6) - Qt 6.4.1 (qt6) - {17b0ba8e-e6fe-4c71-98eb-9b4d3bcc4307} - 0 - 0 - 0 - - 1 - /home/daniel/develop/pws2mqtt-qt/build/debug - /home/daniel/develop/pws2mqtt-qt/build/debug - - - true - -x versioning -s 1 - bash - %{ActiveProject:NativePath} - ProjectExplorer.ProcessStep - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 3 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - 1 - - - /home/daniel/develop/pws2mqtt-qt/build/Release - /home/daniel/develop/pws2mqtt-qt/build/Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - 2 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - Qt4ProjectManager.Qt4RunConfiguration:/home/daniel/develop/pws2mqtt-qt/pws2mqtt-qt.pro - /home/daniel/develop/pws2mqtt-qt/pws2mqtt-qt.pro - false - true - true - false - true - false - /home/daniel/develop/pws2mqtt-qt/build/debug - - 1 - - - - ProjectExplorer.Project.Target.1 - - Desktop - Desktop - Desktop - {96ba01cf-98b6-46f1-b1a8-6cf5d7804e77} - 0 - 0 - 0 - - 0 - /home/daniel/develop/pws2mqtt-qt/../build-pws2mqtt-qt-Desktop-Debug - /home/daniel/develop/build-pws2mqtt-qt-Desktop-Debug - - - true - -s 1 - versioning - %{buildDir} - ProjectExplorer.ProcessStep - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 3 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - /home/daniel/develop/pws2mqtt-qt/../build-pws2mqtt-qt-Desktop-Release - /home/daniel/develop/build-pws2mqtt-qt-Desktop-Release - - - true - QtProjectManager.QMakeBuildStep - true - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - /home/daniel/develop/pws2mqtt-qt/../build-pws2mqtt-qt-Desktop-Profile - /home/daniel/develop/build-pws2mqtt-qt-Desktop-Profile - - - true - QtProjectManager.QMakeBuildStep - true - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - Qt4ProjectManager.Qt4RunConfiguration:/home/daniel/develop/pws2mqtt-qt/pws2mqtt-qt.pro - /home/daniel/develop/pws2mqtt-qt/pws2mqtt-qt.pro - false - true - true - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 2 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/pws2mqtt.cpp b/pws2mqtt.cpp index 554b3a9..1dc875a 100644 --- a/pws2mqtt.cpp +++ b/pws2mqtt.cpp @@ -39,7 +39,7 @@ static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *use return size * nmemb; // On ne traite pas les données reçues } -QMap propertyList; +QMap propertyList; QMap propertiesValue; QMap > propertyName { @@ -146,15 +146,15 @@ void Pws2mqtt::parseData(QList> queryList) QString jsonString = "{"; bool propertyFlag = false; bool deviceFlag = false; -// QString topic; + // QString topic; QString deviceString = "\"device\": {\"ieeeAddress\": \"" + mqttClient->macAddress + "\", \"type\": \"" + mqttClient->type + "\", \"powerSource\": \"Battery\""; QString notif = ""; double propertyValue = 0; QStringList priorityList {"", "min", "low", "default", "High", "urgent"}; quint8 priority = 2; - static qreal winddir = 0; + //static qreal winddir = 0; QString attachment = ""; - bool changed = false; + static QDateTime timer; debug(DEBUGMACRO, "looping list of query", DEBUG); @@ -199,21 +199,9 @@ void Pws2mqtt::parseData(QList> queryList) //notif += formatNotifString (propertyName[name].first, propertyName[name].second, QByteArray::number(qPow(propertyValue, 1.0))); //debug (DEBUGMACRO, "", DEBUG); timeTemp = timeTemp.currentDateTime().addSecs(300); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, propertyName[name].second, QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } - /*}else if (name == "indoortempf") - { - static QDateTime timeIndoorTemp = QDateTime::currentDateTime().addSecs(-600); - propertyValue = round(fahrenheitToCelsius(pair.second.toFloat())); - if (compare (propertyList[name], propertyValue, 1) and timeIndoorTemp < QDateTime::currentDateTime()) - { - //notif += formatNotifString (propertyName[name].first, propertyName[name].second , QByteArray::number(qPow(propertyValue, 1.0))); - debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - timeIndoorTemp = timeIndoorTemp.currentDateTime().addSecs(300); - propertyList[name] = propertyValue; - }*/ }else if (name == "humidity") { propertyValue = value.toFloat(); @@ -222,9 +210,8 @@ void Pws2mqtt::parseData(QList> queryList) if (compare (propertiesValue[name], propertyValue, 3)) { //notif += formatNotifString (propertyName[name].first, propertyName[name].second , value); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, propertyName[name].second, QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } }else if (name == "windchillf") { @@ -236,22 +223,23 @@ void Pws2mqtt::parseData(QList> queryList) //notif += formatNotifString (propertyName[name].first, propertyName[name].second , QByteArray::number(qPow(propertyValue, 1.0))); //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); timeWindchill = timeWindchill.currentDateTime().addSecs(300); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, propertyName[name].second, QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } }else if (name == "winddir") { - winddir = value.toFloat(); - rotateAndSaveImage(this->inputPath, this->outputPath, (qreal)winddir); + propertyValue = value.toFloat(); + rotateAndSaveImage(this->inputPath, this->outputPath, (qreal)propertyValue); debug (DEBUGMACRO, name + " : " + QByteArray::number(propertyValue), DEBUG); + propertyList[name] = formatNotifString(propertyName[name].first, propertyName[name].second, QByteArray::number(propertyValue)); + propertiesValue[name] = propertyValue; }else if (name == "windspeedmph" or name == "windgustmph") { QString msg = ""; static QDateTime timeWind = QDateTime::currentDateTime().addSecs(-600); quint8 windPriority = 1; - static QString msgNotif; + //static QString msgNotif; debug (DEBUGMACRO, name + " : " + QByteArray::number(propertyValue), DEBUG); propertyValue = round(mphTokmh(value.toFloat())); @@ -260,57 +248,31 @@ void Pws2mqtt::parseData(QList> queryList) if (propertyValue <= forceVent[i][0].toDouble()) { msg = forceVent[i][1].toString(); - windPriority = forceVent[i][1].toUInt(); + windPriority = forceVent[i][2].toUInt(); break; } } - if (propertyList["forcevent"].toString() != msg or propertyList["rafales"].toString() != msg) + if (propertyList["forcevent"] != msg or propertyList["rafales"] != msg) { if (name == "windspeedmph") { - propertyList["forcevent"] = msg; + //propertyList["forcevent"] = msg; msg.prepend("Vent - "); + propertyList[name] = formatNotifString (msg, propertyName[name].second , QByteArray::number(propertyValue)); }else { - propertyList["rafales"] = msg; - msg.prepend("Rafales - "); + propertyList[name] = formatNotifString (propertyName[name].first, propertyName[name].second , QByteArray::number(propertyValue)); } - msgNotif = formatNotifString (msg, propertyName[name].second , QByteArray::number(propertyValue)); setPriority(priority, windPriority); - propertyList["winddir"] = winddir; attachment = this->outputPath; - if (priority > 3) - { - notify(msgNotif, priorityList[priority], attachment); - }else if (timeWind < QDateTime::currentDateTime() or propertyValue > 20) - { - timeWind = timeWind.currentDateTime().addSecs(300); - changed = true; - } - - debug (DEBUGMACRO, "Notif = *" + notif + "*", DEBUG); } - notif += msgNotif; - - /*}else if (name == "windgustmph") - { - propertyValue = round(mphTokmh(pair.second.toFloat())); - if (compare (propertyList[name], propertyValue, 5) and propertyValue > 20) - { - notif += formatNotifString (propertyName[name].first, propertyName[name].second , QByteArray::number(propertyValue)); - if (propertyValue > 40) - priority = setPriority (priority, 4); - if (propertyValue > 60) - priority = setPriority (priority, 5); - propertyList[name] = propertyValue; - debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - }*/ }else if (name == "rainin") { static double ecart; - propertyValue = pair.second.toFloat(); + quint8 raininPriority = 1; + propertyValue = round(pair.second.toFloat()*100)/100; if (propertyValue == 0) { ecart = 0.0001; @@ -321,18 +283,16 @@ void Pws2mqtt::parseData(QList> queryList) debug (DEBUGMACRO, name + " : " + QByteArray::number(propertyValue), DEBUG); if (compare (propertiesValue[name], propertyValue, ecart)) { - //notif += formatNotifString (propertyName[name].first, propertyName[name].second , value); - QString pluviosite = getPluviosite(propertyValue); - priority = setPriority (priority, 4); + QString pluviosite = getPluviosite(propertyValue, raininPriority); + priority = setPriority (priority, raininPriority); //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - propertyList[name] = pluviosite + " : " + QString::number(round(propertyValue*100)/100); + propertyList[name] = formatNotifString(pluviosite + " : ", propertyName[name].second, QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } }else if (name == "dailyrainin") { static double ecart; - propertyValue = pair.second.toFloat(); + propertyValue = round(pair.second.toFloat()*100)/100; if (propertyValue == 0) { ecart = 0.0001; @@ -345,9 +305,8 @@ void Pws2mqtt::parseData(QList> queryList) { priority = setPriority (priority, 3); //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, propertyName[name].second, QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } }else if (name == "baromin") { @@ -359,27 +318,24 @@ void Pws2mqtt::parseData(QList> queryList) { //notif += formatNotifString (propertyName[name].first, propertyName[name].second , QByteArray::number(propertyValue)); //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, "", QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; - changed = true; } static QString prevision; - QString ret = pressureVariation(propertyValue, priority); + quint8 prevPriority = 0; + QString ret = pressureVariation(propertyValue, prevPriority); if (!ret.isEmpty()) { debug (DEBUGMACRO, "baromin ret not empty : " + ret, DEBUG); QString newPrevision = ret; - priority = setPriority(priority, priority); + priority = setPriority(priority, prevPriority); if (prevision != newPrevision) { prevision = newPrevision; - propertyList["prevision"] = prevision; - //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - //changed = true; + propertyList["prevision"] = "- " + prevision + " \n"; } } - notif += prevision + " \n"; }else if (name == "UV") { static QDateTime timeUV = QDateTime::currentDateTime().addSecs(-600); @@ -390,26 +346,15 @@ void Pws2mqtt::parseData(QList> queryList) { //notif += formatNotifString (propertyName[name].first, propertyName[name].second , value); if (propertyValue == 5 ) - priority = setPriority (priority, 3); - if (propertyValue >= 6 ) priority = setPriority (priority, 4); + if (propertyValue >= 6 ) + priority = setPriority (priority, 5); timeUV = timeUV.currentDateTime().addSecs(300); - propertyList[name] = propertyValue; + propertyList[name] = formatNotifString(propertyName[name].first, "", QByteArray::number(propertyValue)); propertiesValue[name] = propertyValue; debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); } - }/*else if (name == "lowbat") - { - static QDateTime timeLowBat = QDateTime::currentDateTime().addSecs(-4000); - if (pair.second.toInt() == 0 and timeLowBat < QDateTime::currentDateTime()) - { - //notif += formatNotifString (propertyName[name].first, propertyName[name].second ); - //debug (DEBUGMACRO, "Notif = #" + notif + "#", DEBUG); - priority = setPriority (priority, 4); - timeLowBat = timeLowBat.currentDateTime().addSecs(3600); - propertyList[name] = propertyValue; - } - }*/ + } } } if (!jsonString.isEmpty()) @@ -422,39 +367,16 @@ void Pws2mqtt::parseData(QList> queryList) debug(DEBUGMACRO, "No values to send", DEBUG); } - if (changed) + debug(DEBUGMACRO, "current datetime : " + QDateTime::currentDateTime().toString() + ", timer = " + timer.toString(), DEBUG); + + if (priority > 3 or QDateTime::currentDateTime() > timer.addSecs(900)) { - debug(DEBUGMACRO, "looping to fill notif", DEBUG); + timer = QDateTime::currentDateTime(); + debug(DEBUGMACRO, "looping to fill notif, priority = " + QString::number(priority), DEBUG); for (auto [name, value]: propertyList.asKeyValueRange()) { - QString unit; - QByteArray valueBA; - debug(DEBUGMACRO, "Name = " + name + ", value = " + QString::number(value.toUInt()), DEBUG); - if (! propertyName.contains(name)) - { - unit = ""; - debug(DEBUGMACRO, "unit is empty ", DEBUG); - }else - { - unit = propertyName[name].second; - debug(DEBUGMACRO, "unit : " + unit, DEBUG); - QString dataType = value.typeName(); - debug(DEBUGMACRO, "datatype is : " + dataType, DEBUG); - if (dataType == "double") - { - debug(DEBUGMACRO, "datatype is 'double'", DEBUG); - valueBA = QByteArray::number(round(value.toFloat()*100)/100); - }else if (dataType == "QString") - { - debug(DEBUGMACRO, "datatype is 'QString'" + value.toString(), DEBUG); - valueBA = value.toByteArray(); - }else - { - debug(DEBUGMACRO, "datatype is null" + QString::number(value.toUInt()), DEBUG); - valueBA = value.toByteArray(); - } - notif += formatNotifString(propertyName[name].first, unit, valueBA); - } + debug(DEBUGMACRO, "Name = " + name + ", value = " + value, DEBUG); + notif += propertyList[name]; } debug(DEBUGMACRO, "calling notify with notif = #" + notif + "#", DEBUG); notify (notif, priorityList[priority], attachment); @@ -462,7 +384,7 @@ void Pws2mqtt::parseData(QList> queryList) debug(DEBUGMACRO, "parseData: Returning", DEBUG); } -QString getPluviosite(double value) +QString getPluviosite(double value, quint8 &priority) { if (value < 1) { @@ -470,15 +392,18 @@ QString getPluviosite(double value) }else if (value < 5) { return "Pluie Modérée"; - }else if (value < 15) + }else if (value < 10) { + priority = 4; return "Pluie forte"; - }else if (value > 30) + }else if (value < 30) { - return "Évènement extrème"; - }else if (value > 15) + priority = 5; + return "Pluie Très forte, risque d'inondation"; + }else { - return "Forte pluie"; + priority = 5; + return "Pluie diluvienne, risque élevé d'inondations, crues"; } } diff --git a/pws2mqtt.h b/pws2mqtt.h index c36392d..0188d80 100644 --- a/pws2mqtt.h +++ b/pws2mqtt.h @@ -60,7 +60,7 @@ void notify (QString notif, QString priority = "low", QString inputPath = ""); quint8 setPriority (quint8 currentPriority, quint8 newPriority); QString previsionMeteo(double currentPressure, double variation3h, quint8 &priority); QString pressureVariation(double currentPressure, quint8 &priority); -QString getPluviosite(double value); +QString getPluviosite(double value, quint8 &priority); void rotateAndSaveImage(const QString &inputPath, const QString &outputPath, qreal angle=0); #endif // PWS2MQTT_H diff --git a/version.h b/version.h index c2d4ea3..065e7e6 100644 --- a/version.h +++ b/version.h @@ -3,6 +3,6 @@ #include -std::string version = "1.0.42"; +std::string version = "1.0.54"; #endif // VERSION_H