Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Trigger mehrerer Werte

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Trigger mehrerer Werte

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      senior1418 last edited by

      Ich möchte in etwa den Stromverbrauch unseres Durchlauferhitzers mit dem Adapter "Smartmeter" festhalten.
      Das ist so natürlich nur indirekt möglich und steht auf wackeligen Füßen.

      Durchlauferhitzer arbeitet mit 18 |21 | 24 KW je Auswahl
      Die Eingangswassertemperataur beeinflusst den Verbrauch.
      Andere Verbraucher beeinflussen den Verbrauch inzwischen.

      Nun habe ich beobachtet, das die Phasen L2 und L3 /Smartmeter/ immer dann ansteigen, wenn Durchlauferhitzer arbeitet.

      Trigger ist deshalb:

      if (obj.state.val >= iTrigger && !bAktiv && getState(id_L2).val > iTrigger2 && getState(id_L3).val > iTrigger2 ) {
      

      Aber : wenn die Werte von L2 oder L3 nur ein wenig später eingehen als "obj.state.val >= iTrigger" als wird nicht getriggert.

      Kann man das so machen bzw. wie macht man es richtig ?

      Hier mal mei Versuch

      // Smartmeter
      let idPOW = 'smartmeter.0.1-0:16_7_0__255.value'; // aktuelle Leistung in Watt
      let id_Zaehlerstand = 'smartmeter.0.1-0:1_8_0__255.value'; // aufgelaufener gesamt-Zählerstand in kWh
      let id_L2 = 'smartmeter.0.1-0:51_7_0__255.value';  // Stromstärke Phase 2 in A
      let id_L3 = 'smartmeter.0.1-0:71_7_0__255.value';  // Stromstärke Phase 3 in A
      
      // Userdata .. DlE = Durclauferhitzer
      let idDlE_Zustand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.DL_aktiv'; // DL aktiv|true , inaktiv|false
      let idDLE_Zaehlerstand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.Zaehlerstand';  // aufgelaufener Verbrauch in kWh
      
      //Trigger
      const iTrigger = 5000; // Schwellwert ab der aktiver Durchlauferhitzer vermutet wird.
      const iTrigger2 = 5; // Schwellwert in A bei L2 && L3 bei aktivem Durchlauferhitzer
      
      //Programm
      let fZaehlerStart;
      var fVerbrauch; // Verbrauch während Trigger
      var fAlterWert;
      
      var bAktiv; // true = Verbrauch wird aufgezeichnet, DLE in Betrieb
      
      on({ id: idPOW, change: "ne" }, function (obj) {
          
          //if (obj.state.val >= iTrigger && !bAktiv) {
          if (obj.state.val >= iTrigger && !bAktiv && getState(id_L2).val > iTrigger2 && getState(id_L3).val > iTrigger2 ) {
              bAktiv = true;
              setState (idDlE_Zustand,true);
              fZaehlerStart = getState(id_Zaehlerstand).val; //gesamt-Zählerstand notieren
          }
          else if (obj.state.val < iTrigger && bAktiv) {
              bAktiv = false;
              setState (idDlE_Zustand,false);
              fVerbrauch = getState(id_Zaehlerstand).val - fZaehlerStart;  // Verbrauch ermitteln
      
              fAlterWert = getState (idDLE_Zaehlerstand).val;
              setState(idDLE_Zaehlerstand, fAlterWert + fVerbrauch);  // Verbrauch ermitteln
          }
        
      });
      
      
      

      LG K

      paul53 S 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @senior1418 last edited by paul53

        @senior1418 sagte: mit 18 |21 | 24 KW je Auswahl

        Ändert sich die Leistung auch im laufenden Betrieb?
        Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?

        Wenn beide Fragen mit "nein" beantwortet werden, würde ich es so machen:

        // Smartmeter
        const idPOW = 'smartmeter.0.1-0:16_7_0__255.value'; // aktuelle Leistung in Watt
         
        // Userdata .. DlE = Durclauferhitzer
        const idDlE_Zustand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.DL_aktiv'; // DL aktiv|true , inaktiv|false
        const idDLE_Zaehlerstand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.Zaehlerstand';  // aufgelaufener Verbrauch in kWh
         
        //Programm
        var start = Date.now();
        var fAlterWert = getState(idDLE_Zaehlerstand).val;
        var power = 18;
         
        on(idPOW, function(dp) {
            let sprung = dp.state.val - dp.oldState.val;
            if(sprung > 16500) {
                power = 24;
                if(sprung < 22500) power = 21;
                if(sprung < 19500) power = 18;
                start = Date.now();
                setState(idDlE_Zustand,true, true);
            } else if(sprung < -16500) {
                setState (idDlE_Zustand,false, true);
                let dauer = (Date.now() - start) / 3600000; // in Stunden
                let fVerbrauch = power * dauer;
                fAlterWert += fVerbrauch; // in kWh
                setState(idDLE_Zaehlerstand, Math.round(fAlterWert * 100) / 100, true);  
            }
        });
        

        Wenn man die Zählerstanddifferenz zwischen Ein- und Ausschalten des DLE verwendet, werden auch alle parallel laufenden Verbraucher mit erfasst.

        S 1 Reply Last reply Reply Quote 0
        • S
          senior1418 @paul53 last edited by

          @paul53 sagte in Trigger mehrerer Werte:

          Ändert sich die Leistung auch im laufenden Betrieb?
          Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?

          vielen Dank ! ich brauche etwas Zeit um das zu verstehen bzw. versuche das nachzustellen

          1 Reply Last reply Reply Quote 0
          • S
            senior1418 @senior1418 last edited by

            @paul53 sagte in Trigger mehrerer Werte:

            Ändert sich die Leistung auch im laufenden Betrieb?

            .. sehr wahrscheinlich

            Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?

            in.. meinem Fall nehme ich Mindestleitung kleiner 5KW an, deshalb "iTrigger = 5000"

            Wenn beide Fragen mit "nein" beantwortet werden, würde ich es so machen:

            also nein !

            S 1 Reply Last reply Reply Quote 0
            • S
              senior1418 @senior1418 last edited by

              @paul53 sagte in Trigger mehrerer Werte:

              Wenn man die Zählerstanddifferenz zwischen Ein- und Ausschalten des DLE verwendet, werden auch alle parallel laufenden Verbraucher mit erfasst.

              ja klar, das ist so, deshalb Variante --- der durchschnittliche Verbrauch vorher Trigger wird ermittelt und anschließend abgezogen.

              
              // Smartmeter
              let idPOW = 'smartmeter.0.1-0:16_7_0__255.value'; // aktuelle Leistung in Watt
              let id_Zaehlerstand = 'smartmeter.0.1-0:1_8_0__255.value'; // aufgelaufener gesamt-Zählerstand in kWh
              let id_L2 = 'smartmeter.0.1-0:51_7_0__255.value';  // Stromstärke Phase 2 in A
              let id_L3 = 'smartmeter.0.1-0:71_7_0__255.value';  // Stromstärke Phase 3 in A
              
              // Userdata .. DlE = Durclauferhitzer
              let idDlE_Zustand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.DL_aktiv'; // DL aktiv|true , inaktiv|false
              let idDLE_Zaehlerstand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.Zaehlerstand';  // aufgelaufener Verbrauch in kWh
              
              //Trigger
              const iTrigger = 5000; // Schwellwert ab der aktiver Durchlauferhitzer vermutet wird.
              const iTrigger2 = 5; // Schwellwert in A bei L2 && L3 bei aktivem Durchlauferhitzer
              
              //Programm
              let fZaehlerStart;
              var fVerbrauch; // Verbrauch während Trigger
              var fAlterWert;
              
              var bAktiv; // true = Verbrauch wird aufgezeichnet, DLE in Betrieb
              
              var aGrundverbrauch = [];  // 0-29 des Grundverbrauches
              var aTimeGrundverbrauch = []; // array 0-29 des Zeitabstand Grundverbrauchswerte
              var iAvgGrundverbrauch;  // Mittelwert der letzten Werte Watt
              
              
              // ************************************************************************
              // Mittelwert Grundverbrauch
              // Parameter myArray [Zeitstempel,Verbrauch]
              function ArrayMittel(myArray) {
                  var i = 0, sum = 0, ArrayLen = myArray.length;
                  // Verbrauch summieren
                  while (i < ArrayLen) {
                      sum = sum + myArray[i++][1];
                  }
                  
                  // Zeitspanne ermitteln
                  var t = (myArray[myArray.length-1][0] - myArray[0][0]) / 1000; // Sekunden
              
                  // Rückgabe KWh
                  return (sum / 1000 / ArrayLen) / 3600 * t;
              }
              
              
              on({ id: idPOW, change: "ne" }, function (obj) {
                  
                  //if (obj.state.val >= iTrigger && !bAktiv) {
                  if (obj.state.val >= iTrigger && !bAktiv && getState(id_L2).val > iTrigger2 && getState(id_L3).val > iTrigger2 ) {
                      bAktiv = true;
                      setState (idDlE_Zustand,true);
                      fZaehlerStart = getState(id_Zaehlerstand).val; //gesamt-Zählerstand notieren
                  }
                  else if (obj.state.val < iTrigger && bAktiv) {
                      bAktiv = false;
                      setState (idDlE_Zustand,false);
                      
                      fVerbrauch = getState(id_Zaehlerstand).val - fZaehlerStart;  // Verbrauch ermitteln
                      fAlterWert = getState (idDLE_Zaehlerstand).val;
                      
                      // negative Werte durch Abzug von Grundverbrauch vermeiden         
                      if (fAlterWert + fVerbrauch - iAvgGrundverbrauch >= 0) {
                          setState(idDLE_Zaehlerstand, fAlterWert + fVerbrauch);  // Verbrauch abzüglich Grundeverbrauch ermitteln
                      }
                  }
                  else if (!bAktiv) { // den Mittelwert der letzten 30 Werte vor Inbetriebnahme des Durchlauferhitzers ermitteln
                      // laufend .... 
                      aGrundverbrauch.push( [new Date().getTime() , obj.state.val] );
                      
                      // nur die letzten 30 Werte merken, Rest trashen .. 
                      if (aGrundverbrauch.length > 30) {
                          aGrundverbrauch.shift();
                      }
                      // Mittelwert aus den letzten 30 Werten bilden
                      iAvgGrundverbrauch = ArrayMittel(aGrundverbrauch);
                      console.log("aGrundverbrauch: " + JSON.stringify(aGrundverbrauch));
                      
                  } 
              
              });
              
              
              
              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              579
              Online

              31.8k
              Users

              80.1k
              Topics

              1.3m
              Posts

              javascript
              2
              5
              230
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo