FHEM Forum

FHEM - Hausautomations-Systeme => KNX/EIB => Thema gestartet von: thorte am 20 Dezember 2015, 17:52:55

Titel: Status von weiteren Gruppen eines Device abrufen
Beitrag von: thorte am 20 Dezember 2015, 17:52:55
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
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: Andi291 am 20 Dezember 2015, 19:08:44
Abend!

Schau ich mir bei Gelegenheit mal an...

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

Grüße, Andi
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: Andi291 am 21 Dezember 2015, 20:08:08
Abend!

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

Grüße, Andi
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: thorte am 22 Dezember 2015, 11:58:38
Danke
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: thorte am 22 Dezember 2015, 19:48:25
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.
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: Andi291 am 22 Dezember 2015, 19:50:23
Abend!

Zwecks der Eindeutigkeit.
Wenn ich am debuggen / Fehlersuchen bin, helfen mir solche fehler allgemein. Kannst Du das in Deinem Aufruf umschiffen?
Titel: Antw:Status von weiteren Gruppen eines Device abrufen
Beitrag von: thorte am 22 Dezember 2015, 20:12:52
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