Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Script um SQL auszulesen

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    989

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Script um SQL auszulesen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
32 Beiträge 14 Kommentatoren 9.8k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    mctom
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich speicher verschiedene Daten (Klima, Stromverbrauch, etc) über die SQL Adapter in einer SQL Datenbank.

    Nun würde ich gerne auch wieder bestimmte Daten aus der Datenbank auslesen.

    z.B. Die niedrigsten Temperatur in den letzten 7 Tagen oder so.

    Kann man so etwas per Script realisieren?

    Hat hier jemand einen Ansatz ?

    Gruß

    Michael

    1 Antwort Letzte Antwort
    0
    • S Offline
      S Offline
      soef
      schrieb am zuletzt editiert von
      #2

      Hallo,

      hier einmal ein Beispiel für eine Möglichkeit:

      `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: "xyz", 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);/});/<e=""></rows.length;>`[/i][/i]
      
      1 Antwort Letzte Antwort
      0
      • P Offline
        P Offline
        piForscher
        schrieb am zuletzt editiert von
        #3

        Hallo,

        ich finde den Gedanken interessant und habe das mal ausprobiert (mit diesem Funktionsaufruf:````
        getHistoryRows(Date.now(),'');

        
        1\. Es funktioniert! Wieder viel gelernt.
        
        2\. Der Zeitstempel sieht ganz anders aus, als der in der SQL-Datenbank:
        
        Einer ist 09.10.13579 10:26:39 (366368948799), der nächste 17.09.36706 13:26:52 (1096184662012). Beides keine sinnvollen Datumsangaben.
        
        Mache ich was falsch beim Aufruf ?
        
        piForscher

        –----------------------------------

        44 HM-Geräte mit CCU2

        iobroker auf MSI Ubuntu, Raspi2 und RaspiB.


        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #4

          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]

          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

          1 Antwort Letzte Antwort
          0
          • 0 Offline
            0 Offline
            0018
            schrieb am zuletzt editiert von
            #5

            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

            Mfg
            0018

            1 Antwort Letzte Antwort
            0
            • apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #6

              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

              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
              1 Antwort Letzte Antwort
              0
              • ThisoftT Offline
                ThisoftT Offline
                Thisoft
                schrieb am zuletzt editiert von
                #7

                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

                22 HM-Geräte; PivCCU2 auf RasPi

                ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  moebius
                  schrieb am zuletzt editiert von
                  #8

                  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 Antwort Letzte Antwort
                  0
                  • andreA Offline
                    andreA Offline
                    andre
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    @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é

                    Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                    1 Antwort Letzte Antwort
                    0
                    • Y Offline
                      Y Offline
                      ykuendig
                      schrieb am zuletzt editiert von
                      #10

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

                      Gruss Yves

                      1 Antwort Letzte Antwort
                      0
                      • andreA Offline
                        andreA Offline
                        andre
                        Developer
                        schrieb am zuletzt editiert von
                        #11

                        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.

                        Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                        1 Antwort Letzte Antwort
                        0
                        • ThisoftT Offline
                          ThisoftT Offline
                          Thisoft
                          schrieb am zuletzt editiert von
                          #12

                          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…

                          22 HM-Geräte; PivCCU2 auf RasPi

                          ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                          1 Antwort Letzte Antwort
                          0
                          • andreA Offline
                            andreA Offline
                            andre
                            Developer
                            schrieb am zuletzt editiert von
                            #13

                            @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". :D

                            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é

                            Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                            1 Antwort Letzte Antwort
                            0
                            • ThisoftT Offline
                              ThisoftT Offline
                              Thisoft
                              schrieb am zuletzt editiert von
                              #14

                              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

                              22 HM-Geräte; PivCCU2 auf RasPi

                              ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                              1 Antwort Letzte Antwort
                              0
                              • andreA Offline
                                andreA Offline
                                andre
                                Developer
                                schrieb am zuletzt editiert von
                                #15

                                @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é

                                Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                                1 Antwort Letzte Antwort
                                0
                                • ThisoftT Offline
                                  ThisoftT Offline
                                  Thisoft
                                  schrieb am zuletzt editiert von
                                  #16

                                  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.

                                  22 HM-Geräte; PivCCU2 auf RasPi

                                  ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                                  1 Antwort Letzte Antwort
                                  0
                                  • andreA Offline
                                    andreA Offline
                                    andre
                                    Developer
                                    schrieb am zuletzt editiert von
                                    #17

                                    @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é

                                    Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                                    1 Antwort Letzte Antwort
                                    0
                                    • ThisoftT Offline
                                      ThisoftT Offline
                                      Thisoft
                                      schrieb am zuletzt editiert von
                                      #18

                                      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);
                                      }
                                      
                                      

                                      22 HM-Geräte; PivCCU2 auf RasPi

                                      ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                                      1 Antwort Letzte Antwort
                                      0
                                      • andreA Offline
                                        andreA Offline
                                        andre
                                        Developer
                                        schrieb am zuletzt editiert von
                                        #19

                                        @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é

                                        Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                                        1 Antwort Letzte Antwort
                                        0
                                        • ThisoftT Offline
                                          ThisoftT Offline
                                          Thisoft
                                          schrieb am zuletzt editiert von
                                          #20

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

                                          SELECT * FROM datapoints WHERE name = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung'
                                          

                                          22 HM-Geräte; PivCCU2 auf RasPi

                                          ioBroker-Multihost; Ubuntu-Master auf Intel-Atom und 3 RasPi-Clients

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          754

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe