[gelöst] X_Attr wird nicht aufgerufen

Begonnen von Andi291, 16 September 2015, 19:52:49

Vorheriges Thema - Nächstes Thema

Andi291

Hallo liebe Mitstreiter,

mein erster Beitrag in diesem Teil des Forums - deshalb kurz zu meiner Person:
Programmiererfahrung in Java und Ansi-C sind auf einem guten Level, bei Perl bin ich noch...naja. Ich nutze FHEM zur Visualisierung meiner KNX-Automation und bin in diesem Zuge auf das ein- oder andere Potential gestoßen.
Letztendlich habe ich vor einigen Monaten die Wartung des EIB-Moduls und (vorgestern :-)) die der TUL übernommen.

Ich stoße gerade auf ein hartnäckiges Problem, bei dem ich nicht weiter komme...

Ums verrecken schaffe ich es nicht, das TUL_Attr, bzw. EIB_Attr aufgerufen werden. Ich habe die original-sourcen versucht, das Template vom Developer Intro - no way. Ich habe an einem Dutzend Stellen print-Ausgaben eingebaut, komme aber nicht auf die richtige Spur.

Bei Java würd ich drauf tippen, dass irgendein Reflection-Mechanismus in die Hosen geht. Bei Perl jedoch hänge ich gerade fest...

Hier die "Urfunktion":


sub
TUL_Attr(@)
{
  my @a = @_;

  print "Bin hier\n";
  Log 2, "Unsupported method TUL_Attr($a[0],$a[1],$a[2],$a[3])";

  return undef;
}


Kann mir bitte irgend jemand einen Schubs in die richtige Richtung, sprich aufrufende Codestelle oder "Aktivierungstrick" nennen?

Grüße, Andi

rapster

Hallo Andi,

hast du die Funktion auch in der Initialize bekannt gemacht?

sub TUL_Initialize($$) {
    my ($hash) = @_;
    $hash->{AttrFn} = 'TUL_Attr';
}


Gruß
  Claudiu

Andi291

Hallo Rapster,

(leider) ja...

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

# Provider
  $hash->{ReadFn}  = "TUL_Read";
  $hash->{WriteFn} = "TUL_Write";
  $hash->{ReadyFn} = "TUL_Ready";

# Normal devices
  $hash->{DefFn}   = "TUL_Define";
  $hash->{UndefFn} = "TUL_Undef";
  $hash->{GetFn}   = "TUL_Get";
  $hash->{SetFn}   = "TUL_Set";
  $hash->{StateFn} = "TUL_SetState";
  $hash->{AttrFn}  = "TUL_Attr";
  $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 " .
                     "showtime:1,0 model:TUL loglevel:0,1,2,3,4,5,6 ";
  $hash->{ShutdownFn} = "TUL_Shutdown";
 
}

rapster

#3
Das erste was denke ich nicht passt:
Zitat von: Andi291 am 16 September 2015, 19:52:49
  Log 2, "Unsupported method TUL_Attr($a[0],$a[1],$a[2],$a[3])";
Hier baust du dir ja 1. eine Endloßschleife, weil die Funktion sich immer wieder selber aufruft, (ups seh grad haste ja noch in den " ")
und 2. wird das ohne forward-declaration mindestens eine Interpreter Warnung erzeugen, obs trotzdem funktioniert?

Das zweite was nicht passt:
Zitat von: Andi291 am 16 September 2015, 19:52:49
  $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 " .
                     "showtime:1,0 model:TUL loglevel:0,1,2,3,4,5,6 ";
In Perl kannst du zwar mehrzeilig Schreiben, allerdings muss immer am Anfang der Zeile der Operator stehen, also so

$hash->{AttrList}= "do_not_notify:1,0 "
                               ."dummy:1,0 "
                               ."showtime:1,0 "
                               ."model:TUL "
                               ."loglevel:0,1,2,3,4,5,6";


Gruß
  Claudiu

rudolfkoenig

#4
Bei mir wird sie aufgerufen:
fhem> define T TUL none 1234 12
fhem> attr T model TUL
.....
2015.09.16 20:15:09 1: T device is none, commands will be echoed only
2015.09.16 20:15:33 2: Unsupported method TUL_Attr(set,T,model,TUL)


PS. Das mit "muss immer am Anfang der Zeile der Operator stehen" ist natuerlich falsch.

rapster

Zitat von: Andi291 am 16 September 2015, 19:52:49
Ich habe an einem Dutzend Stellen print-Ausgaben eingebaut, komme aber nicht auf die richtige Spur.

BTW, print ist in fhem nicht gerade hübsch, das landet zwar (normalerweise) auch im fhem-log, allerdings über den stdout Umweg,
im Modul am besten mit Log3() arbeiten.

Gruß
  Claudiu

Andi291

Oh Mann - ich bin ein Hirsch...

1. TUL_Attr wird nur aufgerufen, wenn ich ein Attr an die TUL richte - nicht, wenn die "Kinder" aus dem EIB versorgt werden.

2. Im Initialize des EIB hatte ich EIB_Attr natürlich NICHT drin...

Ergo - danke, hat funktioniert!

Grüße, Andi