ReadFN - fhem.-Hauptschleife?

Begonnen von Elektrolurch, 19 Mai 2014, 12:47:41

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo zusammen,

habe für mein Modul zur Heizungssteuerung eine Umstellung vorgenommen: Der request zum Webserver der Hz dauert teilweise mehrere Sekunden, in der Zeit steht fhem ja. Daher habe ich das Senden und Empfangen aufgeteilt. Für den Empfang wollte ich die ReadFN verwenden, die ja laut "Entwicklerdoku für Einsteiger" regelmäßig in der fhem-Hauptschleife aufgerufen wird.
Dazu habe ich in der Modul-Initialisierung nun zusätzlich definiert:

$hash->{ReadFn}  = "Wcmcom_Read";

Die Routine Wcmcom_Read wird wohl aber nie aufgerufen, um dies zu verifizieren, habe ich eine Log-Ausgabe ganz am Anfang eingebaut:

sub Wcmcom_Read($)
{
my ($hash) = @_;
my $name = $hash->{NAME};
my $debug = 2;
$hash->{READCOUNT} += 1;
Log3($name,$debug,"Wcmcom_Read: rcount: $hash->{READCOUNT}") if(($hash->{READCOUNT} % 100) == 0);
...
Der Zähler wird natürlich in der Init mit 0 vorbelegt, die anderen über den hash des Moduls bekannt gemachten Funktionen, wie defFN, SetFN usw. werden alle angesprungen.

Eigentlich  müsste ja alle 100x Mal ein Eintrag im Log auftauchen. Auch der Rest der Routine tut nichts.

Was muss ich tun, damit die ReadFN von fhem aus angesprungen wird?

Gruß

Elektrolurch


configDB und Windows befreite Zone!

justme1968

du musst fhem sagen für welchen filedescriptor deine readFn zuständig ist. das geht über die selectlist.

ich kann grad keinen link posten aber auch mal in den modulen oder hier im forum nach selectlist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

da habe ich die Einsteiger-Doku für Entwickler wohl etwas falsch verstanden. DA steht nämlich nur, dass die ReadFN von fhem aufgerufen wird. Von Filedescriptor steht da leider nichts.
Ich habe in dem Sinne auch keinen FileDeskriptor.

Im Sendeteil mache ich folgendes:
...
my $request = HTTP::Request->new('POST', $url, $header,,$telegram );
$hash->{REQUEST} = $request;
Log3($name,3,"IOWrite: request $request url $url header $header telegram $telegram gesendet");

....

in der ReadFN dann das entsprechende Teil für den response:
...

my $response = $agent->request($request);
# Fehlerbehandlung
if(!$response->is_success)
{

...

url,request,agent usw. merke ich mir im hash der Instanz.

Zitat aus der Einsteiger-Doku:

X_Read
Die X_Read-Funktion wird aus der Hauptschleife von FHEM aus aufgerufen wenn das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können. Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Seriell-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion DevIo_SimpleRead gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann. Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten zwischenspeichern. Es bietet sich an, dies im Hash der Geräteinstanz zu tun. Im Beispiel ist dies $hash->{buffer} an den die jeweils gelesenen Daten angehängt werden bis die folgende Prüfung ein für das jeweilige Protokoll passendes Frame identifiziert.

In den Code-Beispiel wird auch kein File-Descrittor verwendet, sondern von einer seriellen Schnittstelle gelesen.

Was muss ich jetzt den fhem noch anmelden, damit es meine Wcmcom_Read-Funktion aufruft?

Bin jetzt etwas verwirrt....
Der http-Agent mit request und response hat wohl keinen Filepointer, dem man durch fhem abprüfen lassen könnte, umd "redy" feststellen zu lassen.


Gruß

Elektrolurch
configDB und Windows befreite Zone!

justme1968

ohne filedescriptor geht readfFn.

in deinem beispiel steckt ganz sicher auch irgendwo ein filedescriptor drin.

oder du verwendest die HttpUtils im nonblocking mode. im netatmo modul findest du ein beispiel.

oder lwp mit callback.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,
Zitat
HttpUtils im nonblocking mode. im netatmo modul ..

Das Modul und die http-utils habe ich mir mal angesehen. Leider keine einzige Zeile erklärenden Kommentar drin, so das man wenigstens  wüsste, welche Parameter man an die Funktionen des http-utils - Moduls übergeben muss.
Es ist wohl in vielen Fällen ein hash, aber mit welchen Komponenten?
Zum Beispiel: Was ist, wenn der abzufragende Webserver bei jedem Request einen http-header erwartet?
Wird das von http-utils unterstützt?

Gruß

Elektrolurch
configDB und Windows befreite Zone!

justme1968

eine sehr kurze erklärung gibt es in HttpUtils.pm (zeile 302ff). ansonsten hilft nur da nachschauen wie es funktioniert.

header setzen geht mit 'header =>...'

gruss
andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968