diff --git a/code/html/src/sensor.mjs b/code/html/src/sensor.mjs
index 8103c202..c3b8c663 100644
--- a/code/html/src/sensor.mjs
+++ b/code/html/src/sensor.mjs
@@ -12,6 +12,7 @@ import {
prepareEnumerableTarget,
resetGroupElement,
setChangedElement,
+ setIgnoredElement,
setOriginalFromValue,
setSelectValue,
variableListeners,
@@ -428,6 +429,7 @@ function initMagnitudesExpected(id) {
expected.name += info.key;
expected.id = expected.name;
expected.dataset["id"] = info.id.toString();
+ setIgnoredElement(expected);
const [message] = /** @type {NodeListOf} */
(template.querySelectorAll(`span.emon-expected-${info.prefix}`));
diff --git a/code/html/src/settings.mjs b/code/html/src/settings.mjs
index 44bc66a4..94557df2 100644
--- a/code/html/src/settings.mjs
+++ b/code/html/src/settings.mjs
@@ -54,7 +54,7 @@ export function resetChangedElement(elem) {
* @param {HTMLElement} elem
*/
function resetGroupPending(elem) {
- elem.dataset["settingsGroupPending"] = "";
+ delete elem.dataset["settingsGroupPending"];
}
// Right now, group additions happen from:
@@ -137,16 +137,34 @@ export function resetGroupElement(elem) {
/**
* @param {HTMLElement} elem
+ * @returns {boolean}
*/
export function isGroupElement(elem) {
return elem.dataset[SETTINGS_GROUP_ELEMENT] !== undefined;
}
+const SETTINGS_IGNORED_ELEMENT = "settingsIgnore";
+
/**
* @param {HTMLElement} elem
*/
-function isIgnoredElement(elem) {
- return elem.dataset["settingsIgnore"] !== undefined;
+export function setIgnoredElement(elem) {
+ elem.dataset[SETTINGS_IGNORED_ELEMENT] = "true";
+}
+
+/**
+ * @param {HTMLElement} elem
+ */
+export function resetIgnoredElement(elem) {
+ delete elem.dataset[SETTINGS_IGNORED_ELEMENT];
+}
+
+/**
+ * @param {HTMLElement} elem
+ * @returns {boolean}
+ */
+export function isIgnoredElement(elem) {
+ return elem.dataset[SETTINGS_IGNORED_ELEMENT] !== undefined;
}
/**
@@ -432,6 +450,22 @@ function groupSettingsCleanup(container, keys) {
* @typedef {{[k: string]: DataValue}} SetRequest
*/
+/**
+ * @param {string | number |boolean} value
+ * @returns {DataValue}
+ */
+function maybeAdjustDataValue(value) {
+ if (typeof value === "boolean") {
+ return value ? 1 : 0;
+ }
+
+ if (typeof value === "number" && isNaN(value)) {
+ return "nan";
+ }
+
+ return value;
+}
+
/**
* specific 'key' string to remove from the device settings storage
* @typedef {string} DelRequest
@@ -478,6 +512,10 @@ export function getData(forms, {cleanup = true, assumeChanged = false} = {}) {
continue;
}
+ if (elem instanceof HTMLInputElement && elem.readOnly) {
+ continue;
+ }
+
const name = elem.dataset["settingsRealName"] || elem.name;
if (!name) {
continue;
@@ -506,11 +544,8 @@ export function getData(forms, {cleanup = true, assumeChanged = false} = {}) {
const data_name = group_element
? group_name : name;
- // TODO small value optimization, so booleans always take 1 byte in the resulting json
- const data_value = (typeof value === "boolean")
- ? (value ? 1 : 0) : value;
-
- data[data_name] = data_value;
+ // fixing outgoing data, when it is necessary
+ data[data_name] = maybeAdjustDataValue(value);
}
}
}
diff --git a/code/html/src/template-sns.html b/code/html/src/template-sns.html
index b757ba78..08418e75 100644
--- a/code/html/src/template-sns.html
+++ b/code/html/src/template-sns.html
@@ -28,7 +28,7 @@
-
+
In Watts (W). Calibrate your sensor connecting a pure resistive load (like a bulb) and enter here its nominal power or use a multimeter.
diff --git a/code/html/src/validate.mjs b/code/html/src/validate.mjs
index ed4f3ed4..d7f7c845 100644
--- a/code/html/src/validate.mjs
+++ b/code/html/src/validate.mjs
@@ -1,4 +1,4 @@
-import { isChangedElement, getElements } from './settings.mjs';
+import { isChangedElement, isIgnoredElement, getElements } from './settings.mjs';
import { showPanel } from './core.mjs';
import {
formPassPair,
@@ -126,7 +126,7 @@ export function validateFormsPasswords(forms, {strict = true, assumeChanged = fa
export function validateFormsReportValidity(forms) {
const elems = forms
.flatMap((form) => getElements(form))
- .filter(isChangedElement)
+ .filter((x) => isChangedElement(x) && !isIgnoredElement(x))
if (!elems.length) {
return false;