Hauptmenü

HTTPMOD und readings + regEx

Begonnen von Torben80, 19 März 2017, 14:12:31

Vorheriges Thema - Nächstes Thema

Torben80

Hallo Leute,
ich komme einfach nicht klar.

Ich habe eine Alarmanlage mit internem Webserver auf dem ich zugreifen kann und den Zustand der Kontakte und Anlage (scharf unscharf) sehe.
Das möchte ich nun auslesen.

Erster Schritt ist der Benutzername + Kennwort. Das habe ich schon soweit hinbekommen...
Da ich den CODE 200 zurück bekomme, denke ich auch, dass ich "drin" bin.

Nun habe ich mir auch schon diverse Anleitungen angesehen die mit den Readings zu tun haben, aber ich bekomme es nicht verknüpft. Ich weiss nicht ob ich zu doof bin?

Im Folgenden CODE-Ausschnitt ist der HTML-Code der Seite "/setting/panelCond.htm" die ich auslese.
Am Anfang läuft ein Script welches den var rowtpl = new Template erst generiert und dann an der richtigen Stelle abruft. Das habe ich alles verstanden.

Hier sieht man den reinen Quelltext der Seite.... Und im nächsten Codeschnippsel die dann durch das Script erzeugte "<table id="sensors" class="fm">"....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<link rel="stylesheet" type="text/css" href="/css/main.css" />
<script type="text/javascript" src="/js/prototype/prototype.js"></script>
<script type="text/javascript" src="/js/scriptaculous/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="/js/app/message.js"></script>
<script type="text/javascript" src="/js/app/app.js"></script>
<title>Panel Status</title>
<style type="text/css">
form label {width: 100px; float: left; text-align: right; padding: 4px 3px 6px;}
form span {float: left; padding: 6px 3px 6px;}
form br {clear: left;}
</style>
</head>
<body>
<script type="text/javascript">
//<![CDATA[
document.observe('dom:loaded', function() {
var page = new Page();
});

var Page = Class.create({
initialize: function() {
this.xhrLoad();
Helper.setFooter();

$('pcondform1').observe('submit', function(event) {
Helper.xhrSubmit('pcondform1');
Event.stop(event);
}.bind(this));
$('pcondform1').observe('reset', function(event) {
this.xhrLoad();
Event.stop(event);
}.bind(this));
/*
$('pcondform2').observe('submit', function(event) {
Helper.xhrSubmit('pcondform2');
Event.stop(event);
}.bind(this));
$('pcondform2').observe('reset', function(event) {
this.xhrLoad();
Event.stop(event);
}.bind(this));
*/
$('s_reload').observe('click', function(event) {
this.xhrLoad();
Event.stop(event);
}.bind(this));
},

xhrLoad: function() {
Panel.isReady({
onReady: function(isReady) {
this.doReady(isReady);
}.bind(this)
});
},

doReady: function(isReady) {
if (!isReady)
return;

var rowtpl = new Template(
'<tr><td align="center">#{no}.</td><td>#{type}</td>'+
'<td align="center"><strong>#{zone}</strong>'+
'</td><td>#{name}</td><td>#{attr}</td>'+
'<td>#{cond}</td><td>#{battery}</td><td>#{tamp}</td><td>#{bypass}</td>'+
'<td><a href="#" class="aedits">'+XMSG.EDIT+'</a>&nbsp;'+
'<a href="#" class="adels">'+XMSG.DELETE+'</a>'+
'<input type="hidden" name="sarea" value="#{area}" />'+
'<input type="hidden" name="szone" value="#{zone}" /></td></tr>');

Helper.xhrLoad('/action/panelCondGet');
new Ajax.Request('/action/sensorListGet', {
method: 'get',
onSuccess: function(resp) {
var o = resp.responseText.evalJSON();
if (!o || !o.senrows) return;
$$('table#sensors tbody tr').each(function(it) {
if (!it.readAttribute('id')) it.remove();
});
for (i = 0; i < o.senrows.length; i++) {
var r = o.senrows[i];
$('sentbl').insert({before: rowtpl.evaluate(r)});
}
$$('a.aedits').invoke('observe', 'click', function(event) {
this.onEditS(event);
Event.stop(event);
}.bind(this));
$$('a.adels').invoke('observe', 'click', function(event) {
this.onDelS(event);
Event.stop(event);
}.bind(this));
Helper.stripMe('table#sensors tbody tr', 'table#sensors tbody tr:nth-child(odd)', true);
}.bind(this),
onFailure: Helper.xhrFailure
});
},

onEditS: function (event) {
var elem = Event.element(event);
var area = $(elem).next('input');
var zone = $(area).next('input');
if (!area || !zone) return;
area = $F(area);
zone = $F(zone);

Helper.rdir(window, '/setting/sensorEdit.htm?area='+area+'&zone='+zone);
},

onDelS: function (event) {
var elem = Event.element(event);
var area = $(elem).next('input');
var zone = $(area).next('input');
if (!area || !zone) return;
area = $F(area);
zone = $F(zone);

if (!confirm(XMSG.RUSURE)) return;
//delete
new Ajax.Request('/action/sensorDel', {
method: 'post',
parameters: {'area': area, 'zone': zone},
onSuccess: function(resp) {
var o = resp.responseText.evalJSON();
var m = (o.message) ? o.message : XMSG.UNKNOWNERR;
if (o.result == 1) {
//deleted, <tr> removed
$(elem).up().up().remove();
} else {
//failed
alert(m);
}
},
onFailure: Helper.xhrFailure
});
}
});
//]]>
</script>
<div id="indicator" style="display: none">
<img src="/images/ajaxld.gif" /><span></span>
</div>
<div id="flashmsg" style="display: none">
<img src="/images/x.gif" onclick="$('flashmsg').hide()" /><span></span>
</div>

<b class="b1f"></b><b class="b2f"></b><b class="b3f"></b><b class="b4f"></b>
<div class="cornerh">
<div><h2>Panel Control</h2></div>
</div>
<b class="b4f"></b><b class="b3f"></b><b class="b2f"></b><b class="b1f"></b>

<h3>Area 1</h3>
<form id="pcondform1" action="/action/panelCondPost" method="post">
<input type="hidden" name="area" value="1" />

<input type="radio" name="mode" value="0" />Arm
<input type="radio" name="mode" value="1" />Home
<input type="radio" name="mode" value="2" />Day Home
<input type="radio" name="mode" value="3" />Night Home
<input type="radio" name="mode" value="4" />Disarm
<br/>

<label></label>
<input type="submit" name="submit" value="OK" />
<input type="reset" name="reset" value="Reset" />
</form>

<div style="margin: 0px;padding: 0 0 2px">&nbsp;</div>
<table class="fm">
<tr class="title">
<td colspan="5"><img src="/images/blue_color.gif" alt="" />Panel Status</td>
</tr>
<tr class="rh">
<td>Battery</td>
<td>Tamper</td>
<td>Interference</td>
<td>AC activation</td>
<td>Rssi</td>
</tr>
<tr>
<td><span id="battery">&nbsp;</span></td>
<td><span id="tamper">&nbsp;</span></td>
<td><span id="interference">&nbsp;</span></td>
<td><span id="ac_activation">&nbsp;</span></td>
<td><span id="rssi">&nbsp;</span></td>
</tr>
</table>

<div style="width: 95%; height:16px;">
<a href="#" style="float: right" id="s_reload">Reload</a>
</div>
<table id="sensors" class="fm">
<thead>
<tr class="title">
<td colspan="11"><img src="/images/blue_color.gif" alt="" />Sensor Information</td>
</tr>
<tr class="rh">
<td colspan="2">Type</td>
<td>Zone</td>
<td>Name</td>
<td>Attribute</td>
<td>Condition</td>
<td>Battery</td>
<td>Tamper</td>
<td>Bypass</td>
<td>&nbsp;</td>
</tr>
</thead>
<tbody>
<tr id="sentbl" style="display: none">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

<div class="footer"></div>
</body>
</html>


mit Script erzeugter "<table id="sensors" class="fm">":

<table id="sensors" class="fm">
<thead>
<tr class="title">
<td colspan="11"><img src="/images/blue_color.gif" alt="">Sensor Information</td>
</tr>
<tr class="rh">
<td colspan="2">Type</td>
<td>Zone</td>
<td>Name</td>
<td>Attribute</td>
<td>Condition</td>
<td>Battery</td>
<td>Tamper</td>
<td>Bypass</td>
<td>&nbsp;</td>
</tr>
</thead>
<tbody>
<tr class="odd"><td align="center">1.</td><td>Remote Controller</td><td align="center"><strong>1</strong></td><td>Benutzer</td><td>Personal Att</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="1" type="hidden"></td></tr><tr class=""><td align="center">2.</td><td>Remote Keypad</td><td align="center"><strong>2</strong></td><td>Flur unten</td><td></td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="2" type="hidden"></td></tr><tr class="odd"><td align="center">3.</td><td>Door Contact</td><td align="center"><strong>3</strong></td><td>Haustür</td><td>Entry</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="3" type="hidden"></td></tr><tr class=""><td align="center">4.</td><td>BX15</td><td align="center"><strong>4</strong></td><td>Blinklicht</td><td></td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="4" type="hidden"></td></tr><tr class="odd"><td align="center">5.</td><td>Door Contact</td><td align="center"><strong>5</strong></td><td>Kellertür</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="5" type="hidden"></td></tr><tr class=""><td align="center">6.</td><td>Door Contact</td><td align="center"><strong>6</strong></td><td>Esszimmer</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="6" type="hidden"></td></tr><tr class="odd"><td align="center">7.</td><td>Door Contact</td><td align="center"><strong>7</strong></td><td>Wohnzimmer DF-Rechts</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="7" type="hidden"></td></tr><tr class=""><td align="center">8.</td><td>Door Contact</td><td align="center"><strong>8</strong></td><td>Wohnzimmer DF-Links</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="8" type="hidden"></td></tr><tr class="odd"><td align="center">9.</td><td>Door Contact</td><td align="center"><strong>9</strong></td><td>Terassentür</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="9" type="hidden"></td></tr><tr class=""><td align="center">10.</td><td>Door Contact</td><td align="center"><strong>10</strong></td><td>Fenster Flur EG</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="10" type="hidden"></td></tr><tr class="odd"><td align="center">11.</td><td>Door Contact</td><td align="center"><strong>11</strong></td><td>Küche</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="11" type="hidden"></td></tr><tr class=""><td align="center">12.</td><td>Door Contact</td><td align="center"><strong>12</strong></td><td>Bad EG</td><td>Burglar</td><td></td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="12" type="hidden"></td></tr><tr class="odd"><td align="center">13.</td><td>PSS</td><td align="center"><strong>71</strong></td><td>Stecker 1</td><td></td><td>Off</td><td></td><td></td><td>No</td><td><a href="#" class="aedits">Edit</a>&nbsp;<a href="#" class="adels">Delete</a><input name="sarea" value="1" type="hidden"><input name="szone" value="71" type="hidden"></td></tr><tr id="sentbl" style="display: none">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>


Damit es auch übersichtlicher ist ein Screenshots im Anhang.

Wie muss ich nun vorgehen um etwas in ein Reading / regEx zu bekommen um es weiter zu verarbeiten?
Ich bitte hier keinen Darum meine Arbeit zu machen, aber ich habe mir nur 3x im Wiki den HTTPMOD durchgelesen, den Spritpreismonitor bei mir eingerichtet und versucht zu vergleichen und mich mit den Regulären Ausdrücken vertraut gemacht...

Ich komme nicht weiter :-(

Ich hoffe Ihr zerreist mich nicht in der Luft. :-)

viegener

Ich denke so wie Du es Dir vorstellst wird es nicht gehen.

Der entscheidende Punkt: Wenn der HTML-Inhalt erst durch das Javascript erzeugt wird, existiert er für HTTPMod nicht, denn HTTPMod ist ja kein Browser in dem Javascript läuft - ergo werden die HTML-Inhalte so nicht aufgebaut.

Ein Lösungsansatz könnte sein die im Javascript angeforderten INhalte zu parsen. Stichwort dazu sind die im Javascript enthaltenen Ajax oder möglicherweise noch anderen Anfragen --> Ajax.Request...

Dazu müsstest Du aber das Javascript analysieren und hoffen, dass die Alarmanlage hier keine zusätzlichen Mechanismen zur Absicherung eingebaut hat - Allerdings wenn das so ist, würde ich der Alarmanlage auch nicht vertrauen...
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Torben80

Ok, mal angenommen der Quelltext würde schon da sein, könnte man mir dann trotzdem mal mit den "readings und regEx" helfen?
Ich steige da nicht durch, bei der Auswahl mit FHEM (die Auswahl bei attr).

Ich habe noch eine zweite Seite der Alarmanlage, da ist der Zustand nicht JScript generiert sondern kommt als HTML heraus.

mfg Torben

viegener

Das hat erstmal mit den attributen gar nichts zu tun, denn HTTPMod ist eben kein Browser in dem Skripte oder ähnliches laufen, also kann er nur die statischen Inhalte, die direkt vom Server zurückgeliefert werden auslesen.

Eigentlich gibt es ganz viele die hier helfen und deshalb verstehe ich die Frage nicht ganz?
(Wobei ein bisschen Einarbeitung und Wille selber Dinge zu lösen ist schon auch gefragt, denn hier ist ja nicht das "wer kann mir mal eben ein wenig FHEM-Code schreiben" Forum).

Also wenn Du dazu die Informationen lieferst denke ich schon, dass dir hier geholfen werden kann :)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Torben80

Dass HTTPMOD kein Browser ist und keine Scripts serverseitig ausführt habe ich ja verstanden.

Mein Problem liegt derzeit mehr darin, dass ich bei der Auswahl der "richtigen" Attribute nicht durchsteige, da dort in der Auswahl so viele unterschiedliche (get|set|reading)Name usw sind, dass ich nicht weiß was ich auswählen muss.

Was ich will ist mir ja klar, Quelltext lesen, in Attribut packen, und dann mit RegEx und regulärem Ausdruck durchsuchen.

Ich weiß aber nicht welche Auswahl ich da gerade treffen soll...

Welche Informationen möchtest du denn noch haben? Ich dachte ich hätte mein bestes gegeben mit dem Quelltext und den Screenshots?
Selbst wenn die html-tables nicht über das JavaScript erstellt werden würden komme ich gerade nicht zum auslesen. Hatte lediglich mal ein READING Wert = 1.


Mit freundlichen Grüßen
Torben

P.S. guten Morgen


Gesendet von iPhone mit Tapatalk

Vize

Moin,

einige Attribute sind im HTTPMOD-Device nicht direkt auswählbar, du musst diese also über die Eingabezeile erzeugen.
Beispiel:
attr <HTTPMOD-Device> reading01Name blablubb

Im Bereich "Sonstiges" hier im Forum findest du auch einiges zu HTTPMOD.

Gruß
Andreas

viegener

OK, es gibt in der Commandref und im FHEMWiki einige Beispiele, die es lohnt sich anzuschauen (und vielleicht gar ins eigene System zu packen), damit man feststellt wie sich das anfühlt.

get/set/reading Präfixe ist einfach erklärt:

reading... ist der Normlafall - HTTPMod frischt regelmässig (siehe define) den Inhalt auf und verarbeitet die reading... Attribute. Die entsprechenden Teile werden als Readings bereitgestellt.

set.. und get.. kommmen ins Spiel wenn man zusätzlich den HTTPMod-Device Befehle per http senden lassen will (set) oder zusätzliche Infos abholen (get) - wie bei anderen fhem devices auch. Also hier vermutlich erstmal noch nicht relevant.

Welche speziellen reading... Attribute benötigt werden hängt davon ab, was für "Quelltext" Du bekommst, beziehungsweise wie Du damit umgehen willst. Bei Dir vermutlich HTML also erstmal ...Regex (und natürlich ...Name) und dazwischen noch eine Zahl (hier macht es Sinn bei 1 anzufangen oder bei 01). Das Setzen erledigt man am besten in FHEMWeb über explizite attr-Befehle sonst stehen die Attribute nicht zur Auswahl zur Verfügung.

Was wird benötigt - Nun ja ich bin auch kein Javascript-Interpreter, deshalb hilft mir Dein "Quelltext" nicht weiter. Der Quelltext einer statischen HTML-Seite wahrscheinlich schon. Aber wie gesagt erstmal etwas Einarbeitung und rumspielen mit Beispielen wäre wünschenswert.



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Torben80

Vielen Dank, ich werde Euch auf dem Laufenden halten.
Gruß Torben


Gesendet von iPhone mit Tapatalk