Hallo zusammen,
Ich habe mir ein Skript gebaut welches XML einer ETA ausliest und speichert…
Das eigentlich nicht standardisierte daran ist, dass bei der ETA im XML ein Namespace verwendet wird der bei XPATH Abfragen berücksichtigen werden muss. Aus diesem Grund kann konnte ich nicht so einfach drauflos parsen...
Ich hätte noch weitere Ideen die ich einbringen könnte - würde mich aber grundsätzlich freuen falls jemand Lust hat das Skript weiter zu abstrahieren und als Adapter umzusetzen? Ich befürchte schlicht mir fehlt die Zeit dazu diesen dann auch ordentlich zu pflegen…
Aber hier zumindest mal das Skript 
var http = require('http');
var xpath = require('xpath');
var dom = require('xmldom').DOMParser;
var etaIP = 'http://192.168.178.xx:8080/user/var';
// 1\. URI => URI muss ggf. je nach Platine individuell ausgelesen werden (siehe http://192.168.178.xx:8080/user/menu)
// 2\. Object
// 3\. read
// 4\. write
// 5\. name
// 6\. type
// 7\. unit
// 8\. role
var etaVars = [
["/120/10251/0/0/12242", "eta.temperatur.PUFFER_OBEN", true, false, "Puffer oben", "number", "°C", "value.temperature"],
["/120/10251/0/0/12244", "eta.temperatur.PUFFER_UNTEN", true, false, "Puffer unten", "number", "°C", "value.temperature"],
];
etaVars.forEach(function(etaVar){
createState(etaVar[1], 0, {
read: etaVar[2],
write: etaVar[3],
name: etaVar[4],
type: etaVar[5],
unit: etaVar[6],
role: etaVar[7]
});
});
schedule("*/10 * * * * *", function () {
pollETA();
});
pollETA();
function pollETA() {
// console.log("** Polling ETA Variables");
etaVars.forEach(function(etaVar){
http.get(etaIP + etaVar[0], function (http_res) {
// initialize the container for our data
var data = "";
// this event fires many times, each time collecting another piece of the response
http_res.on("data", function (chunk) {
// append this chunk to our growing `data` var
data += chunk;
// console.log("** ETA chunk: " + chunk);
});
// this event fires *one* time, after all the `data` events/chunks have been gathered
http_res.on("end", function () {
// console.log("** ETA data: " + data);
try {
var doc = new dom().parseFromString(data);
var select = xpath.useNamespaces({"eta": "http://www.eta.co.at/rest/v1"});
var state = (select('//eta:value/@strValue', doc)[0].nodeValue);
// console.log("** ETA state: " + state);
setState(etaVar[1], state);
}
catch (e) {
log("ETA: Cannot set data "+ etaVar[2] +":" + e, 'error');
}
});
});
});
}