FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kaiman am 16 November 2023, 17:03:37

Titel: Wert von Webseite zyklisch abrufen
Beitrag von: kaiman am 16 November 2023, 17:03:37
Hallo zusammen,

Ich habe eine Frage:

Ich habe eine Wallbox, die mir mit einzelnen URLs Werte zur Verfügung stellen kann.

zB: Man ruft http://ip/leistung auf und erhält 11000

Gibt es eine Möglichkeit, diesen Wert in FHEM einzulesen und anzuzeigen?

Kann ich mehrere Ausrufe in ein FHEM device packen oder muss ich pro Aufruf ein device erstellen? 
Ich wollte insgesamt 5 Werte auslesen.

Lg
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: tomcat.x am 16 November 2023, 17:27:52
Hallo kaimann,

hast Du Dir schon das Modul HTTPMOD angesehen? Damit kann man aus eine Seite mehrere Werte auslesen. Das wären für mehrere Seiten dann allerdings mehrere Geräte. Mehrere Werte von eine Seite in ein Gerät ginge aber, falls die Wallbox das auch anbietet.

Wenn auf der Seite nur der Wert ist, dürfte das auch recht einfach einzurichten sein. Komplizierter ist es, wenn man aus einer umfangreichen Seite an bestimmten Stellen mittendrin was auslesen will. Das Modul bietet Templates für ein paar vorbereitete Fälle. Auch wenn die nicht passen, sind sie als Beispiel gut.

VG
Thomas
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: Der_Tom am 16 November 2023, 17:28:35
geht theoretisch schon (HTTPMOD (https://wiki.fhem.de/wiki/HTTPMOD) und andere ), kommt aber ein wenig auf den quelltext der angeforderten Seite an.

kannst du diesen hier mal zeigen ?

gruss Thomas

Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: betateilchen am 16 November 2023, 18:30:12
Wenn es tatsächlich so einfach ist, wie hier dargestellt, braucht man dafür weder HTTPMOD noch sonstige Kopfstände. Man kann mittels at einfach eine passende Funktion der HTTPutils.pm aufrufen und die 5 Werte in 5 readings schreiben.
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: TomLee am 16 November 2023, 18:38:16
Beispiel:
define at_test at +*00:00:20 {
fhem("setreading $SELF leistung ".GetFileFromURL('http://ip/leistung'));
fhem("setreading $SELF ertrag ".GetFileFromURL('http://ip/ertrag'));}
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: Wernieman am 16 November 2023, 18:52:48
Wobei das doch so "blocking" ist ....
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: TomLee am 16 November 2023, 19:17:18
Dann halt so in der Art:

defmod at_test at +*00:00:20 {\
HttpUtils_NonblockingGet({\
url=>'http://ip/leistung',\
callback=>sub($$$){\
return fhem("setreading $SELF leistung ".$_[1]) if($_[1]);;\
fhem("setreading $SELF leistung ".$_[2])}\
});;\
HttpUtils_NonblockingGet({\
url=>'http://ip/bla',\
callback=>sub($$$){\
return fhem("setreading $SELF bla ".$_[1]) if($_[1]);;\
fhem("setreading $SELF bla ".$_[2])}\
})\
}
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: TomLee am 16 November 2023, 21:36:44
Mit Lust und Zeit am PC, hier eine Variante in der man einfach nur die Datei (in der sich der Wert befindet) in einem Array angibt (vorausgesetzt das der Pfad sich nicht ändert):

defmod at_test at +*00:00:20 {\
my @a = qw(leistung bla);;\
foreach (@a) {my $t=$_;;\
HttpUtils_NonblockingGet({url=>"http://ip/$t",\
callback=>sub($$$){\
return fhem("setreading $SELF $t ".$_[1]) if($_[1]);;\
fhem("setreading $SELF $t ".$_[2])}\
})};;}



(Ich frage mich, ob man das auch anders lösen kann mit der Umlaufvariablen des foreach, wie/ob man die in dem callback irgendwie direkt verwenden kann, statt zuvor in einer Variablen zu deklarieren)
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: betateilchen am 17 November 2023, 06:18:34
Zitat von: Wernieman am 16 November 2023, 18:52:48Wobei das doch so "blocking" ist ....

Du hast zwar recht, aber lass doch mal die Kirche im Dorf. Es dürfte sich hier um Millisekunden handeln.
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: Wernieman am 17 November 2023, 09:05:09
Es sei denn, das Zielgerät ist mal nicht erreichbar ... und rate mal, warum ich es in "" gepackt hatte ...
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: TomLee am 17 November 2023, 10:52:38
Zitat... und rate mal, warum ich es in "" gepackt hatte

Ich war zwar nicht gefragt, aber mich interessierts, warum ?
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: kaiman am 17 November 2023, 14:24:20
Hallo TomLee,

DANKE für deinen Input. Es hat geklappt!

Danke an alle, die etwas dazu beigetragen haben!

Zitat von: TomLee am 16 November 2023, 21:36:44Mit Lust und Zeit am PC, hier eine Variante in der man einfach nur die Datei (in der sich der Wert befindet) in einem Array angibt (vorausgesetzt das der Pfad sich nicht ändert):

defmod at_test at +*00:00:20 {\
my @a = qw(leistung bla);;\
foreach (@a) {my $t=$_;;\
HttpUtils_NonblockingGet({url=>"http://ip/$t",\
callback=>sub($$$){\
return fhem("setreading $SELF $t ".$_[1]) if($_[1]);;\
fhem("setreading $SELF $t ".$_[2])}\
})};;}


LG
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: betateilchen am 17 November 2023, 14:34:48
Zitat von: Wernieman am 17 November 2023, 09:05:09Es sei denn, das Zielgerät ist mal nicht erreichbar

Wenn man das abfangen möchte, kann man GetFileFromUrl() nach der url einfach einen Parameter als timeout mitgeben, um die Wartezeit zu begrenzen.

Zitat von: Wernieman am 17 November 2023, 09:05:09und rate mal, warum ich es in "" gepackt hatte ...

Damit Du eine Grund / eine Rechtfertigung hattest, überhaupt Deinen Senf dazuzugeben?
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: Wernieman am 17 November 2023, 17:30:47
Weil mir klar war, welche Antwort kam. Trotzdem lag es nicht am "Senf dazugeben", sondern an konstruktiven Hinweis, warum manchmal auch im internen Netz ein "no0n blocking" sinnvoll sein kann.
Titel: Aw: Wert von Webseite zyklisch abrufen
Beitrag von: TomLee am 17 November 2023, 21:11:00
ZitatHallo TomLee,

DANKE für deinen Input. Es hat geklappt!

Bitte.

Aber, man lernt ja nie aus. Aufgrund des timeout default von 4 Sekunden in GetFileFromURL (was, wie ich es verstehe, nie erreicht wird und wenn könntest du ein größeres angeben), würde ich jetzt mehr zu der kürzeren Variante mit GetFileFromURL tendieren und das von mir gezeigte Beispiel dazu, einfach mit einer Schleife umsetzen, das man einfach wieder auch hier nur den Dateinamen angeben muss.