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: 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

                          834
                          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