Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Hilfe: mysql/js lineare Regression Script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Hilfe: mysql/js lineare Regression Script

    This topic has been deleted. Only users with topic management privileges can see it.
    • hanss
      hanss last edited by

      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.html

      Leider 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 < EndZeit

      usw.

      1 Reply Last reply Reply Quote 0
      • hanss
        hanss last edited by hanss

        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
        
        foxriver76 1 Reply Last reply Reply Quote 0
        • foxriver76
          foxriver76 Developer @hanss last edited by

          @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 ungleich null ist

          if (steigung === null) {
              logwarn("steigung1: ist NULL")
          } else {
              return steigung
          }
          
          hanss 1 Reply Last reply Reply Quote 0
          • hanss
            hanss @foxriver76 last edited by

            @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).

            foxriver76 1 Reply Last reply Reply Quote 0
            • foxriver76
              foxriver76 Developer @hanss last edited by

              @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`);
              });
              
              1 Reply Last reply Reply Quote 0
              • hanss
                hanss last edited by hanss

                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*/ }
                 });
                
                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                854
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                javascript
                2
                6
                348
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo