Hauptmenü

Umgang mit der HTTPMOD

Begonnen von Murki, 03 März 2017, 01:37:12

Vorheriges Thema - Nächstes Thema

Murki

Hallo
Ich versuche im Moment die Arbeitsweise mit der FHEM anzueignen und zu verstehen wie der Server funktioniert. Im Moment versuche ich den Funktion HTTPMOD zu verstehen. Als Übung habe ich versucht die im Forum vorhandene Übung zu machen, wo man den Spritpreis abholt und für sich weiterarbeitet. Also ich kann das Wert jetzt Loggen und in einem Diagramm den Sprit preisverlauf zeichnen.

Das gleiche Versuche ich jetzt seit paar Tagen mit Wechselkurs (z.B. Euro/TL). Aber irgendwie klappt es nicht den Wert verlauf zu Grafisch darzustellen. (Vermutlich ist der Wert den ich habe ein String und kein Zahl). Wie kann ich dieses Problem lösen, das ich den Wert grafisch darstellen kann?

Den Wert hole ich von der Seite ( http://www.onvista.de:80) und ich habe zwei Ansetze wie ich den Wert hole;

1-)Wechselkurs = <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (.*?) TRY <\/output> 
Das Ergebnis ist z.B. 3,9133

2-) String =  <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (.*?),(.*?) TRY <\/output>
Das Ergebnis hier ist so;
readingsRegex_String-1=3
readingsRegex_String-2=9133

(hier habe ich versucht die beiden Werte zu mit Punkt zu Verketten und dann in Float umzuwandeln, leider ohne Erfolg)

Könnt Ihr mir bitte bei dieser Problem helfen, so dass ich verstehe was machen muss damit ich die Werte grafisch darstellen kann?


Gruß
Murat

Thorsten Pferdekaemper

Hi,
mach mal ein "list" von Deinem HTTPMOD-Device und stell das hier rein. ...bitte in code-Tags.
Gruß,
   Thorsten
FUIP

Murki

#2
Hallo,
Hier ist die "List" von meiner HTTPMOD

Internals:
   BUSY       0
   DEF        http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY 600
   Interval   600
   LASTSEND   1488579805.26602
   MainURL    http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY
   ModuleVersion 3.3.5 - 29.9.2016
   NAME       OUT.Lira_01
   NR         45
   STATE      1.00€= 3,9318 YTL;

1.00€= Lira YTL;
   TRIGGERTIME 1488580405.26512
   TRIGGERTIME_FMT 2017-03-03 23:33:25
   TYPE       HTTPMOD
   addr       http://www.onvista.de:80
   buf        HTTP/1.1 200 OK

Server: nginx

Date: Fri, 03 Mar 2017 22:23:25 GMT

Content-Type: text/html; charset=UTF-8

Connection: close

Vary: Accept-Encoding

Expires: Fri, 03 Mar 2017 22:23:34 GMT

Cache-Control: private,max-age=60,s-maxage=60,must-revalidate

X-Varnish: 1364275417 1364267995

Age: 49

Via: 1.1 varnish

X-Cache: HIT

X-UA-Compatible: IE=Edge
   code       200
   conn
   data
   displayurl http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY
   header
   host       www.onvista.de
   httpheader HTTP/1.1 200 OK

Server: nginx

Date: Fri, 03 Mar 2017 22:23:25 GMT

Content-Type: text/html; charset=UTF-8

Connection: close

Vary: Accept-Encoding

Expires: Fri, 03 Mar 2017 22:23:34 GMT

Cache-Control: private,max-age=60,s-maxage=60,must-revalidate

X-Varnish: 1364275417 1364267995

Age: 49

Via: 1.1 varnish

X-Cache: HIT

X-UA-Compatible: IE=Edge
   httpversion 1.0
   hu_blocking 0
   hu_filecount 82
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /devisen/Euro-Tuerkische-Lira-EUR-TRY
   protocol   http
   redirects  0
   timeout    2
   url        http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY
   value      0
   QUEUE:
   Readings:
     2017-03-03 23:23:25   String-1        3
     2017-03-03 23:23:25   String-2        9318
     2017-03-03 23:23:25   Wechselkurs     3,9318
     2017-03-01 23:16:34   readingsRegex_String-1 3
     2017-03-01 23:16:34   readingsRegex_String-2 8514
   Request:
     data
     header
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY
     value      0
   Defptr:
     Readingbase:
       String-1   reading
       String-2   reading
       Wechselkurs reading
     Readingnum:
       String-1   _String
       String-2   _String
       Wechselkurs _Wechselkurs
     Readingoutdated:
     Readingsubnum:
       String-1   -1
       String-2   -2
     Requestreadings:
       Update:
         String-1   reading _String-1
         String-2   reading _String-2
         Wechselkurs reading _Wechselkurs
   Sslargs:
Attributes:
   readingsName_Lira Lira
   readingsName_String String
   readingsName_Wechselkurs Wechselkurs
   readingsRegex_Lira {readingsRegex_String-1 . readingsRegex_String-2;}
   readingsRegex_String <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (.*?),(.*?) TRY <\/output>
   readingsRegex_Wechselkurs <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (.*?) TRY <\/output>
   room       Draussen
   stateFormat 1.00€= Wechselkurs YTL;

1.00€= Lira YTL;
   userattr   readingsName_Lira readingsName_String readingsName_Wechselkurs readingsRegex_Lira readingsRegex_String readingsRegex_Wechselkurs


Ich habe bewusst den Buffer nicht mit in Code rein kopiert.

Gruß
Murat

viegener

Vielleicht kenne ich nicht alle Möglichkeiten von HTTPMod, aber meines Wissens nach haben die Attribute bei HTTPMod Ziffern im Namen und nicht freigewählte Namen (Stichwort Lira).

Unabhängig davon wäre vermutlich erstmal folgender Regexp geeignet den ganzen Wert auf einmal zu lesen:


reading01Name Lira
reading01Regex <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (\d+,\d+) TRY <\/output>


Damit werden nur Ziffern und nicht beliebige Zeichen verwendet und alles in einen Wert gepackt

Damit müsste etwas wie z.B. 3,9318 im Reading auftauchen

Im zweiten Schritt muss dann noch das Koma durch einen Punkt ersetzt werden:

reading01OExpr $val =~ s/^(.*),(.*)$/$1.$2/r

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Murki

#4
Hallo,
ich habe für mich die Lösungen jetzt gefunden. Danke an Viegener der mich auf die richtige Wegleitete.

Da jedermal auf den Schlauch stehen kann, stelle ich mal meine Lösungen vor:

Für mich sollte dies zur Übung und Verständnis des HTTPMOD Moduls dienen. Deshalb habe ich es über zwei Wege versucht.

Ich habe mit Hilfe zwei verschiedene ReadingsRegex Attribute, zwei verschiedene Variable geholt:

A-) X-Variabel = 1,234

B-) Y-Variabel-1 =1 & Y-Variabel-2= 234

Ich wollte diese Variabeln grafisch darstellen was leider nicht so funktionierte. Der Variabel war ein Zeichenkette, also keine Zahl (Wegen der Komma vermute ich)  oder der Variabel bestand aus zwei Teilen. 


X { my $val = (ReadingsVal($name,"X-Variabel ",0)); $val =~ s /,/\./g; return $val; },
Y { my $Wert = (ReadingsVal($name,"Y-Variabel-1",0)).'.'.(ReadingsVal($name,"Y-Variabel-2",0));return $Wert;}


Was in vielen Beiträgen im Forum mir aufgefallen ist das $name in Anführungszeichenstand, oder beim ersten Version das "s" der Ersetzfunktion" rechts und links keine Leerzeichen hatte, dies führte bei mir dazu, daß die Zeichenkette nicht in Zahl umgewandelt wurde.

Übrigens das Ergebnis ist:
X=Y=1.234

Aktuell habe ich diese "Konfigurationen" für diese Aufgabe getestet:
Seite von dem ich die Information hole:
define OUT.Dollar_01 HTTPMOD http://www.onvista.de/devisen/Euro-Tuerkische-Lira-EUR-TRY 600

Beispiel X:
attr OUT.Lira_01 readingsName_Wechselkurs Wechselkurs
attr OUT.Lira_01 readingsRegex_Wechselkurs <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (.*?) TRY <\/output>
attr OUT.Lira_01 userReadings Lira_98 { my $val = (ReadingsVal($name,"Wechselkurs",0)); $val =~ s /,/\./g; return $val; }


Beispiel Y:
attr OUT.Lira_01 readingsName_Lira Lira
attr OUT.Lira_01 readingsRegex_Lira <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (\d+),(\d+) TRY <\/output>
attr OUT.Lira_01 userReadings Lira_99 Lira_99 { my $Wert = (ReadingsVal($name,"Lira-1",0)).'.'.(ReadingsVal($name,"Lira-2",0));return $Wert;}


Beispiel viegener:
attr OUT.Lira_01 reading01Name Test
attr OUT.Lira_01 reading01Regex <output id="current" for="quickSearchCurrencyFrom quickSearchCurrencyTo volume" class="WECHSELKURS"> (\d+,\d+) TRY <\/output>
attr OUT.Lira_01 reading01 Expr $val =~ s/^(.*),(.*)$/$1.$2/r


das Ergebniss:
attr OUT.Lira_01 stateFormat 1.00€= Wechselkurs YTL<br>1.00€= Lira_98 YTL<br>1.00€= Lira_99 YTL<br>1.00€= Test YTL

Gruß
Murat

viegener

Zitat von: Murki am 07 März 2017, 01:33:00
Der Variabel war in String, also keine Zahl und der Variabel bestand aus zwei Teilen.
...
Was in vielen Beiträgen im Forum falsch war, oder mir aufgefallen ist das $name in Anführungszeichenstand, oder beim ersten Version das "s" der Ersetzfunktion" rechts und links keine Leerzeichen hatte.

Übrigens das Ergebniss ist:
X=Y=1.234


Das ist so nicht richtig:
- $name darf in Anführungsstrichen stehen das macht kein Problem (solange es doppelte sind) - das ist völlig korrekt
- Ein Leerzeichen um das s muss nicht sein (und ich musste erstmal ausprobieren ob das überhaupt mit Leerzeichen funktioniert)
- Eine Zahl in einem String kann in perl auch als Zahl berwendet werden, es muss aber eben wirklich eine Zahl sein (und 1,234 ist keine)

Bitte nicht zur Verwirrung durch falsche Hinweise zur Syntax beitragen.

Was ich zu Deiner Lösung nicht verstehe sind 2 Dinge:
- Hast Du den von mir vorgeschlagenen Weg ausprobiert und hat er funktioniert?
- Wo kommt Dein Code zum Einsatz (userreadings) ?

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Murki

Hallo Viegener,

Ich habe meine mein Beitrag oben erweitert. Jetzt kann man es besser nachvollziehen glaube ich, was ich gemacht habe.

Die Ursprüngliche Gerüst hatte ich bei einem Beitrag geholt, wo es um die Benzin preise ging. Er hatte schon die Attribute mit Namen verwendet.

Bei mir war das einzige Problem, daß ich die "Zeichenkette" nicht in Zahl umgewandelt gekriegt habe. Deshalb wollte ich nicht einfach komplett alles aufgeben und ein anderes Konzept versuchen.

Dein Beitrag hat mir geholfen, weil ich gesehen habe das ich die richtige Funktion gewählt habe. Ich musste "nur" noch Fehler suche machen. Deshalb habe ich im ersten Moment nicht die Komplette Funktion übernommen (man will ja was lernen).

Übrigens die Lösung, den Du vorgeschlagen hast, ist ja wirklich toll. Es ist viel einfacher und übersichtlicher als das von mir jetzt zusammengeschusterte. Danke Dir.

PS: Wegen der $name und der Funktion "s" habe ich meine Satz korrigiert, ich weises nicht warum es bei mir gesponnen hat, aber es war so. Ich hoffe, dass es für Dich so ok ist.

viegener

Zitat von: Murki am 08 März 2017, 03:08:19
Hallo Viegener,

Ich habe meine mein Beitrag oben erweitert. Jetzt kann man es besser nachvollziehen glaube ich, was ich gemacht habe.

Die Ursprüngliche Gerüst hatte ich bei einem Beitrag geholt, wo es um die Benzin preise ging. Er hatte schon die Attribute mit Namen verwendet.

Bei mir war das einzige Problem, daß ich die "Zeichenkette" nicht in Zahl umgewandelt gekriegt habe. Deshalb wollte ich nicht einfach komplett alles aufgeben und ein anderes Konzept versuchen.

Dein Beitrag hat mir geholfen, weil ich gesehen habe das ich die richtige Funktion gewählt habe. Ich musste "nur" noch Fehler suche machen. Deshalb habe ich im ersten Moment nicht die Komplette Funktion übernommen (man will ja was lernen).

Übrigens die Lösung, den Du vorgeschlagen hast, ist ja wirklich toll. Es ist viel einfacher und übersichtlicher als das von mir jetzt zusammengeschusterte. Danke Dir.

PS: Wegen der $name und der Funktion "s" habe ich meine Satz korrigiert, ich weises nicht warum es bei mir gesponnen hat, aber es war so. Ich hoffe, dass es für Dich so ok ist.

Klar ist das ok, mir war nur wichtig, dass für andere keine missverständlichen oder auf falsche Spur führende Angaben unkommentiert stehenbleiben. Es ist ja wünschenwert, dass andere im Forum nach Lösungen suchen.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können