NEWS
Webseite parsen ?
-
Hallo.
Ich habe hier eine lokale Webseite die Schaltzustände anzeigt. (das ist die Webseite meiner Einbruchmeldeanlage)
Leider gibt es noch keinen Adapter um mit der Alarmanlag über ein Protokoll zu kommunizieren. https://github.com/ioBroker/AdapterRequests/issues/309
Kann man nicht die Zustände von der Webseite aus in Datenpunkte umwandeln indem man die Webseite alle paar Sekunden abfragt?
Danke!
Roelli.
Hier ist der Seitenquelltext, aus dem ich selbtverständlich nicht schlau werde:
<html> <head> <body bgcolor="#EFEFEF" text="black" link="blue" vlink="purple" alink="red"> <script type="text/javascript"> function init_tab() { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","input_emz.xml",false); xmlhttp.send(); xmlDoc=xmlhttp.responseXML; document.write("<table border='1'>"); var x=xmlDoc.getElementsByTagName("Info"); poll=x[0].getElementsByTagName("Poll")[0].childNodes[0].nodeValue; document.write("<title>"+x[0].getElementsByTagName('Headline')[0].childNodes[0].nodeValue+"</title>"); document.write("<tr><td colspan='6' align='center'>"); document.write(x[0].getElementsByTagName("Headline")[0].childNodes[0].nodeValue); document.write("</td></tr>"); document.write("<tr><td width='300'>"); document.write(x[0].getElementsByTagName("Column1")[0].childNodes[0].nodeValue); document.write("</td><td width='80'>"); document.write(x[0].getElementsByTagName("Column2")[0].childNodes[0].nodeValue); document.write("</td><td>"); document.write(x[0].getElementsByTagName("Column3")[0].childNodes[0].nodeValue); document.write("</td><td width='100'>"); document.write(x[0].getElementsByTagName("Column4")[0].childNodes[0].nodeValue); document.write("</td><td align='center' width='50'>"); document.write(x[0].getElementsByTagName("Column5")[0].childNodes[0].nodeValue); document.write("</td></tr>"); var y=xmlDoc.getElementsByTagName("Input"); for (i=0;i<y.length;i++) { document.write("<tr><td>"); document.write("<div id='text"+i+"'> </div>"); document.write("</td><td>"); document.write("<div id='zustand"+i+"'> </div>"); document.write("</td><td align='center'>"); document.write("<img src='red-on.gif' alt='red-on.gif'>"); document.write("</td><td>"); document.write("<div id='ph_zustand"+i+"'> </div>"); document.write("</td><td align='center'>"); document.write(y[i].attributes[0].nodeValue); document.write("</td></tr>"); } document.write("</table>"); RedOnBild = new Image(); RedOnBild.src = "red-on.gif"; RedOffBild = new Image(); RedOffBild.src = "red-off.gif"; refresh(); } function refresh() { xmlhttp.open("GET","input_emz.xml",false); xmlhttp.send(); xmlDoc=xmlhttp.responseXML; var z=xmlDoc.getElementsByTagName("Input"); for (i=0;i<z.length;i++) { if (document.getElementById('text'+i).innerHTML != z[i].getElementsByTagName("Text")[0].childNodes[0].nodeValue) document.getElementById('text'+i).innerHTML=z[i].getElementsByTagName("Text")[0].childNodes[0].nodeValue; if (document.getElementById('zustand'+i).innerHTML != z[i].getElementsByTagName("Condition")[0].childNodes[0].nodeValue) document.getElementById('zustand'+i).innerHTML=z[i].getElementsByTagName("Condition")[0].childNodes[0].nodeValue; if (document.getElementById('ph_zustand'+i).innerHTML != z[i].getElementsByTagName("PH_Condition")[0].childNodes[0].nodeValue) document.getElementById('ph_zustand'+i).innerHTML=z[i].getElementsByTagName("PH_Condition")[0].childNodes[0].nodeValue; if (z[i].getElementsByTagName("Led")[0].childNodes[0].nodeValue == "RED_ON") if (document.images[i].src != RedOnBild.src) document.images[i].src = RedOnBild.src; if (z[i].getElementsByTagName("Led")[0].childNodes[0].nodeValue == "RED_OFF") if (document.images[i].src != RedOffBild.src) document.images[i].src = RedOffBild.src } window.setTimeout("refresh()", poll); } init_tab(); </script> </head> <body> </body> </html>
-
@Roelli
Ich habe die [http://deine-ip:port/input_emz.xml] direkt mit dem Parser geöffnet.
Über das RegEx-Feld prüfe ich, ob der entsprechende Zustand in der input_emz.xml enthalten ist.
Das ganze lass ich im 5 Sekunden Takt laufen. -
@Ju5t1n
Mega!
Habe mal Deinen Code bei mir ausprobiert, funzt aber noch nicht so ganz. Der Zustand ändert sich nicht - egal ob die "Led rot ist oder nicht".
Kann man vermutlich auch besser testen wenn man auch mal den Wert der Webseite ändern kann.
Hast Du Bock auf Teamviewer? Ich zahl nen Fuffi pro Stunde mit Paypal - dann könnten wir mal probieren. Vielleicht klappts ja irgendwie. -
@Roelli
Das Geld lass mal stecken. Teamviewer können wir aber gerne mal machen.
Die Werte in der Webseite ändern sich, wenn du deine Türen/Fenster öffnest oder schließt.
Bei mir dauert es immer ein paar Sekunden, bis die Änderung auf dem WebGui von der EMA erscheint.
Also mit ein wenig Verzögerung musst du schon leben. -
@Ju5t1n
Bei mir erscheint beim "Testtext" plötzlich der Seitenquelltext. Ich würde sagen ich mache gefühlt relativ viel falsch!
Wann haste mal Zeit? -
@Roelli sagte in Webseite parsen ?:
Bei mir erscheint beim "Testtext" plötzlich der Seitenquelltext.
das soll er auch, wenn der Aufruf korrekt ist.
Spätestens nach dem Drücken des "play"-Buttons -
@Homoran said in Webseite parsen ?:
@Roelli sagte in Webseite parsen ?:
Bei mir erscheint beim "Testtext" plötzlich der Seitenquelltext.
das soll er auch, wenn der Aufruf korrekt ist.
Spätestens nach dem Drücken des "play"-ButtonsInteressant!
Allerdings ändert sich am Datenpunkt: nix -
@Roelli ich habe mir den "Quelltext" nicht genau angesehen. kann mir aber bei einer Alarmanlage gut vorstellen, dass diese nicht einfach von extern gesteuert werden kann.
-
Bei der Alarmanlage gibt's 100 Eingänge (=100 Meldergruppen)
und 100 Ausänge (womit man von extern irgendwas in der Alarmanlage schalten kann.Die Alarmanlage macht lokal eine Webseite.
Ich dachte.. Iobroker checkt dann im lokalen Netzwerk die Werte der Webseite und wenn sich was ändert - dann ändert sich der Datenpunkt in Iobroker und ich kann damit dann weiterarbeiten. -
@Roelli also nur reagieren? nicht da etwas ändern!
das sollte gehen, wenn die Änderungen auch im Quelltext erscheinen und nicht im Hintergrund dynamisch erstellt werden. -
@Homoran
Joa. Auf die Ausgänge der Alarmanlage soll nur reagiert werden.
Die Eingänge der Alarmanlage sollen aber auch schalten. (Von Iobroker zur Alarmanlage)Für mich sieht's eher nicht so aus als wenn sich im Quelltext was ändert wenn sich ein Wert der Alarmanlage ändert. Zumindest kann ich keine 100 einzelne Zustände erkennen.
Aber... in Sachen HTML bin ich eh auf Hilfe angewiesen.
Eine Lösung dazu findet man eher nicht im Internet. Das ist eher etwas für jemanden der sich sowieso mit sowas auskennt. -
@Roelli sagte in Webseite parsen ?:
in Sachen HTML bin ich eh auf Hilfe angewiesen.
da sind wir dann ja schon zwei
für mich sieht das so aus als ob das ganze per xml dynamisch erzeugt wird, also Werte auf die reagiert wird nicht mittels Parser zu bekommen sind