Mindestinhalt eines Moduls?

Begonnen von Predictor, 22 Juni 2013, 13:37:57

Vorheriges Thema - Nächstes Thema

Predictor

Hallo,

ich habe ein paar Subs erstellt die auch in der 99_Utils.pm funktionieren.
Wenn ich aber nun versuche ein eigenständiges Modul zu erstellen kann ich es nicht laden.

Ich habe auch in den anderen Modulen geschaut was dort enthalten ist und es mal auf folgenden "Mindestcode" reduziert.
 
 
# 95_Enigma.pm
 
 package main;

 use strict;
 use warnings;
 use POSIX;
 use Switch 'Perl5', 'Perl6';
 
 
 #####################################
 # Initializes module
 sub Enigma_Initialize($) {
  my ($hash) = @_;
  $hash->{SetFn}   = "Enigma2RemoteControl";
  $hash->{DefFn}   = "Enigma_Define";
  $hash->{AttrList} = "loglevel:0,1,2,3,4,5 " . $readingFnAttributes;
}


#####################################
# Initializes every new instance
sub Enigma_Define() {
  my ($hash, $def) = @_;
  $hash->{STATE}       = "initialized";
  return undef;
}


#########################
# Forward declaration
sub  Enigma2RemoteControl();


sub Enigma2RemoteControl() {
# noch nichts drinn
}

 1;



=pod
=begin html
<a name="Enigma"></a>
<h3>Enigma</h3>
<ul>
  DreamRemote - remote control for Enigma based Receiver like DreamBox or VU or whatever :-)
</ul>

=end html
=begin html_DE
<a name="Enigma"></a>
<h3>Enigma</h3>
<ul>
  DreamRemote Fernbedienung für Enigma basierende Receiver (Dreambox, VU, ...)
</ul>
=end html_DE
=cut




Wenn ich jetzt aber versuche das Modul zu laden mit:
define test Enigma
bekomme ich den Fehler:
Cannot load module Enigma
und im Log steht
Undefined subroutine &main::Enigma_Initialize called at fhem.pl line 1656.


Was fehlt denn noch im Modul damit es von FHEM geladen werden kann?


Ich finde leider auch in keiner Perl Doku was diese 2 Funktionen genau machen (waren aber in allen Modulen enthalten, also denke ich diese sind zwingend nötig).
    sub Enigma_Initialize($)
    sub Enigma_Define()

Beim sub Enigma_Initialize habe mir gedacht, das hier die Namen der Subs als Wert angegeben werden müssen, aber wie muss der Schlüssel heisen?
 $hash->{SetFn}   = "Enigma2RemoteControl";
  $hash->{DefFn}   = "Enigma_Define";
  $hash->{AttrList} = "loglevel:0,1,2,3,4,5 " . $readingFnAttributes;



Die forward declaration kann man laut perl doku wohl auch weglassen (oder nicht?)
# Forward declaration
sub  Enigma2RemoteControl();



Grüße
Predi
FHEM auf Fritz!Box 7390
FS20 per CUL

Niko

Hallo,

ich hatte mich im Frühjahr auch mit einem eigenen Modul beschäftigt (mehr als Lerneffekt). Ich bin damals auf folgenden Beitrag von Rudolf Koenig gestoßen (noch zu Google Zeiten, also vor Start des jetzigen Forums). Dieser hat mir sehr geholfen den grundlegenden Aufbau zu verstehen.

Viele Grüße Niko

https://groups.google.com/forum/#!msg/fhem-users/e63Xn75X-Pw/Z-onAr0J09wJ

Ein Modul wird von FHEM erkannt, indem man es ins Modulverzeichis kopiert
unter einem bestimmten Namen: NN_ModulName.pm. NN bezeichnet die Reihenfolge,
die wird beim auflisten aller Geraete verwendet, oder beim zuordnen einer
Nachricht einem logischen (s.u.) Geraet.

Das Modul muss eie Funktion "ModuleName_Initialize" enthalten, die nach dem
Laden aufgerufen wird. Die Name dieser Funktion (und nicht die der Datei)
spezifiziert die klein/Grossschreibung des Moduls.

Module mit der Reihenfolge 99 werden immer geladen (die enthalten generische
Hilfsfunktionen), alle anderen erst dann, wenn ein Geraet mit diesem Namen
definiert wird.


Es gibt zwei Arten von Geraeten, die man (wenn moeglich) nicht zu einem
zusammenfassen sollte:
- das Physische, was man also direkt am Rechner anschliesst, z.Bsp. FHZ/CUL
- das Logische, was ueber das physisch angeschlossene indirekt gesteuert wird
  (FS20, FHT)

Im Initialize des Moduls spezifiziert man, welche Funktionen man unterstuetzt,
die sind je nach Art des Geraetes unterschiedlich.

Physische Geraete koennen folgendes setzen:
- FD:     Filedescriptor, falls man die Daten per select pruefen kann (Unix)
          Wird natuerlich erst nach dem "define" gesetzt.
- Readyfn: Zum pollen, ob Daten da sind (Windows), bzw. ob das ausgestoepselte
          Geraet wieder eingesteckt wurde.
- ReadFn: Wird verwendet, falls das Geraet Daten meldet per select oder
          ReadyFn. Holt die Daten ab, und stellt sie dem logischen Geraeten
          zur Verfuegung, z.Bsp. via dem generischen Dispatch.
- WriteFn:Wird von den logischen Modulen verwendet, um Daten zu schreiben. Die
          logischen sind ueber das Attribut IODev mit dem Physikalischen
          verbunden
- Clients:Liste der moeglichen logischen Empfaenger. Die Daten werden allen
           diesen Empfaengern angeboten
- MatchList:Zuordnung (via regexp) von Nachricht an logisches Modul.
          Wird verwendet, um eine Nachricht der Sorte:
          "Unknown XXXX device detected, define one to get detailed
          information"
          Die Module selber koennen ja nicht gefragt werden, wenn noch kein
          Geraet von dieser Sorte definiert wurde.

Logische Geraete koennen folgendes setzen:
- Match:  Regexp, um eine Nachricht vom Physischen entgegenzunehmen.
- ParseFn:wird aufgerufen, falls die Nachricht "matched".
          Liefert zurueck den Namen des betroffenen Geraetes, und setzt in
          "CHANGED" Feld des betroffenen Geraetes die "neuen" Nachrichten,
          (diese wird fuers Trigger verwendet und geloescht), bzw. in READINGS
          verewigt.

Funktionen fuer alle Geraete:
- DefFn:  wird beim definieren oder umbenennen aufgerufen.
- UndefFn:wird beim loeschen aufgerufen.
- GetFn:  Optional, liefert Daten zurueck. Die Usage Meldung ist "stadard",
          moegliche get Argumente werden z.Bsp von fhemweb hieraus extrahiert.
- SetFn:  Optional, liefert keine Daten zurueck. Die Usage Meldung ist
          "stadard", moegliche get Argumente werden z.Bsp von fhemweb hieraus
          extrahiert.
- StateFn:Setzt den Status des Geraetes, ohne irgendwelche Aktionen
          auszufuehren, z.Bsp beim Hochfahren von fhem werden die zuletzt
          gespeicherten Werte gesetzt.
- AttrList:Liste der moeglichen Attribute. Nach einem Doppelpunkt folgen die
          moeglichen Werte.
- ShutdownFn: wird beim stoppen von fhem aufgerufen.
- AttrFn: Prueft ob des setzen/loeschen bestimmter Attribute ok ist, bzw.
          passt Interne werte an.



betateilchen


package main;

use strict;
use warnings;
use Time::HiRes qw(gettimeofday sleep);

sub ENIGMA_Get($@);
sub ENIGMA_Define($$);
sub ENIGMA_GetStatus($;$);
sub ENIGMA_Undefine($$);

###################################
sub
ENIGMA_Initialize($)
{
  my ($hash) = @_;

  $hash->{GetFn}     = "ENIGMA_Get";
  $hash->{SetFn}     = "ENIGMA_Set";
  $hash->{DefFn}     = "ENIGMA_Define";
  $hash->{UndefFn}   = "ENIGMA_Undefine";

}

sub
ENIGMA_Define($$)
{
}

sub
ENIGMA_Set()
{
}

1;


Damit funktioniert zumindest das "define EN01 ENIGMA"


Internals:
   CFGFN      
   NAME       EN01
   NR         35
   STATE      ???
   TYPE       ENIGMA
Attributes:


Den Inhalt des Moduls musst DU jetzt aber selbst zusammenbasteln :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Predictor

super danke für den Tipp!!!!!!

werde mich mal daran machen
FHEM auf Fritz!Box 7390
FS20 per CUL