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>
This commit is contained in:
CaCO3
2023-02-21 23:18:24 +01:00
committed by GitHub
parent 3d92860c5e
commit 025f4af9f2
32 changed files with 658 additions and 394 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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))

View File

@@ -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)){ if ((_stepname.compare("[TakeImage]") == 0) || (_stepname.compare(";[TakeImage]") == 0)){
_classname = "ClassFlowMakeImage"; _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); cfc = new ClassFlowTakeImage(&FlowControll);
flowmakeimage = (ClassFlowMakeImage*) cfc; 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;
} }

View File

@@ -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);

View File

@@ -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)) {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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"; imagesLocation = "/log/source";
logfileRetentionInDays = 5; 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;
} }

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#ifndef CLASSFFLOWMAKEIMAGE_H #ifndef CLASSFFLOWTAKEIMAGE_H
#define CLASSFFLOWMAKEIMAGE_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

View File

@@ -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; int keepalive;
void (*callbackOnConnected)(std::string, int) = NULL; 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;

View File

@@ -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();

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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"); ESP_LOGD(TAG, "test_take - vor TakeImage");
std::string zw = tfliteflow.doSingleStep("[MakeImage]", _host); 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 );
} }

View File

@@ -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());

View File

@@ -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

View File

@@ -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; _rssithreshold = rssithreshold;
RSSIThreashold = 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")){ if ((splitted.size() > 1) && (toUpper(splitted[0]) == "RSSITHRESHOLD")){
line = "RSSIThreashold = " + to_string(_newrssithreashold) + "\n"; 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;
} }

View File

@@ -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

View File

@@ -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"

View File

@@ -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; 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, rssithreashold); 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;
}

View File

@@ -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);

View File

@@ -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); flowtakeimage = new ClassFlowTakeImage(&FlowControll);
FlowControll.push_back(flowmakeimage); 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);

View File

@@ -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>

View File

@@ -1,7 +1,7 @@
[MakeImage] [TakeImage]
;LogImageLocation = /log/source ;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 ;ROIImagesLocation = /log/digit
;LogfileRetentionInDays = 3 ;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 ;ROIImagesLocation = /log/analog
;LogfileRetentionInDays = 3 ;ROIImagesRetention = 3
ExtendedResolution = true
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.ExtendedResolution = false
;main.IgnoreLeadingNaN = true 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 RetainMessages = false
;HomeassistantDiscovery = true 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 LogLevel = 1
LogfileRetentionInDays = 3 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

View File

@@ -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";

View File

@@ -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 > <input type="checkbox" id="TakeImage_RawImagesLocation_enabled" value="1" onclick = 'InvertEnableItem("TakeImage", "RawImagesLocation")' unchecked >
<label for=MakeImage_LogImageLocation_enabled><class id="MakeImage_LogImageLocation_text" style="color:black;">LogImageLocation</class></label> <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 > <input type="checkbox" id="TakeImage_RawImagesRetention_enabled" value="1" onclick = 'InvertEnableItem("TakeImage", "RawImagesRetention")' unchecked >
<label for=MakeImage_LogfileRetentionInDays_enabled><class id="MakeImage_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label> <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=TakeImage_Demo_enabled><class id="TakeImage_Demo_text" style="color:black;">Demo Mode</class></label>
<label for=MakeImage_Demo_enabled><class id="MakeImage_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 > <input type="checkbox" id="Digits_ROIImagesLocation_enabled" value="1" onclick = 'InvertEnableItem("Digits", "ROIImagesLocation")' unchecked >
<label for=Digits_LogImageLocation_enabled><class id="Digits_LogImageLocation_text" style="color:black;">LogImageLocation</class></label> <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 > <input type="checkbox" id="Digits_ROIImagesRetention_enabled" value="1" onclick = 'InvertEnableItem("Digits", "ROIImagesRetention")' unchecked >
<label for=Digits_LogfileRetentionInDays_enabled><class id="Digits_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label> <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 > <input type="checkbox" id="Analog_ROIImagesLocation_enabled" value="1" onclick = 'InvertEnableItem("Analog", "ROIImagesLocation")' unchecked >
<label for=Analog_LogImageLocation_enabled><class id="Analog_LogImageLocation_text" style="color:black;">LogImageLocation</class> <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 > <input type="checkbox" id="Analog_ROIImagesRetention_enabled" value="1" onclick = 'InvertEnableItem("Analog", "ROIImagesRetention")' unchecked >
<label for=Analog_LogfileRetentionInDays_enabled><class id="Analog_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label></td> <label for=Analog_ROIImagesRetention_enabled><class id="Analog_ROIImagesRetention_text" style="color:black;">ROIImagesRetention</class></label></td>
<td> <input type="number" id="Analog_LogfileRetentionInDays_value1" min="0" step="1"> </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,7 +555,6 @@ 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>
@@ -541,10 +567,8 @@ 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>
@@ -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_RetainMessages_enabled><class id="MQTT_RetainMessages_text" style="color:black;">Enable MQTT Retain Flag</class></label>
<label for=MQTT_SetRetainFlag_enabled><class id="MQTT_SetRetainFlag_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 > <input type="checkbox" id="System_RSSIThreshold_enabled" value="1" onclick = 'InvertEnableItem("System", "RSSIThreshold")' unchecked >
<label for=System_RSSIThreashold_enabled><class id="System_RSSIThreashold_text" style="color:black;">RSSIThreashold</class></label> <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;
let anzpara = _param[_cat][_name].anzParam; 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", "ExtendedResolution", false, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt) ReadParameter(param, "PostProcessing", "IgnoreLeadingNaN", false, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "AllowNegativeRates", true, 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", "ExtendedResolution", false, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt); WriteParameter(param, category, "PostProcessing", "IgnoreLeadingNaN", false, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true, 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, "TakeImage", "RawImagesLocation", true);
WriteParameter(param, category, "MakeImage", "LogfileRetentionInDays", true); WriteParameter(param, category, "TakeImage", "RawImagesRetention", true);
WriteParameter(param, category, "MakeImage", "Demo", true); WriteParameter(param, category, "TakeImage", "Demo", false);
WriteParameter(param, category, "MakeImage", "WaitBeforeTakingPicture", false); WriteParameter(param, category, "TakeImage", "WaitBeforeTakingPicture", false);
WriteParameter(param, category, "MakeImage", "ImageQuality", false); WriteParameter(param, category, "TakeImage", "ImageQuality", false);
WriteParameter(param, category, "MakeImage", "Brightness", false); WriteParameter(param, category, "TakeImage", "Brightness", false);
WriteParameter(param, category, "MakeImage", "Contrast", false); WriteParameter(param, category, "TakeImage", "Contrast", false);
WriteParameter(param, category, "MakeImage", "Saturation", false); WriteParameter(param, category, "TakeImage", "Saturation", false);
WriteParameter(param, category, "MakeImage", "LEDIntensity", false); WriteParameter(param, category, "TakeImage", "LEDIntensity", false);
WriteParameter(param, category, "MakeImage", "ImageSize", false); WriteParameter(param, category, "TakeImage", "ImageSize", false);
WriteParameter(param, category, "MakeImage", "FixedExposure", 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", "ROIImagesLocation", true);
WriteParameter(param, category, "Digits", "LogfileRetentionInDays", true); WriteParameter(param, category, "Digits", "ROIImagesRetention", true);
WriteParameter(param, category, "Analog", "LogImageLocation", true); WriteParameter(param, category, "Analog", "ROIImagesLocation", true);
WriteParameter(param, category, "Analog", "LogfileRetentionInDays", 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", "ErrorMessage", false);
WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", true); 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", "RetainMessages", false);
WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", true); 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", "LogLevel", false);
WriteParameter(param, category, "Debug", "LogfileRetentionInDays", 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, "TakeImage", "RawImagesLocation", true);
ReadParameter(param, "MakeImage", "LogfileRetentionInDays", true); ReadParameter(param, "TakeImage", "RawImagesRetention", true);
ReadParameter(param, "MakeImage", "Demo", true); ReadParameter(param, "TakeImage", "Demo", false);
ReadParameter(param, "MakeImage", "WaitBeforeTakingPicture", false); ReadParameter(param, "TakeImage", "WaitBeforeTakingPicture", false);
ReadParameter(param, "MakeImage", "ImageQuality", false); ReadParameter(param, "TakeImage", "ImageQuality", false);
ReadParameter(param, "MakeImage", "Brightness", false); ReadParameter(param, "TakeImage", "Brightness", false);
ReadParameter(param, "MakeImage", "Contrast", false); ReadParameter(param, "TakeImage", "Contrast", false);
ReadParameter(param, "MakeImage", "Saturation", false); ReadParameter(param, "TakeImage", "Saturation", false);
ReadParameter(param, "MakeImage", "LEDIntensity", false); ReadParameter(param, "TakeImage", "LEDIntensity", false);
ReadParameter(param, "MakeImage", "ImageSize", false); ReadParameter(param, "TakeImage", "ImageSize", false);
ReadParameter(param, "MakeImage", "FixedExposure", 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", "ROIImagesLocation", true);
ReadParameter(param, "Digits", "LogfileRetentionInDays", true); ReadParameter(param, "Digits", "ROIImagesRetention", true);
ReadParameter(param, "Analog", "Model", false); ReadParameter(param, "Analog", "Model", false);
ReadParameter(param, "Analog", "LogImageLocation", true); ReadParameter(param, "Analog", "ROIImagesLocation", true);
ReadParameter(param, "Analog", "LogfileRetentionInDays", true); ReadParameter(param, "Analog", "ROIImagesRetention", true);
ReadParameter(param, "PostProcessing", "PreValueUse", true); ReadParameter(param, "PostProcessing", "PreValueUse", false);
ReadParameter(param, "PostProcessing", "PreValueAgeStartup", true); ReadParameter(param, "PostProcessing", "PreValueAgeStartup", true);
ReadParameter(param, "PostProcessing", "ErrorMessage", true); ReadParameter(param, "PostProcessing", "ErrorMessage", false);
ReadParameter(param, "PostProcessing", "CheckDigitIncreaseConsistency", true); 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", "RetainMessages", false);
ReadParameter(param, "MQTT", "HomeassistantDiscovery", true); 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", "LogLevel", false);
ReadParameter(param, "Debug", "LogfileRetentionInDays", 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);

View File

@@ -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> <class id="TakeImage_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;"> <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> <class id="TakeImage_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;"> <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> <class id="TakeImage_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;"> <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> <class id="TakeImage_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;"> <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; _brightness = document.getElementById("TakeImage_Brightness_value1").value;
_contrast = document.getElementById("MakeImage_Contrast_value1").value; _contrast = document.getElementById("TakeImage_Contrast_value1").value;
_saturation = document.getElementById("MakeImage_Saturation_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("TakeImage_Brightness_value1").disabled = false;
document.getElementById("MakeImage_Contrast_value1").disabled = false; document.getElementById("TakeImage_Contrast_value1").disabled = false;
document.getElementById("MakeImage_Saturation_value1").disabled = false; document.getElementById("TakeImage_Saturation_value1").disabled = false;
document.getElementById("MakeImage_LEDIntensity_value1").disabled = false; document.getElementById("TakeImage_LEDIntensity_value1").disabled = false;
} }
else else
{ {
document.getElementById("MakeImage_Brightness_value1").type = "hidden"; document.getElementById("TakeImage_Brightness_value1").type = "hidden";
document.getElementById("MakeImage_Brightness_text").style.visibility = "hidden"; document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
} }
// if (param["MakeImage"]["Saturation"].found) // if (param["TakeImage"]["Saturation"].found)
// document.getElementById("MakeImage_Saturation_value1").disabled = false; // document.getElementById("TakeImage_Saturation_value1").disabled = false;
// if (param["MakeImage"]["Contrast"].found) // if (param["TakeImage"]["Contrast"].found)
// document.getElementById("MakeImage_Contrast_value1").disabled = false; // 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("TakeImage_Brightness_value1").disabled = true;
document.getElementById("MakeImage_Saturation_value1").disabled = true; document.getElementById("TakeImage_Saturation_value1").disabled = true;
document.getElementById("MakeImage_Contrast_value1").disabled = true; document.getElementById("TakeImage_Contrast_value1").disabled = true;
document.getElementById("MakeImage_LEDIntensity_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("TakeImage_Brightness_value1").type = "hidden";
document.getElementById("MakeImage_Brightness_text").style.visibility = "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, "TakeImage", "Brightness", false);
ReadParameter(param, "MakeImage", "Contrast", false); ReadParameter(param, "TakeImage", "Contrast", false);
ReadParameter(param, "MakeImage", "Saturation", false); ReadParameter(param, "TakeImage", "Saturation", false);
ReadParameter(param, "MakeImage", "LEDIntensity", 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["TakeImage"]["LEDIntensity"]["enabled"] = true;
param["MakeImage"]["Brightness"]["enabled"] = true; param["TakeImage"]["Brightness"]["enabled"] = true;
param["MakeImage"]["Contrast"]["enabled"] = true; param["TakeImage"]["Contrast"]["enabled"] = true;
param["MakeImage"]["Saturation"]["enabled"] = true; param["TakeImage"]["Saturation"]["enabled"] = true;
if (!param["MakeImage"]["LEDIntensity"]["found"]) if (!param["TakeImage"]["LEDIntensity"]["found"])
{ {
param["MakeImage"]["LEDIntensity"]["found"] = true; param["TakeImage"]["LEDIntensity"]["found"] = true;
param["MakeImage"]["LEDIntensity"]["value1"] = "50"; param["TakeImage"]["LEDIntensity"]["value1"] = "50";
} }
if (!param["MakeImage"]["Brightness"]["found"]) if (!param["TakeImage"]["Brightness"]["found"])
{ {
param["MakeImage"]["Brightness"]["found"] = true; param["TakeImage"]["Brightness"]["found"] = true;
param["MakeImage"]["Brightness"]["value1"] = "0"; param["TakeImage"]["Brightness"]["value1"] = "0";
} }
if (!param["MakeImage"]["Contrast"]["found"]) if (!param["TakeImage"]["Contrast"]["found"])
{ {
param["MakeImage"]["Contrast"]["found"] = true; param["TakeImage"]["Contrast"]["found"] = true;
param["MakeImage"]["Contrast"]["value1"] = "0"; param["TakeImage"]["Contrast"]["value1"] = "0";
} }
if (!param["MakeImage"]["Saturation"]["found"]) if (!param["TakeImage"]["Saturation"]["found"])
{ {
param["MakeImage"]["Saturation"]["found"] = true; param["TakeImage"]["Saturation"]["found"] = true;
param["MakeImage"]["Saturation"]["value1"] = "0"; 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, "TakeImage", "Brightness", false);
WriteParameter(param, category, "MakeImage", "Contrast", false); WriteParameter(param, category, "TakeImage", "Contrast", false);
WriteParameter(param, category, "MakeImage", "Saturation", false); WriteParameter(param, category, "TakeImage", "Saturation", false);
WriteParameter(param, category, "MakeImage", "LEDIntensity", false); WriteParameter(param, category, "TakeImage", "LEDIntensity", false);
} }

View File

@@ -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, "ROIImagesLocation");
ParamAddValue(param, catname, "LogfileRetentionInDays"); 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, "ROIImagesLocation");
ParamAddValue(param, catname, "LogfileRetentionInDays"); 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, "LogLevel");
ParamAddValue(param, catname, "LogfileRetentionInDays"); 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
// 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)
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"]["DataFilesRetention"]["found"] = true;
param["DataLogging"]["DataLogRetentionInDays"]["enabled"] = true; param["DataLogging"]["DataFilesRetention"]["enabled"] = true;
param["DataLogging"]["DataLogRetentionInDays"]["value1"] = "3"; 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"]["DataFilesRetention"]["found"] = true;
param["DataLogging"]["DataLogRetentionInDays"]["enabled"] = true; param["DataLogging"]["DataFilesRetention"]["enabled"] = true;
param["DataLogging"]["DataLogRetentionInDays"]["value1"] = "3"; param["DataLogging"]["DataFilesRetention"]["value1"] = "3";
} }
} }