Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Wert eines Datenpunktes ändern und als neuen DP darstellen

    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

    Wert eines Datenpunktes ändern und als neuen DP darstellen

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

      Wert eines Datenpunktes ändern/berechnen und als neuen Datenpunkt darstellen

      Hallo,
      ich hab ioBroker schon seit einiger Zeit laufen, aber leider sind einige Werte nicht so wie ich sie benötige.

      Beispiel: Der Strom Bezug vom Smartmeter "smartmeter.0.1-0:1_8_0__255.value" zeigt mir den Zählertstand meines Stromzählers an. Ich möchte aber den Verbrauch von 2021 haben und daher müssten von dem Wert 418kw abgezogen werden. Das Ganze soll dann auf 2 Stellen hinter dem Komma gerundet sein.
      Wie man einen Datenpunkt in JS erstellt habe ich gefunden :
      https://forum.iobroker.net/topic/21028/eigene-objekte-datenpunkte/4

      Für das Habpanel hab ich das hin bekommen, aber wie das nun ein JS wird weiss ich noch nicht.

      <div style="padding-bottom:1px;">{{config.device_name}}</div>
      <div style="color: deepskyblue; font-size: 14pt">{{'%.2f' | sprintf:itemValue("smartmeter.0.1-0:1_8_0__255.value") - 418}} kWh</span></div>
      

      Es muss ein eigener Datenpunkt werden, da ich die Daten auch für meinen MagicMirror abgreife.

      Kann mir da jemand helfen?

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

        @c1olli
        Vorschlag:

        // aktuellen Jahresverbrauch berechnen
        const idStand = 'smartmeter.0.1-0:1_8_0__255.value';
        const idAkt = '0_userdata.0.Verbrauch.Jahr_aktuell';
        const idJahr = '0_userdata.0.Verbrauch.Stand_Jahresende';
        
        var jahr = 418;
        if(existsState(idJahr)) jahr = getState(idJahr).val;
        else createState(idJahr, jahr, {type: 'number', name: 'Zählerstand Jahresende', unit: 'kWh', role: 'value'});
        
        var stand = getState(idStand).val;
        var aktuell = Math.round((stand - jahr) * 100) / 100;
        if(existsState(idAkt)) setState(idAkt, aktuell, true);
        else createState(idAkt, aktuell, {type: 'number', name: 'aktueller Jahesverbrauch', unit: 'kWh', role: 'value'});
        
        on(idStand, function(dp) {
           stand = dp.state.val;
           aktuell = Math.round((stand - jahr) * 100) / 100;
           setState(idAkt, aktuell, true);
        });
        
        schedule('59 23 31 12 *', function() {
           jahr = Math.round(stand * 100) / 100;
           setState(idJahr, jahr, true)
        });
        
        C 2 Replies Last reply Reply Quote 0
        • C
          c1olli @paul53 last edited by c1olli

          @paul53
          Ich bin begeistert - wie Du das so mal eben aus dem Ärmel geschüttelt hast. 👍 👍 👍

          Die neuen Daten werden sauber angezeigt.

          Jetzt werde ich das mal für die anderen Werte adaptieren und hoffe, dass das dann auch so geschmeidig läuft.

          Gruß
          Olli

          1 Reply Last reply Reply Quote 0
          • C
            c1olli @paul53 last edited by c1olli

            @paul53
            So die Daten konnten eingearbeitet werden und werden nun auch erfolgreich an den MagicMirror weitergegeben.

            Nun brauche ich noch einen Wert
            fronius.0.powerflow.E_Year

            Dort werden die Daten in Wh ausgegeben, was natürlich ein hoher unübersichtlicher Wert ist.

            Also soll er durch 1000 geteilt werden damit die Ausgabe dann in kWh stattfindet und auch auf 2 Stellen gerundet werden.

            Edit: Ich konnte Dein Script so abändern, dass es jetzt funktioniert 😊
            Vielen Dank

            Gruß
            Olli

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

              @c1olli sagte: durch 1000 geteilt werden damit die Ausgabe dann in kWh stattfindet und auch auf 2 Stellen gerundet werden.

              Math.round(dp.state.val / 10) / 100;
              
              C 1 Reply Last reply Reply Quote 0
              • C
                c1olli @paul53 last edited by

                @paul53

                Läuft alles so wie gewünscht vielen Dank noch einmal.

                Gruß
                Olli

                C 1 Reply Last reply Reply Quote 0
                • C
                  c1olli @c1olli last edited by

                  @paul53
                  Ein halbes Jahr liefen die Scipts ohne Probleme sauber durch.

                  Nun verweigert eines den Dienst.

                  Als Script dient die Vorlage oben, die dann geändert habe.
                  Es soll der aktuelle Jahresverbrauch kumuliert aus Strom aus dem Netz und der PV Anlage addiert werden.
                  Das Ergebnis steht dann im Habpanel und auf dem MagicMirror.

                  Wenn ich das Script starte wird die Addition auch sauber durchgeführt und die Datenpunkte befüllt.
                  Dann aber wird nur noch die Änderung des Wertes der PV Anlage addiert, die Änderung des Netzstromes aber nicht mehr.

                  // aktuellen Jahresverbrauch Strom berechnen
                  // Strom Bezug + Strom Eigennutzung PV
                  const idAkt = '0_userdata.0.Gesamtverbrauch_Strom.Jahr_aktuell';
                  const idVerb = '0_userdata.0.Verbrauch.Jahr_aktuell';
                  const idJahr = '0_userdata.0.Eigenverbrauch.Jahr_aktuell';
                  
                  var jahr = getState(idJahr).val;
                  var verb = getState(idVerb).val;
                  var aktuell = Math.round((jahr+verb) * 100) / 100;
                  if(existsState(idAkt)) setState(idAkt, aktuell, true);
                  else createState(idAkt, aktuell, {type: 'number', name: 'aktueller Jahresverbrauch Strom', unit: 'kWh', role: 'value'});
                  on(idJahr, function(dp) {
                  jahr = dp.state.val;
                  aktuell = Math.round((jahr+verb) * 100) / 100;
                  setState(idAkt, aktuell, true);
                  });
                  schedule('59 23 31 12 *', function() {
                  jahr = Math.round(jahr * 100) / 100;
                  setState(idJahr, jahr, true)
                  });
                  

                  Woran kann das liegen?

                  PV Eigenverbrauch Jahr = 0_userdata.0.Eigenverbrauch.Jahr_aktuell
                  Netz Eigenverbrauch Jahr = 0_userdata.0.Gesamtverbrauch_Strom.Jahr_aktuell
                  Ergebnis = 0_userdata.0.Gesamtverbrauch_Strom.Jahr_aktuell

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

                    @c1olli sagte: Vorlage oben, die dann geändert habe.

                    Das hat mit der Vorlage nichts mehr zu tun.
                    Ersetze schedule() (ab Zeile 17) durch

                    on(idVerb, function(dp) {
                       verb = dp.state.val;
                       aktuell = Math.round((jahr+verb) * 100) / 100;
                       setState(idAkt, aktuell, true);
                    });
                    
                    C 1 Reply Last reply Reply Quote 0
                    • C
                      c1olli @paul53 last edited by

                      @paul53
                      Ja, da sind schon einige Änderungen drin, aber Dank Dir habe ich wenigstens verstanden wie die Berechnungen durchgeführt und die Werte eingefangen werden.
                      Für einen alten Sack wie mich ist das leider nicht mehr so einfach wie früher etwas neues zu lernen.

                      Ich habe nun die Zeilen getauscht, nun werde ich das Ganze beobachten und berichten.

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

                        @c1olli sagte: Für einen alten Sack wie mich

                        Wirklich so alt?

                        C 1 Reply Last reply Reply Quote 0
                        • C
                          c1olli @paul53 last edited by

                          @paul53
                          Kommt auf die Sichtweise an - 54 Jahre = ab 50 ist man bei uns ein alter Sack.

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

                            @c1olli sagte: 54 Jahre

                            Jungspund! Bin "nur" 15 Jahre älter und habe vor ca. 6 Jahren angefangen, Javascript zu lernen.

                            C crunchip 3 Replies Last reply Reply Quote 0
                            • C
                              c1olli @paul53 last edited by

                              @paul53
                              Verdammte Axt - meinen Respekt.

                              Ich selbst beschäftige mich mehr mit 3D Druck, aber so ein paar Spielereien wie ioBroker, MagicMirror Smart Home und Raspberry Pi sind total interessant.

                              1 Reply Last reply Reply Quote 0
                              • crunchip
                                crunchip Forum Testing Most Active @paul53 last edited by

                                @paul53 sagte in Wert eines Datenpunktes ändern und als neuen DP darstellen:

                                "nur" 15 Jahre älter

                                haha, da bin ich 25J jünger, bekomm das trotzdem nicht gebacken, Javascript sind für mich sprichwörtlich "böhmische Dörfer"

                                1 Reply Last reply Reply Quote 0
                                • C
                                  c1olli @paul53 last edited by

                                  @paul53
                                  So das Script läuft jetzt wie es soll

                                  Beim Neustart habe ich gesehen, dass nun 2 Subscriptions statt einer, dafür aber kein Schedule aufgerufen wird.

                                  Heisst das, dass der neue Teil den 2. Datenpunkt nun direkt anspricht?

                                  Weißt Du eine Seite die das Ganze gut beschreibt um Javascript zu lernen?

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

                                    @c1olli sagte: Heisst das, dass der neue Teil den 2. Datenpunkt nun direkt anspricht?

                                    Ja, er triggert auf Wertänderung des Datenpunktes '0_userdata.0.Verbrauch.Jahr_aktuell'.

                                    @c1olli sagte in Wert eines Datenpunktes ändern und als neuen DP darstellen:

                                    Seite die das Ganze gut beschreibt um Javascript zu lernen?

                                    Wenn Du bereits über Programmierkenntnisse in einer anderen Sprache verfügst, helfen sicherlich selfhtml und Mozilla weiter.

                                    C 1 Reply Last reply Reply Quote 0
                                    • C
                                      c1olli @paul53 last edited by

                                      @paul53
                                      Nee, ich habe mal vor Urzeiten mit meinem 386er ein wenig Basic gelernt, aber das ist auch schon über 30 Jahre her.
                                      Ansonsten habe ich mich immer mit Tools beholfen.
                                      Auch die Firmware für meine 3D Drucker kompiliere ich über ein online Tool.
                                      Frei nach dem Motto KISS.

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

                                        @c1olli sagte: Basic gelernt

                                        Immerhin: Basic ist auch eine Skriptsprache, allerdings mit vielen Dialekten.

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        418
                                        Online

                                        31.8k
                                        Users

                                        80.0k
                                        Topics

                                        1.3m
                                        Posts

                                        3
                                        18
                                        560
                                        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