98_structure.pm - reverse order

Begonnen von betateilchen, 19 Februar 2017, 19:22:28

Vorheriges Thema - Nächstes Thema

betateilchen

Hallo Rudi,

wenn ich eine structure mit drei Schaltaktoren definiere, werden bei einem "set <structureName> on" alle Aktoren sequentiell in der Reihenfolge geschaltet, in der sie im DEF der structure stehen. In manchen Fällen wünsche ich mir, mit "set <structureName> on reverse" die Reihenfolge zur Ausführung einfach umkehren zu können.

Aktueller Anwendungsfall ist ein langer Flur mit mehreren Deckenleuchten und je einem Bewegungsmelder an jedem Flurende. Die Leuchten sollen in Laufrichtung angeschaltet werden, je nachdem, welcher Bewegungsmelder den Schaltvorgang auslöst.

(ja ich weiß, ich könnte einfach zwei structures definieren...)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

quick and dirty...


Index: 98_structure.pm
===================================================================
--- 98_structure.pm     (Revision 13456)
+++ 98_structure.pm     (Arbeitskopie)
@@ -355,6 +355,8 @@
   my ($hash, @list) = @_;
   my $ret = "";
   my %pars;
+  my $reverse = ($list[-1] eq 'reverse');
+  undef($list[-1]) if $reverse;

   # see Forum # 28623 for .cachedHelp
   return $hash->{".cachedHelp"} if($list[1] eq "?" && $hash->{".cachedHelp"});
@@ -375,6 +377,7 @@

   my @devList = split("[ \t][ \t]*", $hash->{DEF});
   shift @devList;
+  @devList = reverse(@devList) if $reverse;
   foreach my $d (@devList) {
     next if(!$defs{$d});
     if($defs{$d}{INSET}) {
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

vorschlag zur syntax:

wenn man set <name> [revers] on verwendet wäre die syntax analog zu [FILTER=...]. damit sind die paramter die von der structure selber ausgewertet werden einheitlich in [] eingeschlossen und eindeutiger von den parameter zu unterscheiden die an die devices weiter gegeben werden.

ein patch würde dann so etwa so aussehen:

Index: 98_structure.pm
===================================================================
--- 98_structure.pm (revision 13449)
+++ 98_structure.pm (working copy)
@@ -355,6 +355,7 @@
   my ($hash, @list) = @_;
   my $ret = "";
   my %pars;
+  my $reverse;

   # see Forum # 28623 for .cachedHelp
   return $hash->{".cachedHelp"} if($list[1] eq "?" && $hash->{".cachedHelp"});
@@ -370,11 +371,17 @@
       delete($hash->{INSET}); # Experimental, Forum #35382
       $filter = $1;
       @list = split(" ", $list[0] ." ". substr($state, length($filter)+2));
+
+    } elsif($state =~ /^\[(reverse)]/) {
+      $reverse = 1;
+      @list = split(" ", $list[0] ." ". substr($state, length($1)+2));
+
     }
   }

   my @devList = split("[ \t][ \t]*", $hash->{DEF});
   shift @devList;
+  @devList = reverse(@devList) if $reverse;
   foreach my $d (@devList) {
     next if(!$defs{$d});
     if($defs{$d}{INSET}) {


noch schöner wäre wenn auch [revers;FILTER=...] möglich wäre. der patch wäre aber etwas aufwändiger.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

#3
Zitat von: justme1968 am 19 Februar 2017, 21:53:59
wenn man set <name> [reverse] on verwendet
...
noch schöner wäre wenn auch [reverse;FILTER=...] möglich wäre. der patch wäre aber etwas aufwändiger.

Genau deshalb hatte ich reverse einfach ans Ende gesetzt und dazugeschrieben "quick and dirty", damit muss man die Filter nicht anpassen ;)

Natürlich gibt es "schönere" Lösungen als meine, aber mein Hack funktioniert hier im Flur erstmal problemlos.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich habe die Version von betateilchen uebernommen, da [FILTER] an den einzelnen Geraete weitergereicht wird, reverse nicht.


betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!