NEWS
String umwandeln in Number und neues Objekt anlegen
-
Hallo zusammen.
Der device-reminder Adapter schreibt leider alle Werte als String die ich im Grafana nicht vernünftig auswerten kann.
Ein Weg wäre wohl ein neues Objekt als number anzulegen und die Werte neu zu speichern (schon ein paar Beiträge).Vielleicht kann mir jemand bei dem Script helfen.
Wie rechne ich die Zeit in Sekunden um ?Datenpunkt:
device-reminder.0.Trockner.lastRuntime
Wert der geschrieben wird:00:02:20
Wenn ich das richtig verstanden haben, muss ich Javascript bauen:
on("device-reminder.0.Trockner.lastRuntime", function (obj) { inhalt = JSON.parse(obj.state.val); setState("javascript.0.Test1", inhalt.Sekunden, true); });
Aber wie lasse ich die Zeit in Sekunden umrechnen?
lg
Bit -
@bitwicht sagte: Wert der geschrieben wird: 00:02:20
on("device-reminder.0.Trockner.lastRuntime", function (obj) { const arr = obj.state.val.split(':'); const sec = 3600 * arr[0] + 60 * arr[1] + parseInt(arr[2]); setState("javascript.0.Test1", sec, true); });
-
Bekommt man das nicht auch mit einem Alias hin?
-
Danke.
Wird der Wert automatisch angelegt oder muss ich das noch einbauen:createState("javascript.0.Test1", 0, {type: 'number', read: 'true', write: 'true'});
Das createState würde dann bei jedem Script Neustart aufgerufen werden, ist das ein Problem?
-
@bitwicht
Nö kein Problem, kannst ja noch ein if( !existsState('bla.bla.bla')) davor einbauen. -
Der Datenpunkt wurde erzeugt aber nicht befüllt.
Ich bekomme folgenden Fehler:javascript.0 2024-03-08 18:10:37.282 error at processImmediate (node:internal/timers:476:21) javascript.0 2024-03-08 18:10:37.282 error at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.ts:11229:62) javascript.0 2024-03-08 18:10:37.282 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:645:29) javascript.0 2024-03-08 18:10:37.281 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1266:38) javascript.0 2024-03-08 18:10:37.281 error at Object.<anonymous> (script.js.Test-Trockner:3:26) javascript.0 2024-03-08 18:10:37.279 error Error in callback: TypeError: Cannot read properties of undefined (reading '0') admin.0 2024-03-08 18:06:26.192 info <== Disconnect system.user.admin from ::ffff:192.168.0.100 javascript javascript.0 2024-03-08 18:06:19.113 warn This object will not be created in future versions. Please report this to the developer. javascript.0 2024-03-08 18:06:19.113 warn Object javascript.0.Test1 is invalid: obj.common.read has an invalid type! Expected "boolean", received "string" javascript.0 2024-03-08 18:06:19.107 info script.js.Test-Trockner: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
-
@bitwicht sagte: obj.common.read has an invalid type! Expected "boolean", received "string"
createState("javascript.0.Test1", 0, {type: 'number', read: true, write: false, role: 'value'});
EDIT: In Zeile 2 war ein Fehler. Habe ich oben korrigiert:
split(':')
-
Super, Danke!
Das neue Objekt wird befüllt und passt auch:
Adapter Objekt: 00:02:10
Neues Objekt: 130Ich würde jetzt gerne noch ein weiteres Objekt anlegen das bei jedem Lauf einfach mit 1 befüllt wird.
Dann kann ich die Anzahl pro Tag einfach im Grafana aggregieren.Wäre das dann so richtig:
on("device-reminder.0.Trockner.lastRuntime", function (obj) { const arr = obj.state.val.split(':'); const sec = 3600 * arr[0] + 60 * arr[1] + parseInt(arr[2]); setState("javascript.0.Test1", sec, true); const xxx = 1 setState("javascript.0.Test2", xxx, true); });
-
Falls es jemand brauchen kann:
on("device-reminder.0.Trockner.lastRuntime", function (obj) { const arr = obj.state.val.split(':'); const lastRuntime_in_sec = 3600 * arr[0] + 60 * arr[1] + parseInt(arr[2]); setState("javascript.0.device-reminder.Trockner.lastruntime_in_sec", lastRuntime_in_sec, true); const Runtime_counter = 1; setState("javascript.0.device-reminder.Trockner.runtime_counter", Runtime_counter, true); }); createState("javascript.0.device-reminder.Trockner.lastruntime_in_sec", 0, {type: 'number', read: true, write: false, role: 'value'}); createState("javascript.0.device-reminder.Trockner.runtime_counter", 0, {type: 'number', read: true, write: false, role: 'value'});