Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Gaszähler-Webseite auslesen?

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Gaszähler-Webseite auslesen?

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

      Hallo

      wie kann ich Infos aus dieser Seite in Datenpunkte überführen?

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

      Ich benötige 26456.91 aus GasMeter

      Gruß

      1 Reply Last reply Reply Quote 0
      • Jeeper.at
        Jeeper.at last edited by

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

        Lg

        Günther

        1 Reply Last reply Reply Quote 0
        • N
          noxx last edited by

          Morgen

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

          Evtl kann mir einer kurz beiseite stehen? Danke!

          Gruß

          1 Reply Last reply Reply Quote 0
          • N
            noxx last edited by

            @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 Reply Last reply Reply Quote 0
            • D
              dwm last edited by

              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 Reply Last reply Reply Quote 0
              • N
                noxx last edited by

                @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 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  @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.

                  1 Reply Last reply Reply Quote 0
                  • D
                    dwm last edited by

                    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 Reply Last reply Reply Quote 0
                    • N
                      noxx last edited by

                      danke, geht damit (fast)

                      Die Ausgabe ist nun "26456.91"

                      mit " "

                      Kann man die auch wegbekommen, also nur 26456.91

                      ?

                      1 Reply Last reply Reply Quote 0
                      • D
                        dwm last edited by

                        Ich glaub wir führen asynchrone Gespräche 😄

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

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

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

                            @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 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 last edited by

                              @noxx:

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

                              1 Reply Last reply Reply Quote 0
                              • N
                                noxx last edited by

                                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 Reply Last reply Reply Quote 0
                                • N
                                  noxx last edited by

                                  @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 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 last edited by

                                    @noxx:

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

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

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    749
                                    Online

                                    31.7k
                                    Users

                                    79.8k
                                    Topics

                                    1.3m
                                    Posts

                                    5
                                    16
                                    2466
                                    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