NEWS
[gelöst] JSON Wert extrahieren
-
Hallo,
leider hatte ich in FB keinen Erfolg, deswegen die Frage noch einmal hier:
Ich versuche Min, Max und Mittelwerte aus der SQL Datenbank zu bekommen.
sendTo('sql.0', 'query', 'select avg(val) from ioBroker.ts_number where id = 21 and ts/1000 >= Unix_TIMESTAMP(CURDATE())', function (avgval) { if (avgval.error) { console.error(avgval.error); } else { // show result log('Rows: ' + JSON.stringify(avgval.result)); var test = JSON.stringify(avgval.result).avg(val); log(test); } })
Ergibt:
16:29:43.270 info javascript.0 script.js.Datenbankabfragen.Tagesmittelwert: Rows: [{"avg(val)":-2.0713963963963966}] 16:29:43.270 error javascript.0 ReferenceError: val is not defined at Object.cb (script.js.Datenbankabfragen.Tagesmittelwert:7:55) at Object.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3386:71) at Socket. <anonymous>(/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:52:30) at Socket.Emitter.emit (/opt/iobroker/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:278:10) at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:236:12) at Manager. <anonymous>(/opt/iobroker/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/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:345:8) at Decoder. <anonymous>(/opt/iobroker/node_modules/component-bind/index.js:21:15)</anonymous></anonymous></anonymous>
Also prinzipiell funktionert die Rückgabe ja, aber ich schaffe es nicht den Wert raus zu bekommen.
log(avgval.result[1].avg(val)) gibt auch immer die Meldung, das "val" nicht definiert ist.
Kann mir jemand helfen?
-
Vielleicht liege ich völlig falsch, aber was soll im stringify der letzte ".avg(val)"? Das kannst du eigentlich nicht einfach anhängen.
Also versuch mal so:
sendTo('sql.0', 'query', 'select avg(val) from ioBroker.ts_number where id = 21 and ts/1000 >= Unix_TIMESTAMP(CURDATE())', function (avgval) { if (avgval.error) { console.error(avgval.error); } else { // show result log('Rows: ' + JSON.stringify(avgval.result)); var test = JSON.stringify(avgval.result[0].avg(val)); log(test); } })
Vielleicht sind auch die runden Klammern im Namen ein Problem, dann probier mal
var test = JSON.stringify(avgval.result[0].["avg(val)"]);
Gruß
Pix
-
Hallo,
ich hatte mich irgendwann gewundert warum es in eckigen Klammern zurückgegeben wurde, also: [{"avg(val)":-2.0713963963963966}]
Demnach ist das dann wohl ein Array…
Es funktioniert: avgval.result[0]["avg(val)"]
bzw am Ende: setState('Datenbank.TagesTempMittel', (avgval.result[0]["avg(val)"]).toFixed(2));
Ob man JSON.stringify davor schreibt oder es lässt macht soweit ich gesehen hab keinen Unterschied.
Danke für die Hilfe. Ich markier das hier als gelöst.