NEWS
[gelöst] Min /Max Temperatursensor
-
da kommt auch nicht mehr raus:
javascript.0 2018-01-03 15:00:00.226 info script.js.common.minmax.Aussentemp: {"error":"Error: ER_NO_DB_ERROR: No database selected"} javascript.0 2018-01-03 15:00:00.158 info script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT id, name FROM datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'") javascript.0 2018-01-03 14:55:00.184 info script.js.common.minmax.Aussentemp: {"error":"Error: ER_NO_DB_ERROR: No database selected"} javascript.0 2018-01-03 14:55:00.157 info script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT id, name FROM datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'") javascript.0 2018-01-03 14:50:00.221 info script.js.common.minmax.Aussentemp: {"error":"Error: ER_NO_DB_ERROR: No database selected"} javascript.0 2018-01-03 14:50:00.158 info script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT id, name FROM datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'")
in der Tabelle steht etwas
sql.gif `
sendTo('sql.0', 'query', 'SELECT id, name FROM iobroker.datapoints WHERE nam…....
-
sendTo('sql.0', 'query', 'SELECT id, name FROM iobroker.datapoints WHERE nam….... `
JA, das wäre einen Versuch wert. Unter anderem deshalb hatte ich ja (bisher erfolglos ) gefragt welche Db denn der TE im Einsatz hat…
-
jetzt häng ich mich auch noch mal dran…
folgenden Code habe ich jetzt als Test im Einsatz:
function SQLAbfrage () { log(id); sendTo('sql.0', 'query', 'SELECT id, name FROM iobroker.datapoints WHERE name = \'' + id + '\'', function(result){ log(JSON.stringify(result)); // GetResults(result); }); // sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); }
und das kommt im LOG:
16:50:00.943 [info] javascript.1 script.js.Test.Test2: hm-rpc.0.IEQ0023353.1.TEMPERATURE 16:50:00.947 [info] javascript.1 script.js.Test.Test2: {"error":null,"result":[{"id":21,"name":"hm-rpc.0.IEQ0023353.1.TEMPERATURE"}]}
Woher kommt der Error?
Was mach ich falsch ?
Gruß
Michael
-
jetzt häng ich mich auch noch mal dran…
folgenden Code habe ich jetzt als Test im Einsatz:
function SQLAbfrage () { log(id); sendTo('sql.0', 'query', 'SELECT id, name FROM iobroker.datapoints WHERE name = \'' + id + '\'', function(result){ log(JSON.stringify(result)); // GetResults(result); }); // sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); }
und das kommt im LOG:
16:50:00.943 [info] javascript.1 script.js.Test.Test2: hm-rpc.0.IEQ0023353.1.TEMPERATURE 16:50:00.947 [info] javascript.1 script.js.Test.Test2: {"error":null,"result":[{"id":21,"name":"hm-rpc.0.IEQ0023353.1.TEMPERATURE"}]}
Woher kommt der Error?
Was mach ich falsch ?
Gruß
Michael `
createState('Statistik.Luft1.Max24', 0); createState('Statistik.Luft1.Min24', 0); var id = "hm-rpc.0.IEQ0023353.1.TEMPERATURE"; 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 iobroker.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 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); }
-
juhu
so funktioniert es jetzt
var id = "s7.0.DBs.DB100.Aussentemp"; //var maxid = 'javascript.0.Statistik.Luft1.Max24'; //var minid = 'javascript.0.Statistik.Luft1.Min24'; var maxid = "javascript.0.scriptEnabled.common.minmax.Statistik.Aussentemp.max24";/*max24*/ var minid = "javascript.0.scriptEnabled.common.minmax.Statistik.Aussentemp.min24";/*min24*/ var dt = 24;//Zeitraum in Stunden dt = dt*3600*1000; schedule("*/5 * * * *", function(){SQLAbfrage(id);}); SQLAbfrage(id); // minimum function minimum(result) { log('Fn Min'+JSON.stringify(result.result)); setState(minid, result.result[0].MinVal); } // maximum function maximum(result) { log('Fn Max'+ JSON.stringify(result.result)); setState(maxid, result.result[0].MaxVal); } function SQLAbfrage () { log('Name: '+id); sendTo('sql.0', 'query', 'SELECT * FROM iobroker.datapoints WHERE name = \'' + id + '\'', GetResults); } function GetResults (dpoint) { var end_time = new Date().getTime(); var start_time = new Date().getTime() - dt; log('startzeit: '+start_time); log('endzeit: '+end_time); log(JSON.stringify(dpoint.result)); log('id: '+dpoint.result[0].name); //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 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); }
meldung im Log:
18:26:27.313 [info] javascript.0 Stop script script.js.common.minmax.Aussentemp 18:26:27.352 [info] javascript.0 Start javascript script.js.common.minmax.Aussentemp 18:26:27.353 [info] javascript.0 script.js.common.minmax.Aussentemp: schedule(cron=*/5 * * * *) 18:26:27.354 [info] javascript.0 script.js.common.minmax.Aussentemp: Name: s7.0.DBs.DB100.Aussentemp 18:26:27.354 [info] javascript.0 script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT * FROM iobroker.datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'") 18:26:27.355 [info] javascript.0 script.js.common.minmax.Aussentemp: registered 0 subscriptions and 1 schedule 18:26:27.472 [info] javascript.0 script.js.common.minmax.Aussentemp: startzeit: 1514913987450 18:26:27.472 [info] javascript.0 script.js.common.minmax.Aussentemp: endzeit: 1515000387450 18:26:27.473 [info] javascript.0 script.js.common.minmax.Aussentemp: [{"id":11,"name":"s7.0.DBs.DB100.Aussentemp","type":0}] 18:26:27.474 [info] javascript.0 script.js.common.minmax.Aussentemp: id: s7.0.DBs.DB100.Aussentemp 18:26:27.475 [info] javascript.0 script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT Round(Min(val),1) As MinVal FROM iobroker.ts_number WHERE ts >= 1514913987450 AND id=11 GROUP BY id") 18:26:27.475 [info] javascript.0 script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT Round(Max(val),1) As MaxVal FROM iobroker.ts_number WHERE ts >= 1514913987450 AND id=11 GROUP BY id") 18:26:28.007 [info] javascript.0 script.js.common.minmax.Aussentemp: Fn Max[{"MaxVal":6.2}] 18:26:28.008 [info] javascript.0 script.js.common.minmax.Aussentemp: setForeignState(id=javascript.0.scriptEnabled.common.minmax.Statistik.Aussentemp.max24, state=6.2) 18:26:28.029 [info] javascript.0 script.js.common.minmax.Aussentemp: Fn Min[{"MinVal":1.5}] 18:26:28.030 [info] javascript.0 script.js.common.minmax.Aussentemp: setForeignState(id=javascript.0.scriptEnabled.common.minmax.Statistik.Aussentemp.min24, state=1.5)
finde keine error ausgabe, sollte also funzn
Vielen Dank bis hierhin schon mal und für die Geduld
hab jetzt nur noch diese Fehlermeldung in der Log :
admin.0 2018-01-03 18:26:28.047 error change ID is empty: {"common":{"enabled":1.5},"from":"system.adapter.javascript.0","ts":1515000388026,"_id":null} cloud.0 2018-01-03 18:26:28.037 error change ID is empty: {"common":{"enabled":1.5},"from":"system.adapter.javascript.0","ts":1515000388026,"_id":null} sql.0 2018-01-03 18:26:28.036 error change ID is empty: {"common":{"enabled":1.5},"from":"system.adapter.javascript.0","ts":1515000388026,"_id":null} javascript.0 2018-01-03 18:26:28.035 error change ID is empty: {"common":{"enabled":1.5},"from":"system.adapter.javascript.0","ts":1515000388026,"_id":null} web.0 2018-01-03 18:26:28.033 error change ID is empty: {"common":{"enabled":1.5},"from":"system.adapter.javascript.0","ts":1515000388026,"_id":null} sql.0 2018-01-03 18:26:28.021 error change ID is empty: {"common":{"enabled":6.2},"from":"system.adapter.javascript.0","ts":1515000388010,"_id":null} javascript.0 2018-01-03 18:26:28.023 error change ID is empty: {"common":{"enabled":6.2},"from":"system.adapter.javascript.0","ts":1515000388010,"_id":null} cloud.0 2018-01-03 18:26:28.022 error change ID is empty: {"common":{"enabled":6.2},"from":"system.adapter.javascript.0","ts":1515000388010,"_id":null} web.0 2018-01-03 18:26:28.018 error change ID is empty: {"common":{"enabled":6.2},"from":"system.adapter.javascript.0","ts":1515000388010,"_id":null}
die Werte stehen aber im Datenpunkt
mach ich da noch etwas verkehrt
hab die error-meldungen mal in ein eigenen Thread gesetzt
-
super
nun habe ich es verstanden.
der Datenbankname der im Adapter hinterlegt wurde muss mit angegeben werden.
// ----------------------------------------------------------------------------- // ----- Abfragen von Werten aus der Datenbank (SQL) --------------------------- // ----------------------------------------------------------------------------- // ----- Datenpunkt der ausgelesen werden soll --------------------------------- var id = "javascript.0.eBus.Temperatur.FlowTemp"/*Vorlauf */; // ----- Datenpunkte in die gespeichert werden soll ---------------------------- var maxid = 'javascript.0.Statistik.FlowTemp.Max24'; var minid = 'javascript.0.Statistik.FlowTemp.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 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('sql.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('sql.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 -----------------------------------------'); } //--------------------------------------- // ----- Funktion jede Minute aufrufen schedule("*/1 * * * *", function(){SQLAbfrage(id);});
Nun kann ich weiter versuchen die Tages, Wochen, Jahres-Werte aus der Datenbank abzufragen
Gruß
Jürgen
-
der Datenbankname der im Adapter hinterlegt wurde muss mit angegeben werden. `
Könnt Ihr mir bitte noch verraten welche Db ihr verwendet? Bei meiner (MSSQL) darf ich den nämlich nicht mit angeben sonst sagt er mir die Tabelle sei unbekannt.
-
-
Mahlzeit
ich nutze mysql, da gehts
-
Nun kann ich weiter versuchen die Tages, Wochen, Jahres-Werte aus der Datenbank abzufragen
Gruß
Jürgen `
Hi Jürgen,
könntest du dein Script hier reinstellen, sobald du es um die Tages, Wochen und Jahres Werte erweitert hast ?
Das wäre toll.
Beste Grüße
-
Nun kann ich weiter versuchen die Tages, Wochen, Jahres-Werte aus der Datenbank abzufragen
Gruß
Jürgen `
Hi Jürgen,könntest du dein Script hier reinstellen, sobald du es um die Tages, Wochen und Jahres Werte erweitert hast ?
Das wäre toll.
Beste Grüße `
Das werde ich machen.
Habe aber bereits festgestellt, das es nicht so einfach ist mit den SQL Befehlen.
sendTo('sql.0', 'query', 'SELECT * As MinVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum); sendTo('sql.0', 'query', 'SELECT * As MaxVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',maximum);
Hiermit muss ich ja die Werte "von" / "bis" abfragen
Vielleicht hat ja jemand eine Idee?
Werde es aber weiter versuchen.
Gruß
Jürgen
-
Tja, also im SQL ist's eigentlich einfach:
sendTo('sql.0', 'query', 'SELECT * As MinVal FROM ioBmaster.ts_number WHERE ts >= ' + start_time + ' AND ts <= ' + end_time + ' AND id=' + dpoint.result[0].id + ' GROUP BY id',minimum);
Du mußt dann nur die beiden Variablen "start_time" und "end_time" vorher korrekt befüllen.
-
Da ich mich dem Thema der Min/Max Ermittlung auf einem anderen Weg nähern wollte, mal eine Frage:
Wie sieht es mit der Systemlast aus, wenn die Datenbank jede Minute abgefragt wird?
Ich wollte das prinzipiell nur so mit Datenpunkten machen, wie es im ersten Beitrag des TE beschrieben ist.
Also eigentlich völlig ohne Array oder häufige DB-Abfrage.
Erzeugt die ursprüngliche Lösung nicht wesentlich weniger Systemlast, wenn nun zwischen den Datenpunkten seit Mitternacht verglichen wird?
-
Wie sieht es mit der Systemlast aus, wenn die Datenbank jede Minute abgefragt wird?
Erzeugt die ursprüngliche Lösung nicht wesentlich weniger Systemlast, wenn nun zwischen den Datenpunkten seit Mitternacht verglichen wird?Ja, eine Datenbankabfrage erzeugt eine höhere Systemlast, zumal sich auch noch der Temperaturwert seltener als jede Minute ändert.
-
Liebe Community,
Ich würde zu diesem Thema eure hilfe benötigen.
Bin noch kompletter Rookie und habe versucht das hier angegebene Skript einzubauen.
Datenpunkte sind erstellt, MySQL läuft und dennoch erhalte ich eine Fehlermeldung.
Kann mir bitte jemand weiter helfen?var id = 'mqtt.0.Temp_Keller.VL_Heizung.temperature'; var maxid = 'mqtt.0.Temp_Keller.VL_Heizung.Max24'; var minid = 'mqtt.0.Temp_Keller.VL_Heizung.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('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('startzeit: '+start_time); log('endzeit: '+end_time); log('id: '+dpoint.result[0].name); //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 erhalte folgenden Fehler:
24.1.2021, 16:16:57.511 [info ]: javascript.0 (8747) Start javascript script.js.common.Temp_VL-min_max 24.1.2021, 16:16:57.538 [info ]: javascript.0 (8747) script.js.common.Temp_VL-min_max: Name: mqtt.0.Temp_Keller.VL_Heizung.temperature 24.1.2021, 16:16:57.540 [info ]: javascript.0 (8747) script.js.common.Temp_VL-min_max: registered 0 subscriptions and 1 schedule 24.1.2021, 16:16:57.554 [info ]: javascript.0 (8747) script.js.common.Temp_VL-min_max: startzeit: 1611415017554 24.1.2021, 16:16:57.555 [info ]: javascript.0 (8747) script.js.common.Temp_VL-min_max: endzeit: 1611501417554 24.1.2021, 16:16:57.576 [warn ]: javascript.0 (8747) TypeError: Cannot read property '0' of undefined at Object.GetResults [as cb] (script.js.common.Temp_VL-min_max:39:27) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5297:71) at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:234:41) at processImmediate (internal/timers.js:461:21)
Wenn ich das richtig Interpretiere findet er in der Datenbank des Datenpunkes keine Werte. MySQL ist für den Punkt jedoch aktiviert...
Da ich bei den Skripts nur bedingt Durchblicke und mich in den meisten Fällen mit Copy/Paste und Blockly durch Schummle wäre ich sehr dankbar über eure Hilfe!
Herzlichen Dank!!