NEWS
Datenpunkt aus xml
-
Hallo zusammen,
ich bin bei IOBroker neu und leider wird mein Wechselrichter, SolarFrontier, nicht mittels Adapter ausgelesen.
Ich kann aber mit dem link (http://10.68.0.85/measurements.xml) eine xml Datei auslesen. Wie bekomme ich diese in Datenpunkte.
Ich hab schon was von xml2js gelesen, aber wo trag ich das ein und wie könnte ein Script ausschauen.
<root> <Device Name="SF-WR-5503" Type="Inverter" Serial="752794Axxxxxxx" BusAddress="1" NetBiosName="INV005565810009" IpAddress="10.68.0.85" DateTime="2022-11-14T14:34:49"> <Measurements> <Measurement Value="232.511" Unit="V" Type="AC_Voltage1"/> <Measurement Value="234.392" Unit="V" Type="AC_Voltage2"/> <Measurement Value="234.739" Unit="V" Type="AC_Voltage3"/> <Measurement Value="0.188" Unit="A" Type="AC_Current1"/> <Measurement Value="0.186" Unit="A" Type="AC_Current2"/> <Measurement Value="0.182" Unit="A" Type="AC_Current3"/> <Measurement Value="83.355" Unit="W" Type="AC_Power"/> <Measurement Value="30.510" Unit="W" Type="AC_Power1"/> <Measurement Value="28.707" Unit="W" Type="AC_Power2"/> <Measurement Value="27.966" Unit="W" Type="AC_Power3"/> <Measurement Value="49.997" Unit="Hz" Type="AC_Frequency1"/> <Measurement Value="50.005" Unit="Hz" Type="AC_Frequency2"/> <Measurement Value="50.001" Unit="Hz" Type="AC_Frequency3"/> <Measurement Value="435.600" Unit="V" Type="DC_Voltage"/> <Measurement Value="0.195" Unit="A" Type="DC_Current"/> <Measurement Value="84.942" Unit="W" Type="DC_Power"/> <Measurement Value="39.610" Unit="°C" Type="Temp"/> </Measurements> </Device> </root>
Danke Euch!
-
@australien geht bestimmt einfacher mit einem Skript.
Ich würde das versuchen mit dem Parser Adapter auszulesen, auch wenn es dafür sehr unglücklich aufgebaut ist.Der erste Wert käme mit
lue="([\d.]+)[^a]+age1
die anderen gehen ähnlich.
Warte nochmal, mir fällt gerade etwas ein!
Edit:
jepp! mitlue="([\d.]+)
bekommst du jeden Wert, du musst nur die NUM für deine gewünschten Werte anpassen -
@australien
In Plain-JavaScript mit dem DOMParser.
Ich weiß aber leider nicht, wie der in den ioBroker eingebunden werden muss - falls das überhaupt geht. -
@australien sagte in Datenpunkt aus xml:
xml2js gelesen, aber wo trag ich das ein
In der JS-Instanz-Konfiguration eintragen:
@australien sagte in Datenpunkt aus xml:
wie könnte ein Script ausschauen.
const parser = require('xml2js').parseString; const idXML = 'abc'; // anpassen! on(idXML, function(dp) { parser(dp.state.val, function(err, obj) { if(!err) { // Attribute von obj auswerten } }); });
-
danke für Eure inputs, leider stehe ich wie der Ochs vor dem Tor und verstehe nur Bahnhof.
Wie kann ich mein http xml request in Datenpunkte bringen?
in fhem hat das so ausgeschaut.TYPE HTTPMOD url http://10.68.0.85/measurements.xml reading01Name AC_Current3 reading01Regex AC_Current3\'\/><Measurement Value=\'([\d]+)
-
@australien
Versuche es erst einmal so:const parser = require('xml2js').parseString; const url = 'http://10.68.0.85/measurements.xml'; schedule('* * * * *', function() { request(url, function(error, response, result) { if(!error) parser(result, function(err, obj) { if(!err) { log(obj); // Ausgabe posten! } }); }); });
-
-
@australien hst du das modul in der Javascript-Instanz eingetragen?
-
@homoran
Ja -
@australien sagte in Datenpunkt aus xml:
@homoran
JaNein , nicht da!
@paul53 sagte in Datenpunkt aus xml:
@australien sagte in Datenpunkt aus xml:
xml2js gelesen, aber wo trag ich das ein
In der JS-Instanz-Konfiguration eintragen:
da!
-
@homoran
auch ja, soweit ich sehe. -
@australien
Siehe Zeile 6: Tauschedp.state.val
gegenresult
aus (hatte ich nach wenigen Sekunden korrigiert). -
@australien wieso steht bei dir dp in Zeile 13.
das ust nicht was Paul schriebedit: ok, hatte das "original " nicht gesehen
-
jetz kommt Leben ins Geschehen
20:19:52.202 info javascript.0 (6486) Stop script script.js.common.PV 20:38:16.280 info javascript.0 (6486) Stop script script.js.common.PV 20:38:17.819 info javascript.0 (6486) Start javascript script.js.common.PV 20:38:17.856 info javascript.0 (6486) script.js.common.PV: registered 0 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions 20:39:07.644 info javascript.0 (6486) script.js.common.PV: {'root':{'Device':[{'$':{'Name':'SF-WR-5503','Type':'Inverter','Serial':'752794AB005565810009','BusAddress':'1','NetBiosName':'INV005565810009','IpAddress':'10.68.0.85','DateTime':'2022-11-14T20:38:18'},'Measurements':[{'Measurement':[{'$':{'Value':'233.046','Unit':'V','Type':'AC_Voltage1'}},{'$':{'Value':'235.306','Unit':'V','Type':'AC_Voltage2'}},{'$':{'Value':'234.911','Unit':'V','Type':'AC_Voltage3'}},{'$':{'Value':'50.002','Unit':'Hz','Type':'AC_Frequency1'}},{'$':{'Value':'50.006','Unit':'Hz','Type':'AC_Frequency2'}},{'$':{'Value':'50.003','Unit':'Hz','Type':'AC_Frequency3'}},{'$':{'Value':'0.000','Unit':'V','Type':'DC_Voltage'}},{'$':{'Value':'21.260','Unit':'°C','Type':'Temp'}}]}]}]}} 20:40:00.071 info javascript.0 (6486) script.js.common.PV: {'root':{'Device':[{'$':{'Name':'SF-WR-5503','Type':'Inverter','Serial':'752794AB005565810009','BusAddress':'1','NetBiosName':'INV005565810009','IpAddress':'10.68.0.85','DateTime':'2022-11-14T20:39:10'},'Measurements':[{'Measurement':[{'$':{'Value':'233.334','Unit':'V','Type':'AC_Voltage1'}},{'$':{'Value':'235.452','Unit':'V','Type':'AC_Voltage2'}},{'$':{'Value':'235.217','Unit':'V','Type':'AC_Voltage3'}},{'$':{'Value':'50.015','Unit':'Hz','Type':'AC_Frequency1'}},{'$':{'Value':'50.024','Unit':'Hz','Type':'AC_Frequency2'}},{'$':{'Value':'50.008','Unit':'Hz','Type':'AC_Frequency3'}},{'$':{'Value':'0.000','Unit':'V','Type':'DC_Voltage'}},{'$':{'Value':'21.250','Unit':'°C','Type':'Temp'}}]}]}]}}
nur wir teile ich die Daten nun Datenpunkten zu?
-
@australien sagte in Datenpunkt aus xml:
die Daten nun Datenpunkten zu?
Ersetze log(obj) durch
const messung = obj.root.Device[0].Measurements[0].Measurement; for(let obj of messung) { log(obj.$.Type + ': ' + parseFloat(obj.$.Value) + ' ' + obj.$.Unit); // setState('0_userdata.0.SolarFrontier.' + obj.$.Type, parseFloat(obj.$.Value), true); }
Erstelle vorher die 8 Datenpunkte vom Typ "number" unter "0_userdata.0".
Log:
20:59:41.099 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Voltage1: 233.046 V 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Voltage2: 235.306 V 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Voltage3: 234.911 V 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Frequency1: 50.002 Hz 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Frequency2: 50.006 Hz 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: AC_Frequency3: 50.003 Hz 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: DC_Voltage: 0 V 20:59:41.100 info javascript.1 (2579) script.js.common.Neuer_Test: Temp: 21.26 °C
-
@paul53 wieso sind im obj nur 8 Werte?
die xml enthält 17 -
@homoran sagte: die xml enthält 17
Dann müssen die übrigen wohl in einem anderen Array-Element enthalten sein. Ich schau mal.
-
alle in <Measurements>
<root> <Device Name="SF-WR-5503" Type="Inverter" Serial="752794Axxxxxxx" BusAddress="1" NetBiosName="INV005565810009" IpAddress="10.68.0.85" DateTime="2022-11-14T14:34:49"> <Measurements> <Measurement Value="232.511" Unit="V" Type="AC_Voltage1"/> <Measurement Value="234.392" Unit="V" Type="AC_Voltage2"/> <Measurement Value="234.739" Unit="V" Type="AC_Voltage3"/> <Measurement Value="0.188" Unit="A" Type="AC_Current1"/> <Measurement Value="0.186" Unit="A" Type="AC_Current2"/> <Measurement Value="0.182" Unit="A" Type="AC_Current3"/> <Measurement Value="83.355" Unit="W" Type="AC_Power"/> <Measurement Value="30.510" Unit="W" Type="AC_Power1"/> <Measurement Value="28.707" Unit="W" Type="AC_Power2"/> <Measurement Value="27.966" Unit="W" Type="AC_Power3"/> <Measurement Value="49.997" Unit="Hz" Type="AC_Frequency1"/> <Measurement Value="50.005" Unit="Hz" Type="AC_Frequency2"/> <Measurement Value="50.001" Unit="Hz" Type="AC_Frequency3"/> <Measurement Value="435.600" Unit="V" Type="DC_Voltage"/> <Measurement Value="0.195" Unit="A" Type="DC_Current"/> <Measurement Value="84.942" Unit="W" Type="DC_Power"/> <Measurement Value="39.610" Unit="°C" Type="Temp"/> </Measurements> </Device> </root>
-
@homoran
Das Ergebnis (Log) von xml2js lieferte nur die 8 Werte. -
super, danke euch beiden!