From dfbfee30764dc990bfd5983d21a68375b567dc40 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sun, 17 Mar 2024 09:11:16 +0000 Subject: [PATCH] 98_structure.pm: add random as set "filter" (Forum #137517) git-svn-id: https://svn.fhem.de/fhem/trunk@28671 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_structure.pm | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/fhem/FHEM/98_structure.pm b/fhem/FHEM/98_structure.pm index 04ccec6f7..ef9344aa6 100644 --- a/fhem/FHEM/98_structure.pm +++ b/fhem/FHEM/98_structure.pm @@ -429,6 +429,21 @@ structure_Set($@) @devList = reverse @devList; } + if(@list > 1 && $list[$#list] =~ m/^random:(\d+)/) { #137517 + my $selCount = $1; + my $devCount = $#devList + 1; + $selCount = $devCount if ($selCount > $devCount || $selCount < 1); + my @selDev = @devList; + @devList = (); + for (1..$selCount) { + my $n = int(rand($devCount)); + redo if ($selDev[$n] eq ""); + push(@devList,$selDev[$n]); + $selDev[$n] = ""; + } + pop @list; + } + if($list[1] =~ m/^(save|restore)StructState$/) { return "Usage: set $me $list[1] readingName" if(@list != 3); return "Bad reading name $list[2]" if(!goodReadingName($list[2])); @@ -670,7 +685,9 @@ structure_Attr($@) propagated set for the attached devices like this: set <devN>:FILTER=<filter> <type-specific>
If the last set parameter is "reverse", then execute the set commands in - the reverse order. + the reverse order.
+ If the last set parameter is given as "random:4" only 4 structure members will + be selected randomly which will receive the given command.

@@ -899,15 +916,17 @@ structure_Attr($@)
Jedes andere set Kommando wird an alle Devices dieser Struktur weitergegeben.
- Aussnahme: das Attribut structexclude ist in einem Device definiert und + Ausnahme: das Attribut structexclude ist in einem Device definiert und dessen Attributwert matched als Regexp zum Namen der aktuellen Struktur.
Wenn das set Kommando diese Form hat set <structure> [FILTER=<filter>] <type-specific> wird - :FILTER=<filter> bei der Weitergebe der set an jeden Devicenamen wie + :FILTER=<filter> bei der Weitergabe der set an jeden Devicenamen wie folgt angehängt: set <devN>:FILTER=<filter> <type-specific>
Falls der letzte Parameter reverse ist, dann werden die Befehle in der - umgekehrten Reihenfolge ausgeführt. + umgekehrten Reihenfolge ausgeführt.
+ Falls der letzte Parameter dem Muster "random:4" entspricht, erhalten nur 4 + zufällig ausgewählte Devices den Befehl.