Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Zwischenschalter Dauer errechnen

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

      Hallo,

      ich habe an jeder Elektroheizung einen HM Zwischenschalter und einen Thermostat. Ich würde gern errechnen bzw. aufzeichnen wie lange die Heizungen jeweils eingeschaltet sind. Daraus lässt auch der Verbrauch (kWh) errechnen. Wie kann ich das machen?

      Gruß

      Marco

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        Wenn es genügt, die Werte beim Ausschalten des Zwischensteckers zu ermittelen, dann sollte es so funktionieren:

        var p = 1.234; // Leistung in kW
        
        on({id: "idZwischenstecker", val: false}, function(dp) {
          var ton = dp.newState.lc - dp.oldState.lc;
          var e = p * ton / 3600;                               // aktueller Verbrauch in kWh
          setState("idVerbrauch", getState("idVerbrauch") + e); // kumulierter Verbrauch in kWh
        });
        
        
        1 Reply Last reply Reply Quote 0
        • M
          Marcolotti last edited by

          Danke Paul53,

          das scheint bei mir erstmal grob zu funktionieren. Allerdings habe ich noch ein Problem. Ich habe die Variablen unter Objekte/Javascript angelegt. Jedesmal wenn eine Heizung abschaltet setzt er ein [object Object] davor. Beim nächsten Anschalten wird der Wert wieder genullt. Er kann ruhig fortlaufend sein. Wäre sehr schön, wenn das so funktionieren könnte.

          721_verbrauch.jpg

          Vielen lieben Dank trotzdem.

          Gruß Marco

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            Sorry, mein Fehler: Es fehlt bei getState .val. Richtig:

              setState("idVerbrauch", getState("idVerbrauch").val + e); // kumulierter Verbrauch in kWh
            

            Das Einschalten sollte allerdings nicht den Datenpunkt verändern. Falls doch, kann dies eine zusätzliche Abfrage verhindern:

            var p = 1.234; // Leistung in kW
            
            on({id: "idZwischenstecker", val: false}, function(dp) {
              if(!dp.newState.val) {
                var ton = dp.newState.lc - dp.oldState.lc;
                var e = p * ton / 3600;                                   // aktueller Verbrauch in kWh
                setState("idVerbrauch", getState("idVerbrauch").val + e); // kumulierter Verbrauch in kWh
              }
            });
            
            1 Reply Last reply Reply Quote 0
            • M
              Marcolotti last edited by

              Vielen Dank Paul. Das funktioniert hervorragend. 😉

              1 Reply Last reply Reply Quote 0
              • M
                Marcolotti last edited by

                Guten Morgen,

                ich bekomme es mit dem Runden nicht hin. "Math.round" bringt keine Ausgabe "Math.rint" auch nicht. "to.Fixed(2)" erzeugt bei mir eigenartige Zahlen (10.10.21 kWh) <- kenn ich nur, wenn man Strings aneinander heftet. :?:

                Kann da einer helfen?

                Gruß Marco

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                  @Marcolotti:

                  "to.Fixed(2)" erzeugt bei mir eigenartige Zahlen (10.10.21 kWh) `
                  .toFixed(2) müsste funktionieren.

                  1 Reply Last reply Reply Quote 0
                  • M
                    Marcolotti last edited by

                    Ich habe mich nur im Beitrag verschrieben nicht im Script. @toFixed(2).

                    Er macht da wahrlich falsche Zahlen. Wenn der Wert 10 schon da ist und einer neuer Wert 5 kommt, dann addiert er nicht sondern hängt den Wert an.

                    z.B. 10.00.5.00

                    var p = 1.500; // Leistung in kW
                    
                    on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) {
                      // setState("Verbrauch_Adrian", 0);
                      var ton = dp.newState.lc - dp.oldState.lc;
                      var en = p * ton / 3600;      // aktueller Verbrauch in kWh
                      var eu = en * 0.25;
                      var em = getState("Verbrauch_Adrian").val + eu;
                      var e = em.toFixed(2);
                          setState("Verbrauch_Adrian", getState("Verbrauch_Adrian").val + e); // kumulierter Verbrauch in kWh
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • P
                      pix last edited by

                      Hallo,

                      schreib doch einach eine Logausgabe hinter jede Zeile und sieh dir die Werte an.

                      var p = 1.500; // Leistung in kW
                      
                      on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) {
                        // setState("Verbrauch_Adrian", 0);
                        var ton = dp.newState.lc - dp.oldState.lc;
                        log(ton + ' ' + typeof ton);
                        var en = p * ton / 3600;      // aktueller Verbrauch in kWh
                        log(en + ' ' + typeof en);
                        var eu = en * 0.25;
                        log(eu + ' ' + typeof eu);
                        var em = getState("Verbrauch_Adrian").val + eu;
                        log(em + ' ' + typeof em);
                        var e = em.toFixed(2);
                        log(e + ' ' + typeof e);
                        setState("Verbrauch_Adrian", getState("Verbrauch_Adrian").val + e); // kumulierter Verbrauch in kWh
                        log(getState('Verbrauch_Adrian').val);
                      });
                      

                      Gruß

                      Pix

                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        Versuche es mal so:

                        var p = 1.500; // Leistung in kW
                        
                        on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) {
                          // setState("Verbrauch_Adrian", 0);
                          var ton = dp.newState.lc - dp.oldState.lc;
                          var en = p * ton / 3600;      // aktueller Verbrauch in kWh
                          var eu = en * 0.25;
                          var em = parseFloat(getState("Verbrauch_Adrian").val) + eu;   // kumulierter Verbrauch in Euro
                          setState("Verbrauch_Adrian", em.toFixed(2));
                        });
                        

                        Anmerkung: .toFixed(n) erzeugt einen String, denn eine feste Zahl an Nachkommastellen läßt sich nur für einen String vorgeben. parseFloat(string) macht daraus wieder eine Zahl (number).

                        1 Reply Last reply Reply Quote 0
                        • M
                          Marcolotti last edited by

                          Hallo,

                          seit einiger Zeit funktioniert meine Berechnung nicht mehr. Vielleicht hat sich im JavaScript was geändert oder in der Homematic Firmware. Vielleicht kann mir einer einen Ratschlag geben.

                          var p = 1.500; // Leistung in kW
                          
                          on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) {
                            // setState("Verbrauch_Adrian", 0);
                            var ton = dp.newState.lc - dp.oldState.lc;
                            var en = p * ton / 3600;      // aktueller Verbrauch in kWh
                            var eu = en * 0.25;
                            var em = parseFloat(getState("Verbrauch_Adrian").val) + eu;   // kumulierter Verbrauch in Euro
                            setState("Verbrauch_Adrian", em.toFixed(2));
                          });
                          

                          LOG:

                          javascript.0	2016-11-02 09:38:00.870	warn	Wrong type of javascript.0.Verbrauch_gesamt: "string". Please fix, while deprecated and will not work in next versions.
                          javascript.0	2016-11-02 09:37:50.800	warn	Wrong type of javascript.0.Verbrauch_Stube: "string". Please fix, while deprecated and will not work in next versions.
                          

                          Die Scripte ergeben Verbräuche jenseits von gut und böse. Mal 3000€ pro Heizung pro Tag usw.

                          Gruß Marco

                          1 Reply Last reply Reply Quote 0
                          • Thisoft
                            Thisoft last edited by

                            Hallo,

                            also irgendwie passt das Log was du gepostet hast nicht zu dem (Stückchen) Skript was du gepostet hast…

                            Davon abgesehen - ich denke dass du hier ein Problem mit vermischten Datentypen hast. Welchen Datentyp hat denn die Variable "Verbrauch_Adrian"? Ich denke mal "String(bzw. Zeichenfolge)". Kann es sein, dass bei:

                            (parseFloat(getState("Verbrauch_Adrian").val) + eu).toFixed(2)
                            

                            irgendwo zwischendurch das Komma bzw. der Punkt "abhanden kommt" und deshalb zum Schluss zwei Nullen zuviel am Wert hängen. LAss Dir doch bitte mal die einzelnen Zwischenwerte (ton, en, eu, em) ins Log schreiben. DAnn sollte man vielleicht schon mal was sehen können wo ein falscher Wert auftaucht.

                            Eigentlich wäre es ja IMO der "sauberere" Weg die Variable "Verbrauch_Adrian" gleich vom Typ "Zahl" zu definieren. Sollen ja schließlich Zahlenwerte drin gespeichert werden - oder?

                            1 Reply Last reply Reply Quote 0
                            • P
                              pix last edited by

                              Hallo,

                              @Thisoft:

                              Eigentlich wäre es ja IMO der "sauberere" Weg die Variable "Verbrauch_Adrian" gleich vom Typ "Zahl" zu definieren. Sollen ja schließlich Zahlenwerte drin gespeichert werden - oder? ` Das denke ich auch. Zur Anzeige in VIS kann immer noch in val number Widget verwendet werden, das sich auf zwei Dezimalstellen einstellen lässt.

                              Können wir mal ganzen Code sehen? Auch den Teil, wo die States angelegt werden?

                              Gruß

                              Pix

                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 last edited by

                                Die Datenpunkte "javascript.0.Verbrauch_xy" müssen vom Typ "string" sein, denn toFixed(2) wandelt in einen String.

                                Deshalb wird der Wert des Datenpunktes mittels parseFloat() zur Berechnung des kumulativen Wertes in eine Zahl gewandelt.

                                Will man Datenpunkte vom Typ "number" verwenden, muss man die Rundung auf 2 Nachkommastellen anders vornehmen:

                                  var em = getState("Verbrauch_Adrian").val + eu;   // kumulierter Verbrauch in Euro
                                  setState("Verbrauch_Adrian", 0.01 * Math.round(100 * em));
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • Thisoft
                                  Thisoft last edited by

                                  Ja, natürlich muss man dann anders Runden.

                                  Trotzdem ist es auf jeden Fall die bessere Lösung die Datenpunkte als "number" zu definieren und somit nicht jedesmal von "String"->"number"->"String" zu konvertieren!

                                  [Edit] hier war ich mit den Posts durcheinander geraten…

                                  1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 last edited by

                                    @Marcolotti:

                                    Die Scripte ergeben Verbräuche jenseits von gut und böse. Mal 3000€ pro Heizung pro Tag usw. `
                                    Die Zeitstempel sind nicht mehr in Sekunden, sondern (ab js-controller Version 0.9.0) in Millisekunden:

                                    var p = 1.500; // Leistung in kW
                                    
                                    on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) {
                                      var ton = dp.newState.lc - dp.oldState.lc;
                                      var en = p * ton / 3600000;      // aktueller Verbrauch in kWh
                                      var eu = en * 0.25;
                                      var em = getState("Verbrauch_Adrian").val + eu;   // kumulierter Verbrauch in Euro
                                      setState("Verbrauch_Adrian", 0.01 * Math.round(100 * em));
                                    });
                                    

                                    Mit Datenpunkt "Verbrauch_Adrian" vom Typ "number".

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      Marcolotti last edited by

                                      Vielen Dank. Es scheint wieder richtig zu funktionieren.

                                      Viele Grüße

                                      Marco

                                      1 Reply Last reply Reply Quote 0
                                      • Thisoft
                                        Thisoft last edited by

                                        Das war der entscheidende Hinweis von @paul53 dass der Zeitstempel jetzt in Millisekunden ist. Hatte ich nicht mehr dran gedacht, ist ja nun wirklich auch schon seeeeehr, sehr lange her von Version 0.9.0 auf 3.1.0 😉

                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        1.0k
                                        Online

                                        31.7k
                                        Users

                                        79.7k
                                        Topics

                                        1.3m
                                        Posts

                                        4
                                        18
                                        2190
                                        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