[gelöst] HTTPMOD und Werte aus einfacher Webseite?

Begonnen von gestein, 19 Oktober 2021, 16:49:38

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich wollte mich gerade in HTTPMOD einarbeiten (mit meinen bescheidenen Kenntnissen zu HTML) und scheitere leider daran, Werte auszulesen.
Die Seite, die ich gerne testweise laden möchte, ist die:
header: HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Connection: close, body length 2443
2021.10.19 16:41:03.403 5 : irblaster_Test: Read callback: body
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>
  <head>
    <meta name='viewport' content='width=device-width, initial-scale=.75' />
    <link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' />
    <style>@media (max-width: 991px) {.nav-pills>li {float: none; margin-left: 0; margin-top: 5px; text-align: center;}}</style>
    <title>IR Blaster 360 - v2.7.6e</title>
  </head>
  <body>
    <div class='container'>
      <h1><a href='https://forum.fhem.de/index.php/topic,72950.0.html'>IR Blaster 360 - v2.7.6e</a></h1>
      <div class='row'>
        <div class='col-md-12'>
          <ul class='nav nav-pills'>
            <li class='active'>
              <a href='http://IRBlaster.local:80'>Hostname <span class='badge'>IRBlaster.local:80</span></a></li>
            <li class='active'>
              <a href='http://192.168.0.108:80'>Local <span class='badge'>192.168.0.108:80</span></a></li>
            <li class='active'>
              <a href='#'>MAC <span class='badge'>8C:AA:B5:C5:F4:E6</span></a></li>
            <li class='active'>
              <a href='/config'>Config</a></li>
            <li class='active'>
              <a href='#'><span class='glyphicon glyphicon-signal'></span> -59 dBm</a></li>
          </ul>
        </div>
      </div><hr />
      <div class='row'>
        <div class='col-md-12'>
          <h3>Codes Transmitted</h3>
          <table class='table table-striped' style='table-layout: fixed;'>
            <thead><tr><th>Sent</th><th>Command</th><th>Type</th><th>Length</th><th>Address</th></tr></thead>
            <tbody>
              <tr><td colspan='5' class='text-center'><em>No codes sent</em></td></tr>            </tbody></table>
          </div></div>
      <div class='row'>
        <div class='col-md-12'>
          <h3>Codes Received</h3>
          <table class='table table-striped' style='table-layout: fixed;'>
            <thead><tr><th>Details</th><th>Command</th><th>Type</th><th>Length</th><th>Address</th></tr></thead>
            <tbody>
              <tr><td colspan='5' class='text-center'><em>No codes received</em></td></tr>            </tbody></table>
          </div></div>
      <div class='row'><div class='col-md-12'><em>29847s uptime since 07:23 19.10.2021</em></div></div>
    </div>
  </body>
</html>


Zum Testen würde ich gerne die Uptime auslesen und in ein Reading schreiben (am Besten nur die Anzahl der Sekunden).

Also flugs ein HTTPMOD-Device angelegt:
defmod irblaster_Test HTTPMOD http://192.168.0.108/ 3600
attr irblaster_Test enableControlSet 1
attr irblaster_Test enableCookies 1
attr irblaster_Test get1Name GetUpTime
attr irblaster_Test handleRedirects 1
attr irblaster_Test reading1Name uptime
attr irblaster_Test reading1Regex <em>\d*s uptime since \d{2}:\d{2} \d{2}.\d{2}.\d{4}


Aber alles was ich bekomme ist das folgende Reading:
uptime 1

Das log dazu sieht so aus:
2021.10.19 16:41:03.404 4 : irblaster_Test: BodyDecode is not decoding the response body (charset utf-8, bodyDecode defaults to none)
2021.10.19 16:41:03.404 5 : irblaster_Test: GetCookies is looking for Cookies
2021.10.19 16:41:03.404 5 : irblaster_Test: ExtractSid called, context get, num 1
2021.10.19 16:41:03.404 4 : irblaster_Test: checking for redirects, code=200, ignore=0
2021.10.19 16:41:03.404 4 : irblaster_Test: no redirects to handle
2021.10.19 16:41:03.405 5 : irblaster_Test: Read callback sets LAST_REQUEST to get1
2021.10.19 16:41:03.405 5 : irblaster_Test: CheckAuth decided no authentication required
2021.10.19 16:41:03.405 5 : irblaster_Test: ExtractReading for context get, num 1 - no individual parse definition
2021.10.19 16:41:03.405 5 : irblaster_Test: Read starts parsing response to get1 with defined readings: 1
2021.10.19 16:41:03.406 5 : irblaster_Test: ExtractReading uptime with regex /(?^:<em>\d*s uptime since \d{2}:\d{2} \d{2}.\d{2}.\d{4})/...
2021.10.19 16:41:03.406 5 : irblaster_Test: ExtractReading for reading1-1 sets uptime to 1
2021.10.19 16:41:03.406 5 : irblaster_Test: ExtractReading value as hex is 31
2021.10.19 16:41:03.406 4 : irblaster_Test: Read response matched 1, unmatch 0 Reading(s)
2021.10.19 16:41:03.407 5 : irblaster_Test: Read response to get1 matched uptime
2021-10-19 16:41:03.455 HTTPMOD irblaster_Test uptime: 1
2021.10.19 16:41:03.455 5 : irblaster_Test: HandleSendQueue called from ReadCallback, qlen = 0
2021.10.19 16:41:03.455 5 : irblaster_Test: HandleSendQueue found no usable entry in queue


HTTPMOD findet also meinen Suchstring (daher wahrscheinlich das "1").
Aber wie kriege ich die Werte in das Reading?

Danke im Voraus
lg, Gerhard

gestein

Anscheinend ist es wirklich so, das man durch die Beschreibung eines Problems selber zum Denken kommt.
Über die Stelle im Wiki habe ich mehrmals drübergelesen.
To tell HTTPMOD that the number is what you want to use for the reading, you have to put the expression in between ()

Die Klammern waren die Lösung.
Wenn man die regex so schreibt, klappt es:
reading1Regex <em>(\d*)s uptime since \d{2}:\d{2} \d{2}.\d{2}.\d{4}

Wahrscheinlich würde ein kürzer Suchstring auch reichen.
lg, Gerhard


TomLee

ZitatWahrscheinlich würde ein kürzer Suchstring auch reichen.

Schon, bin aber mit Sicherheit kein regexp Experte:

em.(\d+)

oder wie du, aber dann muss das s noch hinten mit ran

em>(\d*)s