Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Fehler beim Auslesen

    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

    Fehler beim Auslesen

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

      Halo zusammen,

      ich bräute mal Hilfe. Ich lese den Füllstands meines Öltanks aus und möchte diesen gerne in Volumen umrechnen.

      Leider bekomme ich den Wert nicht ausgelesen. Ich bekomme immer nur die Datenpunkt (anstelle des Wertes) zurück.

      //createState('Oelstand', 0);
      
      var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; //Fuellhoehe des Oeltanks
      var Dichte = 0.84;
      var Flaeche = 4;
      var Oelstand = 0;
      
      function dp() {
         setState('Oelstand', getState(Hoehe).val * getState(Flaeche).val);
         log(Oelstand);
      log(Hoehe);
      }
      
      on (Hoehe, function () {
          dp();
      
      });
      

      Das Ergebnis des log:

      6:19:23.187	[info]	javascript.0 script.js.Skript2: 0
      16:19:23.187	[info]	javascript.0 script.js.Skript2: hm-rpc.1.LEQ02XXXXX.21.VALUE
      16:19:34.494	[info]	javascript.0 script.js.Skript2: 0
      16:19:34.494	[info]	javascript.0 script.js.Skript2: hm-rpc.1.LEQ02XXXXX.21.VALUE
      16:19:42.046	[info]	javascript.0 script.js.Skript2: 0
      

      Der Wert kommt an aus einem HM 12/14 er Analogeingang.

      1040_bildschirmfoto_2017-02-11_um_16.30.10.png

      Jemand einen Tip in welche Richtung ich muss?

      Gruß

      Thomas

      1 Reply Last reply Reply Quote 0
      • S
        skorpil last edited by

        Was kommt beim log(Hoehe), wenn Du das direkt nach der Definition der var Hoehe='hm….. setzt?

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active last edited by

          2 x mal val geht nicht !
          filename="bild1.jpg" index="0">~~

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

            //createState('Oelstand', 0);
            
            var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; //Fuellhoehe des Oeltanks
            var Dichte = 0.84;
            var Flaeche = 4;
            
            on (Hoehe, function (dp) {
               var Oelstand = dp.state.val * Flaeche;
               setState('Oelstand', Oelstand);
               log('Ölstand: ' + Oelstand);
               log('Höhe: ' + dp.state.val);
            });
            
            1 Reply Last reply Reply Quote 0
            • Mr. Burns
              Mr. Burns last edited by

              Funktioniert! Vielen Dank.

              Wenn ich einmal dabei bin. Hat jemand schon mal eine Mittelwertbildung geschrieben?

              Also addiere x Werte, und teile das Ergebnis durch x?

              Gruß

              Thomas

              P.S. Kann mir einer erklären warum mein Weg falsch und der von Paul richtig war?

              Vielleicht versteh ich dann irgendwann was ich da eigentlich programmiere :-D.

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

                @Mr. Burns:

                Hat jemand schon mal eine Mittelwertbildung geschrieben? `
                Ja, für http://www.iobroker.net/?page_id=3670&lang=de.
                @Mr. Burns:

                Kann mir einer erklären warum mein Weg falsch und der von Paul richtig war? `

                   setState('Oelstand', getState(Hoehe).val * getState(Flaeche).val);
                

                getState(id) kann nur auf einen Datenpunkt angewendet werden, nicht auf eine Skriptvariable (Flaeche).

                   log(Oelstand);
                log(Hoehe);
                

                Die Skriptvariable Oelstand wird nicht aktualisiert, sondern enthält ihren Initialisierungswert.

                Die Skriptvariable Hoehe enthält den ID-String des Datenpunktes, nicht den Wert.

                1 Reply Last reply Reply Quote 0
                • Mr. Burns
                  Mr. Burns last edited by

                  Danke für deine Erklärung. So ganz verstanden hab ich es nicht, aber dafür fehlen mir wahrscheinlich die Grundlagen.

                  Das die Scriptvariable nicht gelesen werden muss bevor ich sie weiterverarbeite versteh ich noch…ist ja schon da. Aber weshalb kann ich das einlesen des Datenpunktes überspringen...

                  Dein Script zur Mittelwertbildung hatte ich zwischenzeitlich auch gefunden...ist aber zu hoch für mich. Ich benötige eine feste Anzahl von werten (z.B 10 o. 20) welche gemittelt werden sollen. Da meine Werte nicht zeitabhängig gelesen Werten, sondern auf Änderung getriggert sind müßte ich das Script umschreiben...Ich werd mal den langen Weg mit zwischenvariablen versuchen und gucken wie weit ich komme.

                  Danke für die Hilfe!

                  Thomas

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

                    @Mr. Burns:

                    Aber weshalb kann ich das einlesen des Datenpunktes überspringen… `
                    Welchen Datenpunkt meinst Du ? Wo wird etwas übersprungen ?

                    1 Reply Last reply Reply Quote 0
                    • Mr. Burns
                      Mr. Burns last edited by

                      Hi,

                      Der Datenpunkt:

                      var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; //Fuellhoehe des Oeltanks
                      

                      muss der nicht eingelesen werden bevor dieser weiterverarbeitet werden kann…getState?

                      Hab mir die Geschichte mit dem Mittelwert noch mal angesehen.

                      Wenn ich Zeitvariable (n, über T oder tc wegen der umwandlung in Ganzzahlen) durch einen festen wert ersetze und den intervall Trigger durch einen ON Trigger ersetze müsste es doch eigentlich funktionieren oder...? Ich bin beruflich unterwegs und kann nicht so gut testen (VPN geht nicht überall)...

                      Gruß

                      Thomas

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

                        @Mr. Burns:

                        …muss der nicht eingelesen werden bevor dieser weiterverarbeitet werden kann...getState? `

                        on(id, function(mein_Datenpunkt) {...callback-Funktion...});
                        

                        übergibt ebenfalls den Zustand (state) des Datenpunktes an das Objekt (hier: mein_Datenpunkt), das in der callback-Funktion ausgewertet werden kann.

                        mein_Datenpunkt.state.val
                        

                        innerhalb der callback-Funktion entspricht

                        getState(id).val
                        

                        an beliebiger Stelle des Skripts. getState(id).val verursacht aber eine höhere CPU-Belastung, da (im Prinzip) ein zusätzlicher Datenbankzugriff erfolgt.

                        1 Reply Last reply Reply Quote 0
                        • Mr. Burns
                          Mr. Burns last edited by

                          Ich möchte mich sehr für die Hilfe bedanken und das Thema hiermit abschließen.

                          Das auslesen umrechnen und die Mittelwertbildung des Öltanks über eine Pneumatische Füllstandsmessung…funktioniert.

                          `// Oelstand errechnen und gleitenden Mittelwert von "x" werten bilden
                          
                          // Konstanten
                          var T = 100;         // Anzahl der Werte
                          var Dichte = 0.84;  // Heizöldichte
                          var Flaeche = 4;    // Fläche des Öltanks (bei einer Rechteckigigen oder Zylindrischen Form) in m2
                          
                          // IDs aller benötigten Datenpunkte
                          var Hoehe   = 'hm-rpc.1.LEQ02XXXXX.21.VALUE';
                          var average = 'vis.Keller.Oelstand';
                          var listid = 'vis.Keller.Oelstand-Liste';
                          
                          var n = Math.round(T); // Anzahl der Werte
                          var list  = new Array(n);
                          
                          function calc() {
                            list.pop();
                            var x = getState(Hoehe).val * Flaeche / Dichte;
                            list.unshift(x);
                            setState(listid, list.toString());
                            var sum = 0.0;
                            for (var i = 0; i < n; i++) {
                              var s = parseFloat(list[i]); 
                             sum = sum + s;
                            }
                            setState(average, parseFloat((sum / n).toFixed(1)));
                            //log (n);
                          }   
                          
                          // Script start: Liste aus String-Datenpunkt einlesen
                          var slist = getState(listid).val;
                          if (slist) {
                             list = slist.split(",");
                          } else {
                             // 1\. Script start: Liste und String-Datenpunkt füllen
                             var x = getState(Hoehe).val * Flaeche / Dichte;
                             for (var i = 0; i < n; i++) list[i] = x;
                             calc();
                          }
                          
                          // Triggert die Funktion bei Änderung der Eingangsgröße
                          on (Hoehe, function (dp) {
                              calc();
                          });`[/i][/i]
                          
                          1 Reply Last reply Reply Quote 0
                          • C
                            Centurytt last edited by

                            @Mr. Burns:

                            Ich möchte mich sehr für die Hilfe bedanken und das Thema hiermit abschließen.

                            Das auslesen umrechnen und die Mittelwertbildung des Öltanks über eine Pneumatische Füllstandsmessung…funktioniert.

                            `// Oelstand errechnen und gleitenden Mittelwert von "x" werten bilden
                             
                            // Konstanten
                            var T = 100;         // Anzahl der Werte
                            var Dichte = 0.84;  // Heizöldichte
                            var Flaeche = 4;    // Fläche des Öltanks (bei einer Rechteckigigen oder Zylindrischen Form) in m2
                             
                            // IDs aller benötigten Datenpunkte
                            var Hoehe   = 'hm-rpc.1.LEQ02XXXXX.21.VALUE';
                            var average = 'vis.Keller.Oelstand';
                            var listid = 'vis.Keller.Oelstand-Liste';
                             
                            var n = Math.round(T); // Anzahl der Werte
                            var list  = new Array(n);
                             
                            function calc() {
                              list.pop();
                              var x = getState(Hoehe).val * Flaeche / Dichte;
                              list.unshift(x);
                              setState(listid, list.toString());
                              var sum = 0.0;
                              for (var i = 0; i < n; i++) {
                                var s = parseFloat(list[i]); 
                               sum = sum + s;
                              }
                              setState(average, parseFloat((sum / n).toFixed(1)));
                              //log (n);
                            }   
                            
                            // Script start: Liste aus String-Datenpunkt einlesen
                            var slist = getState(listid).val;
                            if (slist) {
                               list = slist.split(",");
                            } else {
                               // 1\. Script start: Liste und String-Datenpunkt füllen
                               var x = getState(Hoehe).val * Flaeche / Dichte;
                               for (var i = 0; i < n; i++) list[i] = x;
                               calc();
                            }
                            
                            // Triggert die Funktion bei Änderung der Eingangsgröße
                            on (Hoehe, function (dp) {
                                calc();
                            });`
                            
                            Hi,
                            
                            was hast du da im Einsatz (Hardware zum Füllstand anzeigen) ? würde mich auch interessier das zu realisieren.
                            
                            Danke
                            
                            lg
                            
                            Tom[/i][/i]
                            ``` ` 
                            1 Reply Last reply Reply Quote 0
                            • Mr. Burns
                              Mr. Burns last edited by

                              Hi,

                              Einen Drucktransmitter 4..20mA, einen Wandler von 4..20mA auf 0..10V, Eingang auf das 12/14 Modul.

                              Ich hab ein Röhrchen, welches bis zum Tankboden geht. Oben ist ein T-Stück, an welchem der Drucktransmitter sitzt. auf dem anderem Anschluss des T-Stücks ist eine Membranpumpe (alte Aquarium Luftpumpe) und ein Nadelventil. Nach der Einperlmethode messe ich den Druck am Boden des Tanks.

                              Mittlerweile messe ich aber direkt über eine SPS und übergebe den Wert an den ioBroker.

                              Parallel messe ich noch den Durchfluss über ein Braun Ölzähler, auch an direkt an der SPS…

                              Gruß

                              Thomas

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              727
                              Online

                              31.7k
                              Users

                              79.9k
                              Topics

                              1.3m
                              Posts

                              5
                              13
                              1297
                              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