diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a302cadc..2bedaf60 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -70,7 +70,7 @@ jobs:
#run: echo "Testing... ${{ github.ref_name }}, ${{ steps.vars.outputs.sha_short }}" > ./sd-card/html/version.txt; mkdir -p ./code/.pio/build/esp32cam/; cd ./code/.pio/build/esp32cam/; echo "${{ steps.vars.outputs.sha_short }}" > firmware.bin; cp firmware.bin partitions.bin; cp firmware.bin bootloader.bin # Testing
run: cd code; platformio run --environment esp32cam
- - name: Prepare Web UI (copy data from repo, generate tooltip pages and update hashes in all files)
+ - name: Prepare Web UI (generate tooltip pages and update hashes in all files)
run: |
rm -rf ./html
mkdir html
@@ -79,7 +79,7 @@ jobs:
python -m pip install markdown
mkdir html/param-tooltips
cd tools/parameter-tooltip-generator
- bash generate-param-doc-tooltips.sh
+ python generate-param-doc-tooltips.py
cd ../..
cp -r ./sd-card/html/* ./html/
diff --git a/code/README.md b/code/README.md
index d7dce832..b70da572 100644
--- a/code/README.md
+++ b/code/README.md
@@ -69,3 +69,6 @@ pio device monitor -p /dev/ttyUSB0
- `pio run --target erase` to erase the flash
- `pio run --target upload` this will upload the `bootloader.bin, partitions.bin,firmware.bin` from the `code/.pio/build/esp32cam/` folder.
- `pio device monitor` to observe the logs via uart
+
+# Update Parameters
+If you create or rename a parameter, make sure to update its documentation in `../param-docs/parameter-pages`! Check the `../param-docs/README.md` for more information.
diff --git a/param-docs/.idea/.gitignore b/param-docs/.idea/.gitignore
new file mode 100644
index 00000000..26d33521
--- /dev/null
+++ b/param-docs/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/param-docs/.idea/generate-param-docs.iml b/param-docs/.idea/generate-param-docs.iml
new file mode 100644
index 00000000..8437fe66
--- /dev/null
+++ b/param-docs/.idea/generate-param-docs.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/param-docs/.idea/inspectionProfiles/profiles_settings.xml b/param-docs/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 00000000..105ce2da
--- /dev/null
+++ b/param-docs/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/param-docs/.idea/misc.xml b/param-docs/.idea/misc.xml
new file mode 100644
index 00000000..dc9ea490
--- /dev/null
+++ b/param-docs/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/param-docs/.idea/modules.xml b/param-docs/.idea/modules.xml
new file mode 100644
index 00000000..c7a3fc0d
--- /dev/null
+++ b/param-docs/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/param-docs/.idea/vcs.xml b/param-docs/.idea/vcs.xml
new file mode 100644
index 00000000..b2bdec2d
--- /dev/null
+++ b/param-docs/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/param-docs/README.md b/param-docs/README.md
new file mode 100644
index 00000000..bea97d64
--- /dev/null
+++ b/param-docs/README.md
@@ -0,0 +1,17 @@
+# Parameter Documentation
+Each parameter which is listed in the [configfile](https://github.com/jomjol/AI-on-the-edge-device/blob/rolling/sd-card/config/config.ini) has its own description page in the folder `parameter-pages` (grouped by the config sections).
+Those pages can be edited as needed.
+
+During a Github action build, those parameter pages will be used to generate the tooltips in the web interface. And they also are used to build the [Online Documentation](https://jomjol.github.io/AI-on-the-edge-device-docs/Parameters).
+
+If you create or rename a parameter, make sure to also update its description page!
+
+## Template Generator
+The script `generate-template-param-doc-pages.py` should be run whenever a new parameter gets added to the config file.
+It then checks if there is already a page for each of the parameters.
+ - If no page exists yet, a templated page gets generated.
+ - Existing pages do not get modified.
+
+If the parameter is listed in `expert-params.txt`, an **Expert warning** will be shown.
+
+If the parameter is listed in `hidden-in-ui.txt`, a **Note** will be shown.
\ No newline at end of file
diff --git a/param-docs/expert-params.txt b/param-docs/expert-params.txt
new file mode 100644
index 00000000..b3bd2a06
--- /dev/null
+++ b/param-docs/expert-params.txt
@@ -0,0 +1,31 @@
+demo
+WaitBeforeTakingPicture
+ImageQuality
+ImageSize
+LEDIntensity
+Brightness
+Contrast
+Saturation
+FixedExposure
+SearchFieldX
+SearchFieldY
+AlignmentAlgo
+InitialMirror
+FlipImageSize
+CNNGoodThreshold
+PreValueAgeStartup
+ErrorMessage
+CheckDigitIncreaseConsistency
+IO0
+IO1
+IO3
+IO4
+IO12
+IO13
+AutoStart
+Hostname
+RSSIThreshold
+TimeServer
+CACert
+ClientCert
+ClientKey
diff --git a/param-docs/generate-template-param-doc-pages.py b/param-docs/generate-template-param-doc-pages.py
new file mode 100644
index 00000000..73daa01f
--- /dev/null
+++ b/param-docs/generate-template-param-doc-pages.py
@@ -0,0 +1,95 @@
+"""
+For each parameter which can be found in the config file,
+create a markdown file with a templated content if it does not exist yet.
+The files are grouped in sub folders representing the config sections.
+"""
+
+import os
+import configparser
+import urllib.request
+
+
+configFileUrl = "https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/rolling/sd-card/config/config.ini"
+
+parameterDocsFolder = "parameter-pages"
+parameterTemplateFile = "./templates/parameter.md"
+expertParameterListFile = "./expert-params.txt"
+hiddenInUiParameterListFile = "./hidden-in-ui.txt"
+
+
+# Fetch default config file from URL
+print("Fetching %r..." % configFileUrl)
+with urllib.request.urlopen(configFileUrl) as response:
+ content = response.read().decode("utf-8")
+
+lines = str(content).split("\n")
+
+for l in range(len(lines)):
+ lines[l] = lines[l].strip() + "\n"
+ if lines[l][0] == ";":
+ lines[l] = lines[l][1:] # Remove comment
+
+content = "".join(lines)
+
+# Fetch list of expert parameters
+with open(expertParameterListFile) as f:
+ expertParameters = f.read().splitlines()
+
+# Fetch list of parameters not available through the UI
+with open(hiddenInUiParameterListFile) as f:
+ hiddenInUiParameters = f.read().splitlines()
+
+
+config = configparser.ConfigParser(allow_no_value=True)
+config.optionxform = str # Make it case-insensitive
+config.read_string(content)
+
+#shutil.rmtree(parameterDocsFolder)
+if not os.path.exists(parameterDocsFolder):
+ os.mkdir(parameterDocsFolder)
+
+with open(parameterTemplateFile, 'r') as parameterTemplateFileHandle:
+ parameterTemplate = parameterTemplateFileHandle.read()
+
+
+print("For each section/parameter, check if there is already a documentation page in the folder %r..." % (os.getcwd() + "/" + parameterDocsFolder))
+for section in config:
+ if section != "DEFAULT":
+ #print(section)
+
+ subFolder = parameterDocsFolder + "/" + section
+
+ if not os.path.exists(subFolder):
+ os.mkdir(subFolder)
+
+ for parameter in config[section]:
+ if not " " in parameter: # Ignore parameters with whitespaces in them (special format, not part of editable config)
+ value = config[section][parameter]
+ #print(" %s = %s" % (parameter, value))
+
+ if "main." in parameter:
+ parameter = parameter.replace("main.", "NUMBER.")
+
+ """
+ For each config line, create a markdown file
+ """
+ parameterDocFile = subFolder + '/' + parameter + ".md"
+
+ if not os.path.exists(parameterDocFile): # File does not exist yet, generate template
+ print("%r does not exit yet, generating a templated file for it" % (os.getcwd() + "/" + parameterDocFile))
+ with open(parameterDocFile, 'w') as paramFileHandle:
+ content = parameterTemplate
+ content = content.replace("$NAME", parameter)
+ content = content.replace("$DEFAULT", value)
+
+ if parameter in expertParameters:
+ content = content.replace("$EXPERT_PARAMETER", "!!! Warning\n This is an **Expert Parameter**! Only change it if you understand what it does!") # Note: Needs a 4 whitespace Intent!
+ else:
+ content = content.replace("$EXPERT_PARAMETER", "")
+
+ if parameter in hiddenInUiParameters:
+ content = content.replace("$HIDDEN_IN_UI", "!!! Note\n This parameter is not accessible through the Web Interface Configuration Page!") # Note: Needs a 4 whitespace Intent!
+ else:
+ content = content.replace("$HIDDEN_IN_UI", "")
+
+ paramFileHandle.write(content)
diff --git a/param-docs/hidden-in-ui.txt b/param-docs/hidden-in-ui.txt
new file mode 100644
index 00000000..05c3b67e
--- /dev/null
+++ b/param-docs/hidden-in-ui.txt
@@ -0,0 +1,4 @@
+InitialRotate
+MainTopicMQTT
+AutoAdjustSummertime
+SetupMode
diff --git a/param-docs/parameter-pages/Alignment/AlignmentAlgo.md b/param-docs/parameter-pages/Alignment/AlignmentAlgo.md
new file mode 100644
index 00000000..dc6d4350
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/AlignmentAlgo.md
@@ -0,0 +1,14 @@
+# Parameter `AlignmentAlgo`
+Default Value: `Default`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Algorithm used for the alignment step.
+
+Available options:
+
+- `Default`: Use only red color channel
+- `HighAccuracy`: Use all 3 color channels (3x slower)
+- `Fast`: First time use `HighAccuracy`, then only check if the image is shifted
+- `Off`: Disable alignment algorithm
diff --git a/param-docs/parameter-pages/Alignment/FlipImageSize.md b/param-docs/parameter-pages/Alignment/FlipImageSize.md
new file mode 100644
index 00000000..b932b329
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/FlipImageSize.md
@@ -0,0 +1,11 @@
+# Parameter `FlipImageSize`
+Default Value: `false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+!!! Note
+ This parameter can also be set on the Reference Image configuration.
+
+This parameter can be used to rotate the viewport together with the alignment rotation:
+
diff --git a/param-docs/parameter-pages/Alignment/InitialMirror.md b/param-docs/parameter-pages/Alignment/InitialMirror.md
new file mode 100644
index 00000000..8a18a494
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/InitialMirror.md
@@ -0,0 +1,10 @@
+# Parameter `InitialMirror`
+Default Value: `false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+!!! Note
+ This parameter can also be set on the Reference Image configuration.
+
+Option for initially mirroring the image on the original x-axis.
diff --git a/param-docs/parameter-pages/Alignment/InitialRotate.md b/param-docs/parameter-pages/Alignment/InitialRotate.md
new file mode 100644
index 00000000..3cbc1afa
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/InitialRotate.md
@@ -0,0 +1,9 @@
+# Parameter `InitialRotate`
+Default Value: `179`
+
+Unit: Degrees
+
+Initial rotation of image before alignment in degree (0 .. 359)
+
+!!! Note
+ This parameter is accessible on the Reference Image Page but not on the Config page!
diff --git a/param-docs/parameter-pages/Alignment/SearchFieldX.md b/param-docs/parameter-pages/Alignment/SearchFieldX.md
new file mode 100644
index 00000000..b8293147
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/SearchFieldX.md
@@ -0,0 +1,14 @@
+# Parameter `SearchFieldX`
+Default Value: `20`
+
+Unit: Pixels
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+X-size (width) in which the reference is searched.
+
+!!! Note
+ Since the alignment is one of the steps using a lot of computation time,
+ the search field should be as small as possible.
+ The calculation time goes quadratic with the search field size.
\ No newline at end of file
diff --git a/param-docs/parameter-pages/Alignment/SearchFieldY.md b/param-docs/parameter-pages/Alignment/SearchFieldY.md
new file mode 100644
index 00000000..6b51b9a9
--- /dev/null
+++ b/param-docs/parameter-pages/Alignment/SearchFieldY.md
@@ -0,0 +1,14 @@
+# Parameter `SearchFieldY`
+Default Value: `20`
+
+Unit: Pixels
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Y-size (height) in which the reference is searched.
+
+!!! Note
+ Since the alignment is one of the steps using a lot of computation time,
+ the search field should be as small as possible.
+ The calculation time goes quadratic with the search field size.
diff --git a/param-docs/parameter-pages/Analog/CNNGoodThreshold.md b/param-docs/parameter-pages/Analog/CNNGoodThreshold.md
new file mode 100644
index 00000000..acff4a58
--- /dev/null
+++ b/param-docs/parameter-pages/Analog/CNNGoodThreshold.md
@@ -0,0 +1,10 @@
+# Parameter `CNNGoodThreshold`
+Default Value: `0.5`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Threshold above which the classification should be to accept the value (only meaningful for digits).
+
+!!! Warning
+ This is only supported for the `ana-class100` models!
diff --git a/param-docs/parameter-pages/Analog/ExtendedResolution.md b/param-docs/parameter-pages/Analog/ExtendedResolution.md
new file mode 100644
index 00000000..711fd4ec
--- /dev/null
+++ b/param-docs/parameter-pages/Analog/ExtendedResolution.md
@@ -0,0 +1,5 @@
+# Parameter `ExtendedResolution`
+
+!!! Warning
+ This parameter is unused!
+ Use [`NUMBER.ExtendedResolution`](../Parameters/#PostProcessing-NUMBER.ExtendedResolution) instead!
diff --git a/param-docs/parameter-pages/Analog/Model.md b/param-docs/parameter-pages/Analog/Model.md
new file mode 100644
index 00000000..3481c2b4
--- /dev/null
+++ b/param-docs/parameter-pages/Analog/Model.md
@@ -0,0 +1,4 @@
+# Parameter `Model`
+Default Value: `/config/ana-cont_*.tflite` (See [/config/config.ini](https://github.com/jomjol/AI-on-the-edge-device/blob/master/sd-card/config/config.ini))
+
+Path to CNN model file for image recognition. See [here](../Choosing-the-Model) for details.
diff --git a/param-docs/parameter-pages/Analog/ROIImagesLocation.md b/param-docs/parameter-pages/Analog/ROIImagesLocation.md
new file mode 100644
index 00000000..a8aacecb
--- /dev/null
+++ b/param-docs/parameter-pages/Analog/ROIImagesLocation.md
@@ -0,0 +1,7 @@
+# Parameter `ROIImagesLocation`
+Default Value: `/log/analog`
+
+Location to store separated analog images on the SD-Card.
+
+!!! Warning
+ A SD-Card has limited write cycles. Since the device does not do [Wear Leveling](https://en.wikipedia.org/wiki/Wear_leveling), this can wear out your SD-Card!
diff --git a/param-docs/parameter-pages/Analog/ROIImagesRetention.md b/param-docs/parameter-pages/Analog/ROIImagesRetention.md
new file mode 100644
index 00000000..a36d06b5
--- /dev/null
+++ b/param-docs/parameter-pages/Analog/ROIImagesRetention.md
@@ -0,0 +1,6 @@
+# Parameter `ROIImagesRetention`
+Default Value: `3`
+
+Unit: Days
+
+Days to keep the separated analog images (`0` = forever).
diff --git a/param-docs/parameter-pages/AutoTimer/AutoStart.md b/param-docs/parameter-pages/AutoTimer/AutoStart.md
new file mode 100644
index 00000000..94a93133
--- /dev/null
+++ b/param-docs/parameter-pages/AutoTimer/AutoStart.md
@@ -0,0 +1,12 @@
+# Parameter `AutoStart`
+Default Value: `true`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Automatically start the Flow (Digitization Rounds) immediately after power up.
+
+!!! Note
+ Typically this is set to `true`.
+ The main reasons to set it to `false` is when you want to trigger it manually using the
+ [REST API](../REST-API) or [MQTT-API](../MQTT-API) or for debugging.
\ No newline at end of file
diff --git a/param-docs/parameter-pages/AutoTimer/Interval.md b/param-docs/parameter-pages/AutoTimer/Interval.md
new file mode 100644
index 00000000..e0e58ebb
--- /dev/null
+++ b/param-docs/parameter-pages/AutoTimer/Interval.md
@@ -0,0 +1,7 @@
+# Parameter `Interval`
+Default Value: `5`
+
+Unit: Minutes
+
+Interval in which the Flow (Digitization Round) is run.
+If a round takes longer than this interval, the next round gets postponed until the current round completes.
diff --git a/param-docs/parameter-pages/DataLogging/DataFilesRetention.md b/param-docs/parameter-pages/DataLogging/DataFilesRetention.md
new file mode 100644
index 00000000..be6b9b9f
--- /dev/null
+++ b/param-docs/parameter-pages/DataLogging/DataFilesRetention.md
@@ -0,0 +1,6 @@
+# Parameter `DataFilesRetention`
+Default Value: `3`
+
+Unit: Days
+
+Number of days to keep the data files (`0` = forever).
diff --git a/param-docs/parameter-pages/DataLogging/DataLogActive.md b/param-docs/parameter-pages/DataLogging/DataLogActive.md
new file mode 100644
index 00000000..03e44ff8
--- /dev/null
+++ b/param-docs/parameter-pages/DataLogging/DataLogActive.md
@@ -0,0 +1,8 @@
+# Parameter `DataLogActive`
+Default Value: `true`
+Activate data logging to the SD-Card.
+
+The files will be stored in `/log/data/data_YYYY-MM-DD.csv`. See [`Data Logging`](../data-logging) for details.
+
+!!! Warning
+ A SD-Card has limited write cycles. Since the device does not do [Wear Leveling](https://en.wikipedia.org/wiki/Wear_leveling), this can wear out your SD-Card!
diff --git a/param-docs/parameter-pages/Debug/LogLevel.md b/param-docs/parameter-pages/Debug/LogLevel.md
new file mode 100644
index 00000000..ac518563
--- /dev/null
+++ b/param-docs/parameter-pages/Debug/LogLevel.md
@@ -0,0 +1,16 @@
+# Parameter `LogLevel`
+Default Value: `1` (`ERROR`)
+Define the log level for the logging to the SD-Card.
+
+Available options:
+
+- `1`: `ERROR`
+- `2`: `WARNING`
+- `3`: `INFO`
+- `4`: `DEBUG`
+
+As higher the level, as more log messages get written to the SD-Card.
+
+!!! Warning
+ `DEBUG` or `INFO` might damage the SD-Card if enabled long term due to excessive writes to the SD-Card!
+ A SD-Card has limited write cycles. Since the device does not do [Wear Leveling](https://en.wikipedia.org/wiki/Wear_leveling), this can wear out your SD-Card!
diff --git a/param-docs/parameter-pages/Debug/LogfilesRetention.md b/param-docs/parameter-pages/Debug/LogfilesRetention.md
new file mode 100644
index 00000000..e8adb036
--- /dev/null
+++ b/param-docs/parameter-pages/Debug/LogfilesRetention.md
@@ -0,0 +1,6 @@
+# Parameter `LogfilesRetention`
+Default Value: `3`
+
+Unit: Days
+
+Number of days to keep the log files (`0` = forever).
diff --git a/param-docs/parameter-pages/Digits/CNNGoodThreshold.md b/param-docs/parameter-pages/Digits/CNNGoodThreshold.md
new file mode 100644
index 00000000..04851292
--- /dev/null
+++ b/param-docs/parameter-pages/Digits/CNNGoodThreshold.md
@@ -0,0 +1,10 @@
+# Parameter `CNNGoodThreshold`
+Default Value: `0.5`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Threshold above which the classification should be to accept the value (only meaningful for digits).
+
+!!! Warning
+ This is only supported for the `dig-class100` models!
diff --git a/param-docs/parameter-pages/Digits/Model.md b/param-docs/parameter-pages/Digits/Model.md
new file mode 100644
index 00000000..73107f79
--- /dev/null
+++ b/param-docs/parameter-pages/Digits/Model.md
@@ -0,0 +1,4 @@
+# Parameter `Model`
+Default Value: `/config/dig-cont_*.tflite` (See [/config/config.ini](https://github.com/jomjol/AI-on-the-edge-device/blob/master/sd-card/config/config.ini))
+
+Path to CNN model file for image recognition. See [here](../Choosing-the-Model) for details.
diff --git a/param-docs/parameter-pages/Digits/ROIImagesLocation.md b/param-docs/parameter-pages/Digits/ROIImagesLocation.md
new file mode 100644
index 00000000..28d6b3ad
--- /dev/null
+++ b/param-docs/parameter-pages/Digits/ROIImagesLocation.md
@@ -0,0 +1,7 @@
+# Parameter `ROIImagesLocation`
+Default Value: `/log/digit`
+
+Location to store separated digit images on the SD-Card.
+
+!!! Warning
+ A SD-Card has limited write cycles. Since the device does not do [Wear Leveling](https://en.wikipedia.org/wiki/Wear_leveling), this can wear out your SD-Card!
diff --git a/param-docs/parameter-pages/Digits/ROIImagesRetention.md b/param-docs/parameter-pages/Digits/ROIImagesRetention.md
new file mode 100644
index 00000000..2d6ca9e3
--- /dev/null
+++ b/param-docs/parameter-pages/Digits/ROIImagesRetention.md
@@ -0,0 +1,6 @@
+# Parameter `ROIImagesRetention`
+Default Value: `3`
+
+Unit: Days
+
+Days to keep the separated digit images (`0` = forever).
diff --git a/param-docs/parameter-pages/GPIO/IO0.md b/param-docs/parameter-pages/GPIO/IO0.md
new file mode 100644
index 00000000..a9b180a0
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO0.md
@@ -0,0 +1,21 @@
+# Parameter `IO0`
+Default Value: `input disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO0` pin.
+
+!!! Warning
+ This pin is only usable with restrictions!
+ It must be disabled when the camera is used.
+ Additionally, it is used to activate Bootloader mode and must therefore be HIGH after a reset!
+
+Parameters:
+
+- `GPIO 0 state`: One of `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 0 use interrupt`: Enable interrupt trigger
+- `GPIO 0 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 0 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 0 enable HTTP`: Enable HTTP write/read
+- `GPIO 0 name`: MQTT topic name (empty = `GPIO0`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/IO1.md b/param-docs/parameter-pages/GPIO/IO1.md
new file mode 100644
index 00000000..481a847d
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO1.md
@@ -0,0 +1,19 @@
+# Parameter `IO1`
+Default Value: `input disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO1` pin.
+
+!!! Warning
+ This pin is by default used for the serial communication as TX pin (USB logging)!
+
+Parameters:
+
+- `GPIO 1 state`: One of `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 1 use interrupt`: Enable interrupt trigger
+- `GPIO 1 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 1 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 1 enable HTTP`: Enable HTTP write/read
+- `GPIO 1 name`: MQTT topic name (empty = `GPIO1`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/IO12.md b/param-docs/parameter-pages/GPIO/IO12.md
new file mode 100644
index 00000000..f5f62b85
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO12.md
@@ -0,0 +1,19 @@
+# Parameter `IO12`
+Default Value: `input-pullup disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO12` pin.
+
+!!! Note
+ This pin is usable without known restrictions!
+
+Parameters:
+
+- `GPIO 12 state`: One of `external-flash-ws281x`, `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 12 use interrupt`: Enable interrupt trigger
+- `GPIO 12 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 12 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 12 enable HTTP`: Enable HTTP write/read
+- `GPIO 12 name`: MQTT topic name (empty = `GPIO12`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/IO13.md b/param-docs/parameter-pages/GPIO/IO13.md
new file mode 100644
index 00000000..64bd6426
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO13.md
@@ -0,0 +1,19 @@
+# Parameter `IO13`
+Default Value: `input-pullup disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO13` pin.
+
+!!! Note
+ This pin is usable without known restrictions!
+
+Parameters:
+
+- `GPIO 13 state`: One of `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 13 use interrupt`: Enable interrupt trigger
+- `GPIO 13 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 13 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 13 enable HTTP`: Enable HTTP write/read
+- `GPIO 13 name`: MQTT topic name (empty = `GPIO13`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/IO3.md b/param-docs/parameter-pages/GPIO/IO3.md
new file mode 100644
index 00000000..7d00209a
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO3.md
@@ -0,0 +1,19 @@
+# Parameter `IO3`
+Default Value: `input disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO3` pin.
+
+!!! Warning
+ This pin is by default used for the serial communication as RX pin (USB logging)!
+
+Parameters:
+
+- `GPIO 3 state`: One of `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 3 use interrupt`: Enable interrupt trigger
+- `GPIO 3 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 3 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 3 enable HTTP`: Enable HTTP write/read
+- `GPIO 3 name`: MQTT topic name (empty = `GPIO3`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/IO4.md b/param-docs/parameter-pages/GPIO/IO4.md
new file mode 100644
index 00000000..f59883d2
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/IO4.md
@@ -0,0 +1,20 @@
+# Parameter `IO4`
+Default Value: `built-in-led disabled 10 false false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+This parameter can be used to configure the GPIO `IO4` pin.
+
+!!! Warning
+ This pin is only usable with restrictions!
+ By default, it is used for build-in flash light (onboard LED).
+
+Parameters:
+
+- `GPIO 4 state`: One of `built-in-led`, `input`, `input pullup`, `input pulldown` or `output`.
+- `GPIO 4 use interrupt`: Enable interrupt trigger
+- `GPIO 4 PWM duty resolution`: LEDC PWM duty resolution in bit
+- `GPIO 4 enable MQTT`: Enable MQTT publishing/subscribing
+- `GPIO 4 enable HTTP`: Enable HTTP write/read
+- `GPIO 4 name`: MQTT topic name (empty = `GPIO4`). Allowed characters: `a-z, A-Z, 0-9, _, -`.
diff --git a/param-docs/parameter-pages/GPIO/LEDColor.md b/param-docs/parameter-pages/GPIO/LEDColor.md
new file mode 100644
index 00000000..c7e0816d
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/LEDColor.md
@@ -0,0 +1,5 @@
+# Parameter `LEDColor`
+Default Value: `150 150 150`
+
+Color of the attached LEDs to GPIO12 in **R**ed, **G**reen **B**lue from `0` (full off) .. `255` (full on)
+(See `IO12` parameter).
diff --git a/param-docs/parameter-pages/GPIO/LEDNumbers.md b/param-docs/parameter-pages/GPIO/LEDNumbers.md
new file mode 100644
index 00000000..b151b240
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/LEDNumbers.md
@@ -0,0 +1,4 @@
+# Parameter `LEDNumbers`
+Default Value: `2`
+
+Number of LEDs on the external LED-stripe attached to GPIO12 (See `IO12` parameter).
diff --git a/param-docs/parameter-pages/GPIO/LEDType.md b/param-docs/parameter-pages/GPIO/LEDType.md
new file mode 100644
index 00000000..e57e68c5
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/LEDType.md
@@ -0,0 +1,3 @@
+# Parameter `LEDType`
+Default Value: `WS2812`
+Type of the `WS2812x` which is connected to GPIO12 (See `IO12` parameter).
diff --git a/param-docs/parameter-pages/GPIO/MainTopicMQTT.md b/param-docs/parameter-pages/GPIO/MainTopicMQTT.md
new file mode 100644
index 00000000..19ce2b86
--- /dev/null
+++ b/param-docs/parameter-pages/GPIO/MainTopicMQTT.md
@@ -0,0 +1,8 @@
+# Parameter `MainTopicMQTT`
+Default Value: `wasserzaehler/GPIO`
+
+!!! Note
+ This parameter is not accessible through the Web Interface Configuration Page!
+
+The GPIO Interface is prepared to report it's status and status changes as a MQTT topic. With this parameter you configure the MQTT main topic, under which the status is published.
+As this parameter is still experimental it can only be set manually in the `config.ini` itself and has not been tested in detail so far.
diff --git a/param-docs/parameter-pages/InfluxDB/Database.md b/param-docs/parameter-pages/InfluxDB/Database.md
new file mode 100644
index 00000000..860a808b
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/Database.md
@@ -0,0 +1,7 @@
+# Parameter `Database`
+Default Value: `''`
+
+Name of the InfluxDB v1 Database into which to publish the values.
+
+!!! Note
+ See section `InfluxDBv2` for InfluxDB v2 support!
diff --git a/param-docs/parameter-pages/InfluxDB/NUMBER.Field.md b/param-docs/parameter-pages/InfluxDB/NUMBER.Field.md
new file mode 100644
index 00000000..8035ca6b
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/NUMBER.Field.md
@@ -0,0 +1,4 @@
+# Parameter `.Field`
+Default Value: `undefined`
+
+Dedicated definition of the field for InfluxDB use for saving in the Influx database (e.g.: "watermeter/value").
diff --git a/param-docs/parameter-pages/InfluxDB/NUMBER.Measurement.md b/param-docs/parameter-pages/InfluxDB/NUMBER.Measurement.md
new file mode 100644
index 00000000..cd6f69cc
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/NUMBER.Measurement.md
@@ -0,0 +1,7 @@
+# Parameter `Measurement`
+Default Value: `undefined`
+
+Name of the InfluxDB v1 Measurement to use to publish the value.
+
+!!! Note
+ See section `InfluxDBv2` for InfluxDB v2 support!
diff --git a/param-docs/parameter-pages/InfluxDB/Uri.md b/param-docs/parameter-pages/InfluxDB/Uri.md
new file mode 100644
index 00000000..16b22c75
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/Uri.md
@@ -0,0 +1,7 @@
+# Parameter `Uri`
+Default Value: `undefined`
+
+URI of the HTTP interface to InfluxDB v1, without trailing slash, e.g. `http://192.168.1.1:8086`.
+
+!!! Note
+ See section `InfluxDBv2` for InfluxDB v2 support!
diff --git a/param-docs/parameter-pages/InfluxDB/password.md b/param-docs/parameter-pages/InfluxDB/password.md
new file mode 100644
index 00000000..97dcbcc5
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/password.md
@@ -0,0 +1,7 @@
+# Parameter `password`
+Default Value: `undefined`
+
+Password for the InfluxDB v1 authentication.
+
+!!! Note
+ See section `InfluxDBv2` for InfluxDB v2 support!
diff --git a/param-docs/parameter-pages/InfluxDB/user.md b/param-docs/parameter-pages/InfluxDB/user.md
new file mode 100644
index 00000000..3f989a4c
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDB/user.md
@@ -0,0 +1,7 @@
+# Parameter `user`
+Default Value: `undefined`
+
+Username for the InfluxDB v1 authentication.
+
+!!! Note
+ See section `InfluxDBv2` for InfluxDB v2 support!
diff --git a/param-docs/parameter-pages/InfluxDBv2/Bucket.md b/param-docs/parameter-pages/InfluxDBv2/Bucket.md
new file mode 100644
index 00000000..8dca6643
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/Bucket.md
@@ -0,0 +1,4 @@
+# Parameter `Bucket`
+Default Value: `''`
+
+Name of the InfluxDB v2 Bucket into which to publish the values.
diff --git a/param-docs/parameter-pages/InfluxDBv2/Database.md b/param-docs/parameter-pages/InfluxDBv2/Database.md
new file mode 100644
index 00000000..9fc91233
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/Database.md
@@ -0,0 +1,5 @@
+# Parameter `Database`
+
+!!! Warning
+ This parameter is unused!
+ Use [`Basket`](../Parameters/#InfluxDBv2-Basket) instead!
diff --git a/param-docs/parameter-pages/InfluxDBv2/NUMBER.Field.md b/param-docs/parameter-pages/InfluxDBv2/NUMBER.Field.md
new file mode 100644
index 00000000..58611ad8
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/NUMBER.Field.md
@@ -0,0 +1,4 @@
+# Parameter `.Field`
+Default Value: `undefined`
+
+Field for InfluxDB v2 to use for saving.
diff --git a/param-docs/parameter-pages/InfluxDBv2/NUMBER.Measurement.md b/param-docs/parameter-pages/InfluxDBv2/NUMBER.Measurement.md
new file mode 100644
index 00000000..c79ea6d4
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/NUMBER.Measurement.md
@@ -0,0 +1,4 @@
+# Parameter `Measurement`
+Default Value: `undefined`
+
+Name of the InfluxDB v2 Measurement to use to publish the value.
diff --git a/param-docs/parameter-pages/InfluxDBv2/Org.md b/param-docs/parameter-pages/InfluxDBv2/Org.md
new file mode 100644
index 00000000..4731d7a9
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/Org.md
@@ -0,0 +1,4 @@
+# Parameter `Org`
+Default Value: `undefined`
+
+Organisation (Org) for InfluxDB v2 authentication
diff --git a/param-docs/parameter-pages/InfluxDBv2/Token.md b/param-docs/parameter-pages/InfluxDBv2/Token.md
new file mode 100644
index 00000000..dc723607
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/Token.md
@@ -0,0 +1,4 @@
+# Parameter `Token`
+Default Value: `undefined`
+
+Token for InfluxDB v2 authentication
diff --git a/param-docs/parameter-pages/InfluxDBv2/Uri.md b/param-docs/parameter-pages/InfluxDBv2/Uri.md
new file mode 100644
index 00000000..c02c7302
--- /dev/null
+++ b/param-docs/parameter-pages/InfluxDBv2/Uri.md
@@ -0,0 +1,4 @@
+# Parameter `Uri`
+Default Value: `undefined`
+
+URI of the HTTP interface to InfluxDB v2, without trailing slash, e.g. `http://192.168.1.1:8086`.
diff --git a/param-docs/parameter-pages/MQTT/CACert.md b/param-docs/parameter-pages/MQTT/CACert.md
new file mode 100644
index 00000000..5ee45b46
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/CACert.md
@@ -0,0 +1,18 @@
+# Parameter `CACert`
+Default Value: `""`
+
+Example: `/config/certs/RootCA.pem`.
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Path to the CA certificate file.
+
+This is part of the configuration to enable TLS for MQTT.
+The CA Certificate is used by the client to validate the broker is who it claims to be.
+It allows the client to authenticate the server, which is the first part of the MTLS handshake.
+
+Usually there is a common RootCA certificate for the MQTT broker
+
+!!! Note
+ This also means that you might have to change the protocol and port in [uri](https://jomjol.github.io/AI-on-the-edge-device-docs/Parameters/#parameter-uri) to `mqtts://example.com:8883`!
diff --git a/param-docs/parameter-pages/MQTT/ClientCert.md b/param-docs/parameter-pages/MQTT/ClientCert.md
new file mode 100644
index 00000000..9cb49241
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/ClientCert.md
@@ -0,0 +1,19 @@
+# Parameter `ClientCert`
+Default Value: `""`
+
+Example: `/config/certs/client.pem.crt`.
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Path to the Client Certificate file.
+
+This is part of the configuration to enable TLS for MQTT.
+The Client Certificate is used by the client to prove its identity to the server, in conjunction with the Client Key.
+It is the second part of the MTLS handshake.
+
+Usually there is a one pair of Client Certificate/Key for each client that connects to the MQTT broker
+
+!!! Note
+ If set, `ClientKey` must be set too
+ This also means that you might have to change the protocol and port in [uri](https://jomjol.github.io/AI-on-the-edge-device-docs/Parameters/#parameter-uri) to `mqtts://example.com:8883`!
diff --git a/param-docs/parameter-pages/MQTT/ClientID.md b/param-docs/parameter-pages/MQTT/ClientID.md
new file mode 100644
index 00000000..6e5ec511
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/ClientID.md
@@ -0,0 +1,5 @@
+# Parameter `ClientID`
+Default Value: `watermeter`
+
+Client ID used to connect to the MQTT broker.
+If disabled, the `hostname` will be used.
\ No newline at end of file
diff --git a/param-docs/parameter-pages/MQTT/ClientKey.md b/param-docs/parameter-pages/MQTT/ClientKey.md
new file mode 100644
index 00000000..af862f08
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/ClientKey.md
@@ -0,0 +1,19 @@
+# Parameter `ClientKey`
+Default Value: `""`
+
+Example: `/config/certs/client.pem.key`.
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Path to the Client Key file.
+
+This is part of the configuration to enable TLS for MQTT.
+The Client Key is used by the client to prove its identity to the server, in conjunction with the Client Certificate.
+It is the second part of the MTLS handshake.
+
+Usually there is a one pair of Client Certificate/Key for each client that connects to the MQTT broker
+
+!!! Note
+ If set, `ClientCert` must be set too
+ This also means that you might have to change the protocol and port in [uri](https://jomjol.github.io/AI-on-the-edge-device-docs/Parameters/#parameter-uri) to `mqtts://example.com:8883`!
diff --git a/param-docs/parameter-pages/MQTT/HomeassistantDiscovery.md b/param-docs/parameter-pages/MQTT/HomeassistantDiscovery.md
new file mode 100644
index 00000000..50e821fb
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/HomeassistantDiscovery.md
@@ -0,0 +1,5 @@
+# Parameter `HomeassistantDiscovery`
+Default Value: `true`
+
+Enable or disable the Homeassistant Discovery.
+See [here](../Integration-Home-Assistant) for details about the discovery.
diff --git a/param-docs/parameter-pages/MQTT/MainTopic.md b/param-docs/parameter-pages/MQTT/MainTopic.md
new file mode 100644
index 00000000..3cf12ec2
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/MainTopic.md
@@ -0,0 +1,18 @@
+# Parameter `MainTopic`
+Default Value: `watermeter`
+
+MQTT main topic, under which the counters are published.
+
+The single value will be published with the following key: `MAINTOPIC/NUMBER/RESULT_TOPIC`
+
+With:
+
+- `NUMBER`: The name of the value (a meter might have more than one value).
+ The names get defined in the analog and digital ROI configuration (defaults to `main`).
+- `RESULT_TOPIC`: Automatically filled with the right name, eg. `value`, `rate`, `timestamp`, `error`, ....
+
+The general connection status can be found in `MAINTOPIC/CONNECTION`.
+See [MQTT Result Topics](../MQTT-API#result) for a full list of topics.
+
+!!! Note
+ The main topic is allowed to contain `/` which can be used to split it into multiple levels, eg. `/basement/meters/watermeter/1/` if you have multiple water meters in your basement.
diff --git a/param-docs/parameter-pages/MQTT/MeterType.md b/param-docs/parameter-pages/MQTT/MeterType.md
new file mode 100644
index 00000000..a65bd03a
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/MeterType.md
@@ -0,0 +1,11 @@
+# Parameter `MeterType`
+Default Value: `other`
+
+Select the Meter Type so the sensors have the right units in Homeassistant.
+
+!!! Note
+ For `Watermeter` you need to have Homeassistant 2022.11 or newer!
+
+Please also make sure that the selected Meter Type matches the dimension of the value provided by the meter!
+Eg. if your meter provides `m³`, you need to also set it to `m³`.
+Alternatively you can set the parameter `DecimalShift` to `3` so the value is converted to `liters`!
diff --git a/param-docs/parameter-pages/MQTT/RetainMessages.md b/param-docs/parameter-pages/MQTT/RetainMessages.md
new file mode 100644
index 00000000..40a47d6a
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/RetainMessages.md
@@ -0,0 +1,4 @@
+# Parameter `RetainMessages`
+Default Value: `true`
+
+Enable or disable the [Retain Flag](https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages/) for all MQTT entries.
diff --git a/param-docs/parameter-pages/MQTT/Uri.md b/param-docs/parameter-pages/MQTT/Uri.md
new file mode 100644
index 00000000..e7f93ab9
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/Uri.md
@@ -0,0 +1,4 @@
+# Parameter `Uri`
+Default Value: `mqtt://example.com:1883`
+
+URI to the MQTT broker including the port. E.g. `mqtt://192.168.1.1:1883`.
diff --git a/param-docs/parameter-pages/MQTT/password.md b/param-docs/parameter-pages/MQTT/password.md
new file mode 100644
index 00000000..7a87224b
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/password.md
@@ -0,0 +1,4 @@
+# Parameter `password`
+Default Value: `PASSWORD`
+
+Password for MQTT authentication.
diff --git a/param-docs/parameter-pages/MQTT/user.md b/param-docs/parameter-pages/MQTT/user.md
new file mode 100644
index 00000000..7a4230ad
--- /dev/null
+++ b/param-docs/parameter-pages/MQTT/user.md
@@ -0,0 +1,4 @@
+# Parameter `user`
+Default Value: `USERNAME`
+
+Username for MQTT authentication.
diff --git a/param-docs/parameter-pages/PostProcessing/AllowNegativeRates.md b/param-docs/parameter-pages/PostProcessing/AllowNegativeRates.md
new file mode 100644
index 00000000..4290f8ce
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/AllowNegativeRates.md
@@ -0,0 +1,5 @@
+# Parameter `AllowNegativeRates`
+
+!!! Warning
+ This parameter is unused!
+ Use [`NUMBER.AllowNegativeRates`](../Parameters/#PostProcessing-NUMBER.AllowNegativeRates) instead!
diff --git a/param-docs/parameter-pages/PostProcessing/CheckDigitIncreaseConsistency.md b/param-docs/parameter-pages/PostProcessing/CheckDigitIncreaseConsistency.md
new file mode 100644
index 00000000..8612cd14
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/CheckDigitIncreaseConsistency.md
@@ -0,0 +1,8 @@
+# Parameter `CheckDigitIncreaseConsistency`
+Default Value: `false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+An additional consistency check.
+It especially improves the zero crossing check between digits.
diff --git a/param-docs/parameter-pages/PostProcessing/ErrorMessage.md b/param-docs/parameter-pages/PostProcessing/ErrorMessage.md
new file mode 100644
index 00000000..2213efb4
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/ErrorMessage.md
@@ -0,0 +1,8 @@
+# Parameter `ErrorMessage`
+Default Value: `true`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Do not show error message in return value.
+In an error case, the last valid number will be used for the various transmission protocols (MQTT, InfluxDB, REST, ...).
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.AllowNegativeRates.md b/param-docs/parameter-pages/PostProcessing/NUMBER.AllowNegativeRates.md
new file mode 100644
index 00000000..3bb73429
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.AllowNegativeRates.md
@@ -0,0 +1,7 @@
+# Parameter `.AllowNegativeRates`
+Default Value: `false`
+
+Allow a meter to count backwards (decreasing values).
+
+!!! Note
+ This is unusual (it means there is a negative rate) and not wanted in most cases!
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.AnalogDigitalTransitionStart.md b/param-docs/parameter-pages/PostProcessing/NUMBER.AnalogDigitalTransitionStart.md
new file mode 100644
index 00000000..d04831aa
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.AnalogDigitalTransitionStart.md
@@ -0,0 +1,9 @@
+# Parameter `.AnalogDigitalTransitionStart`
+Default Value: `9.2`
+
+This can be used if you have wrong values, but the recognition of the individual ROIs are correct.
+Look for the start of changing of the first digit and note the analog pointer value behind.
+Set it here. Only used on combination of digits and analog pointers.
+See [here](../Watermeter-specific-analog---digital-transition) for details.
+
+Range: `6.0` .. `9.9`.
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.DecimalShift.md b/param-docs/parameter-pages/PostProcessing/NUMBER.DecimalShift.md
new file mode 100644
index 00000000..604bb020
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.DecimalShift.md
@@ -0,0 +1,5 @@
+# Parameter `.DecimalShift`
+Default Value: `0`
+
+Shift the decimal separator (positiv or negativ).
+Eg. to move from `m³` to `liter` (`1 m³` equals `1000 liters`), you need to set it to `+3`.
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.ExtendedResolution.md b/param-docs/parameter-pages/PostProcessing/NUMBER.ExtendedResolution.md
new file mode 100644
index 00000000..3689e6f2
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.ExtendedResolution.md
@@ -0,0 +1,7 @@
+# Parameter `.ExtendedResolution`
+Default Value: `false`
+
+Use the decimal place of the last analog counter for increased accuracy.
+
+!!! Note
+ This parameter is only supported on the `*-class*` and `*-const` models! See [Choosing-the-Model](../Choosing-the-Model) for details.
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.IgnoreLeadingNaN.md b/param-docs/parameter-pages/PostProcessing/NUMBER.IgnoreLeadingNaN.md
new file mode 100644
index 00000000..5fa11ab7
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.IgnoreLeadingNaN.md
@@ -0,0 +1,6 @@
+# Parameter `.IgnoreLeadingNaN`
+Default Value: `true`
+
+Leading `N`'s will be deleted before further processing.
+This is only relevant for models which use `N`!
+See [here](../Choosing-the-Model) for details.
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateType.md b/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateType.md
new file mode 100644
index 00000000..aab9d29b
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateType.md
@@ -0,0 +1,5 @@
+# Parameter `.MaxRateType`
+Default Value: `AbsoluteChange`
+
+Defines if the **Change Rate** is calculated as the difference between the last two readings (`AbsoluteChange` = difference) or
+as the difference normalized to the interval (`RateChange` = difference per minute).
diff --git a/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateValue.md b/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateValue.md
new file mode 100644
index 00000000..98bb0afd
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/NUMBER.MaxRateValue.md
@@ -0,0 +1,6 @@
+# Parameter `.MaxRateValue`
+Default Value: `0,05`
+
+Maximum allowed change between two readings, if exceeded the last reading will be rejected. Depending on the settings of `.MaxRateType` the `MaxRateValue` is either treated as the difference between the two measurements (`AbsoluteChange` = difference) not taking the set time interval into account or as the difference normalized to the interval (`RateChange` = difference per minute).
+
+If negative rate is disallowed and no maximum rate value is set, one false high reading will lead to a period of missing measurements until the measurement reaches the previous false high reading. E.g. if the counter is at `600,00` and it's read incorrectly as` 610,00`, all measurements will be skipped until the counter reaches `610,00`. Setting the MaxRateValue to `0,05` leads to a rejection of all readings with a difference `> 0,05`, in this case `610,00`. The rejection also applies to correct readings with a difference `> 0,05`!
diff --git a/param-docs/parameter-pages/PostProcessing/PreValueAgeStartup.md b/param-docs/parameter-pages/PostProcessing/PreValueAgeStartup.md
new file mode 100644
index 00000000..0c5987bb
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/PreValueAgeStartup.md
@@ -0,0 +1,7 @@
+# Parameter `PreValueAgeStartup`
+Default Value: `720`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Time in minutes, how long a previous read value is valid after reboot.
diff --git a/param-docs/parameter-pages/PostProcessing/PreValueUse.md b/param-docs/parameter-pages/PostProcessing/PreValueUse.md
new file mode 100644
index 00000000..58f71985
--- /dev/null
+++ b/param-docs/parameter-pages/PostProcessing/PreValueUse.md
@@ -0,0 +1,5 @@
+# Parameter `PreValueUse`
+Default Value: `true`
+
+Use the previous value (value from previous round) for consistency checks.
+This also works through a reboot of the device!
diff --git a/param-docs/parameter-pages/System/CPUFrequency.md b/param-docs/parameter-pages/System/CPUFrequency.md
new file mode 100644
index 00000000..97152794
--- /dev/null
+++ b/param-docs/parameter-pages/System/CPUFrequency.md
@@ -0,0 +1,13 @@
+# Parameter `CPUFrequency`
+Default Value: `160`
+
+Set the CPU Frequency.
+
+!!! Warning
+ Setting it to 240 will lead to a faster device, but it will also require a stronger power supply!
+ Additionally, depending on the quality of your ESP32-CAM, it might run unstable!
+
+Possible values:
+
+- 160
+- 240
diff --git a/param-docs/parameter-pages/System/Hostname.md b/param-docs/parameter-pages/System/Hostname.md
new file mode 100644
index 00000000..347ce76e
--- /dev/null
+++ b/param-docs/parameter-pages/System/Hostname.md
@@ -0,0 +1,8 @@
+# Parameter `Hostname`
+Default Value: `undefined`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Hostname for the device.
+It gets automatically transferred to `/wlan.ini` on the SD-Card at the next startup.
diff --git a/param-docs/parameter-pages/System/RSSIThreshold.md b/param-docs/parameter-pages/System/RSSIThreshold.md
new file mode 100644
index 00000000..a7f5ec50
--- /dev/null
+++ b/param-docs/parameter-pages/System/RSSIThreshold.md
@@ -0,0 +1,19 @@
+# Parameter `RSSIThreshold`
+Default Value: `0`
+
+Possible values: `-100` .. `0` (`0` = disabled).
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+
+This parameter activates a client triggered AP switching functionality (simplified roaming).
+If actual RSSI value is lower (more negative) than `RSSIThreshold`, all WIFI channels will be scanned for configured access point SSID. If an access point is in range which has better RSSI value (less negative) than actual RSSI value + 5 dBm, the device is trying to connect to this access point with the better RSSI value.
+
+
+!!! Note
+ The RSSI check only gets initiated at the end of each round to avoid any disturbance of processing.
+
+
+!!! Note
+ It gets automatically transferred to `/wlan.ini` on the SD-Card at next startup.
diff --git a/param-docs/parameter-pages/System/SetupMode.md b/param-docs/parameter-pages/System/SetupMode.md
new file mode 100644
index 00000000..18fcdaa6
--- /dev/null
+++ b/param-docs/parameter-pages/System/SetupMode.md
@@ -0,0 +1,7 @@
+# Parameter `SetupMode`
+Default Value: `true`
+
+!!! Note
+ This parameter is not accessible through the Web Interface Configuration Page!
+
+Set this parameter to `true` to stay in the Setup Mode after the next start of the device.
diff --git a/param-docs/parameter-pages/System/TimeServer.md b/param-docs/parameter-pages/System/TimeServer.md
new file mode 100644
index 00000000..f10713d0
--- /dev/null
+++ b/param-docs/parameter-pages/System/TimeServer.md
@@ -0,0 +1,10 @@
+# Parameter `TimeServer`
+Default Value: `pool.ntp.org`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Time server to synchronize system time. If it is disabled or `undefined`, `pool.ntp.org` will be used.
+You can also set it to the IP of your router. Many routers like Fritzboxes can act as a local NTP server.
+To disable NTP, you need to activate it but set the TimeServer config to be empty (`""`).
+In such case the time always starts at `01.01.1970` after each power cycle!
diff --git a/param-docs/parameter-pages/System/TimeZone.md b/param-docs/parameter-pages/System/TimeZone.md
new file mode 100644
index 00000000..fb6dfea0
--- /dev/null
+++ b/param-docs/parameter-pages/System/TimeZone.md
@@ -0,0 +1,5 @@
+# Parameter `TimeZone`
+Default Value: `CET-1CEST,M3.5.0,M10.5.0/3`
+
+Time zone in POSIX syntax (Europe/Berlin = `CET-1CEST,M3.5.0,M10.5.0/3` - incl. daylight saving)
+Check the table on `http:///timezones.html` to find the settings for your region.
diff --git a/param-docs/parameter-pages/TakeImage/Brightness.md b/param-docs/parameter-pages/TakeImage/Brightness.md
new file mode 100644
index 00000000..b3cbd777
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/Brightness.md
@@ -0,0 +1,10 @@
+# Parameter `Brightness`
+Default Value: `0`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+!!! Note
+ This parameter can also be set on the Reference Image configuration.
+
+Image Brightness (`-2` .. `2`)
diff --git a/param-docs/parameter-pages/TakeImage/Contrast.md b/param-docs/parameter-pages/TakeImage/Contrast.md
new file mode 100644
index 00000000..6aa07ca6
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/Contrast.md
@@ -0,0 +1,11 @@
+# Parameter `Contrast`
+Default Value: `0`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+!!! Note
+ This parameter can also be set on the Reference Image configuration.
+
+Image Contrast (`-2` .. `2`)
+
diff --git a/param-docs/parameter-pages/TakeImage/Demo.md b/param-docs/parameter-pages/TakeImage/Demo.md
new file mode 100644
index 00000000..aa42878a
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/Demo.md
@@ -0,0 +1,6 @@
+# Parameter `Demo`
+Default Value: `false`
+
+Enable to use demo images instead of the real camera images.
+Make sure to have a `/demo` folder on your SD-Card and make sure it contains the expected files!
+Check [here](../Demo-Mode) for details.
diff --git a/param-docs/parameter-pages/TakeImage/FixedExposure.md b/param-docs/parameter-pages/TakeImage/FixedExposure.md
new file mode 100644
index 00000000..2491e062
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/FixedExposure.md
@@ -0,0 +1,7 @@
+# Parameter `FixedExposure`
+Default Value: `false`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Fixes the illumination setting of camera at the startup and uses this later -> Individual round is faster.
diff --git a/param-docs/parameter-pages/TakeImage/ImageQuality.md b/param-docs/parameter-pages/TakeImage/ImageQuality.md
new file mode 100644
index 00000000..7f5c4c09
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/ImageQuality.md
@@ -0,0 +1,10 @@
+# Parameter `ImageQuality`
+Default Value: `12`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Quality index for pictures: `8` (highest quality) ... `63` (lowest quality)
+
+!!! Warning
+ Value below 12 could result in system instabilities!
diff --git a/param-docs/parameter-pages/TakeImage/ImageSize.md b/param-docs/parameter-pages/TakeImage/ImageSize.md
new file mode 100644
index 00000000..73531f3c
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/ImageSize.md
@@ -0,0 +1,12 @@
+# Parameter `ImageSize`
+Default Value: `VGA`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Size of the camera picture.
+
+Available options:
+
+- `VGA` (640 x 480 pixel)
+- `QVGA` (320 x 240 pixel)
diff --git a/param-docs/parameter-pages/TakeImage/LEDIntensity.md b/param-docs/parameter-pages/TakeImage/LEDIntensity.md
new file mode 100644
index 00000000..19bfadcc
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/LEDIntensity.md
@@ -0,0 +1,8 @@
+# Parameter `LEDIntensity`
+Default Value: `50`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+ This parameter can also be set on the Reference Image configuration.
+
+Set the Flash LED Intensity: (`0` .. `100`)
diff --git a/param-docs/parameter-pages/TakeImage/RawImagesLocation.md b/param-docs/parameter-pages/TakeImage/RawImagesLocation.md
new file mode 100644
index 00000000..0b53a93c
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/RawImagesLocation.md
@@ -0,0 +1,7 @@
+# Parameter `RawImagesLocation`
+Default Value: `/log/source`
+
+Location on the SD-Card to store the raw images.
+
+!!! Warning
+ A SD-Card has limited write cycles. Since the device does not do [Wear Leveling](https://en.wikipedia.org/wiki/Wear_leveling), this can wear out your SD-Card!
diff --git a/param-docs/parameter-pages/TakeImage/RawImagesRetention.md b/param-docs/parameter-pages/TakeImage/RawImagesRetention.md
new file mode 100644
index 00000000..e14e79bc
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/RawImagesRetention.md
@@ -0,0 +1,6 @@
+# Parameter `RawImagesRetention`
+Default Value: `15`
+
+Unit: Days
+
+Number of days to keep the raw images (`0` = forever)
diff --git a/param-docs/parameter-pages/TakeImage/Saturation.md b/param-docs/parameter-pages/TakeImage/Saturation.md
new file mode 100644
index 00000000..1fc21936
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/Saturation.md
@@ -0,0 +1,11 @@
+# Parameter `Saturation`
+Default Value: `0`
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+!!! Note
+ This parameter can also be set on the Reference Image configuration.
+
+Image Saturation (`-2` .. `2`)
+
diff --git a/param-docs/parameter-pages/TakeImage/WaitBeforeTakingPicture.md b/param-docs/parameter-pages/TakeImage/WaitBeforeTakingPicture.md
new file mode 100644
index 00000000..f6577519
--- /dev/null
+++ b/param-docs/parameter-pages/TakeImage/WaitBeforeTakingPicture.md
@@ -0,0 +1,9 @@
+# Parameter `WaitBeforeTakingPicture`
+Default Value: `5`
+
+Unit: seconds
+
+!!! Warning
+ This is an **Expert Parameter**! Only change it if you understand what it does!
+
+Waiting time between switching the flash light (onboard LED) on and taking the picture.
diff --git a/param-docs/parameter-pages/img/flipImageSize.png b/param-docs/parameter-pages/img/flipImageSize.png
new file mode 100644
index 00000000..dd761aa5
Binary files /dev/null and b/param-docs/parameter-pages/img/flipImageSize.png differ
diff --git a/param-docs/templates/overview-old.md b/param-docs/templates/overview-old.md
new file mode 100644
index 00000000..512b7b6e
--- /dev/null
+++ b/param-docs/templates/overview-old.md
@@ -0,0 +1,13 @@
+# Parameters
+This page lists all available [Configuration](../Configuration) Parameters.
+If a parameter or section has a tick box on its left side, you can disable it.
+In such case the functionality gets disabled respectively the default values will be used.
+
+!!! Note
+ This is an auto-generated page! See the [README](https://github.com/jomjol/AI-on-the-edge-device-docs/blob/main/README.md) for details!
+
+## List of all Parameters
+
+$TOC
+
+
\ No newline at end of file
diff --git a/param-docs/templates/overview.md b/param-docs/templates/overview.md
new file mode 100644
index 00000000..b34eafef
--- /dev/null
+++ b/param-docs/templates/overview.md
@@ -0,0 +1,9 @@
+# Parameters
+This page lists all available [Configuration](../Configuration) Parameters.
+If a **parameter** or **section** has a tick box on its left side, you can disable it.
+In such case the functionality gets disabled respectively the default values will be used.
+
+!!! Note
+ This is an auto-generated page! See the [README](https://github.com/jomjol/AI-on-the-edge-device-docs/blob/main/README.md) for details!
+
+
\ No newline at end of file
diff --git a/param-docs/templates/parameter.md b/param-docs/templates/parameter.md
new file mode 100644
index 00000000..7ea165f2
--- /dev/null
+++ b/param-docs/templates/parameter.md
@@ -0,0 +1,5 @@
+# Parameter `$NAME`
+Default Value: `$DEFAULT`
+$EXPERT_PARAMETER
+$HIDDEN_IN_UI
+Please fill me with an explanation and useful links.
diff --git a/sd-card/html/.gitignore b/sd-card/html/.gitignore
new file mode 100644
index 00000000..670a212a
--- /dev/null
+++ b/sd-card/html/.gitignore
@@ -0,0 +1 @@
+edit_config_param.html
diff --git a/sd-card/html/edit_config_param.html b/sd-card/html/edit_config_param_template.html
similarity index 100%
rename from sd-card/html/edit_config_param.html
rename to sd-card/html/edit_config_param_template.html
diff --git a/tools/parameter-tooltip-generator/generate-param-doc-tooltips.py b/tools/parameter-tooltip-generator/generate-param-doc-tooltips.py
index ff3e80a5..349c7877 100644
--- a/tools/parameter-tooltip-generator/generate-param-doc-tooltips.py
+++ b/tools/parameter-tooltip-generator/generate-param-doc-tooltips.py
@@ -6,8 +6,9 @@ import glob
import markdown
-parameterDocsFolder = "AI-on-the-edge-device-docs/param-docs/parameter-pages"
+parameterDocsFolder = "../../param-docs/parameter-pages"
docsMainFolder = "../../sd-card/html"
+configPageTemplate = "edit_config_param_template.html"
configPage = "edit_config_param.html"
htmlTooltipPrefix = """
@@ -20,6 +21,8 @@ htmlTooltipSuffix = """
"""
+os.system("cp " + docsMainFolder + "/" + configPageTemplate + " " + docsMainFolder + "/" + configPage)
+
folders = sorted( filter( os.path.isdir, glob.glob(parameterDocsFolder + '/*') ) )
diff --git a/tools/parameter-tooltip-generator/generate-param-doc-tooltips.sh b/tools/parameter-tooltip-generator/generate-param-doc-tooltips.sh
deleted file mode 100755
index bc1a79f3..00000000
--- a/tools/parameter-tooltip-generator/generate-param-doc-tooltips.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-# Checkout the documentation reposo we can extract the parameter documentation
-if [ -d "AI-on-the-edge-device-docs" ] ; then
- # Repo already checked out, pull it
- cd AI-on-the-edge-device-docs
- git checkout main
- git pull
- cd ..
-else
- # Repos folde ris missing, clone it
- git clone https://github.com/jomjol/AI-on-the-edge-device-docs.git
-fi
-
-python generate-param-doc-tooltips.py