NEWS
Max /Mintemperatur aus influxdb mit gethistory
-
Hallo zusammen,
per modbus werden verschiedene Temperaturwerte in eine influxdb gespeichert. Per Flot kann ich mir den Verlauf auch wunderbar ansehen. Ich möchte nun per Skript den Max- und Min-Wert der letzten 24h ausgeben. Prinzipiell klapt aus auch, allerdings nicht über 24h. Da springt die End-Zeit.var dateStart = new Date().getTime()-86400000; var dateEnd = new Date().getTime(); var maxKoll = -100; var minKoll = 100; var maxAussen = -100; var minAussen = 100; sendTo('influxdb.0', 'getHistory', { id: 'modbus.0.holdingRegisters.1_TemperaturKollektoren', options: { start: dateStart, end: dateEnd, 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 > maxKoll) { maxKoll = result.result[i].val; } if (result.result[i].val < minKoll) { minKoll = result.result[i].val; } if (i == 0) { console.log('First Value '+ result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()) } if (i == result.result.length -1) { console.log('Last Value '+ result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()) } } console.log('Max Kollektoren: '+ maxKoll); console.log('Min Kollektoren: '+ minKoll); }); 15:12:16.674 info javascript.0 script.js.common.TemperaturMinMax: First Value 41.2 2019-02-17T14:11:41.535Z 15:12:16.674 info javascript.0 script.js.common.TemperaturMinMax: Last Value -5 2019-02-18T06:11:28.084Z 15:12:16.674 info javascript.0 script.js.common.TemperaturMinMax: Max Kollektoren: 41.4 15:12:16.674 info javascript.0 script.js.common.TemperaturMinMax: Min Kollektoren: -5.8
Hat jemand eine Idee woran das liegen könnte? Die Systemzeit ist korrekt eingetragen.
Gruß
Ben -
@Trikolon
Das habe ich bei mir umgesetzt und das javascript aus dem Forum hier genommen --> siehe hier
funktioniert perfekt musst nur die Datenpunkte ändern und die DB (sql.0)Kannst du nutzen um auch 7 Tage, Monat, 30 tage etc. zu machen.
-
Hallo,
ich bekomme das Script aus dem Link mit einer InfluxDB nicht zum laufen.
! ```` // ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- ! // ----- Datenpunkt der ausgelesen werden soll --------------------------------- var id = "javascript.0.Wetterstation.Aussentemperatur"; // ----- Datenpunkte in die gespeichert werden soll ---------------------------- var maxid = 'javascript.0.Statistik.Aussentemp.Max24'; var minid = 'javascript.0.Statistik.Aussentemp.Min24'; var dt = 24; // Zeitraum in Stunden dt = dt36001000; // Zeitraum umrechnen in ?? ! // ----- Datenpunkte anlegen --------------------------------------------------- createState(maxid, " "); createState(minid, " "); log('1. ) Datenpunkte angelegt '); ! SQLAbfrage(id); ! //----- SQL-Abfrage durchführen function SQLAbfrage () { log('2. ) Datenpunkt => ' + id); log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = '' + id + '''); sendTo('influxdb.0', 'query', 'SELECT * FROM ioBmaster.datapoints WHERE name = '' + id + ''', GetResults); } //--------------------------------------- ! function GetResults (dpoint) { log('3. ) Funktion -> GetResults aufrufen'); var end_time = new Date().getTime(); var start_time = new Date().getTime() - dt; log('3a.) Startzeit : ' + start_time); log('3b.) Endzeit : ' + end_time); log(' Datenpunkt: ' + dpoint.result); log('3c.) result : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time); log(' Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name); sendTo('influxdb.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum); sendTo('influxdb.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum); } ! //----- Werte schreiben (maximum, minimum) //----- minimum function minimum(result) { log('min )Funktion -> ' + JSON.stringify(result.result)); setState(minid, result.result[0].MinVal); } //----- maximum function maximum(result) { log('max )Funktion -> ' + JSON.stringify(result.result)); setState(maxid, result.result[0].MaxVal); log('---- fertig -----------------------------------------');
Endet mit Error:
javascript.0 2020-12-18 22:04:12.920 info (3004) Stop script script.js.common.Skript_1 javascript.0 2020-12-18 22:04:09.753 error (3004) at process._tickCallback (internal/process/next_tick.js:68:7) javascript.0 2020-12-18 22:04:09.753 error (3004) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49) javascript.0 2020-12-18 22:04:09.753 error (3004) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2020-12-18 22:04:09.753 error (3004) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17) javascript.0 2020-12-18 22:04:09.753 error (3004) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1140:17) javascript.0 2020-12-18 22:04:09.752 error (3004) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1559:17) javascript.0 2020-12-18 22:04:09.752 error (3004) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1503:37) javascript.0 2020-12-18 22:04:09.752 error (3004) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1280:28) javascript.0 2020-12-18 22:04:09.752 error (3004) at Object.createScript (vm.js:277:10) javascript.0 2020-12-18 22:04:09.752 error (3004) at new Script (vm.js:83:7) javascript.0 2020-12-18 22:04:09.752 error (3004) SyntaxError: Unexpected token var javascript.0 2020-12-18 22:04:09.752 error (3004) ^^^ javascript.0 2020-12-18 22:04:09.752 error (3004) var id = "javascript.0.Wetterstation.Aussentemperatur"; javascript.0 2020-12-18 22:04:09.752 error at script.js.common.Skript_1:6 javascript.0 2020-12-18 22:04:09.752 error (3004) script.js.common.Skript_1 compile failed: javascript.0 2020-12-18 22:04:09.752 info (3004) Start javascript script.js.common.Skript_1
Kannst du mir helfen?
-
@sonystar sagte in Max /Mintemperatur aus influxdb mit gethistory:
javascript.0.Wetterstation.Aussentemperatur
Mhhh error 3004 - unexpected token sagt mir grad nix.
Gibt es den denn Datenpunkt javascript.0.Wetterstation.Aussentemperatur ?
Wenn ja wie ist dieser definiert ? -
@sonystar
Das Script ist verstümmelt. Lösche alle "! " am Anfang der Zeilen, in denen es vorhanden ist.
Zeile 11dt = dt36001000; // Zeitraum umrechnen in ??
ändern
dt = dt * 3600 * 1000; // Zeitraum umrechnen in ms
-
@Segway @paul53
Dankeschön schonmal.
Jetzt komme ich schonmal ein paar Zeilen weiter:javascript.0 2020-12-18 22:14:53.647 info (3004) Stop script script.js.common.Skript_1 javascript.0 2020-12-18 22:14:51.485 error (3004) at process._tickCallback (internal/process/next_tick.js:68:7) javascript.0 2020-12-18 22:14:51.485 error (3004) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49) javascript.0 2020-12-18 22:14:51.485 error (3004) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2020-12-18 22:14:51.485 error (3004) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17) javascript.0 2020-12-18 22:14:51.485 error (3004) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1140:17) javascript.0 2020-12-18 22:14:51.485 error (3004) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1559:17) javascript.0 2020-12-18 22:14:51.485 error (3004) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1503:37) javascript.0 2020-12-18 22:14:51.485 error (3004) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1280:28) javascript.0 2020-12-18 22:14:51.485 error (3004) at Object.createScript (vm.js:277:10) javascript.0 2020-12-18 22:14:51.485 error (3004) at new Script (vm.js:83:7) javascript.0 2020-12-18 22:14:51.485 error (3004) SyntaxError: missing ) after argument list javascript.0 2020-12-18 22:14:51.485 error (3004) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ javascript.0 2020-12-18 22:14:51.485 error (3004) log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = '' + id + '''); javascript.0 2020-12-18 22:14:51.485 error at script.js.common.Skript_1:20 javascript.0 2020-12-18 22:14:51.485 error (3004) script.js.common.Skript_1 compile failed: javascript.0 2020-12-18 22:14:51.484 info (3004) Start javascript script.js.common.Skript_1
Scheint eine Klammer zu fehlen? Wo muss ich die setzten?
-
habe meines mal kopiert. sieht so aus
// ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- // ----- Datenpunkt der ausgelesen werden soll --------------------------------- var id = "hm-rpc.1.KEQxxxxxxx.1.TEMPERATURE"; // ----- Datenpunkte in die gespeichert werden soll ---------------------------- var maxid = 'javascript.0.Datenpunkte.Temp_Aussen.Statistik_Luft_Aussen_Max24'; var minid = 'javascript.0.Datenpunkte.Temp_Aussen.Statistik_Luft_Aussen_Min24'; var dt = 24; // Zeitraum in Stunden dt = dt*3600*1000; // Zeitraum umrechnen in ?? // ----- Datenpunkte anlegen --------------------------------------------------- createState(maxid, " "); createState(minid, " "); //log('1. ) Datenpunkte angelegt '); SQLAbfrage(id); //----- SQL-Abfrage durchführen function SQLAbfrage () { // log('2. ) Datenpunkt => ' + id); // log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = \'' + id + '\''); sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); } //--------------------------------------- function GetResults (dpoint) { // log('3. ) Funktion -> GetResults aufrufen'); var end_time = new Date().getTime(); var start_time = new Date().getTime() - dt; // log('3a.) Startzeit : ' + start_time); // log('3b.) Endzeit : ' + end_time); // log(' Datenpunkt: ' + dpoint.result); // log('3c.) result : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time); // log(' Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name); sendTo('sql.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM iobroker.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 iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum); } //----- Werte schreiben (maximum, minimum) //----- minimum function minimum(result) { // log('min )Funktion -> ' + JSON.stringify(result.result)); setState(minid, result.result[0].MinVal); } //----- maximum function maximum(result) { // log('max )Funktion -> ' + JSON.stringify(result.result)); setState(maxid, result.result[0].MaxVal); // log('---- fertig -----------------------------------------'); } //--------------------------------------- // ----- Funktion jede Minute aufrufen schedule("*/5 * * * *", function(){SQLAbfrage(id);});
-
Nachdem ich das Script jetzt angepasst habe auf Influx kommt folgendes raus:
javascript.0 2020-12-18 22:36:36.669 warn at processImmediate (timers.js:658:5) javascript.0 2020-12-18 22:36:36.669 warn at tryOnImmediate (timers.js:676:5) javascript.0 2020-12-18 22:36:36.669 warn at runCallback (timers.js:705:18) javascript.0 2020-12-18 22:36:36.669 warn at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:234:41) javascript.0 2020-12-18 22:36:36.669 warn at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5297:71) javascript.0 2020-12-18 22:36:36.669 warn at Object.GetResults [as cb] (script.js.common.Skript_3:37:154) javascript.0 2020-12-18 22:36:36.669 warn (3004) TypeError: Cannot read property 'id' of undefined javascript.0 2020-12-18 22:36:36.669 warn (3004) States system pmessage io.messagebox.system.adapter.javascript.0 {"command":"query","message":{"result":[],"error":"Invalid call"},"from":"system.adapter.influxdb.0","callback":{"message":"SEL influxdb.0 2020-12-18 22:36:36.664 error (3024) query: Error: error parsing query: found NAME, expected identifier, string, number, bool at line 1, char 41 javascript.0 2020-12-18 22:36:36.663 info (3004) script.js.common.Skript_3: registered 0 subscriptions and 1 schedule javascript.0 2020-12-18 22:36:36.652 info (3004) Start javascript script.js.common.Skript_3
Hier das Script:
// ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- // ----- Datenpunkt der ausgelesen werden soll --------------------------------- var id = "javascript.0.Wetterstation.Aussentemperatur"; // ----- Datenpunkte in die gespeichert werden soll ---------------------------- var maxid = 'javascript.0.Statistik.Temp_Aussen_Max24'; var minid = 'javascript.0.Statistik.Temp_Aussen_Min24'; var dt = 24; // Zeitraum in Stunden dt = dt*3600*1000; // Zeitraum umrechnen in ms // ----- Datenpunkte anlegen --------------------------------------------------- createState(maxid, " "); createState(minid, " "); //log('1. ) Datenpunkte angelegt '); SQLAbfrage(id); //----- SQL-Abfrage durchführen function SQLAbfrage () { // log('2. ) Datenpunkt => ' + id); // log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = \'' + id + '\''); sendTo('influxdb.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); } //--------------------------------------- function GetResults (dpoint) { // log('3. ) Funktion -> GetResults aufrufen'); var end_time = new Date().getTime(); var start_time = new Date().getTime() - dt; // log('3a.) Startzeit : ' + start_time); // log('3b.) Endzeit : ' + end_time); // log(' Datenpunkt: ' + dpoint.result); // log('3c.) result : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time); // log(' Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name); sendTo('influxdb.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum); sendTo('influxdb.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum); } //----- Werte schreiben (maximum, minimum) //----- minimum function minimum(result) { // log('min )Funktion -> ' + JSON.stringify(result.result)); setState(minid, result.result[0].MinVal); } //----- maximum function maximum(result) { // log('max )Funktion -> ' + JSON.stringify(result.result)); setState(maxid, result.result[0].MaxVal); // log('---- fertig -----------------------------------------'); } //--------------------------------------- // ----- Funktion jede Minute aufrufen schedule("*/5 * * * *", function(){SQLAbfrage(id);});
-
@sonystar
Irgendwas passt da nicht.Den Datenpunkt den du auslesen möchtest ist ja unter javascript .0 usw
Macht das Sinn?
Normalerweise kommt der Datenpunkt doch von einem Messgerät wie zB bei mir von einem Homemtaic Temp/Humidity Gerät! Dieses lese ich dann aus.
Dein Datenpunkt ist ja anscheinend selber angelegt daher die Frage wie das konfiguriert ist -
@Segway
Nee das passt schon so.{ "common": { "name": "Temperatur Außen", "type": "number", "role": "state", "unit": "°C", "custom": { "influxdb.0": { "enabled": true, "changesOnly": true, "debounce": "1000", "retention": 0, "changesRelogInterval": "1800", "changesMinDelta": 0, "storageType": "Number", "aliasId": "" } } }, "native": { "name": "Temperatur Außen", "type": "number", "role": "state", "unit": "°C" }, "type": "state", "from": "system.adapter.javascript.0", "user": "system.user.admin", "ts": 1606934334904, "_id": "javascript.0.Wetterstation.Aussentemperatur", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
-
Hallo,
auch wenn das Thema schon etwas älter ist, würde ich gerne den gleichen Ansatz nutzen.
Leider erhalte ich immer folgende Warnung. Hast du vielleicht eine Idee @Segway :)?javascript.0 (129) TypeError: Cannot read property 'id' of undefined at Object.GetResults [as cb] (script.js.Allgemein.Testen.SQL:38:154) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5618:71) at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/db-states-redis/lib/states/statesInRedisClient.js:232:37) at processImmediate (internal/timers.js:461:21)
// ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- // ----- Datenpunkt der ausgelesen werden soll --------------------------------- var id = 'alias.0.Arbeitszimmer.Temperatur.ACTUAL'; // ----- Datenpunkte in die gespeichert werden soll ---------------------------- var maxid = 'javascript.0.Statistik.Temp_Aussen_Max24'; var minid = 'javascript.0.Statistik.Temp_Aussen_Min24'; var dt = 24; // Zeitraum in Stunden dt = dt*3600*1000; // Zeitraum umrechnen in ms // ----- Datenpunkte anlegen --------------------------------------------------- createState(maxid, " "); createState(minid, " "); //log('1. ) Datenpunkte angelegt '); SQLAbfrage(id); //----- SQL-Abfrage durchführen function SQLAbfrage () { // log('2. ) Datenpunkt => ' + id); // log('2a.) Abfrage => SELECT * FROM datapoints WHERE name = \'' + id + '\''); sendTo('influxdb.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); } //--------------------------------------- function GetResults (dpoint) { // log('3. ) Funktion -> GetResults aufrufen'); var end_time = new Date().getTime(); var start_time = new Date().getTime() - dt; // log('3a.) Startzeit : ' + start_time); // log('3b.) Endzeit : ' + end_time); // log(' Datenpunkt: ' + dpoint.result); // log('3c.) result : ' + JSON.stringify(dpoint.result) + ' -//- ' + start_time); // log(' Datenpunkt: ' + dpoint.result[0].id + ' ---//--- ' + dpoint.result[0].name); sendTo('influxdb.0', 'query', 'SELECT Round(Min(val),1) As MinVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum); sendTo('influxdb.0', 'query', 'SELECT Round(Max(val),1) As MaxVal FROM iobroker.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum); } //----- Werte schreiben (maximum, minimum) //----- minimum function minimum(result) { // log('min )Funktion -> ' + JSON.stringify(result.result)); setState(minid, result.result[0].MinVal); } //----- maximum function maximum(result) { // log('max )Funktion -> ' + JSON.stringify(result.result)); setState(maxid, result.result[0].MaxVal); // log('---- fertig -----------------------------------------'); } //--------------------------------------- // ----- Funktion jede Minute aufrufen schedule("*/5 * * * *", function(){SQLAbfrage(id);});
-
@adsfa
Kann dir da nicht helfen, da ich die SQL nicht mehr am laufen habe sondern auf Influx umgestiegen bin. -
@segway Danke für deine Antwort.
Ich nutze auch Influx und würde gerne Datenpunkte in iobroker damit aktualisieren.
Wie machst du das jetzt? -
@adsfa
Inwiefern Datenpunkte aktualisieren ? verstehe ich grad nicht ! -
@segway
Ich würde gerne Berechnungen vornehmen, wie z.B. die Min Temperatur der letzten 24h und das Ergebnis in einem Datenpunkt speichern. -
@adsfa
Mit Grafana und Influx brauchst du das nicht ! Das kannst du direkt in Grafana machen -
@segway
Danke dir. Wie gebe ich die berechneten Werte an iobroker zurück? Würde die gerne zum Triggern nutzen. -
@adsfa sagte in Max /Mintemperatur aus influxdb mit gethistory:
@segway
Danke dir. Wie gebe ich die berechneten Werte an iobroker zurück? Würde die gerne zum Triggern nutzen.Ah okay, du willst triggern darauf, dann musste es in einen Wert schreiben ja das stimmt.