Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Blockly - Mit getHistory Daten aus InfluxDB auslesen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Blockly - Mit getHistory Daten aus InfluxDB auslesen

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

      Moin zusammen,

      mit der aktuellen Javascript-Version 7.1.4 kommt auch ein neuer Blockly Baustein namens getHistory.
      Damit soll man Werte aus z. B. der InfluxDB auslesen können.

      7a09c9cf-54bb-44dd-89ab-e2e2d1967d7c-image.png

      Leider komme ich nicht dahinter, wie dieser Baustein funktioniert. 🙈
      Auch mit anderen Javascript-Beispielen aus anderen Artikel und Google verstehe ich es einfach nicht.

      Ich möchte gerne aus meiner InfluxDB die Summe des heute eingespeisten Stroms abfragen.
      Als FLUX wäre das:

      from(bucket: "smarthome")
        |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
        |> filter(fn: (r) => r._measurement == "energy")
        |> filter(fn: (r) => r._field == "exportedWh")
        |> difference()
        |> sum()
      

      Kann mir bitte jemand unter die Arme greifen?

      Danke und Gruß

      DJMarc75 T haus-automatisierung 3 Replies Last reply Reply Quote 0
      • DJMarc75
        DJMarc75 @Hant0r last edited by

        @hant0r Screenshot 2023-09-07 200001.png

        unter Instanz entweder History oder Influx auswählen.
        Dann den Datenpunkt bei ObjektID auswählen und die Zeit festlegen.

        Zum Testen eine Variable "result" anlegen und so wie im Blockly als Debug ausgeben, dann siehst Du im Log alle Einträge im gewählten Zeitraum.

        1 Reply Last reply Reply Quote 0
        • Hant0r
          Hant0r last edited by

          @djmarc75 sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

          Dann den Datenpunkt bei ObjektID auswählen und die Zeit festlegen.

          Welchen Datenpunkt wähle ich denn da?
          Würde da ja gerne "smarthome.energy.exportedWh" aus der InfluxDB angeben, aber das geht nicht.
          Er will ja einen DP vom ioBroker haben

          DJMarc75 1 Reply Last reply Reply Quote 0
          • DJMarc75
            DJMarc75 @Hant0r last edited by

            @hant0r sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

            Er will ja einen DP vom ioBroker haben

            Na den Datenpunkt den Du nach Influx loggst - der ist ja im ioBroker

            Hant0r 1 Reply Last reply Reply Quote 0
            • Hant0r
              Hant0r @DJMarc75 last edited by

              @djmarc75
              hmm, sende die Daten über ein Javascript in die Datenbank

              Hant0r Homoran 2 Replies Last reply Reply Quote 0
              • Hant0r
                Hant0r @Hant0r last edited by

                Nutze dafür das Skript ("Daten in InfluxDB schreiben") von Matthias (haus-automatisierung.com), damit ich Stromverbrauch mit dem zu dem Zeitpunkt gültigen Strompreis später noch verrechnen kann.

                https://haus-automatisierung.com/software/2023/05/11/influxdb2-pv-dashboard.html

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

                  @hant0r sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

                  sende die Daten über ein Javascript in die Datenbank

                  der Block spricht aber die ioBroker Datenbank Adapter an.
                  Was nicht darüber rein geht, bekommst du darüber auch nicht raus.

                  Hant0r 1 Reply Last reply Reply Quote 1
                  • Hant0r
                    Hant0r @Homoran last edited by

                    @homoran Ah ok, schade 😞

                    Bekommt man auf anderem Wege an Daten auf ner influxdb?

                    1 Reply Last reply Reply Quote 0
                    • T
                      TT-Tom @Hant0r last edited by

                      @hant0r probiere bitte mal dieses Script, ist aber eventuell noch nicht fix. poste mal die Log Ausgabe

                      const InfluxInstance = 'influxdb.0';
                      
                      const ende = new Date()
                      const endeiso = ende.toISOString();
                      const start = new Date().setHours(0, 0, 0);
                      const test = new Date (start);
                      const testiso = test.toISOString();
                      
                      
                      function Abfrage() {
                         let query = [
                            'from(bucket: "smarthome")',
                            '|> range(start: ' + testiso + ', stop: ' + endeiso + ')',
                            '|> filter(fn: (r) => r._measurement == "energy")',
                            '|> filter(fn: (r) => r._field == "exportedWh")',
                            '|> difference()',
                            '|> sum()',
                            '|> yield(name: "_result")'].join('');
                      
                         console.log('Query: ' + query);
                      
                         sendTo(InfluxInstance, 'query', query, function (result) {
                            if (result.error) {
                               console.error('Fehler: ' + result.error);
                            } else {
                               // show result
                               console.log(result)
                               for (let r = 0; r < result.result.length; r++) {
                                  for (let i = 0; i < result.result[r].length; i++) {
                                     let value = result.result[r][i]._value;
                                     console.log(' Ergebnis ' + value )
                                  }
                               }
                            });
                      };
                      
                      Abfrage();
                      
                      1 Reply Last reply Reply Quote 1
                      • Hant0r
                        Hant0r last edited by

                        @tt-tom
                        vielen lieben Dank 😍...es fehlte am Ende zwar noch eine geschweifte Klammer, danach bekam ich aber das gewünschte Ergebnis.

                        T 1 Reply Last reply Reply Quote 0
                        • T
                          TT-Tom @Hant0r last edited by

                          @hant0r

                          Okay, sag mal wo dann kann ich den Post nochmal anpassen.

                          Hant0r 1 Reply Last reply Reply Quote 0
                          • Hant0r
                            Hant0r @TT-Tom last edited by

                            @tt-tom unten beim Else Zweig.
                            So wäre es korrekt:

                            
                            const InfluxInstance = 'influxdb.0';
                             
                            const ende = new Date()
                            const endeiso = ende.toISOString();
                            const start = new Date().setHours(0, 0, 0);
                            const test = new Date (start);
                            const testiso = test.toISOString();
                             
                             
                            function Abfrage() {
                               let query = [
                                  'from(bucket: "smarthome")',
                                  '|> range(start: ' + testiso + ', stop: ' + endeiso + ')',
                                  '|> filter(fn: (r) => r._measurement == "energy")',
                                  '|> filter(fn: (r) => r._field == "exportedWh")',
                                  '|> difference()',
                                  '|> sum()',
                                  '|> yield(name: "_result")'].join('');
                             
                               console.log('Query: ' + query);
                             
                               sendTo(InfluxInstance, 'query', query, function (result) {
                                  if (result.error) {
                                     console.error('Fehler: ' + result.error);
                                  } else {
                                     // show result
                                     console.log(result)
                                     for (let r = 0; r < result.result.length; r++) {
                                        for (let i = 0; i < result.result[r].length; i++) {
                                           let value = result.result[r][i]._value;
                                           console.log(' Ergebnis ' + value )
                                        }
                                     }
                                    }
                                });
                            };
                             
                            Abfrage();
                            
                            
                            1 Reply Last reply Reply Quote 1
                            • haus-automatisierung
                              haus-automatisierung Developer Most Active @Hant0r last edited by

                              @hant0r sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

                              Leider komme ich nicht dahinter, wie dieser Baustein funktioniert.

                              Der Baustein bietet nur die Standard getHistory-Funktionen und ist nur ein erster Wurf. Der kann bei weitem nicht alles, was Flux kann, weil er eben auch mit dem History-Adapter und SQL-Adapter arbeiten muss. Die Schnittstelle ist also sehr generisch und die darunter liegenden Adapter machen aus der Anfrage dann SQL, Flux, InfluxQL oder was auch immer nötig ist.

                              Für sehr spezielle Anfragen ist es also nach wie vor besser query zu nutzen (wie vorgeschlagen). Der Vollständigkeit halber noch die Doku: https://github.com/ioBroker/ioBroker.influxdb#custom-queries

                              1 Reply Last reply Reply Quote 0
                              • Hant0r
                                Hant0r last edited by

                                Ich versuche gerade das Skript als Blockly-Baustein laufen zu lassen und einen return zu bekommen.
                                Könnt ihr mir sagen, wo der Fehler ist, dass ich den Wert nicht zurück bekomme?

                                const InfluxInstance = 'influxdb.0';
                                 
                                const ende = new Date()
                                const endeiso = ende.toISOString();
                                const start = new Date().setHours(0, 0, 0);
                                const test = new Date (start);
                                const testiso = test.toISOString();
                                let value = 0;
                                
                                let query = [
                                    'from(bucket: "smarthome")',
                                    '|> range(start: ' + testiso + ', stop: ' + endeiso + ')',
                                    '|> filter(fn: (r) => r._measurement == "energy")',
                                    '|> filter(fn: (r) => r._field == "exportedWh")',
                                    '|> difference()',
                                    '|> sum()',
                                    '|> yield(name: "_result")'].join('');
                                
                                sendTo(InfluxInstance, 'query', query, function (result) {
                                    if (result.error) {
                                        console.error('Fehler: ' + result.error);
                                    } else {
                                        // show result
                                        //console.log(result)
                                        for (let r = 0; r < result.result.length; r++) {
                                        for (let i = 0; i < result.result[r].length; i++) {
                                            value = result.result[r][i]._value;
                                            //console.log(' Ergebnis ' + value )
                                        }
                                        }
                                    }
                                });
                                
                                return value;
                                
                                haus-automatisierung 1 Reply Last reply Reply Quote 0
                                • haus-automatisierung
                                  haus-automatisierung Developer Most Active @Hant0r last edited by haus-automatisierung

                                  @hant0r Das wird nicht gehen, weil der Callback später ausgeführt wird. Eventuell könntest Du das mit einem Promise lösen. Ich glaube alle Funktionen werden mit await aufgerufen. Dann sollte das gehen. Aber nie getestet:

                                  return new Promise((resolve, reject) => {
                                      const InfluxInstance = 'influxdb.0';
                                  
                                      const ende = new Date()
                                      const endeiso = ende.toISOString();
                                      const start = new Date().setHours(0, 0, 0);
                                      const test = new Date (start);
                                      const testiso = test.toISOString();
                                      let value = 0;
                                  
                                      let query = [
                                          'from(bucket: "smarthome")',
                                          '|> range(start: ' + testiso + ', stop: ' + endeiso + ')',
                                          '|> filter(fn: (r) => r._measurement == "energy")',
                                          '|> filter(fn: (r) => r._field == "exportedWh")',
                                          '|> difference()',
                                          '|> sum()',
                                          '|> yield(name: "_result")'].join('');
                                  
                                      sendTo(InfluxInstance, 'query', query, function (result) {
                                          if (result.error) {
                                              reject(result.error);
                                          } else {
                                              for (let r = 0; r < result.result.length; r++) {
                                                  for (let i = 0; i < result.result[r].length; i++) {
                                                      value = result.result[r][i]._value;
                                                  }
                                              }
                                  
                                              resolve(value);
                                          }
                                      });
                                  });
                                  

                                  Das mit den 2 For-Schleifen ist so aber nicht der Hit - das würde ich noch ändern.

                                  Stichworte für Google sind:

                                  • async / await
                                  • Promises
                                  • Promise vs. callback
                                  Hant0r 1 Reply Last reply Reply Quote 1
                                  • Hant0r
                                    Hant0r @haus-automatisierung last edited by

                                    @haus-automatisierung
                                    klasse danke dir - klappt 🙂
                                    Da habe ich noch einiges zu lernen wenn ich sehe wie schnell ihr hier antworten auf die "Probleme" habt 😄

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

                                      @hant0r sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

                                      Da habe ich noch einiges zu lernen

                                      Naja, in der JavaScript-Programmierung direkt mit asynchronen Logiken anzufangen ist eventuell auch ein paar Schritte zu weit.

                                      Wichtig wäre in Deinem Beispiel erstmal zu verstehen, dass Du eine Funktion als Parameter an sendTo übergibst und dass das nicht nacheinander abgearbeitet wird. Alternativ hätte man mit sendToAsync und await arbeiten können. Aber das geht gerade zu weit 🙂

                                      1 Reply Last reply Reply Quote 2
                                      • Yunkie
                                        Yunkie last edited by

                                        Moin zusammen,

                                        ich würde das Thema gerne nochmal kurz aufgreifen.

                                        Ich versuche mit dem getHistory-Block Daten aus der normalen History auszulesen.
                                        Allerdings fällt es mir schwer die Ausgabe zu parsen. Hat da vielleicht nochmal jemand ein Beispiel für, wie das mit Blockly geht?
                                        Wie bekomme zum Beispiel den ersten und den letzten Wert aus dem Ergebnis?

                                        Ich habe mir folgenden Forum-Beitrag dazu angesehen:
                                        https://forum.iobroker.net/topic/5978/json-in-blockly-parsen/9

                                        Aber da ich irgendwie keine "Objekt-Namen" habe, weiß ich nicht wie ich anders an den Index des jeweiligen Objekts komme.

                                        [{'val':19449.052,'ts':1695247278863},{'val':19449.06,'ts':1695248178856},{'val':19449.068,'ts':1695249078870},{'val':19449.076,'ts':1695249998821},{'val':19449.084000000003,'ts':1695250888829},{'val':19449.092,'ts':1695251788894},{'val':19449.1,'ts':1695252678869},{'val':19449.107,'ts':1695253568871},{'val':19449.115,'ts':1695254498882},{'val':19449.129,'ts':1695255388912},{'val':19449.137000000002,'ts':1695256288903},{'val':19449.144,'ts':1695257178918},{'val':19449.152000000002,'ts':1695258078937},{'val':19449.17,'ts':1695258978931},{'val':19449.18,'ts':1695259898917},{'val':19449.188000000002,'ts':1695260798945},{'val':19449.195,'ts':1695261688969},{'val':19449.203,'ts':1695262588974},{'val':19449.214,'ts':1695263488995},{'val':19449.225,'ts':1695264389017},{'val':19449.399,'ts':1695265278973},{'val':19449.541,'ts':1695266178985},{'val':19449.686999999998,'ts':1695267099060},{'val':19449.876,'ts':1695267988996},{'val':19450.09,'ts':1695268889020},{'val':19450.402000000002,'ts':1695269779062},{'val':19450.726000000002,'ts':1695270699066},{'val':19450.762000000002,'ts':1695270709103},{'val':19451.263,'ts':1695271609127},{'val':19451.698,'ts':1695272499091},{'val':19452.165,'ts':1695273399103},{'val':19452.747,'ts':1695274309109},{'val':19453.234,'ts':1695275209095},{'val':19453.654000000002,'ts':1695276099151},{'val':19454.012000000002,'ts':1695276999160},{'val':19454.458,'ts':1695277899183},{'val':19454.801,'ts':1695278789152},{'val':19455.179,'ts':1695279709191},{'val':19455.659,'ts':1695280609216},{'val':19456.067000000003,'ts':1695281509247},{'val':19456.527000000002,'ts':1695282399224},{'val':19456.970999999998,'ts':1695283299199},{'val':19457.487,'ts':1695284209236},{'val':19457.968,'ts':1695285109236},{'val':19458.484,'ts':1695286009221},{'val':19458.974000000002,'ts':1695286899247},{'val':19459.372,'ts':1695287799267},{'val':19459.756,'ts':1695288689291},{'val':19460.190000000002,'ts':1695289609233},{'val':19460.631,'ts':1695290499339},{'val':19461.017,'ts':1695291389319},{'val':19461.481,'ts':1695292309347},{'val':19461.953999999998,'ts':1695293199288},{'val':19462.305,'ts':1695294099288},{'val':19462.652000000002,'ts':1695294989363},{'val':19462.983,'ts':1695295909379},{'val':19463.333,'ts':1695296809334},{'val':19463.747,'ts':1695297699333},{'val':19464.191,'ts':1695298599357},{'val':19464.581,'ts':1695299489419},{'val':19464.957000000002,'ts':1695300409387},{'val':19465.397,'ts':1695301299455},{'val':19465.764000000003,'ts':1695302199403},{'val':19466.135000000002,'ts':1695303089419}]
                                        

                                        Wäre über eine kurze Hilfestellung froh 🙂

                                        Danke und Gruß!

                                        T T 2 Replies Last reply Reply Quote 1
                                        • T
                                          Tobias78 @Yunkie last edited by Tobias78

                                          @yunkie Ich habe das gleiche Problem bzw. ein Verständnisproblem mit dem neuen Block "getHistory".
                                          Parsen aus einem Text ginge - wenn ich denn einen Text bekommen würde...

                                          Mein Testskript:
                                          getHist1.jpg

                                          09:34:45.644	info	javascript.0 (589275) Stop script script.js.99_TEST.Test_Kueche
                                          09:34:45.698	info	javascript.0 (589275) Start javascript script.js.99_TEST.Test_Kueche
                                          09:34:45.729	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: Plain ausserhalb:
                                          09:34:45.730	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: undefined
                                          09:34:45.733	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: | Ausserhalb des Blocks: undefined
                                          09:34:45.733	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                          09:34:45.747	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: Plain:
                                          09:34:45.748	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: [{'val':null,'ts':1695452205337},{'val':true,'ts':1695452325439},{'val':false,'ts':1695452326548},{'val':true,'ts':1695452541572},{'val':false,'ts':1695452549833},{'val':true,'ts':1695453778238},{'val':false,'ts':1695453780078},{'val':true,'ts':1695454483574},{'val':false,'ts':1695454484386}]
                                          09:34:45.748	info	javascript.0 (589275) script.js.99_TEST.Test_Kueche: | Als Text im Block: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
                                          

                                          Komischerweise bekomme ich "result" nur was angezeigt, wenn ich es direkt an "debug" IM GETHISTORY Block ran hänge.

                                          Warum kann ich das als Text nicht verarbeiten? Zusätzlich "Nach String" funktioniert ebenfalls nicht.

                                          Wie bekomme ich "result" außerhalb des Blocks bzw. in eine Variable übergeben?

                                          Gibt es eine andere Möglichkeit in Blockly zu prüfen, ob ein State innerhalb eines definierten Zeitraums "true" war?

                                          Hintergrund: Triggern auf "true" funktioniert in meinem Fall nicht, da der Zustand "trze" nur wenige ms beträgt, allerdings wird "true" in History richtig geloggt.

                                          Danke und Gruß,
                                          Tobias.

                                          Nachtrag:
                                          Es muss nach dem getHistroy mindestens 1 Sekunde Pause eingebaut werden... Das Skript wartet sonst nicht auf das Ergebnis von getHistory...

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

                                            @tobias78 sagte in Blockly - Mit getHistory Daten aus InfluxDB auslesen:

                                            Komischerweise bekomme ich "result" nur was angezeigt, wenn ich es direkt an "debug" IM GETHISTORY Block ran hänge.

                                            Ja, so funktionieren alle sendTo Funktionen (mit Callback). Sonst als JavaScript mit Promise implementieren.

                                            Nachtrag:
                                            Es muss nach dem getHistroy mindestens 1 Sekunde Pause eingebaut werden... Das Skript wartet sonst nicht auf das Ergebnis von getHistory...

                                            Das ist eine ziemlich unschöne Lösung und basiert auf Zufall ob das klappt oder nicht

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            690
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            9
                                            23
                                            3450
                                            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