Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script um SQL auszulesen

    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

    Script um SQL auszulesen

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

      Hallo,

      bei funktioniert der Code ohne Fehler, liefert allerdings auch falsche Ergebnisse:

      ! ```
      var idQuelle = "hm-rpc.0.MEQ0170674.2.ENERGY_COUNTER"; ! function getHistoryRows(date, callback) { var options = { start: 0, end: date, count: 2, aggregate: 'none', //'total', // One of: max, min, average, total //limit: 1, ignoreNull: 1 }; ! sendTo ("sql.0", "getHistory", { id: idQuelle, options: options }, function(data) { if (data) { var rows = []; rows = rows.concat(data.result); for (var i=0; i<rows.length; i++)/{/log("ts:/"/+/formatdate(rows[i].ts,/"dd.mm.yyyy/hh:mm:ss")/val:/rows[i].val);/}/if/(callback)/callback/(rows);/else/log('keine/daten');/});/var/heute="new" date();/log(formatdate(heute,/hh:mm:ss"));/gethistoryrows(heute);/<e=""></rows.length;>
      Ergebnis:
      ~~[code]~~2016-04-20 15:44:26.810 - info: javascript.2 script.js.Test.SQL_auslesen: 20.04.2016 15:44:26 2016-04-20 15:44:26.811 - info: javascript.2 sendTo "getHistory" to system.adapter.sql.0 from system.adapter.javascript.2: {"id":"hm-rpc.0.MEQ0170674.2.ENERGY_COUNTER","options":{"start":0,"end":"2016-04-20T13:44:26.809Z","count":2,"aggregate":"none","ignoreNull":1}} 2016-04-20 15:44:26.811 - info: javascript.2 script.js.Test.SQL_auslesen: registered 0 subscriptions and 0 schedules 2016-04-20 15:44:26.827 - info: javascript.2 script.js.Test.SQL_auslesen: ts: NaN.NaN.NaN NaN:NaN:NaN val: 11962.2 2016-04-20 15:44:26.828 - info: javascript.2 script.js.Test.SQL_auslesen: ts: NaN.NaN.NaN NaN:NaN:NaN val: 12554.6[/code]
      Der tatsächliche Wert ist aber gerade 55875.099976
      ! Gruß
      ! Pix[/i][/i]

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

        Hallo zusammen,

        gibt es hier bereits eine Lösung?

        Gibt es die Möglichkeit den Maximalwert aus der SQL zu holen und abzuspeichern, damit ich den Wert in vis darstellen kann?

        Mfg

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

          Du kannst immer noch mit "query" anstelle "getHistory" echte Queries auf der DB machen. Auf der Github-Seite vom Adapter gibts Beispiele.

          bei getHistory werden die Werte so aufbereitet das flot, rickshaw und so diese anzeigen können. Da passiert also nicht einiges an Magie

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

            Hallo,

            es ist ein klein wenig komplexer… Hier mal mein Script mit dem ich Min/Max der Temperatur ermittle:

            var id = "mqtt.0.GrillDuino01.TemperaturLuft"/*GrillDuino01/TemperaturLuft*/;
            
            var maxid = 'javascript.0.Statistik.Luft1.Max24';
            var minid = 'javascript.0.Statistik.Luft1.Min24';
            var dt = 24;//Zeitraum in Stunden
              dt = dt*3600*1000;
            
            schedule("*/5 * * * *", function(){
                SQLAbfrage(id);
            });
            
            SQLAbfrage(id);
            
            // maximum, minimum
            function minimum(result) {
              log(JSON.stringify(result.result));
              setState(minid, result.result[0].MinVal);
            }
            
            function maximum(result) {
              log('Fn Max'+ JSON.stringify(result.result));
              setState(maxid, result.result[0].MaxVal);
            }
            
            function SQLAbfrage () {
            //log(id);
              sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
            }
            
            function GetResults (dpoint) {
              var end_time = new Date().getTime();
              var start_time = new Date().getTime() - dt;
              //log(JSON.stringify(dpoint.result)+'//'+start_time);
              //log(dpoint.result[0].id + '---//---' + dpoint.result[0].name);
              sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
              sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
            }
            

            Ich hoffe, es hilft weiter…

            Gruß Thilo

            1 Reply Last reply Reply Quote 0
            • M
              moebius last edited by

              hey, hier als node-red.````
              [{"id":"5c84d16b.6fe81","type":"tab","label":"Flow 3"},{"id":"f4de54bb.e659f8","type":"mysql","z":"5c84d16b.6fe81","mydb":"ddaa010d.680b2","name":"","x":454,"y":232,"wires":[["7694268b.e9be98"]]},{"id":"27d0eb3c.9fa534","type":"function","z":"5c84d16b.6fe81","name":"prepare sql","func":"var hours = 72; //Zeitraum in Stunden\n\n/*jshint multistr: true */\nmsg.topic = 'SELECT min(val) As "' + msg.payload + 'Min' + '" \\n,max(val) as "' + msg.payload + 'Max' + '"\\n,avg(val) as "' + msg.payload + 'Avg' + '"\\nFROM ts_number WHERE \\nfrom_unixtime(ts/1000) >= (CURRENT_DATE - INTERVAL '+ hours +' HOUR) \\nAND id=(SELECT id FROM datapoints WHERE name = \'' + msg.payload + '\') \\nGROUP BY id';\nreturn msg;","outputs":"1","noerr":0,"x":332,"y":156,"wires":[["f4de54bb.e659f8"]]},{"id":"e0e7d7e8.819718","type":"inject","z":"5c84d16b.6fe81","name":"","topic":"","payload":"admin.0.ws333.Temp1","payloadType":"str","repeat":"","crontab":"","once":false,"x":154,"y":94,"wires":[["27d0eb3c.9fa534"]]},{"id":"493112bd.92ca9c","type":"ioBroker out","z":"5c84d16b.6fe81","name":"","topic":"","ack":"true","autoCreate":"false","x":1199,"y":106,"wires":[]},{"id":"342ba386.e1a2ec","type":"change","z":"5c84d16b.6fe81","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"parts.key","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":993,"y":130,"wires":[["493112bd.92ca9c"]]},{"id":"7694268b.e9be98","type":"split","z":"5c84d16b.6fe81","name":"","splt":"\n","x":628,"y":228,"wires":[["52ab1a29.9aca24"]]},{"id":"52ab1a29.9aca24","type":"split","z":"5c84d16b.6fe81","name":"","splt":"\n","x":796,"y":190,"wires":[["342ba386.e1a2ec"]]},{"id":"ddaa010d.680b2","type":"MySQLdatabase","z":"","host":"big","port":"3306","db":"iobroker","tz":""}]

              1 Reply Last reply Reply Quote 0
              • andre
                andre Developer last edited by

                @Thisoft:

                Hallo,

                es ist ein klein wenig komplexer… Hier mal mein Script mit dem ich Min/Max der Temperatur ermittle:

                var id = "mqtt.0.GrillDuino01.TemperaturLuft"/*GrillDuino01/TemperaturLuft*/;
                
                var maxid = 'javascript.0.Statistik.Luft1.Max24';
                var minid = 'javascript.0.Statistik.Luft1.Min24';
                var dt = 24;//Zeitraum in Stunden
                  dt = dt*3600*1000;
                  
                schedule("*/5 * * * *", function(){
                    SQLAbfrage(id);
                });
                
                SQLAbfrage(id);
                
                // maximum, minimum
                function minimum(result) {
                  log(JSON.stringify(result.result));
                  setState(minid, result.result[0].MinVal);
                }
                
                function maximum(result) {
                  log('Fn Max'+ JSON.stringify(result.result));
                  setState(maxid, result.result[0].MaxVal);
                }
                
                function SQLAbfrage () {
                //log(id);
                  sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                }
                
                function GetResults (dpoint) {
                  var end_time = new Date().getTime();
                  var start_time = new Date().getTime() - dt;
                  //log(JSON.stringify(dpoint.result)+'//'+start_time);
                  //log(dpoint.result[0].id + '---//---' + dpoint.result[0].name);
                  sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
                  sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
                }
                

                Ich hoffe, es hilft weiter…

                Gruß Thilo `

                Hallo,

                ich versuche mich gerade mal wieder an einem neuen Script bei dem ich im ersten Schritt History-Werte aus meines SQL laden möchte. Zum Testen und Verstehen habe ich mir mal das oben genannte Script genommen und etwas modifiziert. Ich will damit aus der SQL-History meines Datenpunktes zum aktuellen Stromverbrauch die min- und maxwerte ermitteln.

                ! ````
                createState('javascript.0.e3dc.tageswerte.testmax', "0", {name: 'Maximalwert Stromverbrauch'});
                createState('javascript.0.e3dc.tageswerte.testmin', "0", {name: 'Minimalwert Stromverbrauch'});
                ! var id = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung';
                ! var maxid = 'javascript.0.e3dc.tageswerte.testmax';
                var minid = 'javascript.0.e3dc.tageswerte.testmin';
                var dt = 24; //Zeitraum in Stunden
                dt = dt36001000;

                SQLAbfrage(id);

                ! // maximum, minimum
                function minimum(result) {
                log(JSON.stringify(result.result));
                setState(minid, result.result[0].MinVal);
                }
                ! function maximum(result) {
                log('Fn Max'+ JSON.stringify(result.result));
                setState(maxid, result.result[0].MaxVal);
                }
                ! function SQLAbfrage () {
                //log(id);
                sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = ' + id + '', GetResults);
                }
                ! function GetResults (dpoint) {
                var end_time = new Date().getTime();
                var start_time = new Date().getTime() - dt;
                //log(JSON.stringify(dpoint.result)+'//'+start_time);
                //log(dpoint.result[0].id + '---//---' + dpoint.result[0].name);
                sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
                sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
                }

                Leider mit bisher mäßigem Erfolg:
                

                javascript.0 2017-02-11 13:12:25.345 info Stop script script.js.E3DC.test_stromverbrauch
                TypeError: 2017-02-11 13:12:23.778 error at Decoder. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                TypeError: 2017-02-11 13:12:23.778 error at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:332:8)
                TypeError: 2017-02-11 13:12:23.778 error at Manager.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20)
                TypeError: 2017-02-11 13:12:23.778 error at Manager. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                TypeError: 2017-02-11 13:12:23.778 error at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:228:12)
                TypeError: 2017-02-11 13:12:23.778 error at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:270:10)
                TypeError: 2017-02-11 13:12:23.778 error at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20)
                TypeError: 2017-02-11 13:12:23.778 error at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)
                TypeError: 2017-02-11 13:12:23.778 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2827:71)
                TypeError: 2017-02-11 13:12:23.778 error at Object.GetResults [as cb] (script.js.E3DC.test_stromverbrauch:35:134)
                TypeError: 2017-02-11 13:12:23.778 error Cannot read property '0' of undefined
                message 2017-02-11 13:12:23.777 error messagebox.system.adapter.javascript.0 [object Object] Cannot read property '0' of undefined
                javascript.0 2017-02-11 13:12:23.761 info script.js.E3DC.test_stromverbrauch: registered 0 subscriptions and 0 schedules
                javascript.0 2017-02-11 13:12:23.757 info Start javascript script.js.E3DC.test_stromverbrauch

                Ich vermute es sind die letzten beiden Zeilen. Bei denen verstehe ich nicht so recht was die machen.
                
                Kann mir jemand helfen?
                
                MfG,
                
                André
                1 Reply Last reply Reply Quote 0
                • Y
                  ykuendig last edited by

                  Bist Du sicher, dass das nicht an den zwei CreateStates am Anfang liegt?

                  1 Reply Last reply Reply Quote 0
                  • andre
                    andre Developer last edited by

                    Ja, die sind zwar auch nicht perfekt [emoji2] aber die stören nicht. Wenn ich sie weg lasse, selber Fehler. Nehm ich die letzten beiden Zeilen raus, Fehler weg. 😞

                    MfG, André

                    Gesendet mit Tapatalk.

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

                      Natürlich liegt's an den letzten beiden Zeilen - die holen die Daten aus der SQL-Db. Wenn du die weglässt hast du keinen Fehler aber auch keine Daten 😉

                      Maßgeblich ist diese Zeile in den Fehlermeldungen:

                      TypeError:   2017-02-11 13:12:23.778   error   Cannot read property '0' of undefined
                      

                      Meine erste Vermutung: Welchen Typ hat denn dein DP 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung'? Der muß zwingend vom Typ "number" sein sonst funktioniert die Abfrage so nicht!

                      Anderenfalls schalte mal die auskommentierten Logzeilen ein und dann schauen wir mal weiter…

                      1 Reply Last reply Reply Quote 0
                      • andre
                        andre Developer last edited by

                        @Thisoft:

                        Natürlich liegt's an den letzten beiden Zeilen - die holen die Daten aus der SQL-Db. Wenn du die weglässt hast du keinen Fehler aber auch keine Daten 😉

                        Maßgeblich ist diese Zeile in den Fehlermeldungen:

                        TypeError:   2017-02-11 13:12:23.778   error   Cannot read property '0' of undefined
                        

                        Meine erste Vermutung: Welchen Typ hat denn dein DP 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung'? Der muß zwingend vom Typ "number" sein sonst funktioniert die Abfrage so nicht!

                        Anderenfalls schalte mal die auskommentierten Logzeilen ein und dann schauen wir mal weiter… `
                        Ok, bitte verzeih mir wenn die ein oder andere Bemerkung/ Frage ein bisschen "unwissend" daher kommt. 🙂 Für mich ist das Thema Javascript und SQL momentan noch "Neuland". 😄

                        Mein Datenpunkt sieht so aus:
                        914_datenpunkt.png
                        Wenn ich in der Datenbank schaue, ist der Name in "datapoints" zu finden. Zur Zugehörigen ID 77 finde ich auch Datensätze in "ts_number" filename="datensätze.PNG" index="0">~~
                        Wenn ich die Logzeilen auskommentiere, dann bekomme ich eine Zeile Log mehr:

                        javascript.0	2017-02-11 15:11:08.956	info	script.js.E3DC.test_stromverbrauch: undefined//1486735868955
                        

                        Die Zahl am Ende sieht für mich aus wie ein Zeitstempel. Einen Reim kann ich mir darauf trotzdem nicht machen.

                        Anmerkung: Mein Datenpunkt loggt in der Regel alle 10 Sekunden einen Datensatz. Kann das vielleicht auch ein bisschen viel sein?

                        MfG,

                        André

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

                          Ach ja, manchmal kann's so einfach sein 😉 DA fehlt ein Hochkomma in deinem Script! Anstelle:

                          function SQLAbfrage () {
                          //log(id);
                            sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \' + id + \'', GetResults);
                          }
                          

                          muss es heißen:

                          function SQLAbfrage () {
                          //log(id);
                            sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                          }
                          

                          Deshalb findet die Abfrage auf die Tabelle "datapoints" keine ID und gibt wie in der Logzeile zu sehen "undefined" zurück.

                          EDIT - da hatten sogar zwei Hochkommata gefehlt

                          1 Reply Last reply Reply Quote 0
                          • andre
                            andre Developer last edited by

                            @Thisoft:

                            Ach ja, manchmal kann's so einfach sein 😉 DA fehlt ein Hochkomma in deinem Script! Anstelle:

                            function SQLAbfrage () {
                            //log(id);
                              sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \' + id + \'', GetResults);
                            }
                            

                            muss es heißen:

                            function SQLAbfrage () {
                            //log(id);
                              sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                            }
                            

                            Deshalb findet die Abfrage auf die Tabelle "datapoints" keine ID und gibt wie in der Logzeile zu sehen "undefined" zurück.

                            EDIT - da hatten sogar zwei Hochkommata gefehlt `
                            Das war es leider nicht. Hatte dort auch schon die Schreibweise im Verdacht und ein bisschen probiert. Daher fehlten auch zwei Hochkomma. Aber egal welche Schreibweise, der Fehler bleibt. 😞

                            MfG,

                            André

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

                              Dann schalte bitte mal ALLE auskommentierten Logzeilen ein und poste das entprechende Log und bitte nochmal das komplette Script so wie du es jetzt hast.

                              1 Reply Last reply Reply Quote 0
                              • andre
                                andre Developer last edited by

                                @Thisoft:

                                Dann schalte bitte mal ALLE auskommentierten Logzeilen ein und poste das entprechende Log und bitte nochmal das komplette Script so wie du es jetzt hast. `

                                OK, hier das Script:

                                // createState('javascript.0.e3dc.tageswerte.testmax', 0, {name: 'Maximalwert Stromverbrauch'});
                                // createState('javascript.0.e3dc.tageswerte.testmin', 0, {name: 'Minimalwert Stromverbrauch'});
                                
                                var id = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung';
                                
                                var maxid = 'javascript.0.e3dc.tageswerte.testmax';
                                var minid = 'javascript.0.e3dc.tageswerte.testmin';
                                var dt = 24;                                                                       //Zeitraum in Stunden
                                    dt = dt*3600*1000;
                                
                                SQLAbfrage(id);
                                
                                // maximum, minimum
                                function minimum(result) {
                                  log(JSON.stringify(result.result));
                                  setState(minid, result.result[0].MinVal);
                                }
                                
                                function maximum(result) {
                                  log('Fn Max'+ JSON.stringify(result.result));
                                  setState(maxid, result.result[0].MaxVal);
                                }
                                
                                function SQLAbfrage () {
                                  log(id);
                                  sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                                }
                                
                                function GetResults (dpoint) {
                                  var end_time = new Date().getTime();
                                  var start_time = new Date().getTime() - dt;
                                  log(JSON.stringify(dpoint.result)+'//'+start_time);
                                  log(dpoint.result[0].id + '---//---' + dpoint.result[0].name);
                                  sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
                                  sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
                                }
                                

                                Und hier die Log-Ausgabe:

                                12:01:55.929	[info]	javascript.0 Start javascript script.js.E3DC.test_stromverbrauch
                                12:01:55.929	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung
                                12:01:55.929	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: registered 0 subscriptions and 0 schedules
                                12:01:55.944	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: undefined//1486810915941
                                12:01:55.945	[error]	TypeError: Cannot read property '0' of undefined at Object.GetResults [as cb] (script.js.E3DC.test_stromverbrauch:35:20) at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2827:71) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30) at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:270:10) at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:228:12) at Manager. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:332:8) at Decoder. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                                12:03:12.573	[info]	javascript.0 Stop script script.js.E3DC.test_stromverbrauch
                                

                                Ich hab irgendwie das Gefühl dass mit meinen Daten in der SQl etwas nicht stimmt, aber wenn ich das Ganze mit einem "Standard"-Temperaturwert eines Thermostats mache, bekomme ich den selben Fehler. 😞

                                MfG,

                                André

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

                                  Was mich jetzt stutzig macht ist dass die folgenden beiden Zeilen im Log "verkehrtherum" stehen.

                                  12:01:55.929   [info]   javascript.0 script.js.E3DC.test_stromverbrauch: modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung
                                  12:01:55.929   [info]   javascript.0 script.js.E3DC.test_stromverbrauch: registered 0 subscriptions and 0 schedules
                                  

                                  Das würde ja nach meinem Verständnis bedeuten dass die erste Funktion bereits ausgeführt wird bevor das Script fertig registriert ist. Ob das schlimm ist weiß ich jetzt nicht, aber nicht dass uns hier die Asynchronität eine Streich spielt…??? Hast du einen besonders schnellen Rechner auf dem ioBroker läuft?

                                  Weiterhin sagt diese Logzeile

                                  12:01:55.944   [info]   javascript.0 script.js.E3DC.test_stromverbrauch: undefined//1486810915941
                                  

                                  dass die erste Funktion (SQLAbfrage) kein Result (eben undefined) zurückgegeben hat und da liegt das Problem, der zweite Teil ist der für die nächste Abfrage berechnete Zeitstempel - der sieht OK aus, hat aber für diesen Fehler ohnehin noch keine Relevanz.

                                  So eine richtige Idee habe ich jetzt auch nicht mehr, aber eins kannst du mal noch machen. Ändere mal die Funktion wie folgt und poste dann nochmal das Log

                                  function SQLAbfrage () {
                                    log(id);
                                    log('SELECT * FROM datapoints WHERE name = \'' + id + '\'');
                                    sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                                  }
                                  
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • andre
                                    andre Developer last edited by

                                    @Thisoft:

                                    Was mich jetzt stutzig macht ist dass die folgenden beiden Zeilen im Log "verkehrtherum" stehen.

                                    12:01:55.929   [info]   javascript.0 script.js.E3DC.test_stromverbrauch: modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung
                                    12:01:55.929   [info]   javascript.0 script.js.E3DC.test_stromverbrauch: registered 0 subscriptions and 0 schedules
                                    

                                    Das würde ja nach meinem Verständnis bedeuten dass die erste Funktion bereits ausgeführt wird bevor das Script fertig registriert ist. Ob das schlimm ist weiß ich jetzt nicht, aber nicht dass uns hier die Asynchronität eine Streich spielt…??? Hast du einen besonders schnellen Rechner auf dem ioBroker läuft? `
                                    Nach langer Pause habe ich heute endlich mal wieder Zeit…

                                    Ja, ich habe einen schnellen Rechner. Habe meinen ioBroker auf der Synology laufen. Die ist schon sehr performant...

                                    Ob sich das Script in irgendeiner Form "überholen" kann, weiß ich auch nicht...

                                    Ich habe mal ein bisschen probiert, aber irgendwie steige ich nicht dahinter. So sieht es aktuell aus:

                                    // createState('javascript.0.e3dc.tageswerte.testmax', 0, {name: 'Maximalwert Stromverbrauch'});
                                    // createState('javascript.0.e3dc.tageswerte.testmin', 0, {name: 'Minimalwert Stromverbrauch'});
                                    
                                    var id = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung';
                                    
                                    var maxid = 'javascript.0.e3dc.tageswerte.testmax';
                                    var minid = 'javascript.0.e3dc.tageswerte.testmin';
                                    var dt = 24;                                                                       //Zeitraum in Stunden
                                        dt = dt*3600*1000;
                                    
                                    // maximum, minimum
                                    function minimum(result) {
                                      log(JSON.stringify(result.result));
                                      setState(minid, result.result[0].MinVal);
                                    }
                                    
                                    function maximum(result) {
                                      log('Fn Max'+ JSON.stringify(result.result));
                                      setState(maxid, result.result[0].MaxVal);
                                    }
                                    
                                    function SQLAbfrage () {
                                      log(id);
                                      log('SELECT * FROM datapoints WHERE name = \'' + id + '\'');
                                      sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults);
                                    }
                                    
                                    function GetResults (dpoint) {
                                      var end_time = new Date().getTime();
                                      var start_time = new Date().getTime() - dt;
                                      log(JSON.stringify(dpoint.result)+'//'+start_time);
                                      log(dpoint.result[0].id + '---//---' + dpoint.result[0].name);
                                      sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
                                      sendTo('sql.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
                                    }
                                    
                                    SQLAbfrage(id);
                                    

                                    Und im Log so:

                                    22:21:50.105	[info]	javascript.0 Start javascript script.js.E3DC.test_stromverbrauch
                                    22:21:50.105	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung
                                    22:21:50.105	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: SELECT * FROM datapoints WHERE name = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung'
                                    22:21:50.105	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: registered 0 subscriptions and 0 schedules
                                    22:21:50.121	[info]	javascript.0 script.js.E3DC.test_stromverbrauch: undefined//1487884910118
                                    22:21:50.122	[error]	TypeError: Cannot read property '0' of undefined at Object.GetResults [as cb] (script.js.E3DC.test_stromverbrauch:32:20) at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2827:71) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30) at Socket.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:270:10) at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:228:12) at Manager. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:332:8) at Decoder. (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                                    22:21:51.971	[info]	javascript.0 Stop script script.js.E3DC.test_stromverbrauch
                                    

                                    Vielleicht hat ja noch wer eine Idee…

                                    MfG,

                                    André

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

                                      Kannst du die folgende Abfrage mal direkt auf deine Datenbank ausführen?

                                      SELECT * FROM datapoints WHERE name = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung'
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • M
                                        moebius last edited by

                                        Man könnte zB statt 3 sql statements nur eines verwenden - ungefähr so (ist aus meinem node-red Beispiel kopiert):````
                                        msg.topic = 'SELECT min(val) As Min
                                        ,max(val) as Max
                                        ,avg(val) as Avg
                                        ,"' + msg.topic + '" as point
                                        ,"' + msg.payload + '" as val
                                        FROM ts_number WHERE
                                        from_unixtime(ts/1000) >= (CURRENT_DATE - INTERVAL '+ hours +' HOUR)
                                        AND id=(SELECT id FROM datapoints WHERE name = '' + msg.topic + '')
                                        GROUP BY id having Min >= ' + msg.payload + ';';

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

                                          Natürlich kann man das - aber wenn's einzeln schon nicht funktioniert wird's verschachtelt auch nicht übersichtlicher 😉

                                          @andre - Komische Frage fällt mir gerade noch ein. Bist du sicher dass für den fraglichen Datenpunkt auch wirklich Werte in die Db geschrieben werden???

                                          1 Reply Last reply Reply Quote 0
                                          • andre
                                            andre Developer last edited by

                                            @Thisoft:

                                            @andre - Komische Frage fällt mir gerade noch ein. Bist du sicher dass für den fraglichen Datenpunkt auch wirklich Werte in die Db geschrieben werden??? `
                                            Ja, Datenbank ist aus meiner Sicht ok. Daten sind auch drin, Hatte ich oben schonmal ein screenshot von gepostet. Hier nochmal mit der Abfrage der ID:
                                            914_id.png
                                            Und hier mit der Abfrage nach den Datensätzen:
                                            914_daten.png
                                            MfG,

                                            André

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            865
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            14
                                            32
                                            8611
                                            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