Wert von Webseite zyklisch abrufen

Begonnen von kaiman, 16 November 2023, 17:03:37

Vorheriges Thema - Nächstes Thema

kaiman

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

tomcat.x

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
FHEM: 6.3 auf Raspi 4B, Raspbian (noch Buster), Perl v5.28.1
Sender/Empfänger: 2 x CULv3, Duofern Stick, HM-MOD-RPI-PCB
Gateways: FRITZ!Box 6591 (OS: 8.10), Trädfri, ConBee 2,  piVCCU, OpenMQTTGateway
Sensoren/Aktoren: FRITZ!DECT, FS20, FHT, HMS, HomeMatic, Trädfri, DuoFern, NetAtmo

Der_Tom

#2
geht theoretisch schon (HTTPMOD und andere ), kommt aber ein wenig auf den quelltext der angeforderten Seite an.

kannst du diesen hier mal zeigen ?

gruss Thomas


betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Beispiel:
define at_test at +*00:00:20 {
fhem("setreading $SELF leistung ".GetFileFromURL('http://ip/leistung'));
fhem("setreading $SELF ertrag ".GetFileFromURL('http://ip/ertrag'));}

Wernieman

Wobei das doch so "blocking" ist ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

#6
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])}\
})\
}

TomLee

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)

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wernieman

Es sei denn, das Zielgerät ist mal nicht erreichbar ... und rate mal, warum ich es in "" gepackt hatte ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

#10
Zitat... und rate mal, warum ich es in "" gepackt hatte

Ich war zwar nicht gefragt, aber mich interessierts, warum ?

kaiman

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wernieman

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.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

TomLee

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.