Просмотр исходного кода

V14.1 backport to rolling (#2058)

* Migrate parameters to v14.1 branch (#2023)

* Migrated parameters

* -

* .

* .

* .

* .

* .

* Remove unneeded checkboxes for true/false

* Remove ";"

* Correct MaintTopic

* Added missing parameters to UI: FlipImageSize, InitialMirror
Removed checkbox in UI for ErrorMessage
Added migration of pboolean parameters: enable them if they where disabled, set them to their default value, then enable them
Switch SetRetainFlag internally to a boolean

* .

* CamImages -> RawImages

* CamImages -> RawImages

* catch error on unknown parameter

* fix missing case insensitivity

* fix typo

* fixmissing rename

* fix migration of ExtendedResolution

* Delete ClassFlowMakeImage.cpp

* Delete ClassFlowMakeImage.h

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Update Changelog.md

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
CaCO3 2 лет назад
Родитель
Сommit
025f4af9f2
32 измененных файлов с 658 добавлено и 394 удалено
  1. 9 0
      Changelog.md
  2. 4 4
      code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp
  3. 5 5
      code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp
  4. 23 23
      code/components/jomjol_flowcontroll/ClassFlowControll.cpp
  5. 5 5
      code/components/jomjol_flowcontroll/ClassFlowControll.h
  6. 10 10
      code/components/jomjol_flowcontroll/ClassFlowImage.cpp
  7. 2 2
      code/components/jomjol_flowcontroll/ClassFlowImage.h
  8. 6 6
      code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp
  9. 2 2
      code/components/jomjol_flowcontroll/ClassFlowMQTT.h
  10. 6 6
      code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp
  11. 2 2
      code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h
  12. 24 24
      code/components/jomjol_flowcontroll/ClassFlowTakeImage.cpp
  13. 7 7
      code/components/jomjol_flowcontroll/ClassFlowTakeImage.h
  14. 6 5
      code/components/jomjol_mqtt/interface_mqtt.cpp
  15. 2 2
      code/components/jomjol_mqtt/interface_mqtt.h
  16. 3 3
      code/components/jomjol_mqtt/server_mqtt.cpp
  17. 2 2
      code/components/jomjol_mqtt/server_mqtt.h
  18. 7 7
      code/components/jomjol_tfliteclass/server_tflite.cpp
  19. 3 3
      code/components/jomjol_wlan/connect_wlan.cpp
  20. 2 2
      code/components/jomjol_wlan/connect_wlan.h
  21. 10 10
      code/components/jomjol_wlan/read_wlanini.cpp
  22. 2 2
      code/components/jomjol_wlan/read_wlanini.h
  23. 3 2
      code/include/defines.h
  24. 260 5
      code/main/main.cpp
  25. 3 3
      code/main/softAP.cpp
  26. 3 3
      code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp
  27. 1 1
      code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.h
  28. 16 18
      sd-card/config/config.ini
  29. 1 1
      sd-card/html/common.js
  30. 152 136
      sd-card/html/edit_config_param.html
  31. 56 56
      sd-card/html/edit_reference.html
  32. 21 37
      sd-card/html/readconfigparam.js

+ 9 - 0
Changelog.md

@@ -1,3 +1,4 @@
+
 ## [Unreleased]
 
 **Rolling**
@@ -24,6 +25,13 @@
 -   n.a.
 
 
+## [14.1.0] - 2023-02-21
+
+This release only migrates some parameters, see https://github.com/jomjol/AI-on-the-edge-device/pull/2023.
+
+It does not change any functionality of the device!
+
+If you want to revert from a future release to an older one, this is the first release using the new parameter naming. If you want to go to an older release than this `v14.1.0`, you have to update the `config.ini` manually to the old namings!
 
 ## [14.0.3] -2023-02-05
 
@@ -830,6 +838,7 @@ External Illumination
 -   Initial Version
 
 
+[14.1.0]: https://github.com/jomjol/AI-on-the-edge-device/compare/v14.0.3...v14.1.0
 [14.0.0]: https://github.com/jomjol/AI-on-the-edge-device/compare/v13.0.8...v14.0.2
 [13.0.8]: https://github.com/jomjol/AI-on-the-edge-device/compare/v12.0.1...v13.0.8
 [13.0.7]: https://github.com/jomjol/AI-on-the-edge-device/compare/v12.0.1...v13.0.7

+ 4 - 4
code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp

@@ -1,5 +1,5 @@
 #include "ClassFlowAlignment.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassFlow.h"
 #include "server_tflite.h"
 
@@ -46,9 +46,9 @@ ClassFlowAlignment::ClassFlowAlignment(std::vector<ClassFlow*>* lfc)
 
     for (int i = 0; i < ListFlowControll->size(); ++i)
     {
-        if (((*ListFlowControll)[i])->name().compare("ClassFlowMakeImage") == 0)
+        if (((*ListFlowControll)[i])->name().compare("ClassFlowTakeImage") == 0)
         {
-            ImageBasis = ((ClassFlowMakeImage*) (*ListFlowControll)[i])->rawImage;
+            ImageBasis = ((ClassFlowTakeImage*) (*ListFlowControll)[i])->rawImage;
         }
     }
 
@@ -74,7 +74,7 @@ bool ClassFlowAlignment::ReadParameter(FILE* pfile, string& aktparamgraph)
         if (!this->GetNextParagraph(pfile, aktparamgraph))
             return false;
 
-    if (aktparamgraph.compare("[Alignment]") != 0)       //Paragraph does not fit MakeImage
+    if (aktparamgraph.compare("[Alignment]") != 0)       //Paragraph does not fit Alignment
         return false;
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))

+ 5 - 5
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -34,7 +34,7 @@ ClassFlowCNNGeneral::ClassFlowCNNGeneral(ClassFlowAlignment *_flowalign, t_CNNTy
     CNNType = AutoDetect;
     CNNType = _cnntype;
     flowpostalignment = _flowalign;
-    logfileRetentionInDays = 5;
+    imagesRetention = 5;
 }
 
 
@@ -324,9 +324,9 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     {
         splitted = ZerlegeZeile(aktparamgraph);
-        if ((toUpper(splitted[0]) == "LOGIMAGELOCATION") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "ROIIMAGESLOCATION") && (splitted.size() > 1))
         {
-            this->LogImageLocation = "/sdcard" + splitted[1];
+            this->imagesLocation = "/sdcard" + splitted[1];
             this->isLogImage = true;
         }
         if ((toUpper(splitted[0]) == "LOGIMAGESELECT") && (splitted.size() > 1))
@@ -335,9 +335,9 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
             isLogImageSelect = true;            
         }
 
-        if ((toUpper(splitted[0]) == "LOGFILERETENTIONINDAYS") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "ROIIMAGESRETENTION") && (splitted.size() > 1))
         {
-            this->logfileRetentionInDays = std::stoi(splitted[1]);
+            this->imagesRetention = std::stoi(splitted[1]);
         }
 
         if ((toUpper(splitted[0]) == "MODEL") && (splitted.size() > 1))

+ 23 - 23
code/components/jomjol_flowcontroll/ClassFlowControll.cpp

@@ -38,8 +38,8 @@ std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _
 
     ESP_LOGD(TAG, "Step %s start", _stepname.c_str());
 
-    if ((_stepname.compare("[MakeImage]") == 0) || (_stepname.compare(";[MakeImage]") == 0)){
-        _classname = "ClassFlowMakeImage";
+    if ((_stepname.compare("[TakeImage]") == 0) || (_stepname.compare(";[TakeImage]") == 0)){
+        _classname = "ClassFlowTakeImage";
     }
     if ((_stepname.compare("[Alignment]") == 0) || (_stepname.compare(";[Alignment]") == 0)){
         _classname = "ClassFlowAlignment";
@@ -67,7 +67,7 @@ std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _
 
     for (int i = 0; i < FlowControll.size(); ++i)
         if (FlowControll[i]->name().compare(_classname) == 0){
-            if (!(FlowControll[i]->name().compare("ClassFlowMakeImage") == 0))      // if it is a MakeImage, the image does not need to be included, this happens automatically with the html query.
+            if (!(FlowControll[i]->name().compare("ClassFlowTakeImage") == 0))      // if it is a TakeImage, the image does not need to be included, this happens automatically with the html query.
                 FlowControll[i]->doFlow("");
             result = FlowControll[i]->getHTMLSingleStep(_host);
         }
@@ -80,7 +80,7 @@ std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _
 
 std::string ClassFlowControll::TranslateAktstatus(std::string _input)
 {
-    if (_input.compare("ClassFlowMakeImage") == 0)
+    if (_input.compare("ClassFlowTakeImage") == 0)
         return ("Take Image");
     if (_input.compare("ClassFlowAlignment") == 0)
         return ("Aligning");
@@ -176,7 +176,7 @@ bool ClassFlowControll::StartMQTTService() {
     /* Start the MQTT service */
         for (int i = 0; i < FlowControll.size(); ++i) {
             if (FlowControll[i]->name().compare("ClassFlowMQTT") == 0) {
-                return ((ClassFlowMQTT*) (FlowControll[i]))->Start(AutoIntervall);
+                return ((ClassFlowMQTT*) (FlowControll[i]))->Start(AutoInterval);
             }  
         } 
     return false;
@@ -188,7 +188,7 @@ void ClassFlowControll::SetInitialParameter(void)
 {
     AutoStart = false;
     SetupModeActive = false;
-    AutoIntervall = 10; // Minutes
+    AutoInterval = 10; // Minutes
     flowdigit = NULL;
     flowanalog = NULL;
     flowpostprocessing = NULL;
@@ -198,9 +198,9 @@ void ClassFlowControll::SetInitialParameter(void)
 }
 
 
-bool ClassFlowControll::isAutoStart(long &_intervall)
+bool ClassFlowControll::isAutoStart(long &_interval)
 {
-    _intervall = AutoIntervall * 60 * 1000; // AutoInterval: minutes -> ms
+    _interval = AutoInterval * 60 * 1000; // AutoInterval: minutes -> ms
     return AutoStart;
 }
 
@@ -211,10 +211,10 @@ ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type)
 
     _type = trim(_type);
 
-    if (toUpper(_type).compare("[MAKEIMAGE]") == 0)
+    if (toUpper(_type).compare("[TAKEIMAGE]") == 0)
     {
-        cfc = new ClassFlowMakeImage(&FlowControll);
-        flowmakeimage = (ClassFlowMakeImage*) cfc;
+        cfc = new ClassFlowTakeImage(&FlowControll);
+        flowtakeimage = (ClassFlowTakeImage*) cfc;
     }
     if (toUpper(_type).compare("[ALIGNMENT]") == 0)
     {
@@ -330,13 +330,13 @@ void ClassFlowControll::setActStatus(std::string _aktstatus)
 }
 
 
-void ClassFlowControll::doFlowMakeImageOnly(string time)
+void ClassFlowControll::doFlowTakeImageOnly(string time)
 {
     std::string zw_time;
 
     for (int i = 0; i < FlowControll.size(); ++i)
     {
-        if (FlowControll[i]->name() == "ClassFlowMakeImage") {
+        if (FlowControll[i]->name() == "ClassFlowTakeImage") {
             zw_time = getCurrentTimeString("%H:%M:%S");
             std::string flowStatus = TranslateAktstatus(FlowControll[i]->name());
             aktstatus = flowStatus + " (" + zw_time + ")";
@@ -535,7 +535,7 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
 
 
     if ((toUpper(aktparamgraph).compare("[AUTOTIMER]") != 0) && (toUpper(aktparamgraph).compare("[DEBUG]") != 0) &&
-        (toUpper(aktparamgraph).compare("[SYSTEM]") != 0 && (toUpper(aktparamgraph).compare("[DATALOGGING]") != 0)))      // Paragraph passt nicht zu MakeImage
+        (toUpper(aktparamgraph).compare("[SYSTEM]") != 0 && (toUpper(aktparamgraph).compare("[DATALOGGING]") != 0)))      // Paragraph passt nicht zu Debug oder DataLogging
         return false;
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
@@ -549,9 +549,9 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
             }
         }
 
-        if ((toUpper(splitted[0]) == "INTERVALL") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "INTERVAL") && (splitted.size() > 1))
         {
-            AutoIntervall = std::stof(splitted[1]);
+            AutoInterval = std::stof(splitted[1]);
         }
 
         if ((toUpper(splitted[0]) == "DATALOGACTIVE") && (splitted.size() > 1))
@@ -565,12 +565,12 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
             }
         }
 
-        if ((toUpper(splitted[0]) == "DATALOGRETENTIONINDAYS") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "DATAFILESRETENTION") && (splitted.size() > 1))
         {
             LogFile.SetDataLogRetention(std::stoi(splitted[1]));
         }
 
-        if ((toUpper(splitted[0]) == "LOGFILE") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "LOGLEVEL") && (splitted.size() > 1))
         {
             /* matches esp_log_level_t */
             if ((toUpper(splitted[1]) == "TRUE") || (toUpper(splitted[1]) == "2"))
@@ -590,20 +590,20 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph)
                 LogFile.setLogLevel(ESP_LOG_DEBUG);
             }
         }
-        if ((toUpper(splitted[0]) == "LOGFILERETENTIONINDAYS") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "LOGFILESRETENTION") && (splitted.size() > 1))
         {
             LogFile.SetLogFileRetention(std::stoi(splitted[1]));
         }
 
         /* TimeServer and TimeZone got already read from the config, see setupTime () */
 
-        if ((toUpper(splitted[0]) == "RSSITHREASHOLD") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "RSSITHRESHOLD") && (splitted.size() > 1))
         {
-            if (ChangeRSSIThreashold(WLAN_CONFIG_FILE, atoi(splitted[1].c_str())))
+            if (ChangeRSSIThreshold(WLAN_CONFIG_FILE, atoi(splitted[1].c_str())))
             {
                 // reboot necessary so that the new wlan.ini is also used !!!
                 fclose(pfile);
-                LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Rebooting to activate new RSSITHREASHOLD ...");
+                LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Rebooting to activate new RSSITHRESHOLD ...");
                 esp_restart();
                 hard_restart();                   
                 doReboot();
@@ -668,7 +668,7 @@ int ClassFlowControll::CleanTempFolder() {
 
 esp_err_t ClassFlowControll::SendRawJPG(httpd_req_t *req)
 {
-    return flowmakeimage != NULL ? flowmakeimage->SendRawJPG(req) : ESP_FAIL;
+    return flowtakeimage != NULL ? flowtakeimage->SendRawJPG(req) : ESP_FAIL;
 }
 
 

+ 5 - 5
code/components/jomjol_flowcontroll/ClassFlowControll.h

@@ -6,7 +6,7 @@
 #include <string>
 
 #include "ClassFlow.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassFlowAlignment.h"
 #include "ClassFlowCNNGeneral.h"
 #include "ClassFlowPostProcessing.h"
@@ -30,11 +30,11 @@ protected:
 	ClassFlowCNNGeneral* flowanalog;
 	ClassFlowCNNGeneral* flowdigit;
 //	ClassFlowDigit* flowdigit;
-	ClassFlowMakeImage* flowmakeimage;
+	ClassFlowTakeImage* flowtakeimage;
 	ClassFlow* CreateClassFlow(std::string _type);
 
 	bool AutoStart;
-	float AutoIntervall;
+	float AutoInterval;
 	bool SetupModeActive;
 	void SetInitialParameter(void);	
 	std::string aktstatus;
@@ -43,7 +43,7 @@ protected:
 public:
 	void InitFlow(std::string config);
 	bool doFlow(string time);
-	void doFlowMakeImageOnly(string time);
+	void doFlowTakeImageOnly(string time);
 	bool getStatusSetupModus(){return SetupModeActive;};
 	string getReadout(bool _rawvalue, bool _noerror);
 	string getReadoutAll(int _type);	
@@ -69,7 +69,7 @@ public:
 
 	std::string doSingleStep(std::string _stepname, std::string _host);
 
-	bool isAutoStart(long &_intervall);
+	bool isAutoStart(long &_interval);
 
 	std::string* getActStatus();
 	void setActStatus(std::string _aktstatus);

+ 10 - 10
code/components/jomjol_flowcontroll/ClassFlowImage.cpp

@@ -24,7 +24,7 @@ ClassFlowImage::ClassFlowImage(const char* logTag)
 	this->logTag = logTag;
 	isLogImage = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 
 ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, const char* logTag) : ClassFlow(lfc)
@@ -32,7 +32,7 @@ ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, const char* logTag
 	this->logTag = logTag;
 	isLogImage = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 
 ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, ClassFlow *_prev, const char* logTag) :  ClassFlow(lfc, _prev)
@@ -40,7 +40,7 @@ ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, ClassFlow *_prev,
 	this->logTag = logTag;
 	isLogImage = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 
 
@@ -48,7 +48,7 @@ string ClassFlowImage::CreateLogFolder(string time) {
 	if (!isLogImage)
 		return "";
 
-	string logPath = LogImageLocation + "/" + time.LOGFILE_TIME_FORMAT_DATE_EXTR + "/" + time.LOGFILE_TIME_FORMAT_HOUR_EXTR;
+	string logPath = imagesLocation + "/" + time.LOGFILE_TIME_FORMAT_DATE_EXTR + "/" + time.LOGFILE_TIME_FORMAT_HOUR_EXTR;
     isLogImage = mkdir_r(logPath.c_str(), S_IRWXU) == 0;
     if (!isLogImage) {
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Can't create log folder for analog images. Path " + logPath);
@@ -95,7 +95,7 @@ void ClassFlowImage::RemoveOldLogs()
 		return;
 	
 	ESP_LOGD(TAG, "remove old images");
-    if (logfileRetentionInDays == 0) {
+    if (imagesRetention == 0) {
         return;
     }
 
@@ -104,17 +104,17 @@ void ClassFlowImage::RemoveOldLogs()
     char cmpfilename[30];
 
     time(&rawtime);
-    rawtime = addDays(rawtime, -logfileRetentionInDays + 1);
+    rawtime = addDays(rawtime, -1 * imagesRetention + 1);
     timeinfo = localtime(&rawtime);
-    //ESP_LOGD(TAG, "ImagefileRetentionInDays: %d", logfileRetentionInDays);
+    //ESP_LOGD(TAG, "ImagefileRetentionInDays: %d", imagesRetention);
     
     strftime(cmpfilename, 30, LOGFILE_TIME_FORMAT, timeinfo);
     //ESP_LOGD(TAG, "file name to compare: %s", cmpfilename);
 	string folderName = string(cmpfilename).LOGFILE_TIME_FORMAT_DATE_EXTR;
 
-    DIR *dir = opendir(LogImageLocation.c_str());
+    DIR *dir = opendir(imagesLocation.c_str());
     if (!dir) {
-        ESP_LOGE(TAG, "Failed to stat dir: %s", LogImageLocation.c_str());
+        ESP_LOGE(TAG, "Failed to stat dir: %s", imagesLocation.c_str());
         return;
     }
 
@@ -122,7 +122,7 @@ void ClassFlowImage::RemoveOldLogs()
     int deleted = 0;
     int notDeleted = 0;
     while ((entry = readdir(dir)) != NULL) {
-        string folderPath = LogImageLocation + "/" + entry->d_name;
+        string folderPath = imagesLocation + "/" + entry->d_name;
 		if (entry->d_type == DT_DIR) {
 			//ESP_LOGD(TAG, "Compare %s to %s", entry->d_name, folderName.c_str());	
 			if ((strlen(entry->d_name) == folderName.length()) && (strcmp(entry->d_name, folderName.c_str()) < 0)) {

+ 2 - 2
code/components/jomjol_flowcontroll/ClassFlowImage.h

@@ -10,9 +10,9 @@ using namespace std;
 class ClassFlowImage : public ClassFlow
 {
 protected:
-	string LogImageLocation;
+	string imagesLocation;
     bool isLogImage;
-    unsigned short logfileRetentionInDays;
+    unsigned short imagesRetention;
 	const char* logTag;
 
 	string CreateLogFolder(string time);

+ 6 - 6
code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp

@@ -42,7 +42,7 @@ void ClassFlowMQTT::SetInitialParameter(void)
     flowpostprocessing = NULL;  
     user = "";
     password = ""; 
-    SetRetainFlag = 0;
+    SetRetainFlag = false;
     previousElement = NULL;
     ListFlowControll = NULL; 
     disabled = false;
@@ -95,7 +95,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
         if (!this->GetNextParagraph(pfile, aktparamgraph))
             return false;
 
-    if (toUpper(aktparamgraph).compare("[MQTT]") != 0)       // Paragraph does not fit MakeImage
+    if (toUpper(aktparamgraph).compare("[MQTT]") != 0)       // Paragraph does not fit MQTT
         return false;
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
@@ -113,10 +113,10 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
         {
             this->uri = splitted[1];
         }
-        if ((toUpper(splitted[0]) == "SETRETAINFLAG") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "RETAINMESSAGES") && (splitted.size() > 1))
         {
             if (toUpper(splitted[1]) == "TRUE") {
-                SetRetainFlag = 1;  
+                SetRetainFlag = true;  
                 setMqtt_Server_Retain(SetRetainFlag);
             }
         }
@@ -184,9 +184,9 @@ string ClassFlowMQTT::GetMQTTMainTopic()
 }
 
 
-bool ClassFlowMQTT::Start(float AutoIntervall) 
+bool ClassFlowMQTT::Start(float AutoInterval) 
 {
-    roundInterval = AutoIntervall; // Minutes
+    roundInterval = AutoInterval; // Minutes
     keepAlive = roundInterval * 60 * 2.5; // Seconds, make sure it is greater thatn 2 rounds!
 
     std::stringstream stream;

+ 2 - 2
code/components/jomjol_flowcontroll/ClassFlowMQTT.h

@@ -19,7 +19,7 @@ protected:
     std::string OldValue;
 	ClassFlowPostProcessing* flowpostprocessing;  
     std::string user, password; 
-    int SetRetainFlag;
+    bool SetRetainFlag;
     int keepAlive; // Seconds
     float roundInterval; // Minutes
 
@@ -32,7 +32,7 @@ public:
     ClassFlowMQTT(std::vector<ClassFlow*>* lfc, ClassFlow *_prev);
 
     string GetMQTTMainTopic();
-    bool Start(float AutoIntervall);
+    bool Start(float AutoInterval);
 
     bool ReadParameter(FILE* pfile, string& aktparamgraph);
     bool doFlow(string time);

+ 6 - 6
code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp

@@ -1,6 +1,6 @@
 #include "ClassFlowPostProcessing.h"
 #include "Helper.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassLogFile.h"
 
 #include <iomanip>
@@ -285,7 +285,7 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow*>* lfc, C
     ListFlowControll = NULL;
     FilePreValue = FormatFileName("/sdcard/config/prevalue.ini");
     ListFlowControll = lfc;
-    flowMakeImage = NULL;
+    flowTakeImage = NULL;
     UpdatePreValueINI = false;
     IgnoreLeadingNaN = false;
     flowAnalog = _analog;
@@ -293,9 +293,9 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow*>* lfc, C
 
     for (int i = 0; i < ListFlowControll->size(); ++i)
     {
-        if (((*ListFlowControll)[i])->name().compare("ClassFlowMakeImage") == 0)
+        if (((*ListFlowControll)[i])->name().compare("ClassFlowTakeImage") == 0)
         {
-            flowMakeImage = (ClassFlowMakeImage*) (*ListFlowControll)[i];
+            flowTakeImage = (ClassFlowTakeImage*) (*ListFlowControll)[i];
         }
     }
 }
@@ -503,7 +503,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE* pfile, string& aktparamgraph)
             return false;
 
 
-    if (aktparamgraph.compare("[PostProcessing]") != 0)       // Paragraph does not fit MakeImage
+    if (aktparamgraph.compare("[PostProcessing]") != 0)       // Paragraph does not fit PostProcessing
         return false;
 
     InitNUMBERS();
@@ -715,7 +715,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime)
 
     // Update decimal point, as the decimal places can also change when changing from CNNType Auto --> xyz:
 
-    imagetime = flowMakeImage->getTimeImageTaken();
+    imagetime = flowTakeImage->getTimeImageTaken();
     if (imagetime == 0)
         time(&imagetime);
 

+ 2 - 2
code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h

@@ -4,7 +4,7 @@
 #define CLASSFFLOWPOSTPROCESSING_H
 
 #include "ClassFlow.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassFlowCNNGeneral.h"
 #include "ClassFlowDefineTypes.h"
 
@@ -28,7 +28,7 @@ protected:
 
     string FilePreValue;
 
-    ClassFlowMakeImage *flowMakeImage;
+    ClassFlowTakeImage *flowTakeImage;
 
     bool LoadPreValue(void);
     string ShiftDecimal(string in, int _decShift);

+ 24 - 24
code/components/jomjol_flowcontroll/ClassFlowMakeImage.cpp → code/components/jomjol_flowcontroll/ClassFlowTakeImage.cpp

@@ -1,4 +1,4 @@
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "Helper.h"
 #include "ClassLogFile.h"
 
@@ -17,7 +17,7 @@
 
 static const char* TAG = "flow_make_image";
 
-esp_err_t ClassFlowMakeImage::camera_capture(){
+esp_err_t ClassFlowTakeImage::camera_capture(){
     string nm =  namerawimage;
     Camera.CaptureToFile(nm);
     time(&TimeImageTaken);
@@ -26,7 +26,7 @@ esp_err_t ClassFlowMakeImage::camera_capture(){
     return ESP_OK;
 }
 
-void ClassFlowMakeImage::takePictureWithFlash(int flash_duration)
+void ClassFlowTakeImage::takePictureWithFlash(int flash_duration)
 {
     // in case the image is flipped, it must be reset here //
     rawImage->width = image_width;          
@@ -40,7 +40,7 @@ void ClassFlowMakeImage::takePictureWithFlash(int flash_duration)
     if (SaveAllFiles) rawImage->SaveToFile(namerawimage);
 }
 
-void ClassFlowMakeImage::SetInitialParameter(void)
+void ClassFlowTakeImage::SetInitialParameter(void)
 {
     waitbeforepicture = 5;
     isImageSize = false;
@@ -56,15 +56,15 @@ void ClassFlowMakeImage::SetInitialParameter(void)
 }     
 
 
-ClassFlowMakeImage::ClassFlowMakeImage(std::vector<ClassFlow*>* lfc) : ClassFlowImage(lfc, TAG)
+ClassFlowTakeImage::ClassFlowTakeImage(std::vector<ClassFlow*>* lfc) : ClassFlowImage(lfc, TAG)
 {
-    LogImageLocation = "/log/source";
-    logfileRetentionInDays = 5;
+    imagesLocation = "/log/source";
+    imagesRetention = 5;
     SetInitialParameter();
 }
 
 
-bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
+bool ClassFlowTakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
 {
     std::vector<string> splitted;
 
@@ -77,21 +77,21 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
         if (!this->GetNextParagraph(pfile, aktparamgraph))
             return false;
 
-    if (aktparamgraph.compare("[MakeImage]") != 0)       // Paragraph does not fit MakeImage
+    if (aktparamgraph.compare("[TakeImage]") != 0)       // Paragraph does not fit TakeImage
         return false;
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     {
         splitted = ZerlegeZeile(aktparamgraph);
-        if ((splitted[0] ==  "LogImageLocation") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) ==  "RAWIMAGESLOCATION") && (splitted.size() > 1))
         {
-            LogImageLocation = "/sdcard" + splitted[1];
+            imagesLocation = "/sdcard" + splitted[1];
             isLogImage = true;
         }
-        if ((splitted[0] == "ImageQuality") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "IMAGEQUALITY") && (splitted.size() > 1))
             ImageQuality = std::stod(splitted[1]);
 
-        if ((splitted[0] == "ImageSize") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "IMAGESIZE") && (splitted.size() > 1))
         {
             ImageSize = Camera.TextToFramesize(splitted[1].c_str());
             isImageSize = true;
@@ -108,9 +108,9 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
             waitbeforepicture = stoi(splitted[1]);
         }
 
-        if ((toUpper(splitted[0]) == "LOGFILERETENTIONINDAYS") && (splitted.size() > 1))
+        if ((toUpper(splitted[0]) == "RAWIMAGESRETENTION") && (splitted.size() > 1))
         {
-            this->logfileRetentionInDays = std::stoi(splitted[1]);
+            this->imagesRetention = std::stoi(splitted[1]);
         }
 
         if ((toUpper(splitted[0]) == "BRIGHTNESS") && (splitted.size() > 1))
@@ -173,7 +173,7 @@ bool ClassFlowMakeImage::ReadParameter(FILE* pfile, string& aktparamgraph)
 }
 
 
-string ClassFlowMakeImage::getHTMLSingleStep(string host)
+string ClassFlowTakeImage::getHTMLSingleStep(string host)
 {
     string result;
     result = "Raw Image: <br>\n<img src=\"" + host + "/img_tmp/raw.jpg\">\n";
@@ -181,14 +181,14 @@ string ClassFlowMakeImage::getHTMLSingleStep(string host)
 }
 
 
-bool ClassFlowMakeImage::doFlow(string zwtime)
+bool ClassFlowTakeImage::doFlow(string zwtime)
 {
     string logPath = CreateLogFolder(zwtime);
 
     int flash_duration = (int) (waitbeforepicture * 1000);
  
     #ifdef DEBUG_DETAIL_ON  
-        LogFile.WriteHeapInfo("ClassFlowMakeImage::doFlow - Before takePictureWithFlash");
+        LogFile.WriteHeapInfo("ClassFlowTakeImage::doFlow - Before takePictureWithFlash");
     #endif
 
 
@@ -204,7 +204,7 @@ bool ClassFlowMakeImage::doFlow(string zwtime)
 
 
     #ifdef DEBUG_DETAIL_ON  
-        LogFile.WriteHeapInfo("ClassFlowMakeImage::doFlow - After takePictureWithFlash");
+        LogFile.WriteHeapInfo("ClassFlowTakeImage::doFlow - After takePictureWithFlash");
     #endif
 
     LogImage(logPath, "raw", NULL, NULL, zwtime, rawImage);
@@ -212,14 +212,14 @@ bool ClassFlowMakeImage::doFlow(string zwtime)
     RemoveOldLogs();
 
     #ifdef DEBUG_DETAIL_ON  
-        LogFile.WriteHeapInfo("ClassFlowMakeImage::doFlow - After RemoveOldLogs");
+        LogFile.WriteHeapInfo("ClassFlowTakeImage::doFlow - After RemoveOldLogs");
     #endif
 
     return true;
 }
 
 
-esp_err_t ClassFlowMakeImage::SendRawJPG(httpd_req_t *req)
+esp_err_t ClassFlowTakeImage::SendRawJPG(httpd_req_t *req)
 {
     int flash_duration = (int) (waitbeforepicture * 1000);
     time(&TimeImageTaken);
@@ -229,7 +229,7 @@ esp_err_t ClassFlowMakeImage::SendRawJPG(httpd_req_t *req)
 }
 
 
-ImageData* ClassFlowMakeImage::SendRawImage()
+ImageData* ClassFlowTakeImage::SendRawImage()
 {
     CImageBasis *zw = new CImageBasis(rawImage);
     ImageData *id;
@@ -243,12 +243,12 @@ ImageData* ClassFlowMakeImage::SendRawImage()
     return id;  
 }
 
-time_t ClassFlowMakeImage::getTimeImageTaken()
+time_t ClassFlowTakeImage::getTimeImageTaken()
 {
     return TimeImageTaken;
 }
 
-ClassFlowMakeImage::~ClassFlowMakeImage(void)
+ClassFlowTakeImage::~ClassFlowTakeImage(void)
 {
     delete rawImage;
 }

+ 7 - 7
code/components/jomjol_flowcontroll/ClassFlowMakeImage.h → code/components/jomjol_flowcontroll/ClassFlowTakeImage.h

@@ -1,7 +1,7 @@
 #pragma once
 
-#ifndef CLASSFFLOWMAKEIMAGE_H
-#define CLASSFFLOWMAKEIMAGE_H
+#ifndef CLASSFFLOWTAKEIMAGE_H
+#define CLASSFFLOWTAKEIMAGE_H
 
 #include "ClassFlowImage.h"
 #include "ClassControllCamera.h"
@@ -9,7 +9,7 @@
 
 #include <string>
 
-class ClassFlowMakeImage :
+class ClassFlowTakeImage :
     public ClassFlowImage
 {
 protected:
@@ -37,19 +37,19 @@ protected:
 public:
     CImageBasis *rawImage;
 
-    ClassFlowMakeImage(std::vector<ClassFlow*>* lfc);
+    ClassFlowTakeImage(std::vector<ClassFlow*>* lfc);
 
     bool ReadParameter(FILE* pfile, string& aktparamgraph);
     bool doFlow(string time);
     string getHTMLSingleStep(string host);
     time_t getTimeImageTaken();
-    string name(){return "ClassFlowMakeImage";};
+    string name(){return "ClassFlowTakeImage";};
 
     ImageData* SendRawImage();
     esp_err_t SendRawJPG(httpd_req_t *req);
 
-    ~ClassFlowMakeImage(void);
+    ~ClassFlowTakeImage(void);
 };
 
 
-#endif //CLASSFFLOWMAKEIMAGE_H
+#endif //CLASSFFLOWTAKEIMAGE_H

+ 6 - 5
code/components/jomjol_mqtt/interface_mqtt.cpp

@@ -25,11 +25,12 @@ bool mqtt_connected = false;
 
 esp_mqtt_client_handle_t client = NULL;
 std::string uri, client_id, lwt_topic, lwt_connected, lwt_disconnected, user, password, maintopic;
-int keepalive, SetRetainFlag;
-void (*callbackOnConnected)(std::string, int) = NULL;
+int keepalive;
+bool SetRetainFlag;
+void (*callbackOnConnected)(std::string, bool) = NULL;
 
 
-bool MQTTPublish(std::string _key, std::string _content, int retained_flag) 
+bool MQTTPublish(std::string _key, std::string _content, bool retained_flag) 
 {
     if (!mqtt_enabled) {                            // MQTT sevice not started / configured (MQTT_Init not called before)      
         return false;
@@ -153,7 +154,7 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_
 
 bool MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password,
         std::string _maintopic, std::string _lwt, std::string _lwt_connected, std::string _lwt_disconnected,
-                    int _keepalive, int _SetRetainFlag, void *_callbackOnConnected) {
+                    int _keepalive, bool _SetRetainFlag, void *_callbackOnConnected) {
     if ((_mqttURI.length() == 0) || (_maintopic.length() == 0) || (_clientid.length() == 0)) 
     {
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Init aborted! Config error (URI, MainTopic or ClientID missing)");
@@ -168,7 +169,7 @@ bool MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us
     keepalive = _keepalive;
     SetRetainFlag = _SetRetainFlag;
     maintopic = _maintopic;
-    callbackOnConnected = ( void (*)(std::string, int) )(_callbackOnConnected);
+    callbackOnConnected = ( void (*)(std::string, bool) )(_callbackOnConnected);
 
     if (_user.length() && _password.length()){
         user = _user;

+ 2 - 2
code/components/jomjol_mqtt/interface_mqtt.h

@@ -11,11 +11,11 @@
 
 bool MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password,
                     std::string _maintopic, std::string _lwt, std::string _lwt_connected, std::string _lwt_disconnected,
-                    int _keepalive, int SetRetainFlag, void *callbackOnConnected);
+                    int _keepalive, bool SetRetainFlag, void *callbackOnConnected);
 int MQTT_Init();
 void MQTTdestroy_client(bool _disable);
 
-bool MQTTPublish(std::string _key, std::string _content, int retained_flag = 1);            // retained Flag as Standart
+bool MQTTPublish(std::string _key, std::string _content, bool retained_flag = 1);            // retained Flag as Standart
 
 bool getMQTTisEnabled();
 bool getMQTTisConnected();

+ 3 - 3
code/components/jomjol_mqtt/server_mqtt.cpp

@@ -29,7 +29,7 @@ std::string timeUnit = "";
 std::string rateUnit = "Unit/Minute";
 float roundInterval; // Minutes
 int keepAlive = 0; // Seconds
-int retainFlag;
+bool retainFlag;
 static std::string maintopic;
 
 
@@ -221,7 +221,7 @@ esp_err_t sendDiscovery_and_static_Topics(httpd_req_t *req) {
     return ESP_OK;
 }
 
-void GotConnected(std::string maintopic, int retainFlag) {
+void GotConnected(std::string maintopic, bool retainFlag) {
     if (HomeassistantDiscovery) {
         MQTThomeassistantDiscovery();
     }
@@ -251,7 +251,7 @@ void SetHomeassistantDiscoveryEnabled(bool enabled) {
 }
 
 
-void setMqtt_Server_Retain(int _retainFlag) {
+void setMqtt_Server_Retain(bool _retainFlag) {
     retainFlag = _retainFlag;
 }
 

+ 2 - 2
code/components/jomjol_mqtt/server_mqtt.h

@@ -10,7 +10,7 @@
 void SetHomeassistantDiscoveryEnabled(bool enabled);
 void mqttServer_setParameter(std::vector<NumberPost*>* _NUMBERS, int interval, float roundInterval);
 void mqttServer_setMeterType(std::string meterType, std::string valueUnit, std::string timeUnit,std::string rateUnit);
-void setMqtt_Server_Retain(int SetRetainFlag);
+void setMqtt_Server_Retain(bool SetRetainFlag);
 void mqttServer_setMainTopic( std::string maintopic);
 std::string mqttServer_getMainTopic();
 
@@ -19,7 +19,7 @@ void register_server_mqtt_uri(httpd_handle_t server);
 void publishSystemData();
 
 std::string getTimeUnit(void);
-void GotConnected(std::string maintopic, int SetRetainFlag);
+void GotConnected(std::string maintopic, bool SetRetainFlag);
 
 
 #endif //SERVERMQTT_H

+ 7 - 7
code/components/jomjol_tfliteclass/server_tflite.cpp

@@ -30,7 +30,7 @@ TaskHandle_t xHandletask_autodoFlow = NULL;
 bool bTaskAutoFlowCreated = false;
 bool flowisrunning = false;
 
-long auto_intervall = 0;
+long auto_interval = 0;
 bool auto_isrunning = false;
 
 int countRounds = 0;
@@ -620,8 +620,8 @@ esp_err_t handler_editflow(httpd_req_t *req)
 //        string zwzw = "Do " + _task + " start\n"; ESP_LOGD(TAG, zwzw.c_str());
         Camera.SetBrightnessContrastSaturation(bri, con, sat);
         Camera.SetLEDIntensity(intens);
-        ESP_LOGD(TAG, "test_take - vor MakeImage");
-        std::string zw = tfliteflow.doSingleStep("[MakeImage]", _host);
+        ESP_LOGD(TAG, "test_take - vor TakeImage");
+        std::string zw = tfliteflow.doSingleStep("[TakeImage]", _host);
         httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
         httpd_resp_send(req, zw.c_str(), zw.length()); 
     } 
@@ -825,13 +825,13 @@ void task_autodoFlow(void *pvParameter)
     ESP_LOGD(TAG, "task_autodoFlow: start");
     doInit();
 
-    auto_isrunning = tfliteflow.isAutoStart(auto_intervall);
+    auto_isrunning = tfliteflow.isAutoStart(auto_interval);
 
     if (isSetupModusActive()) 
     {
         auto_isrunning = false;
         std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT);
-        tfliteflow.doFlowMakeImageOnly(zw_time);
+        tfliteflow.doFlowTakeImageOnly(zw_time);
     }
     
     while (auto_isrunning)
@@ -873,9 +873,9 @@ void task_autodoFlow(void *pvParameter)
                 " completed (" + std::to_string(getUpTime() - roundStartTime) + " seconds)");
 
         fr_delta_ms = (esp_timer_get_time() - fr_start) / 1000;
-        if (auto_intervall > fr_delta_ms)
+        if (auto_interval > fr_delta_ms)
         {
-            const TickType_t xDelay = (auto_intervall - fr_delta_ms)  / portTICK_PERIOD_MS;
+            const TickType_t xDelay = (auto_interval - fr_delta_ms)  / portTICK_PERIOD_MS;
             ESP_LOGD(TAG, "Autoflow: sleep for: %ldms", (long) xDelay);
             vTaskDelay( xDelay );        
         }

+ 3 - 3
code/components/jomjol_wlan/connect_wlan.cpp

@@ -63,7 +63,7 @@ std::string hostname = "";
 std::string std_hostname = "watermeter";
 std::string ipadress = "";
 std::string ssid = "";
-int RSSIThreashold;
+int RSSIThreshold;
 
 /////////////////////////////////
 /////////////////////////////////
@@ -403,9 +403,9 @@ void strinttoip4(const char *ip, int &a, int &b, int &c, int &d) {
 }
 
 
-void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname, const char *_ipadr, const char *_gw,  const char *_netmask, const char *_dns, int _rssithreashold)
+void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname, const char *_ipadr, const char *_gw,  const char *_netmask, const char *_dns, int _rssithreshold)
 {
-	RSSI_Threshold = _rssithreashold;
+	RSSI_Threshold = _rssithreshold;
     s_wifi_event_group = xEventGroupCreate();
 
     ESP_ERROR_CHECK(esp_netif_init());

+ 2 - 2
code/components/jomjol_wlan/connect_wlan.h

@@ -5,7 +5,7 @@
 
 #include <string>
 
-void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname, const char *_ipadr, const char *_gw,  const char *_netmask, const char *_dns, int _rssithreashold);
+void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname, const char *_ipadr, const char *_gw,  const char *_netmask, const char *_dns, int _rssithreshold);
 void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostname);
 void wifi_init_sta(const char *_ssid, const char *_password);
 
@@ -17,6 +17,6 @@ void WIFIDestroy();
 
 extern std::string hostname;
 extern std::string std_hostname;
-extern int RSSIThreashold;
+extern int RSSIThreshold;
 
 #endif //CONNECT_WLAN_H

+ 10 - 10
code/components/jomjol_wlan/read_wlanini.cpp

@@ -41,7 +41,7 @@ std::vector<string> ZerlegeZeileWLAN(std::string input, std::string _delimiter =
 
 
 
-bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_hostname, char *&_ipadr, char *&_gw,  char *&_netmask, char *&_dns, int &_rssithreashold)
+bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_hostname, char *&_ipadr, char *&_gw,  char *&_netmask, char *&_dns, int &_rssithreshold)
 {
     std::string ssid = "";
     std::string passphrase = "";
@@ -91,7 +91,7 @@ bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_ho
             }
         }
 
-        if ((splitted.size() > 1) && (toUpper(splitted[0]) == "RSSITHREASHOLD")){
+        if ((splitted.size() > 1) && (toUpper(splitted[0]) == "RSSITHRESHOLD")){
             string _s = trim(splitted[1]);
             if ((_s[0] == '"') && (_s[_s.length()-1] == '"')){
                 _s = _s.substr(1, ssid.length()-2);
@@ -194,8 +194,8 @@ bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_ho
     else
         _dns = NULL;
 
-    _rssithreashold = rssithreshold;
-    RSSIThreashold = rssithreshold;
+    _rssithreshold = rssithreshold;
+    RSSIThreshold = rssithreshold;
     return true;
 }
 
@@ -274,9 +274,9 @@ bool ChangeHostName(std::string fn, std::string _newhostname)
 }
 
 
-bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
+bool ChangeRSSIThreshold(std::string fn, int _newrssithreshold)
 {
-    if (RSSIThreashold == _newrssithreashold)
+    if (RSSIThreshold == _newrssithreshold)
         return false;
 
     string line = "";
@@ -305,8 +305,8 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
         splitted = ZerlegeZeileWLAN(line, "=");
         splitted[0] = trim(splitted[0], " ");
 
-        if ((splitted.size() > 1) && (toUpper(splitted[0]) == "RSSITHREASHOLD")){
-            line = "RSSIThreashold = " + to_string(_newrssithreashold) + "\n";
+        if ((splitted.size() > 1) && (toUpper(splitted[0]) == "RSSITHRESHOLD")){
+            line = "RSSIThreshold = " + to_string(_newrssithreshold) + "\n";
             found = true;
         }
 
@@ -324,7 +324,7 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
 
     if (!found)
     {
-        line = "RSSIThreashold = " + to_string(_newrssithreashold) + "\n";
+        line = "RSSIThreshold = " + to_string(_newrssithreshold) + "\n";
         neuesfile.push_back(line);        
     }
 
@@ -340,7 +340,7 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
 
     fclose(pFile);
 
-    ESP_LOGD(TAG, "*** RSSIThreashold update done ***");
+    ESP_LOGD(TAG, "*** RSSIThreshold update done ***");
 
     return true;
 }

+ 2 - 2
code/components/jomjol_wlan/read_wlanini.h

@@ -5,10 +5,10 @@
 
 #include <string>
 
-bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_hostname, char *&_ipadr, char *&_gw,  char *&_netmask, char *&_dns, int &_rssithreashold);
+bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_hostname, char *&_ipadr, char *&_gw,  char *&_netmask, char *&_dns, int &_rssithreshold);
 
 bool ChangeHostName(std::string fn, std::string _newhostname);
-bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold);
+bool ChangeRSSIThreshold(std::string fn, int _newrssithreshold);
 
 
 #endif //READ_WLANINI_H

+ 3 - 2
code/include/defines.h

@@ -58,7 +58,7 @@
     //#define CONFIG_IDF_TARGET_ARCH_XTENSA //not needed with platformio/espressif32 @ 5.2.0
 
 
-    //ClassControllCamera + ClassFlowMakeImage + connect_wlan + main
+    //ClassControllCamera + ClassFlowTakeImage + connect_wlan + main
     #define FLASH_GPIO GPIO_NUM_4
     #define BLINK_GPIO GPIO_NUM_33
 
@@ -71,12 +71,13 @@
     //server_GPIO
     #define __LEDGLOBAL
 
-    //ClassControllCamera + ClassFlowMakeImage
+    //ClassControllCamera + ClassFlowTakeImage
     #define CAMERA_MODEL_AI_THINKER
     #define BOARD_ESP32CAM_AITHINKER
 
     //server_GPIO + server_file + SoftAP
     #define CONFIG_FILE "/sdcard/config/config.ini"
+    #define CONFIG_FILE_BACKUP "/sdcard/config/config.bak"
 
     //ClassFlowControll + Main + SoftAP
     #define WLAN_CONFIG_FILE "/sdcard/wlan.ini"

+ 260 - 5
code/main/main.cpp

@@ -1,4 +1,8 @@
-//#include <string>
+#include <iostream>
+#include <string>
+#include <vector>
+#include <regex>
+
 //#include "freertos/FreeRTOS.h"
 //#include "freertos/task.h"
 //#include "freertos/event_groups.h"
@@ -29,6 +33,7 @@
 #include "server_file.h"
 #include "server_ota.h"
 #include "time_sntp.h"
+#include "configFile.h"
 //#include "ClassControllCamera.h"
 #include "server_main.h"
 #include "server_camera.h"
@@ -78,6 +83,14 @@ extern std::string getFwVersion(void);
 extern std::string getHTMLversion(void);
 extern std::string getHTMLcommit(void);
 
+
+std::vector<std::string> splitString(const std::string& str);
+bool replace(std::string& s, std::string const& toReplace, std::string const& replaceWith);
+bool replace(std::string& s, std::string const& toReplace, std::string const& replaceWith, bool logIt);
+//bool replace_all(std::string& s, std::string const& toReplace, std::string const& replaceWith);
+bool isInString(std::string& s, std::string const& toFind);
+void migrateConfiguration(void);
+
 static const char *TAG = "MAIN";
 
 bool Init_NVS_SDCard()
@@ -198,6 +211,8 @@ extern "C" void app_main(void)
         return; // No way to continue without SD-Card!
     }
 
+    migrateConfiguration();
+
     setupTime();
 
     string versionFormated = getFwVersion() + ", Date/Time: " + std::string(BUILD_TIME) + \
@@ -242,10 +257,10 @@ extern "C" void app_main(void)
     ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) );
 #endif
     
-    char *ssid = NULL, *passwd = NULL, *hostname = NULL, *ip = NULL, *gateway = NULL, *netmask = NULL, *dns = NULL; int rssithreashold = 0;
-    LoadWlanFromFile(WLAN_CONFIG_FILE, ssid, passwd, hostname, ip, gateway, netmask, dns, rssithreashold);
+    char *ssid = NULL, *passwd = NULL, *hostname = NULL, *ip = NULL, *gateway = NULL, *netmask = NULL, *dns = NULL; int rssithreshold = 0;
+    LoadWlanFromFile(WLAN_CONFIG_FILE, ssid, passwd, hostname, ip, gateway, netmask, dns, rssithreshold);
 
-    LogFile.WriteToFile(ESP_LOG_INFO, TAG, "WLAN-Settings - RSSI-Threashold: " + to_string(rssithreashold));
+    LogFile.WriteToFile(ESP_LOG_INFO, TAG, "WLAN-Settings - RSSI-Threshold: " + to_string(rssithreshold));
 
     if (ssid != NULL && passwd != NULL)
 #ifdef __HIDE_PASSWORD
@@ -268,7 +283,7 @@ extern "C" void app_main(void)
        ESP_LOGD(TAG, "DNS IP: %s", dns);
 
 
-    wifi_init_sta(ssid, passwd, hostname, ip, gateway, netmask, dns, rssithreashold);   
+    wifi_init_sta(ssid, passwd, hostname, ip, gateway, netmask, dns, rssithreshold);   
 
 
     xDelay = 2000 / portTICK_PERIOD_MS;
@@ -398,3 +413,243 @@ extern "C" void app_main(void)
     }
 }
 
+
+void migrateConfiguration(void) {
+    bool migrated = false;
+
+    if (!FileExists(CONFIG_FILE)) {
+        LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Config file seems to be missing!");
+        return;	
+    }
+
+    std::string section = "";
+	std::ifstream ifs(CONFIG_FILE);
+  	std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
+	
+    /* Split config file it array of lines */
+    std::vector<std::string> configLines = splitString(content);
+
+    /* Process each line */
+    for (int i = 0; i < configLines.size(); i++) {
+        //ESP_LOGI(TAG, "Line %d: %s", i, configLines[i].c_str());
+
+        if (configLines[i].find("[") != std::string::npos) { // Start of new section
+            section = configLines[i];
+            replace(section, ";", "", false); // Remove possible semicolon (just for the string comparison)
+            //ESP_LOGI(TAG, "New section: %s", section.c_str());
+        }
+
+        /* Migrate parameters as needed
+         * For the boolean parameters, we make them enabled all the time now:
+         *  1. If they where disabled, set them to their default value
+         *  2. Enable them
+         * Notes:
+         * The migration has some simplifications:
+         *  - Case Sensitiveness must be like in the initial config.ini
+         *  - No Whitespace after a semicollon
+         *  - Only one whitespace before/after the equal sign
+         */
+        if (section == "[MakeImage]") {
+            migrated = migrated | replace(configLines[i], "[MakeImage]", "[TakeImage]"); // Rename the section itself
+        }
+
+        if (section == "[MakeImage]" || section == "[TakeImage]") {
+            migrated = migrated | replace(configLines[i], "LogImageLocation", "RawImagesLocation");
+            migrated = migrated | replace(configLines[i], "LogfileRetentionInDays", "RawImagesRetention");
+
+            migrated = migrated | replace(configLines[i], ";Demo = true", ";Demo = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";Demo", "Demo"); // Enable it
+
+            migrated = migrated | replace(configLines[i], ";FixedExposure = true", ";FixedExposure = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";FixedExposure", "FixedExposure"); // Enable it
+        }
+
+        if (section == "[Alignment]") {
+            migrated = migrated | replace(configLines[i], ";InitialMirror = true", ";InitialMirror = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";InitialMirror", "InitialMirror"); // Enable it
+
+            migrated = migrated | replace(configLines[i], ";FlipImageSize = true", ";FlipImageSize = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";FlipImageSize", "FlipImageSize"); // Enable it
+        }
+
+        if (section == "[Digits]") {
+            migrated = migrated | replace(configLines[i], "LogImageLocation", "ROIImagesLocation");
+            migrated = migrated | replace(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention");
+        }
+
+        if (section == "[Analog]") {
+            migrated = migrated | replace(configLines[i], "LogImageLocation", "ROIImagesLocation");
+            migrated = migrated | replace(configLines[i], "LogfileRetentionInDays", "ROIImagesRetention");
+            migrated = migrated | replace(configLines[i], "ExtendedResolution", ";UNUSED_PARAMETER"); // This parameter is no longer used
+        }
+
+        if (section == "[PostProcessing]") {
+            migrated = migrated | replace(configLines[i], ";PreValueUse = true", ";PreValueUse = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";PreValueUse", "PreValueUse"); // Enable it
+
+            /* AllowNegativeRates has a <NUMBER> as prefix! */
+            if (isInString(configLines[i], "AllowNegativeRates") && isInString(configLines[i], ";")) { // It is the parameter "AllowNegativeRates" and it is commented out
+                migrated = migrated | replace(configLines[i], "true", "false"); // Set it to its default value
+                migrated = migrated | replace(configLines[i], ";", ""); // Enable it
+            }
+
+            /* IgnoreLeadingNaN has a <NUMBER> as prefix! */
+            if (isInString(configLines[i], "IgnoreLeadingNaN") && isInString(configLines[i], ";")) { // It is the parameter "IgnoreLeadingNaN" and it is commented out
+                migrated = migrated | replace(configLines[i], "true", "false"); // Set it to its default value
+                migrated = migrated | replace(configLines[i], ";", ""); // Enable it
+            }
+
+            /* ExtendedResolution has a <NUMBER> as prefix! */
+            if (isInString(configLines[i], "ExtendedResolution") && isInString(configLines[i], ";")) { // It is the parameter "ExtendedResolution" and it is commented out
+                migrated = migrated | replace(configLines[i], "true", "false"); // Set it to its default value
+                migrated = migrated | replace(configLines[i], ";", ""); // Enable it
+            }
+
+            migrated = migrated | replace(configLines[i], ";ErrorMessage = true", ";ErrorMessage = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";ErrorMessage", "ErrorMessage"); // Enable it
+
+            migrated = migrated | replace(configLines[i], ";CheckDigitIncreaseConsistency = true", ";CheckDigitIncreaseConsistency = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";CheckDigitIncreaseConsistency", "CheckDigitIncreaseConsistency"); // Enable it
+        }
+
+        if (section == "[MQTT]") {
+            migrated = migrated | replace(configLines[i], "SetRetainFlag", "RetainMessages"); // First rename it, enable it with its default value
+            migrated = migrated | replace(configLines[i], ";RetainMessages = true", ";RetainMessages = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";RetainMessages", "RetainMessages"); // Enable it
+
+            migrated = migrated | replace(configLines[i], ";HomeassistantDiscovery = true", ";HomeassistantDiscovery = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";HomeassistantDiscovery", "HomeassistantDiscovery"); // Enable it
+
+            if (configLines[i].rfind("Topic", 0) != std::string::npos)  // only if string starts with "Topic" (Was the naming in very old version)
+            {
+                migrated = migrated | replace(configLines[i], "Topic", "MainTopic");
+            }
+        }
+
+        if (section == "[InfluxDB]") {
+
+        }
+
+        if (section == "[GPIO]") {
+
+        }
+
+        if (section == "[DataLogging]") {
+            migrated = migrated | replace(configLines[i], "DataLogRetentionInDays", "DataFilesRetention");
+            /* DataLogActive is true by default! */
+            migrated = migrated | replace(configLines[i], ";DataLogActive = true", ";DataLogActive = true"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";DataLogActive", "DataLogActive"); // Enable it
+        }
+
+        if (section == "[AutoTimer]") {
+            migrated = migrated | replace(configLines[i], "Intervall", "Interval");
+            migrated = migrated | replace(configLines[i], ";AutoStart = true", ";AutoStart = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";AutoStart", "AutoStart"); // Enable it
+
+        }
+
+        if (section == "[Debug]") {
+            migrated = migrated | replace(configLines[i], "Logfile ", "LogLevel "); // Whitespace needed so it does not match `LogfileRetentionInDays`
+            /* LogLevel (resp. LogFile) was originally a boolean, but we switched it to an int
+             * For both cases (true/false), we set it to level 2 (WARNING) */
+            migrated = migrated | replace(configLines[i], "LogLevel = true", "LogLevel = 2");
+            migrated = migrated | replace(configLines[i], "LogLevel = false", "LogLevel = 2");
+            migrated = migrated | replace(configLines[i], "LogfileRetentionInDays", "LogfilesRetention");
+        }
+
+        if (section == "[System]") {
+            migrated = migrated | replace(configLines[i], "RSSIThreashold", "RSSIThreshold");
+            migrated = migrated | replace(configLines[i], "AutoAdjustSummertime", ";UNUSED_PARAMETER"); // This parameter is no longer used
+
+            migrated = migrated | replace(configLines[i], ";SetupMode = true", ";SetupMode = false"); // Set it to its default value
+            migrated = migrated | replace(configLines[i], ";SetupMode", "SetupMode"); // Enable it
+        }
+    }
+
+    if (migrated) { // At least one replacement happened
+        if (! RenameFile(CONFIG_FILE, CONFIG_FILE_BACKUP)) {
+            LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to create backup of Config file!");
+            return;
+        }
+
+        FILE* pfile = fopen(CONFIG_FILE, "w");        
+        for (int i = 0; i < configLines.size(); i++) {
+            fwrite(configLines[i].c_str() , configLines[i].length(), 1, pfile);
+            fwrite("\n" , 1, 1, pfile);
+        }
+        fclose(pfile);
+        LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Config file migrated. Saved backup to " + string(CONFIG_FILE_BACKUP));
+    }
+}
+
+
+std::vector<std::string> splitString(const std::string& str) {
+    std::vector<std::string> tokens;
+ 
+    std::stringstream ss(str);
+    std::string token;
+
+    while (std::getline(ss, token, '\n')) {
+        tokens.push_back(token);
+    }
+ 
+    return tokens;
+}
+
+
+/*bool replace_all(std::string& s, std::string const& toReplace, std::string const& replaceWith) {
+    std::string buf;
+    std::size_t pos = 0;
+    std::size_t prevPos;
+    bool found = false;
+
+    // Reserves rough estimate of final size of string.
+    buf.reserve(s.size());
+
+    while (true) {
+        prevPos = pos;
+        pos = s.find(toReplace, pos);
+        if (pos == std::string::npos) {
+            break;
+        }
+        found = true;
+        buf.append(s, prevPos, pos - prevPos);
+        buf += replaceWith;
+        pos += toReplace.size();
+    }
+
+    buf.append(s, prevPos, s.size() - prevPos);
+    s.swap(buf);
+
+    return found;
+}*/
+
+
+bool replace(std::string& s, std::string const& toReplace, std::string const& replaceWith) {
+    return replace(s, toReplace, replaceWith, true);
+}
+
+bool replace(std::string& s, std::string const& toReplace, std::string const& replaceWith, bool logIt) {
+    std::size_t pos = s.find(toReplace);
+
+    if (pos == std::string::npos) { // Not found
+        return false;
+    }
+
+    std::string old = s;
+    s.replace(pos, toReplace.length(), replaceWith);
+    if (logIt) {
+        LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Migrated Configfile line '" + old + "' to '" + s + "'");
+    }
+    return true;
+}
+
+
+bool isInString(std::string& s, std::string const& toFind) {
+    std::size_t pos = s.find(toFind);
+
+    if (pos == std::string::npos) { // Not found
+        return false;
+    }
+    return true;
+}

+ 3 - 3
code/main/softAP.cpp

@@ -140,14 +140,14 @@ void SendHTTPResponse(httpd_req_t *req)
 //        message += "<tr><td>gateway</td><td><input type=\"text\" name=\"gateway\" id=\"gateway\"></td><td>Leave emtpy if set by router</td></tr>";
 //        message += "<tr><td>netmask</td><td><input type=\"text\" name=\"netmask\" id=\"netmask\"></td><td>Leave emtpy if set by router</td>";
 //        message += "</tr><tr><td>DNS</td><td><input type=\"text\" name=\"dns\" id=\"dns\"></td><td>Leave emtpy if set by router</td></tr>";
-//        message += "<tr><td>RSSI Threashold</td><td><input type=\"number\" name=\"name\" id=\"threashold\" min=\"-100\"  max=\"0\" step=\"1\" value = \"0\"></td><td>WLAN Mesh Parameter: Threashold for RSSI value to check for start switching access point in a mesh system.Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup)</td></tr>";
+//        message += "<tr><td>RSSI Threshold</td><td><input type=\"number\" name=\"name\" id=\"threshold\" min=\"-100\"  max=\"0\" step=\"1\" value = \"0\"></td><td>WLAN Mesh Parameter: Threshold for RSSI value to check for start switching access point in a mesh system.Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup)</td></tr>";
 //        httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
 
 
         message = "<button class=\"button\" type=\"button\" onclick=\"wr()\">Write wlan.ini</button>";
         message += "<script language=\"JavaScript\">async function wr(){";
         message += "api = \"/config?\"+\"ssid=\"+document.getElementById(\"ssid\").value+\"&pwd=\"+document.getElementById(\"password\").value;";
-//        message += "api = \"/config?\"+\"ssid=\"+document.getElementById(\"ssid\").value+\"&pwd=\"+document.getElementById(\"password\").value+\"&hn=\"+document.getElementById(\"hostname\").value+\"&ip=\"+document.getElementById(\"ip\").value+\"&gw=\"+document.getElementById(\"gateway\").value+\"&nm=\"+document.getElementById(\"netmask\").value+\"&dns=\"+document.getElementById(\"dns\").value+\"&rssi=\"+document.getElementById(\"threashold\").value;";
+//        message += "api = \"/config?\"+\"ssid=\"+document.getElementById(\"ssid\").value+\"&pwd=\"+document.getElementById(\"password\").value+\"&hn=\"+document.getElementById(\"hostname\").value+\"&ip=\"+document.getElementById(\"ip\").value+\"&gw=\"+document.getElementById(\"gateway\").value+\"&nm=\"+document.getElementById(\"netmask\").value+\"&dns=\"+document.getElementById(\"dns\").value+\"&rssi=\"+document.getElementById(\"threshold\").value;";
         message += "fetch(api);await new Promise(resolve => setTimeout(resolve, 1000));location.reload();}</script>";
         httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
         return;
@@ -311,7 +311,7 @@ esp_err_t config_ini_handler(httpd_req_t *req)
     fputs(dns.c_str(), configfilehandle);
 
     if (rssi.length())
-        rssi = "RSSIThreashold = \"" + rssi + "\"\n";
+        rssi = "RSSIThreshold = \"" + rssi + "\"\n";
     else
         rssi = ";rssi = \"\"\n";
     fputs(rssi.c_str(), configfilehandle);

+ 3 - 3
code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp

@@ -9,11 +9,11 @@ UnderTestPost* setUpClassFlowPostprocessing(t_CNNType digType, t_CNNType anaType
     ClassFlowCNNGeneral* _analog;
     ClassFlowCNNGeneral* _digit;
     std::vector<ClassFlow*> FlowControll;
-    ClassFlowMakeImage* flowmakeimage;
+    ClassFlowTakeImage* flowtakeimage;
 
     // wird im doFlow verwendet
-    flowmakeimage = new ClassFlowMakeImage(&FlowControll);
-    FlowControll.push_back(flowmakeimage);
+    flowtakeimage = new ClassFlowTakeImage(&FlowControll);
+    FlowControll.push_back(flowtakeimage);
 
     // Die Modeltypen werden gesetzt, da keine Modelle verwendet werden.
     _analog = new ClassFlowCNNGeneral(nullptr, anaType);

+ 1 - 1
code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.h

@@ -4,7 +4,7 @@
 #include <unity.h>
 #include <ClassFlowPostProcessing.h>
 #include <ClassFlowCNNGeneral.h>
-#include <ClassFlowMakeImage.h>
+#include <ClassFlowTakeImage.h>
 #include <Helper.h>
 
 

+ 16 - 18
sd-card/config/config.ini

@@ -1,7 +1,7 @@
-[MakeImage]
-;LogImageLocation = /log/source
+[TakeImage]
+;RawImagesLocation = /log/source
 WaitBeforeTakingPicture = 5
-;LogfileRetentionInDays = 15
+;RawImagesRetention = 15
 Brightness = 0
 Contrast = 0
 Saturation = 0
@@ -24,8 +24,8 @@ FlipImageSize = false
 [Digits]
 Model = /config/dig-cont_0600_s3.tflite
 CNNGoodThreshold = 0.5
-;LogImageLocation = /log/digit
-;LogfileRetentionInDays = 3
+;ROIImagesLocation = /log/digit
+;ROIImagesRetention = 3
 main.dig1 294 126 30 54 false
 main.dig2 343 126 30 54 false
 main.dig3 391 126 30 54 false
@@ -33,9 +33,8 @@ main.dig3 391 126 30 54 false
 [Analog]
 Model = /config/ana-cont_11.3.1_s2.tflite
 CNNGoodThreshold = 0.5
-;LogImageLocation = /log/analog
-;LogfileRetentionInDays = 3
-ExtendedResolution = true
+;ROIImagesLocation = /log/analog
+;ROIImagesRetention = 3
 main.ana1 432 230 92 92 false
 main.ana2 379 332 92 92 false
 main.ana3 283 374 92 92 false
@@ -49,8 +48,8 @@ PreValueAgeStartup = 720
 main.AllowNegativeRates = false
 main.MaxRateValue = 0.05
 ;main.MaxRateType = AbsoluteChange
-;main.ExtendedResolution = false
-;main.IgnoreLeadingNaN = true
+main.ExtendedResolution = false
+main.IgnoreLeadingNaN = false
 ErrorMessage = true
 CheckDigitIncreaseConsistency = false
 
@@ -60,8 +59,8 @@ CheckDigitIncreaseConsistency = false
 ;ClientID = watermeter
 ;user = USERNAME
 ;password = PASSWORD
-;SetRetainFlag = true
-;HomeassistantDiscovery = true
+RetainMessages = false
+HomeassistantDiscovery = false
 ;MeterType = other
 
 ;[InfluxDB]
@@ -85,20 +84,19 @@ LEDColor = 150 150 150
 
 [AutoTimer]
 AutoStart = true
-Intervall = 5
+Interval = 5
 
 [DataLogging]
 DataLogActive = true
-DataLogRetentionInDays = 3
+DataFilesRetention = 3
 
 [Debug]
-Logfile = 1
-LogfileRetentionInDays = 3
+LogLevel = 1
+LogfilesRetention = 3
 
 [System]
 TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
 ;TimeServer = pool.ntp.org
-;AutoAdjustSummertime = false
 ;Hostname = undefined
-;RSSIThreashold = 0
+;RSSIThreshold = 0
 SetupMode = true

+ 1 - 1
sd-card/html/common.js

@@ -1,7 +1,7 @@
  
 /* The UI can also be run locally, but you have to set the IP of your devide accordingly.
  * And you also might have to disable CORS in your webbrowser! */
-var domainname_for_testing = "192.168.178.44";
+var domainname_for_testing = "192.168.178.62";
 
 
 

+ 152 - 136
sd-card/html/edit_config_param.html

@@ -102,23 +102,23 @@ textarea {
 		</tr> 
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="MakeImage_LogImageLocation_enabled" value="1"  onclick = 'InvertEnableItem("MakeImage", "LogImageLocation")' unchecked >
-				<label for=MakeImage_LogImageLocation_enabled><class id="MakeImage_LogImageLocation_text" style="color:black;">LogImageLocation</class></label>
+				<input type="checkbox" id="TakeImage_RawImagesLocation_enabled" value="1"  onclick = 'InvertEnableItem("TakeImage", "RawImagesLocation")' unchecked >
+				<label for=TakeImage_RawImagesLocation_enabled><class id="TakeImage_RawImagesLocation_text" style="color:black;">RawImagesLocation</class></label>
 			</td>
 			<td>
-				<input type="text" name="name" id="MakeImage_LogImageLocation_value1">
+				<input type="text" name="name" id="TakeImage_RawImagesLocation_value1">
 			</td>
 			<td class="description">
-				Location to store raw images for logging
+				Location to store raw camera images
 			</td>
 		</tr>
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="MakeImage_LogfileRetentionInDays_enabled" value="1"  onclick = 'InvertEnableItem("MakeImage", "LogfileRetentionInDays")' unchecked >
-				<label for=MakeImage_LogfileRetentionInDays_enabled><class id="MakeImage_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label>
+				<input type="checkbox" id="TakeImage_RawImagesRetention_enabled" value="1"  onclick = 'InvertEnableItem("TakeImage", "RawImagesRetention")' unchecked >
+				<label for=TakeImage_RawImagesRetention_enabled><class id="TakeImage_RawImagesRetention_text" style="color:black;">RawImagesRetention</class></label>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_LogfileRetentionInDays_value1" size="13" min="0" step="1">
+				<input type="number" id="TakeImage_RawImagesRetention_value1" size="13" min="0" step="1">
 			</td>
 			<td class="description">
 				Time to keep the raw image (in days, resp. "0" = forever)
@@ -126,11 +126,10 @@ textarea {
 		</tr>		
 		<tr class="expert" id="ex1">
 			<td class="indent1">
-				<input type="checkbox" id="MakeImage_Demo_enabled" value="1"  onclick = 'InvertEnableItem("MakeImage", "Demo")' unchecked >
-				<label for=MakeImage_Demo_enabled><class id="MakeImage_Demo_text" style="color:black;">Demo Mode</class></label>
+				<label for=TakeImage_Demo_enabled><class id="TakeImage_Demo_text" style="color:black;">Demo Mode</class></label>
 			</td>
 			<td>
-				<select id="MakeImage_Demo_value1">
+				<select id="TakeImage_Demo_value1">
 					<option value="true">true</option>
 					<option value="false" selected>false</option>
 				</select>
@@ -144,10 +143,10 @@ textarea {
 		<tr class="expert" id="ex1">
 			
 			<td class="indent1">
-				<class id="MakeImage_WaitBeforeTakingPicture_text" style="color:black;">WaitBeforeTakingPicture</class>
+				<class id="TakeImage_WaitBeforeTakingPicture_text" style="color:black;">WaitBeforeTakingPicture</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_WaitBeforeTakingPicture_value1" size="13" min="0" step="any">
+				<input type="number" id="TakeImage_WaitBeforeTakingPicture_value1" size="13" min="0" step="any">
 			</td>
 			<td class="description">
 				Wait time between switching illumination on and taking the picture (in seconds)
@@ -155,10 +154,10 @@ textarea {
 		</tr>
 		<tr class="expert" id="ex2">
 			<td class="indent1">
-				<class id="MakeImage_ImageQuality_text" style="color:black;">ImageQuality</class>
+				<class id="TakeImage_ImageQuality_text" style="color:black;">ImageQuality</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_ImageQuality_value1" size="13" min="8" max="63">
+				<input type="number" id="TakeImage_ImageQuality_value1" size="13" min="0" max="63">
 			</td>
 			<td class="description">
 				Image quality index (default = 12) <br>
@@ -168,10 +167,10 @@ textarea {
 		</tr>
 		<tr class="expert"  id="ex3">
 			<td class="indent1">
-				<class id="MakeImage_ImageSize_text" style="color:black;">ImageSize</class>
+				<class id="TakeImage_ImageSize_text" style="color:black;">ImageSize</class>
 			</td>
 			<td>
-				<select id="MakeImage_ImageSize_value1">
+				<select id="TakeImage_ImageSize_value1">
 					<option value="VGA" selected>VGA</option>
 					<option value="QVGA" >QVGA</option>
 				</select>
@@ -183,10 +182,10 @@ textarea {
 
 		<tr class="expert"  id="LEDIntensity_ex3">
 			<td class="indent1">
-				<class id="MakeImage_LEDIntensity_text" style="color:black;">LEDIntensity</class>
+				<class id="TakeImage_LEDIntensity_text" style="color:black;">LEDIntensity</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_LEDIntensity_value1" size="13" min="0" max="100">
+				<input type="number" id="TakeImage_LEDIntensity_value1" size="13" min="0" max="100">
 			</td>
 			<td style="font-size: 80%;">
 				Internal LED Flash Intensity (PWM from 0% - 100%). <br>
@@ -196,10 +195,10 @@ textarea {
 
 		<tr class="expert"  id="Brightness_ex3">
 			<td class="indent1">
-				<class id="MakeImage_Brightness_text" style="color:black;">Brightness</class>
+				<class id="TakeImage_Brightness_text" style="color:black;">Brightness</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_Brightness_value1" size="13" min="-2" max="2">
+				<input type="number" id="TakeImage_Brightness_value1" size="13" min="-2" max="2">
 			</td>
 			<td style="font-size: 80%;">
 				Image brightness (default = 0) <br>
@@ -209,10 +208,10 @@ textarea {
 
 		<tr class="expert"  id="Contrast_ex3">
 			<td class="indent1">
-				<class id="MakeImage_Contrast_text" style="color:black;">Contrast</class>
+				<class id="TakeImage_Contrast_text" style="color:black;">Contrast</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_Contrast_value1" size="13" min="-2" max="2">
+				<input type="number" id="TakeImage_Contrast_value1" size="13" min="-2" max="2">
 			</td>
 			<td style="font-size: 80%;">
 				Image contrast (default = 0) <br>
@@ -222,10 +221,10 @@ textarea {
 
 		<tr class="expert"  id="Saturation_ex3">
 			<td class="indent1">
-				<class id="MakeImage_Saturation_text" style="color:black;">Saturation</class>
+				<class id="TakeImage_Saturation_text" style="color:black;">Saturation</class>
 			</td>
 			<td>
-				<input type="number" id="MakeImage_Saturation_value1" size="13" min="-2" max="2">
+				<input type="number" id="TakeImage_Saturation_value1" size="13" min="-2" max="2">
 			</td>
 			<td style="font-size: 80%;">
 				Image saturation (default = 0) <br>
@@ -233,12 +232,12 @@ textarea {
 			</td>
 		</tr>
 		
-		<tr class="expert"  id="MakeImage_FixedExposure_ex10">
+		<tr class="expert"  id="TakeImage_FixedExposure_ex10">
 			<td class="indent1">
-				<class id="MakeImage_FixedExposure_text" style="color:black;">FixedExposure</class>
+				<class id="TakeImage_FixedExposure_text" style="color:black;">FixedExposure</class>
 			</td>
 			<td>
-				<select id="MakeImage_FixedExposure_value1">
+				<select id="TakeImage_FixedExposure_value1">
 					<option value="true" selected>true</option>
 					<option value="false" >false</option>
 				</select>
@@ -292,6 +291,37 @@ textarea {
 			</td>
 		</tr>
 
+		<tr class="expert"  id="ex13">
+			<td class="indent1">
+			    <class id="Alignment_FlipImageSize_text" style="color:black;">FlipImageSize</class>
+			</td>
+			<td>
+				<select id="Alignment_FlipImageSize_value1">
+					<option value="true">true</option>
+					<option value="false" selected>false</option>
+				</select>
+			</td>
+			<td style="font-size: 80%;">
+				Rotate the viewport together with the alignment rotation.
+			</td>
+		</tr>
+
+		<tr class="expert"  id="ex13">
+			<td class="indent1">
+			    <class id="Alignment_InitialMirror_text" style="color:black;">InitialMirror</class>
+			</td>
+			<td>
+				<select id="Alignment_InitialMirror_value1">
+					<option value="true">true</option>
+					<option value="false" selected>false</option>
+				</select>
+			</td>
+			<td style="font-size: 80%;">
+				Rotate the viewport together with the alignment rotation.
+			</td>
+		</tr>
+
+
 
 		<tr id="Category_Digits_ex4">
 			<td colspan="3" style="padding-left: 20px;">
@@ -328,11 +358,11 @@ textarea {
 
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="Digits_LogImageLocation_enabled" value="1"  onclick = 'InvertEnableItem("Digits", "LogImageLocation")' unchecked >
-				<label for=Digits_LogImageLocation_enabled><class id="Digits_LogImageLocation_text" style="color:black;">LogImageLocation</class></label>
+				<input type="checkbox" id="Digits_ROIImagesLocation_enabled" value="1"  onclick = 'InvertEnableItem("Digits", "ROIImagesLocation")' unchecked >
+				<label for=Digits_ROIImagesLocation_enabled><class id="Digits_ROIImagesLocation_text" style="color:black;">ROIImagesLocation</class></label>
 			</td>
 			<td>
-				<input type="text" name="name" id="Digits_LogImageLocation_value1">
+				<input type="text" name="name" id="Digits_ROIImagesLocation_value1">
 			</td>
 			<td style="font-size: 80%;">
 				Location to store separated digits for logging
@@ -340,11 +370,11 @@ textarea {
 		</tr>
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="Digits_LogfileRetentionInDays_enabled" value="1"  onclick = 'InvertEnableItem("Digits", "LogfileRetentionInDays")' unchecked >
-				<label for=Digits_LogfileRetentionInDays_enabled><class id="Digits_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label>
+				<input type="checkbox" id="Digits_ROIImagesRetention_enabled" value="1"  onclick = 'InvertEnableItem("Digits", "ROIImagesRetention")' unchecked >
+				<label for=Digits_ROIImagesRetention_enabled><class id="Digits_ROIImagesRetention_text" style="color:black;">ROIImagesRetention</class></label>
 			</td>
 			<td>
-				<input type="number" id="Digits_LogfileRetentionInDays_value1" min="0"  step="1">
+				<input type="number" id="Digits_ROIImagesRetention_value1" min="0"  step="1">
 			</td>
 			<td style="font-size: 80%;">
 				Time to keep the separated digit images (in days, resp. "0" = forever)
@@ -370,18 +400,18 @@ textarea {
 		</tr>
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="Analog_LogImageLocation_enabled" value="1"  onclick = 'InvertEnableItem("Analog", "LogImageLocation")' unchecked >
-				<label for=Analog_LogImageLocation_enabled><class id="Analog_LogImageLocation_text" style="color:black;">LogImageLocation</class>
+				<input type="checkbox" id="Analog_ROIImagesLocation_enabled" value="1"  onclick = 'InvertEnableItem("Analog", "ROIImagesLocation")' unchecked >
+				<label for=Analog_ROIImagesLocation_enabled><class id="Analog_ROIImagesLocation_text" style="color:black;">ROIImagesLocation</class>
 				</label>
 			</td>
-			<td> <input type="text" name="name" id="Analog_LogImageLocation_value1"> </td>
+			<td> <input type="text" name="name" id="Analog_ROIImagesLocation_value1"> </td>
 			<td style="font-size: 80%;"> Location to store separated digits for logging </td>
 		</tr>
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="Analog_LogfileRetentionInDays_enabled" value="1"  onclick = 'InvertEnableItem("Analog", "LogfileRetentionInDays")' unchecked >
-				<label for=Analog_LogfileRetentionInDays_enabled><class id="Analog_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label></td>
-			<td> <input type="number" id="Analog_LogfileRetentionInDays_value1" min="0" step="1"> </td>
+				<input type="checkbox" id="Analog_ROIImagesRetention_enabled" value="1"  onclick = 'InvertEnableItem("Analog", "ROIImagesRetention")' unchecked >
+				<label for=Analog_ROIImagesRetention_enabled><class id="Analog_ROIImagesRetention_text" style="color:black;">ROIImagesRetention</class></label></td>
+			<td> <input type="number" id="Analog_ROIImagesRetention_value1" min="0" step="1"> </td>
 			<td style="font-size: 80%;"> Time to keep the separated digit images (in days, resp. "0" = forever) </td>
 		</tr>
 
@@ -390,7 +420,6 @@ textarea {
 		</tr> 		
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="PostProcessing_PreValueUse_enabled" value="1"  onclick = 'InvertEnableItem("PostProcessing", "PreValueUse")' unchecked >
 				<label for=PostProcessing_PreValueUse_enabled><class id="PostProcessing_PreValueUse_text" style="color:black;">PreValueUse</class></label>
 			</td>
 			<td>
@@ -417,7 +446,6 @@ textarea {
 		</tr>
 		<tr class="expert"  id="ex12">
 			<td class="indent1">
-				<input type="checkbox" id="PostProcessing_ErrorMessage_enabled" value="1"  onclick = 'InvertEnableItem("PostProcessing", "ErrorMessage")' unchecked >
 				<label for=PostProcessing_ErrorMessage_enabled><class id="PostProcessing_ErrorMessage_text" style="color:black;">ErrorMessage</class></label>
 			</td>
 			<td>
@@ -432,7 +460,6 @@ textarea {
 		</tr>
 		<tr class="expert" id="ex1dddd">
 			<td class="indent1">
-				<input type="checkbox" id="PostProcessing_CheckDigitIncreaseConsistency_enabled" value="1"  onclick = 'InvertEnableItem("PostProcessing", "CheckDigitIncreaseConsistency")' unchecked >
 				<label for=PostProcessing_CheckDigitIncreaseConsistency_enabled><class id="PostProcessing_CheckDigitIncreaseConsistency_text" style="color:black;">CheckDigitIncreaseConsistency</class></label>
 			</td>
 			<td>
@@ -528,8 +555,7 @@ textarea {
 		</tr>
 		<tr>
 			<td class="indent1" style="padding-left: 75px;">
-				<input type="checkbox" id="PostProcessing_ExtendedResolution_enabled" value="1"  onclick = 'InvertEnableItem("PostProcessing", "ExtendedResolution")' unchecked >
-			<label for=PostProcessing_ExtendedResolution_enabled><class id="PostProcessing_ExtendedResolution_text" style="color:black;">ExtendedResolution</class></label>
+				<label for=PostProcessing_ExtendedResolution_enabled><class id="PostProcessing_ExtendedResolution_text" style="color:black;">ExtendedResolution</class></label>
 			</td>
 			<td>
 				<select id="PostProcessing_ExtendedResolution_value1">
@@ -541,11 +567,9 @@ textarea {
 				Enable to use the decimal place of the last analog counter
 			</td>
 		</tr>
-		
 		<tr>
 			<td id="ex121" class="indent1" style="padding-left: 75px;">
-				<input type="checkbox" id="PostProcessing_IgnoreLeadingNaN_enabled" value="1"  onclick = 'InvertEnableItem("PostProcessing", "IgnoreLeadingNaN")' unchecked >
-			<label for=PostProcessing_IgnoreLeadingNaN_enabled><class id="PostProcessing_IgnoreLeadingNaN_text" style="color:black;">IgnoreLeadingNaN</class></label>
+				<label for=PostProcessing_IgnoreLeadingNaN_enabled><class id="PostProcessing_IgnoreLeadingNaN_text" style="color:black;">IgnoreLeadingNaN</class></label>
 			</td>
 			<td>
 				<select id="PostProcessing_IgnoreLeadingNaN_value1">
@@ -636,11 +660,10 @@ textarea {
 		</tr>
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="MQTT_SetRetainFlag_enabled" value="1"  onclick = 'InvertEnableItem("MQTT", "SetRetainFlag")' unchecked >
-				<label for=MQTT_SetRetainFlag_enabled><class id="MQTT_SetRetainFlag_text" style="color:black;">Enable MQTT Retain Flag</class></label>
+				<label for=MQTT_RetainMessages_enabled><class id="MQTT_RetainMessages_text" style="color:black;">Enable MQTT Retain Flag</class></label>
 			</td>
 			<td>
-				<select id="MQTT_SetRetainFlag_value1">
+				<select id="MQTT_RetainMessages_value1">
 					<option value="true" selected>true</option>
 					<option value="false" >false</option>
 				</select>
@@ -658,7 +681,6 @@ textarea {
 		</tr> 
 		<tr>
 			<td class="indent1">
-				<input type="checkbox" id="MQTT_HomeassistantDiscovery_enabled" value="1"  onclick = 'InvertEnableItem("MQTT", "HomeassistantDiscovery")' unchecked >
 				<label for=MQTT_HomeassistantDiscovery_enabled><class id="MQTT_HomeassistantDiscovery_text" style="color:black;">Homeassistant Discovery</class></label>
 			</td>
 			<td>
@@ -703,7 +725,7 @@ textarea {
 			<td colspan="3" style="padding-left: 20px;">
 			    <h4>
 				<input type="checkbox" id="Category_InfluxDB_enabled" value="1"  onclick = 'UpdateAfterCategoryCheck()' unchecked >
-				<label for=Category_InfluxDB_enabled>InfluxDB</h4><h5>Only InfluxDB v1.x is configured here - v2.x see below [InfluxDBv2]</h5></label>				
+				<label for=Category_InfluxDB_enabled>InfluxDB</h4><h5>Only InfluxDB v1.x is supported as of now</h5></label>
 			</td>
 		</tr> 		
 		<tr>
@@ -767,8 +789,6 @@ textarea {
 			</td>
 		</tr>
 
-
-
 		<tr>
 			<td colspan="3" style="padding-left: 20px;">
 			    <h4>
@@ -860,16 +880,6 @@ textarea {
 			</td>
 		</tr>
 
-
-
-
-
-
-
-
-
-
-
 		<tr>
 			<td colspan="3" style="padding-left: 20px;">
 				<h4><input type="checkbox" id="Category_GPIO_enabled" value="1"  onclick='UpdateAfterCategoryCheck()' unchecked > 
@@ -1392,10 +1402,10 @@ textarea {
 		</tr>
 		<tr>
 			<td class="indent1">
-			    <class id="AutoTimer_Intervall_text" style="color:black;">Interval</class>
+			    <class id="AutoTimer_Interval_text" style="color:black;">Interval</class>
 			</td>
 			<td>
-				<input type="number" id="AutoTimer_Intervall_value1" size="13" min="3" step="any">
+				<input type="number" id="AutoTimer_Interval_value1" size="13" min="3" step="any">
 			</td>
 			<td style="font-size: 80%;">
 				Interval in which the number(s) are read (in minutes). If a digitalization round takes longer than this interval, the next run gets postponed until the current run completes.
@@ -1422,10 +1432,10 @@ textarea {
 
 		<tr>
 			<td class="indent1">
-				<class id="DataLogging_DataLogRetentionInDays_text" style="color:black;">DataLogRetentionInDays</class>
+				<class id="DataLogging_DataFilesRetention_text" style="color:black;">DataFilesRetention</class>
 			</td>
 			<td>
-				<input type="number" id="DataLogging_DataLogRetentionInDays_value1" size="13" min="0" step="1">
+				<input type="number" id="DataLogging_DataFilesRetention_value1" size="13" min="0" step="1">
 			</td>
 			<td class="description">
 				Time to keep the data files (in days - "0" = forever)
@@ -1437,10 +1447,10 @@ textarea {
 		</tr> 		
 		<tr>
 			<td class="indent1">
-				<class id="Debug_Logfile_text" style="color:black;">Logfile Log Level</class>
+				<class id="Debug_LogLevel_text" style="color:black;">Logfile Log Level</class>
 			</td>
 			<td>
-				<select id="Debug_Logfile_value1">
+				<select id="Debug_LogLevel_value1">
 					<option value="1" selected>ERROR</option> <!-- matches esp_log_level_t -->
 					<option value="2">WARNING</option>
 					<option value="3">INFO</option>
@@ -1453,10 +1463,10 @@ textarea {
 		</tr> 		
 		<tr>
 			<td class="indent1">
-				<class id="Debug_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class>
+				<class id="Debug_LogfilesRetention_text" style="color:black;">LogfilesRetention</class>
 			</td>
 			<td>
-				<input type="number" id="Debug_LogfileRetentionInDays_value1" size="13" min="0" step="1">
+				<input type="number" id="Debug_LogfilesRetention_value1" size="13" min="0" step="1">
 			</td>
 			<td class="description">
 				Time to keep the log files (in days - "0" = forever)
@@ -1506,15 +1516,15 @@ textarea {
 				Hostname for server - will be transfered to wlan.ini at next startup)
 			</td>
 		</tr>
-		<tr class="expert"  id="System_RSSIThreashold">
+		<tr class="expert"  id="System_RSSIThreshold">
 			<td class="indent1">
-				<input type="checkbox" id="System_RSSIThreashold_enabled" value="1"  onclick = 'InvertEnableItem("System", "RSSIThreashold")' unchecked >
-				<label for=System_RSSIThreashold_enabled><class id="System_RSSIThreashold_text" style="color:black;">RSSIThreashold</class></label>
+				<input type="checkbox" id="System_RSSIThreshold_enabled" value="1"  onclick = 'InvertEnableItem("System", "RSSIThreshold")' unchecked >
+				<label for=System_RSSIThreshold_enabled><class id="System_RSSIThreshold_text" style="color:black;">RSSIThreshold</class></label>
 			</td>
 			<td>
-				<input type="number" name="name" id="System_RSSIThreashold_value1" min="-100"  max="0" step="1">
+				<input type="number" name="name" id="System_RSSIThreshold_value1" min="-100"  max="0" step="1">
 			<td class="description">
-				WLAN Mesh Parameter: Threashold for RSSI value to check for start switching access point in a mesh system.
+				WLAN Mesh Parameter: Threshold for RSSI value to check for start switching access point in a mesh system.
 				Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup)
 			</td>
 		</tr>
@@ -1613,8 +1623,14 @@ function getParameterByName(name, url = window.location.href) {
 }	
 
 function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1){
-
-	let anzpara = _param[_cat][_name].anzParam;		
+	let anzpara;
+	try {
+		anzpara = _param[_cat][_name].anzParam;	
+	}
+	catch (error) {
+		firework.launch("Parameter '" + _name + "' in category '" + _cat + "' is unknown!", 'danger', 30000);
+		return;
+	}
 
 	if (_number > -1) {
 		if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined))
@@ -1891,9 +1907,9 @@ function UpdateInputIndividual(sel)
 		ReadParameter(param, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt)		
 		ReadParameter(param, "PostProcessing", "MaxRateValue", true, NUNBERSAkt)		
 		ReadParameter(param, "PostProcessing", "MaxRateType", true, NUNBERSAkt)		
-		ReadParameter(param, "PostProcessing", "ExtendedResolution", true, NUNBERSAkt)		
-		ReadParameter(param, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt)		
-		ReadParameter(param, "PostProcessing", "AllowNegativeRates", true, NUNBERSAkt)		
+		ReadParameter(param, "PostProcessing", "ExtendedResolution", false, NUNBERSAkt)		
+		ReadParameter(param, "PostProcessing", "IgnoreLeadingNaN", false, NUNBERSAkt)		
+		ReadParameter(param, "PostProcessing", "AllowNegativeRates", false, NUNBERSAkt)		
 		ReadParameter(param, "InfluxDBv2", "Fieldname", true, NUNBERSAkt)		
 	}
 
@@ -1903,9 +1919,9 @@ function UpdateInputIndividual(sel)
 	WriteParameter(param, category, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "MaxRateValue", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "MaxRateType", true, NUNBERSAkt);
-	WriteParameter(param, category, "PostProcessing", "ExtendedResolution", true, NUNBERSAkt);
-	WriteParameter(param, category, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt);
-	WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true, NUNBERSAkt);
+	WriteParameter(param, category, "PostProcessing", "ExtendedResolution", false, NUNBERSAkt);
+	WriteParameter(param, category, "PostProcessing", "IgnoreLeadingNaN", false, NUNBERSAkt);
+	WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", false, NUNBERSAkt);
 	WriteParameter(param, category, "InfluxDBv2", "Fieldname", true, NUNBERSAkt);
 }
 
@@ -1918,42 +1934,42 @@ function UpdateInput() {
 	document.getElementById("Category_InfluxDBv2_enabled").checked = category["InfluxDBv2"]["enabled"];
 	setVisible("GPIO_item", category["GPIO"]["enabled"]);
 
-	WriteParameter(param, category, "MakeImage", "LogImageLocation", true);
-	WriteParameter(param, category, "MakeImage", "LogfileRetentionInDays", true);
-	WriteParameter(param, category, "MakeImage", "Demo", true);
-	WriteParameter(param, category, "MakeImage", "WaitBeforeTakingPicture", false);		
-	WriteParameter(param, category, "MakeImage", "ImageQuality", false);		
-	WriteParameter(param, category, "MakeImage", "Brightness", false);		
-	WriteParameter(param, category, "MakeImage", "Contrast", false);		
-	WriteParameter(param, category, "MakeImage", "Saturation", false);		
-	WriteParameter(param, category, "MakeImage", "LEDIntensity", false);		
-	WriteParameter(param, category, "MakeImage", "ImageSize", false);		
-	WriteParameter(param, category, "MakeImage", "FixedExposure", false);		
+	WriteParameter(param, category, "TakeImage", "RawImagesLocation", true);
+	WriteParameter(param, category, "TakeImage", "RawImagesRetention", true);
+	WriteParameter(param, category, "TakeImage", "Demo", false);
+	WriteParameter(param, category, "TakeImage", "WaitBeforeTakingPicture", false);
+	WriteParameter(param, category, "TakeImage", "ImageQuality", false);
+	WriteParameter(param, category, "TakeImage", "Brightness", false);
+	WriteParameter(param, category, "TakeImage", "Contrast", false);
+	WriteParameter(param, category, "TakeImage", "Saturation", false);
+	WriteParameter(param, category, "TakeImage", "LEDIntensity", false);
+	WriteParameter(param, category, "TakeImage", "ImageSize", false);
+	WriteParameter(param, category, "TakeImage", "FixedExposure", false);
 
 	WriteParameter(param, category, "Alignment", "SearchFieldX", false);		
 	WriteParameter(param, category, "Alignment", "SearchFieldY", false);		
 	WriteParameter(param, category, "Alignment", "AlignmentAlgo", true);		
 
 	WriteParameter(param, category, "Digits", "CNNGoodThreshold", true);
-	WriteParameter(param, category, "Digits", "LogImageLocation", true);		
-	WriteParameter(param, category, "Digits", "LogfileRetentionInDays", true);		
+	WriteParameter(param, category, "Digits", "ROIImagesLocation", true);		
+	WriteParameter(param, category, "Digits", "ROIImagesRetention", true);		
 	
-	WriteParameter(param, category, "Analog", "LogImageLocation", true);		
-	WriteParameter(param, category, "Analog", "LogfileRetentionInDays", true);		
+	WriteParameter(param, category, "Analog", "ROIImagesLocation", true);		
+	WriteParameter(param, category, "Analog", "ROIImagesRetention", true);		
 	
-	WriteParameter(param, category, "PostProcessing", "PreValueUse", true);		
+	WriteParameter(param, category, "PostProcessing", "PreValueUse", false);		
 	WriteParameter(param, category, "PostProcessing", "PreValueAgeStartup", true);		
 //	WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true);
-	WriteParameter(param, category, "PostProcessing", "ErrorMessage", true);
-	WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", true);
+	WriteParameter(param, category, "PostProcessing", "ErrorMessage", false);
+	WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", false);
 
 	WriteParameter(param, category, "MQTT", "Uri", true);	
 	WriteParameter(param, category, "MQTT", "MainTopic", true);	
 	WriteParameter(param, category, "MQTT", "ClientID", true);	
 	WriteParameter(param, category, "MQTT", "user", true);	
 	WriteParameter(param, category, "MQTT", "password", true);
-	WriteParameter(param, category, "MQTT", "SetRetainFlag", true);
-	WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", true);
+	WriteParameter(param, category, "MQTT", "RetainMessages", false);
+	WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", false);
 	WriteParameter(param, category, "MQTT", "MeterType", true);
 	
 	WriteParameter(param, category, "InfluxDB", "Uri", true);	
@@ -1980,18 +1996,18 @@ function UpdateInput() {
 	WriteParameter(param, category, "GPIO", "LEDColor", false);
 
 	WriteParameter(param, category, "AutoTimer", "AutoStart", false);	
-	WriteParameter(param, category, "AutoTimer", "Intervall", false);	
+	WriteParameter(param, category, "AutoTimer", "Interval", false);
 
 	WriteParameter(param, category, "DataLogging", "DataLogActive", false);	
-	WriteParameter(param, category, "DataLogging", "DataLogRetentionInDays", false);	
+	WriteParameter(param, category, "DataLogging", "DataFilesRetention", false);	
 
-	WriteParameter(param, category, "Debug", "Logfile", false);	
-	WriteParameter(param, category, "Debug", "LogfileRetentionInDays", false);	
+	WriteParameter(param, category, "Debug", "LogLevel", false);	
+	WriteParameter(param, category, "Debug", "LogfilesRetention", false);	
 
 	WriteParameter(param, category, "System", "TimeZone", true);	
 	WriteParameter(param, category, "System", "Hostname", true);	
 	WriteParameter(param, category, "System", "TimeServer", true);
-	WriteParameter(param, category, "System", "RSSIThreashold", true);
+	WriteParameter(param, category, "System", "RSSIThreshold", true);
 
 	WriteModelFiles();
 }
@@ -2047,17 +2063,17 @@ function ReadParameterAll()
 	category["InfluxDBv2"]["enabled"] = document.getElementById("Category_InfluxDBv2_enabled").checked;
 	category["GPIO"]["enabled"] = document.getElementById("Category_GPIO_enabled").checked;
 	
-	ReadParameter(param, "MakeImage", "LogImageLocation", true);
-	ReadParameter(param, "MakeImage", "LogfileRetentionInDays", true);	
-	ReadParameter(param, "MakeImage", "Demo", true);
-	ReadParameter(param, "MakeImage", "WaitBeforeTakingPicture", false);		
-	ReadParameter(param, "MakeImage", "ImageQuality", false);		
-	ReadParameter(param, "MakeImage", "Brightness", false);		
-	ReadParameter(param, "MakeImage", "Contrast", false);		
-	ReadParameter(param, "MakeImage", "Saturation", false);		
-	ReadParameter(param, "MakeImage", "LEDIntensity", false);		
-	ReadParameter(param, "MakeImage", "ImageSize", false);	
-	ReadParameter(param, "MakeImage", "FixedExposure", false);	
+	ReadParameter(param, "TakeImage", "RawImagesLocation", true);
+	ReadParameter(param, "TakeImage", "RawImagesRetention", true);
+	ReadParameter(param, "TakeImage", "Demo", false);
+	ReadParameter(param, "TakeImage", "WaitBeforeTakingPicture", false);
+	ReadParameter(param, "TakeImage", "ImageQuality", false);
+	ReadParameter(param, "TakeImage", "Brightness", false);
+	ReadParameter(param, "TakeImage", "Contrast", false);
+	ReadParameter(param, "TakeImage", "Saturation", false);
+	ReadParameter(param, "TakeImage", "LEDIntensity", false);
+	ReadParameter(param, "TakeImage", "ImageSize", false);
+	ReadParameter(param, "TakeImage", "FixedExposure", false);
 
 	ReadParameter(param, "Alignment", "SearchFieldX", false);		
 	ReadParameter(param, "Alignment", "SearchFieldY", false);
@@ -2065,25 +2081,25 @@ function ReadParameterAll()
 
 	ReadParameter(param, "Digits", "Model", false);
 	ReadParameter(param, "Digits", "CNNGoodThreshold", true);
-	ReadParameter(param, "Digits", "LogImageLocation", true);		
-	ReadParameter(param, "Digits", "LogfileRetentionInDays", true);		
+	ReadParameter(param, "Digits", "ROIImagesLocation", true);		
+	ReadParameter(param, "Digits", "ROIImagesRetention", true);		
 
 	ReadParameter(param, "Analog", "Model", false);		
-	ReadParameter(param, "Analog", "LogImageLocation", true);		
-	ReadParameter(param, "Analog", "LogfileRetentionInDays", true);		
+	ReadParameter(param, "Analog", "ROIImagesLocation", true);		
+	ReadParameter(param, "Analog", "ROIImagesRetention", true);		
 
-	ReadParameter(param, "PostProcessing", "PreValueUse", true);		
-	ReadParameter(param, "PostProcessing", "PreValueAgeStartup", true);		
-	ReadParameter(param, "PostProcessing", "ErrorMessage", true);
-	ReadParameter(param, "PostProcessing", "CheckDigitIncreaseConsistency", true);
+	ReadParameter(param, "PostProcessing", "PreValueUse", false);		
+	ReadParameter(param, "PostProcessing", "PreValueAgeStartup", true);
+	ReadParameter(param, "PostProcessing", "ErrorMessage", false);
+	ReadParameter(param, "PostProcessing", "CheckDigitIncreaseConsistency", false);
 
 	ReadParameter(param, "MQTT", "Uri", true);	
 	ReadParameter(param, "MQTT", "MainTopic", true);	
 	ReadParameter(param, "MQTT", "ClientID", true);	
 	ReadParameter(param, "MQTT", "user", true);	
 	ReadParameter(param, "MQTT", "password", true);	
-	ReadParameter(param, "MQTT", "SetRetainFlag", true);	
-	ReadParameter(param, "MQTT", "HomeassistantDiscovery", true);
+	ReadParameter(param, "MQTT", "RetainMessages", false);	
+	ReadParameter(param, "MQTT", "HomeassistantDiscovery", false);
 	ReadParameter(param, "MQTT", "MeterType", true);
 
 	ReadParameter(param, "InfluxDB", "Uri", true);	
@@ -2117,18 +2133,18 @@ function ReadParameterAll()
 	param["GPIO"]["LEDColor"]["found"] = true;
 
 	ReadParameter(param, "AutoTimer", "AutoStart", false);	
-	ReadParameter(param, "AutoTimer", "Intervall", false);	
+	ReadParameter(param, "AutoTimer", "Interval", false);
 	
 	ReadParameter(param, "DataLogging", "DataLogActive", false);	
-	ReadParameter(param, "DataLogging", "DataLogRetentionInDays", false);	
+	ReadParameter(param, "DataLogging", "DataFilesRetention", false);	
 
-	ReadParameter(param, "Debug", "Logfile", false);	
-	ReadParameter(param, "Debug", "LogfileRetentionInDays", false);	
+	ReadParameter(param, "Debug", "LogLevel", false);	
+	ReadParameter(param, "Debug", "LogfilesRetention", false);	
 
 	ReadParameter(param, "System", "TimeZone", true);	
 	ReadParameter(param, "System", "Hostname", true);	
 	ReadParameter(param, "System", "TimeServer", true);	
-	ReadParameter(param, "System", "RSSIThreashold", true);	
+	ReadParameter(param, "System", "RSSIThreshold", true);
 
 	var sel = document.getElementById("Numbers_value1");	
 	UpdateInputIndividual(sel);

+ 56 - 56
sd-card/html/edit_reference.html

@@ -53,8 +53,8 @@ table {
 		<td style="padding-top: 10px"><label for="mirror" id="labelmirror">Mirror Image:</label></td>
         <td style="padding-top: 10px"><input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()"></td>
         <td>
-            <class id="MakeImage_LEDIntensity_text" style="color:black;">LEDIntensity: </class>
-            <input type="number" id="MakeImage_LEDIntensity_value1" size="13" value=0  min="0" max="100" style="float: right; clear: both;">
+            <class id="TakeImage_LEDIntensity_text" style="color:black;">LEDIntensity: </class>
+            <input type="number" id="TakeImage_LEDIntensity_value1" size="13" value=0  min="0" max="100" style="float: right; clear: both;">
         </td>
       </tr>
       <tr>
@@ -62,8 +62,8 @@ table {
 		<td><label for="flip" id="labelflip">Flip Image Size:</label></td>
         <td><input type="checkbox" id="flip" name="flip" value="1" onchange="drawRotated()"></td>
         <td>
-            <class id="MakeImage_Brightness_text" style="color:black;">Brightness: </class>
-            <input type="number" id="MakeImage_Brightness_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
+            <class id="TakeImage_Brightness_text" style="color:black;">Brightness: </class>
+            <input type="number" id="TakeImage_Brightness_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
         </td>
         
 	  </tr>
@@ -71,16 +71,16 @@ table {
         <td><label for="mirror">Pre-rotate Angle:</label></td>	  
 		<td><input type="number" id="prerotateangle" name="prerotateangle" value="0" min="-360" max="360" onchange="drawRotated()">Degrees</td>
         <td>
-            <class id="MakeImage_Contrast_text" style="color:black;">Contrast</class>
-            <input type="number" id="MakeImage_Contrast_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
+            <class id="TakeImage_Contrast_text" style="color:black;">Contrast</class>
+            <input type="number" id="TakeImage_Contrast_value1" size="13" value=0  min="-2" max="2" style="float: right; clear: both;">
         </td>
 	  </tr>
 	  <tr>
 		<td><label for="mirror">Fine Alignment:</label></td>	
 		<td><input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">Degrees</td>
         <td>
-            <class id="MakeImage_Saturation_text" style="color:black;">Saturation</class>
-            <input type="number" id="MakeImage_Saturation_value1" size="13" value=0   min="-2" max="2" style="float: right; clear: both;">
+            <class id="TakeImage_Saturation_text" style="color:black;">Saturation</class>
+            <input type="number" id="TakeImage_Saturation_value1" size="13" value=0   min="-2" max="2" style="float: right; clear: both;">
         </td>
 
     </tr>
@@ -123,13 +123,13 @@ table {
 
         function doTake(){ 
             var xhttp = new XMLHttpRequest();
-            if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
+            if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
             {
-                _intensity = document.getElementById("MakeImage_LEDIntensity_value1").value;
+                _intensity = document.getElementById("TakeImage_LEDIntensity_value1").value;
                 if (_intensity == "") _intensity = "50";
-                _brightness = document.getElementById("MakeImage_Brightness_value1").value;
-                _contrast = document.getElementById("MakeImage_Contrast_value1").value;
-                _saturation = document.getElementById("MakeImage_Saturation_value1").value;
+                _brightness = document.getElementById("TakeImage_Brightness_value1").value;
+                _contrast = document.getElementById("TakeImage_Contrast_value1").value;
+                _saturation = document.getElementById("TakeImage_Saturation_value1").value;
                 url = getDomainname() + "/editflow?task=test_take&bri=" + _brightness;
                 url = url + "&con=" + _contrast + "&sat=" + _saturation + "&int=" + _intensity;
             }
@@ -168,24 +168,24 @@ table {
                 document.getElementById("labelflip").style = "color:lightgrey;";
             }
 
-            if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
+            if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
             {
-                document.getElementById("MakeImage_Brightness_value1").disabled = false;
-                document.getElementById("MakeImage_Contrast_value1").disabled = false;
-                document.getElementById("MakeImage_Saturation_value1").disabled = false;
-                document.getElementById("MakeImage_LEDIntensity_value1").disabled = false;
+                document.getElementById("TakeImage_Brightness_value1").disabled = false;
+                document.getElementById("TakeImage_Contrast_value1").disabled = false;
+                document.getElementById("TakeImage_Saturation_value1").disabled = false;
+                document.getElementById("TakeImage_LEDIntensity_value1").disabled = false;
             }
             else
             {
-                document.getElementById("MakeImage_Brightness_value1").type = "hidden";
-                document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
+                document.getElementById("TakeImage_Brightness_value1").type = "hidden";
+                document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
                 
             }
 
-//            if (param["MakeImage"]["Saturation"].found)
-//                document.getElementById("MakeImage_Saturation_value1").disabled = false;
-//            if (param["MakeImage"]["Contrast"].found)
-//                document.getElementById("MakeImage_Contrast_value1").disabled = false;
+//            if (param["TakeImage"]["Saturation"].found)
+//                document.getElementById("TakeImage_Saturation_value1").disabled = false;
+//            if (param["TakeImage"]["Contrast"].found)
+//                document.getElementById("TakeImage_Contrast_value1").disabled = false;
 
             isActReference = false;
             loadCanvas(url);  
@@ -207,16 +207,16 @@ table {
             document.getElementById("prerotateangle").disabled = true; 
             document.getElementById("updatereferenceimage").disabled = true;
             document.getElementById("take").disabled = true;
-            document.getElementById("MakeImage_Brightness_value1").disabled = true;
-            document.getElementById("MakeImage_Saturation_value1").disabled = true;
-            document.getElementById("MakeImage_Contrast_value1").disabled = true;
-            document.getElementById("MakeImage_LEDIntensity_value1").disabled = true;
+            document.getElementById("TakeImage_Brightness_value1").disabled = true;
+            document.getElementById("TakeImage_Saturation_value1").disabled = true;
+            document.getElementById("TakeImage_Contrast_value1").disabled = true;
+            document.getElementById("TakeImage_LEDIntensity_value1").disabled = true;
             document.getElementById("mirror").disabled = false;
             document.getElementById("flip").disabled = false;
-            if (!(param["MakeImage"]["Brightness"].found))
+            if (!(param["TakeImage"]["Brightness"].found))
             {
-                document.getElementById("MakeImage_Brightness_value1").type = "hidden";
-                document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden";
+                document.getElementById("TakeImage_Brightness_value1").type = "hidden";
+                document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
             }
 
 
@@ -255,12 +255,12 @@ table {
                 else
                     param["Alignment"]["FlipImageSize"].value1 = "false";
 
-                if (param["MakeImage"]["Brightness"].found && param["MakeImage"]["Brightness"].enabled)
+                if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
                 {
-                    ReadParameter(param, "MakeImage", "Brightness", false);		
-                	ReadParameter(param, "MakeImage", "Contrast", false);
-                    ReadParameter(param, "MakeImage", "Saturation", false);
-                    ReadParameter(param, "MakeImage", "LEDIntensity", false);
+                    ReadParameter(param, "TakeImage", "Brightness", false);		
+                	ReadParameter(param, "TakeImage", "Contrast", false);
+                    ReadParameter(param, "TakeImage", "Saturation", false);
+                    ReadParameter(param, "TakeImage", "LEDIntensity", false);
                 }
 
                 var canvas = document.getElementById("canvas");
@@ -309,30 +309,30 @@ table {
             ParseConfig();
             param = getConfigParameters();
 
-            param["MakeImage"]["LEDIntensity"]["enabled"] = true;
-            param["MakeImage"]["Brightness"]["enabled"] = true;
-            param["MakeImage"]["Contrast"]["enabled"] = true;
-            param["MakeImage"]["Saturation"]["enabled"] = true;
+            param["TakeImage"]["LEDIntensity"]["enabled"] = true;
+            param["TakeImage"]["Brightness"]["enabled"] = true;
+            param["TakeImage"]["Contrast"]["enabled"] = true;
+            param["TakeImage"]["Saturation"]["enabled"] = true;
 
-            if (!param["MakeImage"]["LEDIntensity"]["found"])
+            if (!param["TakeImage"]["LEDIntensity"]["found"])
             {
-                param["MakeImage"]["LEDIntensity"]["found"] = true;
-                param["MakeImage"]["LEDIntensity"]["value1"] = "50";
+                param["TakeImage"]["LEDIntensity"]["found"] = true;
+                param["TakeImage"]["LEDIntensity"]["value1"] = "50";
             }
-            if (!param["MakeImage"]["Brightness"]["found"])
+            if (!param["TakeImage"]["Brightness"]["found"])
             {
-                param["MakeImage"]["Brightness"]["found"] = true;
-                param["MakeImage"]["Brightness"]["value1"] = "0";
+                param["TakeImage"]["Brightness"]["found"] = true;
+                param["TakeImage"]["Brightness"]["value1"] = "0";
             }
-            if (!param["MakeImage"]["Contrast"]["found"])
+            if (!param["TakeImage"]["Contrast"]["found"])
             {
-                param["MakeImage"]["Contrast"]["found"] = true;
-                param["MakeImage"]["Contrast"]["value1"] = "0";
+                param["TakeImage"]["Contrast"]["found"] = true;
+                param["TakeImage"]["Contrast"]["value1"] = "0";
             }
-            if (!param["MakeImage"]["Saturation"]["found"])
+            if (!param["TakeImage"]["Saturation"]["found"])
             {
-                param["MakeImage"]["Saturation"]["found"] = true;
-                param["MakeImage"]["Saturation"]["value1"] = "0";
+                param["TakeImage"]["Saturation"]["found"] = true;
+                param["TakeImage"]["Saturation"]["value1"] = "0";
             }
 
             UpdateInput();
@@ -340,10 +340,10 @@ table {
         }
 
         function UpdateInput() {
-            WriteParameter(param, category, "MakeImage", "Brightness", false);		
-            WriteParameter(param, category, "MakeImage", "Contrast", false);		
-            WriteParameter(param, category, "MakeImage", "Saturation", false);		
-            WriteParameter(param, category, "MakeImage", "LEDIntensity", false);		
+            WriteParameter(param, category, "TakeImage", "Brightness", false);		
+            WriteParameter(param, category, "TakeImage", "Contrast", false);		
+            WriteParameter(param, category, "TakeImage", "Saturation", false);		
+            WriteParameter(param, category, "TakeImage", "LEDIntensity", false);		
         }
 
 

+ 21 - 37
sd-card/html/readconfigparam.js

@@ -105,14 +105,14 @@ function ParseConfig() {
      param = new Object();
      category = new Object(); 
 
-     var catname = "MakeImage";
+     var catname = "TakeImage";
      category[catname] = new Object(); 
      category[catname]["enabled"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
-     ParamAddValue(param, catname, "LogImageLocation");
+     ParamAddValue(param, catname, "RawImagesLocation");
      ParamAddValue(param, catname, "WaitBeforeTakingPicture");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "RawImagesRetention");
      ParamAddValue(param, catname, "Demo");
      ParamAddValue(param, catname, "Brightness");
      ParamAddValue(param, catname, "Contrast");
@@ -141,8 +141,8 @@ function ParseConfig() {
      param[catname] = new Object();
      ParamAddValue(param, catname, "Model");
      ParamAddValue(param, catname, "CNNGoodThreshold", 1); 
-     ParamAddValue(param, catname, "LogImageLocation");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "ROIImagesLocation");
+     ParamAddValue(param, catname, "ROIImagesRetention");
 
      var catname = "Analog";
      category[catname] = new Object(); 
@@ -150,8 +150,8 @@ function ParseConfig() {
      category[catname]["found"] = false;
      param[catname] = new Object();
      ParamAddValue(param, catname, "Model");
-     ParamAddValue(param, catname, "LogImageLocation");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "ROIImagesLocation");
+     ParamAddValue(param, catname, "ROIImagesRetention");
 
      var catname = "PostProcessing";
      category[catname] = new Object(); 
@@ -181,7 +181,7 @@ function ParseConfig() {
      ParamAddValue(param, catname, "ClientID");
      ParamAddValue(param, catname, "user");
      ParamAddValue(param, catname, "password");
-     ParamAddValue(param, catname, "SetRetainFlag");
+     ParamAddValue(param, catname, "RetainMessages");
      ParamAddValue(param, catname, "HomeassistantDiscovery");
      ParamAddValue(param, catname, "MeterType");
 
@@ -236,7 +236,7 @@ function ParseConfig() {
      category[catname]["found"] = false;
      param[catname] = new Object();
      ParamAddValue(param, catname, "AutoStart");
-     ParamAddValue(param, catname, "Intervall");     
+     ParamAddValue(param, catname, "Interval");     
 
      var catname = "DataLogging";
      category[catname] = new Object(); 
@@ -244,15 +244,15 @@ function ParseConfig() {
      category[catname]["found"] = false;
      param[catname] = new Object();
      ParamAddValue(param, catname, "DataLogActive");
-     ParamAddValue(param, catname, "DataLogRetentionInDays");     
+     ParamAddValue(param, catname, "DataFilesRetention");     
 
      var catname = "Debug";
      category[catname] = new Object(); 
      category[catname]["enabled"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
-     ParamAddValue(param, catname, "Logfile");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "LogLevel");
+     ParamAddValue(param, catname, "LogfilesRetention");
 
      var catname = "System";
      category[catname] = new Object(); 
@@ -261,9 +261,8 @@ function ParseConfig() {
      param[catname] = new Object();
      ParamAddValue(param, catname, "TimeZone");
      ParamAddValue(param, catname, "TimeServer");         
-     ParamAddValue(param, catname, "AutoAdjustSummertime");
      ParamAddValue(param, catname, "Hostname");   
-     ParamAddValue(param, catname, "RSSIThreashold");   
+     ParamAddValue(param, catname, "RSSIThreshold");   
      ParamAddValue(param, catname, "SetupMode"); 
      
      
@@ -285,22 +284,7 @@ function ParseConfig() {
           aktline++;
      }
 
-
-     // Make the downward compatiblity with MQTT (Maintopic --> topic)
-     if (param["MQTT"]["Topic"]["found"] == true && param["MQTT"]["MainTopic"]["found"] == false)
-     {
-          param["MQTT"]["MainTopic"] = param["MQTT"]["Topic"]
-     }
-     delete param["MQTT"]["Topic"]                // Dient nur der Downwardskompatibilität
-
-
-     if (param["Debug"]["Logfile"]["value1"] == "false" || param["Debug"]["Logfile"]["value1"] == "true")
-     {
-          param["Debug"]["Logfile"]["value1"] = "2";
-     }
-
-
-     // Make the downward compatiblity with MQTT (Maintopic --> topic)
+     // Make the downward compatiblity
      if (category["DataLogging"]["found"] == false)
      {
           category["DataLogging"]["found"] = true;
@@ -310,9 +294,9 @@ function ParseConfig() {
           param["DataLogging"]["DataLogActive"]["enabled"] = true;
           param["DataLogging"]["DataLogActive"]["value1"] = "true";
           
-          param["DataLogging"]["DataLogRetentionInDays"]["found"] = true;
-          param["DataLogging"]["DataLogRetentionInDays"]["enabled"] = true;
-          param["DataLogging"]["DataLogRetentionInDays"]["value1"] = "3";
+          param["DataLogging"]["DataFilesRetention"]["found"] = true;
+          param["DataLogging"]["DataFilesRetention"]["enabled"] = true;
+          param["DataLogging"]["DataFilesRetention"]["value1"] = "3";
      }
 
      if (category["DataLogging"]["enabled"] == false)
@@ -325,11 +309,11 @@ function ParseConfig() {
           param["DataLogging"]["DataLogActive"]["value1"] = "true";
      }
 
-     if (param["DataLogging"]["DataLogRetentionInDays"]["enabled"] == false && param["DataLogging"]["DataLogRetentionInDays"]["value1"] == "")
+     if (param["DataLogging"]["DataFilesRetention"]["enabled"] == false && param["DataLogging"]["DataFilesRetention"]["value1"] == "")
      {
-          param["DataLogging"]["DataLogRetentionInDays"]["found"] = true;
-          param["DataLogging"]["DataLogRetentionInDays"]["enabled"] = true;
-          param["DataLogging"]["DataLogRetentionInDays"]["value1"] = "3";
+          param["DataLogging"]["DataFilesRetention"]["found"] = true;
+          param["DataLogging"]["DataFilesRetention"]["enabled"] = true;
+          param["DataLogging"]["DataFilesRetention"]["value1"] = "3";
      }
 
 }