Status von weiteren Gruppen eines Device abrufen

Begonnen von thorte, 20 Dezember 2015, 17:52:55

Vorheriges Thema - Nächstes Thema

thorte

Hallo zusammen,

ich lese hier schon lange mit. Erst mal viel Lob an das Forum, hat mir schon bei vielen Problemen / Fragestellungen geholfen. Nun zu meinem Problem / Lösung:

Zu jedem Licht habe ich eine EIB-Gruppe für's Schalten und eine für den Status des Lichts angelegt. In den entsprechenden devices ist die "Schalten"-Gruppe als erstes und die "Status"-Gruppe als zweites definiert. Unter bestimmten Umständen (dimmen auf ganz dunkel) setzte ich via "set .... off g2" den Status auf aus, obwohl das Licht eigentlich an ist. Funktioniert soweit problemlos.

Um die "Status"-Gruppe wieder richten zu setzten, wenn der Lichtschalter betätigt wird, nutze ich den get-Befehl. "get ..." sendet allerdings die Anforderung nur an die erste Gruppe. Ich habe daher in der sub get analog der sub set bei die Möglichkeit eingebaut, auch die zweite Gruppe via nachgestelltem g2 abzurufen. Der Code:

sub
EIB_Get($@) {
my ($hash, @a, $str) = @_;
my $ret = undef;
my $na = int(@a);
my $value = $a[1];

#return "No get for dummies" if(IsDummy($hash->{NAME}));
return "" if($a[1] && $a[1] eq "?");  # Temporary hack for FHEMWEB

  my $groupnr = 1;

# the command can be send to any of the defined groups indexed starting by 1
# optional last argument starting with g indicates the group
# execute only for non-strings. Otherwise a "g" is interpreted to execute this group-send-mechanism...
if ($value ne "string")
{
$groupnr = $1 if($na=2 && $a[1]=~ m/g([0-9]*)/);
#return, if unknown group
return "groupnr $groupnr not known." if(!$hash->{CODE}{$groupnr});
}
my $groupcode = $hash->{CODE}{$groupnr};

  #send read-request to the bus
IOWrite($hash, "B", "r" . $groupcode);
 
# return "Current value for $hash->{NAME} ($groupcode) requested.";  
return $ret;
}


Würde mich freuen, wenn die Änderungen es in die offiziellen Updates schafft.

BTW: ich habe es nicht geschafft, an die zweite Gruppe eines devices via "value" und eventMap einen Wert zu senden. Mein Verdacht: Die Definition "/value g2:dim/" im eventMap führt dazu, dass aus einem "set ... dim 2" ein "set ... value g2 2" wird, was zu einem Fehler führt.

Grüße Thorsten

Andi291

Abend!

Schau ich mir bei Gelegenheit mal an...

Wenns läuft, sollte es kein Problem darstellen, das enzuchecken :-P

Grüße, Andi

Andi291

Abend!

Leicht modifiziert, getestet und eingecheckt. Machst den Thread bitte zu.

Grüße, Andi


thorte

Hi Andi,

hab das Thema nochmal geöffnet, das nach dem Einspielen der neue 10_EIB noch eine Frage zu deinen Änderungen aufgetaucht ist. Du hast den von mir auskommentierten return wieder reingenommen. Ich hatte die Zeile auskommentiert, da das return zu einem error-Reading in dem DOIF, in dem ich den get-Befehl aufrufe, führt. Aus welchem Grund wird die Rückgabe benötigt?

Gruß Thorsten

PS: Bin weder mit PERL noch mit dem Erstellen von Modulen für FHEM vertraut. Insofern kann es auch durchaus sein, dass die Frage eigentlich selbsterklärend ist.

Andi291

Abend!

Zwecks der Eindeutigkeit.
Wenn ich am debuggen / Fehlersuchen bin, helfen mir solche fehler allgemein. Kannst Du das in Deinem Aufruf umschiffen?

thorte

#6
n'Abend,

was meinst du mit "umschiffen"? DOIF scheint den return-Wert des Aufrufs direkt in ein error-Reading zu schreiben. Keine Ahnung, wie ich das verhindere. Die Funktionalität des DOIF ist dadurch nicht beeinflusst. Insofern je nach Betrachtungsweise vielleicht auch nur ein Schönheitsfehler. Wenn es Dir hilft, ich kann mit leben.

Gruß Thorsten#

Edit:

DOIF mit folgenden Eigenschaften:

Internals:
   CFGFN
   DEF        ([test:?on]) (
  get L.SZ.Decke.Schalten;
)

   NAME       di.test
   NR         158
   NTFY_ORDER 50-di.test
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-12-22 20:26:33   Device          test
     2015-12-22 20:26:33   cmd_event       test
     2015-12-22 20:26:33   cmd_nr          1
     2015-12-22 20:26:33   e_test_events   on
     2015-12-22 20:26:33   error             get L.SZ.Decke.Schalten;: Current value for L.SZ.Decke.Schalten (1402) requested.
     2015-12-22 20:26:33   state           cmd_1
   Condition:
     0          EventDoIf('test',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on')
   Devices:
     0           test
     all         test
   Do:
     0:
       0            get L.SZ.Decke.Schalten;
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev test
     triggerEvents:
       on
   Internals:
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
     all         test
Attributes:

getriggert über einen einfachen Dummy.

EventLog:

2015-12-22 20:26:33 DOIF di.test cmd_nr: 1
2015-12-22 20:26:33 DOIF di.test cmd_event: test
2015-12-22 20:26:33 DOIF di.test error:   get L.SZ.Decke.Schalten;: Current value for L.SZ.Decke.Schalten (1402) requested.
2015-12-22 20:26:33 DOIF di.test cmd_1
2015-12-22 20:26:33 dummy test on