From 0680c2352c53ba1ca6b7fc91364f3498803363ed Mon Sep 17 00:00:00 2001 From: justme-1968 Date: Wed, 20 Sep 2017 20:29:41 +0000 Subject: [PATCH] 31_LightScene.pm: added traversalOrder attribute git-svn-id: https://svn.fhem.de/fhem/trunk@15108 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/31_LightScene.pm | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/fhem/FHEM/31_LightScene.pm b/fhem/FHEM/31_LightScene.pm index 97244f8ec..7b11c7f47 100644 --- a/fhem/FHEM/31_LightScene.pm +++ b/fhem/FHEM/31_LightScene.pm @@ -29,7 +29,7 @@ sub LightScene_Initialize($) $hash->{SetFn} = "LightScene_Set"; $hash->{GetFn} = "LightScene_Get"; $hash->{AttrFn} = "LightScene_Attr"; - $hash->{AttrList} = "async_delay followDevices:1,2 lightSceneRestoreOnlyIfChanged:1,0 showDeviceCurrentState:1,0 switchingOrder ". $readingFnAttributes; + $hash->{AttrList} = "async_delay followDevices:1,2 lightSceneRestoreOnlyIfChanged:1,0 showDeviceCurrentState:1,0 switchingOrder traversalOrder ". $readingFnAttributes; $hash->{FW_detailFn} = "LightScene_detailFn"; $data{FWEXT}{"/LightScene"}{FUNC} = "LightScene_CGI"; #mod @@ -640,22 +640,31 @@ LightScene_Set($@) return undef; } elsif( $cmd eq 'nextScene' || $cmd eq 'previousScene' ) { - return "no scenes defined" if( $#sorted < 0 ); + my $sorted = \@sorted; + if( my $list = AttrVal($name, 'traversalOrder', undef ) ) { + my @parts = split( /[ ,\n]/, $list ); + $sorted = \@parts; + } + my $max = scalar @{$sorted}-1; + + return "no scenes defined" if( $max < 0 ); my $current = ReadingsVal( $name, 'state', '' ); - my( $index )= grep { $sorted[$_] eq $current } 0..$#sorted; + my( $index )= grep { $sorted->[$_] eq $current } 0..$max; $index = -1 if( !defined($index) ); ++$index if( $cmd eq 'nextScene' ); --$index if( $cmd eq 'previousScene' ); - return if( $scene && $scene eq 'nowrap' && $index > $#sorted ); + return if( $scene && $scene eq 'nowrap' && $index > $max ); return if( $scene && $scene eq 'nowrap' && $index < 0 ); - $index = 0 if( $index > $#sorted ); - $index = $#sorted if( $index < 0 ); + $index = 0 if( $index > $max ); + $index = $max if( $index < 0 ); $cmd = 'scene'; - $scene = $sorted[$index]; + $scene = $sorted->[$index]; + + return "no such scene: $scene" if( !defined $hash->{SCENES}{$scene} ); } @@ -1087,6 +1096,10 @@ LightScene_editTable($) { define media LightScene TV,DVD,Amplifier,masterPower
attr media switchingOrder .*On:masterPower,.* allOff:!.*,masterPower
+
  • traversalOrder
    + comma separated list of scene names that should be traversed by the prevoiusScene and nextScene commands.
    + default not set -> all scenes will be traversed in alphabetical order +
  • readingFnAttributes