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. Gaszähler-Webseite auslesen?

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    331

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.5k

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

Gaszähler-Webseite auslesen?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
16 Beiträge 5 Kommentatoren 2.9k 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.
  • Jeeper.atJ Offline
    Jeeper.atJ Offline
    Jeeper.at
    schrieb am zuletzt editiert von
    #2

    Ich würde das Ganze mal mit dem Parser Adapter probieren.

    Lg

    Günther

    1 Antwort Letzte Antwort
    0
    • N Offline
      N Offline
      noxx
      schrieb am zuletzt editiert von
      #3

      Morgen

      bin nun das Forum durch, finde aber nicht recht einen Anfang.

      Evtl kann mir einer kurz beiseite stehen? Danke!

      Gruß

      1 Antwort Letzte Antwort
      0
      • N Offline
        N Offline
        noxx
        schrieb am zuletzt editiert von
        #4

        @Jeeper.at:

        Ich würde das Ganze mal mit dem Parser Adapter probieren.

        Lg

        Günther `

        Habe meine Schwierigkeiten mit RegEx

        <data name="GasMeter" value="" valueunit="m^3"/></strong></B>" ([^"])<b=""></data>* **funktioniert nicht (habs gegoogelt und zusammengeschustert.

        Hieraus

        <data name="GasMeter" value="26456.91" valueunit="m^3">will ich ja den Wert</data>**

        1 Antwort Letzte Antwort
        0
        • D Offline
          D Offline
          dwm
          schrieb am zuletzt editiert von
          #5

          Hm, wie gut ist denn Dein javascript?

          Das Ding liefert XML zurück, also sollten wir das XML parsen.

          z.B.

          ! var parseString = require('xml2js').parseString; ! var parseString = require('xml2js').parseString; ! var xml = ' <myhome>\ <esp8266_gasmeter>\ <data name="SSID" value="FRITZ!Box Fon WLAN 7390" valueunit="">\ <data name="IP" value="192.168.1.43" valueunit="xxx.xxx.xxx.xxx">\ <data name="help" value="use /SetValue?Value=xx to set new value" valueunit="text">\ <data name="MAC" value="11:F1:31:E1:11:31" valueunit="AA:BB:CC:DD:EE:FF">\ <data name="GasMeter" value="26456.91" valueunit="m^3">\</data></data></data></data></data></esp8266_gasmeter> \</myhome> '; ! parseString(xml, function (err, result) { log(JSON.stringify(result.MyHome.ESP8266_GasMeter[0].data[4].$.value)); }); !

          1 Antwort Letzte Antwort
          0
          • N Offline
            N Offline
            noxx
            schrieb am zuletzt editiert von
            #6

            @dwm:

            Hm, wie gut ist denn Dein javascript? `

            nicht so pralle

            RegEx habe ich hingefummelt

            value="(.*?)\" valueunit="m
            

            Würde mich aber über ein Script freuen.

            Deins wirft aus:

            2:09:10.411	[info]	javascript.0 Start javascript script.js.common.Gas
            12:09:10.412	[error]	javascript.0 script.js.common.Gas: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/node_modules/xml2js' at script.js.common.Gas:1:19, at ContextifyScript.Script.runInContext (vm.js:35:29)
            12:09:10.412	[error]	javascript.0 script.js.common.Gas: TypeError: Cannot read property 'parseString' of undefined at script.js.common.Gas:1:36 at ContextifyScript.Script.runInContext (vm.js:35:29)
            
            1 Antwort Letzte Antwort
            0
            • AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #7

              @noxx:

              Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/node_modules/xml2js' `
              Geh mal in die Optionen deines JS-Adapters und trage da bei zusätzliche Module xml2js ein.

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              1 Antwort Letzte Antwort
              0
              • D Offline
                D Offline
                dwm
                schrieb am zuletzt editiert von
                #8

                Die Fehlermeldung kommt daher, dass der Javascript Adapter das xml2js Modul nicht geladen hat.

                Dazu musst Du bei der Javascript Adapter Instanz bei "zusätzliche NPM Module" ein "xml2js" reinschreiben.

                Wenn Du gleich im Modul noch ein "request" dazu schreibst, sollte folgendes Script funktionieren:

                ! ````
                var request = require('request');
                var parseString = require('xml2js').parseString;
                ! var url="http://10.1.2.3/was_auch_immer"; // hier die Adresse der Webseite eintragen
                ! var GaszaehlerId = "Gaszaehler.Wert"; // Der Wert steht in "javascript.0."
                ! function processData(body){
                parseString(body, function (err, result) {
                // log(JSON.stringify(result.MyHome.ESP8266_GasMeter[0].data[4].$.value));
                if (!err)
                setState(GaszaehlerId,result.MyHome.ESP8266_GasMeter[0].data[4].$.value);
                });
                }
                ! createState(GaszaehlerId,
                0,
                false,
                {
                type:"number",
                unit:"m^3"
                });
                ! schedule ("*/3 * * * *", function(){ // alle 3 Minuten aufrufen
                request({
                uri: url,
                method: "GET",
                timeout: 10000,
                followRedirect: true,
                maxRedirects: 10
                }, function(error, response, body) {
                if (!error) {
                if (response.statusCode == 200) {
                processData(body);
                }
                } else log("Fehler: "+error);
                });
                });

                
                Du musst halt noch die url entsprechend reinschreiben, dann wird alle drei Minuten der Gaszähler ausgelesen und in den Datenpunkt "javascript.0.Gaszaehler.Wert" geschrieben.
                
                Sagt die Theorie :)
                
                CU
                
                Werner
                1 Antwort Letzte Antwort
                0
                • N Offline
                  N Offline
                  noxx
                  schrieb am zuletzt editiert von
                  #9

                  danke, geht damit (fast)

                  Die Ausgabe ist nun "26456.91"

                  mit " "

                  Kann man die auch wegbekommen, also nur 26456.91

                  ?

                  1 Antwort Letzte Antwort
                  0
                  • D Offline
                    D Offline
                    dwm
                    schrieb am zuletzt editiert von
                    #10

                    Ich glaub wir führen asynchrone Gespräche :D

                    Die Anführungszeichen im ersten Beispiel waren vom JSON.stringify(), das hätts nicht wirklich gebraucht :D

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

                      @noxx:

                      Die Ausgabe ist nun "26456.91" mit " "

                      Kann man die auch wegbekommen, also nur 26456.91? `

                            if (!err) {
                                var energy = parseFloat(result.MyHome.ESP8266_GasMeter[0].data[4].$.value);
                                setState(GaszaehlerId, energy, true);
                            }    
                      
                      

                      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
                      • N Offline
                        N Offline
                        noxx
                        schrieb am zuletzt editiert von
                        #12

                        @dwm:

                        Die Fehlermeldung kommt daher, dass der Javascript Adapter das xml2js Modul nicht geladen hat.

                        Dazu musst Du bei der Javascript Adapter Instanz bei "zusätzliche NPM Module" ein "xml2js" reinschreiben.

                        Wenn Du gleich im Modul noch ein "request" dazu schreibst, sollte folgendes Script funktionieren:

                        ! ````
                        var request = require('request');
                        var parseString = require('xml2js').parseString;
                        ! var url="http://10.1.2.3/was_auch_immer"; // hier die Adresse der Webseite eintragen
                        ! var GaszaehlerId = "Gaszaehler.Wert"; // Der Wert steht in "javascript.0."
                        ! function processData(body){
                        parseString(body, function (err, result) {
                        // log(JSON.stringify(result.MyHome.ESP8266_GasMeter[0].data[4].$.value));
                        if (!err)
                        setState(GaszaehlerId,result.MyHome.ESP8266_GasMeter[0].data[4].$.value);
                        });
                        }
                        ! createState(GaszaehlerId,
                        0,
                        false,
                        {
                        type:"number",
                        unit:"m^3"
                        });
                        ! schedule ("*/3 * * * *", function(){ // alle 3 Minuten aufrufen
                        request({
                        uri: url,
                        method: "GET",
                        timeout: 10000,
                        followRedirect: true,
                        maxRedirects: 10
                        }, function(error, response, body) {
                        if (!error) {
                        if (response.statusCode == 200) {
                        processData(body);
                        }
                        } else log("Fehler: "+error);
                        });
                        });

                        
                        Du musst halt noch die url entsprechend reinschreiben, dann wird alle drei Minuten der Gaszähler ausgelesen und in den Datenpunkt "javascript.0.Gaszaehler.Wert" geschrieben.
                        
                        Sagt die Theorie :)
                        
                        CU
                        
                        Werner `  
                        

                        Funktioniert :-)

                        Danke

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

                          @noxx:

                          Funktioniert :-) `
                          Dann markiere bitte das Thema als gelöst (im ersten Beitrag).

                          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
                          • N Offline
                            N Offline
                            noxx
                            schrieb am zuletzt editiert von
                            #14

                            Nutze im übrigen folgenden Code für den Arduino / Nodemcu

                            // ****************************************************************
                            // Code for GasMeter 
                            // created: Alexander Kabza, 2017-03-15
                            // last mod: Alexander Kabza, 2017-04-02
                            // ****************************************************************
                            
                            #include <esp8266wifi.h>            
                            #include <esp8266webserver.h>
                            
                            IPAddress ip(192,168,X,Y);  //Node static IP
                            IPAddress gateway(192,168,X,1);
                            IPAddress subnet(255,255,255,0);
                            
                            ESP8266WebServer server(80);   //Web server object. Will be listening in port 80 (default for HTTP)
                            
                            #define ledPin 0
                            #define inPin 2
                            #define ssid "YourSSID"
                            #define password "YourPassword"
                            
                            int actual = 1;
                            int prev = 1;
                            long int value = 0;
                            
                            // ****************************************************************
                            
                            void tohex(unsigned char * in, size_t insz, char * out, size_t outsz)
                            {
                                unsigned char * pin = in;
                                const char * hex = "0123456789ABCDEF";
                                char * pout = out;
                                for(; pin < in+insz; pout +=3, pin++){
                                    pout[0] = hex[(*pin>>4) & 0xF];
                                    pout[1] = hex[ *pin     & 0xF];
                                    pout[2] = ':';
                                    if (pout + 3 - out > outsz){
                                        /* Better to truncate output string than overflow buffer */
                                        /* it would be still better to either return a status */
                                        /* or ensure the target buffer is large enough and it never happen */
                                        break;
                                    }
                                }
                                pout[-1] = 0;
                            }
                            
                            // ****************************************************************
                            
                            void handleAll() { //Handler
                            
                              String message = "";
                              byte MAC[6];
                              enum {insz = 6, outsz = 3*insz};
                              char MACStr[outsz];
                              char * pout = MACStr;
                            
                              message += "<myhome>\n<esp8266_gasmeter>\n";
                              message += "<data name="\&quot;SSID\&quot;" value="\&quot;&quot;" +/wifi.ssid()/"\"/valueunit="\&quot;\&quot;/">\n";
                              message += "<data name="\&quot;IP\&quot;" value="\&quot;&quot;" +/wifi.localip().tostring()/"\"/valueunit="\&quot;xxx.xxx.xxx.xxx\&quot;/">\n";
                              message += "<data name="\&quot;help\&quot;" value="\&quot;use" setvalue?value="xx" to/set/new/value\"/valueunit="\&quot;text\&quot;/">\n";
                              WiFi.macAddress(MAC);
                              tohex(MAC, insz, MACStr, outsz);
                              message = message + "<data name="\&quot;MAC\&quot;" value="\&quot;&quot;" +/macstr/"\"/valueunit="\&quot;AA:BB:CC:DD:EE:FF\&quot;/">\n";
                              message += "<data name="\&quot;GasMeter\&quot;" value="\&quot;&quot;" +/string(float(value)/100)/"\"/valueunit="\&quot;m^3\&quot;/">\n";
                              message += "</data></data></data></data></data></esp8266_gasmeter>\n</myhome>";
                            
                              server.send(200, "text/plain", message);       //Response to the HTTP request
                            }
                            
                            // ****************************************************************
                            
                            void handleGenericArgs() { //Handler
                            
                              String message = "Number of args received:";
                              message += server.args();            //Get number of parameters
                              message += "\n";                            //Add a new line
                            
                              for (int i = 0; i < server.args(); i++) {
                            
                                message += "Arg no" + (String)i + " –> ";   //Include the current iteration value
                                message += server.argName(i) + ": ";     //Get the name of the parameter
                                message += server.arg(i) + "\n";              //Get the value of the parameter
                              }   
                              server.send(200, "text/plain", message);       //Response to the HTTP request
                            }
                            
                            // ****************************************************************
                            
                            void handleSetValue() { 
                            
                              String message = "";
                              String valuestr = "";
                            
                              if (server.arg("Value")== ""){     //Parameter not found
                            
                                message = "Value Argument not found";
                            
                              } else {     //Parameter found
                            
                                message = "New Value = ";
                                message += server.arg("Value");     //Gets the value of the query parameter
                                valuestr = server.arg("Value");
                                value = valuestr.toFloat() * 100;
                            
                              }
                              server.send(200, "text/plain", message);          //Returns the HTTP response
                            }
                            
                            // ****************************************************************
                            
                            void setup() {
                            
                              Serial.begin(115200);
                              WiFi.mode(WIFI_STA);
                              WiFi.begin(ssid, password); //Connect to the WiFi network
                              WiFi.config(ip, gateway, subnet);
                            
                              while (WiFi.status() != WL_CONNECTED) { //Wait for connection
                            
                                delay(500);
                                Serial.println("Waiting to connect...");
                              }
                            
                              Serial.print("WIFI connected to: ");
                              Serial.println(WiFi.SSID());
                              Serial.print("IP address: ");
                              Serial.println(WiFi.localIP());  
                            
                              server.on("/genericArgs", handleGenericArgs); 
                              server.on("/SetValue", handleSetValue);   
                              server.on("/", handleAll);   
                            
                              server.begin();                                       //Start the server
                              Serial.println("Server listening");
                              Serial.println("use /SetValue?Value=xx to set new value");
                              actual = digitalRead(inPin);
                            
                              pinMode(ledPin, OUTPUT);
                            }
                            
                            // ****************************************************************
                            
                            void loop() {
                            
                              server.handleClient();    //Handling of incoming requests
                              actual = digitalRead(inPin);
                            
                              if (actual == 1 && actual != prev) {
                                value++; 
                                Serial.println(value);
                              }
                            
                              if (actual == 1) {
                                digitalWrite(ledPin, HIGH);
                              } else {
                                digitalWrite(ledPin, HIGH);
                                delay(10);
                                digitalWrite(ledPin, LOW);    
                              }
                            
                              prev = actual;
                              delay(980);
                            
                            }</esp8266webserver.h></esp8266wifi.h>
                            

                            Quelle: http://www.kabza.de/MyHome/GasMeter.html

                            1 Antwort Letzte Antwort
                            0
                            • N Offline
                              N Offline
                              noxx
                              schrieb am zuletzt editiert von
                              #15

                              @dwm:

                              Die Fehlermeldung kommt daher, dass der Javascript Adapter das xml2js Modul nicht geladen hat.

                              Dazu musst Du bei der Javascript Adapter Instanz bei "zusätzliche NPM Module" ein "xml2js" reinschreiben.

                              Wenn Du gleich im Modul noch ein "request" dazu schreibst, sollte folgendes Script funktionieren:

                              ! ````
                              var request = require('request');
                              var parseString = require('xml2js').parseString;
                              ! var url="http://10.1.2.3/was_auch_immer"; // hier die Adresse der Webseite eintragen
                              ! var GaszaehlerId = "Gaszaehler.Wert"; // Der Wert steht in "javascript.0."
                              ! function processData(body){
                              parseString(body, function (err, result) {
                              // log(JSON.stringify(result.MyHome.ESP8266_GasMeter[0].data[4].$.value));
                              if (!err)
                              setState(GaszaehlerId,result.MyHome.ESP8266_GasMeter[0].data[4].$.value);
                              });
                              }
                              ! createState(GaszaehlerId,
                              0,
                              false,
                              {
                              type:"number",
                              unit:"m^3"
                              });
                              ! schedule ("*/3 * * * *", function(){ // alle 3 Minuten aufrufen
                              request({
                              uri: url,
                              method: "GET",
                              timeout: 10000,
                              followRedirect: true,
                              maxRedirects: 10
                              }, function(error, response, body) {
                              if (!error) {
                              if (response.statusCode == 200) {
                              processData(body);
                              }
                              } else log("Fehler: "+error);
                              });
                              });

                              
                              Du musst halt noch die url entsprechend reinschreiben, dann wird alle drei Minuten der Gaszähler ausgelesen und in den Datenpunkt "javascript.0.Gaszaehler.Wert" geschrieben.
                              
                              Sagt die Theorie :)
                              
                              CU
                              
                              Werner `  
                              

                              Moin

                              wie bekomme ich die Warnung weg?

                              javascript.0	2017-08-10 19:46:00.332	warn	Wrong type of javascript.0.Gaszaehler.Wert: "string". Please fix, while deprecated and will not work in next versions.
                              
                              1 Antwort Letzte Antwort
                              0
                              • paul53P Offline
                                paul53P Offline
                                paul53
                                schrieb am zuletzt editiert von
                                #16

                                @noxx:

                                wie bekomme ich die Warnung weg? `
                                Siehe http://forum.iobroker.net/viewtopic.php?f=21&t=7556#p78975.

                                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

                                388

                                Online

                                32.5k

                                Benutzer

                                81.7k

                                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