Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    386

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    340

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    950

Trigger mehrerer Werte

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
5 Beiträge 2 Kommentatoren 400 Aufrufe 1 Beobachtet
  • Ä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

            Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

            Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

            Mit deinem Input könnte dieser Beitrag noch besser werden 💗

            Registrieren Anmelden
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            514

            Online

            32.8k

            Benutzer

            82.8k

            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