Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [GELÖST] Homepilot Umweltsensor mit Javascript 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

    [GELÖST] Homepilot Umweltsensor mit Javascript auslesen

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

      @meicker:

      Ich wüsste jetzt nicht wie ich deinen Vorschlag umsetzen kann … `
      Mit dem Javascript-Adapter.

      Die Webseite, die den JSON-String liefert, kann man mit request einlesen. Hier im Forum gibt es viele Beispiele. Suche: require('request')

      1 Reply Last reply Reply Quote 0
      • M
        meicker last edited by

        ist das auch mit blocky möglich ? Den request kann ich oben anstellen, das Ergebnis könnte ich in eine variable packen - aber wie baue ich mit blocky die Abfrage ein ? Den Link einzusetzen zur jason ist ja kein problem … aber der rest ... :shock:

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

          Mit Blockly ist es sehr umständlich. Besser direkt mit Javascript.

          const request = require('request');
          const link = 'http://...';
          
          function wetter() {
              request(link, function(error,response, body) {
                  if(error) log('Fehler request: ' + error, 'error');
                  else {
                      var data = JSON.parse(body).data;
                      var dir = data[5].Sonnenrichtung;
                      dir = parseFloat(dir.substr(dir.indexOf('(') + 1));
                      // Verwendung von dir (setState())
                      var ele = parseFloat(data[4].Sonnenhöhe);
                      // Verwendung von ele
                  }    
              });
          }
          
          wetter(); // Skriptstart
          
          
          1 Reply Last reply Reply Quote 0
          • M
            meicker last edited by

            Vielen Dank auch dafür 🙂

            Habe ich jetzt am laufen - kann es aber nirgenswo sehen … Wo steht das Ergebnis ? Und wenn ich den Code richtig deute kommen ja auch 2 Variablen dabei raus - Sonnenstand -und höhe

            Für Blocky habe ich mir eine Abfrage gemacht und den Sonnenstand mit Start und Ende als Variable gesetzt. Jetzt muss ich das Ergebnis aus dem Script damit abgleichen, also das Wergebnis als Wert aufrufen ...

            Ich hätte vielleicht auch noch erwähnen sollen das ich ein lernwilliger blutiger Anfänger bin :lol:

            12:45:42.864 [info] javascript.0 Start javascript script.js.sonnenhoehe

            12:45:42.864 [error] javascript.0 script.js.sonnenhoehe compile failed: at script.js.sonnenhoehe:1

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

              @meicker:

              Wo steht das Ergebnis ? Und wenn ich den Code richtig deute kommen ja auch 2 Variablen dabei raus - Sonnenstand -und höhe `
              Um die Werte weiter zu verwenden / anzuzeigen müssen sie in Datenpunkte vom Typ "Zahl" (number) geschrieben werden.

              const request = require('request');
              const link = 'http://...';
              
              // Datenpunkte erzeugen
              createState('Sonnenstand.Richtung', 0, {type: 'number', unit: '°'});
              createState('Sonnenstand.Höhe', 0, {type: 'number', unit: '°'});
              
              function wetter() {
                  request(link, function(error,response, body) {
                      if(error) log('Fehler request: ' + error, 'error');
                      else {
                          var data = JSON.parse(body).data;
                          var dir = data[5].Sonnenrichtung;
                          dir = parseFloat(dir.substr(dir.indexOf('(') + 1));
                          setState('Sonnenstand.Richtung', dir, true); 
                          var ele = parseFloat(data[4]['Sonnenhöhe']);
                          setState('Sonnenstand.Höhe', ele, true); 
                      }    
                  });
              }
              
              schedule('* * * * *', wetter); // jede Minute
              
              1 Reply Last reply Reply Quote 0
              • M
                meicker last edited by

                OK 🙂

                Und was ist an der ersten Zeile falsch ?

                13:09:44.167 [error] javascript.0 script.js.sonnenhoehe compile failed: at script.js.sonnenhoehe:1

                Erste zeile: const request = require('request');

                Ich kann keinen Fehler sehen …

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

                  @meicker:

                  Ich kann keinen Fehler sehen … `
                  Ich auch nicht 😮

                  Du hast hoffentlich das Skript nicht unter der Gruppe global erstellt ?

                  EDIT: Habe .Sonnenhöhe wegen des Umlautes gegen ['Sonnenhöhe'] getauscht, da Javascript es zwar mit der Punktnotation richtig ausführt, aber der Editor meckert.

                  1 Reply Last reply Reply Quote 0
                  • M
                    meicker last edited by

                    OK, der Fehler war mein Fehler ! Ursprünglich in global erstellt, dann aber geändert. Schien aber trotzdem irgendwie noch gehangen zu haben. ich habe es gelöscht und frisch einfefügt, kein fehler mehr …

                    Aber wo kann ich denn jetzt die states sehen ? Ich finde die einfach nicht ... :roll:

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

                      @meicker:

                      Aber wo kann ich denn jetzt die states sehen ? Ich finde die einfach nicht … `
                      Im Reiter "Objekte" unter javascript.0.Sonnenstand (wenn das Skript in der Instanz 0 läuft).

                      1 Reply Last reply Reply Quote 0
                      • M
                        meicker last edited by

                        Also - der fehler in zeile 1 ist doch noch da - kam eben nicht weil script nicht gestartet war …

                        In Objekte - schlag mich - steht nix von dem Script, es wird nichts erstellt - nur das was ich schon drin habe, mehr nicht ... Ich vermute wegen dem Fehler läuft das script überhaupt nicht erst an und erstell auch nix ... Aber wenn Du keinen Fehler findest in der ersten Zeile dann sieht es wohl schlecht aus ...

                        Regex ist keine Option ? Absolut unmöglich ?

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

                          @meicker:

                          Ich vermute wegen dem Fehler läuft das script überhaupt nicht erst an und erstell auch nix … Aber wenn Du keinen Fehler findest in der ersten Zeile dann sieht es wohl schlecht aus ... `
                          Ja, wenn ein Fehler-Log kommt, läuft das Skript nicht und erstellt folglich auch keine Datenpunkte. Schau mal in den Reiter "Log". Dort werden meist noch weitere Informationen zu dem Fehler ausgegeben (in rot).

                          1 Reply Last reply Reply Quote 0
                          • M
                            meicker last edited by

                            jupp 🙂

                            javascript.0 2018-08-15 14:07:11.001 error at Object.createScript (vm.js:80:10)

                            javascript.0 2018-08-15 14:07:11.001 error SyntaxError: Identifier 'request' has already been declared

                            javascript.0 2018-08-15 14:07:11.001 error ^

                            javascript.0 2018-08-15 14:07:11.000 error const request = require('request');

                            javascript.0 2018-08-15 14:07:10.999 error at script.js.Homepilot.grad:1

                            javascript.0 2018-08-15 14:07:10.999 error script.js.Homepilot.grad compile failed:

                            verstehe aber nicht warum - ich hatte das erste script doch gelöscht 😞

                            1 Reply Last reply Reply Quote 0
                            • M
                              meicker last edited by

                              soooooooo !!!!! 🙂 Klappt 🙂 Javascript Adapter neu gestartet … VIELEN DANK SOWEIT !!!

                              Ich müsste doch dann theoretisch auch die anderen Teile aus dem Link eingepflegt bekommen, oder ?

                              { "response" : "get_meter_data", "status" : "ok", "data":[{"Lichtwert":"30000 lx"},{"Windgeschw.":"0 m/s"},{"Temperatur":"22.1 °C"},{"Regen":"Nicht erkannt"},{"Sonnenhöhe":"53°"},{"Sonnenrichtung":"Süd-Osten (165°)"},{"Aktualisiert":"15.08.18 - 13:17"}] }

                              Das ° Zeichen bekomme ich weg indem ich unit mit '' schreibe ?

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

                                @meicker:

                                ich hatte das erste script doch gelöscht `
                                Ist nicht noch etwas unter der Gruppe global ?

                                Starte mal die Javascript-Instanz neu. Manchmal genügt das Löschen eines Skriptes nicht.

                                1 Reply Last reply Reply Quote 0
                                • M
                                  meicker last edited by

                                  lies mal einen über Deinem letzten - haben uns überschnitten

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

                                    @meicker:

                                    Klappt 🙂 Javascript Adapter neu gestartet `
                                    Schön, dass Du es selbst gelöst hast 😄
                                    @meicker:

                                    Ich müsste doch dann theoretisch auch die anderen Teile aus dem Link eingepflegt bekommen, oder ? `
                                    Ja, wie es geht, weißt Du jetzt.
                                    @meicker:

                                    {"Windgeschw.":"0 m/s"} `
                                    Da der Bezeichner ""Windgeschw." ein unzulässiges Zeichen (Punkt) enthält, muss der Zugriff so erfolgen:

                                                var wind = parseFloat(data[1]['Windgeschw.']);
                                    
                                    

                                    @meicker:

                                    Das ° Zeichen bekomme ich weg indem ich unit mit '' schreibe ? `
                                    Nein, mit parseFloat() wird aus dem String "165°)" eine Zahl gemacht und dabei abgebrochen, wenn keine Ziffer mehr folgt.

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      meicker last edited by

                                      Wissen kann man noch nicht behaupten, aber ich reime mir das gerade mal zusammen 🙂 Will ja was lernen … 😄

                                      Ist data 1 nicht eigentlich LICHTWERT ? Und Wingeschwindigkeit 2 ??

                                      Anders gefragt zum ° - wie bekomme ich das weg ? Oder stört das nicht in einer Blocky Abfrage ?

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

                                        @meicker:

                                        Ist data 1 nicht eigentlich LICHTWERT ? Und Wingeschwindigkeit 2 ?? `
                                        Nein, die Zählung in Arrays beginnt mit 0.
                                        @meicker:

                                        Anders gefragt zum ° - wie bekomme ich das weg ? Oder stört das nicht in einer Blocky Abfrage ? `
                                        Das "°" ist im Datenpunktwert nicht enthalten, denn der Wert ist eine reine Zahl (durch parseFloat()).

                                        Mittels createState() wurde eine zusätzliche Datenpunkteigenschaft common.unit: "°" erzeugt, damit die Darstellung im Reiter "Objekte" ordentlich erfolgen kann.

                                        1 Reply Last reply Reply Quote 0
                                        • M
                                          meicker last edited by

                                          Wieder ein Stück weiter 🙂

                                          Jetzt hab ich noch zwei Sachen:

                                          const request = require('request');
                                          const link = 'http://192.168.1.180/deviceajax.do?meter=1010005';
                                          
                                          // Datenpunkte erzeugen
                                          createState('Homepilot.Sonnenrichtung', 0, {type: 'number', unit: '°'});
                                          createState('Homepilot.Sonnenhöhe', 0, {type: 'number', unit: '°'});
                                          createState('Homepilot.Lichtwert', 0, {type: 'number', unit: 'lux'});
                                          createState('Homepilot.Windgeschwindigkeit', 0, {type: 'number', unit: 'm/s'});
                                          createState('Homepilot.Temperatur', 0, {type: 'number', unit: '°C'});
                                          createState('Homepilot.Regen', 0, {type: 'boolean', unit: ''});
                                          createState('Homepilot.Aktualisiert', 0, {type: 'string', unit: ''});
                                          
                                          function sensordaten() {
                                              request(link, function(error,response, body) {
                                                  if(error) log('Fehler request: ' + error, 'error');
                                                  else {
                                                      var data = JSON.parse(body).data;
                                                      var dir = data[5].Sonnenrichtung;
                                                      dir = parseFloat(dir.substr(dir.indexOf('(') + 1));
                                                      setState('Homepilot.Sonnenrichtung', dir, true); 
                                                      var ele = parseFloat(data[4].Sonnenhöhe);
                                                      setState('Homepilot.Sonnenhöhe', ele, true); 
                                                      var lux = parseFloat(data[0].Lichtwert);
                                                      setState('Homepilot.Lichtwert', lux, true);
                                                      var wind = parseFloat(data[1]['Windgeschw.']);
                                                      setState('Homepilot.Windgeschwindigkeit', wind, true);
                                                      var temp = parseFloat(data[2].Temperatur);
                                                      setState('Homepilot.Temperatur', temp, true);
                                                      var regen = parseFloat(data[3].Regen);
                                                      setState('Homepilot.Regen', regen, true);
                                                      var aktualisiert = parseFloat(data[6].Aktualisiert);
                                                      setState('Homepilot.Aktualisiert', aktualisiert, true);
                                                  }    
                                              });
                                          }
                                          schedule('*/30 * * * * *', sensordaten); // alle 30 Sekunden
                                          

                                          Regen soll true/false liefern -> boolean -> habe ich im datenpunkt eingetragen - wirkt nicht …

                                          Aktualisiert zeigt nur das datum ohne Zeit. war bei number schon so, habe ich auf String gesetzt - wirkt auch nicht ...

                                          Was mache ich da für einen Denkfehler ? 😄

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

                                            unit macht bei Datenpunkten vom Typ "string" und "boolean" keinen Sinn.

                                            createState('Homepilot.Regen', false, {type: 'boolean'});
                                            createState('Homepilot.Aktualisiert', 'Init', {type: 'string'});
                                            
                                            

                                            @meicker:

                                            Regen soll true/false liefern -> boolean -> habe ich im datenpunkt eingetragen - wirkt nicht … `

                                            var regen = data[3].Regen; // Das ist ein String !
                                            if(regen == 'Nicht erkannt') setState('Homepilot.Regen', false, true);
                                            else setState('Homepilot.Regen', true, true);
                                            

                                            @meicker:

                                            Aktualisiert zeigt nur das datum ohne Zeit. war bei number schon so, habe ich auf String gesetzt - wirkt auch nicht … `

                                                        var aktualisiert = data[6].Aktualisiert; // Das ist ein String !
                                            
                                            

                                            parseFloat() wandelt einen String in eine Zahl, wenn möglich !

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            722
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            51
                                            2778
                                            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