Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Trigger mehrerer Werte

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.6k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    996

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Trigger mehrerer Werte

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
5 Beiträge 2 Kommentatoren 361 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    senior1418
    schrieb am zuletzt editiert von
    #1

    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

    paul53P S 2 Antworten Letzte Antwort
    0
    • S senior1418

      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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

      @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.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      S 1 Antwort Letzte Antwort
      0
      • paul53P 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 Offline
        S Offline
        senior1418
        schrieb am zuletzt editiert von
        #3

        @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 Antwort Letzte Antwort
        0
        • S senior1418

          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

          S Offline
          S Offline
          senior1418
          schrieb am zuletzt editiert von
          #4

          @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 Antwort Letzte Antwort
          0
          • S senior1418

            @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 Offline
            S Offline
            senior1418
            schrieb am zuletzt editiert von
            #5

            @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 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            687

            Online

            32.6k

            Benutzer

            82.3k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe