NEWS
[gelöst] Min /Max Temperatursensor
-
Naja, in Script steht ja:
createState('MinMax.Min_24', 0); // Min seit Mitternacht
von daher wäre die Berechnung schon korrekt…
Allerdings war ja das eigentliche Problem des TE dass das Script "nicht ausgeführt" wird. Da er sich zu diversen Hinweisen noch nicht wieder geäußert hat diskutieren wir hier eh nur um des Kaisers Bart
-
Denke, das ist was paul53 meinte. `
Stimmt, man muss die Werte der letzten 24 h in einem "Schieberegister" (Array) speichern und aus diesen Werten Min und Max bilden, so wie http://www.iobroker.net/?page_id=3670&lang=de.
@Thisoft:Naja, in Script steht ja:
createState('MinMax.Min_24', 0); // Min seit Mitternacht
von daher wäre die Berechnung schon korrekt… `
In dem von mir angepassten Script. -
Ja, hast du auch wieder Recht.
Aber wenn wir gerade dabei sind das eigentliche Problem des TE zu kapern :
Man muss die Werte der letzten 24h durchaus nicht extra in einem "Schieberegister", Array oder wie auch immer speichern. Das erledigt ganz nebenbei die SQL-Datenbank (oder ggf. History genauso) mit. Hat außerdem den Vorteil dass nicht der ganze Tageswert flöten geht wenn aus irgendeinem Grund der JS-Adapter neustartet (oder man dieses Array mit noch mehr Aufwand persistieren muss). Z.B. in etwa so:
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); }
-
Das erledigt ganz nebenbei die SQL-Datenbank (oder ggf. History genauso) mit. `
Viele Wege führen nach Rom Muss man dann aktiviert haben.
@Thisoft:Hat außerdem den Vorteil dass nicht der ganze Tageswert flöten geht wenn aus irgendeinem Grund der JS-Adapter neustartet `
Da in dem verlinkten Skript die Liste mit den Werten in einem Datenpunkt (Typ: string) gespeichert und bei Skriptstart ausgelesen wird, geht nichts flöten. -
Natürlich führen viele Wege nach Rom (wobei Rom dafür ein grottenschlechtes Beispiel ist - führt eigentlich nur eine einzige Autobahn hin :lol: ).
Aber dass man SQL (oder History) nicht aktiviert hat und sich trotzdem für Min/Max-Werte interessiert ist irgendwie ein Paradoxon - oder
-
Vielen Dank allen Zusammen und Dir paul53 und htrecksler,
ich werde mal den neuen Code einspielen und Testen nur leider dauert das immer.
Was geht bei mir nicht.
er hat die if(Max <value) nicht/ausgewertet.<br="">Ich habe am Wochenende über History gesehen dass die Temperatur immer steigt. Auch wird das Script erreicht (LOG).
Aber wenn mein Max = 9,8°C war und der aktuelle Wert value =10,8°C wurde Max nicht aktualisiert.
Da ich kein Programmierer bin komme ich mit der Auswertung einer SQL-Datenbank bzw. History, was bei mir läuft, noch schwerer zu recht.
Mein erster Gedanke war auch History auszuwerten, da ja die Werte super da liegen würden und nur Warten ausgewertet zu werden.
Ich werde mal Testen.
THX</value)>
-
Hallo nochmal zusammen,
ich habe jetzt nochmal viel getestet und ich wurde auf ein paar Ideen gebracht.
Wann ging das Scipt nich am Wochenende.
Warum, weil ich da immer Updates eingespielt habe neugestartet etc.
Da habe ich mir warscheinlich die Variablen geschossen.
mit dem Tipp von htrecksler sollte es jetzt gehen.
var Max = getState("javascript.0.MinMax.Max_24").val; var Min = getState("javascript.0.MinMax.Min_24").val;
Vielen Dank nochmal an alle!!
Gruß
Christian
-
Hallo
das script ist genau das was ich suche, wo muss ich das einstellen oder wird es nur in einem HTML-Widget aufgerufen.
(bin neu im iobroker, bisher nur php-programmierung)
mfg
Ja, hast du auch wieder Recht.
Aber wenn wir gerade dabei sind das eigentliche Problem des TE zu kapern :
Man muss die Werte der letzten 24h durchaus nicht extra in einem "Schieberegister", Array oder wie auch immer speichern. Das erledigt ganz nebenbei die SQL-Datenbank (oder ggf. History genauso) mit. Hat außerdem den Vorteil dass nicht der ganze Tageswert flöten geht wenn aus irgendeinem Grund der JS-Adapter neustartet (oder man dieses Array mit noch mehr Aufwand persistieren muss). Z.B. in etwa so:
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); } ```` `
-
Hallo nochmal zusammen,
ich habe jetzt nochmal viel getestet und ich wurde auf ein paar Ideen gebracht.
Wann ging das Scipt nich am Wochenende.
Warum, weil ich da immer Updates eingespielt habe neugestartet etc.
Da habe ich mir warscheinlich die Variablen geschossen.
mit dem Tipp von htrecksler sollte es jetzt gehen.
var Max = getState("javascript.0.MinMax.Max_24").val; var Min = getState("javascript.0.MinMax.Min_24").val;
Vielen Dank nochmal an alle!!
Gruß
Christian `
Hi Christian,
ich wäre auch an dem Script interessiert.
Eventuell kannst du die finale Version hier nochmal posten. Toll wäre auch wenn du das Script mit Kommentaren versehen könntest, damit "nicht-script-profis" wie ich die einzelnen Zeilen besser nachvollziehen können.
Ich würde das Script dann auch gerne noch erweitern mit "Monats Min Max" und "Jahres Min Max".
Muss ich dazu dann nur die dt variable entsprechend anpassen, oder noch mehr ?
Danke für die Unterstützung.
Beste Grüße
-
Hallo
das script ist genau das was ich suche, wo muss ich das einstellen oder wird es nur in einem HTML-Widget aufgerufen.
(bin neu im iobroker, bisher nur php-programmierung)
mfg `
Hallo Farmer-cb
Scripte werden im Javascript-Adapter geschrieben und ausgeführt. Dazu musst du dir zuerst eine Instanz des Javascript-Adapters installieren, diese ggf. mit entsprechenden Einstellungen versehen und starten. Dann noch im Admin den Reiter "Skripte" einblenden und schon kannst Du dort ein neues Skript anlegen wo du den Code hineinkopierst Achja - dann musst du das Skript noch starten (aktivieren).
Kommst du bis dahin klar? Wenn nicht einfach nochmal fragen…
-
Servus
hab das ganze jetzt mal getestet, leider nicht erfolgreich
var id = "s7.0.DBs.DB100.Aussentemp"; 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('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); }
wenn ich es richtig interpretiere,
gibt es hier ein Problem
function SQLAbfrage () { log('Name: '+id); sendTo('sql.0', 'query', 'SELECT * FROM datapoints WHERE name = \'' + id + '\'', GetResults); }
aber dann verliesen die Ideen mich, wie kann ich den Fehler eingrenzen
mfg
Christian
-
Welche Datenbank hast du denn im Einsatz??
Stimmt die Bezeichnung deines Datenpunkts exakt (sind die Punkte alle so korrekt)? Hast Du für Deinen Datenpunkt auch die SQL-Historie aktiviert und sind da auch schon Werte vorhanden?
Der Fehler sieht ganz danach aus dass in deiner Db kein Wert mit deiner id vorhanden ist…
-
Servus
der Datenpunkt ist vorhanden (S7)
, auch in der DB vorhanden
Daten sind auch drinn
-
Hmm - ändere bitte mal den folgenden Bereich mit der Loggingausgabe:
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); . . .
und poste dann nochmal das Log
-
Servus
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 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); }
00:05:04.263 [info] javascript.0 Stop script script.js.common.minmax.Aussentemp 00:05:04.301 [info] javascript.0 Start javascript script.js.common.minmax.Aussentemp 00:05:04.301 [info] javascript.0 script.js.common.minmax.Aussentemp: schedule(cron=*/5 * * * *) 00:05:04.308 [info] javascript.0 script.js.common.minmax.Aussentemp: 1 Name: s7.0.DBs.DB100.Aussentemp 00:05:04.308 [info] javascript.0 script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT id as id FROM datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'") 00:05:04.309 [info] javascript.0 script.js.common.minmax.Aussentemp: registered 0 subscriptions and 1 schedule 00:05:04.320 [info] javascript.0 script.js.common.minmax.Aussentemp: startzeit: 1514847904311 00:05:04.320 [info] javascript.0 script.js.common.minmax.Aussentemp: endzeit: 1514934304311 00:05:04.321 [info] javascript.0 script.js.common.minmax.Aussentemp: undefined 00:05:04.321 [error] javascript.0 TypeError: Cannot read property '0' of undefined at Object.GetResults [as cb] (script.js.common.minmax.Aussentemp:42:27) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3151:71) at RedisClient. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:104:25) at emitThree (events.js:116:13) at RedisClient.emit (events.js:194:7) at return_pub_sub (/opt/iobroker/node_modules/redis/index.js:794:18) at RedisClient.return_reply (/opt/iobroker/node_modules/redis/index.js:833:9) at JavascriptRedisParser.returnReply (/opt/iobroker/node_modules/redis/index.js:192:18) at JavascriptRedisParser.execute (/opt/iobroker/node_modules/redis-parser/lib/parser.js:574:12) at Socket. (/opt/iobroker/node_modules/redis/index.js:274:27)
-
Dat Ding wehrt sich aber auch - müssen wir uns rantasten… Ändere mal bitte das Codestück wie folgt:
function SQLAbfrage (id) { sendTo('sql.0', 'query', 'SELECT id, name FROM datapoints WHERE name = \'' + id + '\'', function(result){ log(JSON.stringify(result)); //GetResults(result); }); }
-
ergebnis
08:51:29.085 [info] javascript.0 Stop script script.js.common.minmax.Aussentemp 08:51:29.128 [info] javascript.0 Start javascript script.js.common.minmax.Aussentemp 08:51:29.129 [info] javascript.0 script.js.common.minmax.Aussentemp: schedule(cron=*/5 * * * *) 08:51:29.130 [info] javascript.0 script.js.common.minmax.Aussentemp: sendTo(adapter=sql.0, cmd=query, msg="SELECT id, name FROM datapoints WHERE name = 's7.0.DBs.DB100.Aussentemp'") 08:51:29.131 [info] javascript.0 script.js.common.minmax.Aussentemp: registered 0 subscriptions and 1 schedule 08:51:29.167 [info] javascript.0 script.js.common.minmax.Aussentemp: {"error":"Error: ER_NO_DB_ERROR: No database selected"}
mir kommt es so vor, als ob die weitergabe des Ergebnisses nicht funktioniert
-
Natürlich wird das Ergebnis jetzt nicht weitergegeben - hab ich ja auskommentiert
Und der springende Punkt ist:
"Error: ER_NO_DB_ERROR: No database selected"
Jetzt wo ich nochmal auf deine Screenshots schaue fällt es mir auch wie Schuppen aus den Haaren
Du hast ja gar keinen SQL-Adapter sondern nur die History aktiviert! (Hatte ich auch weiter vorn schon mal danach gefragt…)
Dann wird das so nix. Kann ich dir aber auch aus dem Stegreif nicht weiterhelfen. History habe und hatte ich nie im Einsatz. Evtl. kann ich heute abend mal schauen was man da umbauen müsste...
-
Mahlzeit
ich hab doch SQL aktiv!!
oder versteh ich da was falsch
-
Na Prost Mahlzeit
stimmt auch wieder - du hast ja beides installiert. Jetzt weiß ich aber auf Anhieb aus der Ferne auch nicht mehr zu raten…
Die Fehlermeldung sagt aber relativ deutlich dass der sendTo-Befehl auf den Adapter "SQL.0" keine Datenbank zuordnen kann :!: :?: :?
Bekommst du denn Werte angezeigt wenn du im Historien-Fenster auf Tabelle oder Grafik gehst?
Ansonsten vielleicht mal noch das LogLevel des SQL-Adapters auf "Debug" stellen und schauen ob da beim Ausführen des Scripts noch was aussagekräftiges geloggt wird.