Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

marcus42

Hallo zusammen,

ich mache seit heute meine ersten Gehversuche mit dem HTTPMOD Modul.
Nach Stunden des Rumprobierens gebe ich für heute auf und sende einen Hilferuf ins Forum:

Folgende Attribute sind für ein get gesetzt:


get01Header1 Authorization: Bearer %token%
   get01Name  batteryStatus
   get01Replacement01Mode reading
   get01Replacement01Regex %token%
   get01Replacement01Value token
   get01Replacement02Mode reading
   get01Replacement02Regex %user_vehicle_details_VIN%
   get01Replacement02Value user_vehicle_details_VIN
   get01URL   https://www.services.renault-ze.com/api/vehicle/%user_vehicle_details_VIN%/battery


Die Readings 'token' und 'user_vehicle_details_VIN' existieren direkt im HTTPMOD Device.

Das Ersetzen der Parameter durch den Inhalt der Readings klappt jedoch nicht.

Woran kann das liegen?

Viele Grüße
Marcus

marcus42

Jetzt hab Ichs:

replacement01Mode  anstatt get01Replacement01Mode

und

replacement01Regex anstatt get01Replacement01Regex

Danke für Eure Anteilnahme ;-)

Marcus

unimatrix

Guten Morgen,

in der Funktion HTTPMOD_ExtractReading($$$$$)

ist ein Bug. Bei der Nutzung von XML und XPATH wird die find() Funktion aus LibXML genutzt. Diese liefert nicht immer eine Nodelist zurück, sondern ggf. auch andere Typen. Dementsprechend führt der Aufruf von
push @matchlist, XML::XPath::XMLParser::as_string($node); in Zeile 1774 zu einem Absturz von FHEM, wenn ein Literal zurückgegeben wird.  http://search.cpan.org/dist/XML-LibXML/lib/XML/LibXML/Node.podu beschreibt dieses im Detail.

Der Code sollte wie folgt geändert werden, um zwischen verschiedenen Rückgabewerten zu unterscheiden.

    } elsif ($xpathst) {
        Log3 $name, 5, "$name: ExtractReading $reading with XPath-Strict $xpathst";
        my $nodeset;
        eval {$nodeset = $hash->{ParserData}{XPathStrictNodeset}->find($xpathst)};
        if ($@) {
            Log3 $name, 3, "$name: error in find for XPathStrictNodeset: $@";
        } else {
            if ($nodeset->isa('XML::XPath::NodeSet')) {
               foreach my $node ($nodeset->get_nodelist) {
                  push @matchlist, XML::XPath::XMLParser::as_string($node);
               }
            }else{
                  push @matchlist, $nodeset;
            }
        }
    }


Handelt es sich bei der Rückgabe nicht um ein XML::XPath::NodeSet, dann kann auf weitere Tests mittels isa() verzichtet werden, weil alle Perl mit anderen Typen im skalaren Kontext automatisch "das richtige tut."

Ein Beispiel für ein XPATH was eine Rückgabe liefert, die in der jetzigen Version zum Absturz führt, ist schlichtweg der Ausdruck "1+1" - mit anderen Worten jedwede Art von Berechnung, aber auch XPATH Funktionen, die einen einzelnen Wert zurückliefern. So war mir das aufgefallen, als ich über die Google Directions API ermitteln wollte, wie oft ich auf einer Verbindung umsteigen muss, indem ich folgenden XPATH anwendete:

count((//departure_stop)[position()>1]/name/text())

StefanStrobel

Hallo unimatrix,

vielen Dank für den Hinweis, das baue ich so ein.

Gruss / Thanx
   Stefan

ares

#319
Wenn ich zwei Seiten mit je zwei gleichen Regex auswerten möchte um vier Readings zu erhalten müsste das wie folgt funktionieren, falls ich https://forum.fhem.de/index.php/topic,33765.0.html richtig umgesetzt habe.

Ich vermute aber ich habe einen Denkfehler und die zweite Seite wird doppelt abgerufen. Geht das auch anders?

define TEST HTTPMOD http://1.1.1.1/ 300
attr TEST reading1Name NAME1a
attr TEST reading1Regex SUCHE1
attr TEST reading2Name NAME1b
attr TEST reading2Regex SUCHE2

attr TEST get21Name NAME2a
attr TEST get21URL http://2.2.2.2/
attr TEST get21Poll 1
attr TEST get21Regex SUCHE1

attr TEST get22Name NAME2b
attr TEST get22URL http://2.2.2.2/
attr TEST get22Poll 1
attr TEST get22Regex SUCHE2


Danke
Manfred

unimatrix

Zitat von: ares am 13 Februar 2017, 22:39:03
Wenn ich zwei Seiten mit je zwei gleichen Regex auswerten möchte um vier Readings zu erhalten müsste das wie folgt funktionieren, falls ich https://forum.fhem.de/index.php/topic,33765.0.html richtig umgesetzt habe.

Ich vermute aber ich habe einen Denkfehler und die zweite Seite wird doppelt abgerufen. Geht das auch anders?

define TEST HTTPMOD http://1.1.1.1/ 300
attr TEST reading1Name NAME1a
attr TEST reading1Regex SUCHE1
attr TEST reading1Name NAME1b
attr TEST reading2Regex SUCHE2

attr TEST get21Name NAME2a
attr TEST get21URL http://2.2.2.2/
attr TEST get21Poll 1
attr TEST get21Regex SUCHE1

attr TEST get22Name NAME2b
attr TEST get22URL http://2.2.2.2/
attr TEST get22Poll 1
attr TEST get22Regex SUCHE2


Danke
Manfred
Du verwendest 2 mal reading1name.

Gesendet von meinem P9000 mit Tapatalk


JoeALLb

Zitat von: ares am 13 Februar 2017, 22:39:03
Wenn ich zwei Seiten mit je zwei gleichen Regex auswerten möchte um vier Readings zu erhalten müsste das wie folgt funktionieren, falls ich https://forum.fhem.de/index.php/topic,33765.0.html richtig umgesetzt habe.

Ich vermute aber ich habe einen Denkfehler und die zweite Seite wird doppelt abgerufen. Geht das auch anders?

define TEST HTTPMOD http://1.1.1.1/ 300
attr TEST reading1Name NAME1a
attr TEST reading1Regex SUCHE1
attr TEST reading1Name NAME1b
attr TEST reading2Regex SUCHE2

attr TEST get21Name NAME2a
attr TEST get21URL http://2.2.2.2/
attr TEST get21Poll 1
attr TEST get21Regex SUCHE1

attr TEST get22Name NAME2b
attr TEST get22URL http://2.2.2.2/
attr TEST get22Poll 1
attr TEST get22Regex SUCHE2


Danke
Manfred


Lies dir mal diesen Abschnitt in der Commandref genauer durch:
The regular expressions used will take the value that matches a capture group. This is the part of the regular expression inside (). In the above example "([\d\.]+)" refers to numerical digits or points between double quotation marks. Only the string consiting of digits and points will match inside (). This piece is assigned to the reading. You can also use regular expressions that have several capture groups which might be helpful when parsing tables. In this case an attribute like

    reading02Regex something[ \t]+([\d\.]+)[ \t]+([\d\.]+)

could match two numbers. When you specify only one reading02Name like

    reading02Name Temp

the name Temp will be used with the extension -1 and -2 thus giving a reading Temp-1 for the first number and Temp-2 for the second. You can also specify individual names for several readings that get parsed from one regular expression with several capture groups by defining attributes

    reading02-1Name
    reading02-2Name ...
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Danke @unimatrix, das war aber nur ein Kopierfehler beim Erstellen des einfachen Beispiels. Ich habe es oben ausgebessert, es sollte natürlich lauten;
attr TEST reading2Name NAME1b

@JoeALLb
Das hatte ich auch gelesen, jedoch vielleicht nicht richtig verstanden da ich nicht glaube, dass es mein Problem löst. reading02-1Name, reading02-2Name usw. möchte ich gar nicht, er soll nur jeweils das erste auslesen auch wenn es mehrere Treffer gibt.

Was ich eigentlich möchte ist in einem HTTPMOD Device mehrere Seiten einlesen. Die regular expressions sollen für jeweils eine Seite und nicht für alle Seiten gelten und dann Readings mit wählbarem Namen erzeugen.
Über reading02Regex werden jedoch alle Seiten durchsucht und mit get02Regex kann ich nur ein Regex pro Seite definieren und nicht mehrere. Vielleicht habe ich auch hier etwas nicht richtig verstanden und es geht doch?

JoeALLb

Zitat von: ares am 15 Februar 2017, 14:11:32
Danke @unimatrix, das war aber nur ein Kopierfehler beim Erstellen des einfachen Beispiels. Ich habe es oben ausgebessert, es sollte natürlich lauten;
attr TEST reading2Name NAME1b

@JoeALLb
Das hatte ich auch gelesen, jedoch vielleicht nicht richtig verstanden da ich nicht glaube, dass es mein Problem löst. reading02-1Name, reading02-2Name usw. möchte ich gar nicht, er soll nur jeweils das erste auslesen auch wenn es mehrere Treffer gibt.

Was ich eigentlich möchte ist in einem HTTPMOD Device mehrere Seiten einlesen. Die regular expressions sollen für jeweils eine Seite und nicht für alle Seiten gelten und dann Readings mit wählbarem Namen erzeugen.
Über reading02Regex werden jedoch alle Seiten durchsucht und mit get02Regex kann ich nur ein Regex pro Seite definieren und nicht mehrere. Vielleicht habe ich auch hier etwas nicht richtig verstanden und es geht doch?

mit reading02-2Name kannst du einen Namen für die zweite Regex-Gruppe vergeben.
Du machst also EINEN Regex pro Seite für jedes GET, und hast darin mehrere Gruppen.
Wie das Reading dann heißen soll definierst du in dem zuvor genannten Attribut(en).

Ich kenne jedoch dinen Wunsch... diesen habe ich beim Modulautor auch schon platziert.
Mein Lösungsvorschlag wäre zB, bei get21URL  eine Variable wie $get20URL angeben zu können, sodass
die Seite auch nur einmkal abgerufen werden muss.

Ich habe manche Hardware, die auf viele HTTP-Anfragen empfindlich reagiert. ;-)
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

@JoeALLb Danke für die Hilfe, aber mit einem Regex komme ich nicht klar. Ich dachte eher an etwas wie :
attr TEST get21URL http://2.2.2.2/
attr TEST get21 Poll 1
attr TEST get21_1Name NAME2a
attr TEST get21_1Regex SUCHE1
attr TEST get21_2Name NAME2b
attr TEST get21_2Regex SUCHE2

... oder die Möglichkeit "get21" im Regex abfragen zu können. Aber dank der unzähligen Möglichkeiten werde ich auch so eine für mich befriedigende Lösung finden.

unimatrix

Zitat von: ares am 15 Februar 2017, 19:39:02
@JoeALLb Danke für die Hilfe, aber mit einem Regex komme ich nicht klar. Ich dachte eher an etwas wie :
attr TEST get21URL http://2.2.2.2/
attr TEST get21 Poll 1
attr TEST get21_1Name NAME2a
attr TEST get21_1Regex SUCHE1
attr TEST get21_2Name NAME2b
attr TEST get21_2Regex SUCHE2

... oder die Möglichkeit "get21" im Regex abfragen zu können. Aber dank der unzähligen Möglichkeiten werde ich auch so eine für mich befriedigende Lösung finden.
Schreib doch mal das Beispiel dann finden wir vll. eine passende Regexp.

Gesendet von meinem P9000 mit Tapatalk


ares

Das Gateway, welches ich auslesen möchte, hat weit über hundert Werte verstreut auf vielen Seiten mit teilweise optionalem Inhalt und damit nicht vorhersehbarem Aufbau.

Ein Ausschnitt aus meinen aktuellen Tests:

define ISGweb HTTPMOD http://192.168.0.134/ 60
attr ISGweb reading01Name Start.Betriebsart
attr ISGweb reading01Regex aval39.[^=]+.[^=]+.[^=]+..([^"]+)
attr ISGweb reading01MaxAge 60
attr ISGweb reading01MaxAgeReplacement ISG offline
attr ISGweb reading01MaxAgeReplacementMode text

attr ISGweb get10Name ISGweb_10
attr ISGweb get10Poll 1
attr ISGweb get10URL http://192.168.0.134/?s=1,0
attr ISGweb reading1001Name Info.Anlage.Heizen.Vorlauftemperatur
attr ISGweb reading1001Regex VORLAUFTEMPERATUR[^0-9]+([0-9,]+)
attr ISGweb reading1002Name Info.Anlage.Heizen.Rücklauftemperatur
attr ISGweb reading1002Regex RÜCKLAUFTEMPERATUR[^0-9]+([0-9,]+)

attr ISGweb get20Name ISGweb_20
attr ISGweb get20Poll 1
attr ISGweb get20URL http://192.168.0.134/?s=2,0
attr ISGweb reading2001Name Diagnose.Status.Betriebsstatus.Schaltprogramm_aktiv
attr ISGweb reading2001Regex "key">SCHALTPROGRAMM AKTIV[^0-9]+([0-9\.])
attr ISGweb reading2001MaxAge 60
attr ISGweb reading2001MaxAgeReplacement 0
attr ISGweb reading2001MaxAgeReplacementMode text
attr ISGweb reading2002Name Diagnose.Status.Betriebsstatus.Verdichter
attr ISGweb reading2002Regex "key">VERDICHTER[^0-9]+([0-9\.])
attr ISGweb reading2002MaxAge 60
attr ISGweb reading2002MaxAgeReplacement 0
attr ISGweb reading2002MaxAgeReplacementMode text


Und eine Beispielseite: http://192.168.0.134/?s=2,0
(die Seiten im Menü haben dann leider nochmal Unterseiten, es sind also doch ein paar  :'( und keine Möglichkeit das irgendwie gesammelt als vernünftige Version abrufbar zu machen)
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
<title>STIEBEL ELTRON Reglersteuerung</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="imagetoolbar" content="no" />
<meta name="content-language" content="de" />
<meta name="robots" content="noindex,nofollow" />
<meta name="keywords" content="" />
<meta name="description" content="" />
 
  <link rel="shortcut icon" href="./pics/brlogo.ico">
  <!-- does not exist link rel="stylesheet" href="./css/netzwerk.css" type="text/css" media="all" /-->
  <link rel="stylesheet" type="text/css" href="./css/slider/ste_slider.css" />
<!-- Blueprint CSS framework -->
<link rel="stylesheet" href="./css/blueprint/screen.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="./css/blueprint/print.css" type="text/css" media="print" />
<!--[if lt IE 8]><link rel="stylesheet" href="./css/blueprint/ie.css" type="text/css" media="screen, projection" /><![endif]-->

<link rel="stylesheet" href="./css/layout.css" type="text/css" media="all" />
 
<link rel="stylesheet" href="./css/sifr.css" type="text/css" media="all" />
<link rel="stylesheet" href="./css/thickbox.css" type="text/css" media="all" />

<link rel="stylesheet" type="text/css" href="./css/jquery.jqplot.min.css" />

 
 
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/thickbox.js"></script>
<script type="text/javascript" src="./js/sifr.js"></script>
<script type="text/javascript" src="./js/sifr_sw.js"></script>
<script type="text/javascript" src="./js/scripts.js"></script>
  <script type="text/javascript" src="./js/json2.js"></script>
  <script type="text/javascript" src="./js/plugins/jquery-ui-1.8.6.custom.min.js"></script>
    <script type="text/javascript" src="./js/setDNS1.js"></script>

<!-- [if IE] -->
<script language="javascript" type="text/javascript" src="./js/excanvas.min.js"></script>
<!-- [endif] -->

<!-- for dateAxisRenderer.js -->
<script language="javascript" type="text/javascript" src="./js/plugins/Date.min.js"></script>
<!-- BEGIN: load jqplot -->
<script language="javascript" type="text/javascript" src="./js/jquery.jqplot.min.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/jqplot.dateAxisRenderer.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/jqplot.barRenderer.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/jqplot.categoryAxisRenderer.js"></script>
<!-- END: load jqplot -->
 
  <!-- BEGIN: load slider -->
<script language="javascript" type="text/javascript" src="./js/plugins/slider/jquery.ui.core.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/slider/jquery.ui.widget.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/slider/jquery.ui.mouse.js"></script>
<script language="javascript" type="text/javascript" src="./js/plugins/slider/jquery.ui.slider.js"></script>
<!-- END: load slider -->
 
   
  <!-- BEGIN: Uhrzeit -->
    <!-- END:  Uhrzeit -->
 
</head>
<body>
<div id="header">
<div class="head curdef">
<div id="meta">
<div id="login">
      Sie sind angemeldet als: <strong>...</strong>
        <form method="POST" name="logout" style="display:inline;margin-left:25px;">
          <input type="submit" alt="Logout" name="logout" value="Logout" class="logoutbutton"/>
        </form>
      </div>
</div>
    <div class="eingestelle_sprache"><strong><a href="?s=5,3" style="color:white">DEUTSCH</a></strong></div>
    <div id="Uhrzeit"></div>
<div class="title">
      <a href="." onclick="return checkChanges(this);" title="zur Startseite">
        <img src="./pics/title.png" alt="Servicewelt" />

      </a>
          </div>
<div class="logo"><a href="." onclick="return checkChanges(this);" title="zur Startseite" class="home_link">&nbsp;</a></div>
</div>
</div>


<div class="container" id="page">
  <div id="main" >
  <div id="SpacerFirefox"></div>
    <div id="nav">
      <div class="clear"></div>
            <div class="nav left defaultfirst">
        <div class="l left">&nbsp;</div>
        <div class="c left link1">
          <a onclick="return checkChanges(this);" href="?s=0">START</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
              </div>
            <div class="nav left default parent">
        <div class="l left">&nbsp;</div>
        <div class="c left link2">
          <a >INFO</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
                <div class="second">
          <ul class="second ">
                        <li>
              <a onclick="return checkChanges(this);" href="?s=1,0">ANLAGE</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=1,1">WÄRMEPUMPE</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=1,2">LIZENZBESTIMMUNGEN</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=1,3">BEDIENUNG UND INSTALLATION</a>
            </li>
                    </ul>
        </div>
              </div>
            <div class="nav left default parent">
        <div class="l left">&nbsp;</div>
        <div class="c left link3">
          <a >DIAGNOSE</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
                <div class="second">
          <ul class="second ">
                        <li>
              <a onclick="return checkChanges(this);" href="?s=2,0">STATUS</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=2,1">BUSTEILNEHMER</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=2,2">FEHLERLISTE</a>
            </li>
                    </ul>
        </div>
              </div>
            <div class="nav left default parent">
        <div class="l left">&nbsp;</div>
        <div class="c left link4">
          <a >PROGRAMME</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
                <div class="second">
          <ul class="second ">
                        <li>
              <a onclick="return checkChanges(this);" href="?s=3,0">HEIZPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,1">WARMWASSERPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,2">LÜFTERPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,3">PARTYPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,4">FERIENPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,5">TROCKENHEIZPROGRAMM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=3,6">GRUNDEINSTELLUNG</a>
            </li>
                    </ul>
        </div>
              </div>
            <div class="nav left default parent">
        <div class="l left">&nbsp;</div>
        <div class="c left link5">
          <a >EINSTELLUNGEN</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
                <div class="second">
          <ul class="second ">
                        <li>
              <a onclick="return checkChanges(this);" href="?s=4,0">HEIZEN</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,1">WARMWASSER</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,2">LÜFTEN</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,3">SOLAR</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,5">SOMMERBETRIEB</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,6">ZEIT/DATUM</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,7">INBETRIEBNAHME</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=4,8">FACHMANN</a>
            </li>
                    </ul>
        </div>
              </div>
            <div class="nav left defaultlast parent">
        <div class="l left">&nbsp;</div>
        <div class="c left link6">
          <a >PROFIL</a>
        </div>
        <div class="r left">&nbsp;</div>
        <div class="clear"></div>
                <div class="second">
          <ul class="second last">
                        <li>
              <a onclick="return checkChanges(this);" href="?s=5,0">Netzwerk</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=5,1">Sicherheit</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=5,2">Anlagenbild</a>
            </li>
                      <li>
              <a onclick="return checkChanges(this);" href="?s=5,3">SPRACHE</a>
            </li>
                    </ul>
        </div>
              </div>
            <div class="clear"></div>
    </div>
        <div id="sub_nav" class="span-24"><div class="left main sifr span-9" style="width: 45%">ANLAGE</div>
<div class="span-15 last">
</div>
<div class="clear"></div></div>
        <form id="werte" action="#" onsubmit="saveValues(this);return false;"><div id="content">
    <div class="span-11 append-1" style="float:left"><table class="info"><tr><th colspan="2" class="round-top">RAUMTEMPERATUR</th></tr>  <tr class="even">
    <td class="key">RAUMISTTEMP. HK1</td>
    <td class="value">21,1 °C</td>
  </tr>
  <tr class="odd">
    <td class="key">RAUMSOLLTEMP. HK1</td>
    <td class="value">21,1 °C</td>
  </tr>
  <tr class="even">
    <td class="key">RAUMFEUCHTE HK1</td>
    <td class="value">0,0 %</td>
  </tr>
  <tr class="odd">
    <td class="key">RAUMISTTEMP. HK2</td>
    <td class="value">21,5 °C</td>
  </tr>
  <tr class="even">
    <td class="key">RAUMSOLLTEMP. HK2</td>
    <td class="value">21,5 °C</td>
  </tr>
  <tr class="odd">
    <td class="key round-leftbottom">RAUMFEUCHTE HK2</td>
    <td class="value round-rightbottom">0,0 %</td>
  </tr>
</table></div><div class="span-11 prepend-1" style="float:right"><table class="info"><tr><th colspan="2" class="round-top">HEIZEN</th></tr>  <tr class="even">
    <td class="key">AUSSENTEMPERATUR</td>
    <td class="value">0,6 °C</td>
  </tr>
  <tr class="odd">
    <td class="key">ISTWERT HK1</td>
    <td class="value">32,3 °C</td>
  </tr>
  <tr class="even">
    <td class="key">SOLLWERT HK1</td>
    <td class="value">32,0 °C</td>
  </tr>
  <tr class="odd">
    <td class="key">ISTWERT HK2</td>
    <td class="value">31,2 °C</td>
  </tr>
  <tr class="even">
    <td class="key">SOLLWERT HK2</td>
    <td class="value">32,5 °C</td>
  </tr>
  <tr class="odd">
    <td class="key">VORLAUFTEMPERATUR</td>
    <td class="value">34,9 °C</td>
  </tr>
  <tr class="even">
    <td class="key round-leftbottom">RÜCKLAUFTEMPERATUR</td>
    <td class="value round-rightbottom">31,2 °C</td>
  </tr>
</table></div><div class="span-11 append-1" style="float:left"><table class="info"><tr><th colspan="2" class="round-top">WARMWASSER</th></tr>  <tr class="even">
    <td class="key">WW-ISTTEMP.</td>
    <td class="value">48,2 °C</td>
  </tr>
  <tr class="odd">
    <td class="key round-leftbottom">WW-SOLLTEMP.</td>
    <td class="value round-rightbottom">45,5 °C</td>
  </tr>
</table></div><div class="span-11 prepend-1" style="float:right"><table class="info"><tr><th colspan="2" class="round-top">LÜFTEN</th></tr>  <tr class="even">
    <td class="key">ZULUFT IST LÜFTERDREHZAHL</td>
    <td class="value">0 Hz</td>
  </tr>
  <tr class="odd">
    <td class="key">ZULUFT SOLL VOLUMENSTROM</td>
    <td class="value">0 m³/h</td>
  </tr>
  <tr class="even">
    <td class="key">ABLUFT IST LÜFTERDREHZAHL</td>
    <td class="value">0 Hz</td>
  </tr>
  <tr class="odd">
    <td class="key round-leftbottom">ABLUFT SOLL VOLUMENSTROM</td>
    <td class="value round-rightbottom">0 m³/h</td>
  </tr>
</table></div><div class="span-11 append-1" style="float:left"><table class="info"><tr><th colspan="2" class="round-top">WÄRMEERZEUGER</th></tr>  <tr class="even">
    <td class="key round-leftbottom">HEIZSTUFE</td>
    <td class="value round-rightbottom">2 </td>
  </tr>
</table></div><div class="span-24">&nbsp;</div>
    </div>  </form></div>
</div>
</div>
</div>
<div id="footer">
<!--[if IE]>
<style type="text/css">
#footer
{

height:260px;
}
#versionsNummer
{
position:relative;
top:-33px;
}
</style>

      <![endif]-->
<div class="span-24 last footer_middle curdef">

<div class="span-8 prepend-top" style="height:145px">
<div class="span-3">

<img src="./pics/ste_footer_website.png" />
</div>
<div class="span-5 last">
<p>

          Weitere Informationen zu unserem Produktprogramm und aktuelle Serviceangebote finden Sie unter <a href="http://www.stiebel-eltron.de" target="_blank" class="extern">www.stiebel-eltron.de</a>
</p>
</div>
</div>
 
    <div class="bordered span-1"></div>
<div class="span-6 prepend-top">
<div class="span-2">
  <img src="./pics/footer_tel.png" />
</div>
<div class="span-4 last">
<p>
Unsere Service-Hotline erreichen Sie unter<br /><span class="big">05531 702 90015</span>
</p>
</div>
  </div>
    <div class="bordered span-1"></div>
<div class="span-7 prepend-top last">
<p>
Das Neueste rund um die Servicewelt <br /><a href="http://www.stiebel-eltron.de/erneuerbare-energien/kundenservice/servicewelt/isg/" target="_blank" class="extern">servicewelt</a>
</p>
  </div>
   
</div>
  <div class="links span-23 prepend-top append-1 last footer_middle">
    <div class="span-17">
        <a class="intern" href="?s=1,2&arch=datenschutzerklaerung" onclick="return checkChanges(this);">Datenschutz</a>
      &nbsp;
      <p style="margin-top:8px" class="right" id="versionsNummer">v8.2.0</p>
    </div>
  <div class="copyright span-6 last curdef">
  &copy; STIEBEL ELTRON 2016
  </div>
  </div>
</div>

</body>
</html>


Und meine Frau hat auch schon die Visualisierung in smartVISU und Diagramme angefordert, also viel Fleißarbeit. Wenn die Regex also jeweils nur für eine Seite gelten würde das schneller für fhem, zuverlässiger in der Erkennung und übersichtlicher für mich sein.
Eventuell macht für die Übersichtlichkeit auch eine Trennung in 2 getrennte Device (Einstellungen und IST-Werte) Sinn. Ist dann eigentlich sichergestellt, dass die 2 Device nicht parallel die Seiten auslesen, da ich mir nicht sicher bin ob das Gateway damit umgehen kann.

Danke
Manfred

JoeALLb

Zitat von: ares am 15 Februar 2017, 20:29:17
Und meine Frau hat auch schon die Visualisierung in smartVISU und Diagramme angefordert, also viel Fleißarbeit. Wenn die Regex also jeweils nur für eine Seite gelten würde das schneller für fhem, zuverlässiger in der Erkennung und übersichtlicher für mich sein.
Eventuell macht für die Übersichtlichkeit auch eine Trennung in 2 getrennte Device (Einstellungen und IST-Werte) Sinn. Ist dann eigentlich sichergestellt, dass die 2 Device nicht parallel die Seiten auslesen, da ich mir nicht sicher bin ob das Gateway damit umgehen kann.

Und welche Werte möchtest Du nun aus diesem HTML in zwei readings rauslesen?
Du solltest uns vollständige Infos geben, damit wir dir helfen können!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Nicht 2 Readings, eher 2 Device mit jeweils 100 Readings.
Meine eigentliche Frage ist aber inzwischen geklärt - pro Get nur ein Regex. Hätte ja auch sein können, dass ich nur falsch gelesen habe und das doch irgendwie geht.

JoeALLb

Nachtrag:
Sowas wie dies würde RAUMSOLLTEMP. HK1 und RAUMSOLLTEMP. HK2
jeweils in ein Reading übernehmen...
Ist doch genau das, was du suchst, oder?

attr TEST get21URL http://2.2.2.2/XXXX
attr TEST get21 Poll 1
attr TEST get21Regex RAUMSOLLTEMP. HK1\p{Any}*?value">([\d,.]+)\p{Any}*?HK2\p{Any}*?value">([\d,.]+)
attr TEST get21_1Name SollHK1
attr TEST get21_2Name SollHK2


FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270