NEWS
Werte aus influxDB auslesen
-
Hallo zusammen,
für eine aktuelle Idee von mir benötige ich eine maximal-Temperatur innerhalb der letzten 10 Minuten. Geloggt wird die Temperatur mit Hilfe einer InfluxDB. Mein Javascript schaut aktuell so aus (beispielhaft jetzt mit der RPI.temp):
`var end = new Date().getTime(); var max = 0; sendTo('influxdb.0', 'getHistory', { id: 'rpi2.0.temperature.soc_temp', options: { start: end - 600000, end: end, aggregate: 'none' // or 'none' to get raw values } }, function (result) { for (var i = 0; i < result.result.length; i++) { console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); if (result.result[i].val > max) { max = result.result[i].val; } } console.log(max) });` Als Ergebnis erhalte ich folgendes: ` ~~[quote]~~14:41:34.323 info javascript.0 script.js.Skript_1: 47.77 2019-01-30T13:31:30.218Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.24 2019-01-30T13:32:30.671Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.24 2019-01-30T13:33:31.091Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.77 2019-01-30T13:34:31.561Z 14:41:34.324 info javascript.0 script.js.Skript_1: 48.31 2019-01-30T13:35:31.970Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.77 2019-01-30T13:36:32.417Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.24 2019-01-30T13:37:32.821Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.77 2019-01-30T13:38:33.149Z 14:41:34.324 info javascript.0 script.js.Skript_1: 47.24 2019-01-30T13:39:33.455Z 14:41:34.325 info javascript.0 script.js.Skript_1: 47.77 2019-01-30T13:40:33.862Z 14:41:34.325 info javascript.0 script.js.Skript_1: 48.31 ` ` Soweit passt das eigentlich, nur verstehe ich nicht wieso der Wert von 13:31:30 in meinem "result" enthalten ist?! Die Abfrage war ja um 14:41:34 für die letzten 10min. Da sollte doch 13:31:30 nicht dabei sein, oder?[/i][/i][/i][/i]
-
Das <u>könnte</u> an "47.77 2019-01-30T13:31:30.218Z" liegen. "Z" steht für Zulu, oder genauer gesagt für Zeitzone UTC +/-0. Nur sind wir UTC +1
Deine ganzen Werte sind nämlich um eine Stunde verschoben. Musst du also beim Schreiben in die InfluxDB berücksichtigen (falls dort falsch), oder beim Script berücksichtigen.
-
Stell den influxdb adapter mal auf debug, und schicke dann getHistory … dann solltest DU im Log sehen was er genau tut. Mach mal.
Die Vermutung ist das das Absicht ist weil zur Grafischen Darstellung immer ein Wert kurz vor dem ersten sinnvoll ist weil sonst die Darstellung blöd ist 8weil sie mitten im Graphen anfängt).
bedeutet für dich: Ignoriere einfach den ersten Wert
-
Ja das ist es. getHistory nimmt immer noch einen Wert vor und nach dem definierten Zeitraum hinzu.
Indem ich dann einfach erst bei i = 1 anfange passt das für mich aber.
Nun habe ich aber noch ein anderes Problem: Habe den Code jetzt in eine Blockly-Funktion mit Rückgabewert gepackt und dafür ans Ende folgendes noch hinzugefügt:
return max;
Jedoch ist dieser Rückgabewert immer 0, obwohl eine Zeile darüber (jedoch steht das noch innerhalb der sendTo-Anweisung)````
console.log(max); -
Sorry, gar nicht. Das ist Asychnon.
Du kannst eine nächste Funktion aufrufen die dann den rest macht
-
kannst du das bitte näher erläutern. Bin in JS leider ziemlicher Anfänger… Wenn ich das richtig sehe kann ich ja auf keinerlei Daten von innerhalb des sendto-Blocks zugreifen? Wie kann dann eine weitere Funktion darauf zugreifen?
-
Du machst eine neue funktion
verarbeiteErgebnis(max) { log(max); // tue was immer Du magst }
und diese rufst Du dann aus dem sendTo Ergebnis-Block auf indem Du den parameter übergibst
-
ok, das hab ich verstanden. Aber mein Hauptscript ist mit Blockly erstellt, und damit weiß ich nicht wirklich wie ich dieses Workaround hinbekommen soll?! Oder gibt es z.B. eine Möglichkeit innerhalb des "Javascript-Funktions"-Block eine "Blockly-Variable" zu verändern?
-
@flubb
Kannst du mal das Blockly zeigen. Möchte auch gerne daten wieder aus influxdb auswerten in iobroker (durchschnitte etc.) keinen plan wie ich von iobroker auf influx daten abrufen kann... schreiben tue ich sie mit dem adapter...