Suche Hilfe beim Modulbau

Begonnen von edank, 02 Januar 2013, 20:35:08

Vorheriges Thema - Nächstes Thema

edank

Hallo an alle,

ich versuche gerade den den Grundaufbau von Modulen zu verstehen, bzw ein einfaches Modul zum Lernen zu bauen.
Ich weiß auch nicht ob ich hier richtig bin, wollte es eigendlich unter <FHEM Development> posten, aber dort fehlen mir die Rechte.

Und zwar möchte ich folgendes Bewerkstelligen:

1. An einen anderen Rechner im Netzwerk eine UDP Nachricht zu schicken.
2. Diese Funktion schick(und vor allem richtig) in einen Modul verpacken!

Ersteres ist kein Problem, findet man genug im Netz zum abschauen und umbauen.
Beim 2. Punkt fehlen mir die Basics.

Was habe ich geschafft?

Das Modul:

package main;
use Socket;

sub send_UDP_Initialize($) {
my ($hash) = @_;

$hash->{DefFn}   = "send_UDP_Define";
$hash->{SetFn}   = "send_UDP_Set";
$hash->{UndefFn} = "send_UDP_Undef";
}

sub send_UDP_Define($) {
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
 
if(@a != 5) {
my $msg = "wrong syntax: define <name> send_UDP <IP xxx.xxx.xxx.xxx> <Port xxxxx> <Command Start>";
Log 2, $msg;
return $msg;
}

$hash->{IP} = $a[2];
$hash->{Port} = $a[3];
$hash->{Command} = $a[4];
$hash->{STATE} = $a[4];

CommandDefine(undef, $hash->{NAME}."_timer at +$to "."setstate $hash->{NAME} $hash->{STATE}; trigger $hash->{NAME} $hash->{STATE}");

return $ret;
}

sub send_UDP_DoInit($) {
return undef;
}

sub send_UDP_Undef($$) {
   return undef;
}

sub send_UDP_Set() {

my ($hash, @a) = @_;
 
return "no set argument specified" if(int(@a) != 2);
return "Unknown argument $a[1], choose one of $hash->{Command}" if($a[1] ne $hash->{Command});

my $port = $hash->{Port};
my $address = gethostbyname($hash->{IP});
my $comand = $hash->{Command};
my $sockAddress = pack_sockaddr_in($port, $address);

$proto = getprotobyname('udp');

socket(S, AF_INET, SOCK_DGRAM, getprotobyname('udp'));
setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1);
send(S, $comand, 0, $sockAddress);
close S;
return undef;
}
1;


Die Deklaration:

define usStart send_UDP 192.168.178.4 18000 Start
attr usStart webCmd Start

define usStop send_UDP 192.168.178.4 18000 Stop
attr usStop webCmd Stop


Soweit funktioniert auch alles.
Was mich aber stört ist das ich ein webCmd setzen muss, das der Status(bzw das Icon) als Link(Befehl) fungiert.



(siehe Anhang / see attachement)


Mein Wunsch wäre es wenn mir wer sagen könnte wie man das richtig macht.
Ich habe leider nach langen Suchen keine Anleitung gefunden wie ein Modul-Gerüst aussehen muss.
Wäre über einen Link bzw kurze Beschreibung sehr dankbar und ich glaube auch viele andere.

LG
edank



Dr. Boris Neubert

Zitat von: edank schrieb am Mi, 02 Januar 2013 20:35Ich habe leider nach langen Suchen keine Anleitung gefunden wie ein Modul-Gerüst aussehen muss.

Schau Dir mal ein einfaches Modul an. 98_WOL.pm kannst Du Dir zum Vorbild nehmen.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

edank

Hallo Boris,

danke Dir für deine Hilfe.

Zitat von: Dr. Boris Neubert schrieb am Mi, 02 Januar 2013 22:31Schau Dir mal ein einfaches Modul an. 98_WOL.pm kannst Du Dir zum Vorbild nehmen.

Habe es mir sofort angesehen!
Und ich habe jetzt gelernt wie das mit den Readings geht :-).

Aber leider ist das in deinem Script(ich möchte jetzt nicht nervig sein) auch nicht möglich!
Zitat von: edank schrieb am Mi, 02 Januar 2013 20:35Was mich aber stört ist das ich ein webCmd setzen muss, das der Status(bzw das Icon) als Link(Befehl) fungiert.
Ich meine damit das man wie bei den Aktoren auf die Glühbirne klickt und es wird geschalten.
Das funktioniert bei mir leider nur dann wenn ich ein webCmd setze.
Abgesehen davon das sich bei mir der Status nicht ändert und auch nicht soll(Start bleibt Start und Stop bleibt Stop).
Der Sinn liegt darin das ich damit einen HTPC steuern möchte(eventuel später noch Vol_Up Vol_Down).


LG
edank

edank

Hallo,

Was ich auch noch nicht verstanden habe ist die Nummerierung der Module.
Ist dies rein nur wegen der Lesbarkeit oder werden die Module in der Reihenfolge geladen um eventuell so Abhängigkeiten richtig aufzulösen?

LG
edank

edank

Hallo,

ok, ich habe es geschnallt warum das so ist!  :-)

Zitat von: edank schrieb am Mi, 02 Januar 2013 22:55Ich meine damit das man wie bei den Aktoren auf die Glühbirne klickt und es wird geschalten.
Das funktioniert bei mir leider nur dann wenn ich ein webCmd setze.

LG
edank