From 53c9fdd3283f9afe446e0a705516c91bef018e30 Mon Sep 17 00:00:00 2001 From: justme-1968 Date: Tue, 29 Oct 2013 22:33:08 +0000 Subject: [PATCH] new gloab attribute lightSceneParamsToSave git-svn-id: https://svn.fhem.de/fhem/trunk@4130 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 3 ++ fhem/FHEM/31_LightScene.pm | 102 ++++++++++++++++++++++++++++++++++--- 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 829bba8dc..9fbca5996 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,6 +1,9 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. - SVN + - feature: LightScene: added attribute lightSceneParamsToSave for + device specific configuration of reading/command pairs + used to save/restore device state - feature: cmdalias added - feature: rain Module by baumrasen - feature: endPlotNow attribute for SVG-Plots (ChrisD) diff --git a/fhem/FHEM/31_LightScene.pm b/fhem/FHEM/31_LightScene.pm index 6bb81c423..53fe8130c 100644 --- a/fhem/FHEM/31_LightScene.pm +++ b/fhem/FHEM/31_LightScene.pm @@ -25,6 +25,8 @@ sub LightScene_Initialize($) $hash->{FW_detailFn} = "LightScene_detailFn"; + addToAttrList("lightSceneParamsToSave"); + eval "use JSON"; $LightScene_hasJSON = 0 if($@); } @@ -345,15 +347,69 @@ LightScene_Set($@) if( $cmd eq "save" ) { my $state = ""; + my $icon = undef; my $type = $defs{$d}->{TYPE}; $type = "" if( !defined($type) ); - if( $type eq 'CUL_HM' ) { - my $subtype = AttrVal($d,"subType",""); + if( my $toSave = AttrVal($d,"lightSceneParamsToSave","") ) { + if( $toSave =~ m/^{.*}$/) { + my $DEVICE = $d; + $toSave = eval $toSave; + $toSave = "state" if( $@ ); + } + my @sets = split(',', $toSave); + foreach my $set (@sets) { + my $saved = ""; + my @params = split(':', $set); + foreach my $param (@params) { + $saved .= " : " if( $saved ); + + my $use_get = 0; + my $get = $param; + my $regex; + my $set = $param; + + if( $param =~ /(get\s+)?(\S*)(\s*->\s*(set\s+)?)?(\S*)?/ ) { + $use_get = 1 if( $1 ); + $get = $2 if( $2 ); + $set = $5 if( $5 ); + } + ($get,$regex) = split('#', $get, 2); + $set = "state" if( $set eq "STATE" ); + + $saved .= "$set " if( $set ne "state" ); + + my $value; + if( $use_get ) { + $value = CommandGet( "", "$d $get" ); + } elsif( $get eq "STATE" ) { + $value = Value($d); + } else { + $value = ReadingsVal($d,$get,undef); + } + $value = eval $regex if( $regex ); + Log3 $hash, 2, "$name: $@" if($@); + $saved .= $value; + } + + if( !$state ) { + $state = $saved; + } else { + $state = [$state] if( ref($state) ne 'ARRAY' ); + push( @{$state}, $saved ); + } + } + } elsif( $type eq 'CUL_HM' ) { + #my $subtype = AttrVal($d,"subType",""); + my $subtype = CUL_HM_Get($defs{$d},$d,"param","subType"); if( $subtype eq "switch" ) { $state = Value($d); } elsif( $subtype eq "dimmer" ) { $state = Value($d); + if ( $state =~ m/^(\d+)/ ) { + $icon = $state; + $state = $1 if ( $state =~ m/^(\d+)/ ); + } } else { $state = Value($d); } @@ -391,7 +447,7 @@ LightScene_Set($@) $state = Value($d); } - if( $type eq "SWAP_0000002200000003" || $type eq "HUEDevice" ) { + if( $icon || ref($state) eq 'ARRAY' || $type eq "SWAP_0000002200000003" || $type eq "HUEDevice" ) { my %desc; $desc{state} = $state; my ($icon, $link, $isHtml) = FW_dev2image($d); @@ -410,8 +466,18 @@ LightScene_Set($@) my $state = $hash->{SCENES}{$scene}{$d}; $state = $state->{state} if( ref($state) eq 'HASH' ); - $ret .= " " if( $ret ); - $ret .= CommandSet(undef,"$d $state"); + if( ref($state) eq 'ARRAY' ) { + my $r = ""; + foreach my $entry (@{$state}) { + $r .= "," if( $ret ); + $r .= CommandSet(undef,"$d $entry"); + } + $ret .= " " if( $ret ); + $ret .= $r; + } else { + $ret .= " " if( $ret ); + $ret .= CommandSet(undef,"$d $state"); + } } else { $ret = "Unknown argument $cmd, choose one of save scene"; } @@ -454,7 +520,16 @@ LightScene_Get($@) my $state = $hash->{SCENES}{$scene}{$d}; $state = $state->{state} if( ref($state) eq 'HASH' ); - $ret .= $d .": ". $state ."\n"; + if( ref($state) eq 'ARRAY' ) { + my $r = ""; + foreach my $entry (@{$state}) { + $r .= ',' if( $r ); + $r .= $entry; + } + $ret .= $d .": $r\n"; + } else { + $ret .= $d .": $state\n"; + } } } else { $ret = "no scene <$scene> defined"; @@ -521,6 +596,21 @@ LightScene_Get($@)
  • scene <scene_name>

  • + + Attributes +
    =end html