HTTPMOD regex Verständnisproblem

Begonnen von abc2006, 27 Oktober 2017, 01:48:04

Vorheriges Thema - Nächstes Thema

abc2006

Hi,
ich habe HTTPMOD entdeckt und wollte damit den aktuellen Kurs von Bitcoins anzeigen.


http://bitcoin.de/de

die fragliche Stelle ist:

    <div class="col-md-6 text-center text-right-md fs12 lh2em">
        Aktueller Bitcoin Kurs:       
          <img alt="EUR" class="ticker_arrow mbm3 g90" src="/images/s.gif" />       
          <strong id="ticker_price">5.054,03 €</strong>
        <span class="c4">
        ( Stand 27.10.17 01:33 )
    </span>
    </div>
</div>


Könnte mir bitte jemand aufs Pferd helfen,
warum

id="ticker_price">(.*)<
einwandfrei funktioniert,
Fehler gefunden:
id="ticker_price">(.*)\s*€<

aber
\d\.\d\d\d.\d\d
und
\d\.\d\d\d,\d\d

hingegen nicht?

Alle drei Lösungen werden von https://regexr.com/ als gültig eingestuft... Ich blicks nicht...

Danke schonmal und Grüße,

Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

andies

Hast du mal hinten statt . ein Komma genommen? Ich finde Regex immer geheimnisvoll...


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

frank

ich hatte schon öfter probleme mit "leerzeichen".
manchmal sind es mehrere oder tabs oder ...
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

StefanStrobel

Die () darf man nicht vergessen. HTTPMOD nimmt immer den Inhalt der ersten Sub-Expression um den Wert des Readings festzulegen. Ohne Klammern keine Sub-Expression ...

Gruß
    Stefan

jostmario

Hallo,

hast du auch eine Idee wie ich den Wert zu verkaufende Bitcoins auslesen kann ?
https://www.bitcoin.de/de/btceur/market

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

abc2006

Hi,
die Bitcoins lese ich mit dem Regexp


id="ticker_price">(.*)<


aus.
Wenn du den Verkaufspreis brauchst, musst du wahrscheinlich weiter unten in der Seite suchen..
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

Hier,

versuchs mal so. Bei mir gehts:

id="rate_buy".*?>\s(.+?)\s*<

kann man gut mit
https://regexr.com/3hdrd


testen ...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

jostmario

Hallo,

ja Danke das ist das Regex für zu Kaufen für .... €    das ist auch nicht schlecht.
Kannst du noch das Regex für zu verkaufen und anzahl der zu verkaufenden Bitcoins generieren.
habe versucht aber bekomme das nicht hin sind irgendwie nur Hyroglyphen in dem Regex :-)
Die Blau umrandeten habe ich die Rot umrandeten fehlen mir noch im angehängten Bild.

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

abc2006

Zeig mal deine Versuche ...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

jostmario

Hallo,

naja habe nicht direkt versuche da ich mir mit den String Operatoren schwer tue was sie genau bedeuten.

habe das benötigte mal in die von dir vorgegeben seite eingetippt.

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

DeeSPe

Hatte das auch schon mal umgesetzt.

Damit funktioniert es ganz gut:
defmod Bitcoin HTTPMOD https://www.bitcoin.de/de/btceur/market 60
attr Bitcoin userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex
attr Bitcoin event-on-change-reading .+
attr Bitcoin reading01Name ticker_price
attr Bitcoin reading01Regex id="ticker_price">(.*).....<
attr Bitcoin reading02Name rate_buy
attr Bitcoin reading02Regex id="rate_buy" data-rate="(.*)">
attr Bitcoin reading03Name rate_sell
attr Bitcoin reading03Regex id="rate_sell" data-rate="(.*)">
attr Bitcoin reading04Name bitcoins
attr Bitcoin reading04Regex class="c1.fs16">\s+(\d+)......BTC
attr Bitcoin removeBuf 1
attr Bitcoin room HTTPMOD
attr Bitcoin stateFormat ticker_price €
attr Bitcoin userReadings rate:ticker_price.* {my $v = ReadingsVal($name,"ticker_price",0);; $v =~ s/\.//g;; $v =~ s/,/./;; $v},\
buy:rate_buy.* {my $v = ReadingsVal($name,"rate_buy",0);; $v =~ s/\,//g;; $v},\
sell:rate_sell.* {my $v = ReadingsVal($name,"rate_sell",0);; $v =~ s/\,//g;; $v}


Die userReadings sind nur da um die Daten für's Loggen richtig zu formatieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

abc2006

Zitatda ich mir mit den String Operatoren schwer tue was sie genau bedeuten

ist in diesem Beispiel gar nicht so schwer.
du tippst erstmal das ab, was *immer* gleich bleibt:

Zitatzu verkaufende Bitcoins:</span><br/> <strong class="c1 fs16"> 759&nbsp;BTC
dann überlegst du dir, welcher Teil sich ändern wird:
Zitatzu verkaufende Bitcoins:</span><br/> <strong class="c1 fs16"> 759&nbsp;BTC

und das ersetzt du durch einen operator, der dir genau eine oder mehrere Ziffern ermöglicht
Zitat\d+

Zitatzu verkaufende Bitcoins:</span><br/> <strong class="c1 fs16"> \d+&nbsp;BTC

schon gehts. Aber halt, was passiert, wenn mehr als 1000 Bitcoins zu verkaufen sind?
Ich weiss leider gerade nicht, ob dann, wie beim Preis, eine tausender-trennstelle eingefügt wird.
Also, fangen wir diesen Punkt auch noch ab:
a) beliebig viele Ziffern, auch "keine" : "\d*"
b) ein Punkt, oder auch kein Punkt ".?"
c) wieder ziffern, aber mindestens eine und maximal 3: "\d{1,3}"
ergibt

Zitatzu verkaufende Bitcoins:</span><br/> <strong class="c1 fs16"> \d*\.?\d{1,3}&nbsp;BTC

so, und damit die Zahl jetzt noch als Rückgabewert geliefert wird, müssen wir die Klammern um das setzen, was wir haben wollen:

Zitatzu verkaufende Bitcoins:</span><br/> <strong class="c1 fs16"> (\d*\.?\d{1,3})&nbsp;BTC


Ich bin bestimmt nicht der RegExp-Hero, aber so funktioniert es, und da das Einsatzgebiet nicht sonderlich groß und/oder variabel ist, sollte das auf längere Sicht passen...

Über Ideen und Kritik freu ich mich natürlich auch immer ;)

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

jostmario

Hey  Danke für deine aufwändige aufschlüsselung,
hab es jetzt hinbekommen.

mit dem Besipiel von dir und DeeSPe

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

abc2006

FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Schlimbo

Zur Info bitcoin.de hat auch eine API, hiermit sollte es doch
wesentlich einfacher sein, an die Daten zu kommen:

https://www.bitcoin.de/de/api/marketplace
ZitatDie Bitcoin.de API ermöglicht Ihnen den Zugriff auf die Übersicht der erfolgreich abgeschlossenen Trades (Tradehistory), der aktuellen Kauf- und Verkaufsangebote (Orderbook) und den aktuellen Bitcoin.de-Kurs (Rate).

Die API ist als JSON Webservice angelegt, bei dem alle Ressourcen über eine zentrale URL angesprochen werden. Die API ist ausschließlich über HTTPS und somit verschlüsselt erreichbar.

Der Zugriff auf die API ist auf max. 2 Abfragen je 60 Sekunden beschränkt. Tradehistory und Orderbook werden alle 60 Sekunden aktualisiert.

jostmario

Hallo,

Die API hab ich freigeschaltet bei Bitcoin.de leider fehlt mir das wissen das in fhem einzubinden.
Könnte ich damit nicht auch aus fhem heraus Bitcoin Kaufen ?

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

abc2006

ZitatKönnte ich damit nicht auch aus fhem heraus Bitcoin Kaufen ?
das .. klingt teuer...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Mickey

Hallo liebe Fhem`ler,

ich bin ja der "Paste and Copie" Michi.
Hat bis jetzt auch wunderbar geklappt.

Leider habe ich keinen Plan und weiss nicht warum im Beispiel von DeeSPe:


attr Bitcoin reading01Name ticker_price
attr Bitcoin reading01Regex id="ticker_price">(.*).....<

attr Bitcoin reading04Name bitcoins
attr Bitcoin reading04Regex class="c1.fs16">\s+(\d+)......BTC


die 2 readings bei mir nicht funktionieren.

Kann ein Experte bitte mal darüber sehen?

Ich wäre sehr dankbar

Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

abc2006

Weil Bitcoin.de die Seite verändert hat.
versuchs mit

id="ticker_price.*?">(.*)<


beim 04 kann ich so ad-hoc nicht weiterhelfen, da musst du mal in den Quellcode der Bitcoin-Seite schauen.

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Mickey

WOW --> 1000 mal danke Stephan,

das ging echt super und hat sofort geklappt.
Bin dir sehr dankbar, danke!

Zitat
ticker_price
28.700,51 €

Vielleicht hat ja jemand eine Idee zu 04?
Ich tue mich mit lesen etwas schwer, sorry ist aber so.

Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

abc2006

FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Mickey

abc2006, ich kann nur vermuten
Die Bitcoins die er gekauft hat?

attr Bitcoin reading04Name bitcoins
attr Bitcoin reading04Regex class="c1.fs16">\s+(\d+)......BTC


Ich vermute mal, es ist gar nicht so wichtig.

Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

Mickey

Stephan, kannst du mir bitte noch eine Gefallen tun, mal über das userReading sehen?

rate:ticker_price.* {my $v = ReadingsVal($name,"ticker_price",0); $v =~ s/\.//g; $v =~ s/,/./; $v},\ buy:rate_buy.* {my $v = ReadingsVal($name,"rate_buy",0); $v =~ s/\,//g; $v},\ sell:rate_sell.* {my $v = ReadingsVal($name,"rate_sell",0); $v =~ s/\,//g; $v}

Da kommt nur das Reading "rate" (rate:ticker_price.*)

Sorry, wenn ich dich stresse aber ich checke es leider nicht.

Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

Mickey

Upsi, da waren nur 2 / zu viel - jetzt klappt es.
Für meine Augen zu viel  :-[

DANKE dir Stephan.
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael