NEWS
Gaszähler-Webseite auslesen?
-
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ß
-
Ich würde das Ganze mal mit dem Parser Adapter probieren.
Lg
Günther
-
Morgen
bin nun das Forum durch, finde aber nicht recht einen Anfang.
Evtl kann mir einer kurz beiseite stehen? Danke!
Gruß
-
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>**
-
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)); }); !
-
@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)
-
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. -
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
-
danke, geht damit (fast)
Die Ausgabe ist nun "26456.91"
mit " "
Kann man die auch wegbekommen, also nur 26456.91
?
-
Ich glaub wir führen asynchrone Gespräche
Die Anführungszeichen im ersten Beispiel waren vom JSON.stringify(), das hätts nicht wirklich gebraucht
-
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); }
-
@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
-
Funktioniert `
Dann markiere bitte das Thema als gelöst (im ersten Beitrag). -
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="\"SSID\"" value="\""" +/wifi.ssid()/"\"/valueunit="\"\"/">\n"; message += "<data name="\"IP\"" value="\""" +/wifi.localip().tostring()/"\"/valueunit="\"xxx.xxx.xxx.xxx\"/">\n"; message += "<data name="\"help\"" value="\"use" setvalue?value="xx" to/set/new/value\"/valueunit="\"text\"/">\n"; WiFi.macAddress(MAC); tohex(MAC, insz, MACStr, outsz); message = message + "<data name="\"MAC\"" value="\""" +/macstr/"\"/valueunit="\"AA:BB:CC:DD:EE:FF\"/">\n"; message += "<data name="\"GasMeter\"" value="\""" +/string(float(value)/100)/"\"/valueunit="\"m^3\"/">\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>
-
@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.
-
wie bekomme ich die Warnung weg? `
Siehe http://forum.iobroker.net/viewtopic.php?f=21&t=7556#p78975.