NEWS
Hilfe: mysql/js lineare Regression Script
-
Hallo,
vielleicht kann mir jemand helfen.
Ich suche ein Script, welches mir die Steigung einer Datenreihe aus mysql ermittelt.Die Funktion Steigung sollte die Steigung der Durchschnittswerte aus der Datenreihe
zwischen Start Datum/Zeit und End Datum/Zeit zurückgeben.
z.B. hier:
http://www.silota.com/docs/recipes/sql-linear-regression.htmlLeider kann ich die diese Beispiele nicht in ioBroker/js umsetzten.
Vielen Dank schon einmal.
function Steigung(Datenreihe,StartZeit,EndZeit)
// Datenreihe = 'javascript.0.haus.Heizung.Kessel.GasVerbrauch'
// Die Datenreihe erhalte ich
SELECT val AS Du_Temp FROM iobroker.ts_number
WHERE id=(SELECT id FROM iobroker.datapoints WHERE NAME='javascript.0.haus.Heizung.Kessel.GasVerbrauch')
AND ts >= StartZeit AND ts < EndZeitusw.
-
Ich habe es doch noch hinbekommen.
Falls es jemand brauchen kann:
( Vielleicht hat jemand einen Tip, wie man den Return Wert "Steigung" von der Funktion
"mysqlData_Steigung" erst dann zurückerhalten kann, wenn die Funktion "sendTo" fertig ist.
Wenn man jetzt "return steigung" einfügt, dann erhält man ein ungültiges Ergebnis,
weil "sendTo" noch nicht geliefert hatte.)
var steigung = 0 var vonDatum = new Date("2020-01-31 04:30:00").getTime() // in UnixTime ms. var bisDatum = new Date("2020-01-31 06:30:00").getTime() // vonDatum = bisDatum - 7200*1000; // vor zwei Stunden // loginfo("vonUnixTime: "+vonDatum) // loginfo("bisUnixTime: "+bisDatum) var DatObj = 'javascript.0.haus.Heizung.OG_Zi_Links.Temperatur' mysqlData_Steigung(vonDatum, bisDatum, DatObj) // return steigung nicht möglich, weil asynchron //######################################################################## // Funktion speichert Steigung (+-) in K/Std in globale Variable steigung // momentan ist Variable steigung erst nach 50ms gültig, weil Funktion asynchron !!!!!!!!!!!!!!! // vonDatum, bisDatum in UnixTime msec., Daten-Objekt function mysqlData_Steigung(vonDatum, bisDatum, DatObj){ var myQuery="SELECT ( SUM((ts - x_avg) * (val - y_avg)) / SUM((ts - x_avg) * (ts - x_avg)) )*1000 *3600 AS wert \ FROM( \ SELECT val, AVG(val) AS y_avg, \ ts, AVG(ts) AS x_avg \ FROM iobroker.ts_number \ WHERE id=(SELECT id FROM iobroker.datapoints WHERE NAME='"+DatObj+"') \ AND ts >= '"+vonDatum+"' \ AND ts < '"+bisDatum+"' \ ) s;" // log("--->>>>"+myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { logerror("SQL querry Fehler!!!: "+result.error); } else { steigung=result.result[0].wert; log("Ergebnis1: "+steigung) if (steigung === null){ logwarn("steigung1: ist NULL") } } }); } // function
-
@hanss sagte in Hilfe: mysql/js lineare Regression Script:
Wenn man jetzt "return steigung" einfügt, dann erhält man ein ungültiges Ergebnis,
weil "sendTo" noch nicht geliefert hatte.)Ja, im Callback von
sendTo
wurde result doch auf jeden Fall geliefert. z. B. wenn Wert nur zurückgegeben werden soll wenn er ungleichnull
istif (steigung === null) { logwarn("steigung1: ist NULL") } else { return steigung }
-
@foxriver76
Danke, aber funktioniert nicht. Ergebnis: x = undefiniert.
Ich meine, das return geht zurück auf die aufrufende Funktion mysqlDate_Steigung und nicht
zurück zu var x = mysqlData_Steigung(vonDatum, bisDatum, DatObj). -
@hanss Ja, da Javascript asynchron ausgeführt wird. Zeig doch mal dein ganzes Skript, dann kann man sehen was am meisten Sinn macht. Du musst mit callbacks oder async/await arbeiten.
Also z. B. einen Parameter
cb
zur Funktion hinzufügen
function mysqlData_Steigung(vonDatum, bisDatum, DatObj, cb){
if (steigung === null) { logwarn(`steigung1: ist NULL`); } else if (typeof cb === `function`) { return cb(steigung); }
Und um mit dem Ergebnis zu arbeiten:
mysqlData_Steigung(vonDatum, bisDatum, DatObj, (steigung) => { log(`Die Steigung beträgt ${steigung}`, `info`); });
-
hallo foxriver76
vielen Dank.
Das Ganze sollte so aussehen:EinDaten[0]='mqtt.0.haus.OG.Wohnen.Temperatur'; // Messwerte und Ausgabe EinDaten[1]='mqtt.0.haus.OG.Schlafen.Temperatur'; EinDaten[2]='mqtt.0.haus.OG.Kueche.Temperatur'; EinDaten[3]='mqtt.0.haus.OG.Buero.Temperatur'; MS[0]='Wohnzimmer' MS[1]='Schlafzimmer' MS[2]='Küche' MS[3]='Büro' var vonDatum = new Date("2020-01-31 04:30:00").getTime() // in UnixTime ms. var bisDatum = new Date("2020-01-31 06:30:00").getTime() EinDaten.forEach(function(element, index) { steigung = mysqlData_Steigung(vonDatum, bisDatum, element) if (steigung > 3) { log (MS[index]+" >3 " +steigung ) /* Verzweigung*/ } else if (steigung >0 ) { log (MS[index]+" >0 " +steigung ) /* Verzweigung*/ } else if (steigung < -3) { log (MS[index]+" < -3 "+steigung ) /* Verzweigung*/ } else if (steigung < 0) { log (MS[index]+" <0 " +steigung ) /* Verzweigung*/ } else if (steigung ==0 ) { log (MS[index]+" = 0 " +steigung ) /* Verzweigung*/ } });