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 ,

      "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

                        521
                        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