Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Anpassung eines Scripts / Hilfe benötigt

    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

    Anpassung eines Scripts / Hilfe benötigt

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @opöl last edited by paul53

      @opöl sagte: Funktion ab Zeile 175 in diesem Script

      Die Funktion ist doppelt enthalten (auch ab Zeile 190).
      So ist die Funktion etwas übersichtlicher:

      function verschiebe_verbrauch_objekt(von, nach) {
          $(userdir + datenpunkt + '*.*.' + von).each(function (id) {   /*line changed by spacerx*/
              const verbrauch = getState(id).val;
              if (verbrauch != null) {
                  setState(id.replace(von, nach), verbrauch, true); // Schreibe Verbrauch in "nach"
              }
              setState(id, 0, true); // Setze "von" zurück
          });
      }
      
      O 1 Reply Last reply Reply Quote 0
      • O
        opöl @paul53 last edited by

        @paul53 ,

        Oops, ist mir entgangen. Habe ich korrigiert. Typischer Fall von Betriebsblindheit. Sorry.

        Das alleine kann es aber nicht gewesen sein, der DP heute ist ja letzte Nacht nicht genullt worden. Das Script läuft ohne Fehler.

        Kannst Du mir die fragliche Funktion entschlüsseln?
        Wenn ich sie verstehe, komme ich vielleicht weiter.
        Wie ich schrieb, geht es mir hauptsächlich um den Lerneffekt.

        Gruß

        paul53 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @opöl last edited by paul53

          @opöl sagte: Wenn ich sie verstehe, komme ich vielleicht weiter.

          Ich habe Kommentar ergänzt.
          Wo wird die Variable datenpunkt deklariert und gesetzt? Habe ich nicht gefunden.
          Funktioniert es so?

          function verschiebe_verbrauch_objekt(von, nach) {
              $(userdir + 'Einspeisung.*.' + von).each(function (id) { 
                  const verbrauch = getState(id).val;
                  if (verbrauch != null) {
                      setState(id.replace(von, nach), verbrauch, true); // Schreibe Verbrauch in "nach"
                  }
                  setState(id, 0, true); // Setze "von" zurück
              });
          }
          

          Überprüfe den Selektor mit

          log($(userdir + 'Einspeisung.*.heute'));
          

          am Skriptende.

          O 1 Reply Last reply Reply Quote 0
          • O
            opöl @paul53 last edited by

            @paul53 ,

            "userdir" + "datenpunkt" sind Benamsungen aus dem originalen Script. Die habe ich auskommentiert (vielleicht nicht komplett), weil sich sie in meinem Script nicht verwende.
            Meine Quell- und Zieldatenpunktordner sind:

            var quelldatenpunkt = ["0_userdata.0.Einspeisung.PV-Erzeugung-Counter", "0_userdata.0.Einspeisung.PV-Eigenverbrauch-Counter", "0_userdata.0.Einspeisung.PV-Einspeisung-Counter"];
            var zieldatenpunkt = ["0_userdata.0.Einspeisung.PV-Erzeugung", "0_userdata.0.Einspeisung.PV-Eigenverbrauch", "0_userdata.0.Einspeisung.PV-Einspeisung"];
            

            indiziert mit dem index (anz1) sowie den daran hängenden Datenpunkten

            var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche", "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert"];
            

            indiziert mit dem Index (anz2).

            Daher hatte ich es in Zeile 177 mit

            $('state[id=' + zieldatenpunkt[anz1]+ '*.*.' + von + ']').each(function (id, anz2) {
            

            versucht, was aber nicht klappt.

            Ich möchte also einen Wert von z.B.

            zieldatenpunkt[anz1].heute 
            

            nach

            zieldatenpunkt[anz1].gestern 
            

            verschieben und dann

            zieldatenpunkt[anz1].heute 
            

            auf "0" setzen.

            Und das ganze dann in einer Schleife für die Zieldatenpunkte 1-3 aus dem 1. Array und für die Objekte heute, diese_woche- dieser_monat und dieses_jahr.

            Und genau da komme ich mit der Funktion ins schleudern, weil ich die Syntax nicht blicke.

            Vielleicht habe ich mich da missverständlich ausgedrückt.

            Gruß

            paul53 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @opöl last edited by paul53

              @opöl sagte: was aber nicht klappt.

              Woher kommt anz1?
              So funktioniert der Selektor nicht. Prüfe den von mir geposteten Selektor. Er sollte 3 Datenpunkt-IDs mit "heute" liefern.

              $(userdir + 'Einspeisung.*.heute').each(function(id) {
                  log(id);
              });
              

              Wenn du das Array zieldatenpunkt verwenden willst, musst du es direkt mit dem Array machen:

              function verschiebe_verbrauch_objekt(von, nach) {
                  zieldatenpunkt.forEach(function(id) { 
                      const verbrauch = getState(id + '.' + von).val;
                      if (verbrauch != null) {
                          setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach"
                      }
                      setState(id + '.' + von, 0, true); // Setze "von" zurück
                  });
              }
              

              oder mit Schleife "for of"

              function verschiebe_verbrauch_objekt(von, nach) {
                  for(let id of zieldatenpunkt) { 
                      const verbrauch = getState(id + '.' + von).val;
                      if (verbrauch != null) {
                          setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach"
                      }
                      setState(id + '.' + von, 0, true); // Setze "von" zurück
                  }
              }
              
              O 1 Reply Last reply Reply Quote 1
              • O
                opöl @paul53 last edited by

                @paul53 ,

                die Variablen anz1 und anz2 sind in Zeile 30/31 definiert und indizieren die Objekte in den Arrays. Siehe ab Zeile 48 „Anlegen der Datenpunkte“.
                Wenn ich so drüber nachdenke, muss eigentlich zieldatenpunkt(anz1).objekt(8) nach
                zieldatenpunkt(anz1).objekt(7) in einer Schleife von anz1 =0 bis anz1= 2 verschoben werden, also von heute nach gestern. Der 1. Wert im Array hat ja den Index 0.

                Ich kann Deinen Vorschlag erst morgen testen. Ich melde mich dann. Vielen Dank erst einmal.

                Gruß

                1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @opöl last edited by

                  @opöl
                  Du mal so als Anregung.
                  Für sowas sind Datenbanken prädestiniert.
                  Man schreibt regelmäßig nur die rohdaten in die Datenbank.
                  Zu einem späteren Zeitpunkt kann man die dann schön aggregieren nach verschiedenen Zeitscheiben, vergleichen, etc.
                  Alles dynamisch

                  1 Reply Last reply Reply Quote 1
                  • Codierknecht
                    Codierknecht Developer Most Active last edited by

                    @opöl
                    Das was @OliverIO schreibt.
                    Und wenn es darum geht, dass diese "Datenbank" (Influx, MySQL, MariaDB etc.) bestimmte Werte (Tagesverbrauch) nur 1x am Tag protokollieren soll, kann man den Wert (z.B. ENERGY_Today) per Script um 23:59 in einen eigenen DP schreiben und diesen historisieren. So hat man dann pro Tag genau 1 Wert mit passendem Timestamp in der DB.

                    Der Vorteil von Datenbanken: Damit hat man dann echte Langzeitwerte, die man zu einem beliebigen Zeitpunkt über beliebige Zeiträume aggregieren kann.

                    O 1 Reply Last reply Reply Quote 0
                    • O
                      opöl @Codierknecht last edited by

                      @codierknecht , @OliverIO ,

                      das ist doch genau das, was ich erreichen möchte. Die Rohdaten stehen bereits in der influx DB und sollen für die grafische Auswertung zu bestimmten Zeitpunkten in separate Datenpunkte (Woche, Monat...) geschrieben werden.

                      Mir hat das Wissen über die Funktionsweise der "for each" Methode gefehlt. Habe ich mir inzwischen angelesen und mit @paul53 's Anregung:

                      function verschiebe_verbrauch_objekt(von, nach) {
                         zieldatenpunkt.forEach(function(id) { 
                             const verbrauch = getState(id + '.' + von).val; // Hole Verbrauch "von" 
                             console.error("id= " + id);
                             console.error("Verbrauch= " + verbrauch);
                             if (verbrauch != null) {
                                 setState(id + '.' + nach, verbrauch, true); // Schreibe Verbrauch in "nach"
                             }
                             setState(id + '.' + von, 0, true);              // Setze "von" zurück
                         });
                      }
                      

                      sowie eines zeitgesteuerten Aufrufs dieser Funktion in meinem Script wurden die Datenpunkte "heute" nach "gestern" kopiert und im Anschluss auf "0" gesetzt, also genau das, was ich erreichen wollte.

                      Ich lasse das jetzt mal bis Sonntag laufen, bis dahin sollte ich dann die täglichen und die ersten wöchentlichen Aktualisierungen haben.

                      Wenn alles klappt, setze ich diesen Thread dann auf "gelöst", andernfalls melde ich mich nochmal. Vielen Dank an Euch alle.

                      Gruß

                      O 1 Reply Last reply Reply Quote 0
                      • O
                        opöl @opöl last edited by

                        @paul53 ,

                        die Tageswerte wurden seit dem 10.1. alle wie geplant aktualisiert bzw. zurückgesetzt und am Sonntag um 23:59 wurden ebenfalls die Datenpunkte "letzte_woche" aktualisiert und die DPs "diese_woche" genullt. Deine Funktion tut also, was ich möchte. Vielen Dank für Deine Hilfe.

                        Ich hätte da aber noch abschließend zwei Verständnis Fragen:

                        1. Beim Anlegen der DPs per Script habe ich bereits früher einen Flüchtigkeitsfehler eingebaut, den ich erst jetzt bemerkt habe. Statt der DP Namen habe ich beim Anlegen der DPs die Beschreibung in die Definition geschrieben. Kann ich das nachträglich im Script korrigieren oder werden dann die DPs noch einmal neu angelegt und die bisher gespeicherten Werte sind weg?
                          Siehe Zeile 2 -> Objekt Array (Namen der DPs) und Zeile 14 -> DP Name.
                        // Verbrauchs Objekte 
                        var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche", "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert"];
                        // Beschreibung der Objekte
                        var beschreibung = ["Gesamt", "Aktuelles Jahr", "Letztes Jahr", "Letzter Monat", "Aktueller Monat", "Letzte Woche", "Aktuelle Woche", "Gestern", "Heute", "Messwert alt", "Messwert neu"];
                        
                        // Erstelle die benötigten Datenpunkte
                        function datenpunkte_erstellen() {
                            // Anzahl der Quelldatenpunkt Ordner
                            for (anz1 = 0; anz1 < quelldatenpunkt.length ; anz1++) {
                                var initial_wert = 0.0;
                                // Anzahl der neuen Datenpunkte
                                for (anz2 = 0; anz2 < objekt.length; anz2++) {
                                    createState(zieldatenpunkt[anz1] + "." + objekt[anz2], initial_wert, ueberschreiben, {
                                        name: beschreibung[anz2], <-- Hier sollte "objekt[anz2]" stehen, also die Objekt Namen aus dem Array
                                        desc: beschreibung[anz2],
                                        type: "number",
                                        role: "value.power",
                                        unit: "Wh"
                                    });
                                }
                            }
                        }
                        
                        

                        So sieht z.B. der DP 0_userdata.0.Einspeisung.PV-Erzeugung.letzte_woche aus:

                        {
                          "common": {
                            "name": "Letzte Woche",
                            "desc": "Letzte Woche",
                            "type": "number",
                            "role": "value.power",
                            "unit": "Wh",
                        
                        1. Warum steht in Deiner Funktion
                        function verschiebe_verbrauch_objekt(von, nach) {
                            zieldatenpunkt.forEach(function(id) { 
                                const verbrauch = getState(id + '.' + von).val;
                                if (verbrauch != null) {
                                    setState(id + '.' + nach), verbrauch, true); // Schreibe Verbrauch in "nach"
                                }
                                setState(id + '.' + von, 0, true); // Setze "von" zurück
                            });
                        }
                        

                        die Zeile 7 nicht innerhalb der "If" Anweisung, also vor der geschlossenen Klammer in Zeile 6?
                        In meinem Fall (Quelldatenpunkte sind vorhanden) kann der Verbrauch doch nicht "null" zurück liefern. Verbrauch = null kann doch nur vorkommen, wenn es zu einem Array Wert keinen "von" Wert gibt, dann muss dieser aber auch nicht zurückgesetzt werden. Oder andersrum: Nur wenn "von" existiert und einen Wert hat, muss "nach" aktualisiert und "von" resettet werden.
                        Ich würde mich freuen, wenn Du mich da noch kurz abholen könntest.

                        Nochmals Danke und Gruß

                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @opöl last edited by paul53

                          @opöl sagte: Kann ich das nachträglich im Script korrigieren

                          Korrigiere es besser im Tab "Objekte" (Bleistift rechts).

                          @opöl sagte in Anpassung eines Scripts / Hilfe benötigt:

                          Zeile 7 nicht innerhalb der "If" Anweisung

                          ... weil ich es so aus dem Original-Skript übernommen habe.

                          EDIT: Verbrauchswerte sind Zahlen, weshalb ich den Vergleich verbrauch != null ohnehin nicht verstanden habe. Er dürfte immer erfüllt sein.

                          O 1 Reply Last reply Reply Quote 0
                          • O
                            opöl @paul53 last edited by

                            @paul53 ,
                            ich denke, das wurde eingefügt, weil ja die Schleife für alle Werte des Arrays durchlaufen wird, unabhängig davon, ob es einen „von“ und „nach“ Datenpunkt gibt. Z.B. für den DP „gesamt“ gibt es keine Notwendigkeit, Werte zu verschieben. Ergo gibt es „von“ nicht und daher wird von einem nicht existierenden DP ein „null“ zurückgegeben. Da entfällt aber auch die Notwendigkeit, etwas nicht existentes zu nullen.
                            Die If Anweisung wirkt quasi als Filter, damit nur da verschoben und genullt wird, wo das benötigt wird.

                            So zumindest mein Verständnis…

                            Ich probiere es mal aus.

                            Gruß

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @opöl last edited by

                              @opöl sagte: unabhängig davon, ob es einen „von“ und „nach“ Datenpunkt gibt.

                              Ich habe mir nicht das komplette Skript angesehen.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              821
                              Online

                              31.9k
                              Users

                              80.1k
                              Topics

                              1.3m
                              Posts

                              4
                              14
                              477
                              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