Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Min /Max Temperatursensor

    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

    [gelöst] Min /Max Temperatursensor

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      der_Auge last edited by Jey Cee

      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

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

        @der_Auge:

        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.

        1 Reply Last reply Reply Quote 0
        • D
          der_Auge last edited by

          @Thisoft:

          @der_Auge:

          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. `
          3361_sql_db.png

          1 Reply Last reply Reply Quote 0
          • F
            Farmer-cb last edited by

            Mahlzeit

            ich nutze mysql, da gehts

            1 Reply Last reply Reply Quote 0
            • Q
              Qlink last edited by

              @der_Auge:

              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

              1 Reply Last reply Reply Quote 0
              • D
                der_Auge last edited by

                @Qlink:

                @der_Auge:

                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

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

                  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.

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

                    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?

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

                      @umbm:

                      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.

                      1 Reply Last reply Reply Quote 0
                      • B
                        bloop last edited by

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

                        c51a3e7b-bcca-4ca8-be3a-3b7265bd9c4e-image.png

                        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!!

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        562
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        12
                        43
                        11068
                        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