ReadyFn wird nicht aufgerufen.

Begonnen von fischle, 25 Mai 2014, 13:59:32

Vorheriges Thema - Nächstes Thema

fischle

Hallo,
ich wende mich mit einem Problem an euch, das seine Quellen hier hat:

http://forum.fhem.de/index.php/topic,20280.300.html

Hintergrund ist: Adam hat ein Modul geschrieben, mit dem Viessmann Heizungen ausgelesen werden können. Es ist ebenfalls möglich Parameter zu setzen. Als Verbindung zur Heizung werden IR-LEDs verwendet, die an der seriellen Schnittstelle angeschlossen sind.

Die Kommunikation funktioniert so: Die Heizung sendet ein 0x05, direkt dannach kann man mit spezifischen Kommandos Daten lesen. Man muss also immer warten, wann die Heizung das 0x05 sendet, bevor man etwas lesen kann.

Funktioniert soweit alles gut, aber irgendwann empfängt FHEM das 0x05 nicht mehr. Ich vermute, dass sich mein USB-Seriell-Wandler dann aufgehängt hat. Ein Neustart von FHEM behebt das Problem. Adam hat mir empfohlen, zu schauen, ob die Ready-Funktion noch aufgerufen ist. Ich habe einen entsprechenden Logeintrag in der Funktion angelegt. Dadurch habe ich festgestellt, dass die Funktion nie aufgerufen wird.

Kann mir jemand erklären, wann die Funktion aufgerufen wird? Vielleicht kann ich das Problem dann weiter eingrenzen. Ich weiß, das das ganze aktuell so implementiert ist, dass die Schnittstelle immer offen gehalten wird.

Folgenden Eintrag habe ich auch schon gefunden, ich denke der hat ein ähnliches Problem, leider ohne Lösung:
http://forum.fhem.de/index.php/topic,19325.0.html

Hier ist beschrieben, was die Funktion machen soll - würde also zu meiner Fehlerstellung passen.
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#Ausf.C3.BChrung_von_Modulen

Über eine Rückmeldung wäre ich dankbar. Falls ich im falschen Forum bin, bitte verschieben. Ursprünglich wollte ich unter "FHEM Development" einstellen, geht ja aber nicht.
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

rudolfkoenig

Eigentlich sollten in FHEM alle Module die Daten ueber select lesen (bitte manpage lesen!), d.h. das ensprechende Kanal (FD) wird in %selectlist eingetragen, und falls es Daten gibt, dann wird das passende ReadFn aufgerufen.

In manchen Situationen funktioniert select nicht, z.Bsp. unter Windows mit seriellen Schnittstellen, oder wenn das Geraet nicht eingesteckt ist. Fuer diesen Fall ist ReadfyFn gedacht: sie wird regelmaessig aufgerufen, falls das Geraet in %readyfnlist eingetragen ist (es ist sowas wie ein regelmaessiger Timer-Aufruf) um zu pruefen, ob das Geraet bereit ist.

Ihr koennt ReadyFn "missbrauchen" um einen regelmaessigen Aufruf einzuplanen, der im Problemfall ein Reopen erzwingt.

fischle

Hallo Rudolf,
danke für deine Rückmeldung. Adam hat sich bei der Implementierung ziemlich an das angelehnt, was bei DevIO auch verwendet wird. Da wir eine andere Parität / Anzahl Datenbits brauchen ist leider keine direkte Verwendung der DevIO möglich.

Ich habe mir noch mal folgenden Link angeschaut:
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#Ausf.C3.BChrung_von_Modulen

Hier steht:
ZitatAuf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per select überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion (X_Ready) implementieren, die prüft ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.

Insbesondere der letzte Teil ist ja interessant. Da steht, dass überprüft wird, ob die Schnittstelle wieder verfügbar ist. Ich konnte in der DevIO jetzt aber leider noch nicht so recht erkennen, was der Mechanismus ist, der das Gerät auf die "readyfnlist" schreibt. Beim OpenDev wird das Gerät (bei Linux) ja explizit von der "readyfnlist" gelöscht. Kannst du hier vielleicht weiterhelfen? Wie ist das gedacht?


    if( $^O =~ /Win/ ) {
      $readyfnlist{"$name.$dev"} = $hash;
    } else {
      $hash->{FD} = $po->FILENO;
      delete($readyfnlist{"$name.$dev"});
      $selectlist{"$name.$dev"} = $hash;
RPi,
- USB RS485 Adapter für Stromzähler DRS155M und SDM630M-DC (B+G E-Tech)
- Viesmann KO2B Heizung mit selbstbau Optolink Adapter
- Mi-Light WiFi-Bridge V4, WW/CW LED-Birne

rudolfkoenig

DevIo_OpenDev aktiviert aber auch readyfnlist, falls open() schiefgeht.

Adam

Hi Rudolf, danke schon mal für die Tipps, glaube aber das ich alles übernommen habe.

Ich würde das Modul gern komplett auf DevIo umstellen, dazu müsste ich der DevIo_OpenDev
aber eine andere parity und stopbits mit geben können!

Der Viessmann USB Adapter bzw die Schnittstelle arbeitet mit parity=even und stopbits=2.
Dies ist zur Zeit hardcoded.

Wäre cool wenn Du das in Zukunft verallgemeinern könntest.

Gruß
Adam

rudolfkoenig

Das kann man in der Init Funktion (drittes Argument im DevIO_OpenDev) auch bequem erledigen.

Adam

Hast Du ein Beispiel für mich. Habe bisher nur PMs gefunden die Ihre eigene OpenDev schreiben, daher war das auch mein erster Ansatz!

Adam

Also genauer, wie man das in der Init Routine dann macht.
Ich rufe bereits eine beim DevIo_open auf!!

rudolfkoenig

Da ist aber jemand sehr bequem.
Folgendes koennte funktionieren:

...
  my $ret = DevIo_OpenDev($hash, 0, "My_DoInit");
...

sub
My_DoInit($)
{
  my ($hash) = @_;
  $hash->{USBDev}->parity('even');
  $hash->{USBDev}->stopbits(2);
  $hash->{USBDev}->write_settings;

  return undef;
}


Adam

Ja Danke, hatte es auch gerade so ähnlich probiert  ;D

Wäre aber vorher nie auf die Idee gekommen das so zu lösen.
Wenn ich mir die anderen Module so anschaue die auch nicht!
Die bauen alle die DevIo Routinen nach!!

Naja mal schauen, ob bei fischle die Ready Routine jetzt bei reiner DevIo Nutzung aufgerufen wird!

Danke schon mal,
Adam