Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Frage] javascript-code zum Auslesen von Ertragswerten

    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

    [Frage] javascript-code zum Auslesen von Ertragswerten

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

      Wer kann mir mit Javascript etwas helfen?

      Ich habe folgenden Code:

      const loggingTemplate = {
         'fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.6': 'exportedWh',
         'fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.6': 'importedWh',
         'fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.6': 'generatedWh',
      };
      

      Nun ist es so, dass in dem Codebeispiel die Zahl 6 der Tag des Monats ist, der sich natürlich jeden Tag ändert. Wie kann ich das "variabel" machen, dass z.B. heute am 07.03. dort statt der 6 die Zahl 7 steht?

      Homoran 1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators @norbert999 last edited by

        @norbert999 Ist/Wird das jetzt eine [Anleitung] wie der Threadtitel suggeriert, oder ist das eine Frage und du brauchst Hilfe?

        N 1 Reply Last reply Reply Quote 0
        • N
          norbert999 @Homoran last edited by

          @homoran Sorry, das wird keine Anleitung von mir, sondern ich brauche die Anleitung, wie ich das machen könnte.

          Codierknecht T 2 Replies Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @norbert999 last edited by Codierknecht

            @norbert999 sagte in [Anleitung] javascript-code zum Auslesen von Ertragswerten:

            ich brauche die Anleitung

            Dann nimm das bitte aus dem Titel raus. Sonst denkt jeder, dass Du hier eine Anleitung zeigen möchtest.

            const day = new Date().getDate();
            
            const loggingTemplate = {};
            
            loggingTemplate[`fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.${day}`] = 'exportedWh';
            loggingTemplate[`fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.${day}`] = 'importedWh';
            loggingTemplate[`fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.${day}`] = 'generatedWh';
            
            console.log(loggingTemplate);
            
            1 Reply Last reply Reply Quote 2
            • T
              ticaki Developer @norbert999 last edited by ticaki

              @norbert999

              new Date().getDate()

              Damit bekommst du die 6

              const loggingTemplate = {}
              loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()]: 'exportedWh',
              

              EDIT: die muß stimmen wenns 2 mal die gleiche gibt 😄

              N 1 Reply Last reply Reply Quote 0
              • N
                norbert999 @ticaki last edited by

                @ticaki said in [Anleitung] javascript-code zum Auslesen von Ertragswerten:

                                                                                                                                            const loggingTemplate = {}                                                                                                                                                                            loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()]: 'exportedWh',                                            
                

                Vielen Dank für die rasche Antwort. Habe das so testweise umgesetzt:

                
                new Date().getDate();
                
                const loggingTemplate = {}
                    loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()]: 'exportedWh';
                    loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.' + new Date().getDate()]: 'importedWh';
                    loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.' + new Date().getDate()]: 'generatedWh';
                
                

                Gibt aber leider einen Fehler:

                javascript.0	08:46:02.645	info	Start JavaScript script.js.smarthome_trost.history_influxdb2 (Javascript/js)
                javascript.0	08:46:02.645	error	script.js.smarthome_trost.history_influxdb2 compile failed: at script.js.smarthome_trost.history_influxdb2:26
                

                Die Zeile 26, auf die sich der Fehler bezieht, ist in meinem Codepost die Zeile 5

                T 1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer @norbert999 last edited by

                  @norbert999 sagte in [Frage] javascript-code zum Auslesen von Ertragswerten:

                  const loggingTemplate = {} loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()]: 'exportedWh'; loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.' + new Date().getDate()]: 'importedWh'; loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.' + new Date().getDate()]: 'generatedWh';

                  Hab einen Fehler drin - @Codierknecht hats richtig 🙂

                  loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()] = 'exportedWh';
                  

                  direkt im Forum code zu schreiben sollte ich sein lassen 🙂

                  N 1 Reply Last reply Reply Quote 1
                  • N
                    norbert999 @ticaki last edited by

                    @ticaki
                    Es funktioniert! Du hast mir so super geholfen, tausend Dank!
                    Ich habe jetzt dadurch eine Methode, wie ich jetzt per javascript Datenpunkte aus iob auslesen kann und in die influxdb2 schreiben kann.
                    Das script dazu habe ich von Matthias Kleine übernommen, aber das konnte eben nicht aggregierte Daten aus iob auslesen (wenn sich der Name des Datenpunkts z.B. jeden Tag geändert hat.)
                    Ich möchte Dir nochmals danken! Ich würde auch gern "Codierknecht" danken, weiss aber nicht wie ich das über das Forum anstellen kann.

                    N Codierknecht 2 Replies Last reply Reply Quote 0
                    • N
                      norbert999 @norbert999 last edited by

                      @norbert999 said in [Frage] javascript-code zum Auslesen von Ertragswerten:

                      @ticaki
                      Es funktioniert! Du hast mir so super geholfen, tausend Dank!
                      Ich habe jetzt dadurch eine Methode, wie ich jetzt per javascript Datenpunkte aus iob auslesen kann und in die influxdb2 schreiben kann.
                      Das script dazu habe ich von Matthias Kleine übernommen, aber das konnte eben nicht aggregierte Daten aus iob auslesen (wenn sich der Name des Datenpunkts z.B. jeden Tag geändert hat.)
                      Ich möchte Dir nochmals danken! Ich würde auch gern "Codierknecht" danken, weiss aber nicht wie ich das über das Forum anstellen kann.

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

                        @norbert999 sagte in [Frage] javascript-code zum Auslesen von Ertragswerten:

                        weiss aber nicht wie ich das über das Forum anstellen kann

                        Wenn ein Beitrag hilfreich war, kannst Du diesen Beitrag unten rechts dahingehend markieren.

                        N 1 Reply Last reply Reply Quote 1
                        • N
                          norbert999 @Codierknecht last edited by

                          @codierknecht

                          Du hattest mir so toll geholfen mit dem script von Matthias Kleine um Ertragsdaten aus dem iob in die influxdb2 zu schreiben. Das Problem bei mir war, dass das im iob bereits aggregierte Daten für, den betreffenden Tag des Monats sind, d.h. der Name des Datenpunkts "ändert sich jeden Tag".

                          Das funktioniert soweit.

                          Allerdings jetzt ein neues "Problemchen": Wenn um 24h nachts sich der Tag des Monats ändert, dann schreibt das script trotzdem die letzten Werte des alten Tags weiter in die influxdb und nimmt nicht den Wert der aktualisierten Datenpunkte für den aktuellen Tag.

                          Das hier ist das script so, wie es jetzt ist:

                          // Kopiert Daten für eine Zeitreihendarstellung in die influxdb2
                          // script von von Matthias Kleine
                          // https://haus-automatisierung.com/software/2023/05/11/influxdb2-pv-dashboard.html
                          // v.0.3
                          //
                          const influxDbInstance = 'influxdb.0';
                          const token = '***mein token***';
                          const measurement = 'energy-stats';
                          
                          // Modifikation des scripts von Matthias Kleine um aus den aggregierten fronius-Daten für den Tag den 
                          // entsprechenden Tag des Monats auslesen zu können. 
                          // Diese Umsetzung kommt von "ticaki" und "codierknecht" aus dem 
                          // iob-forum deutsch. Posts dazu siehe 
                          // https://forum.iobroker.net/topic/80183/frage-javascript-code-zum-auslesen-von-ertragswerten/8?_=1741455458605
                          
                          const loggingTemplate = {}
                           //       loggingTemplate['0_userdata.0.Photovoltaik.BattLoadState'] = 'batteryWh';   
                                  loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.' + new Date().getDate()] = 'exportedWh';   
                                  loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.' + new Date().getDate()] = 'importedWh';
                                  loggingTemplate['fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.' + new Date().getDate()] = 'generatedWh';
                          // Wallbox fehlt   
                          
                          const loggingObj = {};
                          
                          async function start() {
                              const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`);
                          
                              const protocol = influxDbInstanceConfig.native.protocol;
                              const host = influxDbInstanceConfig.native.host;
                              const port = influxDbInstanceConfig.native.port;
                              const org = influxDbInstanceConfig.native.organization;
                              const bucket = influxDbInstanceConfig.native.dbname;
                          
                              console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`);
                          
                           // Init loggingObj with current values
                              for (let [objId, key] of Object.entries(loggingTemplate)) {
                                  const state = await getStateAsync(objId);
                          
                                  if (state && !isNaN(state.val)) {
                                      loggingObj[key] = state.val;
                                  } else {
                                      loggingObj[key] = 0;
                                  }
                              }
                          
                              on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => {
                                  // Update value in loggingObj
                                  const key = loggingTemplate[obj.id];
                                  loggingObj[key] = obj.state.val;
                          
                                  // Save Data
                                  const data = `${measurement} ${Object.keys(loggingObj)
                                      .filter(key => !isNaN(loggingObj[key]))
                                      .map((key) => `${key}=${loggingObj[key]}`)
                                      .join(',')}`;
                          
                                  if (data) {
                                      // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`);
                          
                                      httpPostAsync(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, {
                                          headers: {
                                              'Content-Type': 'text/plain',
                                              'Authorization': `Token ${token}`
                                          }
                                      }).catch(err => console.error(err));
                                  }
                              });
                          }
                          start();
                          

                          Könntest Du mir bitte noch einmal helfen und Dir den code anschauen? Bin leider kein js Faschmann. Die Hoffnung von mir ist, dass man das "leicht" modifizieren kann.

                          Wäre toll, wenn Du eine Idee hättest.

                          Codierknecht haus-automatisierung 2 Replies Last reply Reply Quote 0
                          • Codierknecht
                            Codierknecht Developer Most Active @norbert999 last edited by Codierknecht

                            @norbert999 sagte in [Frage] javascript-code zum Auslesen von Ertragswerten:

                            Wenn um 24h nachts sich der Tag des Monats ändert, dann schreibt das script trotzdem die letzten Werte des alten Tags weiter in die influxdb und nimmt nicht den Wert der aktualisierten Datenpunkte für den aktuellen Tag.

                            Was auch eigentlich logisch ist.
                            Du besetzt das Objekt ja nur 1x beim Start des Script. Wenn Du also heute das Script startest, wird mit den Datenpunkten ...values.10 gearbeitet.
                            Heute Nacht wird aus der 10 eine 11. Davon kriegt Dein Objekt aber nix mit.

                            Das alleine wäre jetzt kein so großes Problem.
                            Aber Dein Trigger ist ja auch darauf registriert. Das macht das Ganze dann deutlich komplizierter.

                            Im einfachsten Fall richtest Du (in einem anderen Script) ein Schedule für 0 0 * * * ein und startest damit Dein Script neu. Nicht schön, aber selten 😁

                            Vielleicht hat @haus-automatisierung ja noch eine bessere Idee.

                            1 Reply Last reply Reply Quote 0
                            • N
                              norbert999 last edited by

                              @codierknecht

                              Danke für Deine Erläuterung.

                              Wie mache ich das denn mit "einem anderen script" über den von Dir angesprochenen schedule?

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

                                @norbert999 sagte in [Frage] javascript-code zum Auslesen von Ertragswerten:

                                Wie mache ich das denn mit "einem anderen script" über den von Dir angesprochenen schedule?

                                Entweder Blockly

                                fbc90635-0d5d-4875-94cf-c9c0f8d83388-image.png
                                Oder JS

                                schedule("0 0 * * *", function() {
                                  startScript('dein_zu_startendes_script');
                                });
                                

                                Ein bereits laufendes Script wird damit neu gestartet.

                                N 1 Reply Last reply Reply Quote 1
                                • N
                                  norbert999 @Codierknecht last edited by

                                  @codierknecht Danke Dir. Werde ich von heute auf morgen ausprobieren. Melde mich wieder!

                                  1 Reply Last reply Reply Quote 0
                                  • haus-automatisierung
                                    haus-automatisierung Developer Most Active @norbert999 last edited by

                                    @norbert999 sagte in [Frage] javascript-code zum Auslesen von Ertragswerten:

                                    d.h. der Name des Datenpunkts "ändert sich jeden Tag".

                                    Dafür ist das Script ja gar nicht ausgelegt und müsste komplett umgeschrieben werden. Also beim Tageswechsel den Trigger löschen und neu anlegen.

                                    Asgothian 1 Reply Last reply Reply Quote 1
                                    • Asgothian
                                      Asgothian Developer @haus-automatisierung last edited by Asgothian

                                      Mal eine dumme Frage:
                                      Gibt es alle datenpunkte schon, oder werden die am entsprechenden Tag neu erstellt ? Wenn es die schon gibt würde ich nur 2 Dinge umschreiben:

                                      • selektor für die triggerung
                                      • Erkennung des Ziels nicht mit der vollen ID sondern aus einem Teil davon. Da dieser im Festen Teil der ID steht kann das im jeweiligen selektor trigger fest vergeben werden.

                                      Dann kann man sich die ganze trigger umschreiberei sparen, und das Skript kann einfach durchlaufen - die datenpunkte die nicht zu “heute” gehören sollten sich ja auch nicht mehr ändern

                                      A.
                                      P.s. ein Beispiel kann ich liefern, aber erst in einer Stunde - bin noch mobil 🙂

                                      N 1 Reply Last reply Reply Quote 1
                                      • N
                                        norbert999 @Asgothian last edited by

                                        @asgothian
                                        Super! Danke für Deine Antwort.

                                        Die Datenpunkte für die Tagesproduktion der Energie gibt es schon alle. Nur werden die Datenpunkte um 0:00h "neu befüllt" (z.B. mit dem Wert 0 für die aktuelle Tagesproduktion der Fotovoltaik am neuen, aktuellen Tag. Das macht der fronius-solarwebadapter automatisch), da ja ein neuer Tag beginnt und die aggregierten Energiewerte des Vortages nicht mehr relevant sind.

                                        Wäre super, wenn Du mir helfen würdest!

                                        Asgothian 1 Reply Last reply Reply Quote 0
                                        • Asgothian
                                          Asgothian Developer @norbert999 last edited by

                                          @norbert999

                                          So sollte es gehen.
                                          Schlüssel ist das es 3 Trigger auf Selektoren gibt, die jeweils alle gleichartigen Datenpunkte erfassen, so das dann das Abspeichern entsprechend laufen kann.
                                          Die Abfrage das der Wert nicht 0 sein soll ist wichtig, damit ein 0-Setzen des Wertes nicht in die Datenbank geschrieben wird, wenn am Anfang des Tages alle DP auf 0 gesetzt werden.

                                          testen konnte ich es nur teilweise - ich hab weder einen Fronius noch eine Influxdb zum rein schreiben.

                                          Es sollte trotzdem gehen, da ich am Ende nur den einen Trigger durch 3 Trigger auf die 3 Selektoren ersetzt hab, deswegen muss ich den 'key' manuell übergeben, und das eigentliche Schreiben ist ausgelagert in eine externe funtktion.

                                          A.

                                          
                                          // Kopiert Daten für eine Zeitreihendarstellung in die influxdb2
                                          // script von von Matthias Kleine
                                          // https://haus-automatisierung.com/software/2023/05/11/influxdb2-pv-dashboard.html
                                          // v.0.3
                                          //
                                          const influxDbInstance = 'influxdb.0';
                                          const token = '***mein token***';
                                          const measurement = 'energy-stats';
                                           
                                          // Modifikation des scripts von Matthias Kleine um aus den aggregierten fronius-Daten für den Tag den 
                                          // entsprechenden Tag des Monats auslesen zu können. 
                                          // Diese Umsetzung kommt von "ticaki" und "codierknecht" aus dem 
                                          // iob-forum deutsch. Posts dazu siehe 
                                          // https://forum.iobroker.net/topic/80183/frage-javascript-code-zum-auslesen-von-ertragswerten/8?_=1741455458605
                                           
                                          const loggingObj = {};
                                          
                                          async function Store(key, value) {
                                              loggingObj[key] = obj.state.val;
                                           
                                              // Save Data
                                              const data = `${measurement} ${Object.keys(loggingObj)
                                                  .filter(key => !isNaN(loggingObj[key]))
                                                  .map((key) => `${key}=${loggingObj[key]}`)
                                                  .join(',')}`;
                                          
                                              if (data) {
                                                  // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`);
                                          
                                                  httpPostAsync(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, {
                                                      headers: {
                                                          'Content-Type': 'text/plain',
                                                          'Authorization': `Token ${token}`
                                                      }
                                                  }).catch(err => console.error(err));
                                              }
                                          }
                                          
                                          
                                          async function start() {
                                              const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`);
                                           
                                              const protocol = influxDbInstanceConfig.native.protocol;
                                              const host = influxDbInstanceConfig.native.host;
                                              const port = influxDbInstanceConfig.native.port;
                                              const org = influxDbInstanceConfig.native.organization;
                                              const bucket = influxDbInstanceConfig.native.dbname;
                                           
                                              console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`);
                                           
                                           // Init loggingObj with current values
                                              for (let [objId, key] of Object.entries(loggingTemplate)) {
                                                  const state = await getStateAsync(objId);
                                           
                                                  if (state && !isNaN(state.val)) {
                                                      loggingObj[key] = state.val;
                                                  } else {
                                                      loggingObj[key] = 0;
                                                  }
                                              }
                                           
                                              on({ id: $('channel[state.id=fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyFeedIn.values.*'), change: 'ne' }, async (obj) => {
                                                  if (obj.state.val != 0) Store('exportedWh', obj.state.val)
                                              });
                                              on({ id: $('channel[state.id=fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyPurchased.values.*'), change: 'ne' }, async (obj) => {
                                                  if (obj.state.val != 0) Store('importedWh', obj.state.val)
                                              });
                                              on({ id: $('channel[state.id=fronius-solarweb.0.96605a5f-da06-4373-b8d5-b985faa71359.day.EnergyProductionTotal.values.*'), change: 'ne' }, async (obj) => {
                                                  if (obj.state.val != 0) Store('generatedWh', obj.state.val)
                                              });
                                          }
                                          start();
                                          
                                          
                                          
                                          N 2 Replies Last reply Reply Quote 1
                                          • N
                                            norbert999 @Asgothian last edited by

                                            @asgothian
                                            Du bist super. Danke für Dein script. Kann ich heute Nacht nicht mehr umsetzen, mache ich morgen im Laufe des Tages. Danach werde ich es erst mal über Nacht laufen lassen um zu schauen, was passiert.
                                            Ich werde mich wieder melden wenn ich darf.
                                            Nochmals tausend Dank bis hierher.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            730
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript template
                                            6
                                            21
                                            769
                                            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