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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Wert aus Unterfunktion übergeben?

NEWS

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

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

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

Wert aus Unterfunktion übergeben?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
14 Beiträge 2 Kommentatoren 2.4k Aufrufe
  • Ä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.
  • R Offline
    R Offline
    roland
    schrieb am zuletzt editiert von
    #3

    Danke für die schnelle Antwort.

    Unter dem Begriff Javascrpit finde ich schon mal bessere Beschreibungen der Syntax.

    Ich habe jetzt mal folgenden Code:

     `var id = 'hm-rpc.0.KEQ0766772.1.TEMPERATURE';
    
    SQLAbfrage(id,'0.5','MW');
    
    function SQLAbfrage (id,dt,Status) {
    dt = dt*3600*1000;
    var end_time = new Date().getTime();
    var start_time = end_time - dt;
    var i;
    var mw=0;
    var max=-100; 
    var min=100;
    sendTo('sql.0', 'getHistory', {
        id: id,
        options: {
            start:      start_time,
            end:        end_time,
            aggregate: 'none' // or 'none' to get raw values
        }
    }, function (result) {
        for (i = 0; i < result.result.length; i++) {
            console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString());
            mw=mw+result.result[i].val;
            if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;}
        }
        mw=mw/(result.result.length);
        console.log(mw);
        console.log(max);
        console.log(min);
        }
    );
    console.log('MW '+ mw);
    }</result.result[i].val){max=result.result[i].val;}>` 
    
    Der Eintrag im Log sieht so aus:
    
    ~~~~
    *   11:46:25.893	[info]	javascript.0 Start javascript script.js.Eigene.test
    
        11:46:25.894	[info]	javascript.0 script.js.Eigene.test: MW 0
    
        11:46:25.895	[info]	javascript.0 script.js.Eigene.test: registered 0 subscriptions and 0 schedules
    
        11:46:25.975	[info]	javascript.0 script.js.Eigene.test: 19.7 2016-08-15T09:16:25.871Z
    
        11:46:25.977	[info]	javascript.0 script.js.Eigene.test: 19.8 2016-08-15T09:17:44.211Z
    
        11:46:25.977	[info]	javascript.0 script.js.Eigene.test: 19.9 2016-08-15T09:20:26.948Z
    
        11:46:25.977	[info]	javascript.0 script.js.Eigene.test: 20 2016-08-15T09:25:08.956Z
    
        11:46:25.978	[info]	javascript.0 script.js.Eigene.test: 20.2 2016-08-15T09:33:35.721Z
    
        11:46:25.978	[info]	javascript.0 script.js.Eigene.test: 20.3 2016-08-15T09:35:55.720Z
    
        11:46:25.978	[info]	javascript.0 script.js.Eigene.test: 20.4 2016-08-15T09:38:01.499Z
    
        11:46:25.978	[info]	javascript.0 script.js.Eigene.test: 20.6 2016-08-15T09:40:56.725Z
    
        11:46:25.979	[info]	javascript.0 script.js.Eigene.test: 20.7 2016-08-15T09:43:37.482Z
    
        11:46:25.979	[info]	javascript.0 script.js.Eigene.test: 20.177777777777777
    
        11:46:25.979	[info]	javascript.0 script.js.Eigene.test: 20.7
    
        11:46:25.979	[info]	javascript.0 script.js.Eigene.test: 19.7
    
    
    Der letzte Log Eintrag der Haupfunktion SQL Abfrage taucht als erstes auf, da ist der Wert noch null, obwohl er am Ende der Funktion steht.
    
    In der Funktion vom sendto Befehl werden MW, Min und Max korrekt berechnet.
    
    Es scheint mir doch so, als würde die Funktion im sendto Befehl nicht der Reihe nach in der Funktion ausgeführt, sondern parallel zur Funktion SQLAbfrage.[/i][/i][/i][/i][/i][/i][/i]
    
    1 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #4

      @roland:

      Es scheint mir doch so, als würde die Funktion im sendto Befehl nicht der Reihe nach in der Funktion ausgeführt, sondern parallel zur Funktion SQLAbfrage. `
      Ja, die Abarbeitung erfolgt parallel.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      1 Antwort Letzte Antwort
      0
      • paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #5

        Erläuterung: Die Funktion sendTo(…) wird nur "angeschubst" und dann das Skript weiter abgearbeitet. Das Ergebnis der Funktion sendTo(...) wird nach Erledigung an die callback-Funktion übergeben. Ich vermute, dass die 3 berechneten Werte an Datenpunkte übergeben werden sollen ? Dann ist es so übersichtlicher:

        `var id = 'hm-rpc.0.KEQ0766772.1.TEMPERATURE';
        var avrid = '...';  // DP-ID Mittelwert
        var maxid = '...';
        var minid = '...';
        
        SQLAbfrage(id, 0.5);
        
        // mittel, maximum, minimum
        function mmm(result) {
          var i;
          var mw=0;
          var max=-100;
          var min=100;
          for (i = 0; i < result.result.length; i++) {
            console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString());
            mw=mw+result.result[i].val;
            if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;}
          }
          mw=mw/(result.result.length);
          setState(avrid, mw);
          setState(maxid, max);
          setState(minid, min);
        }
        
        function SQLAbfrage (id, dt) {
          dt = dt*3600*1000;
          var end_time = new Date().getTime();
          var start_time = end_time - dt;
          sendTo('sql.0', 'getHistory', {
            id: id,
            options: {
                start:      start_time,
                end:        end_time,
                aggregate: 'none' // or 'none' to get raw values
            }
          }, mmm);
        }</result.result[i].val){max=result.result[i].val;}>` [/i][/i][/i][/i][/i][/i][/i]
        

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        0
        • R Offline
          R Offline
          roland
          schrieb am zuletzt editiert von
          #6

          Danke für die Antworten.

          Ich wollte vermeiden über createstate Werte anzulegen, wenn ich sie nur im Programm benötige.

          Offensichtlich ist aber wohl nicht möglich.

          So ist es doch gemeint im letzten Code, oder?

          1 Antwort Letzte Antwort
          0
          • paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #7

            @roland:

            Ich wollte vermeiden über createstate Werte anzulegen, wenn ich sie nur im Programm benötige.

            Offensichtlich ist aber wohl nicht möglich. `
            Wozu benötigst Du Mittelwert, Maximum und Minimum nur innerhalb des Scripts ? Die müssten dann im Script weiter verarbeitet werden: Mit welchem Ergebnis ?

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              roland
              schrieb am zuletzt editiert von
              #8

              Ansich wollte ich ersteinmal verstehen, wie die übergabe von Parametern und Ergebnisse in Javascript funktioniert.

              Mein erster Fehler war nach Java und nicht nach Javascript zu googlen.

              Auf meiner CCU habe ich bis jetzt die Temperaturen des letzten Tages dazu verwendet, Rolläden im Obergeschoss zu steuern.

              Sommer/Winter betrieb. Ist es am Tage sehr warm dürfen sie Nachts oben bleiben. Ist es Nachts zu kalt und ich muss am Tage heizen, sollen sie nachts runter.

              Das funktiionierte bis jetzt ganz gut in der CCU. Von den CCU Problemen abgesehen.

              Die Werte aus einer SQL DB zu berechnen ist eleganter.

              Die Unterfunktion funktioniert nun ganz gut.

               `// mittel, maximum, minimum
              function mmm(result) {
                var i;
                var mw=0;
                var max=-100;
                var min=100;
                for (i = 0; i < result.result.length; i++) {
                  //console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString());
                  mw=mw+result.result[i].val;
                  if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;}
                }
                mw=mw/(result.result.length);
                console.log(id);
                console.log(result.result[1].id);
                console.log(mw);
                console.log(max);
                console.log(min);
                setState(id+'_mw', mw);
                setState(id+'_max', max);
                setState(id+'_min', min);
              }
              
              function SQLAbfrage (id, dt) {
                  var status_mmm;
                  createState(id+'_mw');
                  createState(id+'_max');
                  createState(id+'_min');
                  dt = dt*3600*1000;
                  var end_time = new Date().getTime();
                  var start_time = end_time - dt;
                  sendTo('sql.0', 'getHistory', {
                      id: id,
                      options: {
                          start:      start_time,
                          end:        end_time,
                          aggregate: 'none' // or 'none' to get raw values
                      }
                  }, mmm);
              }</result.result[i].val){max=result.result[i].val;}>` 
              
              Prinzipiell finde ich es nicht schon schön, dass die Funktionen parallel laufen und ich nicht weiß, wann sie fertig sind.
              
              Diese Funktionen wollte ich folgendermaßen aufrufen.
              
              `~~[code]~~    var dt=1;
                  var id = "hm-rpc.0.KEQ0766772.1.TEMPERATURE"/*Temperatur-Feuchtefühler Balkon.TEMPERATURE*/;
                  SQLAbfrage(id,dt);
                  id ="hm-rpc.0.MEQ1600050.1.TEMPERATURE"/*Balkon Temperatur links Sonne.TEMPERATURE*/;
                  SQLAbfrage(id,dt);
                  id ="hm-rpc.0.MEQ1600050.2.TEMPERATURE"/*Balkon Temperatur rechts Sonne.TEMPERATURE*/;
                  SQLAbfrage(id,dt);
              [/code]`
              
              Das hat zur Folge, dass die Funktion als Variable "id" immer die letzte aus meinem aufrufenden Programm hat. In diesem Fall "hm-rpc.0.MEQ1600050.2.TEMPERATURE". Da das Hauptprogramm erheblihc schneller zu ende ist.
              
              Sauber wäre jetzt entweder die korrekt ID der Datensätze in der funktion mmm abzufragen. 
              
              In der Funktion mmm soll mit result.result[1].id eigentlich die id des Datensatzes zurückgegeben werden. Diese leifert mir aber immer ein "undefined".
              
              Hat dafür jemand eine Erklärung?
              
              Eine 2\. Variante wäre eine "Pausenzeit" im Hauptprogramm einzubauen. Da suche ich gerade, welche systemschonend läuft.[/i][/i][/i][/i][/i][/i][/i]
              
              1 Antwort Letzte Antwort
              0
              • paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #9

                @roland:

                Eine 2. Variante wäre eine "Pausenzeit" im Hauptprogramm einzubauen. Da suche ich gerade, welche systemschonend läuft `

                var dt=1;
                var id = "hm-rpc.0.KEQ0766772.1.TEMPERATURE"/*Temperatur-Feuchtefühler Balkon.TEMPERATURE*/;
                SQLAbfrage(id,dt);
                id ="hm-rpc.0.MEQ1600050.1.TEMPERATURE"/*Balkon Temperatur links Sonne.TEMPERATURE*/;
                setTimeout(function() {SQLAbfrage(id,dt);}, 500);
                id ="hm-rpc.0.MEQ1600050.2.TEMPERATURE"/*Balkon Temperatur rechts Sonne.TEMPERATURE*/;
                setTimeout(function() {SQLAbfrage(id,dt);}, 1000);
                
                

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Antwort Letzte Antwort
                0
                • paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von
                  #10

                  @roland:

                  In der Funktion mmm soll mit result.result[1].id eigentlich die id des Datensatzes zurückgegeben werden. Diese leifert mir aber immer ein "undefined".

                  Hat dafür jemand eine Erklärung? `

                  result.result[1].id
                  ````existiert nur, wenn die Funktion mit````
                  id: '*',
                  ````aufgerufen wird.

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  1 Antwort Letzte Antwort
                  0
                  • R Offline
                    R Offline
                    roland
                    schrieb am zuletzt editiert von
                    #11

                    Danke.

                    Ich habe die art wie und wo welche Variablen deklariert werden und dann zur Verfügung stehen verstanden.

                    An sich habe ich nun folgendes Problem.

                    Die Zeile habe ich in einer globalen Funktion,da ich sie gern an mehren Stellen in dieser oder einer ähnlichen Art verwenden möchte.

                    sendTo('sql.0', 'query', 'SELECT * FROM iobroker.ts_number WHERE ts >= ' + start_time.getTime() + ' AND id=' + result.result[0].id, MW_Min_Max);

                    Das Problem ist, dass wenn die Funktion 2 mal hintereinander aufgerufen wird, ist in der Callbackfunktion "MW_Min_Max" die ID der aufrufenden Funktion nicht mehr eindeutig, da sie vom zweiten aufruf überschrieben wird.

                    Gibt es eine Möglichkeit der Funktion MW_Min_Max einen Parameter zu übermitteln?

                    Einen Return in die Funktion MW_Min_Max einzubauen mach keinen Sinn, da das Ergebniss vom sendTo Befehl nicht ausgewertet wird.

                    Ich hoffe dies ist verständlich.

                    1 Antwort Letzte Antwort
                    0
                    • paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #12

                      @roland:

                      Gibt es eine Möglichkeit der Funktion MW_Min_Max einen Parameter zu übermitteln? `
                      Die callback-Funktion MW_Min_Max wird von der Funktion sendTo() aufgerufen. Somit bestimmt auch sendTo(), welche Parameter an die callback-Funktion übergeben werden.

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      1 Antwort Letzte Antwort
                      0
                      • R Offline
                        R Offline
                        roland
                        schrieb am zuletzt editiert von
                        #13

                        @paul53:

                        Die callback-Funktion MW_Min_Max wird von der Funktion sendTo() aufgerufen. Somit bestimmt auch sendTo(), welche Parameter an die callback-Funktion übergeben werden. `

                        Das verstehe ich noch nicht so ganz. Wie kann ich in dem sendto Befehl Parameter für die Callbackfunktion übergeben?

                        Mit der Variante setTimeout habe ich auch experimentiert.

                            var h=1;
                            var id = '"hm-rpc.0.KEQ0766772.1.TEMPERATURE"'/*Temperatur-Feuchtefühler Balkon.TEMPERATURE*/;
                            setTimeout(function() {SQLAbfrage(id,h);}, 5000);
                            id ='"hm-rpc.0.MEQ1600050.1.TEMPERATURE"'/*Balkon Temperatur links Sonne.TEMPERATURE*/;
                            setTimeout(function() {SQLAbfrage(id,h);}, 5000);
                            id ='"hm-rpc.0.MEQ1600050.2.TEMPERATURE"'/*Balkon Temperatur rechts Sonne.TEMPERATURE*/;
                            setTimeout(function() {SQLAbfrage(id,h);}, 5000);
                        
                        

                        Diese hat leider deine gleichen Effekt. Wenn das Programm wie oben, gestartet wird, wird die Funktion SQLAbfrage nicht nach 5,10 und 15 s gestartet, sondern alle 3 nach 5 s. Das hat zur folge, dass alle drei Abfragen mit der zuletzt gesetzten ID gestartet werden. Ich habe aber gerade gesehen, dass in der Beschreibung von setTimout Argumente vorgesehen sind.

                        Diese werde ich demnächst mal testen.

                        Derzeit habe ich eine geänderte SQL Abfrage in Verwendung. Vielleicht ist diese auch anderen Nützlich.

                        Mit dieser werden eindeutige Datensätze abgerufen.

                        `function SQLAbfrage (id_name, zeit_h) {
                            var zeit_ms = zeit_h*3600*1000;
                            var end_time = new Date().getTime();
                            var start_time = end_time-zeit_ms;
                            sendTo('sql.0', 'query', 'SELECT * FROM iobroker.ts_number INNER JOIN iobroker.datapoints ON datapoints.id=ts_number.id WHERE ts_number.ts >= ' + start_time + ' AND datapoints.name=' + id_name, MW_Min_Max);
                        }
                        
                        function MW_Min_Max(result){
                            if (result.error) {
                                console.error(result.error);
                            } else {
                                var mw=0;
                                var max=-100;
                                var min=100;
                                //console.log('Rows: ' + JSON.stringify(result.result));
                                createState(result.result[0].name+'_mw');
                                createState(result.result[0].name+'_max');
                                createState(result.result[0].name+'_min');        
                                for (var i = 0; i < result.result.length; i++) {
                                    //console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString());
                                    mw=mw+result.result[i].val;
                                    if (max<result.result[i].val){max=result.result[i].val;} if/(min="">result.result[i].val){min=result.result[i].val;}
                                }
                                mw=mw/(result.result.length-1)
                                console.log(mw.toFixed(1));
                                console.log(max.toFixed(1));
                                console.log(min.toFixed(1));
                                setState(result.result[0].name+'_mw',mw.toFixed(1));
                                setState(result.result[0].name+'_max',max.toFixed(1));
                                setState(result.result[0].name+'_min',min.toFixed(1));
                            }
                        }</result.result[i].val){max=result.result[i].val;}>` [/i][/i][/i][/i][/i][/i][/i]
                        
                        1 Antwort Letzte Antwort
                        0
                        • paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von
                          #14

                          @roland:

                          Wie kann ich in dem sendto Befehl Parameter für die Callbackfunktion übergeben? `
                          :?:
                          @roland:

                          Wenn das Programm wie oben, gestartet wird, wird die Funktion SQLAbfrage nicht nach 5,10 und 15 s gestartet, sondern alle 3 nach 5 s. `
                          Ja, gleiche Verzögerung = gleiche Ausführungszeit. In meinem Vorschlag oben hatte ich deshalb auch unterschiedliche Verzögerungszeiten angegeben.

                          setTimeout(function() {SQLAbfrage(id,h);}, 5000);
                          

                          setTimeout() startet einen Timer und übergibt diesem die Referenz und die Parameter zur callback-Funktion SQLAbfrage(id,h), die nach Ablauf der Verzögerungszeit ausgeführt werden soll.

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          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

                          820

                          Online

                          32.5k

                          Benutzer

                          81.6k

                          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