[gelöst] Anfängerprobleme mit HTTPMOD

Begonnen von WhyTea, 26 Oktober 2018, 09:16:38

Vorheriges Thema - Nächstes Thema

WhyTea

Moin
Ich versuche seit einigen Tagen per HTTPMOD die Statusseite meiner Solaranlage auszulesen.
Leider ohne Erfolg. :-(

Die Seite ist per Browser erreichbar unter IP 192.168.6.101 aufrufbar. Siehe Screenshot.

Ich habe ein Device Solaranlage angelegt das alle 60 Sekunden die Daten abfragen soll. Siehe List
List des Device
Internals:
   BUSY       0
   CFGFN     
   CHANGED   
   DEF        http://192.168.6.101/home.html 60
   Interval   60
   LASTSEND   1540537119.26324
   MainURL    http://192.168.6.101/home.html
   ModuleVersion 3.5.1 - 5.7.2018
   NAME       Solaranlage
   NR         54681
   STATE      ???
   TRIGGERTIME 1540537179.26238
   TRIGGERTIME_FMT 2018-10-26 08:59:39
   TYPE       HTTPMOD
   addr       http://192.168.6.101:80
   auth       0
   buf       
   code       505
   compress   1
   conn       
   data       
   displayurl http://192.168.6.101/home.html
   header     1
   host       192.168.6.101
   httpheader HTTP/1.1 505 HTTP Version Not Supported
Transfer-Encoding: chunked
Content-Type: text/plain
   httpversion 1.0
   hu_blocking 0
   hu_filecount 43
   hu_port    80
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /home.html
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.6.101/home.html
   value      0
   Helper:
     DBLOG:
       state:
         mylogdb:
           TIME       1540536884.25137
           VALUE      reread
   QUEUE:
   READINGS:
   REQUEST:
     data       
     header     1
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.6.101/home.html
     value      0
   sslargs:
Attributes:
   enableControlSet 1


Zunächst kommt die Rückmeldung: "HTTP/1.1 505 HTTP Version Not Supported".
Nach etwas lesen und überlegen habe ich das Attribut httpVersion 1.1 gesetzt. Und siehe da ich bekomme eine Antwort.

Gruß
Daniel

httpheader


HTTP/1.1 200 OK
Server: MXCHIP
Connection: close
Cache-Control: max-age=36000
Content-Encoding: gzip
Expires: Wed, 31 Dec 2070 23:00:00 GMT
Last-Modified: Fri, 17 Feb 2017 06:10:54 GMT
Content-Type: text/html
Content-Length: 2811


Aber was nun. Ich hänge fest und weis nicht was ich als nächstes tun muss. :-(

Im Logfile finde ich noch diese Meldungen:
2018.10.26 09:16:39 3: Solaranlage: Read response to update didn't match any Reading

Der Screenshot der Seite ist ja schon dran und hier ist auch nochmal der Quelltext.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Home</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width"/>
<!meta name="MobileOptimized" content="320">

<link href="layout.css" rel="stylesheet" type="text/css" />

</head>

<body onload="loop()">
<div id="menu">
<div id="nav">
<ul>
<li><a id="hom" href="home.html" style="background-color:#555"><span data-locale="nav_home">Home</span></a></li>
<li><a id="net" href="ethernet.html"><span data-locale="nav_lan">Ethernet</span></a></li>
<li><a id="adv" href="advanced.html"><span data-locale="nav_advanced">Advanced</span></a></li>

<div id="wifi_nav" style="display:show;">
                <li><a id="wir" href="wireless.html"><span data-locale="nav_wireless">Wireless</span></a></li>
</div>

<li class="pull-right" id="cnpic"><a href="#" onclick="choose_cn()"></a></li>
<li class="pull-right" id="depic"><a href="#" onclick="choose_de()"></a></li>
<li class="pull-right" id="enpic"><a href="#" onclick="choose_en()"></a></li>
</ul>
</div>
</div>

<div id="container">
<div class="corner5px mb15 pa14item">
<div class="title"><h2><span data-locale="device_information">Device Information</span></h2></div>
<div class="condiv">
<table rules="rows" width=520>
<tr id="sn_div" style="display:none">
<td width= 340 id="sn_dis"><span data-locale="serial_number">Serial Number</span>:</td>
<td width= 180 id="sn"></td>
</tr>
<tr id="id_div" style="display:none">
<td width=340 id="id_dis"><span data-locale="registry_id">Registry ID</span>:</td>
<td width=180 id="id"></td>
</tr>
<tr>
<td><span data-locale="registry_key">Registry Key</span>:</td>
<td id="key"></td>
</tr>
<tr>
<td><span data-locale="hard_version">Hardware Version</span>:</td>
<td id="hv"></td>
</tr>
<tr>
<td><span data-locale="software_version">Software Version</span>:</td>
<td id="sv"></td>
</tr>
<tr>
<td><span data-locale="time">Time</span>:</td>
<td id="time"></td>
</tr>
</table>
</div>
</div>

<div class="corner5px mb15 pa14item">
<div class="title"><h2><span data-locale="comm_w_sc">Communication with Zevercloud</span></h2></div>
<div class="condiv">
<table rules="rows">
<tr>
<td width = 450><span data-locale="status">Status</span>:</td>
<td><div id="cld" style="display:none;" class="ok"></div></td>
<td id="cld_error" style="display:none;"><a id="errorpic" OnClick="show_cld_info();" style="cursor:pointer"></a></td>
</tr>
</table>

<div class="tipdvi corner5px mb15 pa14item" id="cninfo" style="display:none;">
<div class="condiv">
<span id="errtip11" style="display:none;" data-locale="cld_unk">Connect fail,unknown reason</span>
<span id="errtip12" style="display:none;" data-locale="cld_cnn_rt">Not connected to the router</span>
<span id="errtip13" style="display:none;" data-locale="cld_eth_ist">Not inserted ethernet cable</span>
<span id="errtip14" style="display:none;" data-locale="cld_resp">Zevercloud no response</span>
<span id="errtip15" style="display:none;" data-locale="cld_err_check">Failed with Zevercloud authentication</span>
<span id="errtip16" style="display:none;" data-locale="cld_err_int">Can't connect to Internet</span>
<span id="errtip17" style="display:none;" data-locale="cld_err_dns">DNS server exception</span>
<span id="errtip18" style="display:none;" data-locale="cld_err_dev">Device information error</span>
<span id="errtip19" style="display:none;" data-locale="cld_err_bind">Not bind a plant</span>
</br>
</br>
<button class="btn" type="button" style="margin-left:300px;" OnClick="hide_cld_info();"><span data-locale="btn_ok">Ok</span></button>
</div>
</div>

</div>
</div>

<div class="corner5px mb15 pa14item">
<div class="title"><h2><span data-locale="comm_w_in">Communication with Inverter</span></h2></div>
<div class="condiv" id="inv_tab">


<table id='inv_tb' rules="rows" >
<tr><td width = 150><span data-locale="sn">SN.</span></td>
<td width =120><span data-locale="pacw">Pac(W)</span></td>
<td width =150><span data-locale="etoday">E_Today(KWh)</span></td>
<td width =130><span data-locale="status">Status</span></td>
<td width =60><span data-locale="set">Set</span></td></tr>
<tr style="display:none">
<td></td><td></td><td></td><td></td>
<td><div class="btn-group"> <a class="dropdown-toggle" data-toggle="dropdown" type="button" onfocus="this.blur()" href="#"><img src="pic.png" style="position:absolute;border:0;left:0px;top:-95px;clip:rect(78px 30px 108px 0px)"></img></a>
<ul class="dropdown-menu">
<li><a href="#" onclick="menuc_on(this);return false;" data-toggle="modal"><span data-locale="pwr_on">Power On</span></a></li>
<li><a href="#" onclick="menuc_off(this);return false;" data-toggle="modal"><span data-locale="pwr_off">Power Off</span></a></li>
</ul></div>
</td>
</tr>
<tr style="display:none">
<td></td><td></td><td></td><td></td>
<td><div class="btn-group"> <a class="dropdown-toggle" data-toggle="dropdown" type="button" onfocus="this.blur()" href="#"><img src="pic.png" style="position:absolute;border:0;left:0px;top:-95px;clip:rect(78px 30px 108px 0px)"></img></a>
<ul class="dropdown-menu">
<li><a href="#" onclick="menuc_on(this);return false;" data-toggle="modal"><span data-locale="pwr_on">Power On</span></a></li>
<li><a href="#" onclick="menuc_off(this);return false;" data-toggle="modal"><span data-locale="pwr_off">Power Off</span></a></li>
</ul></div>
</td>
</tr>
<tr style="display:none">
<td></td><td></td><td></td><td></td>
<td><div class="btn-group"> <a class="dropdown-toggle" data-toggle="dropdown" type="button" onfocus="this.blur()" href="#"><img src="pic.png" style="position:absolute;border:0;left:0px;top:-95px;clip:rect(78px 30px 108px 0px)"></img></a>
<ul class="dropdown-menu">
<li><a href="#" onclick="menuc_on(this);return false;" data-toggle="modal"><span data-locale="pwr_on">Power On</span></a></li>
<li><a href="#" onclick="menuc_off(this);return false;" data-toggle="modal"><span data-locale="pwr_off">Power Off</span></a></li>
</ul></div>
</td>
</tr>
<tr style="display:none">
<td></td><td></td><td></td><td></td>
<td><div class="btn-group"> <a class="dropdown-toggle" data-toggle="dropdown" type="button" onfocus="this.blur()" href="#"><img src="pic.png" style="position:absolute;border:0;left:0px;top:-95px;clip:rect(78px 30px 108px 0px)"></img></a>
<ul class="dropdown-menu">
<li><a href="#" onclick="menuc_on(this);return false;" data-toggle="modal"><span data-locale="pwr_on">Power On</span></a></li>
<li><a href="#" onclick="menuc_off(this);return false;" data-toggle="modal"><span data-locale="pwr_off">Power Off</span></a></li>
</ul></div>
</td>
</tr>
<tr style="display:none">
<td></td><td></td><td></td><td></td>
<td><div class="btn-group"> <a class="dropdown-toggle" data-toggle="dropdown" type="button" onfocus="this.blur()" href="#"><img src="pic.png" style="position:absolute;border:0;left:0px;top:-95px;clip:rect(78px 30px 108px 0px)"></img></a>
<ul class="dropdown-menu">
<li><a href="#" onclick="menuc_on(this);return false;" data-toggle="modal"><span data-locale="pwr_on">Power On</span></a></li>
<li><a href="#" onclick="menuc_off(this);return false;" data-toggle="modal"><span data-locale="pwr_off">Power Off</span></a></li>
</ul></div>
</td>
</tr>
        </table>
</div>
</div>

<div class="corner5px mb15 pa14item" id="meter" style="display:none;">
<div class="title"><h2><span data-locale="e_meter">Energy Meter</span></h2></div>
<div class="condiv">
<table rules="rows">
<tr>
<td width = 170><span data-locale="pacw">Pac(W)</span></td>
<td width = 200><span data-locale="m_in">E_Total In(KWh)</span></td>
<td width = 130><span data-locale="m_out">E_Total Out(KWh)</span></td>
</tr><tr></tr>
<tr>
<td><div id="m_p"></div></td>
<td><div id="m_in"></div></td>
<td><div id="m_out"></div></td>
</tr>
<tr><td colspan="3"><span data-locale="note">Note:</span></td></tr>
<tr><td colspan="3">"+/-"&nbsp;<span data-locale="info">Pac means:import power from grid/export power to grid</span></td></tr>
</table>
</div>
</div>

</div>

<br class="clearfloat" />

<div id="footer">
</div>

<script src="zepto.min.js"></script>
<script src="dropdown.js"></script>


<script type="text/javascript">

    if (window.attachEvent) {
        window.attachEvent("onload", sfHover2);
    }

    var data_received = 0;
var error_info="";

    function parse_vars(data) {
        var parsed = data.split("\n");
        enable_wifi(parsed[0]);
if(0==parsed[1]){
$("#sn_div").show();
}
else if(3==parsed[1]){
$("#sn_div").show();
}
else{
$("#id_div").show();
}
$('#sn').text(parsed[2]);
$('#id').text(parsed[2]);
        $('#key').text(parsed[3]);
        $('#hv').text(parsed[4]);
        $('#sv').text(parsed[5]);
        $('#time').text(parsed[6]);

        error_info = parsed[7];
        if (error_info ==0)
        {
$("#cld_error").hide();
$("#cld").show();
        }
        else
        {
$("#cld").hide();
$("#cld_error").show();
        }

        var row = parsed[8];
var item = 9;
var tb = document.getElementById('inv_tb');
var td;
        for (var i = 0; i < 5; i++)
        {
if(i<row)
{
for(var j = 0; j < 3; j++)
{
td = tb.rows[i+1].cells[j];
td.innerHTML = parsed[item++];
}
td = tb.rows[i+1].cells[3];   
if ("OK" == parsed[item].substr(0,2))
{
td.setAttribute("class","ok");
item++;
}
else
{
td.setAttribute("class","error");
td.style.position="relative";
td.innerHTML='<div style="position: absolute;left:30px;top: 2px;"width=20>'+parsed[item++]+'</div>';
}
tb.rows[i+1].style.display="";
}
else{
tb.rows[i+1].style.display="none";
}
}

if ("OK" == parsed[item++].substr(0,2))
{
$('#m_p').text(parsed[item++]);
$('#m_in').text(parsed[item++]);
$('#m_out').text(parsed[item++]);
$("#meter").show();
}
else{
$("#meter").hide();
}
    }

    function loop()
    {
        if (!data_received){
            makeRequest("home.cgi");
}
        setTimeout("loop()", 30000);
    }
function menuc_on(data){
var $this=$(data);
var sn=$this.parents('td').siblings('td:eq(0)').text();
$.post("inv_ctrl.cgi", "sn="+sn+"&mode=0", function(data){
if(data !="ok"){
alert("Set fail!\r\n");
}
});
}
function menuc_off(data){
var $this=$(data);
var sn=$this.parents('td').siblings('td:eq(0)').text();
$.post("inv_ctrl.cgi", "sn="+sn+"&mode=1", function(data){
if(data !="ok"){
alert("Set fail!\r\n");
}
});
}



function hide_cld_info()
{
$("#cninfo").hide();
}

function show_cld_info()
{
$("#errtip11").hide();
$("#errtip12").hide();
$("#errtip13").hide();
$("#errtip14").hide();
$("#errtip15").hide();
$("#errtip16").hide();
$("#errtip17").hide();
$("#errtip18").hide();
$("#errtip19").hide();
if(error_info ==1){
$("#errtip11").show();
}
else if(error_info ==2){
$("#errtip12").show();
}
else if(error_info ==3){
$("#errtip13").show();
}
else if(error_info ==4){
$("#errtip14").show();
}
else if(error_info ==5){
$("#errtip15").show();
}
else if(error_info ==6){
$("#errtip16").show();
}
else if(error_info ==7){
$("#errtip17").show();
}
else if(error_info ==8){
$("#errtip18").show();
}
else if(error_info ==9){
$("#errtip19").show();
}
$("#cninfo").show();
}
</script>

</body>
</html>


t1me2die

Du benötigst natürlich noch ein RegEx für das HTTPMOD, welches den Quelltext sozusagen durchsucht und dir das Ergebnis als Reading ausspuckt.

Ich nutze sehr gerne: https://regex101.com/
Haue unten meinen Quellcode von der Website rein, die ich auslesen möchte.
Oben gebe ich meinen regulären Ausdruck ein und schaue dann rechts, ob das Result das ist, was ich erwarte.

Wir brauchen natürlich auch die Info's, welche Informationen du auslesen möchtest?!

Gruß
Mathze

MadMax-FHEM

#2
Jetzt musst du dir noch überlegen, welche Daten aus der html Antwort dich interessieren und du simit als Reading im Modul extrahiert haben möchtest.

Die Meldung sagt nur, dass nichts als Reading extrahiert werden konnte.
Ist klar weil ja noch nichts angegeben wurde.

Wenn du weißt was du extrahieren willst, dann musst du über entsprechende Attribute den gewünschten Readingnamen angeben und dann eine RegEx für den dazugehörigen Wert.

Also immer paarweise bis du alles hast was du "auslesen" willst...

EDIT2: DeviceSpecificHelp ("unter dem HTTPMOD"), commandref oder wiki sollten da unterstützen... Und dann nat. der RegEx-Link von Mathze

Kurz da nur Handy grad...

EDIT: und zu langsam... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

t1me2die

Wenn ich das jetzt im "überfliegen" richtig gesehen habe, werden die angezeigten Daten per Javascript ermittelt und angezeigt.
Die Werte, die du wahrscheinlich haben möchtest wie z.B. Seriennummer, Verbrauch in kWh usw. liegen nicht als Konstanten im Quellcode vor.

Ich glaube also dass das Auslesen der relevanten Informationen in diesem Fall nicht über HTTPMOD und RegEx geht.
(Ich kann mich natürlich auch täuschen und lasse mich gerne eines besseren belehren, falls jemand einen Tipp hat)

Gruß
Mathze

WhyTea

#4
Danke für die Antworten.
Ich hatte schon diverse Versuche mit Namen gemacht und nie eine verwertbare Antwort bekommen.  :(

Zitat von: t1me2die am 26 Oktober 2018, 11:31:31
Die Werte, die du wahrscheinlich haben möchtest wie z.B. Seriennummer, Verbrauch in kWh usw. liegen nicht als Konstanten im Quellcode vor.
Ja genau es geht um Seriennummer, Pac(W), E_Today(KWh) und Status.

Zitat von: t1me2die am 26 Oktober 2018, 11:31:31
Ich glaube also dass das Auslesen der relevanten Informationen in diesem Fall nicht über HTTPMOD und RegEx geht.
Was müsste ich denn statt dessen tun?

MadMax-FHEM

Zumindest mal das Script "debuggen" (F12 / zumindest in FireFox und Chrome) um zu sehen wie die Daten "geladen" werden.

Kannst leider nur du selber machen, da nur du Verbindung zum Server hast.

Je nachdem wie die Daten geholt werden entweder doch per HTTPMOD oder evtl. selbst was mit wget/curl und dann direkt die Daten abrufen (wie es das javascript tut) und dann nach fhem schreiben, z.B. in einen Dummy...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

WhyTea

Ich hab das mal versucht zu verstehen was die Webseite macht.

So wie ich das sehe werden die Daten per javascript namens zepto.min.js abgerufen.
Ich habe in das Script mal reingeschaut und sehe zwei Funktionen ein jquery und eine Funktionen namens vue.
Insgesamt hat das Script 160 Tausend Zeichen und verstehen tu ich davon mal nicht viel. :-(
Die 160T Zeichen poste ich jetzt natürlich nicht hier sondern habe die in die angehängte Datei kopiert.

Ich bin mir gerade nicht sicher ob man so etwas damit anfangen kann aber ich hoffe es.

Ich habe mir das glaube ich viel zu einfach vorgestellt. :-(

amenomade

Grundsätzlich kann man leider nicht: die Seite wird geladen, die ruft die .js Funktion, und diese Javascript Funktion ändert direkt die Struktur der schon geladenen Seite (ein bisschen wie das Greasemonkey Plugin von Firefox, die Gestaltung einer Seite nachträglich ändern kann).

Es würde sich aber lohnen, den Traffic mit Burp (oder evtl. mit der Console F12 im Browser aber man sieht da weniger) zu analysieren, um zu sehen, ob Einzelqueries dann zur Aktualisierung gesendet werden, und eine entspr. Antwort bekommen. Sowas könnte man dann vielleicht in HTTMOD fangen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

CoolTux

Kannst Du mal bitte hinter der IP folgende URL ran klemmen

/api/v1

Kannst mit nem Browser aufrufen. Bekommst Du da irgendwas ausser einen Fehler angezeigt?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhyTea

Es wird eine leere Seite angezeigt.
Quelltext auch leer.
Größe 0 Byte.

Aber kein Fehler.

CoolTux

Dann gibt es eine lokale API Schnittstelle die Du anrufen kannst und wo du json Daten zurück bekommst. Ich habe einfach deine Software Versionsnummer bei Google eingegeben und so Informationen bekommen. Kann da gerne heute Abend noch Mal googeln. Du musst hinter dem v1 weitere url teile aufrufen. Dann kommen die Daten
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhyTea

Bin ein wenig weiter danke für den Tipp!

Wenn ich http://192.168.6.101/home.cgi aufrufe bekomme ich folgende Antwort:
1 1 EAB961723105 QN6PAX3SS4VHW8AX M11 17A31-727R+17829-719R 16:21 26/10/2018 0 1 BS15006011720112 150 0.54 OK Error
Quelltext
<html><head></head><body>1
1
EAB961723105
QN6PAX3SS4VHW8AX
M11
17A31-727R+17829-719R
16:21 26/10/2018
0
1
BS15006011720112
150
0.54
OK
Error
</body></html>


Das müsste ich doch besser verwenden können oder?

CoolTux

Also ich würde wirklich versuchen die API zu verwenden wenn es geht. Dafür wäre sie ja da

http://192.168.6.101/api/v1/getPlantOverview

Was bekommst da?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhyTea


CoolTux

und was sagt F12 Developer seite?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net