diff --git a/sd-card/config/config.ini b/sd-card/config/config.ini index 9e06820d..e631a1b6 100644 --- a/sd-card/config/config.ini +++ b/sd-card/config/config.ini @@ -52,10 +52,15 @@ CheckDigitIncreaseConsistency = false ;TopicError = wasserzaehler/error ;TopicRate = wasserzaehler/rate ;TopicTimeStamp = wasserzaehler/timestamp +;TopicUptime = watermeter/uptime +;MainTopicGPIO = watermeter/GPIO ;ClientID = wasser ;user = USERNAME ;password = PASSWORD +;[GPIO] +;IO16 = input + [AutoTimer] AutoStart = true Intervall = 4.85 diff --git a/sd-card/html/edit_config_param.html b/sd-card/html/edit_config_param.html index 259be5de..10f9e374 100644 --- a/sd-card/html/edit_config_param.html +++ b/sd-card/html/edit_config_param.html @@ -32,6 +32,10 @@ textarea { .smallSelect { width: 30px; } + +.invalid-input { + background-color: #FFAA00; +} @@ -559,6 +563,34 @@ textarea { MQTT topic, reporting the last correct readout + + + + + + TopicUptime + + + + + + MQTT topic, ESP uptime of last flow + + + + + + + + MainTopicGPIO + + + + + + MQTT main topic for GPIO + + @@ -666,7 +698,7 @@ textarea { - GPIO 16 MQTT topic name (empty = gpio16) + GPIO 16 MQTT topic name (empty = gpio16). Allowed characters (a-z, A-Z, 0-9, _, -) @@ -818,7 +850,7 @@ function getParameterByName(name, url = window.location.href) { return decodeURIComponent(results[2].replace(/\+/g, ' ')); } -function WriteParameter(_param, _category, _cat, _name, _optional, _select = false, _anzpara = 1){ +function WriteParameter(_param, _category, _cat, _name, _optional, _anzpara = 1){ console.log("InvertEnableItem"); if (_param[_cat][_name]["found"]){ @@ -963,13 +995,22 @@ function ReadParameter(_param, _cat, _name, _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 == "select") { - _param[_cat][_name]["value1"] = element.options[element.selectedIndex].text; + for (var j = 0; j < _param[_cat][_name]["anzParam"]; ++j) { + let element = document.getElementById(_cat+"_"+_name+"_value"+(j+1)); + console.log("check value", element.tagName, element.value, _param[_cat][_name].checkRegExList == null ? null : _param[_cat][_name].checkRegExList[j]); + if (element.tagName.toLowerCase() == "select") { + _param[_cat][_name]["value1"] = element.selectedIndex > -1 ? element.options[element.selectedIndex].text : ""; } else { - _param[_cat][_name]["value"+j] = element.value; + if ((_param[_cat][_name].checkRegExList != null) && (_param[_cat][_name].checkRegExList[j] != null)) { + console.log("check regex", element.value.match(_param[_cat][_name].checkRegExList[j])); + if (!element.value.match(_param[_cat][_name].checkRegExList[j])) { + element.classList.add("invalid-input"); + } else { + element.classList.remove("invalid-input"); + } + } + _param[_cat][_name]["value"+(j+1)] = element.value; } } } @@ -989,47 +1030,49 @@ function UpdateInput() { WriteParameter(param, category, "MakeImage", "Brightness", false); // WriteParameter(param, category, "MakeImage", "Contrast", false); // WriteParameter(param, category, "MakeImage", "Saturation", false); - WriteParameter(param, category, "MakeImage", "ImageSize", false, true, true); - WriteParameter(param, category, "MakeImage", "FixedExposure", false, true, true); + WriteParameter(param, category, "MakeImage", "ImageSize", false, true); + WriteParameter(param, category, "MakeImage", "FixedExposure", false, true); WriteParameter(param, category, "Alignment", "SearchFieldX", false); WriteParameter(param, category, "Alignment", "SearchFieldY", false); - WriteParameter(param, category, "Alignment", "AlignmentAlgo", true, true, true); + WriteParameter(param, category, "Alignment", "AlignmentAlgo", true, true); WriteParameter(param, category, "Digits", "Model", false); WriteParameter(param, category, "Digits", "LogImageLocation", true); WriteParameter(param, category, "Digits", "LogfileRetentionInDays", true); - WriteParameter(param, category, "Digits", "ModelInputSize", false, false, 2); + WriteParameter(param, category, "Digits", "ModelInputSize", false, 2); WriteParameter(param, category, "Analog", "Model", false); WriteParameter(param, category, "Analog", "LogImageLocation", true); WriteParameter(param, category, "Analog", "LogfileRetentionInDays", true); - WriteParameter(param, category, "Analog", "ExtendedResolution", true, true); - WriteParameter(param, category, "Analog", "ModelInputSize", false, false, 2); + WriteParameter(param, category, "Analog", "ExtendedResolution", true); + WriteParameter(param, category, "Analog", "ModelInputSize", false, 2); WriteParameter(param, category, "PostProcessing", "DecimalShift", true); - WriteParameter(param, category, "PostProcessing", "PreValueUse", true, true); + WriteParameter(param, category, "PostProcessing", "PreValueUse", true); WriteParameter(param, category, "PostProcessing", "PreValueAgeStartup", true); - WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true, true); + WriteParameter(param, category, "PostProcessing", "AllowNegativeRates", true); WriteParameter(param, category, "PostProcessing", "MaxRateValue", true); - WriteParameter(param, category, "PostProcessing", "ErrorMessage", true, true); - WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", true, true); + WriteParameter(param, category, "PostProcessing", "ErrorMessage", true); + WriteParameter(param, category, "PostProcessing", "CheckDigitIncreaseConsistency", true); WriteParameter(param, category, "MQTT", "Uri", true); WriteParameter(param, category, "MQTT", "Topic", true); WriteParameter(param, category, "MQTT", "TopicError", true); WriteParameter(param, category, "MQTT", "TopicRate", true); - WriteParameter(param, category, "MQTT", "TopicTimeStamp", true); + WriteParameter(param, category, "MQTT", "TopicTimeStamp", true); + WriteParameter(param, category, "MQTT", "TopicUptime", true); + WriteParameter(param, category, "MQTT", "MainTopicGPIO", true); WriteParameter(param, category, "MQTT", "ClientID", true); WriteParameter(param, category, "MQTT", "user", true); WriteParameter(param, category, "MQTT", "password", true); - WriteParameter(param, category, "GPIO", "IO16", true, true, 2); + WriteParameter(param, category, "GPIO", "IO16", true, 2); - WriteParameter(param, category, "AutoTimer", "AutoStart", false, true); + WriteParameter(param, category, "AutoTimer", "AutoStart", false); WriteParameter(param, category, "AutoTimer", "Intervall", false); - WriteParameter(param, category, "Debug", "Logfile", true, true); + WriteParameter(param, category, "Debug", "Logfile", true); WriteParameter(param, category, "Debug", "LogfileRetentionInDays", true); WriteParameter(param, category, "System", "TimeZone", true); @@ -1040,7 +1083,6 @@ function UpdateInput() { function ReadParameterAll() { - console.log("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; @@ -1084,6 +1126,8 @@ function ReadParameterAll() ReadParameter(param, "MQTT", "TopicError", true); ReadParameter(param, "MQTT", "TopicRate", true); ReadParameter(param, "MQTT", "TopicTimeStamp", true); + ReadParameter(param, "MQTT", "TopicUptime", true); + ReadParameter(param, "MQTT", "MainTopicGPIO", true); ReadParameter(param, "MQTT", "ClientID", true); ReadParameter(param, "MQTT", "user", true); ReadParameter(param, "MQTT", "password", true); @@ -1101,13 +1145,10 @@ function ReadParameterAll() ReadParameter(param, "System", "TimeServer", true); FormatDecimalValue(param, "PostProcessing", "MaxRateValue"); - console.log("ReadParameterAll end"); } function WriteConfig(){ - console.log("WriteConfig"); ReadParameterAll(); - console.log("WriteConfig end"); return setConfigParameters(param, category); } @@ -1155,6 +1196,10 @@ function saveTextAsFile() console.log("saveTextAsFile"); if (confirm("Are you sure you want to update \"config.ini\"?")) { var textToSave = WriteConfig(); + if (document.getElementsByClassName("invalid-input").length > 0) { + alert("Settings cannot be saved. Please check your entries."); + return; + } FileDeleteOnServer("/config/config.ini", basepath); FileSendContent(textToSave, "/config/config.ini", basepath); } diff --git a/sd-card/html/readconfigparam.js b/sd-card/html/readconfigparam.js index a5a3b857..6467bced 100644 --- a/sd-card/html/readconfigparam.js +++ b/sd-card/html/readconfigparam.js @@ -86,6 +86,8 @@ function ParseConfig() { ParamAddValue(param, catname, "TopicError"); ParamAddValue(param, catname, "TopicRate"); ParamAddValue(param, catname, "TopicTimeStamp"); + ParamAddValue(param, catname, "TopicUptime", 1, [/^([a-zA-Z0-9_-]+\/){0,10}[a-zA-Z0-9_-]+$/]); + ParamAddValue(param, catname, "MainTopicGPIO", 1, [/^([a-zA-Z0-9_-]+\/){0,10}[a-zA-Z0-9_-]+$/]); ParamAddValue(param, catname, "ClientID"); ParamAddValue(param, catname, "user"); ParamAddValue(param, catname, "password"); @@ -95,7 +97,7 @@ function ParseConfig() { category[catname]["enabled"] = false; category[catname]["found"] = false; param[catname] = new Object(); - ParamAddValue(param, catname, "IO16", 2); + ParamAddValue(param, catname, "IO16", 2, [null, /^[a-zA-Z0-9_-]*$/]); var catname = "AutoTimer"; category[catname] = new Object(); @@ -143,12 +145,13 @@ function ParseConfig() { } } -function ParamAddValue(param, _cat, _param, _anzParam = 1){ +function ParamAddValue(param, _cat, _param, _anzParam = 1, _checkRegExList = null){ param[_cat][_param] = new Object(); param[_cat][_param]["found"] = false; param[_cat][_param]["enabled"] = false; param[_cat][_param]["line"] = -1; - param[_cat][_param]["anzParam"] = _anzParam; + param[_cat][_param]["anzParam"] = _anzParam; + param[_cat][_param].checkRegExList = _checkRegExList; };