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.
    • htrecksler
      htrecksler Forum Testing last edited by

      so sollte es gehen…aber nicht getestet.

      createState('MinMax.Min_24', 40);   // Min der letzten 24h
      createState('MinMax.Max_24', -20);   // Max der letzten 24h
      
      on({id: "hm-rpc.0.JEQ0014307.1.TEMPERATURE", change: "any"}, function (obj) {
          log("Script wird erreich MinMAx");
          var value = obj.state.val;
          var oldValue = obj.oldState.val;
          var Max = getState("javascript.0.MinMax.Max_24").val;
          var Min = getState("javascript.0.MinMax.Min_24").val;
          if (Max < value) {
              Max = value;
              log("Script Max hat " +Max);
              setState("javascript.0.MinMax.Max_24", Max); 
          }
          if (Min > value) {
              Min = value;
              log("Script Min hat " +Min);
              setState("javascript.0.MinMax.Min_24", Min);
          }
      });
      
      schedule({hour: 0, minute: 04}, function () {
          log("Will be triggered at ´00:04!");
          Max = -20;
          Min = 40;
          setState("javascript.0.MinMax.Min_24", Min);
          setState("javascript.0.MinMax.Max_24", Max);
      });
      
      

      Bei dir fehlte das "holen" des letzten Min bzw Max wertes.

      Und bei den setState fehlte die javascript Instanz (javascript.0.xxxx)

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

        @htrecksler:

        Bei dir fehlte das "holen" des letzten Min bzw Max wertes. `
        Nein, die globalen Skriptvariablen bleiben aktuell, solange das Skript nicht beendet bzw. neu gestartet wird.
        @htrecksler:

        Und bei den setState fehlte die javascript Instanz (javascript.0.xxxx) `
        Die Angabe der Instanz ist bei Datenpunkten, die zur JS-Instanz gehören (z.B. mit createState() erstellt), nicht erforderlich.

        Am Skript von Christian kann ich keine Fehler erkennen. Wird es denn ausgelöst (log("Script wird erreich MinMAx");) ? Wenn nicht, hat sich vielleicht die ID des auslösenden Datenpunktes geändert ?

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

          @HomeChristian:

          Vielleicht gibt es auch elegantere Lösungen. `
          Nicht wesentlich. Die Aussage "Min der letzten 24h" ist nicht korrekt, dazu müsste ein gleitender Mittelwert gebildet werden

          createState('MinMax.Min_24', 0);   // Min seit Mitternacht
          createState('MinMax.Max_24', 0);   // Max seit Mitternacht
          
          var idTemp = "hm-rpc.0.MEQ1234567.1.TEMPERATURE";
          var Max = getState("MinMax.Max_24").val;
          var Min = getState("MinMax.Min_24").val;
          
          on(idTemp, function (obj) {
            var value = obj.state.val;
            log("Script hat " +value);
            if (Max < value) {
                Max = value;
                setState("MinMax.Max_24", Max);
            }
            if (Min > value) {
                Min = value;
                setState("MinMax.Min_24", Min);
            }
          });
          
          schedule("4 0 * * *", function () {
              log("triggered at ´00:04!");
              Min = getState(idTemp).val;
              Max = Min;
              setState("MinMax.Min_24", Min);
              setState("MinMax.Max_24", Max);
          });
          
          1 Reply Last reply Reply Quote 0
          • Thisoft
            Thisoft last edited by

            Das verstehe ich jetzt nicht :roll: Wieso muss für das "Min der letzten 24h" ein gleitender Mittelwert gebildet werden?

            1 Reply Last reply Reply Quote 0
            • AlCalzone
              AlCalzone Developer last edited by

              Mittelwert ist der falsche Ausdruck.

              Wenn du aber immer für die letzten 24h den Min/Max-Wert haben willst, musst du:

              • zu allen Werten den Zeitpunkt speichern,

              • diejenigen rausschmeißen, die älter sind und

              • aus den verbleibenden Werten mit Math.min(…) bzw. Math.max(...) das Minimum/Maximum ermitteln.

              Denke, das ist was paul53 meinte.

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

                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 😉

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

                  @AlCalzone:

                  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.

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

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

                      @Thisoft:

                      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.

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

                        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 😉

                        1 Reply Last reply Reply Quote 0
                        • H
                          HomeChristian last edited by

                          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.

                          @Thisoft

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

                          1 Reply Last reply Reply Quote 0
                          • H
                            HomeChristian last edited by

                            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

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

                              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

                              @Thisoft:

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

                                @HomeChristian:

                                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

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

                                  @Farmer-cb:

                                  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…

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

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

                                    4639_fehler_minmax.gif

                                    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

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

                                      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…

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

                                        Servus

                                        der Datenpunkt ist vorhanden (S7)
                                        4639_history.gif

                                        , auch in der DB vorhanden
                                        4639_db-datapoints.gif

                                        Daten sind auch drinn
                                        4639_db_number.gif

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

                                          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

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

                                            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)
                                            
                                            
                                            1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            888
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

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