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

Merge pull request #1167 from haverland/fix_analogtodigital

Fix analogtodigital
jomjol 3 лет назад
Родитель
Сommit
ba59c8ee66

+ 5 - 0
.github/workflows/build.yaml

@@ -189,6 +189,11 @@ jobs:
           ./sd-card/html/version.txt
           ./sd-card/html/version.txt
         key: ${{ github.run_number }}
         key: ${{ github.run_number }}
 
 
+    - name: Set Variables
+      id: vars
+      run: |
+        echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
+
     - name: Prepare artifacts for release
     - name: Prepare artifacts for release
       run: |
       run: |
         mkdir -p firmware
         mkdir -p firmware

+ 20 - 0
Changelog.md

@@ -1,5 +1,25 @@
 # Changelog
 # Changelog
 
 
+## [Unreleased]
+
+### Added
+
+-   Addes PreValue to `/json` ([#1154](https://github.com/jomjol/AI-on-the-edge-device/issues/1154))
+
+### Changed
+
+-   Updated built environment to `espressif32@v5.2.0`
+
+### Fixed
+
+-   [#1116](https://github.com/jomjol/AI-on-the-edge-device/issues/1116) precision problem at setting prevalue
+-   [#1119](https://github.com/jomjol/AI-on-the-edge-device/issues/1119) renamed `firmware.bin` not working in OTA
+### Removed
+
+-   n.a.
+
+
+
 ## [12.0.1](https://github.com/jomjol/AI-on-the-edge-device/releases/tag/v12.0.1), 2022-09-29
 ## [12.0.1](https://github.com/jomjol/AI-on-the-edge-device/releases/tag/v12.0.1), 2022-09-29
 
 
 Improve **u**ser e**x**perience 
 Improve **u**ser e**x**perience 

+ 129 - 85
FeatureRequest.md

@@ -11,9 +11,18 @@
 
 
 ____
 ____
 
 
-#### ~~#29 Add favicon and use the hostname for the website~~- implemented v11.3.1
+#### #30 Support meter clock over
+
+* In case of meter clocking over, that is, reaching its max. value and starting over from 0,
+  accept the new value and calculate correctly the difference.
+  (see line 739 onwards in ClassFlowPostProcessing.cpp)
+
+* In case of meter clocking over, that is, reaching its max. value and starting over from 0,
+  accept the new value and calculate correctly the difference.
+  (see line 739 onwards in ClassFlowPostProcessing.cpp)
+
+
 
 
-~~* https://github.com/jomjol/AI-on-the-edge-device/issues/927~~
 
 
 #### #28 Improved error handling for ROIs
 #### #28 Improved error handling for ROIs
 
 
@@ -47,13 +56,7 @@ ____
 
 
 * Show the CPU Temp directly in Webpage. Also add the value to MQTT sending
 * Show the CPU Temp directly in Webpage. Also add the value to MQTT sending
 
 
-  
-
-#### ~~#22 Direct hint to the different neural network files in the other repositories~~- implemented >v11.3.1
-
-~~* https://github.com/jomjol/AI-on-the-edge-device/issues/644~~
-
-  
+    
 
 
 #### #21 Extended "CheckDigitalConsistency" Logik
 #### #21 Extended "CheckDigitalConsistency" Logik
 
 
@@ -61,40 +64,21 @@ ____
 
 
   
   
 
 
-#### #20 Deep sleep and push mode
-
-* Let the device be normally in deep sleep state, and wake it up periodically to collect data and push it via MQTT or HTTP post.
-* Support ESP-NOW to reduce the overhead of connecting to wifi and mqtt 
-* the above should enable battery powered applications
-
-* An other way to set deep sleep would be to enable it in a specific period (at night).
-  
-
-#### #19 Extended log informations
-
-* https://github.com/jomjol/AI-on-the-edge-device/issues/580
-
-  
-
-#### ~~#18 Document WLAN-strength in web page~~
-
-* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/563~~
-
-
-
-#### ~~#17 Direct InfluxDB connection~~
-
-* ~~Done in v10.6.0~~
-
 
 
 #### #16 Serial Communication
 #### #16 Serial Communication
 
 
 * https://github.com/jomjol/AI-on-the-edge-device/issues/512
 * https://github.com/jomjol/AI-on-the-edge-device/issues/512
+
 * Send the readout value via RX/TX interface with a dedicated TAG
 * Send the readout value via RX/TX interface with a dedicated TAG
+
 * Make dedicated communication FlowModule
 * Make dedicated communication FlowModule
+
 * Modification of RX/TX communication
 * Modification of RX/TX communication
+
 * Configuration interfache
 * Configuration interfache
 
 
+  
+
 
 
 #### #15 Calibration for FishEye image
 #### #15 Calibration for FishEye image
 
 
@@ -108,16 +92,6 @@ ____
 
 
 
 
 
 
-#### ~~#14 Backup and restore option for configuration~~- implemented v11.3.1
-
-* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/459~~
-
-* ~~Implement a zip file compression for store and restore~~
-
-* ~~Update the html to handle it~~
-
-  
-
 #### #13 Manage non linear gauge without CNN re-training
 #### #13 Manage non linear gauge without CNN re-training
 
 
 * https://github.com/jomjol/AI-on-the-edge-device/issues/443
 * https://github.com/jomjol/AI-on-the-edge-device/issues/443
@@ -126,12 +100,6 @@ ____
 
 
   
   
 
 
-#### ~~#12 Less reboots due to memory leakage~~
-
-* ~~Issue: #414 & #425  #430~~
-
-  
-
 #### #11 MQTT - configurable payload
 #### #11 MQTT - configurable payload
 
 
 * https://github.com/jomjol/AI-on-the-edge-device/issues/344
 * https://github.com/jomjol/AI-on-the-edge-device/issues/344
@@ -144,18 +112,14 @@ ____
 
 
   
   
 
 
-#### #9 Basic auth for the UI
-
-* https://github.com/jomjol/AI-on-the-edge-device/issues/283
-
-* Implementation of an authentication mechanism.
-
 #### #8 MQTT configurable readout intervall
 #### #8 MQTT configurable readout intervall
 
 
 Make the readout intervall configurable via MQTT.
 Make the readout intervall configurable via MQTT.
 
 
 * Change the mqtt part to receive and process input and not only sending
 * Change the mqtt part to receive and process input and not only sending
 
 
+
+
 #### #7 Extended Error Handling
 #### #7 Extended Error Handling
 
 
 Check different types of error (e.g. tflite not availabe) and generate an error on the html page.
 Check different types of error (e.g. tflite not availabe) and generate an error on the html page.
@@ -166,15 +130,7 @@ To do:
 * Implement a checking algo
 * Implement a checking algo
 * Extend the firmware and html page for the error handling
 * Extend the firmware and html page for the error handling
 
 
-#### ~~#6 Check for double ROI names~~ - implemented v8.0.0
-
-~~Check during configuration, that ROI names are unique.~~
-
-~~To do:~~
-
-* ~~Implementation of ROI name checking in html code before saving analog or digital ROIs~~
 
 
-  
 
 
 #### #5 Configurable decimal separator (point or comma) 
 #### #5 Configurable decimal separator (point or comma) 
 
 
@@ -188,52 +144,137 @@ To do:
 
 
 
 
 
 
-#### ~~#4 Initial Shifting and Rotation~~ - implemented v7.0.0
+#### #2 MQTT-controll with callback 
+* https://github.com/jomjol/AI-on-the-edge-device/issues/105
 
 
-* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
+Extend the MQTT client to also enable callbacks for configuration setting
 
 
-~~Implementation of a shifting additional to the initial rotation of the raw camera input~~
+To do:
 
 
-~~To do:~~
+* implement callback for receiving information and override `config.ini` settings
 
 
-* ~~Implementation of shifting~~
-* ~~Extension of configuration~~
-* ~~Adaption of the html configuration to implement shifting~~
+* change configuration management to handle online updates (currently changes need a restart)
 
 
+* think about the startup, as there the default config is loaded 
 
 
+  
 
 
-#### ~~#3 Allow grouping of digits to multiple reading values~~ - implemented v8.0.0
+____
 
 
-* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
 
 
-~~Implementation of two different independent readouts in one setup~~
 
 
-~~To do:~~
+# Refused
 
 
-* ~~Extend the configuration, setting and processing flow for two independend readouts~~
+#### #9 Basic auth for the UI 
 
 
+* https://github.com/jomjol/AI-on-the-edge-device/issues/283
 
 
+* Implementation of an authentication mechanism.
 
 
+This will not be part of the free version
 
 
 
 
-____
 
 
-#### #2 MQTT-controll with callback 
-* https://github.com/jomjol/AI-on-the-edge-device/issues/105
+#### #20 Deep sleep and push mode
 
 
-Extend the MQTT client to also enable callbacks for configuration setting
+* Let the device be normally in deep sleep state, and wake it up periodically to collect data and push it via MQTT or HTTP post.
+* Support ESP-NOW to reduce the overhead of connecting to wifi and mqtt 
+* the above should enable battery powered applications
 
 
-To do:
+* An other way to set deep sleep would be to enable it in a specific period (at night).
 
 
-* implement callback for receiving information and override `config.ini` settings
+Technically not possible, as the limiting factor for the power consumption is not the esp32, but the electrical curcuit on the ESP32CAM board, which consumes a lot already in deep sleep mode.
 
 
-* change configuration management to handle online updates (currently changes need a restart)
 
 
-* think about the startup, as there the default config is loaded 
+
+# Closed
+
+
+#### ~~#29 Add favicon and use the hostname for the website~~- implemented v11.3.1
+
+
+
+#### ~~#19 Extended log informations~~
+
+~~* https://github.com/jomjol/AI-on-the-edge-device/issues/580~~
 
 
   
   
 
 
-____
+#### ~~#29 Add favicon and use the hostname for the website~~- implemented v11.3.1
+
+~~* https://github.com/jomjol/AI-on-the-edge-device/issues/927~~
+
+
+
+#### ~~#22 Direct hint to the different neural network files in the other repositories~~- implemented >v11.3.1
+
+~~* https://github.com/jomjol/AI-on-the-edge-device/issues/644~~
+
+
+
+#### ~~#18 Document WLAN-strength in web page~~
+
+* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/563~~
+
+
+
+#### ~~#17 Direct InfluxDB connection~~
+
+* ~~Done in v10.6.0~~
+
+
+
+#### ~~#14 Backup and restore option for configuration~~- implemented v11.3.1
+
+* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/459~~
+
+* ~~Implement a zip file compression for store and restore~~
+
+* ~~Update the html to handle it~~
+
+  
+
+#### ~~#12 Less reboots due to memory leakage~~
+
+* ~~Issue: #414 & #425  #430~~
+
+
+
+#### ~~#6 Check for double ROI names~~ - implemented v8.0.0
+
+~~Check during configuration, that ROI names are unique.~~
+
+~~To do:~~
+
+* ~~Implementation of ROI name checking in html code before saving analog or digital ROIs~~
+
+  
+
+#### ~~#4 Initial Shifting and Rotation~~ - implemented v7.0.0
+
+* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
+
+~~Implementation of a shifting additional to the initial rotation of the raw camera input~~
+
+~~To do:~~
+
+* ~~Implementation of shifting~~
+* ~~Extension of configuration~~
+* ~~Adaption of the html configuration to implement shifting~~
+
+
+
+#### ~~#3 Allow grouping of digits to multiple reading values~~ - implemented v8.0.0
+
+* ~~https://github.com/jomjol/AI-on-the-edge-device/issues/123~~
+
+~~Implementation of two different independent readouts in one setup~~
+
+~~To do:~~
+
+* ~~Extend the configuration, setting and processing flow for two independend readouts~~
+
+
 
 
 #### ~~#1 Optional GPIO for external flash/lighting~~ - implemented (v8.0.0)
 #### ~~#1 Optional GPIO for external flash/lighting~~ - implemented (v8.0.0)
 
 
@@ -248,3 +289,6 @@ ____
 * ~~Implementation of a software module for external light source (e.g. WS8132 LED controller, ...)~~
 * ~~Implementation of a software module for external light source (e.g. WS8132 LED controller, ...)~~
 * ~~Update of the camera module to use the external light instead of the internal flash light~~
 * ~~Update of the camera module to use the external light instead of the internal flash light~~
 * ~~Adopt the configuration algorithm with a configurable light source~~
 * ~~Adopt the configuration algorithm with a configurable light source~~
+
+
+

+ 2 - 1
code/components/jomjol_controlGPIO/SmartLeds.h

@@ -269,7 +269,8 @@ private:
     std::unique_ptr< Rgb[] > _secondBuffer;
     std::unique_ptr< Rgb[] > _secondBuffer;
     Rgb *_buffer;
     Rgb *_buffer;
 
 
-    xSemaphoreHandle _finishedFlag;
+    SemaphoreHandle_t _finishedFlag;
+//    xSemaphoreHandle _finishedFlag;
 
 
     int _pixelPosition;
     int _pixelPosition;
     int _componentPosition;
     int _componentPosition;

+ 1 - 1
code/components/jomjol_fileserver_ota/server_file.cpp

@@ -769,7 +769,7 @@ std::string unzip_new(std::string _in_zip_file, std::string _target_zip, std::st
                 zw = std::string(archive_filename);
                 zw = std::string(archive_filename);
                 printf("Rohfilename: %s\n", zw.c_str());
                 printf("Rohfilename: %s\n", zw.c_str());
 
 
-                if (toUpper(zw) == "FIRMWARE.BIN")
+                if (getFileType(zw) == "BIN")
                 {
                 {
                     zw = _target_bin + zw;
                     zw = _target_bin + zw;
                     ret = zw;
                     ret = zw;

+ 18 - 12
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -35,7 +35,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
     if (GENERAL[_analog]->ROI.size() == 0)
     if (GENERAL[_analog]->ROI.size() == 0)
         return result;
         return result;
     if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::getReadout _analog=" + std::to_string(_analog) + ", _extendedResolution=" + std::to_string(_extendedResolution) + ", prev=" + std::to_string(prev));
     if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::getReadout _analog=" + std::to_string(_analog) + ", _extendedResolution=" + std::to_string(_extendedResolution) + ", prev=" + std::to_string(prev));
-
+ 
     if (CNNType == Analogue || CNNType == Analogue100)
     if (CNNType == Analogue || CNNType == Analogue100)
     {
     {
         float zahl = GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float;
         float zahl = GENERAL[_analog]->ROI[GENERAL[_analog]->ROI.size() - 1]->result_float;
@@ -147,7 +147,6 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
 
 
     if (AnalogerVorgaenger)
     if (AnalogerVorgaenger)
     {
     {
-//        result = ZeigerEvalAnalogToDigitNeu(zahl, eval_vorgaenger);
         result = ZeigerEvalAnalogToDigitNeu(zahl, zahl_vorgaenger, eval_vorgaenger);
         result = ZeigerEvalAnalogToDigitNeu(zahl, zahl_vorgaenger, eval_vorgaenger);
         if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - Analoger Vorgänger, Bewertung über ZeigerEvalAnalogNeu = " + std::to_string(result) +
         if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - Analoger Vorgänger, Bewertung über ZeigerEvalAnalogNeu = " + 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));
                                                     " zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
@@ -216,20 +215,22 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
         return result;
         return result;
     }
     }
 
 
-    if ((ziffer_vorgaenger >= DigitalUebergangsbereichVorgaengerAnalogToDigit ) && (ziffer_vorgaenger <= (10.0 - DigitalUebergangsbereichVorgaengerAnalogToDigit)))
+  /*  if ((ziffer_vorgaenger >= DigitalUebergangsbereichVorgaengerAnalogToDigit ) && (ziffer_vorgaenger <= (10.0 - DigitalUebergangsbereichVorgaengerAnalogToDigit)))
     {
     {
+        Bei DigitalUebergangsbereichVorgaengerAnalogToDigit verursacht runden weitere Fehler
         // kein Ziffernwechsel, da Vorgänger weit genug weg ist (0+/-DigitalUebergangsbereichVorgaenger) --> zahl wird gerundet
         // kein Ziffernwechsel, da Vorgänger weit genug weg ist (0+/-DigitalUebergangsbereichVorgaenger) --> zahl wird gerundet
         if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
         if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
-            result = ((int) round(zahl) + 10) % 10;
-        else
             result = ((int) trunc(zahl) + 10) % 10;
             result = ((int) trunc(zahl) + 10) % 10;
-
+        else
+            result = ((int) round(zahl) + 10) % 10;
+        
+        result = ((int) trunc(zahl) + 10) % 10;
         if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - kein Ziffernwechsel, da Vorkomma weit genug weg = " + std::to_string(result) +
         if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - kein Ziffernwechsel, da Vorkomma weit genug weg = " + std::to_string(result) +
                                                     " zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
                                                     " zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
         return result;
         return result;
     }  
     }  
-
-    if (ziffer_vorgaenger <= 1 && eval_vorgaenger<9)  // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
+*/
+    if (ziffer_vorgaenger <= 3 && eval_vorgaenger<9)  // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
         // aber Sonderfall ziffer_vorgaeger = 0.1 vor_vorgaenger 9.9 => eval_vorgaenger ist 9, damit hat Nulldurchgang nicht stattgefunden.
         // aber Sonderfall ziffer_vorgaeger = 0.1 vor_vorgaenger 9.9 => eval_vorgaenger ist 9, damit hat Nulldurchgang nicht stattgefunden.
     {
     {
         if (ergebnis_nachkomma > 5)
         if (ergebnis_nachkomma > 5)
@@ -241,10 +242,15 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
         return result;
         return result;
     }
     }
 
 
-    // bleibt nur >= 9.5 --> noch kein Nulldurchgang --> 2.8 --> 2, und 3.1 --> 2
-    // hier auf 4 reduziert, da erst ab Vorgänder 9 anfängt umzustellen. Bei 9.5 Vorgänger kann die aktuelle
-    // Zahl noch x.4 - x.5 sein.
-    if (ergebnis_nachkomma >= 4)
+    // Vorlauf ziffer_vorgaenger <=9.9 und ergebnis_nachkomma >=0..1 (digits drehen nach umschalten nicht gleich weiter)
+    // Beispiel dig=4.0, ana=9.1 ==> dig=3
+
+    // Nachlauf ziffer_vorgaenger 0..2 und ergebnis_nachkomma 8..9
+    // Beispiel dig=6.8, ana=2.2 ==> dig=7
+    // dig=4.8, ana=5.5 => dig=4
+
+    // Aber zwischen ziffer_vorgaenger 3..8 keine Veränderung
+    if (ergebnis_nachkomma >= 1 || (ziffer_vorgaenger>3 && ziffer_vorgaenger<8) )
         result =  ergebnis_vorkomma;
         result =  ergebnis_vorkomma;
     else
     else
         result =  (ergebnis_vorkomma - 1 + 10) % 10;
         result =  (ergebnis_vorkomma - 1 + 10) % 10;

+ 1 - 1
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.h

@@ -28,7 +28,7 @@ protected:
     float DigitalUnschaerfe = 0.2;
     float DigitalUnschaerfe = 0.2;
     int DigitalBand = 3;
     int DigitalBand = 3;
     float DigitalAnalogerVorgaengerUebergangsbereich = 2;
     float DigitalAnalogerVorgaengerUebergangsbereich = 2;
-    float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2
+    // nicht mehr benötigt float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2
     float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
     float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
     float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
     float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
 
 

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

@@ -404,7 +404,7 @@ string ClassFlowControll::GetPrevalue(std::string _number)
 
 
 std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string _numbers, bool _extern)
 std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string _numbers, bool _extern)
 {
 {
-    float zw;
+    double zw;
     char* p;
     char* p;
 
 
     _newvalue = trim(_newvalue);
     _newvalue = trim(_newvalue);
@@ -416,7 +416,7 @@ std::string ClassFlowControll::UpdatePrevalue(std::string _newvalue, std::string
     }
     }
     else
     else
     {
     {
-        zw = strtof(_newvalue.c_str(), &p);
+        zw = strtod(_newvalue.c_str(), &p);
         if (zw == 0)
         if (zw == 0)
             return "- Error in String to Value Conversion!!! Must be of format value=123.456";
             return "- Error in String to Value Conversion!!! Must be of format value=123.456";
     }
     }

+ 2 - 1
code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp

@@ -35,6 +35,7 @@ std::string ClassFlowPostProcessing::GetJSON(std::string _id, std::string _mac,
         else
         else
             json += "    \"value\": \"\","  + _lineend;
             json += "    \"value\": \"\","  + _lineend;
         json += "    \"raw\": \""        + NUMBERS[i]->ReturnRawValue              + "\","  + _lineend;
         json += "    \"raw\": \""        + NUMBERS[i]->ReturnRawValue              + "\","  + _lineend;
+        json += "    \"pre\": \""        + NUMBERS[i]->ReturnPreValue              + "\","  + _lineend;
         json += "    \"error\": \""     + NUMBERS[i]->ErrorMessageText             + "\","  + _lineend;
         json += "    \"error\": \""     + NUMBERS[i]->ErrorMessageText             + "\","  + _lineend;
         if (NUMBERS[i]->ReturnRateValue.length() > 0)
         if (NUMBERS[i]->ReturnRateValue.length() > 0)
             json += "    \"rate\": "      + NUMBERS[i]->ReturnRateValue                + ","  + _lineend;
             json += "    \"rate\": "      + NUMBERS[i]->ReturnRateValue                + ","  + _lineend;
@@ -78,7 +79,7 @@ void ClassFlowPostProcessing::SetPreValue(double zw, string _numbers, bool _exte
         if (NUMBERS[j]->name == _numbers)
         if (NUMBERS[j]->name == _numbers)
         {
         {
             NUMBERS[j]->PreValue = zw;
             NUMBERS[j]->PreValue = zw;
-            NUMBERS[j]->ReturnPreValue = std::to_string(zw);
+            NUMBERS[j]->ReturnPreValue = RundeOutput(zw, NUMBERS[j]->Nachkomma);
             NUMBERS[j]->PreValueOkay = true;
             NUMBERS[j]->PreValueOkay = true;
             if (_extern)
             if (_extern)
             {
             {

+ 1 - 44
code/components/jomjol_mqtt/interface_mqtt.cpp

@@ -52,6 +52,7 @@ static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
             break;
             break;
         case MQTT_EVENT_DISCONNECTED:
         case MQTT_EVENT_DISCONNECTED:
             ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_DISCONNECTED");
             ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_DISCONNECTED");
+            esp_mqtt_client_reconnect(client);
             break;
             break;
         case MQTT_EVENT_SUBSCRIBED:
         case MQTT_EVENT_SUBSCRIBED:
             ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
             ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
@@ -99,17 +100,6 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st
 
 
     int _lzw = _zwmessage.length();
     int _lzw = _zwmessage.length();
 
 
-/*    LWTContext = _LWTContext;
-
-    mqtt_cfg.uri = _mqttURI.c_str();
-    mqtt_cfg.client_id = _clientid.c_str();
-    mqtt_cfg.lwt_topic = _LWTContext.c_str();
-    mqtt_cfg.lwt_msg = _zwmessage.c_str();
-    mqtt_cfg.lwt_retain = 1;
-    mqtt_cfg.lwt_msg_len = _lzw;
-    mqtt_cfg.keepalive = _keepalive;
-*/
-
     esp_mqtt_client_config_t mqtt_cfg = {
     esp_mqtt_client_config_t mqtt_cfg = {
         .uri = _mqttURI.c_str(),
         .uri = _mqttURI.c_str(),
         .client_id = _clientid.c_str(),
         .client_id = _clientid.c_str(),
@@ -164,39 +154,6 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st
     return true;
     return true;
 }
 }
 
 
-/*
-void MQTTReConnect(){
-    std::string _zwmessage = "connection lost";
-    int _lzw = _zwmessage.length();
-
->>>>>>> Stashed changes
-    client = esp_mqtt_client_init(&mqtt_cfg);
-    if (client)
-    {
-        if (esp_mqtt_client_register_event(client, esp_mmqtt_ID, mqtt_event_handler, client) != ESP_OK)
-            LogFile.WriteToFile("MQTT - Could not register event!");
-        if (esp_mqtt_client_start(client) != ESP_OK)
-            LogFile.WriteToFile("MQTT - Could not start client!");
-
-<<<<<<< Updated upstream
-        if(MQTTPublish(_LWTContext, "", 1)) {
-            LogFile.WriteToFile("MQTT - Client init successful");
-        }
-=======
-        if (mqtt_connected)
-            MQTTPublish(LWTContext, "", 1);
-        else
-            LogFile.WriteToFile("Problem with (Re)Connection not successful!");
-
->>>>>>> Stashed changes
-    }
-    else
-    {
-        LogFile.WriteToFile("MQTT - Could not Init client!");
-    }
-
-}
-*/
 
 
 void MQTTdestroy() {
 void MQTTdestroy() {
     if (client != NULL) {
     if (client != NULL) {

+ 2 - 1
code/dependencies.lock

@@ -1,2 +1,3 @@
-manifest_hash: 45994dbfed009907994c31f6d279c5861a1eacbf219ce8b58e74e39b3393816a
+manifest_hash: 4e37bb0f9273c4de05f38688720fe32aa6e5b892452694a4f7a2ca1659f02cf6
+target: esp32
 version: 1.0.0
 version: 1.0.0

+ 2 - 0
code/main/main.cpp

@@ -118,6 +118,8 @@ bool Init_NVS_SDCard()
 
 
 void task_NoSDBlink(void *pvParameter)
 void task_NoSDBlink(void *pvParameter)
 {
 {
+//    esp_rom_gpio_pad_select_gpio(BLINK_GPIO);
+
     gpio_pad_select_gpio(BLINK_GPIO);
     gpio_pad_select_gpio(BLINK_GPIO);
     gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);  
     gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);  
 
 

+ 2 - 4
code/platformio.ini

@@ -13,14 +13,12 @@
 src_dir = main
 src_dir = main
 
 
 [env:esp32cam]
 [env:esp32cam]
-platform = espressif32@4.4.0
-;platform = espressif32@5.1.0
-;platform = espressif32
+;platform = espressif32@4.4.0
+platform = espressif32@5.2.0
 board = esp32cam
 board = esp32cam
 ;board = m5stack-core-esp32
 ;board = m5stack-core-esp32
 framework = espidf
 framework = espidf
 
 
-;board_build.partitions = partitions_singleapp.csv
 board_build.partitions = partitions.csv
 board_build.partitions = partitions.csv
 
 
 lib_deps =
 lib_deps =

+ 0 - 107
code/test/components/jomjol-flowcontroll/test_cnnflowcontroll.cpp

@@ -1,107 +0,0 @@
-#include <unity.h>
-#include <ClassFlowCNNGeneral.h>
-
-class UnderTestCNN : public ClassFlowCNNGeneral {
-    public:
-    using ClassFlowCNNGeneral::ZeigerEvalAnalogNeu;
-    using ClassFlowCNNGeneral::ZeigerEvalHybridNeu;
-    using ClassFlowCNNGeneral::ClassFlowCNNGeneral;
-    
-};
-
-
-/**
- * @brief test if all combinations of digit 
- * evaluation are running correctly
- */
-void test_ZeigerEval() 
-{
-    UnderTestCNN undertest = UnderTestCNN(nullptr, Digital100);
-
-    // the 5.2 is already above 5.0 and the previous digit too (3)
-    printf("Test 5.2, 3\n");
-    int result = undertest.ZeigerEvalAnalogNeu(5.2, 3);
-    TEST_ASSERT_EQUAL(5, result);
-
-    // the 5.2 is already above 5.0 and the previous digit not (9)
-    // so the current digit shoult be reduced (4.9)
-    printf("Test 5.2, 9\n");
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalAnalogNeu(5.2, 9));
-
-    printf("Test 4.4, 9\n");
-    // the 4.4 (digital100) is not above 5  and the previous digit (analog) too (9.3)
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalAnalogNeu(4.4, 9));
-
-    printf("Test 4.5, 0\n");
-    // the 4.5 (digital100) is not above 5  and the previous digit (analog) too (9.6)
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalAnalogNeu(4.5, 0));    
-
-}
-
-/**
- * @brief test if all combinations of digit 
- * evaluation are running correctly
- */
-void test_ZeigerEvalHybrid() {
-    UnderTestCNN undertest = UnderTestCNN(nullptr, Digital100);
-
-    // the 5.2 and no previous should round down
-    printf("ZeigerEvalHybridNeu(5.2, 0, -1)\n");
-    TEST_ASSERT_EQUAL(5, undertest.ZeigerEvalHybridNeu(5.2, 0, -1));
-
-    // the 5.3 and no previous should trunc to 5
-    printf("ZeigerEvalHybridNeu(5.3, 0, -1)\n");
-    TEST_ASSERT_EQUAL(5, undertest.ZeigerEvalHybridNeu(5.3, 0, -1));
-
-    printf("ZeigerEvalHybridNeu(5.7, 0, -1)\n");
-    // the 5.7 and no previous should trunc to 5
-    TEST_ASSERT_EQUAL(6, undertest.ZeigerEvalHybridNeu(5.7, 0, -1));
-
-    // the 5.8 and no previous should round up to 6
-    printf("ZeigerEvalHybridNeu(5.8, 0, -1)\n");
-    TEST_ASSERT_EQUAL(6, undertest.ZeigerEvalHybridNeu(5.8, 0, -1));
-
-    // the 5.7 with previous and the previous between 0.3-0.5 should round up to 6
-    TEST_ASSERT_EQUAL(6, undertest.ZeigerEvalHybridNeu(5.7, 0.4, 1));
-
-    // the 5.3 with previous and the previous between 0.3-0.7 should round down to 5
-    TEST_ASSERT_EQUAL(5, undertest.ZeigerEvalHybridNeu(5.3, 0.7, 1));
-
-    // the 5.3 with previous and the previous <=0.5 should trunc to 5
-    TEST_ASSERT_EQUAL(5, undertest.ZeigerEvalHybridNeu(5.3, 0.1, 1));
-
-    // the 5.3 with previous and the previous >=9.5 should reduce to 4
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalHybridNeu(5.3, 9.6, 9));
-
-    // the 5.7 with previous and the previous >=9.5 should trunc to 5
-    TEST_ASSERT_EQUAL(5, undertest.ZeigerEvalHybridNeu(5.7, 9.6, 9));
-
-    // the 4.5 (digital100) is not above 5  and the previous digit (analog) not over Zero (9.6)
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalHybridNeu(4.5, 9.6, 0));    
-
-    // the 4.5 (digital100) is not above 5  and the previous digit (analog) not over Zero (9.6)
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalHybridNeu(4.5, 9.6, 9));    
-    // the 4.5 (digital100) is not above 5  and the previous digit (analog) not over Zero (9.5)
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalHybridNeu(4.5, 9.5, 9));    
-
-    // 59.96889 - Pre: 58.94888
-    // 8.6 : 9.8 : 6.7
-    // the 4.4 (digital100) is not above 5  and the previous digit (analog) not over Zero (9.5)
-    TEST_ASSERT_EQUAL(8, undertest.ZeigerEvalHybridNeu(8.6, 9.8, 9));    
-
-    // pre = 9.9 (0.0 raw)
-    // zahl = 1.8
-    TEST_ASSERT_EQUAL(2, undertest.ZeigerEvalHybridNeu(1.8, 9.0, 9));    
- 
-    // if a digit have an early transition and the pointer is < 9.0 
-    // prev (pointer) = 6.2, but on digital readout = 6.0 (prev is int parameter)
-    // zahl = 4.6
-    TEST_ASSERT_EQUAL(4, undertest.ZeigerEvalHybridNeu(4.6, 6.0, 6));    
- 
-    
-    // issue #879 vorgaenger is -1, zahl = 6.7
-    //TEST_ASSERT_EQUAL(7, undertest.ZeigerEvalHybrid(6.7, -1.0, -1));    
-
-
-}
-

+ 110 - 1
code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp

@@ -101,7 +101,7 @@ void test_doFlow() {
 
 
         digits = { 1.1, 9.0, 4.0};
         digits = { 1.1, 9.0, 4.0};
         analogs = { 8.1, 2.6, 6.25, 9.7};
         analogs = { 8.1, 2.6, 6.25, 9.7};
-        expected = "194.8259";
+        expected = "193.8259";
         result = process_doFlow(analogs, digits);
         result = process_doFlow(analogs, digits);
         TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
         TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
 
 
@@ -303,6 +303,113 @@ void test_doFlow() {
         result = process_doFlow(analogs, digits, Digital100, false, true, -3);
         result = process_doFlow(analogs, digits, Digital100, false, true, -3);
         TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
         TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
 
 
+       // Fehler bei V12.0.1 
+        // Lokal
+        digits = { 9.8, 9.8, 1.9, 0.9, 0.9, 9.9, 2.9, 4.8};  // 211.0355 als falsches Ergebnis
+        analogs = { 5.5};
+        expected = "211.0345";
+        expected_extended= "211.03455";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, -3);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, -3);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+       // Fehler bei V12.0.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1277425333
+        digits = { 2.2, 4.5, 5.9};  // 245.938 als falsches Ergebnis
+        analogs = { 9.4, 3.8, 8.6};
+        expected = "245.938";
+        expected_extended= "245.9386";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+      // Fehler bei V12.0.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1277425333
+        digits = { 2.2, 4.5, 5.9};  // 245.938 kein Fehler. Aber Grenzfall, deshalb mit als Test aufgenommen.
+        analogs = { 9.4, 3.8, 8.6};
+        expected = "245.938";
+        expected_extended= "245.9386";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+        // Fehler bei V12.0.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1265523710
+        digits = { 2.0, 4.0, 6.8};  // 246.2045 als falsches Ergebnis
+        analogs = { 2.2, 0.1, 4.5};
+        expected = "247.204";
+        expected_extended= "247.2045";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+        
+        // Fehler bei V12.0.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issue-1391153343
+        digits = { 1.0, 4.0, 2.0};  // 142.9269 als falsches Ergebnis
+        analogs = { 9.2, 2.5, 6.8, 9.0};
+        expected = "141.9269";
+        expected_extended= "141.92690";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+
+       // Fehler bei V12.0.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1110#issuecomment-1262626388
+        digits = { 1.2, 6.8, 0.0, 0.0, 5.0, 2.8};  //170.05387 als falsches Ergebnis
+        analogs = { 8.7};
+        expected = "170.0528";
+        expected_extended= "170.05287";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, -3);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, -3);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
+
+        // Fehler bei rolling post V12.0.1 
+        // lokal watermeter1
+        digits = { 0.0, 0.0, 9.0, 1.0};  //91.88174 als falsches Ergebnis
+        analogs = {9.0,  8.0, 1.8, 7.4};
+        expected = "90.8817";
+        expected_extended= "90.88174";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
 
 
 }
 }
 
 
@@ -388,9 +495,11 @@ std::string process_doFlow(std::vector<float> analog, std::vector<float> digits,
     }
     }
 
 
     string time;
     string time;
+ 
     // run test
     // run test
     TEST_ASSERT_TRUE(undertestPost->doFlow(time));
     TEST_ASSERT_TRUE(undertestPost->doFlow(time));
 
 
+ 
     return undertestPost->getReadout(0);
     return undertestPost->getReadout(0);
 
 
 }
 }

+ 19 - 3
code/test/test_suite_flowcontroll.cpp

@@ -1,5 +1,4 @@
 #include <unity.h>
 #include <unity.h>
-#include "components/jomjol-flowcontroll/test_cnnflowcontroll.cpp"
 #include "components/jomjol-flowcontroll/test_flowpostprocessing.cpp"
 #include "components/jomjol-flowcontroll/test_flowpostprocessing.cpp"
 // SD-Card ////////////////////
 // SD-Card ////////////////////
 #include "nvs_flash.h"
 #include "nvs_flash.h"
@@ -8,6 +7,24 @@
 #include "driver/sdmmc_host.h"
 #include "driver/sdmmc_host.h"
 #include "driver/sdmmc_defs.h"
 #include "driver/sdmmc_defs.h"
 static const char *TAGMAIN = "main";
 static const char *TAGMAIN = "main";
+#define __SD_USE_ONE_LINE_MODE__
+#include "server_GPIO.h"
+
+
+
+
+void initGPIO()
+{
+    gpio_config_t io_conf;
+    //set as output mode
+    io_conf.mode = gpio_mode_t::GPIO_MODE_INPUT;
+    //bit mask of the pins that you want to set,e.g.GPIO18/19
+     io_conf.pull_down_en =  gpio_pulldown_t::GPIO_PULLDOWN_ENABLE;
+    //set pull-up mode
+    io_conf.pull_up_en =  gpio_pullup_t::GPIO_PULLUP_DISABLE;
+    //configure GPIO with the given settings
+    gpio_config(&io_conf);
+}
 
 
 bool Init_NVS_SDCard()
 bool Init_NVS_SDCard()
 {
 {
@@ -80,11 +97,10 @@ bool Init_NVS_SDCard()
  */
  */
 extern "C" void app_main()
 extern "C" void app_main()
 {
 {
+  initGPIO();
   Init_NVS_SDCard();
   Init_NVS_SDCard();
   UNITY_BEGIN();
   UNITY_BEGIN();
 
 
-//  RUN_TEST(test_ZeigerEval);
-//  RUN_TEST(test_ZeigerEvalHybrid);
   RUN_TEST(test_doFlow);
   RUN_TEST(test_doFlow);
   
   
   UNITY_END();
   UNITY_END();

Разница между файлами не показана из-за своего большого размера
+ 199 - 286
sd-card/html/edit_config_param.html


Некоторые файлы не были показаны из-за большого количества измененных файлов