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?


  • @sveni_lee:

    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
    
    

  • @sveni_lee:

    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

Suggested Topics

  • 6
  • 3
  • 5
  • 8
  • 30
  • 1
  • 15
  • 3

1.1k
Online

37.0k
Users

42.7k
Topics

593.4k
Posts