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
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
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
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.
Beispiel:
define at_test at +*00:00:20 {
fhem("setreading $SELF leistung ".GetFileFromURL('http://ip/leistung'));
fhem("setreading $SELF ertrag ".GetFileFromURL('http://ip/ertrag'));}
Wobei das doch so "blocking" ist ....
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])}\
})\
}
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)
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.
Es sei denn, das Zielgerät ist mal nicht erreichbar ... und rate mal, warum ich es in "" gepackt hatte ...
Zitat... und rate mal, warum ich es in "" gepackt hatte
Ich war zwar nicht gefragt, aber mich interessierts, warum ?
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
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?
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.
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.