Grüße,
ich habe mir dazu folgendes DOIF gebaut. Wichtiger Punkt war, dass ich die Telegramme pro Sekunde begrenzt habe. Sonst hat der Bus "busy" gemeldet.
Ein Voraussetzung für dieses DOIF ist, dass meine Devices alle mit nosuffix versehen sind.
Ich frage auch reine set-GAs und listenonly-GAs nicht ab.
Als Ergebnis bekommt man noch die Anzahl aller GAs und set, set/get, get, listenonly und vergessene nosuffix.
defmod di_KNX_Status_Aktualisierung DOIF ([$SELF:KNX_Aktualisierung] eq "on" and [?$SELF:KNX_Aktualisierung_Zustand] ne "WIP") {\
fhem("set $SELF KNX_Aktualisierung_Zustand WIP");;\
my @aKNXDevice=devspec2array("TYPE=KNX");;\
my $iDevGesamt=0;;\
my $iSleep=0;;\
my $iAnzGAget=0;;\
my $iAnzGAset=0;;\
my $iAnzGAlistenonly=0;;\
my $iAnzGAsetget=0;;\
my $iNosuffix=0;;\
my $TelegrammeProSek=5;;\
foreach my $KNXDevice (@aKNXDevice) {\
my $KNXDev=InternalVal($KNXDevice,'DEF','NIX');;\
my @aKNXAdress=split(/ /,$KNXDev);;\
my $iDev=0;;\
foreach my $KNXAdress (@aKNXAdress) {\
$iDev++;;\
$iDevGesamt++;;\
if ($KNXAdress !~ m/(\:set\:nosuffix|\:listenonly\:nosuffix)$/) {\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; get $KNXDevice g$iDev",1);;\
$iSleep++;;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageIst $iSleep",1);;\
if ($KNXAdress =~ m/(\:get\:nosuffix)$/) {\
$iAnzGAget++;;\
} elsif ($KNXAdress !~ m/(\:nosuffix)$/) {\
$iNosuffix++;;\
} else { $iAnzGAsetget++;; };;\
};;\
if ($KNXAdress =~ m/(\:set\:nosuffix)$/) { $iAnzGAset++;; };;\
if ($KNXAdress =~ m/(\:listenonly\:nosuffix)$/) { $iAnzGAlistenonly++;; };;\
};;\
};;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAget $iAnzGAget",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAset $iAnzGAset",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAlistenonly $iAnzGAlistenonly",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAsetget $iAnzGAsetget",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzNosuffixIst $iNosuffix",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageMax $iSleep",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageIst 0",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGA $iDevGesamt",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF KNX_Aktualisierung_Zustand bereit",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF KNX_Aktualisierung off",1);;\
} DOELSEIF ([$SELF:KNX_Aktualisierung] eq "off" and [?$SELF:KNX_Aktualisierung_Zustand] eq "WIP") (\
sleep 1;; set $SELF KNX_Aktualisierung on\
) DOELSEIF ([$SELF:KNX_Aktualisierung] eq "on" and [?$SELF:KNX_Aktualisierung_Zustand:sec] > 1200) (\
set $SELF KNX_Aktualisierung_Zustand bereit;; set $SELF KNX_Aktualisierung on\
)
attr di_KNX_Status_Aktualisierung do always
attr di_KNX_Status_Aktualisierung readingList KNX_Aktualisierung KNX_Aktualisierung_Zustand AnzAbfrageIst AnzAbfrageMax AnzGA AnzGAget AnzGAlistenonly AnzGAset AnzGAsetget AnzNosuffixIst
attr di_KNX_Status_Aktualisierung setList KNX_Aktualisierung:on,off KNX_Aktualisierung_Zustand:bereit,WIP
attr di_KNX_Status_Aktualisierung stateFormat state <br/> KNX_Aktualisierung_Zustand
attr di_KNX_Status_Aktualisierung userReadings ProzentAbfrage { if (ReadingsNum($NAME, 'AnzAbfrageMax', '') > 0) {int(100 * ReadingsNum($NAME, 'AnzAbfrageIst', '') / ReadingsNum($NAME, 'AnzAbfrageMax', ''))} else {0}}
attr di_KNX_Status_Aktualisierung webCmd KNX_Aktualisierung:ProzentAbfrage
attr di_KNX_Status_Aktualisierung widgetOverride ProzentAbfrage:slider,0,1,100