Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Hilfe: mysql/js lineare Regression Script

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.4k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.5k

Hilfe: mysql/js lineare Regression Script

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
6 Beiträge 2 Kommentatoren 387 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • hanssH Offline
    hanssH Offline
    hanss
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • hanssH Offline
      hanssH Offline
      hanss
      schrieb am zuletzt editiert von hanss
      #2

      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
      
      foxriver76F 1 Antwort Letzte Antwort
      0
      • hanssH 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
        
        foxriver76F Offline
        foxriver76F Offline
        foxriver76
        Developer
        schrieb am zuletzt editiert von
        #3

        @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
        }
        

        Videotutorials & mehr

        Hier könnt ihr mich unterstützen.

        hanssH 1 Antwort Letzte Antwort
        0
        • foxriver76F foxriver76

          @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
          }
          
          hanssH Offline
          hanssH Offline
          hanss
          schrieb am zuletzt editiert von
          #4

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

          foxriver76F 1 Antwort Letzte Antwort
          0
          • hanssH hanss

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

            foxriver76F Offline
            foxriver76F Offline
            foxriver76
            Developer
            schrieb am zuletzt editiert von
            #5

            @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`);
            });
            

            Videotutorials & mehr

            Hier könnt ihr mich unterstützen.

            1 Antwort Letzte Antwort
            0
            • hanssH Offline
              hanssH Offline
              hanss
              schrieb am zuletzt editiert von hanss
              #6

              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 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              360

              Online

              32.4k

              Benutzer

              81.4k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe