Infos für Modulerstellung ...

Begonnen von ritchie, 25 Juli 2013, 13:01:53

Vorheriges Thema - Nächstes Thema

ritchie

hallo Zusammen,

derzeit versuche ich die Vorgehensweise für das Einlesen und Benachrichtigen auf Modulebene zu versehen.

Hierbei meine ich folgende Funktion schon gefunden zu haben:

Setzen des Device /dev/ttyUSB0
($hash->{USBDev}

Der File Number vom Stream
$hash->{FD}

Name des Modules, welches den Select verwendet
$hash->{NAME}

???
$hash->{PARTIAL}

Device Timeout
$hash->{TIMEOUT}

Informationsroutine über neue Daten
Übergabeparameter sind die neuen Daten
$hash->{ActivateInformFn}

Eventroutine über Statusänderungen des Systems
 $hash->{NotifyFn}

Connection descriptor  (Handle des Device)
  $hash->{CD}  

Rückgabebuffer
 $hash->{BUF}

Anzahl der aktiven Verbindungen (für mich nicht von Interesse)
$hash->{CONNECTS}

Eintrag in die Select Liste zum Scannen der I/Os
$selectlist{$name} = $hash;

Ganz klar ist mir noch nicht, wie ich die Baudrate und den Streamtypen an den Select übergeben und ob diese Routine "$hash->{ActivateInformFn}" wirklich die Benachrichtigungsroutine beinhaltet.

Gruss R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

rudolfkoenig

> Baudrate und den Streamtypen an den Select übergeben

Gar nicht, bitte erst select manual durchlesen(!).

Im FHEM Umfeld verwendet man DevIo_OpenDev, und die Baudrate kann man in dem Namen als /dev/USB0@Baudrate spezifizieren. Alternativ setzt man es in Initfn, was man als Argument an OpenDev uebergibt.

ritchie

Das Telnet Modul ist dann nicht wirklich als Beispiel gut, da es nicht das OpenDev Modul verwendet, sondern selber den Stream öffnet und dann in die "$selectlist{$name} = $hash;" sich einklinkt, was ja OpenDev() selber macht.
Auch wird hier das entfernen selbst gemacht, was sonst CloseDev() macht.

Ich habe mir mal das OWX.pm Modul angesehen, dort wird mit OpenDev/CloseDev gearbeitet.
Generell sind nur die FHEM spezifischen Sachen das Hauptproblem, also die Eventroutinen.

Sehe ich dann folgende Events von FHEM richtig. Ein Link zur Docu. wäre echt prima, da dies die Grundlagen für eine Modulerstellung sind.

Lese-Event, Es sind Zeichen am Port, welche abgeholt werden können. Dies muss dann mittels Select und read im eigenen Modul erfolgen.

$hash->{ReadFn}  

Es erfolgt ein Define Kommando des Moduls

$hash->{DefFn}

Es erfolgt ein Delete des Moduls. Aufräumen

$hash->{UndefFn}

Es erfolgt eine Abänderung eines Attributes

$hash->{AttrFn}  

LogLevel....

$hash->{AttrList}

Genereller Notify (nicht ganz sicher wann dieser kommt, für alle, oder nur das Modul)

$hash->{NotifyFn}

Nicht wirklich klar

$hash->{ActivateInformFn}

Ein Wert einer Modul-Variable will gelesen werden

$hash->{GetFn}

Ein Wert einer Modul-Variable will gesetzt werden

$hash->{SetFn}

Init des Moduls, nicht einer Instanz

$hash->{InitFn}


Edit:
Ich würde mich anbieten eine entsprechende Wiki-Seite anzulegen, wenn ich die entsprechenden Infos bekomme.

Viele Grüße

R.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Amenophis86

Ich habe eine Frage zu CloseDev. Allerdings mal vorab, ich stehe komplett am Anfang, was das Modul Development angeht und meine Kenntnisse sind mehr schlecht, als recht. Ich bin dabei das Denon Modul anzupassen, weil es sich nicht mehr Connected, sobald die Verbindung einmal weg war.

Die Idee ist es, mittels set reconnect die Verbindung zu beenden und eine neue aufzubauen. Mein Code dazu sieht wie folgt aus:

elsif ($what eq "reconnect")
{
my $close = DevIo_CloseDev($hash,0);
my $ret = DevIo_OpenDev($hash, 0, "DENON_AVR_DoInit");
$hash->{STATE} = $ret;
}


Bisher klappet es, dass es sich verbindet, wenn noch keine Verbindung bestand. Was nicht funktioniert ist, dass wenn eine Verbindung besteht, das ganze die Verbindung trennt und wieder neu aufbaut. Es kommt immer ein Connection refused zurück. Ich glaube, dass es daran liegt, dass nur eine Verbindung erlaubt ist und quasi die alte nicht geschlossen wird. Die Verbindung wird mittels telnet hergestellt.

Kann mir jemand sagen, wieso die Verbindung nicht geschlossen wird? Das Modul bzw den Ursprungscode gibt es hier:
https://raw.githubusercontent.com/xusader/fhem-denon/master/FHEM/71_DENON_AVR.pm

Eingefügt habe ich das ganze nach Zeile 456.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...