[gelöst] HTTPMOD Regex Problem mit Leerzeichen im reading01OExpr

Begonnen von kroman, 03 November 2017, 18:25:26

Vorheriges Thema - Nächstes Thema

kroman

Hallo zusammen,

ich bekomme es trotz langem probieren nicht hin, deshalb erbitte ich schließlich Hilfe.

Ich habe folgenden HTTPMOD um mir den Goldkurs darzustellen:


defmod h_gold_unze HTTPMOD http://www.finanzen.at/rohstoffe/goldpreis/euro 3600
attr h_gold_unze userattr reading01Name reading01OExpr reading01Regex
attr h_gold_unze alias Gold [1 Unze]
attr h_gold_unze enableControlSet 1
attr h_gold_unze reading01Name gold_unze
attr h_gold_unze reading01Regex <th >(.*) <span>EUR</span></th>
attr h_gold_unze stateFormat gold_unze €


Funktioniert bestens, im STATE steht was ich sehen möchte:


Internals:
   BUSY       0
   DEF        http://www.finanzen.at/rohstoffe/goldpreis/euro 5
   Interval   5
   LASTSEND   1509729304.50495
   MainURL    http://www.finanzen.at/rohstoffe/goldpreis/euro
   ModuleVersion 3.4.0 - 9.9.2017
   NAME       h_gold_unze
   NR         193
   STATE      1 092,93 €
   TRIGGERTIME 1509729309.5038
   TRIGGERTIME_FMT 2017-11-03 18:15:09
   TYPE       HTTPMOD
   addr       http://www.finanzen.at:80
   buf
   code       200
   conn
   data
   displayurl http://www.finanzen.at/rohstoffe/goldpreis/euro
   header
   host       www.finanzen.at
   httpheader HTTP/1.1 200 OK


Ich bin einer von der genauen Sorte und deshalb stört mich das Leerzeichen zwischen 1 und 0 beim Wert welches ich durch folgendes Regex durch einen Punkt ersetzen wollte:


attr h_gold_unze reading01OExpr $val =~ s/\s/\./;; $val


Es ändert sich dadurch jedoch leider nix am STATE.
Wenn ich "\s" versuchsweise durch "1" ersetze sehe ich: . 09....
D.h. reading01OExpr funktioniert im Prinzip, nur wird das Leerzeichen nicht von \s erkannt.
\s sollte doch die richtige Wahl sein, oder?

Besten Dank im Voraus.

Gruß
kroman

helmut

Das liegt daran, dass vom Webserver kein Leerzeichen, sondern ein non-breaking space in UTF-8 geliefert wird.
Versuche es mal mit "attr h_gold_unze reading01OExpr $val =~ s/\xc2\xa0/./;; $val".

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

frank

einen hab ich noch:
attr h_gold_unze reading01OExpr $val =~ s/(.)(.)(.*)/$1.".".$3/;; $val
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

kroman

Zitat von: helmut am 03 November 2017, 19:50:48
Das liegt daran, dass vom Webserver kein Leerzeichen, sondern ein non-breaking space in UTF-8 geliefert wird.
Versuche es mal mit "attr h_gold_unze reading01OExpr $val =~ s/\xc2\xa0/./;; $val".

Vielen Dank Helmut, das wars!

Zitat von: frank am 03 November 2017, 22:43:02
einen hab ich noch:
attr h_gold_unze reading01OExpr $val =~ s/(.)(.)(.*)/$1.".".$3/;; $val

Leider nein Frank, da kommt dann sowas raus:


1.".".�094,10


Damit würde es passen:


$val =~ s/(.)(.)(.)(.*)/$1.$4/; $val


Außer dass das € Zeichen am Ende fehlt.
Warum funktioniert stateFormat hier nicht?

Damit bin ich dann also auch zufrieden:


$val =~ s/(.)(.)(.)(.*)/$1.$4 €/; $val


Doch ich werde Helmut's Lösung behalten, die schaut schöner aus  :)
Danke dennoch und schönes Wochenende an euch beide.

kroman

Sorry, das mit den stateFormat war Schwachsinn, ich hab an der falschen Stelle geschaut.
Das passt also auch:


$val =~ s/(.)(.)(.)(.*)/$1.$4/; $val

Christian72D

Klappt sein Setup noch?

Ich habe es vor zwei Stunden mal auf meinem Test System eingepflegt, ich bekomme keinen Wert geliefert.

joker4791

Hi,

geht nicht mehr, da die Seite von Tabelle auf Div-Tags umgestellt hat. Da müsste also die Regex angepasst werden...

Grüße,
j.

joker4791

Habe das nun mal wie folgt angepasst:
define h_gold_unze HTTPMOD http://www.finanzen.net/rohstoffe/goldpreis 600
attr h_gold_unze alias Gold [1 Unze]
attr h_gold_unze alignTime 00:00
attr h_gold_unze enableControlSet 1
attr h_gold_unze group Devisen
attr h_gold_unze reading01Format %.2f
attr h_gold_unze reading01Name gold_unze
attr h_gold_unze reading01OExpr $val =~ s/\xc2\xa0/./;;;; $val =~ s/\.//g;;;; $val =~ s/\,/\./g;;;; $val;;
attr h_gold_unze reading01Regex >(.*) <span>EUR</span>
attr h_gold_unze room HTTPMOD
attr h_gold_unze stateFormat gold_unze €

läuft so bei mir aktuell zuverlässig...