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

                            487
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

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