Wie kann ich von einem eigenen Perl Programm ein Device aufrufen?

Begonnen von beagle001, 30 Dezember 2014, 16:49:10

Vorheriges Thema - Nächstes Thema

beagle001

Hallo,

wie kann ich von meinem Perl Programm ein Ausgangsdevice aufrufen?

Im CFG hatte ich folgendes geschrieben:
set Klingel_Unten on-for-timer 1

Wie komme ich von meinem Perl Programm an dieses Device?:
#####################################
sub
Klingel_Set($$)
{
my ($hash, $param) = @_;

my $name = $hash->{NAME};

Log 1, "$name: Klingel set $param sec";
if( $Klingelstatus == 0 ) {
$Klingelstatus = 1;
InternalTimer(gettimeofday()+$param, "Klingel_GetUpdate",  $hash, 1);
InternalTimer(gettimeofday()+1, "Klingel_GetUpdate_Output",  $hash, 1);
# set Klingel_unten on ( 1sec )
Log 1, "$name: Klingel set Timer started";
}
#  if ($hash->{INTERVAL});
return;
}


Klingel_unten ist so definiert:
define Klingel_Unten CUL_HM 23921F
attr Klingel_Unten IODev HMLAN1
attr Klingel_Unten autoReadReg 4_reqStatus
attr Klingel_Unten expert 2_full
attr Klingel_Unten firmware 1.5
attr Klingel_Unten model HM-LC-SW1-BA-PCB
attr Klingel_Unten msgRepeat 1
attr Klingel_Unten peerIDs 00000000,
attr Klingel_Unten room Flur_EG
attr Klingel_Unten serialNr KEQ0849742
attr Klingel_Unten subType switch
attr Klingel_Unten webCmd statusRequest:toggle:on:off
define FileLog_Klingel_Unten FileLog ./log/Klingel_Unten-%Y.log Klingel_Unten
attr FileLog_Klingel_Unten logtype text
attr FileLog_Klingel_Unten room Flur_EG


Danke
Harry

rudolfkoenig

Ich fuerchte du musst dein Problem umformulieren, ich verstehe nur Bahnhof.

beagle001

#2
Hallo Herr König,

so, werde die Sache genauer beschreiben. Ich habe ein ELV MP3 Soundmodul als Klingel, was beim Ansteuern problematisch ist. Dieses muss mit einen 1sec Impuls angesteuert werden und darf erst wieder angesteuert werden, wenn das Lied fertig ist. Dieses sind ca 18 sec nach der Betätigung.

Dieses habe ich in dem Konfigfile so gelöst.

define merker dummy

define T_Klingel_Unten_N1 notify T_Klingel_Unten:closed {\
   if(!defined $defs{tmr1}){\
      fhem "set merker off;;\
      set Klingel_Unten on-for-timer 1;;\
      define tmr1 at +0:00:18 set merker on;;"\
   } else{\
      if(!defined $defs{nf2}){\
         fhem "define nf2 notify merker:on set Klingel_Unten on-for-timer 1"\
      }\
   }\
}


T_Klingel_Unten ist ein HM-SCI-3-FM ( Eingangsmodul ) zum Einlesen des Klingelknopf.
Klingel_Unten ist ist ein HM-LC-SW1-BA-PCB ( Ansteuermodul ) zum Betätigen des ELV MP3 Moduls.

Mit dem obigen Code und einmaligen Betätigung des Klingelknopf ertönt die Klingel einmal und nach 18 sec noch einmal. Unser Postmensch lacht jedesmal.

Nun habe ich mir ein eigenes Perl Modul "98_Klingel.pm" geschrieben, was auch soweit richtig funktioniert. Nur ich weiss jetzt nicht, wie ich den Befehl oder Anweisung in dem Perlprogramm schreiben muss, der mein Ausgangsmodul ansteuert. Als CFG Zeile würde  ich "set Klingel_Unten on-for-timer 1" schreiben. Wie spreche ich Klingel_Unten aus dem Perl direkt an. Ist es überhaupt möglich?


#####################################
sub
Klingel_Set($$)
{
my ($hash, $param) = @_;

my $name = $hash->{NAME};

Log 1, "$name: Klingel set $param sec";
if( $Klingelstatus == 0 ) {
$Klingelstatus = 1;
InternalTimer(gettimeofday()+$param, "Klingel_GetUpdate",  $hash, 1);
InternalTimer(gettimeofday()+1, "Klingel_GetUpdate_Output",  $hash, 1);

*************************************************************************************
                # set Klingel_unten on ( 1sec )         
*************************************************************************************

Log 1, "$name: Klingel set Timer started";
}
#  if ($hash->{INTERVAL});
return;
}


Im Log File ist alles richtig.

In meinem Perlprogramm gibt es folgende Funktionen:


sub Klingel_Initialize($);
sub Klingel_Define($$);
sub Klingel_Undef($$);
sub Klingel_GetUpdate($);
sub Klingel_GetUpdate_Output($);
sub Klingel_Set($$);
sub Klingel_Get($);


Wie kann ich auf ein Klingel_Get in der Konfigfile mit dem if then arbeiten? Rückgabewert von Klingel_Get wäre # 0 = Freigabe, 1 = gesperrt



define perlKlingel Klingel

define T_Klingel_Unten_N2 notify T_Klingel_Unten:closed {\
       if (!fhem "get perlKlingel;;"){\
             fhem "set Klingel_Unten on-for-timer 1;;\
             set perlKlingel 18;;"\
       }\
}


Wäre es so richtig mit dem Invers = "!"?


Danke schön für Ihre Hilfe.

MfG
Harald Wilczak

rudolfkoenig

Das Stueck hinter dem notify ist genauso perl, wie das im Modul, es hat nur $EVENT,$NAME,etc zusaetzlich zur Verfuegung. D.h. man kann die anderen Geraete auch im Modul mit
fhem "set Klingel_Unten on-for-timer 1";
ansprechen. Allerdings sind Module nicht fuer sowas gedacht, bzw. zu kompliziert. Falls einem die "Einzeiler" zu doof werden (wg. ;; und \), dann sollte man in 99_myUtils.pm eine Funktion schreiben, die man aus der notify mit $EVENT, $NAME, etc. als Parameter aufruft.

Das Return Wert von einem get kann man in einer Variable speichern, siehe folgenden FHEM Einzeiler:
{ my $a=fhem("get CUL version");; $a =~ s/ /_/g;; $a }
Das Invertieren mit ! muesste funktionieren, ich wuerde das mit Einzeilern wie hier in einem telnet Fenster (oder im FHEMWEB) testen, das habe ich gerade auch gemacht.

In der gezeigten notify koennte man merker komplett sparen, und nf2 auf global:DELETED.tmr1 pruefen.
Und nf2 koennte vorher "normal" angelegt werden.

Falls man nur eine Sperre fuer 18 Sekunden will (ohne zweites Klingeln), dann wuerde ich das so schreiben:

define T_Klingel_Unten_N1 notify T_Klingel_Unten:closed {\
   if(!$defs{tmr1}){\
      fhem "set Klingel_Unten on-for-timer 1;; define tmr1 at +0:00:18 sleep 0"\
   }\
}


Ich verstehe aber immer noch nicht, ob das zweite Klingeln nach 18 Sekunden gut oder schlecht ist, jedenfalls ist es so programmiert.

beagle001

Hallo,

danke schön für die Antwort. Das zweite Klingel ist schlecht ;-)))

Danke
Harald Wilczak