Parameters
-
This page lists all available Configuration Parameters.
-
Click on them to get detailed information about them.
-
Note: This is an auto-generated page!
-
+
This page lists all available Configuration Parameters.
+
+
Note
+
This is an auto-generated page! See the README for details!
+
-
Alignment
-
AlignmentAlgo
+
[Alignment]
+
Parameter AlignmentAlgo
Default Value: Default
Description
-
Example
+
Please fill me with an explanation and useful links
-
FlipImageSize
+
Parameter FlipImageSize
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
InitialMirror
+
Parameter InitialMirror
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
InitialRotate
+
Parameter InitialRotate
Default Value: 179
Description
-
Example
+
Please fill me with an explanation and useful links
-
SearchFieldX
+
Parameter SearchFieldX
Default Value: 20
Description
-
Example
+
Please fill me with an explanation and useful links
-
SearchFieldY
+
Parameter SearchFieldY
Default Value: 20
Description
-
Example
+
Please fill me with an explanation and useful links
-
Analog
-
CNNGoodThreshold
+
[Analog]
+
Parameter CNNGoodThreshold
Default Value: 0.5
Description
-
Example
+
Please fill me with an explanation and useful links
-
ExtendedResolution
+
Parameter ExtendedResolution
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogImageLocation
+
Parameter LogImageLocation
Default Value: /log/analog
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogfileRetentionInDays
+
Parameter LogfileRetentionInDays
Default Value: 3
Description
-
Example
+
Please fill me with an explanation and useful links
-
Model
+
Parameter Model
Default Value: /config/ana-cont_11.3.1_s2.tflite
Description
-
Example
+
Please fill me with an explanation and useful links
-
AutoTimer
-
AutoStart
+
[AutoTimer]
+
Parameter AutoStart
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
Intervall
+
Parameter Intervall
Default Value: 5
Description
-
Example
+
Please fill me with an explanation and useful links
-
DataLogging
-
DataLogActive
+
[DataLogging]
+
Parameter DataLogActive
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
DataLogRetentionInDays
+
Parameter DataLogRetentionInDays
Default Value: 3
Description
-
Example
+
Please fill me with an explanation and useful links
-
Debug
-
Logfile
+
[Debug]
+
Parameter Logfile
Default Value: 1
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogfileRetentionInDays
+
Parameter LogfileRetentionInDays
Default Value: 3
Description
-
Example
+
Please fill me with an explanation and useful links
-
Digits
-
CNNGoodThreshold
+
[Digits]
+
Parameter CNNGoodThreshold
Default Value: 0.5
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogImageLocation
+
Parameter LogImageLocation
Default Value: /log/digit
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogfileRetentionInDays
+
Parameter LogfileRetentionInDays
Default Value: 3
Description
-
Example
+
Please fill me with an explanation and useful links
-
Model
+
Parameter Model
Default Value: /config/dig-cont_0600_s3.tflite
Description
-
Example
+
Please fill me with an explanation and useful links
-
GPIO
-
IO0
+
[GPIO]
+
Parameter IO0
Default Value: input disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
IO1
+
Parameter IO1
Default Value: input disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
IO12
+
Parameter IO12
Default Value: input-pullup disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
IO13
+
Parameter IO13
Default Value: input-pullup disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
IO3
+
Parameter IO3
Default Value: input disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
IO4
+
Parameter IO4
Default Value: built-in-led disabled 10 false false
Description
-
Example
+
Please fill me with an explanation and useful links
-
LEDColor
+
Parameter LEDColor
Default Value: 150 150 150
Description
-
Example
+
Please fill me with an explanation and useful links
-
LEDNumbers
+
Parameter LEDNumbers
Default Value: 2
Description
-
Example
+
Please fill me with an explanation and useful links
-
LEDType
+
Parameter LEDType
Default Value: WS2812
Description
-
Example
+
Please fill me with an explanation and useful links
-
MainTopicMQTT
+
Parameter MainTopicMQTT
Default Value: wasserzaehler/GPIO
Description
-
Example
+
Please fill me with an explanation and useful links
-
InfluxDB
-
Database
+
[InfluxDB]
+
Parameter Database
Default Value: ``
Description
-
Example
+
Please fill me with an explanation and useful links
-
Measurement
+
Parameter Measurement
Default Value: undefined
Description
-
Example
+
Please fill me with an explanation and useful links
-
Uri
+
Parameter Uri
Default Value: undefined
Description
-
Example
+
Please fill me with an explanation and useful links
-
password
+
Parameter password
Default Value: undefined
Description
-
Example
+
Please fill me with an explanation and useful links
-
user
+
Parameter user
Default Value: undefined
Description
-
Example
+
Please fill me with an explanation and useful links
-
MQTT
-
ClientID
+
[MQTT]
+
Parameter ClientID
Default Value: watermeter
Description
-
Example
+
Please fill me with an explanation and useful links
-
HomeassistantDiscovery
+
Parameter HomeassistantDiscovery
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
MainTopic
+
Parameter MainTopic
Default Value: watermeter
Description
-
Example
+
Please fill me with an explanation and useful links
-
MeterType
+
Parameter MeterType
Default Value: other
Description
-
Example
+
Please fill me with an explanation and useful links
-
SetRetainFlag
+
Parameter SetRetainFlag
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
Uri
+
Parameter Uri
Default Value: mqtt://IP-ADRESS:1883
Description
-
Example
+
Please fill me with an explanation and useful links
-
password
+
Parameter password
Default Value: PASSWORD
Description
-
Example
+
Please fill me with an explanation and useful links
-
user
+
Parameter user
Default Value: USERNAME
Description
-
Example
+
Please fill me with an explanation and useful links
-
MakeImage
-
Brightness
+
[MakeImage]
+
Parameter Brightness
Default Value: 0
Description
-
Example
+
Please fill me with an explanation and useful links
-
Contrast
+
Parameter Contrast
Default Value: 0
Description
-
Example
+
Please fill me with an explanation and useful links
-
Demo
+
Parameter Demo
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
FixedExposure
+
Parameter FixedExposure
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
ImageQuality
+
Parameter ImageQuality
Default Value: 12
Description
-
Example
+
Please fill me with an explanation and useful links
-
ImageSize
+
Parameter ImageSize
Default Value: VGA
Description
-
Example
+
Please fill me with an explanation and useful links
-
LEDIntensity
+
Parameter LEDIntensity
Default Value: 50
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogImageLocation
+
Parameter LogImageLocation
Default Value: /log/source
Description
-
Example
+
Please fill me with an explanation and useful links
-
LogfileRetentionInDays
+
Parameter LogfileRetentionInDays
Default Value: 15
Description
-
Example
+
Please fill me with an explanation and useful links
-
Saturation
+
Parameter Saturation
Default Value: 0
Description
-
Example
+
Please fill me with an explanation and useful links
-
WaitBeforeTakingPicture
+
Parameter WaitBeforeTakingPicture
Default Value: 5
Description
-
Example
+
Please fill me with an explanation and useful links
-
PostProcessing
-
AllowNegativeRates
+
[PostProcessing]
+
Parameter AllowNegativeRates
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
CheckDigitIncreaseConsistency
+
Parameter CheckDigitIncreaseConsistency
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
ErrorMessage
+
Parameter ErrorMessage
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
PreValueAgeStartup
+
Parameter PreValueAgeStartup
Default Value: 720
Description
-
Example
+
Please fill me with an explanation and useful links
-
PreValueUse
+
Parameter PreValueUse
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.AnalogDigitalTransitionStart
+
Parameter main.AnalogDigitalTransitionStart
Default Value: 9.2
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.DecimalShift
+
Parameter main.DecimalShift
Default Value: 0
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.ExtendedResolution
+
Parameter main.ExtendedResolution
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.IgnoreLeadingNaN
+
Parameter main.IgnoreLeadingNaN
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.MaxRateType
+
Parameter main.MaxRateType
Default Value: AbsoluteChange
Description
-
Example
+
Please fill me with an explanation and useful links
-
main.MaxRateValue
+
Parameter main.MaxRateValue
Default Value: 0.05
Description
-
Example
+
Please fill me with an explanation and useful links
-
System
-
AutoAdjustSummertime
+
[System]
+
Parameter AutoAdjustSummertime
Default Value: false
Description
-
Example
+
Please fill me with an explanation and useful links
-
Hostname
+
Parameter Hostname
Default Value: undefined
Description
-
Example
+
Please fill me with an explanation and useful links
-
SetupMode
+
Parameter SetupMode
Default Value: true
Description
-
Example
+
Please fill me with an explanation and useful links
-
TimeServer
+
Parameter TimeServer
Default Value: pool.ntp.org
Description
-
Example
+
Please fill me with an explanation and useful links
-
TimeZone
+
Parameter TimeZone
Default Value: CET-1CEST,M3.5.0,M10.5.0/3
Description
-
Example
+
Please fill me with an explanation and useful links
diff --git a/search/search_index.json b/search/search_index.json
index 9587d00..f248ed3 100644
--- a/search/search_index.json
+++ b/search/search_index.json
@@ -1 +1 @@
-{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome Welcome to the AI-on-the-edge-device project! This is the documentation. For the source code, please head to github.com/jomjol/AI-on-the-edge-device . Artificial intelligence based systems have been established in our everyday lives. Just think of speech or image recognition. Most of the systems rely on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called edge computing . Here this edge computing is brought into a practice-oriented example, where a AI network is implemented on a ESP32 device so: AI on the edge . Key features Tensorflow Lite (TFlite) integration - including easy to use wrapper Inline image processing (feature detection, alignment, ROI extraction) Small and cheap device (3x4.5x2 cm\u00b3, < 10 EUR) Camera and illumination integrated Web surface to administrate and control OTA-Interface to update directly through the web interface Full integration into Home Assistant Support for Influx DB 1 MQTT REST API Idea Hardware Web interface Configuration Interface Have fun in studying the new possibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted and offers the data as an API in different options. The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore, the task is solved by regularly taking an image of the water meter and digitizing the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings. This project is an evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural network's backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD card as data storage.","title":"Welcome"},{"location":"#welcome","text":"Welcome to the AI-on-the-edge-device project! This is the documentation. For the source code, please head to github.com/jomjol/AI-on-the-edge-device . Artificial intelligence based systems have been established in our everyday lives. Just think of speech or image recognition. Most of the systems rely on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called edge computing . Here this edge computing is brought into a practice-oriented example, where a AI network is implemented on a ESP32 device so: AI on the edge .","title":"Welcome"},{"location":"#key-features","text":"Tensorflow Lite (TFlite) integration - including easy to use wrapper Inline image processing (feature detection, alignment, ROI extraction) Small and cheap device (3x4.5x2 cm\u00b3, < 10 EUR) Camera and illumination integrated Web surface to administrate and control OTA-Interface to update directly through the web interface Full integration into Home Assistant Support for Influx DB 1 MQTT REST API","title":"Key features"},{"location":"#idea","text":"","title":"Idea"},{"location":"#hardware","text":"","title":"Hardware"},{"location":"#web-interface","text":"","title":"Web interface"},{"location":"#configuration-interface","text":"Have fun in studying the new possibilities and ideas This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device. This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted and offers the data as an API in different options. The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore, the task is solved by regularly taking an image of the water meter and digitizing the reading. There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings. This project is an evolution of the water-meter-system-complete , which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural network's backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD card as data storage.","title":"Configuration Interface"},{"location":"Additional-Information/","text":"The following links point to additional information in other repos: Digits Training and using a neural network to readout the value of a digital counter Training the CNN neural network Analog Training and using a neural network to read out the value of an analog display Training the CNN neural network","title":"Additional Information"},{"location":"Additional-Information/#digits","text":"Training and using a neural network to readout the value of a digital counter Training the CNN neural network","title":"Digits"},{"location":"Additional-Information/#analog","text":"Training and using a neural network to read out the value of an analog display Training the CNN neural network","title":"Analog"},{"location":"Best-Practice/","text":"Best Practice This page shows some best practices: Camera Placement Move the Camera as close as possible (~4cm), this will help get rid of reflections. -> focus can be adjusted by turning the outer black ring of the camera. If the LED reflections are too strong, put tape over the LED to diffuse the light Change the ImageSize to QVGA under \"Expert mode\" configuration when close enough, this will be faster and is often good enough for digital recognition. Reflections Try to get rid of the reflections by rotating the camera, so that the reflections are at positions, where no number is. By using the external LED option, you can place WS2812 LEDs freely away from the main axis. Users report, that a handy cover foil could also help Post-processing Filter out the Number \"9\", as \"3\" will often be misread for a \"9\" and void every number between 3 and 9 due to it being negative flow. Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading. -> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of \"3\", it needs to become \"0.3\". This can be done wherever the data ends up being sent, like home assistant using sensor templates. If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under \"Expert mode\" in configuration, as the normal mode will lock you to 3+ minutes.","title":"Best Practice"},{"location":"Best-Practice/#best-practice","text":"This page shows some best practices:","title":"Best Practice"},{"location":"Best-Practice/#camera-placement","text":"Move the Camera as close as possible (~4cm), this will help get rid of reflections. -> focus can be adjusted by turning the outer black ring of the camera. If the LED reflections are too strong, put tape over the LED to diffuse the light Change the ImageSize to QVGA under \"Expert mode\" configuration when close enough, this will be faster and is often good enough for digital recognition.","title":"Camera Placement"},{"location":"Best-Practice/#reflections","text":"Try to get rid of the reflections by rotating the camera, so that the reflections are at positions, where no number is. By using the external LED option, you can place WS2812 LEDs freely away from the main axis. Users report, that a handy cover foil could also help","title":"Reflections"},{"location":"Best-Practice/#post-processing","text":"Filter out the Number \"9\", as \"3\" will often be misread for a \"9\" and void every number between 3 and 9 due to it being negative flow. Split the readings into two, while the decimal numbers might move to fast to be recognized, at least the slower moving part will produce a correct reading. -> keep in mind that the offset needs to be adjusted, a.e if you have a comma reading of \"3\", it needs to become \"0.3\". This can be done wherever the data ends up being sent, like home assistant using sensor templates. If you are using a low resolution and only digital mode, processing can often be done in <1 minute. Check the logs to confirm how fast it is and then set the interval accordingly under \"Expert mode\" in configuration, as the normal mode will lock you to 3+ minutes.","title":"Post-processing"},{"location":"Build-Instructions/","text":"Build the Project See README.md","title":"Build the Project"},{"location":"Build-Instructions/#build-the-project","text":"See README.md","title":"Build the Project"},{"location":"Choosing-the-Model/","text":"Model Selection Warning This page overlaps Neural Network Types . They should be merged to one page! In the Graphical Configuration Page , you can choose different models depending on your needs. This page tries to help you on which model to select. For more technical/deeper explanations have a look on Neural-Network-Types . Digit Models For digits on water meters, gas-meters or power meters you can select between two main types of models. dig-class11 This model can recognize full digits. All intermediate states shown a \"N\" for not a number. But in post process it uses older values to fill up the \"N\" values if possible. Main features well suited for LCD digits with the ExtendedResolution option is not supported. (Only in conjunction with ana-class100 / ana-cont) dig-class100 / dig-cont These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page. Main features suitable for all digit displays. Advantage over dig-class11 that results continue to be calculated in the transition between digits. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of digit images used for the training dig-class100 vs. dig-cont The difference is in the internal processing. Take the one that gives you the best results. Analog pointer models ana-class100 / ana-cont For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same. Main features for all analogue pointers, especially for water meters. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of pointer images used for the training ana-class100 vs. ana-cont The difference is in the internal processing. Take the one that gives you the best results. Both models learn from the same data.","title":"Model Selection"},{"location":"Choosing-the-Model/#model-selection","text":"Warning This page overlaps Neural Network Types . They should be merged to one page! In the Graphical Configuration Page , you can choose different models depending on your needs. This page tries to help you on which model to select. For more technical/deeper explanations have a look on Neural-Network-Types .","title":"Model Selection"},{"location":"Choosing-the-Model/#digit-models","text":"For digits on water meters, gas-meters or power meters you can select between two main types of models.","title":"Digit Models"},{"location":"Choosing-the-Model/#dig-class11","text":"This model can recognize full digits. All intermediate states shown a \"N\" for not a number. But in post process it uses older values to fill up the \"N\" values if possible.","title":"dig-class11"},{"location":"Choosing-the-Model/#main-features","text":"well suited for LCD digits with the ExtendedResolution option is not supported. (Only in conjunction with ana-class100 / ana-cont)","title":"Main features"},{"location":"Choosing-the-Model/#dig-class100-dig-cont","text":"These models are used to get a continuous reading with intermediate states. To see what the models are doing, you can go to the Recognition page.","title":"dig-class100 / dig-cont"},{"location":"Choosing-the-Model/#main-features_1","text":"suitable for all digit displays. Advantage over dig-class11 that results continue to be calculated in the transition between digits. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of digit images used for the training","title":"Main features"},{"location":"Choosing-the-Model/#dig-class100-vs-dig-cont","text":"The difference is in the internal processing. Take the one that gives you the best results.","title":"dig-class100 vs. dig-cont"},{"location":"Choosing-the-Model/#analog-pointer-models","text":"","title":"Analog pointer models"},{"location":"Choosing-the-Model/#ana-class100-ana-cont","text":"For pointers on water meters use the analog models. You can only choose between ana-class100 and ana-cont. Both do mainly the same.","title":"ana-class100 / ana-cont"},{"location":"Choosing-the-Model/#main-features_2","text":"for all analogue pointers, especially for water meters. With the ExtendedResolution option, higher accuracy is possible by adding another digit. Look here for a list of pointer images used for the training","title":"Main features"},{"location":"Choosing-the-Model/#ana-class100-vs-ana-cont","text":"The difference is in the internal processing. Take the one that gives you the best results. Both models learn from the same data.","title":"ana-class100 vs. ana-cont"},{"location":"Configuration-Parameter-Details/","text":"Configuration Parameter Details [MakeImage] [MakeImage] LogImageLocation = /log/source WaitBeforeTakingPicture = 5 LogfileRetentionInDays = 15 Brightness = -2 ;Contrast = 0 ;Saturation = 0 ImageQuality = 5 ImageSize = VGA FixedExposure = true Parameter Meaning Options/Examples LogImageLocation location for storing a copy of the image WaitBeforeTakingPicture waiting time between switch on the flash-light and taking the image in seconds LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever Brightness Adjustment of the camera brightness (-2 ... 2) Contrast NOT IMPLEMENTED Saturation NOT IMPLEMENTED ImageQuality Input image jpg-compression quality 0 (best) to 100 (lowest) 5 = default ImageSize Input Image Size from Camera only VGA, QVGA FixedExposure If enabled, the exposure settings are fixed at the beginning and the waiting time after switching on the illumination will be skipped [Alignment] [Alignment] InitialRotate = 179 InitialMirror = false SearchFieldX = 20 SearchFieldY = 20 AlignmentAlgo = Default FlipImageSize = false /config/ref0.jpg 104 271 /config/ref1.jpg 442 142 Parameter Meaning Options/Examples InitialMirror Option for initially mirroring the image on the original x-axis InitialRotate Initial rotation of image before alignment in degree (1...359) FlipImageSize Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged /config/refx.jpg 98, 257 Link to reference image and corresponding target coordinates file link is relative to SD card root SearchFieldX/Y Search field size in X/Y for finding the reference images [pixel] Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size. [Digits] [Digits] Model=/config/digits.tfl ModelInputSize 20, 32 LogImageLocation = /log/digit LogfileRetentionInDays = 2 number1.digit1 292 120 37 67 number1.digit2 340 120 37 67 number1.digit3 389 120 37 67 number2.digit1 292 180 37 67 number2.digit2 340 180 37 67 Parameter Meaning Options/Examples Model Link to the CNN-tflite file used for AI-image recognition ModelInputSize Image input size for the CNN-Network [pixel] needed to resize the ROI to the input size LogImageLocation storage location for the recognized images, including the CNN-results in the file name/location numberX.digitY ROI for the corresponding digit in the aligned image. More than one number can be specified. Therefore the name consists of a naming of the number ( numberX ) and the region of interest ( digitY ) - separated by . LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever LogImageLocation location for storing a copy of the image [Analog] [Analog] Model=/config/analog.tfl ModelInputSize 32, 32 LogImageLocation = /log/analog LogfileRetentionInDays = 2 number1.analog1, 433, 207, 99, 99 number1.analog2, 378, 313, 99, 99 number1.analog3, 280, 356, 99, 99 number1.analog4, 149, 313, 99, 99 number2.analog1, 280, 456, 99, 99 number2.analog2, 149, 413, 99, 99 Same as for [digit], here only for the analog pointers [PostProcessing] [PostProcessing] number1.DecimalShift = 0 number2.DecimalShift = -1 PreValueUse = true PreValueAgeStartup = 720 AllowNegativeRates = false number1.MaxRateValue = 0.1 number2.MaxRateValue = 0.1 ErrorMessage = true CheckDigitIncreaseConsistency = false Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples PreValueUse Use the previous value for consistency check and substitution for NaN (True / False) PreValueAgeStartup Max age of PreValue after a reboot (downtime) AllowNegativeRates Allow decrease of the readout value numberX.MaxRateValue Maximum chance rate from one to the next readout. This can be specified for each number individual. ErrorMessage Show error messages numberX.DecimalShift Shifting of the decimal separator from the default position between digital and analog. This can be specified for each number individual. DecimalShift = 2: 123.456 --> 12345.6 DecimalShift = -1: 123.456 --> 12.3456 CheckDigitIncreaseConsistency This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes too quickly, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1). [MQTT] [MQTT] Uri = mqtt://IP-ADRESS:1883 MainTopic = wasserzaehler ClientID = wasser user = USERNAME password = PASSWORD Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples Uri URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port MainTopic MQTT main topic, under which the counters are published. The single value will be published with the following key: MainTopic/number/PARAMETER where parameters are: value, rate, timestamp, error and json The general connection status can be found in MainTopic/connection ClientID ClientID to connect to the MQTT broker user user for MQTT authentication (optional) password password for MQTT authentication (optional) [AutoTimer] [AutoTimer] AutoStart= true Intervall = 4.85 This paragraph is used to automatically trigger the periodic automated readout. Parameter Meaning Options/Examples AutoStart Automatically trigger the readout after startup Intervall Readout interval in minutes Values smaller than 2 minutes do not make sense, as this is the time for one detection [DataLogging] [DataLogging] DataLogActive = true DataLogRetentionInDays = 3 This paragraph is used to control the logging of the result data to a specific folder of SD card -> \\log\\data\\data_YYYY-MM-DD.csv Parameter Meaning Options/Examples DataLogActive Activate data logging to SD card DataLogRetentionInDays Number of days, for which the log files should be stored 0 = keep forever [Debug] [Debug] Logfile = true LogfileRetentionInDays = 2 This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. \u203c\ufe0f Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples Logfile Turn on (true) or off (false) the extended logging parameter and section optional LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever [System] [System] TimeZone = CET-1CEST,M3.5.0,M10.5.0/3 ;TimeServer = TIMESERVER ;Hostname = undefined SetupMode = false This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. \u203c\ufe0f Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples TimeZone TimeZone of the system can be specified Central european, with summertime adjustment: CET-1CEST,M3.5.0,M10.5.0/3 TimeServer An dedicated time server can be specified. default = pool.ntp.org Hostname Additionally to the wlan.ini the hostname can be specified. It will be transferred to the wlan.ini and initiate a reboot SetupMode If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup [Ende] No function, just to mark, that the config is done!","title":"Configuration Parameter Details"},{"location":"Configuration-Parameter-Details/#configuration-parameter-details","text":"","title":"Configuration Parameter Details"},{"location":"Configuration-Parameter-Details/#makeimage","text":"[MakeImage] LogImageLocation = /log/source WaitBeforeTakingPicture = 5 LogfileRetentionInDays = 15 Brightness = -2 ;Contrast = 0 ;Saturation = 0 ImageQuality = 5 ImageSize = VGA FixedExposure = true Parameter Meaning Options/Examples LogImageLocation location for storing a copy of the image WaitBeforeTakingPicture waiting time between switch on the flash-light and taking the image in seconds LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever Brightness Adjustment of the camera brightness (-2 ... 2) Contrast NOT IMPLEMENTED Saturation NOT IMPLEMENTED ImageQuality Input image jpg-compression quality 0 (best) to 100 (lowest) 5 = default ImageSize Input Image Size from Camera only VGA, QVGA FixedExposure If enabled, the exposure settings are fixed at the beginning and the waiting time after switching on the illumination will be skipped","title":"[MakeImage]"},{"location":"Configuration-Parameter-Details/#alignment","text":"[Alignment] InitialRotate = 179 InitialMirror = false SearchFieldX = 20 SearchFieldY = 20 AlignmentAlgo = Default FlipImageSize = false /config/ref0.jpg 104 271 /config/ref1.jpg 442 142 Parameter Meaning Options/Examples InitialMirror Option for initially mirroring the image on the original x-axis InitialRotate Initial rotation of image before alignment in degree (1...359) FlipImageSize Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged /config/refx.jpg 98, 257 Link to reference image and corresponding target coordinates file link is relative to SD card root SearchFieldX/Y Search field size in X/Y for finding the reference images [pixel] Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size.","title":"[Alignment]"},{"location":"Configuration-Parameter-Details/#digits","text":"[Digits] Model=/config/digits.tfl ModelInputSize 20, 32 LogImageLocation = /log/digit LogfileRetentionInDays = 2 number1.digit1 292 120 37 67 number1.digit2 340 120 37 67 number1.digit3 389 120 37 67 number2.digit1 292 180 37 67 number2.digit2 340 180 37 67 Parameter Meaning Options/Examples Model Link to the CNN-tflite file used for AI-image recognition ModelInputSize Image input size for the CNN-Network [pixel] needed to resize the ROI to the input size LogImageLocation storage location for the recognized images, including the CNN-results in the file name/location numberX.digitY ROI for the corresponding digit in the aligned image. More than one number can be specified. Therefore the name consists of a naming of the number ( numberX ) and the region of interest ( digitY ) - separated by . LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever LogImageLocation location for storing a copy of the image","title":"[Digits]"},{"location":"Configuration-Parameter-Details/#analog","text":"[Analog] Model=/config/analog.tfl ModelInputSize 32, 32 LogImageLocation = /log/analog LogfileRetentionInDays = 2 number1.analog1, 433, 207, 99, 99 number1.analog2, 378, 313, 99, 99 number1.analog3, 280, 356, 99, 99 number1.analog4, 149, 313, 99, 99 number2.analog1, 280, 456, 99, 99 number2.analog2, 149, 413, 99, 99 Same as for [digit], here only for the analog pointers","title":"[Analog]"},{"location":"Configuration-Parameter-Details/#postprocessing","text":"[PostProcessing] number1.DecimalShift = 0 number2.DecimalShift = -1 PreValueUse = true PreValueAgeStartup = 720 AllowNegativeRates = false number1.MaxRateValue = 0.1 number2.MaxRateValue = 0.1 ErrorMessage = true CheckDigitIncreaseConsistency = false Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples PreValueUse Use the previous value for consistency check and substitution for NaN (True / False) PreValueAgeStartup Max age of PreValue after a reboot (downtime) AllowNegativeRates Allow decrease of the readout value numberX.MaxRateValue Maximum chance rate from one to the next readout. This can be specified for each number individual. ErrorMessage Show error messages numberX.DecimalShift Shifting of the decimal separator from the default position between digital and analog. This can be specified for each number individual. DecimalShift = 2: 123.456 --> 12345.6 DecimalShift = -1: 123.456 --> 12.3456 CheckDigitIncreaseConsistency This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes too quickly, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1).","title":"[PostProcessing]"},{"location":"Configuration-Parameter-Details/#mqtt","text":"[MQTT] Uri = mqtt://IP-ADRESS:1883 MainTopic = wasserzaehler ClientID = wasser user = USERNAME password = PASSWORD Here the post processing and consistency check for the readout can be adjusted Parameter Meaning Options/Examples Uri URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port MainTopic MQTT main topic, under which the counters are published. The single value will be published with the following key: MainTopic/number/PARAMETER where parameters are: value, rate, timestamp, error and json The general connection status can be found in MainTopic/connection ClientID ClientID to connect to the MQTT broker user user for MQTT authentication (optional) password password for MQTT authentication (optional)","title":"[MQTT]"},{"location":"Configuration-Parameter-Details/#autotimer","text":"[AutoTimer] AutoStart= true Intervall = 4.85 This paragraph is used to automatically trigger the periodic automated readout. Parameter Meaning Options/Examples AutoStart Automatically trigger the readout after startup Intervall Readout interval in minutes Values smaller than 2 minutes do not make sense, as this is the time for one detection","title":"[AutoTimer]"},{"location":"Configuration-Parameter-Details/#datalogging","text":"[DataLogging] DataLogActive = true DataLogRetentionInDays = 3 This paragraph is used to control the logging of the result data to a specific folder of SD card -> \\log\\data\\data_YYYY-MM-DD.csv Parameter Meaning Options/Examples DataLogActive Activate data logging to SD card DataLogRetentionInDays Number of days, for which the log files should be stored 0 = keep forever","title":"[DataLogging]"},{"location":"Configuration-Parameter-Details/#debug","text":"[Debug] Logfile = true LogfileRetentionInDays = 2 This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. \u203c\ufe0f Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples Logfile Turn on (true) or off (false) the extended logging parameter and section optional LogfileRetentionInDays Number of days, for which the log files should be stored 0 = keep forever","title":"[Debug]"},{"location":"Configuration-Parameter-Details/#system","text":"[System] TimeZone = CET-1CEST,M3.5.0,M10.5.0/3 ;TimeServer = TIMESERVER ;Hostname = undefined SetupMode = false This paragraph is used to switch on an extended logging. It is optional and by default only a minimum logging is enabled. \u203c\ufe0f Attention: in case of extended logging the size of the log file ( /log.txt , /alignment.txt ) might increase rapidly, therefore manually deletion from time to time is recommended Parameter Meaning Options/Examples TimeZone TimeZone of the system can be specified Central european, with summertime adjustment: CET-1CEST,M3.5.0,M10.5.0/3 TimeServer An dedicated time server can be specified. default = pool.ntp.org Hostname Additionally to the wlan.ini the hostname can be specified. It will be transferred to the wlan.ini and initiate a reboot SetupMode If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup","title":"[System]"},{"location":"Configuration-Parameter-Details/#ende","text":"No function, just to mark, that the config is done!","title":"[Ende]"},{"location":"Configuration/","text":"Configuration Warning This page overlaps Graphical-Configuration . They should be merged to one page! Most of the settings can be modified with the help of a web based graphical user interface . This is hosted through the web server on the ESP32. More configuration parameters can be edited by hand in the config.ini and corresponding files in the /config directory on the SD-card. If you where using the Version 1 of the water meter you can easily transfer the configuration to the new system by following the steps in this migration description Processing / Config.ini principle The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the config.ini , which is indicated by brackets [name_of_step] . The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing. Processing steps - Overview In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present) 1. [MakeImage] This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set. 2. [Alignment] Image preprocessing, including image alignment with reference images 3. [Digits] Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough) 4. [Analog] Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer. 5. [PostProcessing] Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading. 6. [MQTT] Transfer of the readings to a MQTT server. 7. [AutoTimer] Configuration of the automated flow start at the start up of the ESP32. 8. [Debug] Configuration for debugging details 9. [Ende] No meaning, just an additional indication, that the configuration is finished. A detailed parameter description can be found here: [[Configuration Parameter Details]]. Graphical configuration interface It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]] Background for Image Alignment Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf The config.ini here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see here . Integration into Home Assistant Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]","title":"Configuration"},{"location":"Configuration/#configuration","text":"Warning This page overlaps Graphical-Configuration . They should be merged to one page! Most of the settings can be modified with the help of a web based graphical user interface . This is hosted through the web server on the ESP32. More configuration parameters can be edited by hand in the config.ini and corresponding files in the /config directory on the SD-card. If you where using the Version 1 of the water meter you can easily transfer the configuration to the new system by following the steps in this migration description","title":"Configuration"},{"location":"Configuration/#processing-configini-principle","text":"The principle is very simple and can most easily be described as a flow of processing steps. Each step has a dedicated parameter description in the config.ini , which is indicated by brackets [name_of_step] . The steps are processed in the order written in the config file. That means, that you first have to describe the image taking, then the aligning and cutting and only after that you can start to config a neural network. The last step is the post processing.","title":"Processing / Config.ini principle"},{"location":"Configuration/#processing-steps-overview","text":"In the following you get a short overview over the available steps. This order is also the suggested order for the processing flow. Single steps can be left out, if not needed (e.g. omit the analog part, if only digits are present)","title":"Processing steps - Overview"},{"location":"Configuration/#1-makeimage","text":"This steps parametrises the taking of the image by the ESP32-CAM. Size, quality and storage for logging and debugging can be set.","title":"1. [MakeImage]"},{"location":"Configuration/#2-alignment","text":"Image preprocessing, including image alignment with reference images","title":"2. [Alignment]"},{"location":"Configuration/#3-digits","text":"Neural network evaluation of an image for digits. The neural network is defined by a tflite formatted file and the output is a number between 0 .. 9 or NaN (if image is not unique enough)","title":"3. [Digits]"},{"location":"Configuration/#4-analog","text":"Neural network evaluation of analog counter. The neural network is defined by a tflite formatted file and the output is a number between 0.0 .. 9.9, representing the position of the pointer.","title":"4. [Analog]"},{"location":"Configuration/#5-postprocessing","text":"Summarized the individually converted pictures to the overall result. It also implements some error corrections and consistency checks to filter wrong reading.","title":"5. [PostProcessing]"},{"location":"Configuration/#6-mqtt","text":"Transfer of the readings to a MQTT server.","title":"6. [MQTT]"},{"location":"Configuration/#7-autotimer","text":"Configuration of the automated flow start at the start up of the ESP32.","title":"7. [AutoTimer]"},{"location":"Configuration/#8-debug","text":"Configuration for debugging details","title":"8. [Debug]"},{"location":"Configuration/#9-ende","text":"No meaning, just an additional indication, that the configuration is finished. A detailed parameter description can be found here: [[Configuration Parameter Details]].","title":"9. [Ende]"},{"location":"Configuration/#graphical-configuration-interface","text":"It is recommended to do the configuration of the alignment structures and ROIs through the graphical user interface. A step by step instruction can be found here: [[Graphical Configuration]]","title":"Graphical configuration interface"},{"location":"Configuration/#background-for-image-alignment","text":"Details on the image recognition flow can be found in the other project here: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf The config.ini here has the same functionality and options, but a slightly different syntax due to a own written ini-parser is used. Migration see here .","title":"Background for Image Alignment"},{"location":"Configuration/#integration-into-home-assistant","text":"Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]","title":"Integration into Home Assistant"},{"location":"Correction%20Algorithm/","text":"Correction Algorithm After the digitization of the images and the composition to a number a checking and correction algorithm is applied. This is explained here. There are several reasons, that a check might be necessary: In case of digits there is the output of \"N\" (=NaN = Not-a-Number) in case the digit cannot be detected correctly. This happens for example if the image shows a digit between to states The replacement of the \"N\" with a previous value could be not sufficient, due to the fact, that it might have changed. There is a misreading of one one of the numbers. This can always happen in case of neural network processing. Terms and definitions PreValue The last correct read value. Either from a previous correctly identified value or manual setting by the user. This is used to replace \"N\"s and make a check for the absolute change. Digits Value that are digitized from a digital number. There are 11 allowed values for this: Digits: 0, 1, 2, ... 9 N = Not-a-Number - representing a not unique state between two numbers Analogs This are value derived from a pointer like meter. This never has the state \"N\". CheckDigitIncreaseConsistency If this is enabled an \"intelligent\" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the sub-digit has gone through zero. For example: 16.6 --> 16.7 --> 1N.8 --> 17.9 corrected to 16.9 --> 17.0 --> 17.1 As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the sub-digit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9 A detailed description of the algorithm can be found below (not yet ready!) Negative Rate allowed Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading MaxRateValue / MaxRateType Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible 1) AbsolutChange : Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading. 2) RelativeRate : in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases. Example: relative rate of 0.05 m\u00b3/minute --> after 20 minutes a maximum change of 20 minutes * 0.05 m\u00b3/minute = 1 m\u00b3 is possible. That means that a false reading of 1 m\u00b3 cannot be detected false after about 20 minutes in this case Assume, that there might me no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted. Flow Chart CheckDigitIncreaseConsistency Algorithm The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.","title":"Correction Algorithm"},{"location":"Correction%20Algorithm/#correction-algorithm","text":"After the digitization of the images and the composition to a number a checking and correction algorithm is applied. This is explained here. There are several reasons, that a check might be necessary: In case of digits there is the output of \"N\" (=NaN = Not-a-Number) in case the digit cannot be detected correctly. This happens for example if the image shows a digit between to states The replacement of the \"N\" with a previous value could be not sufficient, due to the fact, that it might have changed. There is a misreading of one one of the numbers. This can always happen in case of neural network processing.","title":"Correction Algorithm"},{"location":"Correction%20Algorithm/#terms-and-definitions","text":"","title":"Terms and definitions"},{"location":"Correction%20Algorithm/#prevalue","text":"The last correct read value. Either from a previous correctly identified value or manual setting by the user. This is used to replace \"N\"s and make a check for the absolute change.","title":"PreValue"},{"location":"Correction%20Algorithm/#digits","text":"Value that are digitized from a digital number. There are 11 allowed values for this: Digits: 0, 1, 2, ... 9 N = Not-a-Number - representing a not unique state between two numbers","title":"Digits"},{"location":"Correction%20Algorithm/#analogs","text":"This are value derived from a pointer like meter. This never has the state \"N\".","title":"Analogs"},{"location":"Correction%20Algorithm/#checkdigitincreaseconsistency","text":"If this is enabled an \"intelligent\" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the sub-digit has gone through zero. For example: 16.6 --> 16.7 --> 1N.8 --> 17.9 corrected to 16.9 --> 17.0 --> 17.1 As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the sub-digit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9 A detailed description of the algorithm can be found below (not yet ready!)","title":"CheckDigitIncreaseConsistency"},{"location":"Correction%20Algorithm/#negative-rate-allowed","text":"Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading","title":"Negative Rate allowed"},{"location":"Correction%20Algorithm/#maxratevalue-maxratetype","text":"Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible 1) AbsolutChange : Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading. 2) RelativeRate : in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases. Example: relative rate of 0.05 m\u00b3/minute --> after 20 minutes a maximum change of 20 minutes * 0.05 m\u00b3/minute = 1 m\u00b3 is possible. That means that a false reading of 1 m\u00b3 cannot be detected false after about 20 minutes in this case Assume, that there might me no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted.","title":"MaxRateValue / MaxRateType"},{"location":"Correction%20Algorithm/#flow-chart","text":"","title":"Flow Chart"},{"location":"Correction%20Algorithm/#checkdigitincreaseconsistency-algorithm","text":"The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.","title":"CheckDigitIncreaseConsistency Algorithm"},{"location":"Demo-Mode/","text":"Demo Mode For Demo and Testing Purpose, the device can use pre-recorded images. You need to enable it in the configuration ( TakeImage > Demo ) and also provide the needed files on the SD card. For each round one image gets used, starting with the first image for the first round. For the reference image and the alignment also the first image gets used. Once the last image got reached, it starts again with the first one. SD Card Structure demo/ \u251c\u2500\u2500 520.8983.jpg \u251c\u2500\u2500 520.9086.jpg \u251c\u2500\u2500 520.9351.jpg \u251c\u2500\u2500 ... \u2514\u2500\u2500 files.txt The jpg files can have any name The jpg files must be smaller than 30'000 bytes The files.txt must contains a list of those files, eg: 520.8983.jpg 520.9086.jpg 520.9351.jpg Recording To record real images of a meter, you have to periodically fetch http://