NEWS
[gelöst]js-skript zeitspanne Objekt-State "true" erfassen
-
ich habe mein Skript mal mit deinem kombiniert, das ganze sieht jetzt so aus…
var ts_ein = 0, ts_aus = 0, dauer_ein = 0, dauer_aus = 0; on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); ts_ein = obj.state.ts; } else if (!obj.state.val) { // wenn Gerät AUS ts_aus = obj.state.ts; dauer_ein = ts_aus - ts_ein; log(dauer_ein) setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round(dauer_ein/60000) + " Minuten", true); } });
das ganze funktioniert sogar
Also besten Dank schon mal
-
Das geht noch einfacher
const idDauer = "javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"; on('hm-rpc.0.OEQ0207710.5.STATE', function(dp) { if(!dp.state.val) setState(idDauer, Math.round((dp.state.lc - dp.oldState.lc) / 60000), true); // Minuten });
-
cool, damit spart man sich tatsächlich auch noch die Variablen…
dann hätte ich noch eine Frage:
könnte man im ersten Abschnitt
on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); }
eine art Stopp-uhr mitlaufen lassen, die alle 30 oder 60 sekunden einen wert in ms ausgibt, so dass man einen Wert hätte wie lange das Objekt schon auf true steht?
-
eine art Stopp-uhr mitlaufen lassen, die alle 30 oder 60 sekunden einen wert in ms ausgibt, `
Dafür gibt es https://wiki.selfhtml.org/wiki/JavaScript/Window/setInterval zusammen mit einer globalen Zählvariablen. Das Stoppen mit https://wiki.selfhtml.org/wiki/JavaScript/Window/clearInterval beim Ausschalten nicht vergessen ! -
okay… das starten des Intervals funktioniert:
on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); setInterval(function(){ setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true); }, 10000); } else if (!obj.state.val) { // wenn Gerät AUS clearInterval(timer); setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true); setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true); } });
aber das mit cearInterval(timer) habe ich noch nicht ganz verstanden
EDIT:
ich denke ich habs herausgefunden:
var intervalId = null; on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); intervalId = setInterval(function(){ setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true); }, 10000); } else if (!obj.state.val) { // wenn Gerät AUS clearInterval(intervalId); setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true); setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true); } });
-
Weshalb verwendest Du ein Intervall von 10 s, wenn Du den angezeigten Wert auf ganze Minuten rundest ?
-
} else if (!obj.state.val) { // wenn Gerät AUS
kann vereinfacht werden
} else { // wenn Gerät AUS
-
cool, damit spart man sich tatsächlich auch noch die Variablen… `
Das Skript sollte nicht möglichst kurz sein, sondern eine Variante von deinem Ursprungsskript. Da du in deinem Skript das gleiche Objekt, welches du mit der on()-Funktion überwachst im Callback mit getState() abfragst, habe ich deine JS-Kenntnisse falsch eingeschätzt.KLappt es jetzt?
Pix
EDIT:
@Paul: auf die Vereinfachungen sollte er selbst kommen
-
@pix:Das Skript sollte nicht möglichst kurz sein, sondern eine Variante von deinem Ursprungsskript. Da du in deinem Skript das gleiche Objekt, welches du mit der on()-Funktion überwachst im Callback mit getState() abfragst, habe ich deine JS-Kenntnisse falsch eingeschätzt. `
naja, sagen wir mal ich bin blutiger anfänger
> KLappt es jetzt?
ja, funktioniert nun so… alle 10sec wird der state aktulisiert...
-
@sveni_lee sagte in [gelöst]js-skript zeitspanne Objekt-State "true" erfassen:
okay… das starten des Intervals funktioniert:
on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); setInterval(function(){ setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true); }, 10000); } else if (!obj.state.val) { // wenn Gerät AUS clearInterval(timer); setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true); setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true); } });
aber das mit cearInterval(timer) habe ich noch nicht ganz verstanden
EDIT:
ich denke ich habs herausgefunden:
var intervalId = null; on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) { if (obj.state.val) { //wenn Gerät EIN setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true); intervalId = setInterval(function(){ setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true); }, 10000); } else if (!obj.state.val) { // wenn Gerät AUS clearInterval(intervalId); setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true); setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true); } });
Hallo sveni_lee
ich habe das Script zufällig gefunden und mal nachgebaut, es funktioniert auch, aber nach einiger Zeit ändert sich ohne zutun der Timestamp_ON ??? dann fängt der Timer auch wieder neu an zu zählen.
Kannst du da ev. helfen?
Jukabroker