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
Hi,
mach mal ein "list" von Deinem HTTPMOD-Device und stell das hier rein. ...bitte in code-Tags.
Gruß,
Thorsten
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
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
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
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) ?
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.
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.