GELÖST!! HTTPMOD verwendet mit E2000

Begonnen von Tueftler1983, 15 Mai 2016, 19:41:40

Vorheriges Thema - Nächstes Thema

Tueftler1983

Hallo zusammen ich habe im Garten eine Pool Steuerung basierend auf E2000 mit einem AVR NET IO.
Jetzt würde ich gerne die Werte von Luft Temperatur, Wasser Temperatur und PH Wert über das Webinterface von E2000 abrufen
definiert habe ich es wie folgt:
define Pool HTTPMOD 192.168.2.91/p2? 60

In FHEM bekomme ich jetzt im buf vom Modul folgendes angezeigt:
HTTP/1.1 200 OK <html><head><title>E2000-NET-IO</title></head> <body text=white link=white alink=white vlink=white bgcolor=black><font face='Courier New'><h1>E2000-NET-IO</h1> <div style='float:left;margin:5px'><a href='p0'>POOL Pum</a></div> <div style='float:left;margin:5px'><a href='p1'>Pool Lic</a></div> <div style='background:#333;float:left;margin:5px'><a href='p2'>Temperat</a></div> <div style='float:left;margin:5px'><a href='p3'>Garten</a></div> <div style='float:left;margin:5px'><a href='p4'>Carport</a></div> <div style='float:left;margin:5px'><a href='p5'></a></div> <div style='float:left;margin:5px'><a href='s '>Status</a></div><table style='clear:both;width:400px'> <tr><td>Luft</td><td> 135</td></tr> <tr><td>Wasser</td><td> 170</td></tr> <tr><td>PH Anheb</td><td> 204</td></tr> <tr><td>???</td><td> 20</td></tr> <tr><td>PH in</td><td> 0</td></tr> </table><p>Created by <a href='http://elektronik2000.de/'>Elektronik2000.de</a></p> <meta http-equiv='refresh' content='3; URL=?'></font></body></html>

Wie bekomme ich jetzt
Luft 135 = 13,5°C
Wasser 170 = 17°C
Und PH Anheb 204 = 2

Ausgelesen sodass ich sie in FHEM anzeigen kann.
Wenn das mit der Komma Setzung nicht geht das würde ich auch in E2000 noch programmiert bekommen.

Bin dankbar für eure hilfe

ernst1024

indem du attribute definierst. Zb

reading1Name temperature

und dann ein regex definierst

reading1Regex Luft<\/td><td> ([\d]+)

das machst du für jedes reading. Am besten kopierst du den buffer und gehst auf: https://regex101.com/

dort kopierst du den bufferinhalt in das Feld Teststring. Mit meinem regex oben kannst du starten, kopier das in die obere Zeile. Das ist mal ein Anfang, jetzt siehst du schonmal was er findet und musst das regex entsprechend modifizieren dass er nur den Wert abgreift (da habe ich jetzt keine Lust zu :-) )
Gruß Ernst

Devender

#2
###Problem gelöst - siehe ganz unten ###

Salü zusammen,

ich hoffe der Threadersteller ist mir nicht böse, dass ich mich hier anhänge...

Ich habe ebenfalls heute angefangen mit HTTPMOD mir eine Webseitenabruf zu bauen.
Nach mehreren Stunden  :-X habe ich es auch geschafft, meine Information so zu lesen, mit Regex zu bearbeiten, dass ich genau das habe was ich brauche.

Hintergrund: Ich filtere mir gewisse Staumeldungen von einer Webseite aus und speichere diese im Reading. Hier als Beispiel für die Autobahn A3:

Meine Regex: (?s)text__copytext">A3(.*?)<\/p>

Das Ergebnis im Reading lautet dann: Frankfurt  - Würzburg im Bereich der Begrenzung befinden sich Personen auf der Fahrbahn.

Soweit so gut - alles perfekt. Jetzt kommt das ABER...

Ich wollte mir das Ganze Ergebnis nun vom Sonosplayer vorlesen lassen. Leider kann dieser mit dem " - " (Bindestrich) nichts anfangen. Der Vorlesevorgang wird schlicht und einfach abgebrochen.
Nach stundenlangem Suchen habe ich dann einen Befehl gefunden den ich in meinem at mit rein packen konnte.


Original war es so:

Temperatur { my $val = (ReadingsVal("$name", "Wassertemperatur", 0)); $val =~ s/,/\./g; return $val;}

ich habe mir dann nur das hier rausgezogen:
$val =~ s/ - / /g; return $val;;

Hier wird einfach der " - " durch ein Leerzeichen ersetzt

mein at
*18:10:00 {
            my $stau = "Die aktuellen Staumeldung von "
            . TimeNow()
            . ReadingsVal("Staumeldung","A3","") ;;
               fhem "set Staudummy $stau";
              $stau =~ s/ - / /g; return $stau;;
             fhem "set Staudummy2 $stau";
             fhem "set Sonosplayer Speak 50 de $stau";;
            }


Was passiert ist nun folgendes:
Das at wird korrekt ausgeführt, bis zu dem Punkt, wo das Ersetzen stattfindet.
Im Log sehe ich nichts ungewöhnliches - keine Fehler. Man sieht sogar, dass das Ersetzen durchgeführt wird.

2016.05.15 18:32:00 3: TESTWERT STAT, Die aktuellen Staumeldung von 2016-05-15 18:32:00
Frankfurt  - Würzburg im Bereich der Begrenzung befinden sich Personen auf der Fahrbahn.
##Kommentar von mir: Hier wird scheinbar der "-" entfernt. - Das Ergebnis kommt aber im Staudummy2 nicht an
2016.05.15 18:32:00 3: Staumelder: Die aktuellen Staumeldung von 2016 05 15 18:32:00
Frankfurt  Würzburg im Bereich der Begrenzung befinden sich Personen auf der Fahrbahn.
2016.05.15 18:32:00 5: redefine at command Staumelder as *18:32:00 {
            my $stau = "Die aktuellen Staumeldung von "
. TimeNow()
            . ReadingsVal("Staumeldung","A3","");;
            fhem "set Staudummy $stau";
{ Log 3, "TESTWERT STAT, $stau,";}
             $stau =~ s/-/ /g; return $stau;
{ Log 3, "TESTWERT VAL, $stau,";}
             fhem "set Staudummy2 $stau";
            }

Ebenfalls hab ich es schon mit einer Funktion in der 99_myUtils probiert. Bekomme allerdings das gleiche Bild zurückgeliefert. Es wird ersetzt aber das Ergebnis kommt nicht an.

Hat jemand eine Idee??

Danke und Grüße,
Dirk


####Edit##########

Problem gelöst:
mein at
*18:10:00 {
            my $stau = "Die aktuellen Staumeldung von "
            . TimeNow()
            . ReadingsVal("Staumeldung","A3","") ;;
               fhem "set Staudummy $stau";
              $stau =~ s/ - / /g; return $stau;;
             fhem "set Staudummy2 $stau";
             fhem "set Sonosplayer Speak 50 de $stau";;
            }


Es lag scheinbar an den "unsichtbaren" Zeilenumbrüchen die sich beim Einlesen in die Variablen gebildet haben.
Mit Hilfe von
$stau =~ tr{\n}{ };

hat sich das Problem gelöst.
FHEM 5.8 auf RasPi mit Jessy - CUL868, JeeLink Lacrosse
Komponenten: HM, IT, ELV, FB7390, FritzPL543,Sonos Play3
Mehrere Wandtablets sowie einen Smart Mirror
https://wiki.fhem.de/wiki/Anwesenheitserkennung#PRESENCE-Modul

Tueftler1983

Bin jetzt soweit das mir unter Readings "MATCHED_READING" Angezeigt wird. Aber den Wert sehe ich immer noch nicht.

Was fehlt denn noch?
Wenn ich erstmal einen hinbekomme schaffe ich den Rest auch.

ernst1024

Na, du hast das ja genau so genommen wie ich zuerst geschrieben habe. Das greift aber auch den Text usw.
Die Kunst ist das regex so zu verfeinern dass es nur den Wert hinter zb Luft greift.
Vielleicht hast du Glück und Frank schaut mal hier rein, der ist der regex Experte hier.
Gruß Ernst

frank

#5
ZitatBin jetzt soweit das mir unter Readings "MATCHED_READING" Angezeigt wird. Aber den Wert sehe ich immer noch nicht.
in deinem screenshot sehe ich kein matched_readings. wenn dort dein reading auftaucht, sollte auch das reading sichtbar werden.
besser ist, wenn du "list Pool" in die eingabezeile tipst und dann das ergebis in codetags postest.

edit: du hast die attribute nicht so benannt, wie ernst es dir empfohlen hat.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Tueftler1983

war nach einem wiki eintrag vorgegangen hier zwei screenshots

Einmal von regex101 und von Fhem
hoffe es hilft weiter

Achso ein list Pool habe ich auch gemacht
Internals:
   BUSY       0
   DEF        http://192.168.2.90/p2? 60
   Interval   60
   LASTSEND   1463407824.21779
   MainURL    http://192.168.2.90/p2?
   NAME       Pool
   NR         91
   STATE      Error evaluating Pool stateFormat: Can't find string terminator '"' anywhere before EOF at (eval 72948) line 1.

   TRIGGERTIME 1463407884.21497
   TRIGGERTIME_FMT 2016-05-16 16:11:24
   TYPE       HTTPMOD
   addr       http://192.168.2.90:80
   buf        HTTP/1.1 200 OK



<html><head><title>E2000-NET-IO</title></head>                                                              <body text=white link=white alink=white vlink=white bgcolor=black><font face='Courier New'><h1>E2000-NET-IO</h1>               <div style='float:left;margin:5px'><a href='p0'>POOL Pum</a></div>                                                             <div style='float:left;margin:5px'><a href='p1'>Pool Lic</a></div>                                                             <div style='background:#333;float:left;margin:5px'><a href='p2'>Temperat</a></div>                                             <div style='float:left;margin:5px'><a href='p3'>Garten</a></div>                                                               <div style='float:left;margin:5px'><a href='p4'>Carport</a></div>                                                              <div style='float:left;margin:5px'><a href='p5'></a></div>                                                                     <div style='float:left;margin:5px'><a href='s '>Status</a></div><table style='clear:both;width:400px'>                         <tr><td>Luft</td><td>   145</td></tr>                                                                                          <tr><td>Wasser</td><td>   170</td></tr>                                                                                        <tr><td>PH Anheb</td><td>   204</td></tr>                                                                                      <tr><td>???</td><td>    20</td></tr>                                                                                                                                                                                                                                                                                                                                                         <tr><td>PH in</td><td>     0</td></tr>                                                                                                                                                                                                                        </table><p>Created by <a href='http://elektronik2000.de/'>Elektronik2000.de</a></p>                                            <meta http-equiv='refresh' content='3; URL=?'></font></body></html>
   code       200
   conn
   data       {"get" :["Luft"]}
   displayurl http://192.168.2.90/p2?
   header
   host       192.168.2.90
   httpheader HTTP/1.1 200 OK
   httpversion 1.0
   hu_blocking 0
   hu_filecount 13
   ignoreredirects 0
   loglevel   4
   path       /p2?
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.2.90/p2?
   value      0
   QUEUE:
   Readings:
     2016-05-16 16:10:24   MATCHED_READINGS
   Request:
     data       {"get" :["Luft"]}
     header
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.2.90/p2?
     value      0
   Defptr:
     Readingbase:
       Luft       reading
       LuftTemperatur reading
       PH         reading
       WasserTemperatur reading
     Readingnum:
       Luft       01
       LuftTemperatur 1
       PH         3
       WasserTemperatur 2
   Sslargs:
Attributes:
   reading01Name Luft
   reading01Regex Luft<\/td><td> ([\d.]+)
   requestData {"get" :["Luft"]}
   showMatched 1
   stateFormat {sprintf("%.1f Grad, ReadingsVal($name,"Luft",0))}
   userattr   reading01Name reading01Regex requestData

ernst1024

genau, in dem regex siehst du ja was greift, unten blau unterlegt. Jetzt musst du halt deinem Namen Ehre machen und oben an dem Ausdruck solange tüfteln bis du nur die Zahl unterlegt hast.
Ich würde es dir sagen wenn ich es wüsste, aber ich müsste auch probieren einlesen usw
Gruß Ernst

Tueftler1983

Ich dachte rechts bei matches ist das was erkannt wird weil da bei matches ja nur 135 steht.
Hmm okay dann muss ich mal gucken wie das funktioniert.

Tueftler1983

Habe jetzt soviel probiert aber sobald ich hier: Luft<\/td><td> ([\d.]+)       was ändere findet regex.com nix mehr oder nur noch zahlen dann aber nicht mehr die Temperatur sondern die erste zahlenkombination im buffer

Tueftler1983

Hallo ich bin jetzt etwas weiter.
Ich bekomme jetzt unter readings Temperatur angezeigt allerdings ohne das ein wert dabei steht.

ernst1024

änder mal spaßeshalber in stateformat das '%.1f' in '%s' und schau was er dann ausgibt.

Das hier kannst du auch mal versuchen
(Wasser<\/td><td>) ([0-9]+)
Gruß Ernst

Tueftler1983

Hallo Ernst
Wenn ich das state Format ändere kommt statt 0.0 Grad nur 0 Grad
Mit:
(Wasser<\/td><td>) ([0-9]+)
Kommt nix, mit
(Wasser<\/td><td>) ([0-9]*)
Kommen 2 readings allerdings sehe ich da auch nirgendwo Werte

frank

was bringt denn folgendes:
(?s).*?Luft.*?([\d]+)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

ernst1024

Zitat von: Tueftler1983 am 16 Mai 2016, 23:33:52
Hallo Ernst
Wenn ich das state Format ändere kommt statt 0.0 Grad nur 0 Grad
Ah ok, war ein Versuch. Dachte evtl gibt es da ein Problem bei der Umwandlung string nach float, aber perl ist da wohl nicht so picky.

Tja, was soll ich sagen, weiter testen. Oder darauf hoffen dass einer der Experten hier dein Bemühen als solches anerkennt, ein Einsehen hat und dir den entscheidenden Tip gibt.

Oder du kopierst den buffer in einen Text Editor und speicherst das file z.B als pool.html ab und schaust dir das Ergebnis im Browser an. Ein bisschen viel schwarz für meinen Geschmack aber über denn kann man ja bekanntlich  .....
Gruß Ernst