Hauptmenü

HTTPMOD Kryptokurse

Begonnen von Volumeman, 08 März 2018, 17:38:51

Vorheriges Thema - Nächstes Thema

Volumeman

Hallo Leute,

um die Bitcoin und Etheriumkurse auch unter TabletUI anzuzeigen möchte ich gerne das Modul HTTPMOD verwenden...


defmod Kryptokurse HTTPMOD https://bitinfocharts.com/de/markets/#USD 10
attr Kryptokurse userattr reading01Name reading01Regex reading02Name reading02Regex
attr Kryptokurse reading01Name BitcoinKursinDollar
attr Kryptokurse reading01Regex <td data-val="(.{4,6})"
attr Kryptokurse reading02Name BitcoinKursinProzent
attr Kryptokurse reading02Regex <span class="text-error"><b>[+-][0-9]{1,2}.[0-9]{1,2}\%\<\/b> \(\$[0-9]{1,4}\) in 12std<\/span><br>

setstate Kryptokurse 2018-02-12 15:57:34 Bitcoin 1
setstate Kryptokurse 2018-03-08 17:33:05 BitcoinKursinDollar 9861
setstate Kryptokurse 2018-03-08 14:45:03 BitcoinKursinProzent 1
setstate Kryptokurse 2018-02-22 14:38:31 Prozent24 1


wie man sieht, wird für den BitcoinKursinDollar auch der korrekte Wert der Seite angezeigt, aber den zweiten Teil mit der Prozentzahl und dem Wert in 12 Std,
(geschweige denn Wert in % und den Wert in 7 Tage, das habe ich noch garnicht weiter probiert) klappt überhaupt nicht.

Könnte Sie das mal jemand nachbauen oder ansehen? Wenn ich den Regex auf einer OnlineRegex-Testerseite "prüfen" klappt es wunderbar. Ich bekomme den String den ich erwarte...

Letztlich wären für mich Interessant:
1x der Prozentsatz 12 Stunden
1x der Wert der dahinter in den ( ) folgt
1x der Prozentsatz 7 Tage
1x der Wert der dahinter in den ( ) folgt

Analog das selbe dann auch für Etherium...

Sicherlich kann mir hier der ein oder andere entscheidende Tipp gegeben werden?!

Danke schon mal im voraus, für die Hilfe!

helmut

Zitat von: Volumeman am 08 März 2018, 17:38:51
Wenn ich den Regex auf einer OnlineRegex-Testerseite "prüfen" klappt es wunderbar. Ich bekomme den String den ich erwarte...

Das war die Tage schon mal Thema. Offensichtlich nimmt es diese Testerseite mindestens mit den Leerzeichen nicht so genau.
Verlassen kannst Du Dich auf die offizielle Doku:
https://perldoc.perl.org/perlre.html
Da steht unter anderem: "\s means the five characters [ \f\n\r\t]", also Space, From Feed, Newline, Carriage Return und Tabulator.

Also habe ich mal den Prozentsatz und die absolute Differenz ausgelesen:
attr Kryptokurse reading02Regex \<span\sclass="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)
attr Kryptokurse reading02Regex \<span\sclass="text-error"\>\<b\>[+-][0-9]{1,2}.[0-9]{1,2}%\</b\>\s\((\$[0-9]{1,4})


Auch die Abfrage des Dollarkurses mit dem frei erfundenen td-Attribut "data-val" habe ich geandert, so dass der Wert nicht
mehr _ganz_ so zufaellig ermittelt wird.
attr Kryptokurse reading01Regex \<td\sdata-val="([0-9]{1,6})"

Den Treffer wirklich eindeutig zu machen, ist naemlich bei dieser Art Seiten das Problem. So kommt allein
"<span class="text-error">" 298 mal vor, "<td data-val=" gleich 300 mal.

Ich wuerde das so aehnlich versuchen:
attr Kryptokurse reading01Regex Bitcoin.*?\<td\sdata-val="([0-9]{1,6})"

Viel Spass mit den regular expressions ;-)

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

helmut

Zitat von: helmut am 08 März 2018, 20:57:27
Offensichtlich nimmt es diese Testerseite mindestens mit den Leerzeichen nicht so genau.

Sorry, das war Unsinn. So spaet sollte ich keine Fragen mehr beantworten. Das Leerzeichen
wird beim parsen des Attributes wohl als Trenner gewertet - wenn es nicht maskiert wird.
Das "\s" funktioniert, trifft aber auch andere Zeichen. Die Maskierung des Leerzeichens mit
dem Backslash ...
attr Kryptokurse reading02Regex \<span\ class="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)

... oder das Schreiben als eigene Zeichenklasse  "[ ]" funktionieren auch:
attr Kryptokurse reading02Regex \<span[ ]class="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)

Wenn Du das Ganze performanter machen willst, kannst Du mit einem Reading gleich mehrere
Werte auslesen.
attr Kryptokurse reading01Regex Bitcoin.*?\<td\sdata-val="([0-9]{1,6})".*?class="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)\</b\>\ \((\$[0-9]{1,4})

Der Name des Readings wird im Ergebnis durchnummeriert:
   READINGS:
     2018-03-09 13:13:43   BitcoinKursinDollar-1 9015
     2018-03-09 13:13:43   BitcoinKursinDollar-2 -4.27%
     2018-03-09 13:13:43   BitcoinKursinDollar-3 $402
     2018-03-09 13:13:43   BitcoinKursinProzent -4.27%


Siehe dazu auch die Commandref oder im Wiki
https://wiki.fhem.de/wiki/HTTPMOD#Some_help_with_Regular_Expressions

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

Volumeman

#3
Hallo Helmut,

vielen Dank für deine bisherige Hilfe!

Leider bekomme ich wenn ich dein letztes attr nutze den $-Wert nur einstellig?!


defmod Kryptokurse HTTPMOD https://bitinfocharts.com/de/markets/#USD 10
attr Kryptokurse userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex
attr Kryptokurse reading01Name BitcoinKursinDollar
attr Kryptokurse reading01Regex Bitcoin.*?\<td\sdata-val="([0-9]{1,6})".*?class="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)\</b\>\ \((\$[0-9]{1,4})

setstate Kryptokurse 2018-03-09 17:08:03 BitcoinKursinDollar-1 8995
setstate Kryptokurse 2018-03-09 17:08:03 BitcoinKursinDollar-2 -17.29%
setstate Kryptokurse 2018-03-09 17:08:03 BitcoinKursinDollar-3 $1


RegExe können ja sehr hilfreich sein, sind aber massig kompliziert...

EDIT: habe noch was hinzugefügt zur Regex... nämlich das ",." und aus 4 eine 5 gemacht in der letzten Gruppe... jetzt bekomme ich den voll Wert angezeigt...


defmod Kryptokurse HTTPMOD https://bitinfocharts.com/de/markets/#USD 10
attr Kryptokurse userhttp://192.168.2.64:8083/fhem?detail=Kryptokurseattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex
attr Kryptokurse reading01Name BitcoinKursinDollar
attr Kryptokurse reading01Regex Bitcoin.*?\<td\sdata-val="([0-9]{1,6})".*?class="text-error"\>\<b\>([+-][0-9]{1,2}.[0-9]{1,2}%)\</b\>\ \((\$[.,0-9]{1,5})

setstate Kryptokurse 2018-03-09 17:13:43 BitcoinKursinDollar-1 9013
setstate Kryptokurse 2018-03-09 17:13:43 BitcoinKursinDollar-2 -17.09%
setstate Kryptokurse 2018-03-09 17:13:43 BitcoinKursinDollar-3 $1,858


Leider ist hier nur der 7t Wert jetzt ale Prozensatz und $-Wert... wie kriege ich es auch zusätzlich für den 12std. Prozent-Wert und $-Wert hin?
9,013 USD
+1.71% ($151) in 12std
-17.09% ($1,858) in 7t

kann man sich denn irgendwie anzeigen lassen, wie httpmod sich die Seite "runterlädt"? also quasi eine Sicht wie httpmod die Seite interpretiert? So ein Quellcode aus z.B. einem Firefox scheint doch irgendwie abzuweichen...

helmut

Zitat von: Volumeman am 09 März 2018, 17:11:03
RegExe können ja sehr hilfreich sein, sind aber massig kompliziert...
EDIT: habe noch was hinzugefügt zur Regex... nämlich das ",." und aus 4 eine 5 gemacht in der letzten Gruppe... jetzt bekomme ich den voll Wert angezeigt...

Die sind ausgesprochen hilfreich, sehr maechtig und genau deswegen leider auch sehr kompliziert.

Es ist durchaus moeglich, dass Du an der einen oder anderen Stelle noch nachbessern musst. An
alle moeglichen Werte habe ich nicht gedacht.

Wichtig ist, dass Du verstehst, was Du machst und Dich langsam vorarbeitest. Den vi habe ich,
aehnlich wie regex, anfangs gehasst; heute beherrsche ich vielleicht zehn Prozent seiner
Moeglichkeiten und will ihn nicht mehr missen. Wie es aussieht, bist Du mit den regex auf einem
gleich guten Weg.

Zitat von: Volumeman am 09 März 2018, 17:11:03
Leider ist hier nur der 7t Wert jetzt ale Prozensatz und $-Wert... wie kriege ich es auch zusätzlich für den 12std. Prozent-Wert und $-Wert hin?

Wie ich schon sagte, Du wirst sicher noch das eine oder andere Mal nachbessern muessen. Seit heute
Mittag hat(te) sich der Kurs des Bitcoin in der 12 Stunden-Betrachtung vom Negativen ins Positive
veraendert. Weil die Seitenbetreiber das entweder rot oder gruen darstellen, veraendern sie die CSS-
Klasse von "text-error" zu "text-success". Hier die um einige "\" entruempelte und mit zwei weiteren
Capture Groups versehene regex:
attr Kryptokurse reading01Regex Bitcoin.*?<td\ data-val="([0-9]{1,})".*?class="text-[a-z]{1,}"><b>([+-][0-9]{1,}.[0-9]{1,}%)</b>\ \((\$[.,0-9]{1,})\).*?class="text-[a-z]{1,}"><b>([+-][0-9]{1,}.[0-9]{1,}%)</b>\ \((\$[.,0-9]{1,})\)

Im Ergebnis ist das:
   READINGS:
     2018-03-09 20:41:33   BitcoinKursinDollar-1 8742
     2018-03-09 20:41:33   BitcoinKursinDollar-2 -0.79%
     2018-03-09 20:41:33   BitcoinKursinDollar-3 $69.8
     2018-03-09 20:41:33   BitcoinKursinDollar-4 -19.79%
     2018-03-09 20:41:33   BitcoinKursinDollar-5 $2,157


Zitat von: Volumeman am 09 März 2018, 17:11:03
kann man sich denn irgendwie anzeigen lassen, wie httpmod sich die Seite "runterlädt"? also quasi eine Sicht wie httpmod die Seite interpretiert? So ein Quellcode aus z.B. einem Firefox scheint doch irgendwie abzuweichen...
Das mache ich indem ich ich die Seite im Firefox mit "File/Save Page as" speichere und mit dem
oben erwaehnten vi ansehe. Etwas anderes bekommt HTTPMOD auch nicht zu sehen. Der Versuch,
den Einzeiler in der Page Source des Firefox zu analysieren, kann ausgesprochen anstrengend
werden ;-)

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