Files
AI-on-the-edge-device/sd-card/html/edit_config_param.html
CaCO3 245302c6ca Release Preparations (#1925)
* Fix for securing wlan.ini (#1509)

* Fix for securing wlan.ini

* Fixing error with ' instead of "

* Changing to errorcode 403

* maybe strcmp instead of regular ==

Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>

* Update Web-Installer

* solves #1530 (#1531)

* Refactor JSON (#1518)

* use correct log level

* corrected logging

* typo

* refactored JSON generagion: removed unused parameters, consolidated into singel function, added "pre"

* Wrapped 'rate' into double quotes, like all other JSON values

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Various corrections (#1519)

* use correct log level

* corrected logging

* typo

* add release to webinstaller

* changed logs, added INFO log of raw, value, error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Prevent auto restart on cam framebuffer init error (#1522)

* use correct log level

* revert autorestart on camera framebuffer init error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* #1524 - ensure the recognized digit is less than 10 (#1525)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

Co-authored-by: github-actions <github-actions@github.com>

* fix frozen time in datafile on error (#1534)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* log NTP server name (#1497)

* log NTP server name

* .

* .

* replace calls to /wasserzaehler.html with calls to /value (#1469)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Fix cookie usage, use correct http response codes, add 404 page (#1495)

* replaced some HTTP response code with better matching codes

* add custom 404 page, add log entry for debugging

* fix cookie

* replace non-necessary whitespace

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Don't autofail if NTP server can't be reached during initalization (#1498)

This fixes an issue with a restricted network without internet access,
where the hardcoded ntp server can't be reached and thus the esp resets,
as it's not able to finish initalization.

* Update Changelog.md

* Update Changelog.md for  release

* Fix for securing wlan.ini (#1509)

* Fix for securing wlan.ini

* Fixing error with ' instead of "

* Changing to errorcode 403

* maybe strcmp instead of regular ==

Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>

* Update Web-Installer

* solves #1530 (#1531)

* Refactor JSON (#1518)

* use correct log level

* corrected logging

* typo

* refactored JSON generagion: removed unused parameters, consolidated into singel function, added "pre"

* Wrapped 'rate' into double quotes, like all other JSON values

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Various corrections (#1519)

* use correct log level

* corrected logging

* typo

* add release to webinstaller

* changed logs, added INFO log of raw, value, error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Prevent auto restart on cam framebuffer init error (#1522)

* use correct log level

* revert autorestart on camera framebuffer init error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* #1524 - ensure the recognized digit is less than 10 (#1525)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

Co-authored-by: github-actions <github-actions@github.com>

* only use sntp_getservername() after init sntp

* set default NTP server on dnew installations

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Ralf Rachinger <git@ralfrachinger.de>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: parhedberg <par.hedberg@gmail.com>
Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>
Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>

* Renamed variables and added debug log (#1537)

* add debug logs

* renamed variables

* renamed TAGs, added flow status logging

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* replaced printf usage in LogFile.WriteToFile()

* ENABLE_MQTT c++ macro definition (#1546)

* macro

* 2

* 2

* delete jomjol_mqtt from CMakeLists

* mqtt macro

* final

* ENABLE_INFLUXDB c++ macro definition (#1547)

* macro

* 2

* 2

* delete jomjol_mqtt from CMakeLists

* mqtt macro

* final

* ENABLE_INFLUXDB c++ macro definition

* Update Changelog.md

* Update Changelog.md

* Rearange task to CPU (http, camera, mqtt) (#1557)

* Streamlined MQTT interlock when not activated & interlock MQTT when WIFI is not connected (#1556)

* streamlined mqtt interlock when disabled

* Disconnect mqtt client before reboot

* Interlock MQTT with WIFI

* Update

* loglevel to DEBUG

* Update

* mqtt msg id incremental

* new ENABLE_MQTT includes

* Loglevel to DEBUG

* Loglevel

* Update interface_mqtt.cpp

* show uptime on overview page, moved labels from firmware to Web UI (#1543)

* show uptime on overview page, moved labels from firmware to Web UI

* show uptime on info page

* also use formated time in log

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Continue boot on bad PSRAM (#1558)

* add sensor status, show special index/setup page in case of a critical error

* continue booting on PSRAM error

* Update main.cpp

added log messages

* init PSRAM and add more log messages

* cleanup of init checks

* .

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* add sensor status, show special index/setup page in case of a critical error (#1560)

* add sensor status, show special index/setup page in case of a critical error

* Added Reboot

* .

* added more buttons

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Update Webinstaller to v13.0.7

* remove  html-from-11.3.1 in release (#1565)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

* only initial_esp32_setup and update.zip as artefacts

* remove unneeded cache

* rename step ota-v2 to ota

* rename ota-v2 to ota

Co-authored-by: github-actions <github-actions@github.com>

* make the sidebar on the overviw page wider and show the round counter (#1570)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Create reply-bot.yml

* Update ClassFlowPostProcessing.cpp

* Add bot (#1581)

* Update reply-bot.yml

* Create label-commenter-config.yml

* added missing html change

* extended instructions (#1583)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Fix Rate Problem

* removed redundant "Status:"

* Bugfix Double Extract ZIP-Files

* Update FeatureRequest.md (#1591)

in case of position change between the measurments set this state to true, if there is no change set it back to false.
In a defined time window this movement can lead into an alarm state / water leak..
haveing this state in the mqtt broker can trigger functions like closing the ater pipe walve and so on...

* Update manifest.json

* Delete .gitignore

* Delete .gitmodules

* Delete firmware.bin

* Add files via upload

* Block REST API calls till resource is ready (#1609)

* Block REST API call till ressource is ready

* Update

* Update

* Update

* replace relative include of gethost.js with absolute one. This is needed as that file gets incuded on dynamically generated content which can be on different path levels (#1610)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* esp_spiram.h has been replaced by esp32/spiram.h (#1605)

* esp_spiram.h has been replaced by esp32/spiram.h

* Preparations for next Bugfix Release (#1615)

* Merge branch 'rolling' (#1559)

* Fix for securing wlan.ini (#1509)

* Fix for securing wlan.ini

* Fixing error with ' instead of "

* Changing to errorcode 403

* maybe strcmp instead of regular ==

Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>

* Update Web-Installer

* solves #1530 (#1531)

* Refactor JSON (#1518)

* use correct log level

* corrected logging

* typo

* refactored JSON generagion: removed unused parameters, consolidated into singel function, added "pre"

* Wrapped 'rate' into double quotes, like all other JSON values

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Various corrections (#1519)

* use correct log level

* corrected logging

* typo

* add release to webinstaller

* changed logs, added INFO log of raw, value, error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Prevent auto restart on cam framebuffer init error (#1522)

* use correct log level

* revert autorestart on camera framebuffer init error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* #1524 - ensure the recognized digit is less than 10 (#1525)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

Co-authored-by: github-actions <github-actions@github.com>

* fix frozen time in datafile on error (#1534)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* log NTP server name (#1497)

* log NTP server name

* .

* .

* replace calls to /wasserzaehler.html with calls to /value (#1469)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Fix cookie usage, use correct http response codes, add 404 page (#1495)

* replaced some HTTP response code with better matching codes

* add custom 404 page, add log entry for debugging

* fix cookie

* replace non-necessary whitespace

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Don't autofail if NTP server can't be reached during initalization (#1498)

This fixes an issue with a restricted network without internet access,
where the hardcoded ntp server can't be reached and thus the esp resets,
as it's not able to finish initalization.

* Update Changelog.md

* Update Changelog.md for  release

* Fix for securing wlan.ini (#1509)

* Fix for securing wlan.ini

* Fixing error with ' instead of "

* Changing to errorcode 403

* maybe strcmp instead of regular ==

Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>

* Update Web-Installer

* solves #1530 (#1531)

* Refactor JSON (#1518)

* use correct log level

* corrected logging

* typo

* refactored JSON generagion: removed unused parameters, consolidated into singel function, added "pre"

* Wrapped 'rate' into double quotes, like all other JSON values

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Various corrections (#1519)

* use correct log level

* corrected logging

* typo

* add release to webinstaller

* changed logs, added INFO log of raw, value, error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Prevent auto restart on cam framebuffer init error (#1522)

* use correct log level

* revert autorestart on camera framebuffer init error

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* #1524 - ensure the recognized digit is less than 10 (#1525)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

Co-authored-by: github-actions <github-actions@github.com>

* only use sntp_getservername() after init sntp

* set default NTP server on dnew installations

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Ralf Rachinger <git@ralfrachinger.de>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: parhedberg <par.hedberg@gmail.com>
Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>
Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>

* Renamed variables and added debug log (#1537)

* add debug logs

* renamed variables

* renamed TAGs, added flow status logging

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* replaced printf usage in LogFile.WriteToFile()

* ENABLE_MQTT c++ macro definition (#1546)

* macro

* 2

* 2

* delete jomjol_mqtt from CMakeLists

* mqtt macro

* final

* ENABLE_INFLUXDB c++ macro definition (#1547)

* macro

* 2

* 2

* delete jomjol_mqtt from CMakeLists

* mqtt macro

* final

* ENABLE_INFLUXDB c++ macro definition

* Update Changelog.md

Co-authored-by: parhedberg <par.hedberg@gmail.com>
Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Ralf Rachinger <git@ralfrachinger.de>
Co-authored-by: Nicolas Liaudat <nliaudat@users.noreply.github.com>

* Update Changelog.md for  release

Co-authored-by: parhedberg <par.hedberg@gmail.com>
Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Ralf Rachinger <git@ralfrachinger.de>
Co-authored-by: Nicolas Liaudat <nliaudat@users.noreply.github.com>

* new model version (#1619)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

* only initial_esp32_setup and update.zip as artefacts

* remove unneeded cache

* rename step ota-v2 to ota

* rename ota-v2 to ota

* new models

- ana-class100 v1.5.4
- ana-cont-11.0.4
- dig-class100 v1.5.0

Co-authored-by: github-actions <github-actions@github.com>

* Update Changelog.md (#1630)

* Correct RenameNumber

* Update Changelog.md

* Fix reloading of data file (#1635)

* Update data.html

* fixed

* show link to graph

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Centralizing the defines (#1624)

* defines changes

* Finish #define move + #define STBI_ONLY_JPEGsave 2% of Flash

* remove the defines on the old places

* ClassFlowCNNGeneral in define.h

* revert to origin

* fix translation not ready

* Update defines.h

* Update WebInstaller

* Code translation (#1626)

* comment translation

* translation part #2

* code translation from DE to ENG #part3

* translation #4

* dismantled =>splitted

* bereich => range

* Update defines.h

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Update manifest.json

* Add files via upload

* #ifndef in *.h + #pragma once (#1639)

* Update defines.h (#1640)

comment #define STBI_ONLY_JPEG as you do no want it in rolling but in rolling-minimize-firmware-size

delete old reference to DE 


'''
    #define AnalogFehler 3
    #define AnalogToDigtalFehler 0.8
    #define DigitalUnschaerfe 0.2
    #define DigitalBand 3
    #define DigitalAnalogerVorgaengerUebergangsbereich 2
    #define DigitalUebergangsbereichVorgaenger 0.7 // 9.3 - 0.7
    #define DigitalUebergangsbereichVorlauf 9.7
'''

* Trigger a flow start by REST API or MQTT (#1648)

* Trigger flow start by Rest API

* Increase handlers

* Update

* Update

* Update

* Change max handlers

* Add debug message

* Trigger flow start by MQTT

* Update

* Remove unused function

* Remove handler_doflow + routines

* Cleanup

* MergeCheck

* Optimize logfile write (#1652)

* remove no longer needed OpenFileAndWait()

* remove WriteToDedicatedFile

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* show release in log instead of branch (#1660)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Update sdkconfig.defaults (#1661)

Reverting changes of `sdkconfig.defaults` falsly added within https://github.com/jomjol/AI-on-the-edge-device/pull/1626

* Init GPIO handler before MQTT init (#1663)

* Update HTML & Firmware (#1671)

* Remove unnecessary null pointer checks #1649 (#1673)

* fix kernel panic (vector out of range) in getReadoutRawString

* fix key of caches

* fix key of caches

* fix key caches

* fix cache keys

* fix cache keys

* move set variables to top

* debug

* fix key

* testing

* try fix changelog

* test

* Update Changelog.md for  release

* Revert "Update Changelog.md for  release"

This reverts commit 4f51ec7962.

* remove testing

* fix release creation

* testing

* Update Changelog.md for  release

* test

* Revert "Merge branch 'master' of https://github.com/haverland/AI-on-the-edge-device"

This reverts commit f68695a4c0, reversing
changes made to a096cf7182.

* Revert "test"

This reverts commit a096cf7182.

* revert testing

* #1524 - ensure the result of ZeigerEvalHybridNeu is <10

* Fix late digit transition #1503

* only initial_esp32_setup and update.zip as artefacts

* remove unneeded cache

* rename step ota-v2 to ota

* rename ota-v2 to ota

* new models

- ana-class100 v1.5.4
- ana-cont-11.0.4
- dig-class100 v1.5.0

* Remove unnecessary null pointer checks #1649

Co-authored-by: github-actions <github-actions@github.com>

* Improve NTP handling (#1676)

* fix special case where number is named "default" (keep all topics in top level instead of in a sub-group)

* re-implemented SNTP usage, added way to disable NTP client, added timezone table

* minor fixes

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* fix special case where number is named "default" (keep all topics in top level instead of in a sub-group) (#1664)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* prepare docs for deployment through actions (#1688)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* make more robust, add log (#1690)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Extend Github Actions (#1680)

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* automate manifest update

* Update build.yaml

* revert changes to docs folder

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Add files via upload

* prepare docs for deployment through actions (#1688)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* automate manifest update

# Conflicts:
#	docs/binary/firmware.bin
#	docs/binary/v12.0.1/firmware.bin
#	docs/binary/v12.0.5/firmware.bin
#	docs/binary/v13.0.5/firmware.bin
#	docs/binary/v13.0.7/firmware.bin

* revert changes to docs folder

* revert changes to docs folder

# Conflicts:
#	docs/releases/download/firmware.bin

* Update build.yaml

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Improve initial setup proc (#1692)

* Initial Test

* Initial functional version.

* Add Bot Replies (#1701)

* Update label-commenter-config.yml

* Update reply-bot.yml

* Update label-commenter-config.yml

* disable remove-labels because they no longer work

* delete img_convert.h as included in code\components\tflite-micro-esp-… (#1695)

* delete img_convert.h as included in code\components\tflite-micro-esp-examples\components\esp32-camera\conversions\include\img_converters.h

* macro definition #ifdef ENABLE_SOFTAP

* macro definition #ifdef ENABLE_SOFTAP (#1698)

* macro definition #ifdef ENABLE_SOFTAP

* Update platformio.ini

* softap define in define.h

* Update platformio.ini

* #define WLAN_CONFIG_FILE "/sdcard/wlan.ini"

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Deinit components before reboot (#1704)

* Deinit all components before reboot

* Update

* Update

* fetch index.html after reboot -> less 404 (#1705)

* Safe optimizations (#1706)

* safe optimizations

* Merge branch 'rolling' of https://github.com/nliaudat/AI-on-the-edge-device into rolling

* Enable SoftAP

* Update defines

* add a define to configure the logfile handling (#1709)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Move Logfile Switch to define.h

* Update Reboot Algo

* Update server_ota.cpp

* Avoid loading of status infos twice (#1711)

* Force a reboot even reboot task cannot be created due to lack of heap (#1713)

* Deinit all components before reboot

* Update

* Update

* Force reboot when reboot task cannot be created

* Improve log message when web UI is incomplete (#1716)

* improve warning if version.txt is missing

* typo

* show round duration in log

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* fix static IP in UP, improve explanation for HA (#1719)

* fix static IP in UP, improve explanation for HA

* Update edit_config_param.html

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Create demo folder at startup (if not present)

* Update defines.h (#1726)

* improve explanations,added example (#1729)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Add demo mode (#1720)

* move main part to cam file

* added demo mode

* .

* add a define to configure the logfile handling (#1709)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Move Logfile Switch to define.h

* Update Reboot Algo

* Update server_ota.cpp

* Avoid loading of status infos twice (#1711)

* Force a reboot even reboot task cannot be created due to lack of heap (#1713)

* Deinit all components before reboot

* Update

* Update

* Force reboot when reboot task cannot be created

* Improve log message when web UI is incomplete (#1716)

* improve warning if version.txt is missing

* typo

* show round duration in log

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* .

* .

* .

* creade demo dir

* fix static IP in UP, improve explanation for HA (#1719)

* fix static IP in UP, improve explanation for HA

* Update edit_config_param.html

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Create demo folder at startup (if not present)

* move demo files

* Update defines.h (#1726)

* updated description

* moved to expert section

* fixed broken enabled state

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: Slider0007 <115730895+Slider0007@users.noreply.github.com>

* Fix regression of reboot handler / reboot waiting script (#1725)

* Reboot after OTA: Avoid exeception

* Overview - optimize reload behaviour after reboot

* Update

* Update

* Moved softAP to the very first checks

* Update SoftAP

* Update build.yaml (#1737)

* Update build.yaml

* Update build.yaml

* #1649 unnecessary np check (#1736)

* consolidate test-ip definition, added missing Access-Control-Allow-Origin,

* Revert "consolidate test-ip definition, added missing Access-Control-Allow-Origin,"

This reverts commit 56cfeb732e.

* consolidate test-ip definition, added missing Access-Control-Allow-Origin (#1741)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Replace alert boxes with overlay info boxes  (#1742)

* consolidate test-ip definition, added missing Access-Control-Allow-Origin

* replace alert boxes with overlay info boxes

* .

* .

* .

* .

* .

* .

* .

* .

* .

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* compiler optimization (#1749)

compiler optimization for tflite-micro-esp-examples

* Modify stack sizes + max open files (SD) , add REST handler for heap/(stack) infos (#1751)

* Modify stack sizes+max open files,add rest handler

* Update

* Optimized CImageBasis

* Update feature.yaml

* cache static files (#1755)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Implemented Reboot for "firmware.bin" as well

* new OTA page with progressbar (#1756)

* new OTA page with progress bar

* improve error message on missing demo files

* .

* Implemented Reboot for "firmware.bin" as well

* Update feature.yaml

* cache static files (#1755)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* .

* .

* added filename validation

* .

* .

* .

* move

* added missing dash to regex

* restrict file type

* .

* .

* .

* .

* cleanup no longer needed mode

* only start restart counter if restart is required

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Rolling-bot: Only show jomjol repo rollings (#1783)

* Update platfromio.ini

* Add option to disable brownout detector (#1784)

* Update defines.h

* Update main.cpp

* Improve file server (#1785)

* .

* .

* .

* .

* .

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Ignore cache on GIT hash change (new commit or release) (#1787)

* Add hash to all html, css, and js URLs

* Update build.yaml

* Update build.yaml

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* fix overview.html

* GPIO handler: Deinit before delete (#1795)

* Rest handler: Use none chunked transfer (#1797)

* Resthandler info,sysinfo,starttime: no chunk trans

* flowstart,statusflow,cputemp,rssi,uptime,prevalue

* Renamed error messages

* STBI_ONLY_JPEG (#1789)

* Add error handling for memory intensive tasks (#1798)

* tflite model loading: error handling

* FlowAlignment: error handling

* CImageBasis+GetJPGStream : error handling

* Update graph.html (#1802)

* Delete demo-images directory

Data is now provided in the documentation

* REST handler sysinfo + MQTT topic: Free heap memory not reporting (#1815)

* REST handler sysinfo: Fix reporting of free memory

* MQTT topic freemem: Fix reporting of free memory

* Refactor getEspHeapInfo routine (#1816)

* Refactor getEspHeapInfo

* ClassLogfile: Remove redundandent one

* DataGraph: datafiles sorted -> newest on top (#1817)

* plaformio [env:esp32cam-dev] : Add task analysis & test for 8m spiram  real support (#1818)

add support of   TASK_ANALYSIS_ON 
test full support of 8mb spiram board  (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/himem.html)

* Improve html roi disablement (#1825)

* Improve ROI-Problem

* Update

* Update common.js

* Update links

* Store preprocessed image with ROI to RAM (#1809)

* tflite model loading: error handling

* FlowAlignment: error handling

* CImageBasis+GetJPGStream : error handling

* store preprocessed ALG_ROI.jpg to memory

* Update

* Create clean-branch-cache-after-pull-request-got-closed.yml

* Clean sdkconfig (not default) (#1828)

* Delete sdkconfig - Kopie.defaults

* Delete sdkconfig.esp32cam-testing

* Delete sdkconfig - Kopie.esp32cam

* Update platformio.ini

* Delete clean-branch-cache-after-pull-request-got-closed.yml

* Update README.md

* Esp32 sys info (#1829)

* Add files via upload

* Update defines.h

* Update main.cpp

* git ignore + sdkconfig.esp32cam-dev (#1830)

* update build actions/cache@v3.2.3 (#1831)

* actions/cache@v3.2.3

* Create clear _all_cache.yml

* fix typo naming workflow clear_cache.yml

* Update tflite

* Initial Implementation (#1834)

* Fix pointer call in ClassControllCamera.cpp:310 (#1833)

ClassControllCamera.cpp:310:67: error: request for member 'rgb_image' in '_zwImage', which is of pointer type 'CImageBasis*'
ClassControllCamera.cpp:310:117: error: request for member 'width' in '_zwImage', which is of pointer type 'CImageBasis*'
ClassControllCamera.cpp:310:157: error: request for member 'height' in '_zwImage', which is of pointer type 'CImageBasis*'

* Initial Implementation (#1835)

* improve caching (#1836)

* improve caching

See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache

* Update build.yaml

* Update build.yaml

* Update build.yaml

* Update README.md

* Update build.yaml

* Update build.yaml

* Update README.md

* Update build.yaml

* Update label-commenter-config.yml

* Fix uninitialized filename (#1838)

* fix the uninitialized filename. It only got used for the logging in case the file exists but failed to get loaded (eg. /sdcard/log/data/data_2023-01-14.csv)

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Show ways to get notified about new releases

* update wiki references

* enhance development environment (#1841)

* add sdkconfig.defaults per environment 

https://github.com/platformio/platform-espressif32/issues/638

* add env to platformio

* add sdkconfig.<pioenv>.defaults

* Update platformio.ini

* Update .gitignore

* Delete sdkconfig.esp32cam-cpu-freq-240.defaults

* Delete sdkconfig.esp32cam-dev-himem.defaults

* Delete sdkconfig.esp32cam-dev.defaults

* Delete sdkconfig.esp32cam-no-softap.defaults

* Add files via upload

* Update sdkconfig.esp32cam-cpu-freq-240.defaults

* Update platformio.ini

* Update platformio.ini

* Update CMakeLists.txt

* Update sdkconfig.esp32cam-dev.defaults

* Update platformio.ini

* add HIMEM debugging tools (check free size, and memory test) (#1852)

* Update defines.h

* Update esp_sys.h

* Update esp_sys.cpp

* Add files via upload

* Update perfmon.c

* Update main.cpp

* Update main.cpp

* Delete himem_memory_check.c

* Add files via upload

* Update defines.h

* Update himem_memory_check.cpp

* Update main.cpp

* Update himem_memory_check.cpp

* Update himem_memory_check.h

* Update main.cpp

* fix define

* Avoid multiple Access-Control-Allow-Origin * (#1859)

* Avoid multiple Access-Control-Allow-Origin *

* Adapt loglevel to debug

* Update build.yaml

* Improve data logging on errors (#1839)

* use error level for log if "Rate to High" or "Negative Rate"

* remove redundant data logging

* .

* .

* update time also in case of an error

* move calculation of difference to the top as discussed in PR 1839

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Heap tracing (#1861)

* Update sdkconfig.esp32cam-dev-task-analysis.defaults

* Update defines.h

* Update platformio.ini

* Update main.cpp

* Update defines.h

* Update ClassFlowCNNGeneral.cpp

* Update platformio.ini

* disable HIMEM (external > 4mb ram) not used (#1864)

#force disable HIMEM as not used in default config, can be enabled with [env:esp32cam-dev-himem]
#free 256kb of internal memory :
#I (2112) esp_himem: Initialized. Using last 8 32KB address blocks for bank switching on 4352 KB of physical memory.
CONFIG_SPIRAM_BANKSWITCH_ENABLE=n
#CONFIG_SPIRAM_BANKSWITCH_RESERVE is not set

* Update ota_page.html (#1866)

Fixed the firework to match the actual button text.
Fixed other random typos.

* add AlignmentAlgo=off option (#1867)

* Replace outdated wiki links, wording (#1871)

* Revert "add AlignmentAlgo=off option (#1867)" (#1876)

This reverts commit 3de4cc7c56.

* fixed typo (#1881)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Show WIFI signal text labels / Log RSSI value to logfile (#1877)

* Overview: WIFI RSSI strength text labels

* Log RSSI value (debug level)

* Typo

* Update config.ini (#1880)

* Update Changelog.md for  release (#1892)

Co-authored-by: github-actions <github-actions@github.com>

* Update Changelog.md

* Remove newline in version (#1891)

* remove newline in version

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Show alternative images for states "Initialization" and "Take Image" (#1858)

* Show image for flow not started + take image

* Update

* Adding new images

* .

* Avoid multiple Access-Control-Allow-Origin * (#1859)

* Avoid multiple Access-Control-Allow-Origin *

* Adapt loglevel to debug

* Update build.yaml

* .

* New state "initialization (delayed)", renaming

* Overview: Renamed "Status" + switched position

* Improve data logging on errors (#1839)

* use error level for log if "Rate to High" or "Negative Rate"

* remove redundant data logging

* .

* .

* update time also in case of an error

* move calculation of difference to the top as discussed in PR 1839

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Heap tracing (#1861)

* Update sdkconfig.esp32cam-dev-task-analysis.defaults

* Update defines.h

* Update platformio.ini

* Update main.cpp

* Update defines.h

* Update ClassFlowCNNGeneral.cpp

* Update platformio.ini

* disable HIMEM (external > 4mb ram) not used (#1864)

#force disable HIMEM as not used in default config, can be enabled with [env:esp32cam-dev-himem]
#free 256kb of internal memory :
#I (2112) esp_himem: Initialized. Using last 8 32KB address blocks for bank switching on 4352 KB of physical memory.
CONFIG_SPIRAM_BANKSWITCH_ENABLE=n
#CONFIG_SPIRAM_BANKSWITCH_RESERVE is not set

* Update ota_page.html (#1866)

Fixed the firework to match the actual button text.
Fixed other random typos.

* add AlignmentAlgo=off option (#1867)

* Replace outdated wiki links, wording (#1871)

* Revert "add AlignmentAlgo=off option (#1867)" (#1876)

This reverts commit 3de4cc7c56.

* fixed typo (#1881)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Show WIFI signal text labels / Log RSSI value to logfile (#1877)

* Overview: WIFI RSSI strength text labels

* Log RSSI value (debug level)

* Typo

* Update config.ini (#1880)

* Update Changelog.md for  release (#1892)

Co-authored-by: github-actions <github-actions@github.com>

* Update Changelog.md

* Remove newline in version (#1891)

* remove newline in version

* .

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: CaCO3 <caco3@ruinelli.ch>
Co-authored-by: Nicolas Liaudat <nliaudat@users.noreply.github.com>
Co-authored-by: AngryApostrophe <89547888+AngryApostrophe@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>

* restructure manual setup zip (#1897)

* Update build.yaml

* Update build.yaml

* Update build.yaml

* fix typos and wording on config page (#1898)

* Update label-commenter-config.yml

* Update label-commenter-config.yml

* remove external Web UI dependencies (#1896)

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* Remove excessive whitespaces and newlines in json (#1904)

* .

* .

* .

* .

* .

* remove newlines in json as it is not needed

* .

Co-authored-by: CaCO3 <caco@ruinelli.ch>

* REST handler CPU temp / RSSI: Remove units (#1908)

* REST CPU temp: escape special character

* REST CPUTemp+RSSI: remove units, output as int

* REST handler sysinfo: CPU tempature as integer

* Update Changelog.md (#1893)

* Update Changelog.md

* Update Changelog.md

* Update Changelog.md

* Update Changelog.md

* Update Index & Index.html

* Move Update description to online docu

* Update index.html

* Update Changelog.md

* Update Changelog.md

---------

Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>

* Update Changelog.md

---------

Co-authored-by: parhedberg <par.hedberg@gmail.com>
Co-authored-by: Pär Hedberg <par.hedberg@nordicmedtest.se>
Co-authored-by: jomjol <30766535+jomjol@users.noreply.github.com>
Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: CaCO3 <caco@ruinelli.ch>
Co-authored-by: Frank Haverland <fspapaping@googlemail.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Ralf Rachinger <git@ralfrachinger.de>
Co-authored-by: Nicolas Liaudat <nliaudat@users.noreply.github.com>
Co-authored-by: Slider0007 <115730895+Slider0007@users.noreply.github.com>
Co-authored-by: smartboart <38385805+smartboart@users.noreply.github.com>
Co-authored-by: AngryApostrophe <89547888+AngryApostrophe@users.noreply.github.com>
Co-authored-by: Dave <43378003+dkneisz@users.noreply.github.com>
2023-01-27 21:25:58 +01:00

2109 lines
78 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<link rel="icon" href="favicon.ico?v=$COMMIT_HASH" type="image/x-icon">
<title>Edit Config</title>
<meta charset="utf-8">
<style>
h1 {font-size: 2em;}
h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
h3 {font-size: 1.2em;}
h4 {font-size: 1em; margin-bottom: 0;}
h5 {font-size: 0.83em; margin-top: 0.2em; margin-bottom: 0;}
p {font-size: 1em;}
table {
border: 0pt;
border-collapse: collapse;
}
tr {
border-bottom: 1px solid lightgray;
}
td {
padding: 10px;
}
.button {
padding: 5px 20px;
width: 211px;
font-size: 16px;
}
textarea {
font-size: 14px;
}
.description {
color: black;
font-size: 80%;
}
.disabled {
color:lightgrey;
}
.smallSelect {
width: 30px;
}
.invalid-input {
background-color: #FFAA00;
}
.hidden {
display: none;
}
.expert {
background-color: #ffc5c5;
}
.indent1 {
padding-left: 40px;
}
.indent2 {
padding-left: 69px;
}
</style>
<link href="firework.css?v=$COMMIT_HASH" rel="stylesheet">
<script type="text/javascript" src="jquery-3.6.0.min.js?v=$COMMIT_HASH"></script>
<script type="text/javascript" src="firework.js?v=$COMMIT_HASH"></script>
</head>
<body style="font-family: arial; padding: 0px 10px;">
<h2>Configuration</h2>
<input type="checkbox" id="ExpertModus_enabled" value="1" onclick = 'UpdateExpertModus()' unchecked><label for="ExpertModus_enabled"> Expert Mode </label>
<button class="button" id="Edit_Config_Direct" onclick="editConfigDirect()" style="display:none">Edit Config.ini direct</button>
<p></p>
<div id = "divall" style="display:none">
<table>
<tr>
<th width="350px" style="text-align: left;">
Parameter
</th>
<th style="text-align: left;">
Value
</th>
<th style="text-align: left;">
Information
</th>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>TakeImage</h4></td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MakeImage_LogImageLocation_enabled" value="1" onclick = 'InvertEnableItem("MakeImage", "LogImageLocation")' unchecked >
<label for=MakeImage_LogImageLocation_enabled><class id="MakeImage_LogImageLocation_text" style="color:black;">LogImageLocation</class></label>
</td>
<td>
<input type="text" name="name" id="MakeImage_LogImageLocation_value1">
</td>
<td class="description">
Location to store raw images for logging
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MakeImage_LogfileRetentionInDays_enabled" value="1" onclick = 'InvertEnableItem("MakeImage", "LogfileRetentionInDays")' unchecked >
<label for=MakeImage_LogfileRetentionInDays_enabled><class id="MakeImage_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label>
</td>
<td>
<input type="number" id="MakeImage_LogfileRetentionInDays_value1" size="13" min="0" step="1">
</td>
<td class="description">
Time to keep the raw image (in days, resp. "0" = forever)
</td>
</tr>
<tr class="expert" id="ex1">
<td class="indent1">
<input type="checkbox" id="MakeImage_Demo_enabled" value="1" onclick = 'InvertEnableItem("MakeImage", "Demo")' unchecked >
<label for=MakeImage_Demo_enabled><class id="MakeImage_Demo_text" style="color:black;">Demo Mode</class></label>
</td>
<td>
<select id="MakeImage_Demo_value1">
<option value="true">true</option>
<option value="false" selected>false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable to use demo images instead of the real camera images.<br>
Make sure to have a demo folder on your SD-Card!
Check the <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/Demo-Mode" target="_blank">documentation</a> for details.
</td>
</tr>
<tr class="expert" id="ex1">
<td class="indent1">
<class id="MakeImage_WaitBeforeTakingPicture_text" style="color:black;">WaitBeforeTakingPicture</class>
</td>
<td>
<input type="number" id="MakeImage_WaitBeforeTakingPicture_value1" size="13" min="0" step="any">
</td>
<td class="description">
Wait time between switching illumination on and taking the picture (in seconds)
</td>
</tr>
<tr class="expert" id="ex2">
<td class="indent1">
<class id="MakeImage_ImageQuality_text" style="color:black;">ImageQuality</class>
</td>
<td>
<input type="number" id="MakeImage_ImageQuality_value1" size="13" min="0" max="63">
</td>
<td class="description">
Quality index for picture (default = "12" - "0" high ... "63" low) <br>
Remark: values smaller than 12 can result in a reboot, as the bigger sized JPEG might not fit in the available RAM!
</td>
</tr>
<tr class="expert" id="ex3">
<td class="indent1">
<class id="MakeImage_ImageSize_text" style="color:black;">ImageSize</class>
</td>
<td>
<select id="MakeImage_ImageSize_value1">
<option value="VGA" selected>VGA</option>
<option value="QVGA" >QVGA</option>
</select>
</td>
<td class="description">
Size of camera picture (default = "VGA")
</td>
</tr>
<tr class="expert" id="LEDIntensity_ex3">
<td class="indent1">
<class id="MakeImage_LEDIntensity_text" style="color:black;">LEDIntensity</class>
</td>
<td>
<input type="number" id="MakeImage_LEDIntensity_value1" size="13" min="0" max="100">
</td>
<td style="font-size: 80%;">
Internal LED Flash Intensity (PWM from 0% - 100%). <br>
Remark: as the camera autoillumination settings are used, this is rather for energy saving, than reducing reflections.
</td>
</tr>
<tr class="expert" id="Brightness_ex3">
<td class="indent1">
<class id="MakeImage_Brightness_text" style="color:black;">Brightness</class>
</td>
<td>
<input type="number" id="MakeImage_Brightness_value1" size="13" min="-2" max="2">
</td>
<td style="font-size: 80%;">
Image Brightness (-2 .. 2 - default = "0")
</td>
</tr>
<tr class="expert" id="Contrast_ex3">
<td class="indent1">
<class id="MakeImage_Contrast_text" style="color:black;">Contrast</class>
</td>
<td>
<input type="number" id="MakeImage_Contrast_value1" size="13" min="-2" max="2">
</td>
<td style="font-size: 80%;">
Image Contrast (-2 .. 2 - default = "0") <br>
Remark: camera driver is not fully supporting this setting yet (no impact on image)
</td>
</tr>
<tr class="expert" id="Saturation_ex3">
<td class="indent1">
<class id="MakeImage_Saturation_text" style="color:black;">Saturation</class>
</td>
<td>
<input type="number" id="MakeImage_Saturation_value1" size="13" min="-2" max="2">
</td>
<td style="font-size: 80%;">
Image Saturation (-2 .. 2 - default = "0") <br>
Remark: camera driver is not fully supporting this setting yet (no impact on image)
</td>
</tr>
<tr class="expert" id="MakeImage_FixedExposure_ex10">
<td class="indent1">
<class id="MakeImage_FixedExposure_text" style="color:black;">FixedExposure</class>
</td>
<td>
<select id="MakeImage_FixedExposure_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Fixes the illumination setting of camera at the startup and uses this later --> individual round is faster
</td>
</tr>
<tr class="expert" id="ex4">
<td colspan="3" style="padding-left: 20px;"><h4>Alignment</h4></td>
</tr>
<tr class="expert" id="ex6">
<td class="indent1">
<class id="Alignment_SearchFieldX_text" style="color:black;">SearchFieldX</class>
</td>
<td>
<input type="number" name="name" id="Alignment_SearchFieldX_value1" size="13" min="1" step="1">
</td>
<td style="font-size: 80%;">
x size (width) in which the reference is searched (default = "20")
</td>
</tr>
<tr class="expert" id="ex8">
<td class="indent1">
<class id="Alignment_SearchFieldY_text" style="color:black;">SearchFieldY</class>
</td>
<td>
<input type="number" name="name" id="Alignment_SearchFieldY_value1" size="13" min="1">
</td>
<td style="font-size: 80%;">
y size (height) in which the reference is searched (default = "20")
</td>
</tr>
<tr class="expert" id="AlignmentAlgo_ex8">
<td class="indent1">
<input type="checkbox" id="Alignment_AlignmentAlgo_enabled" value="1" onclick = 'InvertEnableItem("Alignment", "AlignmentAlgo")' unchecked >
<label for=Alignment_AlignmentAlgo_enabled><class id="Alignment_AlignmentAlgo_text" style="color:black;">AlignmentAlgo</class></label>
</td>
<td>
<select id="Alignment_AlignmentAlgo_value1">
<option value="default" selected>Default</option>
<option value="highAccuracy" >HighAccuracy</option>
<option value="fast" >Fast</option>
</select>
</td>
<td style="font-size: 80%;">
"Default" = use only R-Channel, "HighAccuracy" = use all Channels (RGB, 3x slower), <br> "Fast" (First time RGB, then only check if image is shifted)
</td>
</tr>
<tr id="Category_Digits_ex4">
<td colspan="3" style="padding-left: 20px;">
<h4><input type="checkbox" id="Category_Digits_enabled" value="1" onclick = 'UpdateAfterCategoryCheck()' unchecked >
<label for=Category_Digits_enabled>Digits</h4></label>
</td>
</tr>
<tr>
<td class="indent1">
<class id="Digits_Model_text" style="color:black;">Model</class>
</td>
<td>
<select id="Digits_Model_value1">
</select>
</td>
<td style="font-size: 80%;">
Path to CNN model file for image recognition.<br>
Check the <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/Choosing-the-Model" target="_blank">documentation</a> for details.
</td>
</tr>
<tr class="expert" id="ex91">
<td class="indent1">
<input type="checkbox" id="Digits_CNNGoodThreshold_enabled" value="1" onclick = 'InvertEnableItem("Digits", "CNNGoodThreshold")' unchecked >
<label for=Digits_CNNGoodThreshold_enabled><class id="Digits_CNNGoodThreshold_text" style="color:black;">CNNGoodThreshold</class></label>
</td>
<td>
<input width="40px" type="number" id="Digits_CNNGoodThreshold_value1" min="0" max="1" step="0.1">
</td>
<td style="font-size: 80%;">
EXPERIMENTAL - NOT WORKING FOR ALL CNNs! - Threshold above which the classification should be to accept the value (only for digits meaningfull)
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="Digits_LogImageLocation_enabled" value="1" onclick = 'InvertEnableItem("Digits", "LogImageLocation")' unchecked >
<label for=Digits_LogImageLocation_enabled><class id="Digits_LogImageLocation_text" style="color:black;">LogImageLocation</class></label>
</td>
<td>
<input type="text" name="name" id="Digits_LogImageLocation_value1">
</td>
<td style="font-size: 80%;">
Location to store separated digits for logging
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="Digits_LogfileRetentionInDays_enabled" value="1" onclick = 'InvertEnableItem("Digits", "LogfileRetentionInDays")' unchecked >
<label for=Digits_LogfileRetentionInDays_enabled><class id="Digits_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label>
</td>
<td>
<input type="number" id="Digits_LogfileRetentionInDays_value1" min="0" step="1">
</td>
<td style="font-size: 80%;">
Time to keep the separated digit images (in days, resp. "0" = forever)
</td>
</tr>
<tr id="Category_Analog_ex4">
<td colspan="3" style="padding-left: 20px;">
<h4><input type="checkbox" id="Category_Analog_enabled" value="1" onclick = 'UpdateAfterCategoryCheck()' unchecked >
<label for=Category_Analog_enabled>Analog</h4></label>
</td>
</tr>
<tr>
<td class="indent1">
<class id="Analog_Model_text" style="color:black;">Model</class>
</td>
<td>
<select id="Analog_Model_value1">
</select>
</td>
<td style="font-size: 80%;"> Path to CNN model file for image recognition.<br>
Check the <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/Choosing-the-Model" target="_blank">documentation</a> for details.</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="Analog_LogImageLocation_enabled" value="1" onclick = 'InvertEnableItem("Analog", "LogImageLocation")' unchecked >
<label for=Analog_LogImageLocation_enabled><class id="Analog_LogImageLocation_text" style="color:black;">LogImageLocation</class>
</label>
</td>
<td> <input type="text" name="name" id="Analog_LogImageLocation_value1"> </td>
<td style="font-size: 80%;"> Location to store separated digits for logging </td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="Analog_LogfileRetentionInDays_enabled" value="1" onclick = 'InvertEnableItem("Analog", "LogfileRetentionInDays")' unchecked >
<label for=Analog_LogfileRetentionInDays_enabled><class id="Analog_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class></label></td>
<td> <input type="number" id="Analog_LogfileRetentionInDays_value1" min="0" step="1"> </td>
<td style="font-size: 80%;"> Time to keep the separated digit images (in days, resp. "0" = forever) </td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>PostProcessing</h4></td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_PreValueUse_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "PreValueUse")' unchecked >
<label for=PostProcessing_PreValueUse_enabled><class id="PostProcessing_PreValueUse_text" style="color:black;">PreValueUse</class></label>
</td>
<td>
<select id="PostProcessing_PreValueUse_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable to use the previous read value for consistency checks - also on reboots
</td>
</tr>
<tr class="expert" id="ex11">
<td class="indent1">
<input type="checkbox" id="PostProcessing_PreValueAgeStartup_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "PreValueAgeStartup")' unchecked >
<label for=PostProcessing_PreValueAgeStartup_enabled><class id="PostProcessing_PreValueAgeStartup_text" style="color:black;">PreValueAgeStartup</class></label>
</td>
<td>
<input type="number" id="PostProcessing_PreValueAgeStartup_value1" size="13" min="0">
</td>
<td style="font-size: 80%;">
Time (in minutes), how long a previous read value is valid after reboot (default = 720 min)
</td>
</tr>
<tr class="expert" id="ex12">
<td class="indent1">
<input type="checkbox" id="PostProcessing_ErrorMessage_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "ErrorMessage")' unchecked >
<label for=PostProcessing_ErrorMessage_enabled><class id="PostProcessing_ErrorMessage_text" style="color:black;">ErrorMessage</class></label>
</td>
<td>
<select id="PostProcessing_ErrorMessage_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Do not show error message in return value - in error case, the last valid number will be send out
</td>
</tr>
<tr class="expert" id="ex1dddd">
<td class="indent1">
<input type="checkbox" id="PostProcessing_CheckDigitIncreaseConsistency_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "CheckDigitIncreaseConsistency")' unchecked >
<label for=PostProcessing_CheckDigitIncreaseConsistency_enabled><class id="PostProcessing_CheckDigitIncreaseConsistency_text" style="color:black;">CheckDigitIncreaseConsistency</class></label>
</td>
<td>
<select id="PostProcessing_CheckDigitIncreaseConsistency_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable additional consistency check - especially zero crossing check between digits
</td>
</tr>
<tr>
<td class="indent1" colspan="3">
<br>
<b>Postprocessing Individual Parameters:
<select id="Numbers_value1" onchange="numberChanged()">
<option value="0" selected>default</option>
<option value="1" >NT</option>
<option value="2" >HT</option>
</select></b>
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_AllowNegativeRates_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "AllowNegativeRates")' unchecked >
<label for=PostProcessing_AllowNegativeRates_enabled><class id="PostProcessing_AllowNegativeRates_text" style="color:black;">AllowNegativeRates</class></label>
</td>
<td>
<select id="PostProcessing_AllowNegativeRates_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Set to "false" to ensure, that only positive changes are accepted (typically for counter)
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_DecimalShift_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "DecimalShift")' unchecked >
<label for=PostProcessing_DecimalShift_enabled><class id="PostProcessing_DecimalShift_text" style="color:black;">DecimalShift</class></label>
</td>
<td>
<input type="number" id="PostProcessing_DecimalShift_value1" step="1">
</td>
<td style="font-size: 80%;">
Shift the decimal separator (positiv or negativ).<br>
Eg. to move from 'm&sup3;' to 'l' (Multiply by 1000), you need to set it to +3.
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_AnalogDigitalTransitionStart_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "AnalogDigitalTransitionStart")' unchecked >
<label for=PostProcessing_AnalogDigitalTransitionStart_enabled><class id="PostProcessing_AnalogDigitalTransitionStart_text" style="color:black;">AnalogDigitalTransitionStart</class></label>
</td>
<td>
<input type="number" id="PostProcessing_AnalogDigitalTransitionStart_value1" step="0.1" min="6.0" max="9.9" value="9.2">
</td>
<td style="font-size: 80%;">
If you have false Values, but the recognition is 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. Default=9.2
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_MaxRateValue_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "MaxRateValue")' unchecked >
<label for=PostProcessing_MaxRateValue_enabled><class id="PostProcessing_MaxRateValue_text" style="color:black;">MaxRateValue</class></label>
</td>
<td>
<input type="number" id="PostProcessing_MaxRateValue_value1" size="13" min="0" step="any">
</td>
<td style="font-size: 80%;">
Maximum change of a reading - if treated as absolute or relative change see next parameter.
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_MaxRateType_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "MaxRateType")' unchecked >
<label for=PostProcessing_MaxRateType_enabled><class id="PostProcessing_MaxRateType_text" style="color:black;">MaxRateType</class></label>
</td>
<td>
<select id="PostProcessing_MaxRateType_value1">
<option value="AbsoluteChange" >AbsoluteChange</option>
<option value="RateChange" selected>RateChange</option>
</select>
</td>
<td style="font-size: 80%;">
Defines if the change rate compared to the previous value is calculated as absolute change (AbsoluteChange) or as rate normalized to the interval (RateChange = change/minute).
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="PostProcessing_ExtendedResolution_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "ExtendedResolution")' unchecked >
<label for=PostProcessing_ExtendedResolution_enabled><class id="PostProcessing_ExtendedResolution_text" style="color:black;">ExtendedResolution</class></label>
</td>
<td>
<select id="PostProcessing_ExtendedResolution_value1">
<option value="true" >true</option>
<option value="false" selected>false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable to use the decimal place of the last analog counter
</td>
</tr>
<tr>
<td id="ex121" class="indent1">
<input type="checkbox" id="PostProcessing_IgnoreLeadingNaN_enabled" value="1" onclick = 'InvertEnableItem("PostProcessing", "IgnoreLeadingNaN")' unchecked >
<label for=PostProcessing_IgnoreLeadingNaN_enabled><class id="PostProcessing_IgnoreLeadingNaN_text" style="color:black;">IgnoreLeadingNaN</class></label>
</td>
<td>
<select id="PostProcessing_IgnoreLeadingNaN_value1">
<option value="true" >true</option>
<option value="false" selected>false</option>
</select>
</td>
<td style="font-size: 80%;">
Leading "N"'s will be deleted before further processing
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;">
<h4>
<input type="checkbox" id="Category_MQTT_enabled" value="1" onclick = 'UpdateAfterCategoryCheck()' unchecked >
<label for=Category_MQTT_enabled>MQTT</label>
</h4>
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_Uri_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "Uri")' unchecked >
<label for=MQTT_Uri_enabled><class id="MQTT_Uri_text" style="color:black;">Uri</class></label>
</td>
<td>
<input type="text" id="MQTT_Uri_value1">
</td>
<td style="font-size: 80%;">
URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_MainTopic_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "MainTopic")' unchecked >
<label for=MQTT_MainTopic_enabled><class id="MQTT_MainTopic_text" style="color:black;">MainTopic</class></label>
</td>
<td>
<input type="text" id="MQTT_MainTopic_value1">
</td>
<td style="font-size: 80%;">
MQTT main topic, under which the counters are published. <br>
The single value will be published with the following key: MAINTOPIC/VALUE_NAME/PARAMETER where
<ul>
<li> VALUE_NAME is the name of the value (a meter might have more than one value) as defined during analog and digital ROI configuration (defaults to "main")</li>
<li> and PARAMETERS are: value, rate, timestamp, error</li>
</ul>
The general connection status can be found in MAINTOPIC/CONNECTION
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_ClientID_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "ClientID")' unchecked >
<label for=MQTT_ClientID_enabled><class id="MQTT_ClientID_text" style="color:black;">ClientID</class></label>
</td>
<td>
<input type="text" id="MQTT_ClientID_value1">
</td>
<td style="font-size: 80%;">
ClientID to connect to the MQTT broker
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_user_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "user")' unchecked >
<label for=MQTT_user_enabled><class id="MQTT_user_text" style="color:black;">user</class></label>
</td>
<td>
<input type="text" id="MQTT_user_value1">
</td>
<td style="font-size: 80%;">
User for MQTT authentication
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_password_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "password")' unchecked >
<label for=MQTT_password_enabled><class id="MQTT_password_text" style="color:black;">password</class></label>
</td>
<td>
<input type="text" id="MQTT_password_value1">
</td>
<td style="font-size: 80%;">
Password for MQTT authentication
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_SetRetainFlag_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "SetRetainFlag")' unchecked >
<label for=MQTT_SetRetainFlag_enabled><class id="MQTT_SetRetainFlag_text" style="color:black;">Enable MQTT Retain Flag</class></label>
</td>
<td>
<select id="MQTT_SetRetainFlag_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable or disable the retain flag for all MQTT entries
</td>
</tr>
<tr>
<td class="indent1" colspan="3">
<h4>Homeassistant Discovery (using MQTT)</h4>
<h5>The discovery topics and the static topics (IP, MAC, Hostname, Interval, ...) only get sent on startup.
To send them again, you can call the following URL: <a href=mqtt_publish_discovery target="_blank">http://&lt;IP&gt;/mqtt_publish_discovery</a></h5>
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_HomeassistantDiscovery_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "HomeassistantDiscovery")' unchecked >
<label for=MQTT_HomeassistantDiscovery_enabled><class id="MQTT_HomeassistantDiscovery_text" style="color:black;">Homeassistant Discovery</class></label>
</td>
<td>
<select id="MQTT_HomeassistantDiscovery_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Enable or disable the <a href=https://www.home-assistant.io/docs/mqtt/discovery/ target=_blank>Homeassistant Discovery</a>
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="MQTT_MeterType_enabled" value="1" onclick = 'InvertEnableItem("MQTT", "MeterType")' unchecked >
<label for=MQTT_MeterType_enabled><class id="MQTT_MeterType_text" style="color:black;">Meter Type</class></label>
</td>
<td>
<select id="MQTT_MeterType_value1"> <!-- See https://developers.home-assistant.io/docs/core/entity/sensor/#available-device-classes -->
<option value="other" selected>Other (no Units)</option>
<option value="water_m3">Watermeter (Value: m³, Rate: m³/h)</option>
<option value="water_l">Watermeter (Value: l, Rate: l/h)</option>
<option value="water_gal">Watermeter (Value: gal, Rate: gal/h)</option>
<option value="water_ft3">Watermeter (Value: ft³, Rate: ft³/m)</option>
<option value="gas_m3">Gasmeter (Value: m³, Rate: m³/h)</option>
<option value="gas_ft3">Gasmeter (Value: ft³, Rate: ft³/m)</option>
<option value="energy_wh">Energymeter (Value: Wh, Rate: W)</option>
<option value="energy_kwh">Energymeter (Value: kWh, Rate: kW)</option>
<option value="energy_mwh">Energymeter (Value: MWh, Rate: MW)</option>
</select>
</td>
<td style="font-size: 80%;">
Select the meter type so the sensors have the right units in Homeassistant.<br>
Note: For 'Watermeter' you need to have Homeassistant 2022.11 or never!<br>
Please also make sure that it matches the dimention of the value provided by the meter! Eg. if your meter provides m3, you need to also set it to m3.
Alternatively you could set 'DecimalShift' to '3' so the value is converted to 'l'!
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;">
<h4>
<input type="checkbox" id="Category_InfluxDB_enabled" value="1" onclick = 'UpdateAfterCategoryCheck()' unchecked >
<label for=Category_InfluxDB_enabled>InfluxDB</h4><h5>Only InfluxDB v1.x is supported, v2.x has a changed interface</h5></label>
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="InfluxDB_Uri_enabled" value="1" onclick = 'InvertEnableItem("InfluxDB", "Uri")' unchecked >
<label for=InfluxDB_Uri_enabled><class id="InfluxDB_Uri_text" style="color:black;">Uri</class></label>
</td>
<td>
<input type="text" id="InfluxDB_Uri_value1">
</td>
<td style="font-size: 80%;">
URI of the HTTP interface to InfluxDB, without traililing slash, e.g. http://IP-Address:Port
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="InfluxDB_Database_enabled" value="1" onclick = 'InvertEnableItem("InfluxDB", "Database")' unchecked >
<label for=InfluxDB_Database_enabled><class id="InfluxDB_Database_text" style="color:black;">Database</class></label>
</td>
<td>
<input type="text" id="InfluxDB_Database_value1">
</td>
<td style="font-size: 80%;">
Database name in which to publish the read value.
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="InfluxDB_Measurement_enabled" value="1" onclick = 'InvertEnableItem("InfluxDB", "Measurement")' unchecked >
<label for=InfluxDB_Measurement_enabled><class id="InfluxDB_Measurement_text" style="color:black;">Measurement</class></label>
</td>
<td>
<input type="text" id="InfluxDB_Measurement_value1">
</td>
<td style="font-size: 80%;">
Measurement name to use to publish the read value.
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="InfluxDB_user_enabled" value="1" onclick = 'InvertEnableItem("InfluxDB", "user")' unchecked >
<label for=InfluxDB_user_enabled><class id="InfluxDB_user_text" style="color:black;">user</class></label>
</td>
<td>
<input type="text" id="InfluxDB_user_value1">
</td>
<td style="font-size: 80%;">
User for InfluxDB authentication
</td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="InfluxDB_password_enabled" value="1" onclick = 'InvertEnableItem("InfluxDB", "password")' unchecked >
<label for=InfluxDB_password_enabled><class id="InfluxDB_password_text" style="color:black;">password</class></label>
</td>
<td>
<input type="text" id="InfluxDB_password_value1">
</td>
<td style="font-size: 80%;">
Password for InfluxDB authentication
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;">
<h4><input type="checkbox" id="Category_GPIO_enabled" value="1" onclick='UpdateAfterCategoryCheck()' unchecked >
<label for=Category_GPIO_enabled>GPIO Settings
<span class="GPIO_Item">
<h5>Enabling GPIO handler, disable by default integrated flash light.<br>Please enable it with GPIO4 (internal flash LED) settings or GPIO12 (external LED).</span></label>
</h4>
</td>
</tr>
<!------------- GPIO0 begin ------------------>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO0_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO0")' unchecked>
<label for=GPIO_IO0_enabled><span id="GPIO_IO0_text">GPIO 0 state</span></label>
</td>
<td>
<select id="GPIO_IO0_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
</select>
</td>
<td class="description">
GPIO 0 Usable with restrictions.<br>
<b>Must be disabled when camera is used.</b><br>
<b>Pin is used to activate flash mode and must therefore be HIGH when booting.</b>
</td>
</tr>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent2">
<span id="GPIO_IO0_text" class="GPIO_IO0 GPIO_item">GPIO 0 use interrupt</span>
</td>
<td>
<select id="GPIO_IO0_value2">
<option value="disabled">disabled</option>
<option value="rising-edge">rising edge</option>
<option value="falling-edge">falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 0 enable interrupt trigger
</td>
</tr>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent2">
<span class="GPIO_IO0 GPIO_item">GPIO 0 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO0_value3" min="1" max="20"></td>
<td class="description">
GPIO 0 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent2">
<span class="GPIO_IO0 GPIO_item">GPIO 0 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO0_value4"></td>
<td class="description">
GPIO 0 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent2">
<span class="GPIO_IO0 GPIO_item">GPIO 0 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO0_value5"></td>
<td class="description">
GPIO 0 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO0 GPIO_item">
<td class="indent2">
<span class="GPIO_IO0 GPIO_item">GPIO 0 name</span>
</td>
<td><input type="text" id="GPIO_IO0_value6"></td>
<td class="description">
GPIO 0 MQTT topic name (empty = GPIO0). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<!------------- GPIO0 end ------------------>
<!------------- GPIO1 begin ------------------>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO1_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO1")' unchecked>
<label=GPIO_IO1_enabled><span id="GPIO_IO1_text" class="GPIO_IO1 GPIO_item">GPIO 1 state</span>
</td>
<td>
<select id="GPIO_IO1_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
</select>
</td>
<td class="description">
GPIO 1 <br><span style="color: blue">Used by default for serial communication as TX pin.<br>Required for seriales monitor.</span>
</td>
</tr>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent2">
<span class="GPIO_IO1 GPIO_item" class="expert">GPIO 1 use interrupt</span>
</td>
<td>
<select id="GPIO_IO1_value2">
<option value="disabled">disabled</option>
<option value="rising-edge" disabled>rising edge</option>
<option value="falling-edge" disabled>falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 1 enable interrupt trigger
</td>
</tr>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent2">
<span class="GPIO_IO1 GPIO_item">GPIO 1 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO1_value3" min="1" max="20"></td>
<td class="description">
GPIO 1 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent2">
<span class="GPIO_IO1 GPIO_item">GPIO 1 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO1_value4"></td>
<td class="description">
GPIO 1 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent2">
<span class="GPIO_IO1 GPIO_item">GPIO 1 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO1_value5"></td>
<td class="description">
GPIO 1 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO1 GPIO_item">
<td class="indent2">
<span class="GPIO_IO1 GPIO_item" class="expert">GPIO 1 name</span>
</td>
<td><input type="text" id="GPIO_IO1_value6"></td>
<td class="description">
GPIO 1 MQTT topic name (empty = GPIO1). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<!------------- GPIO1 end ------------------>
<!------------- GPIO3 begin ------------------>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO3_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO3")' unchecked>
<label=GPIO_IO3_enabled><span id="GPIO_IO3_text" class="GPIO_IO3 GPIO_item">GPIO 3 state</span>
</td>
<td>
<select id="GPIO_IO3_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
</select>
</td>
<td class="description">
GPIO 3 <span style="color: blue">Used by default for serial communication as RX pin.</span>
</td>
</tr>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent2">
<span class="GPIO_IO3 GPIO_item">GPIO 3 use interrupt</span>
</td>
<td>
<select id="GPIO_IO3_value2">
<option value="disabled">disabled</option>
<option value="rising-edge" disabled>rising edge</option>
<option value="falling-edge" disabled>falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 3 Used by default for serial communication as RX pin.
</td>
</tr>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent2">
<span class="GPIO_IO3 GPIO_item">GPIO 3 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO3_value3" min="1" max="20"></td>
<td class="description">
GPIO 3 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent2">
<span class="GPIO_IO3 GPIO_item">GPIO 3 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO3_value4"></td>
<td class="description">
GPIO 3 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent2">
<span class="GPIO_IO3 GPIO_item">GPIO 3 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO3_value5"></td>
<td class="description">
GPIO 3 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO3 GPIO_item">
<td class="indent2">
<span class="GPIO_IO3 GPIO_item">GPIO 3 name</span>
</td>
<td><input type="text" id="GPIO_IO3_value6"></td>
<td class="description">
GPIO 3 MQTT topic name (empty = GPIO3). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<!------------- GPIO3 end ------------------>
<!------------- GPIO4 begin ------------------>
<tr class="GPIO_IO4 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO4_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO4")' unchecked>
<label for=GPIO_IO4_enabled><span id="GPIO_IO4_text" class="GPIO_IO4 GPIO_item">GPIO 4 state</span></label>
</td>
<td>
<select id="GPIO_IO4_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
<option value="built-in-led">built-in led flash light</option>
</select>
</td>
<td class="description">
GPIO 4 Usable with restrictions.<br>
<b>Pin is used for build-in flash light.</b>
</td>
</tr>
<tr class="expert" class="GPIO_IO4 GPIO_item">
<td class="indent2">
<span class="GPIO_IO4 GPIO_item">GPIO 4 use interrupt</span>
</td>
<td>
<select id="GPIO_IO4_value2">
<option value="disabled">disabled</option>
<option value="rising-edge">rising edge</option>
<option value="falling-edge">falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 4 enable interrupt trigger
</td>
</tr>
<tr class="expert" class="GPIO_IO4 GPIO_item">
<td class="indent2">
<span class="GPIO_IO4 GPIO_item">GPIO 4 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO4_value3" min="1" max="20"></td>
<td class="description">
GPIO 4 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO4 GPIO_item">
<td class="indent2">
<span class="GPIO_IO4 GPIO_item">GPIO 4 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO4_value4"></td>
<td class="description">
GPIO 4 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO4 GPIO_item">
<td class="indent2">
<span class="GPIO_IO4 GPIO_item">GPIO 4 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO4_value5"></td>
<td class="description">
GPIO 4 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO4 GPIO_item">
<td class="indent2">
<span class="GPIO_IO4 GPIO_item">GPIO 4 name</span>
</td>
<td><input type="text" id="GPIO_IO4_value6"></td>
<td class="description">
GPIO 4 MQTT topic name (empty = GPIO4). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<!------------- GPIO4 end ------------------>
<!------------- GPIO12 begin ------------------>
<tr class="GPIO_IO12 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO12_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO12")' unchecked>
<label for=GPIO_IO12_enabled><span class="GPIO_IO12 GPIO_item" id="GPIO_IO12_text">GPIO 12 state</span></label>
</td>
<td>
<select id="GPIO_IO12_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
<option value="external-flash-ws281x">external flash light ws281x controlled</option>
</select>
</td>
<td class="description">
GPIO 12 is usable without restrictions
</td>
</tr>
<tr class="expert" class="GPIO_IO12 GPIO_item">
<td class="indent2">
<span class="GPIO_IO12 GPIO_item">GPIO 12 use interrupt</span>
</td>
<td>
<select class="GPIO_IO12 GPIO_item" id="GPIO_IO12_value2">
<option value="disabled">disabled</option>
<option value="rising-edge">rising edge</option>
<option value="falling-edge">falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 12 enable interrupt trigger
</td>
</tr>
<tr class="expert" class="GPIO_IO12 GPIO_item">
<td class="indent2">
<span class="GPIO_IO12 GPIO_item">GPIO 12 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO12_value3" min="1" max="20"></td>
<td class="description">
GPIO 12 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO12 GPIO_item">
<td class="indent2">
<span class="GPIO_IO12 GPIO_item">GPIO 12 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO12_value4"></td>
<td class="description">
GPIO 12 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO12 GPIO_item">
<td class="indent2">
<span class="GPIO_IO12 GPIO_item">GPIO 12 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO12_value5"></td>
<td class="description">
GPIO 12 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO12 GPIO_item">
<td class="indent2">
<span class="GPIO_IO12 GPIO_item">GPIO 12 name</span>
</td>
<td><input type="text" id="GPIO_IO12_value6"></td>
<td class="description">
GPIO 12 MQTT topic name (empty = GPIO12). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<tr class="GPIO_IO12 GPIO_item" id="wstypeex3">
<td class="indent1">
<span class="GPIO_IO12 GPIO_item" id="GPIO_LEDType_text">LED-Type</span>
</td>
<td class="GPIO_IO12 GPIO_item">
<select class="GPIO_IO12 GPIO_item" id="GPIO_LEDType_value1">
<option value="WS2812" selected>WS2812</option>
<option value="WS2812B">WS2812B</option>
<option value="SK6812">SK6812 (not tested)</option>
<option value="WS2813">WS2813 (not tested)</option>
</select>
</td>
<td class="description">
Type of WS2812x, that is connected to GPIO12
</td>
</tr>
<tr class="GPIO_IO12 GPIO_item" id="LEDANZex8" >
<td class="indent1">
<span class="GPIO_IO12 GPIO_item" id="GPIO_LEDNumbers_text">Numbers of LEDs</span>
</td>
<td>
<input type="number" name="name" id="GPIO_LEDNumbers_value1" size="13" min="1">
</td>
<td style="font-size: 80%;">
Number of LEDs on the external LED-stripe
</td>
</tr>
<tr class="GPIO_IO12 GPIO_item" id="LEDRGBex9">
<td class="indent1">
<span class="GPIO_IO12 GPIO_item" id="GPIO_LEDColor_text">LED Color</span>
</td>
<td class="GPIO_IO12 GPIO_item">
R <input class="smallSelect" class="GPIO_IO12 GPIO_item" id="GPIO_LEDColor_value1" size="12">
G <input class="smallSelect" class="GPIO_IO12 GPIO_item" id="GPIO_LEDColor_value2" size="12">
B <input class="smallSelect" class="GPIO_IO12 GPIO_item" id="GPIO_LEDColor_value3" size="12">
</td>
<td style="font-size: 80%;">
Color of LEDs in (R)ed, (G)reen (B)lue from 0...255
</td>
</tr>
<!------------- GPIO12 end ------------------>
<!------------- GPIO13 begin ------------------>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent1">
<input type="checkbox" id="GPIO_IO13_enabled" value="1" onclick = 'InvertEnableItem("GPIO", "IO13")' unchecked>
<label=GPIO_IO13_enabled><span id="GPIO_IO13_text">GPIO 13 state</span>
</td>
<td>
<select id="GPIO_IO13_value1">
<option value="input">input</option>
<option value="input-pullup">input pullup</option>
<option value="input-pulldown">input pulldown</option>
<option value="output">output</option>
</select>
</td>
<td class="description">
GPIO 13 is usable without restrictions
</td>
</tr>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent2">
<span class="GPIO_IO13 GPIO_item">GPIO 13 use interrupt</span>
</td>
<td>
<select id="GPIO_IO13_value2">
<option value="disabled">disabled</option>
<option value="rising-edge" disabled>rising edge</option>
<option value="falling-edge" disabled>falling edge</option>
<option value="rising-and-falling">rising and falling</option>
<option value="low-level-trigger">low level trigger</option>
<option value="high-level-trigger">high level trigger</option>
</select>
</td>
<td class="description">
GPIO 13 enable interrupt trigger
</td>
</tr>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent2">
<span class="GPIO_IO13 GPIO_item">GPIO 13 PWM duty resolution</span>
</td>
<td><input type="number" id="GPIO_IO13_value3" min="1" max="20"></td>
<td class="description">
GPIO 13 LEDC PWM duty resolution in bit
</td>
</tr>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent2">
<span class="GPIO_IO13 GPIO_item">GPIO 13 enable MQTT</span>
</td>
<td><input type="checkbox" id="GPIO_IO13_value4"></td>
<td class="description">
GPIO 13 enable MQTT publishing/subscribing
</td>
</tr>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent2">
<span class="GPIO_IO13 GPIO_item">GPIO 13 enable HTTP</span>
</td>
<td><input type="checkbox" id="GPIO_IO13_value5"></td>
<td class="description">
GPIO 13 enable HTTP write/read
</td>
</tr>
<tr class="expert" class="GPIO_IO13 GPIO_item">
<td class="indent2">
<span class="GPIO_IO13 GPIO_item">GPIO 13 name</span>
</td>
<td><input type="text" id="GPIO_IO13_value6"></td>
<td class="description">
GPIO 13 MQTT topic name (empty = GPIO13). Allowed characters (a-z, A-Z, 0-9, _, -)
</td>
</tr>
<!------------- GPIO13 end ------------------>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>AutoTimer</h4></td>
</tr>
<tr class="expert" id="ex13">
<td class="indent1">
<class id="AutoTimer_AutoStart_text" style="color:black;">AutoStart</class>
</td>
<td>
<select id="AutoTimer_AutoStart_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td style="font-size: 80%;">
Start the image recognition immediatly after power up. false is basically for debugging.
</td>
</tr>
<tr>
<td class="indent1">
<class id="AutoTimer_Intervall_text" style="color:black;">Interval</class>
</td>
<td>
<input type="number" id="AutoTimer_Intervall_value1" size="13" min="3" step="any">
</td>
<td style="font-size: 80%;">
Interval in which the number(s) are read (in minutes). If a digitalization round takes longer than this interval, the next run gets postponed until the current run completes.
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>DataLogging</h4></td>
</tr>
<tr>
<td class="indent1">
<class id="DataLogging_DataLogActive_text" style="color:black;">DataLogActive</class>
</td>
<td>
<select id="DataLogging_DataLogActive_value1">
<option value="true" selected>true</option>
<option value="false" >false</option>
</select>
</td>
<td class="description">
Activate data log to SD card
</td>
</tr>
<tr>
<td class="indent1">
<class id="DataLogging_DataLogRetentionInDays_text" style="color:black;">DataLogRetentionInDays</class>
</td>
<td>
<input type="number" id="DataLogging_DataLogRetentionInDays_value1" size="13" min="0" step="1">
</td>
<td class="description">
Time to keep the data files (in days - "0" = forever)
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>Debug</h4></td>
</tr>
<tr>
<td class="indent1">
<class id="Debug_Logfile_text" style="color:black;">Logfile Log Level</class>
</td>
<td>
<select id="Debug_Logfile_value1">
<option value="1" selected>ERROR</option> <!-- matches esp_log_level_t -->
<option value="2">WARNING</option>
<option value="3">INFO</option>
<option value="4">DEBUG</option>
</select>
</td>
<td class="description">
Set the level of the logging to the SD-Card.<br><b>Warning:</b> DEBUG or INFO might damage the SD-Card if enabled longterm due to excessive writes to the SD-Card!
</td>
</tr>
<tr>
<td class="indent1">
<class id="Debug_LogfileRetentionInDays_text" style="color:black;">LogfileRetentionInDays</class>
</td>
<td>
<input type="number" id="Debug_LogfileRetentionInDays_value1" size="13" min="0" step="1">
</td>
<td class="description">
Time to keep the log files (in days - "0" = forever)
</td>
</tr>
<tr>
<td colspan="3" style="padding-left: 20px;"><h4>System</h4></td>
</tr>
<tr>
<td class="indent1">
<input type="checkbox" id="System_TimeZone_enabled" value="1" onclick = 'InvertEnableItem("System", "TimeZone")' unchecked >
<label for=System_TimeZone_enabled><class id="System_TimeZone_text" style="color:black;">TimeZone</class></label>
</td>
<td>
<input type="text" id="System_TimeZone_value1">
</td>
<td class="description">
Time zone in POSIX syntax (Europe/Berlin = "CET-1CEST,M3.5.0,M10.5.0/3" - incl. daylight saving)<br>
Use this <a href=timezones.html?v=$COMMIT_HASH target=_blank>table</a> to find the settings for your region.
</td>
</tr>
<tr class="expert" id="ex16">
<td class="indent1">
<input type="checkbox" id="System_TimeServer_enabled" value="1" onclick = 'InvertEnableItem("System", "TimeServer")' unchecked >
<label for=System_TimeServer_enabled><class id="System_TimeServer_text" style="color:black;">TimeServer</class></label>
</td>
<td>
<input type="text" id="System_TimeServer_value1">
</td>
<td class="description">
Time server to synchronize system time. If it is disabled or "undefined", "pool.ntp.org" will be used.<br>
You can also set it to the IP of your router. Many routers like
<a href=https://en.avm.de/service/knowledge-base/dok/FRITZ-Box-7590-AX/336_Configuring-time-synchronization-NTP-for-FRITZ-Box-and-network-devices/
target=_blank>Fritzboxes</a> can act as a local NTP server.<br>
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!
</td>
</tr>
<tr class="expert" id="System_Hostname">
<td class="indent1">
<input type="checkbox" id="System_Hostname_enabled" value="1" onclick = 'InvertEnableItem("System", "Hostname")' unchecked >
<label for=System_Hostname_enabled><class id="System_Hostname_text" style="color:black;">Hostname</class></label>
</td>
<td>
<input type="text" id="System_Hostname_value1">
<td class="description">
Hostname for server - will be transfered to wlan.ini at next startup)
</td>
</tr>
<tr class="expert" id="System_RSSIThreashold">
<td class="indent1">
<input type="checkbox" id="System_RSSIThreashold_enabled" value="1" onclick = 'InvertEnableItem("System", "RSSIThreashold")' unchecked >
<label for=System_RSSIThreashold_enabled><class id="System_RSSIThreashold_text" style="color:black;">RSSIThreashold</class></label>
</td>
<td>
<input type="number" name="name" id="System_RSSIThreashold_value1" min="-100" max="0" step="1">
<td class="description">
WLAN Mesh Parameter: Threashold for RSSI value to check for start switching access point in a mesh system.
Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup)
</td>
</tr>
</table>
<p>
<button class="button" onclick="saveTextAsFile()">Save</button>
</p>
<p>
</p>
<div id="doreboot">
<p>
<button class="button" id="Edit_Config_Direct" onclick="editConfigDirect()" style="display:none">Edit Config file directly</button>
<button class="button" id="reboot" type="button" onclick="doReboot()">Reboot to activate changes</button>
</p>
</div>
</div>
<script type="text/javascript" src="common.js?v=$COMMIT_HASH"></script>
<script type="text/javascript" src="readconfigcommon.js?v=$COMMIT_HASH"></script>
<script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>
<script type="text/javascript">
var canvas = document.getElementById('canvas'),
domainname = getDomainname();
param;
category;
NUNBERSAkt = -1;
NUMBERS;
function LoadConfigNeu() {
var isInitialSetup = getParameterByName('InitialSetup');
if (isInitialSetup === 'true')
{
document.getElementById("reboot").style.display = "none";
}
domainname = getDomainname();
if (!loadConfig(domainname)) {
firework.launch('Configuration could not be loaded! Please reload the page!', 'danger', 30000);
return;
}
ParseConfig();
param = getConfigParameters();
category = getConfigCategory();
InitIndivParameter();
UpdateInput();
UpdateInputIndividual();
UpdateExpertModus();
document.getElementById("divall").style.display = '';
}
function InitIndivParameter()
{
NUMBERS = getNUMBERInfo();
var _index = document.getElementById("Numbers_value1");
while (_index.length)
_index.remove(0);
for (var i = 0; i < NUMBERS.length; ++i){
var option = document.createElement("option");
option.text = NUMBERS[i]["name"];
option.value = i;
_index.add(option);
}
_index.selectedIndex = 0;
}
function getParameterByName(name, url = window.location.href) {
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
function WriteParameter(_param, _category, _cat, _name, _optional, _number = -1){
let anzpara = _param[_cat][_name].anzParam;
if (_number > -1) {
if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) || (NUMBERS[_number][_cat][_name] == undefined))
return;
if (_optional) {
document.getElementById(_cat+"_"+_name+"_enabled").checked = NUMBERS[_number][_cat][_name]["enabled"];
for (var j = 1; j <= anzpara; ++j) {
document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !NUMBERS[_number][_cat][_name]["enabled"];
}
}
document.getElementById(_cat+"_"+_name+"_text").style="color:black;"
setEnabled(_cat+"_"+_name, true);
for (var j = 1; j <= anzpara; ++j) {
let element = document.getElementById(_cat+"_"+_name+"_value"+j);
if (element.tagName.toLowerCase() == "select") {
var textToFind = NUMBERS[_number][_cat][_name]["value"+j];
if (textToFind == undefined)
continue;
_isFound = false;
element.selectedIndex = -1;
for (var i = 0; i < element.options.length; i++) {
if (element.options[i].value.toLowerCase() === textToFind.toLowerCase()) {
element.selectedIndex = i;
_isFound = true;
break;
}
}
if (!_isFound)
{
_zw_txt = "In the selected field the value '" + textToFind + "' in the parameter '";
_zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!";
firework.launch(_zw_txt, 'warning', 10000);
}
}
else if ((element.getAttribute("type") != null) && (element.getAttribute("type").toLowerCase() == "checkbox")) {
element.checked = NUMBERS[_number][_cat][_name]["value"+j] == "true";
}
else {
element.value = NUMBERS[_number][_cat][_name]["value"+j];
}
}
}
else {
if (_optional) {
document.getElementById(_cat+"_"+_name+"_enabled").checked = _param[_cat][_name]["enabled"];
for (var j = 1; j <= anzpara; ++j) {
document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_param[_cat][_name]["enabled"];
}
}
document.getElementById(_cat+"_"+_name+"_text").style="color:black;"
setEnabled(_cat+"_"+_name, true);
for (var j = 1; j <= anzpara; ++j) {
let element = document.getElementById(_cat+"_"+_name+"_value"+j);
if (element.tagName.toLowerCase() == "select") {
var textToFind = _param[_cat][_name]["value"+j];
if (textToFind == undefined)
continue;
_isFound = false;
element.selectedIndex = -1;
for (var i = 0; i < element.options.length; i++) {
if (element.options[i].value.toLowerCase() === textToFind.toLowerCase()) {
element.selectedIndex = i;
_isFound = true;
break;
}
}
if (!_isFound)
{
_zw_txt = "In the selected field the value '" + textToFind + "' in the section '";
_zw_txt = _zw_txt + _cat + "' in the field '" + _name + "' is invalid. PLEASE CHECK BEFORE SAVING!";
firework.launch(_zw_txt, 'warning', 10000);
}
}
else if ((element.getAttribute("type") != null) && (element.getAttribute("type").toLowerCase() == "checkbox")) {
element.checked = _param[_cat][_name]["value"+j] == "true";
}
else {
element.value = _param[_cat][_name]["value"+j];
}
}
}
///////////////// am Ende, falls Kategorie als gesamtes nicht ausgewählt --> deaktivieren
if (_category[_cat]["enabled"] == false)
{
if (_optional) {
document.getElementById(_cat+"_"+_name+"_enabled").disabled = true;
for (var j = 1; j <= anzpara; ++j) {
document.getElementById(_cat+"_"+_name+"_value"+j).disabled = true;
}
}
document.getElementById(_cat+"_"+_name+"_text").style="color: gray;"
setEnabled(_cat+"_"+_name, false);
}
EnDisableItem(_category[_cat]["enabled"], _param, _category, _cat, _name, _optional, _number);
}
function InvertEnableItem(_cat, _param)
{
_zw = _cat + "_" + _param + "_enabled";
_isOn = document.getElementById(_zw).checked;
_color = "color:lightgrey;";
if (_isOn) {
_color = "color:black;";
}
_zw = _cat + "_" + _param + "_text";
document.getElementById(_zw).disabled = !_isOn;
document.getElementById(_zw).style = _color;
setEnabled(_cat + "_" + _param, _isOn);
for (var j = 1; j <= param[_cat][_param]["anzParam"]; ++j) {
document.getElementById(_cat+"_"+_param+"_value"+j).disabled = !_isOn;
document.getElementById(_cat+"_"+_param+"_value"+j).style=_color;
}
}
function setEnabled(className, enabled) {
_color = "color:lightgrey;";
if (enabled) {
_color = "color:black;";
}
let elements = document.getElementsByClassName(className);
for (i = 0; i < elements.length; i++) {
if (enabled) {
elements[i].classList.remove("disabled");
} else {
elements[i].classList.add("disabled");
}
let inputs = elements[i].getElementsByTagName("input");
for (j = 0; j < inputs.length; j++) {
if (inputs[j].id.endsWith("_enabled"))
continue;
inputs[j].style = _color
if (enabled) {
inputs[j].removeAttribute("disabled");
} else {
inputs[j].setAttribute("disabled", "disabled");
}
}
}
}
function setVisible(className, visible) {
let elements = document.getElementsByClassName(className);
for (i = 0; i < elements.length; i++) {
if (visible) {
elements[i].classList.remove("hidden");
} else {
elements[i].classList.add("hidden");
}
}
}
function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _number = -1)
{
_status = _category[_cat]["enabled"];
_color = "color:lightgrey;";
if (_status) {
_color = "color:black;";
}
if (_optional) {
document.getElementById(_cat+"_"+_name+"_enabled").disabled = !_status;
document.getElementById(_cat+"_"+_name+"_enabled").style=_color;
}
if (_number == -1){
if (!_param[_cat][_name]["enabled"]) {
_status = false;
_color = "color:lightgrey;";
}
}
else
if (!NUMBERS[_number][_cat][_name]["enabled"]) {
_status = false;
_color = "color:lightgrey;";
}
document.getElementById(_cat+"_"+_name+"_text").disabled = !_status;
document.getElementById(_cat+"_"+_name+"_text").style = _color;
setEnabled(_cat+"_"+_name, _status);
for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_status;
document.getElementById(_cat+"_"+_name+"_value"+j).style=_color;
}
}
function ReadParameter(_param, _cat, _name, _optional, _number = -1){
if (_number > -1) {
if (_cat == "Digits")
_cat = "digit";
if (_cat == "Analog")
_cat = "analog";
if ((NUMBERS[_number] == undefined) || (NUMBERS[_number][_cat] == undefined) || (NUMBERS[_number][_cat][_name] == undefined))
return;
if (_optional) {
NUMBERS[_number][_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;
}
for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
let element = document.getElementById(_cat+"_"+_name+"_value"+j);
if (element.tagName.toLowerCase() == "select") {
NUMBERS[_number][_cat][_name]["value"+j] = element.selectedIndex > -1 ? element.options[element.selectedIndex].value : "";
}
else if ((element.getAttribute("type") != null) && (element.getAttribute("type").toLowerCase() == "checkbox")) {
NUMBERS[_number][_cat][_name]["value"+j] = element.checked;
}
else {
if ((NUMBERS[_number][_cat][_name].checkRegExList != null) && (NUMBERS[_number][_cat][_name].checkRegExList[j-1] != null)) {
if (!element.value.match(NUMBERS[_cat][_name].checkRegExList[j-1])) {
element.classList.add("invalid-input");
} else {
element.classList.remove("invalid-input");
}
}
NUMBERS[_number][_cat][_name]["value"+j] = element.value;
}
}
}
else
{
if (_optional) {
_param[_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;
}
for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
let element = document.getElementById(_cat+"_"+_name+"_value"+j);
if (element.tagName.toLowerCase() == "select") {
_param[_cat][_name]["value"+j] = element.selectedIndex > -1 ? element.options[element.selectedIndex].value : "";
}
else if ((element.getAttribute("type") != null) && (element.getAttribute("type").toLowerCase() == "checkbox")) {
_param[_cat][_name]["value"+j] = element.checked;
}
else {
if ((_param[_cat][_name].checkRegExList != null) && (_param[_cat][_name].checkRegExList[j-1] != null)) {
if (!element.value.match(_param[_cat][_name].checkRegExList[j-1])) {
element.classList.add("invalid-input");
} else {
element.classList.remove("invalid-input");
}
}
_param[_cat][_name]["value"+j] = element.value;
}
}
}
}
function UpdateInputIndividual()
{
if (NUNBERSAkt != -1)
{
ReadParameter(param, "PostProcessing", "DecimalShift", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "MaxRateValue", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "MaxRateType", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "ExtendedResolution", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt)
ReadParameter(param, "PostProcessing", "AllowNegativeRates", true, NUNBERSAkt)
}
var sel = document.getElementById("Numbers_value1");
NUNBERSAkt = sel.selectedIndex;
WriteParameter(param, category, "PostProcessing", "DecimalShift", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "AnalogDigitalTransitionStart", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "MaxRateValue", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "MaxRateType", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "ExtendedResolution", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "IgnoreLeadingNaN", true, NUNBERSAkt);
WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true, NUNBERSAkt);
}
function UpdateInput() {
document.getElementById("Category_Analog_enabled").checked = category["Analog"]["enabled"];
document.getElementById("Category_Digits_enabled").checked = category["Digits"]["enabled"];
document.getElementById("Category_MQTT_enabled").checked = category["MQTT"]["enabled"];
document.getElementById("Category_GPIO_enabled").checked = category["GPIO"]["enabled"];
document.getElementById("Category_InfluxDB_enabled").checked = category["InfluxDB"]["enabled"];
setVisible("GPIO_item", category["GPIO"]["enabled"]);
WriteParameter(param, category, "MakeImage", "LogImageLocation", true);
WriteParameter(param, category, "MakeImage", "LogfileRetentionInDays", true);
WriteParameter(param, category, "MakeImage", "Demo", true);
WriteParameter(param, category, "MakeImage", "WaitBeforeTakingPicture", false);
WriteParameter(param, category, "MakeImage", "ImageQuality", false);
WriteParameter(param, category, "MakeImage", "Brightness", false);
WriteParameter(param, category, "MakeImage", "Contrast", false);
WriteParameter(param, category, "MakeImage", "Saturation", false);
WriteParameter(param, category, "MakeImage", "LEDIntensity", false);
WriteParameter(param, category, "MakeImage", "ImageSize", false);
WriteParameter(param, category, "MakeImage", "FixedExposure", false);
WriteParameter(param, category, "Alignment", "SearchFieldX", false);
WriteParameter(param, category, "Alignment", "SearchFieldY", false);
WriteParameter(param, category, "Alignment", "AlignmentAlgo", true);
WriteParameter(param, category, "Digits", "CNNGoodThreshold", true);
WriteParameter(param, category, "Digits", "LogImageLocation", true);
WriteParameter(param, category, "Digits", "LogfileRetentionInDays", true);
WriteParameter(param, category, "Analog", "LogImageLocation", true);
WriteParameter(param, category, "Analog", "LogfileRetentionInDays", true);
WriteParameter(param, category, "PostProcessing", "PreValueUse", true);
WriteParameter(param, category, "PostProcessing", "PreValueAgeStartup", true);
// WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true);
WriteParameter(param, category, "PostProcessing", "ErrorMessage", true);
WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", true);
WriteParameter(param, category, "MQTT", "Uri", true);
WriteParameter(param, category, "MQTT", "MainTopic", true);
WriteParameter(param, category, "MQTT", "ClientID", true);
WriteParameter(param, category, "MQTT", "user", true);
WriteParameter(param, category, "MQTT", "password", true);
WriteParameter(param, category, "MQTT", "SetRetainFlag", true);
WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", true);
WriteParameter(param, category, "MQTT", "MeterType", true);
WriteParameter(param, category, "InfluxDB", "Uri", true);
WriteParameter(param, category, "InfluxDB", "Database", true);
WriteParameter(param, category, "InfluxDB", "Measurement", true);
WriteParameter(param, category, "InfluxDB", "user", true);
WriteParameter(param, category, "InfluxDB", "password", true);
WriteParameter(param, category, "GPIO", "IO0", true);
WriteParameter(param, category, "GPIO", "IO1", true);
WriteParameter(param, category, "GPIO", "IO3", true);
WriteParameter(param, category, "GPIO", "IO4", true);
WriteParameter(param, category, "GPIO", "IO12", true);
WriteParameter(param, category, "GPIO", "IO13", true);
WriteParameter(param, category, "GPIO", "LEDType", false);
WriteParameter(param, category, "GPIO", "LEDNumbers", false);
WriteParameter(param, category, "GPIO", "LEDColor", false);
WriteParameter(param, category, "AutoTimer", "AutoStart", false);
WriteParameter(param, category, "AutoTimer", "Intervall", false);
WriteParameter(param, category, "DataLogging", "DataLogActive", false);
WriteParameter(param, category, "DataLogging", "DataLogRetentionInDays", false);
WriteParameter(param, category, "Debug", "Logfile", false);
WriteParameter(param, category, "Debug", "LogfileRetentionInDays", false);
WriteParameter(param, category, "System", "TimeZone", true);
WriteParameter(param, category, "System", "Hostname", true);
WriteParameter(param, category, "System", "TimeServer", true);
WriteParameter(param, category, "System", "RSSIThreashold", true);
WriteModelFiles();
}
function WriteModelFiles()
{
list_tflite = getTFLITEList();
var _indexDig = document.getElementById("Digits_Model_value1");
var _indexAna = document.getElementById("Analog_Model_value1");
while (_indexDig.length)
_indexDig.remove(0);
while (_indexAna.length)
_indexAna.remove(0);
for (var i = 0; i < list_tflite.length; ++i){
var optionDig = document.createElement("option");
var optionAna = document.createElement("option");
var text = list_tflite[i].replace("/config/", "");
if (list_tflite[i].includes("/dig")) { // Its a digital file, only show in the digital list box
optionDig.text = text;
optionDig.value = list_tflite[i];
_indexDig.add(optionDig);
}
else if (list_tflite[i].includes("/ana")) { // Its a digital file, only show in the analog list box
optionAna.text = text;
optionAna.value = list_tflite[i];
_indexAna.add(optionAna);
}
else { // all other files, show in both list boxes
optionDig.text = text;
optionDig.value = list_tflite[i];
_indexDig.add(optionDig);
optionAna.text = text;
optionAna.value = list_tflite[i];
_indexAna.add(optionAna);
}
}
WriteParameter(param, category, "Analog", "Model", false);
WriteParameter(param, category, "Digits", "Model", false);
}
function ReadParameterAll()
{
category["Analog"]["enabled"] = document.getElementById("Category_Analog_enabled").checked;
category["Digits"]["enabled"] = document.getElementById("Category_Digits_enabled").checked;
category["MQTT"]["enabled"] = document.getElementById("Category_MQTT_enabled").checked;
category["InfluxDB"]["enabled"] = document.getElementById("Category_InfluxDB_enabled").checked;
category["GPIO"]["enabled"] = document.getElementById("Category_GPIO_enabled").checked;
ReadParameter(param, "MakeImage", "LogImageLocation", true);
ReadParameter(param, "MakeImage", "LogfileRetentionInDays", true);
ReadParameter(param, "MakeImage", "Demo", true);
ReadParameter(param, "MakeImage", "WaitBeforeTakingPicture", false);
ReadParameter(param, "MakeImage", "ImageQuality", false);
ReadParameter(param, "MakeImage", "Brightness", false);
ReadParameter(param, "MakeImage", "Contrast", false);
ReadParameter(param, "MakeImage", "Saturation", false);
ReadParameter(param, "MakeImage", "LEDIntensity", false);
ReadParameter(param, "MakeImage", "ImageSize", false);
ReadParameter(param, "MakeImage", "FixedExposure", false);
ReadParameter(param, "Alignment", "SearchFieldX", false);
ReadParameter(param, "Alignment", "SearchFieldY", false);
ReadParameter(param, "Alignment", "AlignmentAlgo", true);
ReadParameter(param, "Digits", "Model", false);
ReadParameter(param, "Digits", "CNNGoodThreshold", true);
ReadParameter(param, "Digits", "LogImageLocation", true);
ReadParameter(param, "Digits", "LogfileRetentionInDays", true);
ReadParameter(param, "Analog", "Model", false);
ReadParameter(param, "Analog", "LogImageLocation", true);
ReadParameter(param, "Analog", "LogfileRetentionInDays", true);
ReadParameter(param, "PostProcessing", "PreValueUse", true);
ReadParameter(param, "PostProcessing", "PreValueAgeStartup", true);
// ReadParameter(param, "PostProcessing", "AllowNegativeRates", true);
ReadParameter(param, "PostProcessing", "ErrorMessage", true);
ReadParameter(param, "PostProcessing", "CheckDigitIncreaseConsistency", true);
ReadParameter(param, "MQTT", "Uri", true);
ReadParameter(param, "MQTT", "MainTopic", true);
ReadParameter(param, "MQTT", "ClientID", true);
ReadParameter(param, "MQTT", "user", true);
ReadParameter(param, "MQTT", "password", true);
ReadParameter(param, "MQTT", "SetRetainFlag", true);
ReadParameter(param, "MQTT", "HomeassistantDiscovery", true);
ReadParameter(param, "MQTT", "MeterType", true);
ReadParameter(param, "InfluxDB", "Uri", true);
ReadParameter(param, "InfluxDB", "Database", true);
ReadParameter(param, "InfluxDB", "Measurement", true);
ReadParameter(param, "InfluxDB", "user", true);
ReadParameter(param, "InfluxDB", "password", true);
ReadParameter(param, "GPIO", "IO0", true);
ReadParameter(param, "GPIO", "IO1", true);
ReadParameter(param, "GPIO", "IO3", true);
ReadParameter(param, "GPIO", "IO4", true);
ReadParameter(param, "GPIO", "IO12", true);
ReadParameter(param, "GPIO", "IO13", true);
ReadParameter(param, "GPIO", "LEDType", false);
ReadParameter(param, "GPIO", "LEDNumbers", false);
ReadParameter(param, "GPIO", "LEDColor", false);
// Folgende Zeilen sind für Abwärtskompatibität < v9.0.0 notwendig (manchmal parameter auskommentiert)
param["GPIO"]["LEDType"]["enabled"] = true;
param["GPIO"]["LEDNumbers"]["enabled"] = true;
param["GPIO"]["LEDColor"]["enabled"] = true;
param["GPIO"]["LEDType"]["found"] = true;
param["GPIO"]["LEDNumbers"]["found"] = true;
param["GPIO"]["LEDColor"]["found"] = true;
ReadParameter(param, "AutoTimer", "AutoStart", false);
ReadParameter(param, "AutoTimer", "Intervall", false);
ReadParameter(param, "DataLogging", "DataLogActive", false);
ReadParameter(param, "DataLogging", "DataLogRetentionInDays", false);
ReadParameter(param, "Debug", "Logfile", false);
ReadParameter(param, "Debug", "LogfileRetentionInDays", false);
ReadParameter(param, "System", "TimeZone", true);
ReadParameter(param, "System", "Hostname", true);
ReadParameter(param, "System", "TimeServer", true);
ReadParameter(param, "System", "RSSIThreashold", true);
UpdateInputIndividual();
// FormatDecimalValue(param, "PostProcessing", "MaxRateValue");
}
function FormatDecimalValue(_param, _cat, _name) {
for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
var _val = _param[_cat][_name]["value"+j];
_val = _val.replace(",", ".");
_param[_cat][_name]["value"+j] = _val;
}
}
function UpdateAfterCategoryCheck() {
ReadParameterAll();
category["Analog"]["enabled"] = document.getElementById("Category_Analog_enabled").checked;
category["Digits"]["enabled"] = document.getElementById("Category_Digits_enabled").checked;
category["MQTT"]["enabled"] = document.getElementById("Category_MQTT_enabled").checked;
category["InfluxDB"]["enabled"] = document.getElementById("Category_InfluxDB_enabled").checked;
category["GPIO"]["enabled"] = document.getElementById("Category_GPIO_enabled").checked;
UpdateInput();
UpdateInputIndividual();
}
function UpdateExpertModus()
{
// var _style = 'display:none;';
var _style_pur = 'none';
var _hidden = true;
if (document.getElementById("ExpertModus_enabled").checked) {
// _style = '';
_style_pur = '';
_hidden = false;
document.getElementById("Edit_Config_Direct").style.display = "";
}
else
{
document.getElementById("Edit_Config_Direct").style.display = "none";
}
const expert = document.querySelectorAll(".expert");
for (var i = 0; i < expert.length; i++) {
expert[i].style.display = _style_pur;
// document.getElementById(expert[i].id).style = _style;
}
// Enable / Disable die Optionen in den Menues für die Auswahl. Falls kein Expertenmodus soll nur ein Wert (built-in-led oder externan-flash-ws281x) möglich sein
Array.from(document.querySelector("#GPIO_IO4_value1").options).forEach(function(option_element) {
if (option_element.value != "built-in-led")
option_element.hidden = _hidden;
});
Array.from(document.querySelector("#GPIO_IO12_value1").options).forEach(function(option_element) {
if (option_element.value != "external-flash-ws281x")
option_element.hidden = _hidden;
});
}
function saveTextAsFile()
{
ReadParameterAll();
if (document.getElementsByClassName("invalid-input").length > 0) {
firework.launch("Settings cannot be saved. Please check your entries!", 'danger', 30000);
return;
}
if (confirm("Are you sure you want to update \"config.ini\"?")) {
ReadParameterAll();
WriteConfigININew();
SaveConfigToServer(domainname);
firework.launch('Configuration got updated. Please reboot to activate changes!', 'success', 5000);
}
}
function doReboot() {
if (confirm("Are you sure you want to reboot the ESP32?")) {
var stringota = getDomainname() + "/reboot";
window.location = stringota;
window.location.href = stringota;
window.location.assign(stringota);
window.location.replace(stringota);
}
}
function editConfigDirect() {
if (confirm("Did you save your changes?")) {
var stringota = getDomainname() + "/edit_config.html?v=$COMMIT_HASH";
window.location = stringota;
window.location.href = stringota;
window.location.assign(stringota);
window.location.replace(stringota);
}
}
function numberChanged()
{
UpdateInputIndividual();
}
LoadConfigNeu();
</script>
</body>
</html>