[gelöst:] Wechselrichter Vaillant auropower (war: Scraping einer website mit...)

Begonnen von alkazaa, 11 Oktober 2019, 21:01:55

Vorheriges Thema - Nächstes Thema

alkazaa

Hallo,
ich möchte Daten aus einer website extrahieren ('scrapen'), deren Inhalt mit javascript dynamisch erzeugt wird. (Konkret: ein Wechselrichter des Herstellers Vaillant liefert u.a die momentan erzeugte elektr. Leistung einer PV-Anlage. Der html-code mit dem entsprechenden Wert wird durch ein javascript erzeugt).

Mit httpmod für statische Seiten habe ich inzwischen etwas Erfahrung sammeln können, aber ich habe keinerlei Ahnung, wie ich an die dynamisch erzeugten Inhalte gelangen könnte (bei denen es sich nicht um JSON oder XML Formate handelt).

Gibt es solch eine Möglichkeit in FHEM überhaupt?

In welche (Such)Richtung würdet ihr mich ansonsten stupsen?

-Franz


amenomade

Wenn der Wert gezeigt wird, dann ist der auch im Quellcode der Seite. HTTPMOD sollte auch funktionieren können
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

rudolfkoenig

Es sei denn, der JavaScript Code holt die Daten nachtraeglich vom Server.
Ich wuerde in diesem Fall entweder mit node.js den Script ausfuehren, und die Daten "entwenden", oder den Script in Perl umschreiben.
Beides kann arbeitsintensiv sein, und erfordert etwas an Einarbeitung.

alkazaa

Dank an amenomade und rudolfkoenig für die prompten Antworten.

Es ist in der Tat so, wie rudolfkoenig vermutet:
Zitat von: rudolfkoenig am 11 Oktober 2019, 22:18:51
Es sei denn, der JavaScript Code holt die Daten nachtraeglich vom Server.
...

Der (statische) Quelltext der html-Seite (Strg-U in Firefox) enthält jede Menge scripts, die dann mit der javascript-engine des Browsers die html-Elemente mit den mich interessierenden Daten dynamisch erzeugen. Mit "Element untersuchen(Q)" kann man sie sich in Firefox auch anzeigen lassen, aber die httpmod Aufrufe behandeln wohl nur den statischen Quelltext.

Ich werde mal schaun, wie dornenreich der von rudolfkoenig skizzierte Weg
Zitat von: rudolfkoenig am 11 Oktober 2019, 22:18:51
...
Ich wuerde in diesem Fall entweder mit node.js den Script ausfuehren, und die Daten "entwenden", oder den Script in Perl umschreiben.
Beides kann arbeitsintensiv sein, und erfordert etwas an Einarbeitung.
für mich wird.

Wird aber dauern... melde mich nur im Erfolgsfall wieder hier.

Beste Grüße
Franz

StefanStrobel

Hallo Franz,

der übliche Weg mit HTTPMOD wäre in so einem Fall dass man die dynamischen Abfragen analysiert und so herausfindet, mit welcher URL man die gewünschten Daten direkt abfragen kann. Dazu nehme ich z.B. die BurpSuite als Proxy.

Gruss
   Stefan

herrmannj

ich würde mal in der Entwicklerkonsole im Browser unter Netzwerk schauen wie die Daten nachgeladen werden. Oft ist das JSON per AJAX. Wenn dem so ist dann sind die dort schon schön strukturiert

alkazaa

Die beiden letzten Antworten wiesen den kürzesten Weg (auf den ich parallel auch kam, nachdem ich die naive Scheu abgelegt hatte, den javascript code auch nur anzuschauen):

Zitat von: StefanStrobel am 12 Oktober 2019, 21:23:48
... der übliche Weg mit HTTPMOD wäre in so einem Fall dass man die dynamischen Abfragen analysiert und so herausfindet, mit welcher URL man die gewünschten Daten direkt abfragen kann. ...
Zitat von: herrmannj am 12 Oktober 2019, 23:37:08
ich würde mal in der Entwicklerkonsole im Browser unter Netzwerk schauen wie die Daten nachgeladen werden. ...

Jedenfalls gab es im script eine Funktion updateValues(), in der ein XMLHttpRequest().open die korrekte URl verriet, mit der die GET Anfrage durchgeführt wird. Mit etwas googeln und Einarbeiten in die XPath Syntax gelang dann folgende Definition der Abfrage der PV-Leistung des Vaillant auropower Wechselrichters:
defmod PVAnlage HTTPMOD http://<ip-adresse>/measurements.xml? 60
attr PVAnlage reading01Name AC_Power
attr PVAnlage reading01XPath-Strict string(//Measurement[@Type='AC_Power']/attribute::Value)
attr PVAnlage stateFormat {sprintf("Leistung: %d W",ReadingsVal($name,"AC_Power",0))


mit der folgender typischer XML-response des Wechselrichters analysiert wird:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Device Name="VPV I 3000/1 400V" Type="Inverter" Platform="Net13" HmiPlatform="HMI17" NominalPower="3200" UserPowerLimit="2900" CountryPowerLimit="nan" Serial="760019EB006747705235" OEMSerial="21190700100228920942005235N7" BusAddress="1" NetBiosName="INV006747705235" WebPortal="Vaillant" ManufacturerURL="" IpAddress="192.168.188.34" DateTime="2019-10-13T16:58:07" MilliSeconds="604">
<Measurements>
<Measurement Value="236.5" Unit="V" Type="AC_Voltage1"/>
<Measurement Value="236.5" Unit="V" Type="AC_Voltage2"/>
<Measurement Value="236.6" Unit="V" Type="AC_Voltage3"/>
<Measurement Value="0.377" Unit="A" Type="AC_Current1"/>
<Measurement Value="0.357" Unit="A" Type="AC_Current2"/>
<Measurement Value="0.373" Unit="A" Type="AC_Current3"/>
<Measurement Value="252.3" Unit="W" Type="AC_Power"/>
<Measurement Value="256.3" Unit="W" Type="AC_Power_fast"/>
<Measurement Value="87.9" Unit="W" Type="AC_Power1"/>
<Measurement Value="82.7" Unit="W" Type="AC_Power2"/>
<Measurement Value="85.8" Unit="W" Type="AC_Power3"/>
<Measurement Value="50.011" Unit="Hz" Type="AC_Frequency1"/>
<Measurement Value="50.008" Unit="Hz" Type="AC_Frequency2"/>
<Measurement Value="50.011" Unit="Hz" Type="AC_Frequency3"/>
<Measurement Value="307.2" Unit="V" Type="DC_Voltage"/>
<Measurement Value="0.821" Unit="A" Type="DC_Current"/>
<Measurement Value="48.3" Unit="°C" Type="Temp"/>
<Measurement Value="620.8" Unit="V" Type="LINK_Voltage"/>
<Measurement Unit="W" Type="GridPower"/>
<Measurement Unit="W" Type="GridConsumedPower"/>
<Measurement Unit="W" Type="GridInjectedPower"/>
<Measurement Unit="W" Type="OwnConsumedPower"/>
<Measurement Value="100.0" Unit="%" Type="Derating"/>
</Measurements>
</Device>
</root>


Dank an alle Rückmelder!
Beste Grüße
Franz