Parcourir la source

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 il y a 2 ans
Parent
commit
025f4af9f2
32 fichiers modifiés avec 658 ajouts et 394 suppressions
  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]
 ## [Unreleased]
 
 
 **Rolling**
 **Rolling**
@@ -24,6 +25,13 @@
 -   n.a.
 -   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
 ## [14.0.3] -2023-02-05
 
 
@@ -830,6 +838,7 @@ External Illumination
 -   Initial Version
 -   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
 [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.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
 [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 "ClassFlowAlignment.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassFlow.h"
 #include "ClassFlow.h"
 #include "server_tflite.h"
 #include "server_tflite.h"
 
 
@@ -46,9 +46,9 @@ ClassFlowAlignment::ClassFlowAlignment(std::vector<ClassFlow*>* lfc)
 
 
     for (int i = 0; i < ListFlowControll->size(); ++i)
     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))
         if (!this->GetNextParagraph(pfile, aktparamgraph))
             return false;
             return false;
 
 
-    if (aktparamgraph.compare("[Alignment]") != 0)       //Paragraph does not fit MakeImage
+    if (aktparamgraph.compare("[Alignment]") != 0)       //Paragraph does not fit Alignment
         return false;
         return false;
 
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     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 = AutoDetect;
     CNNType = _cnntype;
     CNNType = _cnntype;
     flowpostalignment = _flowalign;
     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))
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     {
     {
         splitted = ZerlegeZeile(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;
             this->isLogImage = true;
         }
         }
         if ((toUpper(splitted[0]) == "LOGIMAGESELECT") && (splitted.size() > 1))
         if ((toUpper(splitted[0]) == "LOGIMAGESELECT") && (splitted.size() > 1))
@@ -335,9 +335,9 @@ bool ClassFlowCNNGeneral::ReadParameter(FILE* pfile, string& aktparamgraph)
             isLogImageSelect = true;            
             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))
         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());
     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)){
     if ((_stepname.compare("[Alignment]") == 0) || (_stepname.compare(";[Alignment]") == 0)){
         _classname = "ClassFlowAlignment";
         _classname = "ClassFlowAlignment";
@@ -67,7 +67,7 @@ std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _
 
 
     for (int i = 0; i < FlowControll.size(); ++i)
     for (int i = 0; i < FlowControll.size(); ++i)
         if (FlowControll[i]->name().compare(_classname) == 0){
         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("");
                 FlowControll[i]->doFlow("");
             result = FlowControll[i]->getHTMLSingleStep(_host);
             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)
 std::string ClassFlowControll::TranslateAktstatus(std::string _input)
 {
 {
-    if (_input.compare("ClassFlowMakeImage") == 0)
+    if (_input.compare("ClassFlowTakeImage") == 0)
         return ("Take Image");
         return ("Take Image");
     if (_input.compare("ClassFlowAlignment") == 0)
     if (_input.compare("ClassFlowAlignment") == 0)
         return ("Aligning");
         return ("Aligning");
@@ -176,7 +176,7 @@ bool ClassFlowControll::StartMQTTService() {
     /* Start the MQTT service */
     /* Start the MQTT service */
         for (int i = 0; i < FlowControll.size(); ++i) {
         for (int i = 0; i < FlowControll.size(); ++i) {
             if (FlowControll[i]->name().compare("ClassFlowMQTT") == 0) {
             if (FlowControll[i]->name().compare("ClassFlowMQTT") == 0) {
-                return ((ClassFlowMQTT*) (FlowControll[i]))->Start(AutoIntervall);
+                return ((ClassFlowMQTT*) (FlowControll[i]))->Start(AutoInterval);
             }  
             }  
         } 
         } 
     return false;
     return false;
@@ -188,7 +188,7 @@ void ClassFlowControll::SetInitialParameter(void)
 {
 {
     AutoStart = false;
     AutoStart = false;
     SetupModeActive = false;
     SetupModeActive = false;
-    AutoIntervall = 10; // Minutes
+    AutoInterval = 10; // Minutes
     flowdigit = NULL;
     flowdigit = NULL;
     flowanalog = NULL;
     flowanalog = NULL;
     flowpostprocessing = 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;
     return AutoStart;
 }
 }
 
 
@@ -211,10 +211,10 @@ ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type)
 
 
     _type = trim(_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)
     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;
     std::string zw_time;
 
 
     for (int i = 0; i < FlowControll.size(); ++i)
     for (int i = 0; i < FlowControll.size(); ++i)
     {
     {
-        if (FlowControll[i]->name() == "ClassFlowMakeImage") {
+        if (FlowControll[i]->name() == "ClassFlowTakeImage") {
             zw_time = getCurrentTimeString("%H:%M:%S");
             zw_time = getCurrentTimeString("%H:%M:%S");
             std::string flowStatus = TranslateAktstatus(FlowControll[i]->name());
             std::string flowStatus = TranslateAktstatus(FlowControll[i]->name());
             aktstatus = flowStatus + " (" + zw_time + ")";
             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) &&
     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;
         return false;
 
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     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))
         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]));
             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 */
             /* matches esp_log_level_t */
             if ((toUpper(splitted[1]) == "TRUE") || (toUpper(splitted[1]) == "2"))
             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);
                 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]));
             LogFile.SetLogFileRetention(std::stoi(splitted[1]));
         }
         }
 
 
         /* TimeServer and TimeZone got already read from the config, see setupTime () */
         /* 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 !!!
                 // reboot necessary so that the new wlan.ini is also used !!!
                 fclose(pfile);
                 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();
                 esp_restart();
                 hard_restart();                   
                 hard_restart();                   
                 doReboot();
                 doReboot();
@@ -668,7 +668,7 @@ int ClassFlowControll::CleanTempFolder() {
 
 
 esp_err_t ClassFlowControll::SendRawJPG(httpd_req_t *req)
 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 <string>
 
 
 #include "ClassFlow.h"
 #include "ClassFlow.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassFlowAlignment.h"
 #include "ClassFlowAlignment.h"
 #include "ClassFlowCNNGeneral.h"
 #include "ClassFlowCNNGeneral.h"
 #include "ClassFlowPostProcessing.h"
 #include "ClassFlowPostProcessing.h"
@@ -30,11 +30,11 @@ protected:
 	ClassFlowCNNGeneral* flowanalog;
 	ClassFlowCNNGeneral* flowanalog;
 	ClassFlowCNNGeneral* flowdigit;
 	ClassFlowCNNGeneral* flowdigit;
 //	ClassFlowDigit* flowdigit;
 //	ClassFlowDigit* flowdigit;
-	ClassFlowMakeImage* flowmakeimage;
+	ClassFlowTakeImage* flowtakeimage;
 	ClassFlow* CreateClassFlow(std::string _type);
 	ClassFlow* CreateClassFlow(std::string _type);
 
 
 	bool AutoStart;
 	bool AutoStart;
-	float AutoIntervall;
+	float AutoInterval;
 	bool SetupModeActive;
 	bool SetupModeActive;
 	void SetInitialParameter(void);	
 	void SetInitialParameter(void);	
 	std::string aktstatus;
 	std::string aktstatus;
@@ -43,7 +43,7 @@ protected:
 public:
 public:
 	void InitFlow(std::string config);
 	void InitFlow(std::string config);
 	bool doFlow(string time);
 	bool doFlow(string time);
-	void doFlowMakeImageOnly(string time);
+	void doFlowTakeImageOnly(string time);
 	bool getStatusSetupModus(){return SetupModeActive;};
 	bool getStatusSetupModus(){return SetupModeActive;};
 	string getReadout(bool _rawvalue, bool _noerror);
 	string getReadout(bool _rawvalue, bool _noerror);
 	string getReadoutAll(int _type);	
 	string getReadoutAll(int _type);	
@@ -69,7 +69,7 @@ public:
 
 
 	std::string doSingleStep(std::string _stepname, std::string _host);
 	std::string doSingleStep(std::string _stepname, std::string _host);
 
 
-	bool isAutoStart(long &_intervall);
+	bool isAutoStart(long &_interval);
 
 
 	std::string* getActStatus();
 	std::string* getActStatus();
 	void setActStatus(std::string _aktstatus);
 	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;
 	this->logTag = logTag;
 	isLogImage = false;
 	isLogImage = false;
     disabled = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 }
 
 
 ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, const char* logTag) : ClassFlow(lfc)
 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;
 	this->logTag = logTag;
 	isLogImage = false;
 	isLogImage = false;
     disabled = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 }
 
 
 ClassFlowImage::ClassFlowImage(std::vector<ClassFlow*> * lfc, ClassFlow *_prev, const char* logTag) :  ClassFlow(lfc, _prev)
 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;
 	this->logTag = logTag;
 	isLogImage = false;
 	isLogImage = false;
     disabled = false;
     disabled = false;
-    this->logfileRetentionInDays = 5;
+    this->imagesRetention = 5;
 }
 }
 
 
 
 
@@ -48,7 +48,7 @@ string ClassFlowImage::CreateLogFolder(string time) {
 	if (!isLogImage)
 	if (!isLogImage)
 		return "";
 		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;
     isLogImage = mkdir_r(logPath.c_str(), S_IRWXU) == 0;
     if (!isLogImage) {
     if (!isLogImage) {
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Can't create log folder for analog images. Path " + logPath);
         LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Can't create log folder for analog images. Path " + logPath);
@@ -95,7 +95,7 @@ void ClassFlowImage::RemoveOldLogs()
 		return;
 		return;
 	
 	
 	ESP_LOGD(TAG, "remove old images");
 	ESP_LOGD(TAG, "remove old images");
-    if (logfileRetentionInDays == 0) {
+    if (imagesRetention == 0) {
         return;
         return;
     }
     }
 
 
@@ -104,17 +104,17 @@ void ClassFlowImage::RemoveOldLogs()
     char cmpfilename[30];
     char cmpfilename[30];
 
 
     time(&rawtime);
     time(&rawtime);
-    rawtime = addDays(rawtime, -logfileRetentionInDays + 1);
+    rawtime = addDays(rawtime, -1 * imagesRetention + 1);
     timeinfo = localtime(&rawtime);
     timeinfo = localtime(&rawtime);
-    //ESP_LOGD(TAG, "ImagefileRetentionInDays: %d", logfileRetentionInDays);
+    //ESP_LOGD(TAG, "ImagefileRetentionInDays: %d", imagesRetention);
     
     
     strftime(cmpfilename, 30, LOGFILE_TIME_FORMAT, timeinfo);
     strftime(cmpfilename, 30, LOGFILE_TIME_FORMAT, timeinfo);
     //ESP_LOGD(TAG, "file name to compare: %s", cmpfilename);
     //ESP_LOGD(TAG, "file name to compare: %s", cmpfilename);
 	string folderName = string(cmpfilename).LOGFILE_TIME_FORMAT_DATE_EXTR;
 	string folderName = string(cmpfilename).LOGFILE_TIME_FORMAT_DATE_EXTR;
 
 
-    DIR *dir = opendir(LogImageLocation.c_str());
+    DIR *dir = opendir(imagesLocation.c_str());
     if (!dir) {
     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;
         return;
     }
     }
 
 
@@ -122,7 +122,7 @@ void ClassFlowImage::RemoveOldLogs()
     int deleted = 0;
     int deleted = 0;
     int notDeleted = 0;
     int notDeleted = 0;
     while ((entry = readdir(dir)) != NULL) {
     while ((entry = readdir(dir)) != NULL) {
-        string folderPath = LogImageLocation + "/" + entry->d_name;
+        string folderPath = imagesLocation + "/" + entry->d_name;
 		if (entry->d_type == DT_DIR) {
 		if (entry->d_type == DT_DIR) {
 			//ESP_LOGD(TAG, "Compare %s to %s", entry->d_name, folderName.c_str());	
 			//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)) {
 			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
 class ClassFlowImage : public ClassFlow
 {
 {
 protected:
 protected:
-	string LogImageLocation;
+	string imagesLocation;
     bool isLogImage;
     bool isLogImage;
-    unsigned short logfileRetentionInDays;
+    unsigned short imagesRetention;
 	const char* logTag;
 	const char* logTag;
 
 
 	string CreateLogFolder(string time);
 	string CreateLogFolder(string time);

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

@@ -42,7 +42,7 @@ void ClassFlowMQTT::SetInitialParameter(void)
     flowpostprocessing = NULL;  
     flowpostprocessing = NULL;  
     user = "";
     user = "";
     password = ""; 
     password = ""; 
-    SetRetainFlag = 0;
+    SetRetainFlag = false;
     previousElement = NULL;
     previousElement = NULL;
     ListFlowControll = NULL; 
     ListFlowControll = NULL; 
     disabled = false;
     disabled = false;
@@ -95,7 +95,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
         if (!this->GetNextParagraph(pfile, aktparamgraph))
         if (!this->GetNextParagraph(pfile, aktparamgraph))
             return false;
             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;
         return false;
 
 
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
     while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
@@ -113,10 +113,10 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph)
         {
         {
             this->uri = splitted[1];
             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") {
             if (toUpper(splitted[1]) == "TRUE") {
-                SetRetainFlag = 1;  
+                SetRetainFlag = true;  
                 setMqtt_Server_Retain(SetRetainFlag);
                 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!
     keepAlive = roundInterval * 60 * 2.5; // Seconds, make sure it is greater thatn 2 rounds!
 
 
     std::stringstream stream;
     std::stringstream stream;

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

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

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

@@ -1,6 +1,6 @@
 #include "ClassFlowPostProcessing.h"
 #include "ClassFlowPostProcessing.h"
 #include "Helper.h"
 #include "Helper.h"
-#include "ClassFlowMakeImage.h"
+#include "ClassFlowTakeImage.h"
 #include "ClassLogFile.h"
 #include "ClassLogFile.h"
 
 
 #include <iomanip>
 #include <iomanip>
@@ -285,7 +285,7 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow*>* lfc, C
     ListFlowControll = NULL;
     ListFlowControll = NULL;
     FilePreValue = FormatFileName("/sdcard/config/prevalue.ini");
     FilePreValue = FormatFileName("/sdcard/config/prevalue.ini");
     ListFlowControll = lfc;
     ListFlowControll = lfc;
-    flowMakeImage = NULL;
+    flowTakeImage = NULL;
     UpdatePreValueINI = false;
     UpdatePreValueINI = false;
     IgnoreLeadingNaN = false;
     IgnoreLeadingNaN = false;
     flowAnalog = _analog;
     flowAnalog = _analog;
@@ -293,9 +293,9 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow*>* lfc, C
 
 
     for (int i = 0; i < ListFlowControll->size(); ++i)
     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;
             return false;
 
 
 
 
-    if (aktparamgraph.compare("[PostProcessing]") != 0)       // Paragraph does not fit MakeImage
+    if (aktparamgraph.compare("[PostProcessing]") != 0)       // Paragraph does not fit PostProcessing
         return false;
         return false;
 
 
     InitNUMBERS();
     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:
     // 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)
     if (imagetime == 0)
         time(&imagetime);
         time(&imagetime);
 
 

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

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

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

@@ -1,7 +1,7 @@
 #pragma once
 #pragma once
 
 
-#ifndef CLASSFFLOWMAKEIMAGE_H
-#define CLASSFFLOWMAKEIMAGE_H
+#ifndef CLASSFFLOWTAKEIMAGE_H
+#define CLASSFFLOWTAKEIMAGE_H
 
 
 #include "ClassFlowImage.h"
 #include "ClassFlowImage.h"
 #include "ClassControllCamera.h"
 #include "ClassControllCamera.h"
@@ -9,7 +9,7 @@
 
 
 #include <string>
 #include <string>
 
 
-class ClassFlowMakeImage :
+class ClassFlowTakeImage :
     public ClassFlowImage
     public ClassFlowImage
 {
 {
 protected:
 protected:
@@ -37,19 +37,19 @@ protected:
 public:
 public:
     CImageBasis *rawImage;
     CImageBasis *rawImage;
 
 
-    ClassFlowMakeImage(std::vector<ClassFlow*>* lfc);
+    ClassFlowTakeImage(std::vector<ClassFlow*>* lfc);
 
 
     bool ReadParameter(FILE* pfile, string& aktparamgraph);
     bool ReadParameter(FILE* pfile, string& aktparamgraph);
     bool doFlow(string time);
     bool doFlow(string time);
     string getHTMLSingleStep(string host);
     string getHTMLSingleStep(string host);
     time_t getTimeImageTaken();
     time_t getTimeImageTaken();
-    string name(){return "ClassFlowMakeImage";};
+    string name(){return "ClassFlowTakeImage";};
 
 
     ImageData* SendRawImage();
     ImageData* SendRawImage();
     esp_err_t SendRawJPG(httpd_req_t *req);
     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;
 esp_mqtt_client_handle_t client = NULL;
 std::string uri, client_id, lwt_topic, lwt_connected, lwt_disconnected, user, password, maintopic;
 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)      
     if (!mqtt_enabled) {                            // MQTT sevice not started / configured (MQTT_Init not called before)      
         return false;
         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,
 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,
         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)) 
     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)");
         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;
     keepalive = _keepalive;
     SetRetainFlag = _SetRetainFlag;
     SetRetainFlag = _SetRetainFlag;
     maintopic = _maintopic;
     maintopic = _maintopic;
-    callbackOnConnected = ( void (*)(std::string, int) )(_callbackOnConnected);
+    callbackOnConnected = ( void (*)(std::string, bool) )(_callbackOnConnected);
 
 
     if (_user.length() && _password.length()){
     if (_user.length() && _password.length()){
         user = _user;
         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,
 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,
                     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();
 int MQTT_Init();
 void MQTTdestroy_client(bool _disable);
 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 getMQTTisEnabled();
 bool getMQTTisConnected();
 bool getMQTTisConnected();

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

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

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

@@ -10,7 +10,7 @@
 void SetHomeassistantDiscoveryEnabled(bool enabled);
 void SetHomeassistantDiscoveryEnabled(bool enabled);
 void mqttServer_setParameter(std::vector<NumberPost*>* _NUMBERS, int interval, float roundInterval);
 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 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);
 void mqttServer_setMainTopic( std::string maintopic);
 std::string mqttServer_getMainTopic();
 std::string mqttServer_getMainTopic();
 
 
@@ -19,7 +19,7 @@ void register_server_mqtt_uri(httpd_handle_t server);
 void publishSystemData();
 void publishSystemData();
 
 
 std::string getTimeUnit(void);
 std::string getTimeUnit(void);
-void GotConnected(std::string maintopic, int SetRetainFlag);
+void GotConnected(std::string maintopic, bool SetRetainFlag);
 
 
 
 
 #endif //SERVERMQTT_H
 #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 bTaskAutoFlowCreated = false;
 bool flowisrunning = false;
 bool flowisrunning = false;
 
 
-long auto_intervall = 0;
+long auto_interval = 0;
 bool auto_isrunning = false;
 bool auto_isrunning = false;
 
 
 int countRounds = 0;
 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());
 //        string zwzw = "Do " + _task + " start\n"; ESP_LOGD(TAG, zwzw.c_str());
         Camera.SetBrightnessContrastSaturation(bri, con, sat);
         Camera.SetBrightnessContrastSaturation(bri, con, sat);
         Camera.SetLEDIntensity(intens);
         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_set_hdr(req, "Access-Control-Allow-Origin", "*");
         httpd_resp_send(req, zw.c_str(), zw.length()); 
         httpd_resp_send(req, zw.c_str(), zw.length()); 
     } 
     } 
@@ -825,13 +825,13 @@ void task_autodoFlow(void *pvParameter)
     ESP_LOGD(TAG, "task_autodoFlow: start");
     ESP_LOGD(TAG, "task_autodoFlow: start");
     doInit();
     doInit();
 
 
-    auto_isrunning = tfliteflow.isAutoStart(auto_intervall);
+    auto_isrunning = tfliteflow.isAutoStart(auto_interval);
 
 
     if (isSetupModusActive()) 
     if (isSetupModusActive()) 
     {
     {
         auto_isrunning = false;
         auto_isrunning = false;
         std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT);
         std::string zw_time = getCurrentTimeString(LOGFILE_TIME_FORMAT);
-        tfliteflow.doFlowMakeImageOnly(zw_time);
+        tfliteflow.doFlowTakeImageOnly(zw_time);
     }
     }
     
     
     while (auto_isrunning)
     while (auto_isrunning)
@@ -873,9 +873,9 @@ void task_autodoFlow(void *pvParameter)
                 " completed (" + std::to_string(getUpTime() - roundStartTime) + " seconds)");
                 " completed (" + std::to_string(getUpTime() - roundStartTime) + " seconds)");
 
 
         fr_delta_ms = (esp_timer_get_time() - fr_start) / 1000;
         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);
             ESP_LOGD(TAG, "Autoflow: sleep for: %ldms", (long) xDelay);
             vTaskDelay( 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 std_hostname = "watermeter";
 std::string ipadress = "";
 std::string ipadress = "";
 std::string ssid = "";
 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();
     s_wifi_event_group = xEventGroupCreate();
 
 
     ESP_ERROR_CHECK(esp_netif_init());
     ESP_ERROR_CHECK(esp_netif_init());

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

@@ -5,7 +5,7 @@
 
 
 #include <string>
 #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, const char *_hostname);
 void wifi_init_sta(const char *_ssid, const char *_password);
 void wifi_init_sta(const char *_ssid, const char *_password);
 
 
@@ -17,6 +17,6 @@ void WIFIDestroy();
 
 
 extern std::string hostname;
 extern std::string hostname;
 extern std::string std_hostname;
 extern std::string std_hostname;
-extern int RSSIThreashold;
+extern int RSSIThreshold;
 
 
 #endif //CONNECT_WLAN_H
 #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 ssid = "";
     std::string passphrase = "";
     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]);
             string _s = trim(splitted[1]);
             if ((_s[0] == '"') && (_s[_s.length()-1] == '"')){
             if ((_s[0] == '"') && (_s[_s.length()-1] == '"')){
                 _s = _s.substr(1, ssid.length()-2);
                 _s = _s.substr(1, ssid.length()-2);
@@ -194,8 +194,8 @@ bool LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_ho
     else
     else
         _dns = NULL;
         _dns = NULL;
 
 
-    _rssithreashold = rssithreshold;
-    RSSIThreashold = rssithreshold;
+    _rssithreshold = rssithreshold;
+    RSSIThreshold = rssithreshold;
     return true;
     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;
         return false;
 
 
     string line = "";
     string line = "";
@@ -305,8 +305,8 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
         splitted = ZerlegeZeileWLAN(line, "=");
         splitted = ZerlegeZeileWLAN(line, "=");
         splitted[0] = trim(splitted[0], " ");
         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;
             found = true;
         }
         }
 
 
@@ -324,7 +324,7 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
 
 
     if (!found)
     if (!found)
     {
     {
-        line = "RSSIThreashold = " + to_string(_newrssithreashold) + "\n";
+        line = "RSSIThreshold = " + to_string(_newrssithreshold) + "\n";
         neuesfile.push_back(line);        
         neuesfile.push_back(line);        
     }
     }
 
 
@@ -340,7 +340,7 @@ bool ChangeRSSIThreashold(std::string fn, int _newrssithreashold)
 
 
     fclose(pFile);
     fclose(pFile);
 
 
-    ESP_LOGD(TAG, "*** RSSIThreashold update done ***");
+    ESP_LOGD(TAG, "*** RSSIThreshold update done ***");
 
 
     return true;
     return true;
 }
 }

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

@@ -5,10 +5,10 @@
 
 
 #include <string>
 #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 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
 #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
     //#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 FLASH_GPIO GPIO_NUM_4
     #define BLINK_GPIO GPIO_NUM_33
     #define BLINK_GPIO GPIO_NUM_33
 
 
@@ -71,12 +71,13 @@
     //server_GPIO
     //server_GPIO
     #define __LEDGLOBAL
     #define __LEDGLOBAL
 
 
-    //ClassControllCamera + ClassFlowMakeImage
+    //ClassControllCamera + ClassFlowTakeImage
     #define CAMERA_MODEL_AI_THINKER
     #define CAMERA_MODEL_AI_THINKER
     #define BOARD_ESP32CAM_AITHINKER
     #define BOARD_ESP32CAM_AITHINKER
 
 
     //server_GPIO + server_file + SoftAP
     //server_GPIO + server_file + SoftAP
     #define CONFIG_FILE "/sdcard/config/config.ini"
     #define CONFIG_FILE "/sdcard/config/config.ini"
+    #define CONFIG_FILE_BACKUP "/sdcard/config/config.bak"
 
 
     //ClassFlowControll + Main + SoftAP
     //ClassFlowControll + Main + SoftAP
     #define WLAN_CONFIG_FILE "/sdcard/wlan.ini"
     #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/FreeRTOS.h"
 //#include "freertos/task.h"
 //#include "freertos/task.h"
 //#include "freertos/event_groups.h"
 //#include "freertos/event_groups.h"
@@ -29,6 +33,7 @@
 #include "server_file.h"
 #include "server_file.h"
 #include "server_ota.h"
 #include "server_ota.h"
 #include "time_sntp.h"
 #include "time_sntp.h"
+#include "configFile.h"
 //#include "ClassControllCamera.h"
 //#include "ClassControllCamera.h"
 #include "server_main.h"
 #include "server_main.h"
 #include "server_camera.h"
 #include "server_camera.h"
@@ -78,6 +83,14 @@ extern std::string getFwVersion(void);
 extern std::string getHTMLversion(void);
 extern std::string getHTMLversion(void);
 extern std::string getHTMLcommit(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";
 static const char *TAG = "MAIN";
 
 
 bool Init_NVS_SDCard()
 bool Init_NVS_SDCard()
@@ -198,6 +211,8 @@ extern "C" void app_main(void)
         return; // No way to continue without SD-Card!
         return; // No way to continue without SD-Card!
     }
     }
 
 
+    migrateConfiguration();
+
     setupTime();
     setupTime();
 
 
     string versionFormated = getFwVersion() + ", Date/Time: " + std::string(BUILD_TIME) + \
     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) );
     ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) );
 #endif
 #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)
     if (ssid != NULL && passwd != NULL)
 #ifdef __HIDE_PASSWORD
 #ifdef __HIDE_PASSWORD
@@ -268,7 +283,7 @@ extern "C" void app_main(void)
        ESP_LOGD(TAG, "DNS IP: %s", dns);
        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;
     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>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><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><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()));
 //        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 = "<button class=\"button\" type=\"button\" onclick=\"wr()\">Write wlan.ini</button>";
         message += "<script language=\"JavaScript\">async function wr(){";
         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;";
-//        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>";
         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()));
         httpd_resp_send_chunk(req, message.c_str(), strlen(message.c_str()));
         return;
         return;
@@ -311,7 +311,7 @@ esp_err_t config_ini_handler(httpd_req_t *req)
     fputs(dns.c_str(), configfilehandle);
     fputs(dns.c_str(), configfilehandle);
 
 
     if (rssi.length())
     if (rssi.length())
-        rssi = "RSSIThreashold = \"" + rssi + "\"\n";
+        rssi = "RSSIThreshold = \"" + rssi + "\"\n";
     else
     else
         rssi = ";rssi = \"\"\n";
         rssi = ";rssi = \"\"\n";
     fputs(rssi.c_str(), configfilehandle);
     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* _analog;
     ClassFlowCNNGeneral* _digit;
     ClassFlowCNNGeneral* _digit;
     std::vector<ClassFlow*> FlowControll;
     std::vector<ClassFlow*> FlowControll;
-    ClassFlowMakeImage* flowmakeimage;
+    ClassFlowTakeImage* flowtakeimage;
 
 
     // wird im doFlow verwendet
     // 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.
     // Die Modeltypen werden gesetzt, da keine Modelle verwendet werden.
     _analog = new ClassFlowCNNGeneral(nullptr, anaType);
     _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 <unity.h>
 #include <ClassFlowPostProcessing.h>
 #include <ClassFlowPostProcessing.h>
 #include <ClassFlowCNNGeneral.h>
 #include <ClassFlowCNNGeneral.h>
-#include <ClassFlowMakeImage.h>
+#include <ClassFlowTakeImage.h>
 #include <Helper.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
 WaitBeforeTakingPicture = 5
-;LogfileRetentionInDays = 15
+;RawImagesRetention = 15
 Brightness = 0
 Brightness = 0
 Contrast = 0
 Contrast = 0
 Saturation = 0
 Saturation = 0
@@ -24,8 +24,8 @@ FlipImageSize = false
 [Digits]
 [Digits]
 Model = /config/dig-cont_0600_s3.tflite
 Model = /config/dig-cont_0600_s3.tflite
 CNNGoodThreshold = 0.5
 CNNGoodThreshold = 0.5
-;LogImageLocation = /log/digit
-;LogfileRetentionInDays = 3
+;ROIImagesLocation = /log/digit
+;ROIImagesRetention = 3
 main.dig1 294 126 30 54 false
 main.dig1 294 126 30 54 false
 main.dig2 343 126 30 54 false
 main.dig2 343 126 30 54 false
 main.dig3 391 126 30 54 false
 main.dig3 391 126 30 54 false
@@ -33,9 +33,8 @@ main.dig3 391 126 30 54 false
 [Analog]
 [Analog]
 Model = /config/ana-cont_11.3.1_s2.tflite
 Model = /config/ana-cont_11.3.1_s2.tflite
 CNNGoodThreshold = 0.5
 CNNGoodThreshold = 0.5
-;LogImageLocation = /log/analog
-;LogfileRetentionInDays = 3
-ExtendedResolution = true
+;ROIImagesLocation = /log/analog
+;ROIImagesRetention = 3
 main.ana1 432 230 92 92 false
 main.ana1 432 230 92 92 false
 main.ana2 379 332 92 92 false
 main.ana2 379 332 92 92 false
 main.ana3 283 374 92 92 false
 main.ana3 283 374 92 92 false
@@ -49,8 +48,8 @@ PreValueAgeStartup = 720
 main.AllowNegativeRates = false
 main.AllowNegativeRates = false
 main.MaxRateValue = 0.05
 main.MaxRateValue = 0.05
 ;main.MaxRateType = AbsoluteChange
 ;main.MaxRateType = AbsoluteChange
-;main.ExtendedResolution = false
-;main.IgnoreLeadingNaN = true
+main.ExtendedResolution = false
+main.IgnoreLeadingNaN = false
 ErrorMessage = true
 ErrorMessage = true
 CheckDigitIncreaseConsistency = false
 CheckDigitIncreaseConsistency = false
 
 
@@ -60,8 +59,8 @@ CheckDigitIncreaseConsistency = false
 ;ClientID = watermeter
 ;ClientID = watermeter
 ;user = USERNAME
 ;user = USERNAME
 ;password = PASSWORD
 ;password = PASSWORD
-;SetRetainFlag = true
-;HomeassistantDiscovery = true
+RetainMessages = false
+HomeassistantDiscovery = false
 ;MeterType = other
 ;MeterType = other
 
 
 ;[InfluxDB]
 ;[InfluxDB]
@@ -85,20 +84,19 @@ LEDColor = 150 150 150
 
 
 [AutoTimer]
 [AutoTimer]
 AutoStart = true
 AutoStart = true
-Intervall = 5
+Interval = 5
 
 
 [DataLogging]
 [DataLogging]
 DataLogActive = true
 DataLogActive = true
-DataLogRetentionInDays = 3
+DataFilesRetention = 3
 
 
 [Debug]
 [Debug]
-Logfile = 1
-LogfileRetentionInDays = 3
+LogLevel = 1
+LogfilesRetention = 3
 
 
 [System]
 [System]
 TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
 TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
 ;TimeServer = pool.ntp.org
 ;TimeServer = pool.ntp.org
-;AutoAdjustSummertime = false
 ;Hostname = undefined
 ;Hostname = undefined
-;RSSIThreashold = 0
+;RSSIThreshold = 0
 SetupMode = true
 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.
 /* 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! */
  * 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> 
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<input type="text" name="name" id="MakeImage_LogImageLocation_value1">
+				<input type="text" name="name" id="TakeImage_RawImagesLocation_value1">
 			</td>
 			</td>
 			<td class="description">
 			<td class="description">
-				Location to store raw images for logging
+				Location to store raw camera images
 			</td>
 			</td>
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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>
 			<td class="description">
 			<td class="description">
 				Time to keep the raw image (in days, resp. "0" = forever)
 				Time to keep the raw image (in days, resp. "0" = forever)
@@ -126,11 +126,10 @@ textarea {
 		</tr>		
 		</tr>		
 		<tr class="expert" id="ex1">
 		<tr class="expert" id="ex1">
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<select id="MakeImage_Demo_value1">
+				<select id="TakeImage_Demo_value1">
 					<option value="true">true</option>
 					<option value="true">true</option>
 					<option value="false" selected>false</option>
 					<option value="false" selected>false</option>
 				</select>
 				</select>
@@ -144,10 +143,10 @@ textarea {
 		<tr class="expert" id="ex1">
 		<tr class="expert" id="ex1">
 			
 			
 			<td class="indent1">
 			<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>
 			<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>
 			<td class="description">
 			<td class="description">
 				Wait time between switching illumination on and taking the picture (in seconds)
 				Wait time between switching illumination on and taking the picture (in seconds)
@@ -155,10 +154,10 @@ textarea {
 		</tr>
 		</tr>
 		<tr class="expert" id="ex2">
 		<tr class="expert" id="ex2">
 			<td class="indent1">
 			<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>
 			<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>
 			<td class="description">
 			<td class="description">
 				Image quality index (default = 12) <br>
 				Image quality index (default = 12) <br>
@@ -168,10 +167,10 @@ textarea {
 		</tr>
 		</tr>
 		<tr class="expert"  id="ex3">
 		<tr class="expert"  id="ex3">
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<select id="MakeImage_ImageSize_value1">
+				<select id="TakeImage_ImageSize_value1">
 					<option value="VGA" selected>VGA</option>
 					<option value="VGA" selected>VGA</option>
 					<option value="QVGA" >QVGA</option>
 					<option value="QVGA" >QVGA</option>
 				</select>
 				</select>
@@ -183,10 +182,10 @@ textarea {
 
 
 		<tr class="expert"  id="LEDIntensity_ex3">
 		<tr class="expert"  id="LEDIntensity_ex3">
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Internal LED Flash Intensity (PWM from 0% - 100%). <br>
 				Internal LED Flash Intensity (PWM from 0% - 100%). <br>
@@ -196,10 +195,10 @@ textarea {
 
 
 		<tr class="expert"  id="Brightness_ex3">
 		<tr class="expert"  id="Brightness_ex3">
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Image brightness (default = 0) <br>
 				Image brightness (default = 0) <br>
@@ -209,10 +208,10 @@ textarea {
 
 
 		<tr class="expert"  id="Contrast_ex3">
 		<tr class="expert"  id="Contrast_ex3">
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Image contrast (default = 0) <br>
 				Image contrast (default = 0) <br>
@@ -222,10 +221,10 @@ textarea {
 
 
 		<tr class="expert"  id="Saturation_ex3">
 		<tr class="expert"  id="Saturation_ex3">
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Image saturation (default = 0) <br>
 				Image saturation (default = 0) <br>
@@ -233,12 +232,12 @@ textarea {
 			</td>
 			</td>
 		</tr>
 		</tr>
 		
 		
-		<tr class="expert"  id="MakeImage_FixedExposure_ex10">
+		<tr class="expert"  id="TakeImage_FixedExposure_ex10">
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<select id="MakeImage_FixedExposure_value1">
+				<select id="TakeImage_FixedExposure_value1">
 					<option value="true" selected>true</option>
 					<option value="true" selected>true</option>
 					<option value="false" >false</option>
 					<option value="false" >false</option>
 				</select>
 				</select>
@@ -292,6 +291,37 @@ textarea {
 			</td>
 			</td>
 		</tr>
 		</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">
 		<tr id="Category_Digits_ex4">
 			<td colspan="3" style="padding-left: 20px;">
 			<td colspan="3" style="padding-left: 20px;">
@@ -328,11 +358,11 @@ textarea {
 
 
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<input type="text" name="name" id="Digits_LogImageLocation_value1">
+				<input type="text" name="name" id="Digits_ROIImagesLocation_value1">
 			</td>
 			</td>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Location to store separated digits for logging
 				Location to store separated digits for logging
@@ -340,11 +370,11 @@ textarea {
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<td style="font-size: 80%;">
 				Time to keep the separated digit images (in days, resp. "0" = forever)
 				Time to keep the separated digit images (in days, resp. "0" = forever)
@@ -370,18 +400,18 @@ textarea {
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 				</label>
 			</td>
 			</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>
 			<td style="font-size: 80%;"> Location to store separated digits for logging </td>
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<td style="font-size: 80%;"> Time to keep the separated digit images (in days, resp. "0" = forever) </td>
 		</tr>
 		</tr>
 
 
@@ -390,7 +420,6 @@ textarea {
 		</tr> 		
 		</tr> 		
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 				<label for=PostProcessing_PreValueUse_enabled><class id="PostProcessing_PreValueUse_text" style="color:black;">PreValueUse</class></label>
 			</td>
 			</td>
 			<td>
 			<td>
@@ -417,7 +446,6 @@ textarea {
 		</tr>
 		</tr>
 		<tr class="expert"  id="ex12">
 		<tr class="expert"  id="ex12">
 			<td class="indent1">
 			<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>
 				<label for=PostProcessing_ErrorMessage_enabled><class id="PostProcessing_ErrorMessage_text" style="color:black;">ErrorMessage</class></label>
 			</td>
 			</td>
 			<td>
 			<td>
@@ -432,7 +460,6 @@ textarea {
 		</tr>
 		</tr>
 		<tr class="expert" id="ex1dddd">
 		<tr class="expert" id="ex1dddd">
 			<td class="indent1">
 			<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>
 				<label for=PostProcessing_CheckDigitIncreaseConsistency_enabled><class id="PostProcessing_CheckDigitIncreaseConsistency_text" style="color:black;">CheckDigitIncreaseConsistency</class></label>
 			</td>
 			</td>
 			<td>
 			<td>
@@ -528,8 +555,7 @@ textarea {
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1" style="padding-left: 75px;">
 			<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>
 			<td>
 			<td>
 				<select id="PostProcessing_ExtendedResolution_value1">
 				<select id="PostProcessing_ExtendedResolution_value1">
@@ -541,11 +567,9 @@ textarea {
 				Enable to use the decimal place of the last analog counter
 				Enable to use the decimal place of the last analog counter
 			</td>
 			</td>
 		</tr>
 		</tr>
-		
 		<tr>
 		<tr>
 			<td id="ex121" class="indent1" style="padding-left: 75px;">
 			<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>
 			<td>
 			<td>
 				<select id="PostProcessing_IgnoreLeadingNaN_value1">
 				<select id="PostProcessing_IgnoreLeadingNaN_value1">
@@ -636,11 +660,10 @@ textarea {
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<td>
 			<td>
-				<select id="MQTT_SetRetainFlag_value1">
+				<select id="MQTT_RetainMessages_value1">
 					<option value="true" selected>true</option>
 					<option value="true" selected>true</option>
 					<option value="false" >false</option>
 					<option value="false" >false</option>
 				</select>
 				</select>
@@ -658,7 +681,6 @@ textarea {
 		</tr> 
 		</tr> 
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 				<label for=MQTT_HomeassistantDiscovery_enabled><class id="MQTT_HomeassistantDiscovery_text" style="color:black;">Homeassistant Discovery</class></label>
 			</td>
 			</td>
 			<td>
 			<td>
@@ -703,7 +725,7 @@ textarea {
 			<td colspan="3" style="padding-left: 20px;">
 			<td colspan="3" style="padding-left: 20px;">
 			    <h4>
 			    <h4>
 				<input type="checkbox" id="Category_InfluxDB_enabled" value="1"  onclick = 'UpdateAfterCategoryCheck()' unchecked >
 				<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>
 			</td>
 		</tr> 		
 		</tr> 		
 		<tr>
 		<tr>
@@ -767,8 +789,6 @@ textarea {
 			</td>
 			</td>
 		</tr>
 		</tr>
 
 
-
-
 		<tr>
 		<tr>
 			<td colspan="3" style="padding-left: 20px;">
 			<td colspan="3" style="padding-left: 20px;">
 			    <h4>
 			    <h4>
@@ -860,16 +880,6 @@ textarea {
 			</td>
 			</td>
 		</tr>
 		</tr>
 
 
-
-
-
-
-
-
-
-
-
-
 		<tr>
 		<tr>
 			<td colspan="3" style="padding-left: 20px;">
 			<td colspan="3" style="padding-left: 20px;">
 				<h4><input type="checkbox" id="Category_GPIO_enabled" value="1"  onclick='UpdateAfterCategoryCheck()' unchecked > 
 				<h4><input type="checkbox" id="Category_GPIO_enabled" value="1"  onclick='UpdateAfterCategoryCheck()' unchecked > 
@@ -1392,10 +1402,10 @@ textarea {
 		</tr>
 		</tr>
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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>
 			<td style="font-size: 80%;">
 			<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.
 				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>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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>
 			<td class="description">
 			<td class="description">
 				Time to keep the data files (in days - "0" = forever)
 				Time to keep the data files (in days - "0" = forever)
@@ -1437,10 +1447,10 @@ textarea {
 		</tr> 		
 		</tr> 		
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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="1" selected>ERROR</option> <!-- matches esp_log_level_t -->
 					<option value="2">WARNING</option>
 					<option value="2">WARNING</option>
 					<option value="3">INFO</option>
 					<option value="3">INFO</option>
@@ -1453,10 +1463,10 @@ textarea {
 		</tr> 		
 		</tr> 		
 		<tr>
 		<tr>
 			<td class="indent1">
 			<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>
 			<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>
 			<td class="description">
 			<td class="description">
 				Time to keep the log files (in days - "0" = forever)
 				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)
 				Hostname for server - will be transfered to wlan.ini at next startup)
 			</td>
 			</td>
 		</tr>
 		</tr>
-		<tr class="expert"  id="System_RSSIThreashold">
+		<tr class="expert"  id="System_RSSIThreshold">
 			<td class="indent1">
 			<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>
 			<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">
 			<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)
 				Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup)
 			</td>
 			</td>
 		</tr>
 		</tr>
@@ -1613,8 +1623,14 @@ function getParameterByName(name, url = window.location.href) {
 }	
 }	
 
 
 function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1){
 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 (_number > -1) {
 		if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) ||  (NUMBERS[_number][_cat][_name] == undefined))
 		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", "AnalogDigitalTransitionStart", true, NUNBERSAkt)		
 		ReadParameter(param, "PostProcessing", "MaxRateValue", true, NUNBERSAkt)		
 		ReadParameter(param, "PostProcessing", "MaxRateValue", true, NUNBERSAkt)		
 		ReadParameter(param, "PostProcessing", "MaxRateType", 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)		
 		ReadParameter(param, "InfluxDBv2", "Fieldname", true, NUNBERSAkt)		
 	}
 	}
 
 
@@ -1903,9 +1919,9 @@ function UpdateInputIndividual(sel)
 	WriteParameter(param, category, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "MaxRateValue", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "MaxRateValue", true, NUNBERSAkt);
 	WriteParameter(param, category, "PostProcessing", "MaxRateType", 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);
 	WriteParameter(param, category, "InfluxDBv2", "Fieldname", true, NUNBERSAkt);
 }
 }
 
 
@@ -1918,42 +1934,42 @@ function UpdateInput() {
 	document.getElementById("Category_InfluxDBv2_enabled").checked = category["InfluxDBv2"]["enabled"];
 	document.getElementById("Category_InfluxDBv2_enabled").checked = category["InfluxDBv2"]["enabled"];
 	setVisible("GPIO_item", category["GPIO"]["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", "SearchFieldX", false);		
 	WriteParameter(param, category, "Alignment", "SearchFieldY", false);		
 	WriteParameter(param, category, "Alignment", "SearchFieldY", false);		
 	WriteParameter(param, category, "Alignment", "AlignmentAlgo", true);		
 	WriteParameter(param, category, "Alignment", "AlignmentAlgo", true);		
 
 
 	WriteParameter(param, category, "Digits", "CNNGoodThreshold", 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", "PreValueAgeStartup", true);		
 //	WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", 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", "Uri", true);	
 	WriteParameter(param, category, "MQTT", "MainTopic", true);	
 	WriteParameter(param, category, "MQTT", "MainTopic", true);	
 	WriteParameter(param, category, "MQTT", "ClientID", true);	
 	WriteParameter(param, category, "MQTT", "ClientID", true);	
 	WriteParameter(param, category, "MQTT", "user", true);	
 	WriteParameter(param, category, "MQTT", "user", true);	
 	WriteParameter(param, category, "MQTT", "password", 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, "MQTT", "MeterType", true);
 	
 	
 	WriteParameter(param, category, "InfluxDB", "Uri", true);	
 	WriteParameter(param, category, "InfluxDB", "Uri", true);	
@@ -1980,18 +1996,18 @@ function UpdateInput() {
 	WriteParameter(param, category, "GPIO", "LEDColor", false);
 	WriteParameter(param, category, "GPIO", "LEDColor", false);
 
 
 	WriteParameter(param, category, "AutoTimer", "AutoStart", 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", "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", "TimeZone", true);	
 	WriteParameter(param, category, "System", "Hostname", true);	
 	WriteParameter(param, category, "System", "Hostname", true);	
 	WriteParameter(param, category, "System", "TimeServer", true);
 	WriteParameter(param, category, "System", "TimeServer", true);
-	WriteParameter(param, category, "System", "RSSIThreashold", true);
+	WriteParameter(param, category, "System", "RSSIThreshold", true);
 
 
 	WriteModelFiles();
 	WriteModelFiles();
 }
 }
@@ -2047,17 +2063,17 @@ function ReadParameterAll()
 	category["InfluxDBv2"]["enabled"] = document.getElementById("Category_InfluxDBv2_enabled").checked;
 	category["InfluxDBv2"]["enabled"] = document.getElementById("Category_InfluxDBv2_enabled").checked;
 	category["GPIO"]["enabled"] = document.getElementById("Category_GPIO_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", "SearchFieldX", false);		
 	ReadParameter(param, "Alignment", "SearchFieldY", false);
 	ReadParameter(param, "Alignment", "SearchFieldY", false);
@@ -2065,25 +2081,25 @@ function ReadParameterAll()
 
 
 	ReadParameter(param, "Digits", "Model", false);
 	ReadParameter(param, "Digits", "Model", false);
 	ReadParameter(param, "Digits", "CNNGoodThreshold", true);
 	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", "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", "Uri", true);	
 	ReadParameter(param, "MQTT", "MainTopic", true);	
 	ReadParameter(param, "MQTT", "MainTopic", true);	
 	ReadParameter(param, "MQTT", "ClientID", true);	
 	ReadParameter(param, "MQTT", "ClientID", true);	
 	ReadParameter(param, "MQTT", "user", true);	
 	ReadParameter(param, "MQTT", "user", true);	
 	ReadParameter(param, "MQTT", "password", 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, "MQTT", "MeterType", true);
 
 
 	ReadParameter(param, "InfluxDB", "Uri", true);	
 	ReadParameter(param, "InfluxDB", "Uri", true);	
@@ -2117,18 +2133,18 @@ function ReadParameterAll()
 	param["GPIO"]["LEDColor"]["found"] = true;
 	param["GPIO"]["LEDColor"]["found"] = true;
 
 
 	ReadParameter(param, "AutoTimer", "AutoStart", false);	
 	ReadParameter(param, "AutoTimer", "AutoStart", false);	
-	ReadParameter(param, "AutoTimer", "Intervall", false);	
+	ReadParameter(param, "AutoTimer", "Interval", false);
 	
 	
 	ReadParameter(param, "DataLogging", "DataLogActive", 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", "TimeZone", true);	
 	ReadParameter(param, "System", "Hostname", true);	
 	ReadParameter(param, "System", "Hostname", true);	
 	ReadParameter(param, "System", "TimeServer", true);	
 	ReadParameter(param, "System", "TimeServer", true);	
-	ReadParameter(param, "System", "RSSIThreashold", true);	
+	ReadParameter(param, "System", "RSSIThreshold", true);
 
 
 	var sel = document.getElementById("Numbers_value1");	
 	var sel = document.getElementById("Numbers_value1");	
 	UpdateInputIndividual(sel);
 	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"><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 style="padding-top: 10px"><input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()"></td>
         <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>
         </td>
       </tr>
       </tr>
       <tr>
       <tr>
@@ -62,8 +62,8 @@ table {
 		<td><label for="flip" id="labelflip">Flip Image Size:</label></td>
 		<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><input type="checkbox" id="flip" name="flip" value="1" onchange="drawRotated()"></td>
         <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>
         </td>
         
         
 	  </tr>
 	  </tr>
@@ -71,16 +71,16 @@ table {
         <td><label for="mirror">Pre-rotate Angle:</label></td>	  
         <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><input type="number" id="prerotateangle" name="prerotateangle" value="0" min="-360" max="360" onchange="drawRotated()">Degrees</td>
         <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>
         </td>
 	  </tr>
 	  </tr>
 	  <tr>
 	  <tr>
 		<td><label for="mirror">Fine Alignment:</label></td>	
 		<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><input type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.2" onchange="drawRotated()">Degrees</td>
         <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>
         </td>
 
 
     </tr>
     </tr>
@@ -123,13 +123,13 @@ table {
 
 
         function doTake(){ 
         function doTake(){ 
             var xhttp = new XMLHttpRequest();
             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";
                 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 = getDomainname() + "/editflow?task=test_take&bri=" + _brightness;
                 url = url + "&con=" + _contrast + "&sat=" + _saturation + "&int=" + _intensity;
                 url = url + "&con=" + _contrast + "&sat=" + _saturation + "&int=" + _intensity;
             }
             }
@@ -168,24 +168,24 @@ table {
                 document.getElementById("labelflip").style = "color:lightgrey;";
                 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
             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;
             isActReference = false;
             loadCanvas(url);  
             loadCanvas(url);  
@@ -207,16 +207,16 @@ table {
             document.getElementById("prerotateangle").disabled = true; 
             document.getElementById("prerotateangle").disabled = true; 
             document.getElementById("updatereferenceimage").disabled = true;
             document.getElementById("updatereferenceimage").disabled = true;
             document.getElementById("take").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("mirror").disabled = false;
             document.getElementById("flip").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
                 else
                     param["Alignment"]["FlipImageSize"].value1 = "false";
                     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");
                 var canvas = document.getElementById("canvas");
@@ -309,30 +309,30 @@ table {
             ParseConfig();
             ParseConfig();
             param = getConfigParameters();
             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();
             UpdateInput();
@@ -340,10 +340,10 @@ table {
         }
         }
 
 
         function UpdateInput() {
         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();
      param = new Object();
      category = new Object(); 
      category = new Object(); 
 
 
-     var catname = "MakeImage";
+     var catname = "TakeImage";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
      category[catname]["enabled"] = false;
      category[catname]["enabled"] = false;
      category[catname]["found"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
      param[catname] = new Object();
-     ParamAddValue(param, catname, "LogImageLocation");
+     ParamAddValue(param, catname, "RawImagesLocation");
      ParamAddValue(param, catname, "WaitBeforeTakingPicture");
      ParamAddValue(param, catname, "WaitBeforeTakingPicture");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "RawImagesRetention");
      ParamAddValue(param, catname, "Demo");
      ParamAddValue(param, catname, "Demo");
      ParamAddValue(param, catname, "Brightness");
      ParamAddValue(param, catname, "Brightness");
      ParamAddValue(param, catname, "Contrast");
      ParamAddValue(param, catname, "Contrast");
@@ -141,8 +141,8 @@ function ParseConfig() {
      param[catname] = new Object();
      param[catname] = new Object();
      ParamAddValue(param, catname, "Model");
      ParamAddValue(param, catname, "Model");
      ParamAddValue(param, catname, "CNNGoodThreshold", 1); 
      ParamAddValue(param, catname, "CNNGoodThreshold", 1); 
-     ParamAddValue(param, catname, "LogImageLocation");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "ROIImagesLocation");
+     ParamAddValue(param, catname, "ROIImagesRetention");
 
 
      var catname = "Analog";
      var catname = "Analog";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
@@ -150,8 +150,8 @@ function ParseConfig() {
      category[catname]["found"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
      param[catname] = new Object();
      ParamAddValue(param, catname, "Model");
      ParamAddValue(param, catname, "Model");
-     ParamAddValue(param, catname, "LogImageLocation");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "ROIImagesLocation");
+     ParamAddValue(param, catname, "ROIImagesRetention");
 
 
      var catname = "PostProcessing";
      var catname = "PostProcessing";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
@@ -181,7 +181,7 @@ function ParseConfig() {
      ParamAddValue(param, catname, "ClientID");
      ParamAddValue(param, catname, "ClientID");
      ParamAddValue(param, catname, "user");
      ParamAddValue(param, catname, "user");
      ParamAddValue(param, catname, "password");
      ParamAddValue(param, catname, "password");
-     ParamAddValue(param, catname, "SetRetainFlag");
+     ParamAddValue(param, catname, "RetainMessages");
      ParamAddValue(param, catname, "HomeassistantDiscovery");
      ParamAddValue(param, catname, "HomeassistantDiscovery");
      ParamAddValue(param, catname, "MeterType");
      ParamAddValue(param, catname, "MeterType");
 
 
@@ -236,7 +236,7 @@ function ParseConfig() {
      category[catname]["found"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
      param[catname] = new Object();
      ParamAddValue(param, catname, "AutoStart");
      ParamAddValue(param, catname, "AutoStart");
-     ParamAddValue(param, catname, "Intervall");     
+     ParamAddValue(param, catname, "Interval");     
 
 
      var catname = "DataLogging";
      var catname = "DataLogging";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
@@ -244,15 +244,15 @@ function ParseConfig() {
      category[catname]["found"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
      param[catname] = new Object();
      ParamAddValue(param, catname, "DataLogActive");
      ParamAddValue(param, catname, "DataLogActive");
-     ParamAddValue(param, catname, "DataLogRetentionInDays");     
+     ParamAddValue(param, catname, "DataFilesRetention");     
 
 
      var catname = "Debug";
      var catname = "Debug";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
      category[catname]["enabled"] = false;
      category[catname]["enabled"] = false;
      category[catname]["found"] = false;
      category[catname]["found"] = false;
      param[catname] = new Object();
      param[catname] = new Object();
-     ParamAddValue(param, catname, "Logfile");
-     ParamAddValue(param, catname, "LogfileRetentionInDays");
+     ParamAddValue(param, catname, "LogLevel");
+     ParamAddValue(param, catname, "LogfilesRetention");
 
 
      var catname = "System";
      var catname = "System";
      category[catname] = new Object(); 
      category[catname] = new Object(); 
@@ -261,9 +261,8 @@ function ParseConfig() {
      param[catname] = new Object();
      param[catname] = new Object();
      ParamAddValue(param, catname, "TimeZone");
      ParamAddValue(param, catname, "TimeZone");
      ParamAddValue(param, catname, "TimeServer");         
      ParamAddValue(param, catname, "TimeServer");         
-     ParamAddValue(param, catname, "AutoAdjustSummertime");
      ParamAddValue(param, catname, "Hostname");   
      ParamAddValue(param, catname, "Hostname");   
-     ParamAddValue(param, catname, "RSSIThreashold");   
+     ParamAddValue(param, catname, "RSSIThreshold");   
      ParamAddValue(param, catname, "SetupMode"); 
      ParamAddValue(param, catname, "SetupMode"); 
      
      
      
      
@@ -285,22 +284,7 @@ function ParseConfig() {
           aktline++;
           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)
      if (category["DataLogging"]["found"] == false)
      {
      {
           category["DataLogging"]["found"] = true;
           category["DataLogging"]["found"] = true;
@@ -310,9 +294,9 @@ function ParseConfig() {
           param["DataLogging"]["DataLogActive"]["enabled"] = true;
           param["DataLogging"]["DataLogActive"]["enabled"] = true;
           param["DataLogging"]["DataLogActive"]["value1"] = "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)
      if (category["DataLogging"]["enabled"] == false)
@@ -325,11 +309,11 @@ function ParseConfig() {
           param["DataLogging"]["DataLogActive"]["value1"] = "true";
           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";
      }
      }
 
 
 }
 }