diff --git a/Changelog.md b/Changelog.md index 49910fdc..0308e817 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,8 +2,6 @@ ## [Unreleased] -## [13.0.5] - 2022-12-06 - **Home Assistant MQTT Discovery Support** ### Update Procedure @@ -65,6 +63,10 @@ If anything breaks you can try to enforce manual update as following: - NEW v13.0.2: Update Tool "Logfile downloader and combiner" to handle the new csv file format. - NEW v13.0.2: MQTT: Added MQTT topic `status` (Digitalization Status), Timezone to MQTT topic `timestamp`.# - NEW v13.0.2: Logging: Disable heap logs by default, cleanup +- **NEW v13.0.5**: + - log NTP server name + - Improved log messages + - Various preparations for next release ### Fixed @@ -79,7 +81,14 @@ If anything breaks you can try to enforce manual update as following: - NEW v13.0.2: Corrected Version comparison between firmware and Web UI. - NEW v13.0.3: Re-updated build environment to v5.2.0 (from accidental downgrad to v4.4.0) - NEW v13.0.4: Fix for reboot in case of MQTT not used -- **NEW v13.0.5**: No reboot in case of missing NTP-connection +- NEW v13.0.5: No reboot in case of missing NTP-connection +- **NEW v13.0.5**: + - Prevent autoreboot on cam framebuffer init error + - Properly protect `wlan.ini` against deletion + - Fixed various MQTT topic content issues + - Fix Digit detected as 10 (https://github.com/jomjol/AI-on-the-edge-device/pull/1525) + - Fix frozen time in datafile on error + - Various minor fixes ### Removed diff --git a/code/components/jomjol_controlGPIO/server_GPIO.cpp b/code/components/jomjol_controlGPIO/server_GPIO.cpp index 1e2eab7e..ba9019f6 100644 --- a/code/components/jomjol_controlGPIO/server_GPIO.cpp +++ b/code/components/jomjol_controlGPIO/server_GPIO.cpp @@ -25,7 +25,9 @@ #include "ClassLogFile.h" #include "configFile.h" #include "Helper.h" -#include "interface_mqtt.h" +#ifdef ENABLE_MQTT + #include "interface_mqtt.h" +#endif //ENABLE_MQTT static const char *TAG = "GPIO"; QueueHandle_t gpio_queue_handle = NULL; @@ -83,12 +85,14 @@ static void gpioHandlerTask(void *arg) { } void GpioPin::gpioInterrupt(int value) { +#ifdef ENABLE_MQTT if (_mqttTopic != "") { ESP_LOGD(TAG, "gpioInterrupt %s %d", _mqttTopic.c_str(), value); - MQTTPublish(_mqttTopic, value ? "true" : "false"); - currentState = value; + MQTTPublish(_mqttTopic, value ? "true" : "false"); } +#endif //ENABLE_MQTT + currentState = value; } void GpioPin::init() @@ -114,10 +118,12 @@ void GpioPin::init() gpio_isr_handler_add(_gpio, gpio_isr_handler, (void*)&_gpio); } +#ifdef ENABLE_MQTT if ((_mqttTopic != "") && ((_mode == GPIO_PIN_MODE_OUTPUT) || (_mode == GPIO_PIN_MODE_OUTPUT_PWM) || (_mode == GPIO_PIN_MODE_BUILT_IN_FLASH_LED))) { std::function f = std::bind(&GpioPin::handleMQTT, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); MQTTregisterSubscribeFunction(_mqttTopic, f); } +#endif //ENABLE_MQTT } bool GpioPin::getValue(std::string* errorText) @@ -138,9 +144,11 @@ void GpioPin::setValue(bool value, gpio_set_source setSource, std::string* error } else { gpio_set_level(_gpio, value); +#ifdef ENABLE_MQTT if ((_mqttTopic != "") && (setSource != GPIO_SET_SOURCE_MQTT)) { MQTTPublish(_mqttTopic, value ? "true" : "false"); } +#endif //ENABLE_MQTT } } @@ -148,11 +156,14 @@ void GpioPin::publishState() { int newState = gpio_get_level(_gpio); if (newState != currentState) { ESP_LOGD(TAG,"publish state of GPIO %d new state %d", _gpio, newState); +#ifdef ENABLE_MQTT MQTTPublish(_mqttTopic, newState ? "true" : "false"); +#endif //ENABLE_MQTT currentState = newState; } } +#ifdef ENABLE_MQTT bool GpioPin::handleMQTT(std::string, char* data, int data_len) { ESP_LOGD(TAG, "GpioPin::handleMQTT data %.*s", data_len, data); @@ -174,7 +185,7 @@ bool GpioPin::handleMQTT(std::string, char* data, int data_len) { return (errorText == ""); } - +#endif //ENABLE_MQTT esp_err_t callHandleHttpRequest(httpd_req_t *req) { @@ -236,8 +247,10 @@ void GpioHandler::init() it->second->init(); } +#ifdef ENABLE_MQTT std::function f = std::bind(&GpioHandler::handleMQTTconnect, this); MQTTregisterConnectFunction("gpio-handler", f); +#endif //ENABLE_MQTT if (xHandleTaskGpio == NULL) { gpio_queue_handle = xQueueCreate(10,sizeof(GpioResult)); @@ -261,7 +274,7 @@ void GpioHandler::taskHandler() { } } - +#ifdef ENABLE_MQTT void GpioHandler::handleMQTTconnect() { if (gpioMap != NULL) { @@ -271,9 +284,12 @@ void GpioHandler::handleMQTTconnect() } } } +#endif //ENABLE_MQTT void GpioHandler::deinit() { +#ifdef ENABLE_MQTT MQTTunregisterConnectFunction("gpio-handler"); +#endif //ENABLE_MQTT clear(); if (xHandleTaskGpio != NULL) { vTaskDelete(xHandleTaskGpio); @@ -316,6 +332,7 @@ bool GpioHandler::readConfig() // ESP_LOGD(TAG, "readConfig - Start 3"); +#ifdef ENABLE_MQTT // std::string mainTopicMQTT = ""; std::string mainTopicMQTT = GetMQTTMainTopic(); if (mainTopicMQTT.length() > 0) @@ -323,7 +340,7 @@ bool GpioHandler::readConfig() mainTopicMQTT = mainTopicMQTT + "/GPIO"; ESP_LOGD(TAG, "MAINTOPICMQTT found"); } - +#endif // ENABLE_MQTT bool registerISR = false; while (configFile.getNextLine(&line, disabledLine, eof) && !configFile.isNewParagraph(line)) { @@ -345,7 +362,9 @@ bool GpioHandler::readConfig() gpio_pin_mode_t pinMode = resolvePinMode(toLower(zerlegt[1])); gpio_int_type_t intType = resolveIntType(toLower(zerlegt[2])); uint16_t dutyResolution = (uint8_t)atoi(zerlegt[3].c_str()); +#ifdef ENABLE_MQTT bool mqttEnabled = toLower(zerlegt[4]) == "true"; +#endif // ENABLE_MQTT bool httpEnabled = toLower(zerlegt[5]) == "true"; char gpioName[100]; if (zerlegt.size() >= 7) { @@ -353,7 +372,11 @@ bool GpioHandler::readConfig() } else { sprintf(gpioName, "GPIO%d", gpioNr); } +#ifdef ENABLE_MQTT std::string mqttTopic = mqttEnabled ? (mainTopicMQTT + "/" + gpioName) : ""; +#else // ENABLE_MQTT + std::string mqttTopic = ""; +#endif // ENABLE_MQTT GpioPin* gpioPin = new GpioPin(gpioNr, gpioName, pinMode, intType,dutyResolution, mqttTopic, httpEnabled); (*gpioMap)[gpioNr] = gpioPin; @@ -682,3 +705,4 @@ GpioHandler* gpio_handler_get() { return gpioHandler; } + diff --git a/code/components/jomjol_controlGPIO/server_GPIO.h b/code/components/jomjol_controlGPIO/server_GPIO.h index 074b08af..6f104603 100644 --- a/code/components/jomjol_controlGPIO/server_GPIO.h +++ b/code/components/jomjol_controlGPIO/server_GPIO.h @@ -45,7 +45,9 @@ public: void init(); bool getValue(std::string* errorText); void setValue(bool value, gpio_set_source setSource, std::string* errorText); +#ifdef ENABLE_MQTT bool handleMQTT(std::string, char* data, int data_len); +#endif //ENABLE_MQTT void publishState(); void gpioInterrupt(int value); gpio_int_type_t getInterruptType() { return _interruptType; } @@ -77,7 +79,9 @@ public: void gpioInterrupt(GpioResult* gpioResult); void flashLightEnable(bool value); bool isEnabled() { return _isEnabled; } +#ifdef ENABLE_MQTT void handleMQTTconnect(); +#endif //ENABLE_MQTT private: std::string _configFile; @@ -109,4 +113,5 @@ GpioHandler* gpio_handler_get(); -#endif //SERVER_GPIO_H \ No newline at end of file +#endif //SERVER_GPIO_H + diff --git a/code/components/jomjol_fileserver_ota/server_file.cpp b/code/components/jomjol_fileserver_ota/server_file.cpp index 6058245e..ac2c5d72 100644 --- a/code/components/jomjol_fileserver_ota/server_file.cpp +++ b/code/components/jomjol_fileserver_ota/server_file.cpp @@ -39,7 +39,9 @@ extern "C" { #include "server_tflite.h" #include "server_help.h" -#include "interface_mqtt.h" +#ifdef ENABLE_MQTT + #include "interface_mqtt.h" +#endif //ENABLE_MQTT #include "server_GPIO.h" #include "Helper.h" @@ -219,7 +221,7 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const ESP_LOGD(TAG, "entrypath: <%s>", entrypath); if (!dir) { - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat dir: %s", dirpath); + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat dir: " + std::string(dirpath) + "!"); /* Respond with 404 Not Found */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); return ESP_FAIL; @@ -361,7 +363,7 @@ static esp_err_t send_datafile(httpd_req_t *req, bool send_full_file) fd = OpenFileAndWait(currentfilename.c_str(), "r"); if (!fd) { - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: %s", filepath); + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: " + std::string(filepath) +"!"); /* Respond with 404 Error */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); return ESP_FAIL; @@ -446,7 +448,7 @@ static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file) fd = OpenFileAndWait(currentfilename.c_str(), "r"); if (!fd) { - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: %s", filepath); + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: " + std::string(filepath) +"!"); /* Respond with 404 Error */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); return ESP_FAIL; @@ -566,7 +568,7 @@ static esp_err_t download_get_handler(httpd_req_t *req) /* If file not present on SPIFFS check if URI * corresponds to one of the hardcoded paths */ - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat file: %s!", filepath); + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat file: " + std::string(filepath) + "!"); /* Respond with 404 Not Found */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); return ESP_FAIL; @@ -574,7 +576,7 @@ static esp_err_t download_get_handler(httpd_req_t *req) fd = OpenFileAndWait(filepath, "r"); if (!fd) { - LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: %s!", filepath); + LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to read existing file: " + std::string(filepath) +"!"); /* Respond with 404 Error */ httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); return ESP_FAIL; @@ -831,6 +833,12 @@ static esp_err_t delete_post_handler(httpd_req_t *req) return ESP_FAIL; } + if (strcmp(filename, "wlan.ini") == 0) { + ESP_LOGE(TAG, "Trying to delete protected file : %s", filename); + httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Not allowed to delete wlan.ini"); + return ESP_FAIL; + } + if (stat(filepath, &file_stat) == -1) { ESP_LOGE(TAG, "File does not exist: %s", filename); /* Respond with 400 Bad Request */ diff --git a/code/components/jomjol_flowcontroll/ClassFlow.cpp b/code/components/jomjol_flowcontroll/ClassFlow.cpp index 89c5b9b0..48f7fdd6 100644 --- a/code/components/jomjol_flowcontroll/ClassFlow.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlow.cpp @@ -5,7 +5,7 @@ #include #include "esp_log.h" -static const char *TAG = "FLOW CLASS"; +static const char *TAG = "CLASS"; void ClassFlow::SetInitialParameter(void) diff --git a/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp b/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp index 3033ad85..f68f721f 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowAlignment.cpp @@ -9,7 +9,7 @@ #include "ClassLogFile.h" -static const char *TAG = "FLOW ALIGN"; +static const char *TAG = "ALIGN"; bool AlignmentExtendedDebugging = true; diff --git a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp b/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp index 2b1a15b1..800e75ec 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp @@ -177,7 +177,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, result = (ergebnis_vorkomma + 1) % 10; else // Akt. digit und Vorgänger haben Nulldurchgang - result = ergebnis_vorkomma; + result = ergebnis_vorkomma % 10; LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) + " zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe)); return result; @@ -191,7 +191,7 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, // Vorlauf (else - Zweig) passiert nicht bereits ab 9. if (DigitalUebergangsbereichVorlauf>=zahl_vorgaenger || ergebnis_nachkomma >= 4) // aktuelles digit hat genauso wie das Vorgängerdigit noch keinen Nulldurchgang. - result = ergebnis_vorkomma; + result = ergebnis_vorkomma % 10; else // aktuelles digit läuft dem kleineren digit (9.x) vor. Also schon >=x.0 während das vorherige Digit noch // keinen Nulldurchgang hat. Daher wird um 1 reduziert. @@ -211,7 +211,8 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor bool roundedUp = false; // Innerhalb der digitalen Unschaefe - if (ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10)) { // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht + if ((ergebnis_nachkomma >= (10-DigitalUnschaerfe * 10)) // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht + || (eval_vorgaenger <= 4 && ergebnis_nachkomma>=6)) { // oder digit läuft nach (analog =0..4, digit >=6) result = (int) (round(zahl) + 10) % 10; roundedUp = true; // vor/nachkomma neu berechnen, da wir anhand der Unschaefe die Zahl anpassen. @@ -230,11 +231,7 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor // Kein Nulldurchgang hat stattgefunden. // Nur eval_vorgaenger verwendet, da ziffer_vorgaenger hier falsch sein könnte. // ziffer_vorgaenger<=0.1 & eval_vorgaenger=9 entspricht analog wurde zurückgesetzt wegen vorhergehender analog, die noch nicht auf 0 sind. - if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp) - // digit läuft dem Analog vor. Darf aber erst passieren, wenn - // digit wirklich schnon los läuft, deshalb 9 - || (eval_vorgaenger>9 && ziffer_vorgaenger>analogDigitalTransitionStart && ergebnis_nachkomma<=1)) - + if ((eval_vorgaenger>=6 && (ziffer_vorgaenger>analogDigitalTransitionStart || ziffer_vorgaenger<=0.2) && roundedUp)) { result = ((ergebnis_vorkomma+10) - 1) % 10; LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ZeigerEvalAnalogToDigitNeu - Nulldurchgang noch nicht stattgefunden = " + std::to_string(result) + @@ -623,19 +620,22 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) } tflite->MakeAllocate(); - for (int _ana = 0; _ana < GENERAL.size(); ++_ana) + for (int n = 0; n < GENERAL.size(); ++n) // For each NUMBER { - for (int i = 0; i < GENERAL[_ana]->ROI.size(); ++i) + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Processing Number '" + GENERAL[n]->name + "'"); + for (int roi = 0; roi < GENERAL[n]->ROI.size(); ++roi) // For each ROI { - ESP_LOGD(TAG, "General %d - TfLite", i); + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "ROI #" + std::to_string(roi) + " - TfLite"); + //ESP_LOGD(TAG, "General %d - TfLite", i); switch (CNNType) { case Analogue: + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Analogue"); { float f1, f2; f1 = 0; f2 = 0; - tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image); + tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image); tflite->Invoke(); LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Nach Invoke"); @@ -643,39 +643,41 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) f2 = tflite->GetOutputValue(1); float result = fmod(atan2(f1, f2) / (M_PI * 2) + 2, 1); - if(GENERAL[_ana]->ROI[i]->CCW) - GENERAL[_ana]->ROI[i]->result_float = 10 - (result * 10); + if(GENERAL[n]->ROI[roi]->CCW) + GENERAL[n]->ROI[roi]->result_float = 10 - (result * 10); else - GENERAL[_ana]->ROI[i]->result_float = result * 10; + GENERAL[n]->ROI[roi]->result_float = result * 10; - ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", i, GENERAL[_ana]->ROI[i]->CCW, GENERAL[_ana]->ROI[i]->result_float); + ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float); if (isLogImage) - LogImage(logPath, GENERAL[_ana]->ROI[i]->name, &GENERAL[_ana]->ROI[i]->result_float, NULL, time, GENERAL[_ana]->ROI[i]->image_org); + LogImage(logPath, GENERAL[n]->ROI[roi]->name, &GENERAL[n]->ROI[roi]->result_float, NULL, time, GENERAL[n]->ROI[roi]->image_org); } break; case Digital: + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digital"); { - GENERAL[_ana]->ROI[i]->result_klasse = 0; - GENERAL[_ana]->ROI[i]->result_klasse = tflite->GetClassFromImageBasis(GENERAL[_ana]->ROI[i]->image); - ESP_LOGD(TAG, "Result General(Digit)%i: %d", i, GENERAL[_ana]->ROI[i]->result_klasse); + GENERAL[n]->ROI[roi]->result_klasse = 0; + GENERAL[n]->ROI[roi]->result_klasse = tflite->GetClassFromImageBasis(GENERAL[n]->ROI[roi]->image); + ESP_LOGD(TAG, "Result General(Digit)%i: %d", roi, GENERAL[n]->ROI[roi]->result_klasse); if (isLogImage) { - string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name; + string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name; if (isLogImageSelect) { - if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos) - LogImage(logPath, _imagename, NULL, &GENERAL[_ana]->ROI[i]->result_klasse, time, GENERAL[_ana]->ROI[i]->image_org); + if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) + LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org); } else { - LogImage(logPath, _imagename, NULL, &GENERAL[_ana]->ROI[i]->result_klasse, time, GENERAL[_ana]->ROI[i]->image_org); + LogImage(logPath, _imagename, NULL, &GENERAL[n]->ROI[roi]->result_klasse, time, GENERAL[n]->ROI[roi]->image_org); } } } break; /* case DigitalHyprid: { + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DigitalHyprid"); int _num, _nachkomma; tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image); @@ -716,6 +718,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) /* case DigitalHyprid10: { + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DigitalHyprid10"); int _num, _nachkomma; tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image); @@ -753,12 +756,13 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) case DoubleHyprid10: { + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: DoubleHyprid10"); int _num, _numplus, _numminus; float _val, _valplus, _valminus; float _fit; float _result_save_file; - tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image); + tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image); tflite->Invoke(); LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Nach Invoke"); @@ -798,7 +802,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) if (_fit < CNNGoodThreshold) { - GENERAL[_ana]->ROI[i]->isReject = true; + GENERAL[n]->ROI[roi]->isReject = true; result = -1; _result_save_file+= 100; // Für den Fall, dass fit nicht ausreichend, soll trotzdem das Ergebnis mit "-10x.y" abgespeichert werden. string zw = "Value Rejected due to Threshold (Fit: " + to_string(_fit) + "Threshold: " + to_string(CNNGoodThreshold) + ")"; @@ -806,24 +810,24 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) } else { - GENERAL[_ana]->ROI[i]->isReject = false; + GENERAL[n]->ROI[roi]->isReject = false; } - GENERAL[_ana]->ROI[i]->result_float = result; - ESP_LOGD(TAG, "Result General(Analog)%i: %f", i, GENERAL[_ana]->ROI[i]->result_float); + GENERAL[n]->ROI[roi]->result_float = result; + ESP_LOGD(TAG, "Result General(Analog)%i: %f", roi, GENERAL[n]->ROI[roi]->result_float); if (isLogImage) { - string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name; + string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name; if (isLogImageSelect) { - if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos) - LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org); + if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) + LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org); } else { - LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org); + LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org); } } } @@ -831,37 +835,38 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time) case Digital100: case Analogue100: { + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "CNN Type: Digital100 or Analogue100"); int _num; float _result_save_file; - tflite->LoadInputImageBasis(GENERAL[_ana]->ROI[i]->image); + tflite->LoadInputImageBasis(GENERAL[n]->ROI[roi]->image); tflite->Invoke(); _num = tflite->GetOutClassification(); - if(GENERAL[_ana]->ROI[i]->CCW) - GENERAL[_ana]->ROI[i]->result_float = 10 - ((float)_num / 10.0); + if(GENERAL[n]->ROI[roi]->CCW) + GENERAL[n]->ROI[roi]->result_float = 10 - ((float)_num / 10.0); else - GENERAL[_ana]->ROI[i]->result_float = (float)_num / 10.0; + GENERAL[n]->ROI[roi]->result_float = (float)_num / 10.0; - _result_save_file = GENERAL[_ana]->ROI[i]->result_float; + _result_save_file = GENERAL[n]->ROI[roi]->result_float; - GENERAL[_ana]->ROI[i]->isReject = false; + GENERAL[n]->ROI[roi]->isReject = false; - ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", i, GENERAL[_ana]->ROI[i]->CCW, GENERAL[_ana]->ROI[i]->result_float); + ESP_LOGD(TAG, "Result General(Analog)%i - CCW: %d - %f", roi, GENERAL[n]->ROI[roi]->CCW, GENERAL[n]->ROI[roi]->result_float); if (isLogImage) { - string _imagename = GENERAL[_ana]->name + "_" + GENERAL[_ana]->ROI[i]->name; + string _imagename = GENERAL[n]->name + "_" + GENERAL[n]->ROI[roi]->name; if (isLogImageSelect) { - if (LogImageSelect.find(GENERAL[_ana]->ROI[i]->name) != std::string::npos) - LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org); + if (LogImageSelect.find(GENERAL[n]->ROI[roi]->name) != std::string::npos) + LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org); } else { - LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[_ana]->ROI[i]->image_org); + LogImage(logPath, _imagename, &_result_save_file, NULL, time, GENERAL[n]->ROI[roi]->image_org); } } diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp index 714a72a0..ed5459da 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp @@ -19,9 +19,10 @@ extern "C" { #include "time_sntp.h" #include "Helper.h" #include "server_ota.h" -#include "interface_mqtt.h" -#include "server_mqtt.h" - +#ifdef ENABLE_MQTT + #include "interface_mqtt.h" + #include "server_mqtt.h" +#endif //ENABLE_MQTT //#include "CImg.h" @@ -29,7 +30,7 @@ extern "C" { //#define DEBUG_DETAIL_ON -static const char* TAG = "FLOW CTRL"; +static const char* TAG = "CTRL"; std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _host){ @@ -50,12 +51,17 @@ std::string ClassFlowControll::doSingleStep(std::string _stepname, std::string _ if ((_stepname.compare("[Analog]") == 0) || (_stepname.compare(";[Analog]") == 0)){ _classname = "ClassFlowCNNGeneral"; } +#ifdef ENABLE_MQTT if ((_stepname.compare("[MQTT]") == 0) || (_stepname.compare(";[MQTT]") == 0)){ _classname = "ClassFlowMQTT"; } +#endif //ENABLE_MQTT + +#ifdef ENABLE_INFLUXDB if ((_stepname.compare("[InfluxDB]") == 0) || (_stepname.compare(";[InfluxDB]") == 0)){ _classname = "ClassFlowInfluxDB"; } +#endif //ENABLE_INFLUXDB for (int i = 0; i < FlowControll.size(); ++i) if (FlowControll[i]->name().compare(_classname) == 0){ @@ -78,14 +84,18 @@ std::string ClassFlowControll::TranslateAktstatus(std::string _input) return ("Aligning"); if (_input.compare("ClassFlowCNNGeneral") == 0) return ("Digitalization of ROIs"); +#ifdef ENABLE_MQTT if (_input.compare("ClassFlowMQTT") == 0) return ("Sending MQTT"); +#endif //ENABLE_MQTT +#ifdef ENABLE_INFLUXDB if (_input.compare("ClassFlowInfluxDB") == 0) return ("Sending InfluxDB"); +#endif //ENABLE_INFLUXDB if (_input.compare("ClassFlowPostProcessing") == 0) - return ("Processing"); + return ("Post-Processing"); if (_input.compare("ClassFlowWriteList") == 0) - return ("Processing"); + return ("Writing List"); return "Unkown Status"; } @@ -130,7 +140,7 @@ t_CNNType ClassFlowControll::GetTypeAnalog() - +#ifdef ENABLE_MQTT string ClassFlowControll::GetMQTTMainTopic() { for (int i = 0; i < FlowControll.size(); ++i) @@ -149,7 +159,7 @@ bool ClassFlowControll::StartMQTTService() { } return false; } - +#endif //ENABLE_MQTT void ClassFlowControll::SetInitialParameter(void) { @@ -196,12 +206,14 @@ ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type) cfc = new ClassFlowCNNGeneral(flowalignment); flowdigit = (ClassFlowCNNGeneral*) cfc; } +#ifdef ENABLE_MQTT if (toUpper(_type).compare("[MQTT]") == 0) cfc = new ClassFlowMQTT(&FlowControll); - +#endif //ENABLE_MQTT +#ifdef ENABLE_INFLUXDB if (toUpper(_type).compare("[INFLUXDB]") == 0) cfc = new ClassFlowInfluxDB(&FlowControll); - +#endif //ENABLE_INFLUXDB if (toUpper(_type).compare("[WRITELIST]") == 0) cfc = new ClassFlowWriteList(&FlowControll); @@ -287,7 +299,9 @@ void ClassFlowControll::doFlowMakeImageOnly(string time){ zw_time = gettimestring("%H:%M:%S"); std::string flowStatus = TranslateAktstatus(FlowControll[i]->name()); aktstatus = flowStatus + " (" + zw_time + ")"; +#ifdef ENABLE_MQTT MQTTPublish(mqttServer_getMainTopic() + "/" + "status", flowStatus, false); +#endif //ENABLE_MQTT FlowControll[i]->doFlow(time); } @@ -317,7 +331,9 @@ bool ClassFlowControll::doFlow(string time) zw_time = gettimestring("%H:%M:%S"); std::string flowStatus = TranslateAktstatus(FlowControll[i]->name()); aktstatus = flowStatus + " (" + zw_time + ")"; +#ifdef ENABLE_MQTT MQTTPublish(mqttServer_getMainTopic() + "/" + "status", flowStatus, false); +#endif //ENABLE_MQTT string zw = "FlowControll.doFlow - " + FlowControll[i]->name(); #ifdef DEBUG_DETAIL_ON @@ -348,7 +364,9 @@ bool ClassFlowControll::doFlow(string time) zw_time = gettimestring("%H:%M:%S"); std::string flowStatus = "Flow finished"; aktstatus = flowStatus + " (" + zw_time + ")"; +#ifdef ENABLE_MQTT MQTTPublish(mqttServer_getMainTopic() + "/" + "status", flowStatus, false); +#endif //ENABLE_MQTT return result; } @@ -701,7 +719,7 @@ string ClassFlowControll::getNumbersName() return flowpostprocessing->getNumbersName(); } -string ClassFlowControll::getJSON(std::string _id, std::string _mac) +string ClassFlowControll::getJSON() { - return flowpostprocessing->GetJSON(_id, _mac); + return flowpostprocessing->GetJSON(); } diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.h b/code/components/jomjol_flowcontroll/ClassFlowControll.h index 026e30b1..2113c91b 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.h +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.h @@ -1,3 +1,5 @@ + + #ifndef __FLOWCONTROLL__ #define __FLOWCONTROLL__ @@ -8,8 +10,12 @@ #include "ClassFlowAlignment.h" #include "ClassFlowCNNGeneral.h" #include "ClassFlowPostProcessing.h" -#include "ClassFlowMQTT.h" -#include "ClassFlowInfluxDB.h" +#ifdef ENABLE_MQTT + #include "ClassFlowMQTT.h" +#endif //ENABLE_MQTT +#ifdef ENABLE_INFLUXDB + #include "ClassFlowInfluxDB.h" +#endif //ENABLE_INFLUXDB #include "ClassFlowCNNGeneral.h" #include "ClassFlowWriteList.h" @@ -50,12 +56,13 @@ public: string UpdatePrevalue(std::string _newvalue, std::string _numbers, bool _extern); string GetPrevalue(std::string _number = ""); bool ReadParameter(FILE* pfile, string& aktparamgraph); - string getJSON(std::string _id = "", std::string _mac = ""); + string getJSON(); string getNumbersName(); string TranslateAktstatus(std::string _input); - +#ifdef ENABLE_MQTT string GetMQTTMainTopic(); +#endif //ENABLE_MQTT esp_err_t GetJPGStream(std::string _fn, httpd_req_t *req); esp_err_t SendRawJPG(httpd_req_t *req); @@ -71,7 +78,9 @@ public: t_CNNType GetTypeDigital(); t_CNNType GetTypeAnalog(); +#ifdef ENABLE_MQTT bool StartMQTTService(); +#endif //ENABLE_MQTT int CleanTempFolder(); @@ -81,3 +90,4 @@ public: #endif + diff --git a/code/components/jomjol_flowcontroll/ClassFlowImage.cpp b/code/components/jomjol_flowcontroll/ClassFlowImage.cpp index 2343dd06..0816a42d 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowImage.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowImage.cpp @@ -16,7 +16,7 @@ extern "C" { #include "CImageBasis.h" #include "esp_log.h" -static const char* TAG = "FLOW IMG"; +static const char* TAG = "IMG"; ClassFlowImage::ClassFlowImage(const char* logTag) { diff --git a/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.cpp b/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.cpp index 5ced8538..f9406dca 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.cpp @@ -1,3 +1,4 @@ +#ifdef ENABLE_INFLUXDB #include #include "ClassFlowInfluxDB.h" #include "Helper.h" @@ -5,6 +6,7 @@ #include "time_sntp.h" #include "interface_influxdb.h" + #include "ClassFlowPostProcessing.h" #include "esp_log.h" @@ -162,3 +164,5 @@ bool ClassFlowInfluxDB::doFlow(string zwtime) return true; } + +#endif //ENABLE_INFLUXDB \ No newline at end of file diff --git a/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.h b/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.h index b7e25362..f1a0c1e5 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.h +++ b/code/components/jomjol_flowcontroll/ClassFlowInfluxDB.h @@ -1,3 +1,4 @@ +#ifdef ENABLE_INFLUXDB #pragma once #include "ClassFlow.h" @@ -29,3 +30,4 @@ public: string name(){return "ClassFlowInfluxDB";}; }; +#endif //ENABLE_INFLUXDB \ No newline at end of file diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 60f82d32..c7078831 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -1,3 +1,5 @@ +#ifdef ENABLE_MQTT + #include #include #include "ClassFlowMQTT.h" @@ -17,7 +19,7 @@ #define __HIDE_PASSWORD -static const char *TAG = "FLOW MQTT"; +static const char *TAG = "MQTT"; #define LWT_TOPIC "connection" #define LWT_CONNECTED "connected" #define LWT_DISCONNECTED "connection lost" @@ -239,7 +241,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) { std::vector* NUMBERS = flowpostprocessing->GetNumbers(); - LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Publishing MQTT topics..."); + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Publishing MQTT topics..."); for (int i = 0; i < (*NUMBERS).size(); ++i) { @@ -288,26 +290,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) if (resulttimestamp.length() > 0) MQTTPublish(namenumber + "timestamp", resulttimestamp, SetRetainFlag); - std::string json = ""; - - if (result.length() > 0) - json += "{\"value\": "+result; - else - json += "{\"value\": \"\""; - - json += ", \"raw\": \""+resultraw; - - json += ", \"pre\": \"" + resultpre; - - json += "\", \"error\": \""+resulterror; - - if (resultrate.length() > 0) - json += "\", \"rate\": "+resultrate; - else - json += "\", \"rate\": \"\""; - - json += ", \"timestamp\": \""+resulttimestamp+"\"}"; - + std::string json = flowpostprocessing->getJsonFromNumber(i, "\n"); MQTTPublish(namenumber + "json", json, SetRetainFlag); } } @@ -333,3 +316,6 @@ bool ClassFlowMQTT::doFlow(string zwtime) return true; } + + +#endif //ENABLE_MQTT \ No newline at end of file diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index 04526518..5cac478b 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -1,3 +1,4 @@ +#ifdef ENABLE_MQTT #pragma once #include "ClassFlow.h" @@ -33,3 +34,4 @@ public: string name(){return "ClassFlowMQTT";}; }; +#endif //ENABLE_MQTT \ No newline at end of file diff --git a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp index a4da2cea..21a3738e 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp @@ -12,7 +12,7 @@ #include "esp_log.h" -static const char* TAG = "FLOW POSTPROC"; +static const char* TAG = "POSTPROC"; //#define SERIAL_DEBUG // testing debug on serial enabled @@ -37,42 +37,51 @@ std::string ClassFlowPostProcessing::getNumbersName() return ret; } -std::string ClassFlowPostProcessing::GetJSON(std::string _id, std::string _mac, std::string _lineend) +std::string ClassFlowPostProcessing::GetJSON(std::string _lineend) { std::string json="{" + _lineend; for (int i = 0; i < NUMBERS.size(); ++i) { json += "\"" + NUMBERS[i]->name + "\":" + _lineend; - json += " {" + _lineend; - if (_id.length() > 0) - json += " \"ID\": \"" + _id + "\"," + _lineend; - if (_mac.length() > 0) - json += " \"MAC\": \"" + _mac + "\"," + _lineend; + json += getJsonFromNumber(i, _lineend) + _lineend; - if (NUMBERS[i]->ReturnValue.length() > 0) - json += " \"value\": \"" + NUMBERS[i]->ReturnValue + "\"," + _lineend; - else - json += " \"value\": \"\"," + _lineend; - json += " \"raw\": \"" + NUMBERS[i]->ReturnRawValue + "\"," + _lineend; - json += " \"error\": \"" + NUMBERS[i]->ErrorMessageText + "\"," + _lineend; - if (NUMBERS[i]->ReturnRateValue.length() > 0) - json += " \"rate\": " + NUMBERS[i]->ReturnRateValue + "," + _lineend; - else - json += " \"rate\": \"\"," + _lineend; - - json += " \"timestamp\": \"" + NUMBERS[i]->timeStamp + "\"" + _lineend; if ((i+1) < NUMBERS.size()) - json += " }," + _lineend; - else - json += " }" + _lineend; + json += "," + _lineend; } json += "}"; return json; } + +string ClassFlowPostProcessing::getJsonFromNumber(int i, std::string _lineend) { + std::string json = ""; + + json += " {" + _lineend; + + if (NUMBERS[i]->ReturnValue.length() > 0) + json += " \"value\": \"" + NUMBERS[i]->ReturnValue + "\"," + _lineend; + else + json += " \"value\": \"\"," + _lineend; + + json += " \"raw\": \"" + NUMBERS[i]->ReturnRawValue + "\"," + _lineend; + json += " \"pre\": \"" + NUMBERS[i]->ReturnPreValue + "\"," + _lineend; + json += " \"error\": \"" + NUMBERS[i]->ErrorMessageText + "\"," + _lineend; + + if (NUMBERS[i]->ReturnRateValue.length() > 0) + json += " \"rate\": \"" + NUMBERS[i]->ReturnRateValue + "\"," + _lineend; + else + json += " \"rate\": \"\"," + _lineend; + + json += " \"timestamp\": \"" + NUMBERS[i]->timeStamp + "\"" + _lineend; + json += " }" + _lineend; + + return json; +} + + string ClassFlowPostProcessing::GetPreValue(std::string _number) { std::string result; @@ -698,6 +707,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) NUMBERS[j]->ReturnValue = ""; NUMBERS[j]->ErrorMessageText = ""; NUMBERS[j]->Value = -1; + NUMBERS[j]->lastvalue = imagetime; UpdateNachkommaDecimalShift(); @@ -752,6 +762,8 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) } else { + string _zw = NUMBERS[j]->name + ": Raw: " + NUMBERS[j]->ReturnRawValue + ", Value: " + NUMBERS[j]->ReturnValue + ", Status: " + NUMBERS[j]->ErrorMessageText; + LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); WriteDataLog(j); continue; // es gibt keinen Zahl, da noch ein N vorhanden ist. } @@ -809,6 +821,9 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) NUMBERS[j]->ErrorMessageText = NUMBERS[j]->ErrorMessageText + "Neg. Rate - Read: " + zwvalue + " - Raw: " + NUMBERS[j]->ReturnRawValue + " - Pre: " + RundeOutput(NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma) + " "; NUMBERS[j]->Value = NUMBERS[j]->PreValue; NUMBERS[j]->ReturnValue = ""; + + string _zw = NUMBERS[j]->name + ": Raw: " + NUMBERS[j]->ReturnRawValue + ", Value: " + NUMBERS[j]->ReturnValue + ", Status: " + NUMBERS[j]->ErrorMessageText; + LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); WriteDataLog(j); continue; } @@ -837,6 +852,9 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) NUMBERS[j]->Value = NUMBERS[j]->PreValue; NUMBERS[j]->ReturnValue = ""; NUMBERS[j]->ReturnRateValue = ""; + + string _zw = NUMBERS[j]->name + ": Raw: " + NUMBERS[j]->ReturnRawValue + ", Value: " + NUMBERS[j]->ReturnValue + ", Status: " + NUMBERS[j]->ErrorMessageText; + LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); WriteDataLog(j); continue; } @@ -844,8 +862,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) #ifdef SERIAL_DEBUG ESP_LOGD(TAG, "After MaxRateCheck: Value %f", NUMBERS[j]->Value); #endif - NUMBERS[j]->ReturnChangeAbsolute = RundeOutput(NUMBERS[j]->Value - NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma); - NUMBERS[j]->lastvalue = imagetime; + NUMBERS[j]->ReturnChangeAbsolute = RundeOutput(NUMBERS[j]->Value - NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma); NUMBERS[j]->PreValue = NUMBERS[j]->Value; NUMBERS[j]->PreValueOkay = true; @@ -856,9 +873,9 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) NUMBERS[j]->ErrorMessageText = "no error"; UpdatePreValueINI = true; - string _zw = "PostProcessing - Raw: " + NUMBERS[j]->ReturnRawValue + " Value: " + NUMBERS[j]->ReturnValue + " Error: " + NUMBERS[j]->ErrorMessageText; + string _zw = NUMBERS[j]->name + ": Raw: " + NUMBERS[j]->ReturnRawValue + ", Value: " + NUMBERS[j]->ReturnValue + ", Status: " + NUMBERS[j]->ErrorMessageText; ESP_LOGD(TAG, "%s", zw.c_str()); - LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, _zw); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); WriteDataLog(j); } diff --git a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h index 27a26d53..5ae5e08c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h +++ b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.h @@ -61,10 +61,11 @@ public: string getReadoutRate(int _number = 0); string getReadoutTimeStamp(int _number = 0); void SavePreValue(); + string getJsonFromNumber(int i, std::string _lineend); string GetPreValue(std::string _number = ""); void SetPreValue(double zw, string _numbers, bool _extern = false); - std::string GetJSON(std::string _id = "", std::string _mac = "", std::string _lineend = "\n"); + std::string GetJSON(std::string _lineend = "\n"); std::string getNumbersName(); void UpdateNachkommaDecimalShift(); diff --git a/code/components/jomjol_influxdb/interface_influxdb.cpp b/code/components/jomjol_influxdb/interface_influxdb.cpp index ab20259e..7120f607 100644 --- a/code/components/jomjol_influxdb/interface_influxdb.cpp +++ b/code/components/jomjol_influxdb/interface_influxdb.cpp @@ -1,3 +1,4 @@ +#ifdef ENABLE_INFLUXDB #include "interface_influxdb.h" //#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG @@ -111,4 +112,4 @@ void InfluxDBInit(std::string _uri, std::string _database, std::string _measurem void InfluxDBdestroy() { } - +#endif //ENABLE_INFLUXDB diff --git a/code/components/jomjol_influxdb/interface_influxdb.h b/code/components/jomjol_influxdb/interface_influxdb.h index 33ae0564..581c0ec2 100644 --- a/code/components/jomjol_influxdb/interface_influxdb.h +++ b/code/components/jomjol_influxdb/interface_influxdb.h @@ -1,3 +1,4 @@ +#ifdef ENABLE_INFLUXDB #ifndef INTERFACE_INFLUXDB_H #define INTERFACE_INFLUXDB_H @@ -11,3 +12,4 @@ void InfluxDBdestroy(); void InfluxDBPublish(std::string _key, std::string _content, std::string _timestamp); #endif //INTERFACE_INFLUXDB_H +#endif //ENABLE_INFLUXDB \ No newline at end of file diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 53b4eb53..4d9c80fd 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -1,3 +1,4 @@ +#ifdef ENABLE_MQTT #include "interface_mqtt.h" //#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG @@ -346,3 +347,4 @@ void MQTTdestroySubscribeFunction(){ subscribeFunktionMap = NULL; } } +#endif //ENABLE_MQTT \ No newline at end of file diff --git a/code/components/jomjol_mqtt/interface_mqtt.h b/code/components/jomjol_mqtt/interface_mqtt.h index 514a93e2..e79fa8c7 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.h +++ b/code/components/jomjol_mqtt/interface_mqtt.h @@ -1,3 +1,4 @@ +#ifdef ENABLE_MQTT #ifndef INTERFACE_MQTT_H #define INTERFACE_MQTT_H @@ -22,5 +23,5 @@ void MQTTdestroySubscribeFunction(); void MQTTconnected(); void MQTTdisable(); - -#endif //INTERFACE_MQTT_H \ No newline at end of file +#endif //INTERFACE_MQTT_H +#endif //#ENABLE_MQTT diff --git a/code/components/jomjol_mqtt/server_mqtt.cpp b/code/components/jomjol_mqtt/server_mqtt.cpp index 2c989e34..2ad4003a 100644 --- a/code/components/jomjol_mqtt/server_mqtt.cpp +++ b/code/components/jomjol_mqtt/server_mqtt.cpp @@ -1,3 +1,4 @@ +#ifdef ENABLE_MQTT #include #include #include @@ -155,7 +156,7 @@ void MQTThomeassistantDiscovery() { sendHomeAssistantDiscoveryTopic(group, "rate_per_digitalization_round", "Change since last digitalization round", "arrow-expand-vertical", valueUnit, "", "measurement", ""); // correctly the Unit is Uint/Interval! sendHomeAssistantDiscoveryTopic(group, "timestamp", "Timestamp", "clock-time-eight-outline", "", "timestamp", "", "diagnostic"); sendHomeAssistantDiscoveryTopic(group, "json", "JSON", "code-json", "", "", "", "diagnostic"); - sendHomeAssistantDiscoveryTopic(group, "problem", "Problem", "alert-outline", "", "", "", ""); // Special binary sensor which is based on error topic + sendHomeAssistantDiscoveryTopic(group, "problem", "Problem", "alert-outline", "", "problem", "", ""); // Special binary sensor which is based on error topic } } @@ -243,3 +244,5 @@ void mqttServer_setMainTopic( std::string _maintopic) { std::string mqttServer_getMainTopic() { return maintopic; } + +#endif //ENABLE_MQTT \ No newline at end of file diff --git a/code/components/jomjol_mqtt/server_mqtt.h b/code/components/jomjol_mqtt/server_mqtt.h index 64ae4c2a..f96e107a 100644 --- a/code/components/jomjol_mqtt/server_mqtt.h +++ b/code/components/jomjol_mqtt/server_mqtt.h @@ -1,3 +1,5 @@ +#ifdef ENABLE_MQTT + #include "ClassFlowDefineTypes.h" #define LWT_TOPIC "connection" @@ -17,4 +19,6 @@ void register_server_mqtt_uri(httpd_handle_t server); void publishSystemData(); std::string getTimeUnit(void); -void GotConnected(std::string maintopic, int SetRetainFlag); \ No newline at end of file +void GotConnected(std::string maintopic, int SetRetainFlag); + +#endif //ENABLE_MQTT \ No newline at end of file diff --git a/code/components/jomjol_tfliteclass/CTfLiteClass.cpp b/code/components/jomjol_tfliteclass/CTfLiteClass.cpp index 98ab82a2..7af92a23 100644 --- a/code/components/jomjol_tfliteclass/CTfLiteClass.cpp +++ b/code/components/jomjol_tfliteclass/CTfLiteClass.cpp @@ -8,7 +8,7 @@ // #define DEBUG_DETAIL_ON -static const char *TAG = "C TFLITE"; +static const char *TAG = "TFLITE"; float CTfLiteClass::GetOutputValue(int nr) { @@ -179,6 +179,8 @@ void CTfLiteClass::MakeAllocate() static tflite::AllOpsResolver resolver; // ESP_LOGD(TAG, "%s", LogFile.getESPHeapInfo().c_str()); + + LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Make Allocate"); this->interpreter = new tflite::MicroInterpreter(this->model, resolver, this->tensor_arena, this->kTensorArenaSize, this->error_reporter); // ESP_LOGD(TAG, "%s", LogFile.getESPHeapInfo().c_str()); diff --git a/code/components/jomjol_tfliteclass/server_tflite.cpp b/code/components/jomjol_tfliteclass/server_tflite.cpp index d8ec0e94..e46a0db9 100644 --- a/code/components/jomjol_tfliteclass/server_tflite.cpp +++ b/code/components/jomjol_tfliteclass/server_tflite.cpp @@ -39,7 +39,7 @@ bool auto_isrunning = false; int countRounds = 0; -static const char *TAG = "TFLITE"; +static const char *TAG = "TFLITE SERVER"; int getCountFlowRounds() { @@ -104,7 +104,9 @@ void doInit(void) ESP_LOGD(TAG, "Finished tfliteflow.InitFlow(config);"); #endif +#ifdef ENABLE_MQTT tfliteflow.StartMQTTService(); +#endif //ENABLE_MQTT } @@ -736,7 +738,7 @@ void task_autodoFlow(void *pvParameter) while (auto_isrunning) { LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "----------------------------------------------------------------"); // Clear separation between runs - std::string _zw = "task_autodoFlow - Starting Round #" + std::to_string(++countRounds); + std::string _zw = "Round #" + std::to_string(++countRounds) + " started"; LogFile.WriteToFile(ESP_LOG_INFO, TAG, _zw); fr_start = esp_timer_get_time(); @@ -767,7 +769,7 @@ void task_autodoFlow(void *pvParameter) string zwtemp = "CPU Temperature: " + stream.str(); LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, zwtemp); - LogFile.WriteToFile(ESP_LOG_INFO, TAG, "task_autodoFlow - round #" + std::to_string(countRounds) + " completed"); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Round #" + std::to_string(countRounds) + " completed"); fr_delta_ms = (esp_timer_get_time() - fr_start) / 1000; if (auto_intervall > fr_delta_ms) @@ -803,11 +805,12 @@ void TFliteDoAutoStart() } +#ifdef ENABLE_MQTT std::string GetMQTTMainTopic() { return tfliteflow.GetMQTTMainTopic(); } - +#endif//ENABLE_MQTT void register_server_tflite_uri(httpd_handle_t server) diff --git a/code/components/jomjol_tfliteclass/server_tflite.h b/code/components/jomjol_tfliteclass/server_tflite.h index 8d77ee05..452ec0f3 100644 --- a/code/components/jomjol_tfliteclass/server_tflite.h +++ b/code/components/jomjol_tfliteclass/server_tflite.h @@ -15,7 +15,9 @@ void TFliteDoAutoStart(); bool isSetupModusActive(); +#ifdef ENABLE_MQTT std::string GetMQTTMainTopic(); +#endif //ENABLE_MQTT int getCountFlowRounds(); diff --git a/code/components/jomjol_time_sntp/time_sntp.cpp b/code/components/jomjol_time_sntp/time_sntp.cpp index 6240e687..4da72e88 100644 --- a/code/components/jomjol_time_sntp/time_sntp.cpp +++ b/code/components/jomjol_time_sntp/time_sntp.cpp @@ -63,8 +63,8 @@ bool setup_time() // Is time set? If not, tm_year will be (1970 - 1900). if (!getTimeIsSet()) { - ESP_LOGI(TAG, "Time is not set yet. Getting time over NTP."); initialize_sntp(); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Time is not set yet. Getting time over NTP server " + std::string(sntp_getservername(0))); if (!obtain_time()) { success = false; } @@ -103,9 +103,9 @@ static bool obtain_time(void) bool success = true; time(&now); - localtime_r(&now, &timeinfo); + localtime_r(&now, &timeinfo); - ESP_LOGI(TAG, "Waiting until we get a time from the NTP server..."); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Waiting until we get a time from the NTP server " + std::string(sntp_getservername(0))); while (true) { retry++; @@ -118,7 +118,7 @@ static bool obtain_time(void) sntp_sync_status_t status = sntp_get_sync_status(); logNtpStatus(status); if (status == SNTP_SYNC_STATUS_COMPLETED) { - ESP_LOGI(TAG, "Time is synced with NTP Server"); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Time is synced with NTP Server " + std::string(sntp_getservername(0))); break; } @@ -133,23 +133,23 @@ static bool obtain_time(void) void logNtpStatus(sntp_sync_status_t status) { if (status == SNTP_SYNC_STATUS_COMPLETED) { - LogFile.WriteToFile(ESP_LOG_INFO, TAG, "NTP Status OK"); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Status OK"); } else if (status == SNTP_SYNC_STATUS_IN_PROGRESS) { - LogFile.WriteToFile(ESP_LOG_INFO, TAG, "NTP Status: In Progress"); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Status: In Progress"); } else { // SNTP_SYNC_STATUS_RESET - LogFile.WriteToFile(ESP_LOG_INFO, TAG, "NTP Status: Reset"); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Status: Reset"); } } void reset_servername(std::string _servername) { - ESP_LOGD(TAG, "Set SNTP-Server: %s", _servername.c_str()); sntp_stop(); sntp_setoperatingmode(SNTP_OPMODE_POLL); sntp_setservername(0, _servername.c_str()); + LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Set SNTP-Server to " + std::string(sntp_getservername(0))); sntp_init(); obtain_time(); std::string zw = gettimestring("%Y%m%d-%H%M%S"); diff --git a/code/main/main.cpp b/code/main/main.cpp index c26baabd..614967e2 100644 --- a/code/main/main.cpp +++ b/code/main/main.cpp @@ -27,7 +27,9 @@ #include "ClassControllCamera.h" #include "server_main.h" #include "server_camera.h" -#include "server_mqtt.h" +#ifdef ENABLE_MQTT + #include "server_mqtt.h" +#endif //ENABLE_MQTT #include "Helper.h" extern const char* GIT_TAG; @@ -195,7 +197,7 @@ extern "C" void app_main(void) ESP_LOGD(TAG, "No SSID and PASSWORD set!!!"); if (hostname != NULL) - ESP_LOGD(TAG, "Hostename: %s", hostname); + ESP_LOGD(TAG, "Hostname: %s", hostname); else ESP_LOGD(TAG, "Hostname not set"); @@ -230,10 +232,10 @@ extern "C" void app_main(void) ESP_LOGD(TAG, "time %s", zw.c_str()); size_t _hsize = getESPHeapSize(); - if (_hsize < 4000000) + if (_hsize < 4000000) // Check for a bit less than 4 MB (but clearly over 2 MB) { - std::string _zws = "Not enough PSRAM available. Expected 4.194.304 MByte - available: " + std::to_string(_hsize); - _zws = _zws + "\nEither not initialized, too small (2MByte only) or not present at all. Firmware cannot start!!"; + std::string _zws = "Not enough PSRAM available. Expected around 4 MBytes - available: " + std::to_string((float)_hsize/1024/1024) + " MBytes!"; + _zws = _zws + "\nEither not initialized, too small (2 MByte only) or not present at all. Firmware cannot start!!"; LogFile.WriteToFile(ESP_LOG_ERROR, TAG, _zws); } else { // Bad Camera Status, retry init if (camStatus != ESP_OK) { @@ -255,7 +257,10 @@ extern "C" void app_main(void) camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Camera Framebuffer cannot be initialized!"); - initSucessful = false; + /* Easiest would be to simply restart here and try again, + how ever there seem to be systems where it fails at startup but still work corectly later. + Therefore we treat it still as successed! + //initSucessful = false; */ } else { esp_camera_fb_return(fb); @@ -277,7 +282,9 @@ extern "C" void app_main(void) register_server_tflite_uri(server); register_server_file_uri(server, "/sdcard"); register_server_ota_sdcard_uri(server); - register_server_mqtt_uri(server); + #ifdef ENABLE_MQTT + register_server_mqtt_uri(server); + #endif //ENABLE_MQTT gpio_handler_create(server); diff --git a/code/platformio.ini b/code/platformio.ini index 49dfd325..e91212cf 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -18,24 +18,28 @@ board = esp32cam ;board = m5stack-core-esp32 framework = espidf +;Add macro definition ENABLE_MQTT, ENABLE_INFLUXDB +build_flags = -D ENABLE_MQTT -D ENABLE_INFLUXDB + ;board_build.partitions = partitions_singleapp.csv board_build.partitions = partitions.csv -lib_deps = - jomjol_configfile - jomjol_helper - jomjol_wlan - jomjol_image_proc - jomjol_controlcamera - jomjol_flowcontroll - jomjol_tfliteclass - tflite-lib - jomjol_fileserver_ota - jomjol_time_sntp - jomjol_logfile - jomjol_mqtt - jomjol_influxdb - jomjol_controlGPIO +;lib_deps not needed +;lib_deps = +; jomjol_configfile +; jomjol_helper +; jomjol_wlan +; jomjol_image_proc +; jomjol_controlcamera +; jomjol_flowcontroll +; jomjol_tfliteclass +; tflite-lib +; jomjol_fileserver_ota +; jomjol_time_sntp +; jomjol_logfile +; jomjol_mqtt +; jomjol_influxdb +; jomjol_controlGPIO monitor_speed = 115200 diff --git a/code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp b/code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp index 896eec10..ba8c2d94 100644 --- a/code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp +++ b/code/test/components/jomjol-flowcontroll/test_flow_postrocess_helper.cpp @@ -1,7 +1,7 @@ #include "test_flow_postrocess_helper.h" #include "esp_log.h" -static const char *TAG = "FLOW CTRL POSTPROC TEST"; +static const char *TAG = "POSTPROC TEST"; UnderTestPost* setUpClassFlowPostprocessing(t_CNNType digType, t_CNNType anaType) { diff --git a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp b/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp index a9dc4f65..b7b0ef53 100644 --- a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp +++ b/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp @@ -522,4 +522,24 @@ void test_doFlowPP3() { delete undertestPost; } +void test_doFlowPP4() { + + // Fehler V13.0.4 + // https://github.com/jomjol/AI-on-the-edge-device/issues/1503#issuecomment-1343335855 + std::vector digits = { 0.0, 0.0, 6.9, 1.0, 6.6}; // 716.0199 als falsches Ergebnis. + // Test ist nur erfolgreich mit Veränderung des AnalogdigitTransistionStart + std::vector analogs = {9.9, 1.8, 6.6, 5.8}; + const char* expected = "717.0165"; + const char* expected_extended= "717.01658"; + + // extendResolution=false + std::string result = process_doFlow(analogs, digits, Digital100, false, false); + TEST_ASSERT_EQUAL_STRING(expected, result.c_str()); + + // checkConsistency=false und extendResolution=true + result = process_doFlow(analogs, digits, Digital100, false, true); + TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str()); + +} + diff --git a/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp b/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp index 5cbd5ddb..6ee19ace 100644 --- a/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp +++ b/code/test/components/jomjol-flowcontroll/test_getReadoutRawString.cpp @@ -20,7 +20,7 @@ void test_getReadoutRawString() { gen_analog->ROI.push_back(anaROI); result = _undertestPost->flowAnalog->getReadoutRawString(0); - TEST_ASSERT_EQUAL_STRING("\t5.5", result.c_str()); + TEST_ASSERT_EQUAL_STRING(",5.5", result.c_str()); diff --git a/code/test/test_suite_flowcontroll.cpp b/code/test/test_suite_flowcontroll.cpp index f737891c..fed2218c 100644 --- a/code/test/test_suite_flowcontroll.cpp +++ b/code/test/test_suite_flowcontroll.cpp @@ -11,7 +11,7 @@ #include "sdmmc_cmd.h" #include "driver/sdmmc_host.h" #include "driver/sdmmc_defs.h" -static const char *TAG = "MAIN TEST"; +//static const char *TAG = "MAIN TEST"; #define __SD_USE_ONE_LINE_MODE__ #include "server_GPIO.h" @@ -117,6 +117,7 @@ extern "C" void app_main() RUN_TEST(test_doFlowPP1); RUN_TEST(test_doFlowPP2); RUN_TEST(test_doFlowPP3); + RUN_TEST(test_doFlowPP4); // getReadoutRawString test RUN_TEST(test_getReadoutRawString); diff --git a/docs/manifest.json b/docs/manifest.json index b29b1548..cbd6e3c7 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -1,6 +1,6 @@ { "name": "AI-on-the-edge", - "version": "12.0.1", + "version": "13.0.5", "funding_url": "https://www.paypal.com/donate?hosted_button_id=8TRSVYNYKDSWL", "new_install_prompt_erase": false, "builds": [ @@ -16,7 +16,7 @@ "offset": 32768 }, { - "path": "releases/download/v12.0.1/firmware.bin", + "path": "releases/download/v13.0.5/firmware.bin", "offset": 65536 } ] diff --git a/docs/releases/download/v12.0.5/firmware.bin b/docs/releases/download/v12.0.5/firmware.bin new file mode 100644 index 00000000..cdf150d3 Binary files /dev/null and b/docs/releases/download/v12.0.5/firmware.bin differ diff --git a/docs/releases/download/v13.0.5/firmware.bin b/docs/releases/download/v13.0.5/firmware.bin new file mode 100644 index 00000000..cdf150d3 Binary files /dev/null and b/docs/releases/download/v13.0.5/firmware.bin differ diff --git a/sd-card/config/config.ini b/sd-card/config/config.ini index 68b9fbc0..8670fd0c 100644 --- a/sd-card/config/config.ini +++ b/sd-card/config/config.ini @@ -94,7 +94,7 @@ LogfileRetentionInDays = 3 [System] TimeZone = CET-1CEST,M3.5.0,M10.5.0/3 -;TimeServer = undefined +;TimeServer = pool.ntp.org ;AutoAdjustSummertime = false ;Hostname = undefined SetupMode = true