2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

added lightSceneRestoreOnlyIfChanged attribute

git-svn-id: https://svn.fhem.de/fhem/trunk@4832 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
justme-1968 2014-02-07 09:58:11 +00:00
parent 297839f6ad
commit 784eb0c002
2 changed files with 145 additions and 115 deletions

View File

@ -1,6 +1,7 @@
# 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 lightSceneRestoreOnlyIfChanged
- bugfix: SYSMON: Fix: CPUTemp & BogoMIPS for utilite-Box.
- bugfix: PRESENCE: fix present-check-interval to be equal with normal
check-interval if not set in define statement and not 30 sec.

View File

@ -30,6 +30,7 @@ sub LightScene_Initialize($)
$hash->{FW_detailFn} = "LightScene_detailFn";
addToAttrList("lightSceneParamsToSave");
addToAttrList("lightSceneRestoreOnlyIfChanged:1,0");
eval "use JSON";
$LightScene_hasJSON = 0 if($@);
@ -381,51 +382,11 @@ LightScene_Load($)
return undef;
}
sub
LightScene_Set($@)
LightScene_SaveDevice($$)
{
my ($hash, $name, $cmd, $scene, @a) = @_;
my $ret = "";
my($hash,$d) = @_;
if( !defined($cmd) ){ return "$name: set needs at least one parameter" };
if( $cmd eq "?" ){ return "Unknown argument ?, choose one of remove:".join(",", sort keys %{$hash->{SCENES}}) ." save set setcmd scene:".join(",", sort keys %{$hash->{SCENES}})};
if( $cmd eq "save" && !defined( $scene ) ) { return "Usage: set $name save <scene_name>" };
if( $cmd eq "scene" && !defined( $scene ) ) { return "Usage: set $name scene <scene_name>" };
if( $cmd eq "remove" && !defined( $scene ) ) { return "Usage: set $name remove <scene_name>" };
if( $cmd eq "remove" ) {
delete( $hash->{SCENES}{$scene} );
return undef;
} elsif( $cmd eq "set" || $cmd eq "setcmd" ) {
my ($d, @args) = @a;
if( !defined( $scene ) || !defined( $d ) ) { return "Usage: set $name set <scene_name> <device> [<cmd>]" };
return "no stored scene >$scene<" if( !defined($hash->{SCENES}{$scene} ) );
#return "device >$d< is not a member of scene >$scene<" if( !defined($hash->{CONTENT}{$d} ) );
if( !@args ) {
delete $hash->{SCENES}{$scene}{$d};
} else {
$hash->{SCENES}{$scene}{$d} = (($cmd eq "setcmd")?';':''). join(" ", @args);
}
return undef;
}
$hash->{INSET} = 1;
foreach my $d (sort keys %{ $hash->{CONTENT} }) {
next if(!$defs{$d});
if($defs{$d}{INSET}) {
Log3 $name, 1, "ERROR: endless loop detected for $d in " . $hash->{NAME};
next;
}
if( $cmd eq "save" ) {
my $state = "";
my $icon = undef;
my $type = $defs{$d}->{TYPE};
@ -470,7 +431,7 @@ LightScene_Set($@)
$value = ReadingsVal($d,$get,undef);
}
$value = eval $regex if( $regex );
Log3 $hash, 2, "$name: $@" if($@);
Log3 $hash, 2, "$hash->{NAME}: $@" if($@);
$saved .= $value;
}
@ -529,6 +490,77 @@ LightScene_Set($@)
$state = Value($d);
}
return($state,$icon,$type);
}
sub
LightScene_RestoreDevice($$$)
{
my($hash,$d,$cmd) = @_;
if( AttrVal($d,"lightSceneRestoreOnlyIfChanged", AttrVal($hash->{NAME},"lightSceneRestoreOnlyIfChanged",0) ) > 0 )
{
my($state,undef,undef) = LightScene_SaveDevice($hash,$d);
return "" if( $state eq $cmd );
}
my $ret;
if( $cmd =~m/^;/ ) {
$ret = AnalyzeCommandChain(undef,"$cmd");
} else {
$ret = CommandSet(undef,"$d $cmd");
}
return $ret;
}
sub
LightScene_Set($@)
{
my ($hash, $name, $cmd, $scene, @a) = @_;
my $ret = "";
if( !defined($cmd) ){ return "$name: set needs at least one parameter" };
if( $cmd eq "?" ){ return "Unknown argument ?, choose one of remove:".join(",", sort keys %{$hash->{SCENES}}) ." save set setcmd scene:".join(",", sort keys %{$hash->{SCENES}})};
if( $cmd eq "save" && !defined( $scene ) ) { return "Usage: set $name save <scene_name>" };
if( $cmd eq "scene" && !defined( $scene ) ) { return "Usage: set $name scene <scene_name>" };
if( $cmd eq "remove" && !defined( $scene ) ) { return "Usage: set $name remove <scene_name>" };
if( $cmd eq "remove" ) {
delete( $hash->{SCENES}{$scene} );
return undef;
} elsif( $cmd eq "set" || $cmd eq "setcmd" ) {
my ($d, @args) = @a;
if( !defined( $scene ) || !defined( $d ) ) { return "Usage: set $name set <scene_name> <device> [<cmd>]" };
return "no stored scene >$scene<" if( !defined($hash->{SCENES}{$scene} ) );
#return "device >$d< is not a member of scene >$scene<" if( !defined($hash->{CONTENT}{$d} ) );
if( !@args ) {
delete $hash->{SCENES}{$scene}{$d};
} else {
$hash->{SCENES}{$scene}{$d} = (($cmd eq "setcmd")?';':''). join(" ", @args);
}
return undef;
}
$hash->{INSET} = 1;
foreach my $d (sort keys %{ $hash->{CONTENT} }) {
next if(!$defs{$d});
if($defs{$d}{INSET}) {
Log3 $name, 1, "ERROR: endless loop detected for $d in " . $hash->{NAME};
next;
}
if( $cmd eq "save" ) {
my($state,$icon,$type) = LightScene_SaveDevice($hash,$d);
if( $icon || ref($state) eq 'ARRAY' || $type eq "SWAP_0000002200000003" || $type eq "HUEDevice" ) {
my %desc;
$desc{state} = $state;
@ -552,21 +584,13 @@ LightScene_Set($@)
my $r = "";
foreach my $entry (@{$state}) {
$r .= "," if( $ret );
if( $entry =~m/^;/ ) {
$r .= AnalyzeCommandChain(undef,"$entry");
} else {
$r .= CommandSet(undef,"$d $entry");
}
$r .= LightScene_RestoreDevice($hash,$d,$entry);
}
$ret .= " " if( $ret );
$ret .= $r;
} else {
$ret .= " " if( $ret );
if( $state =~m/^;/ ) {
$ret .= AnalyzeCommandChain(undef,"$state");
} else {
$ret .= CommandSet(undef,"$d $state");
}
$ret .= LightScene_RestoreDevice($hash,$d,$state);
}
} else {
$ret = "Unknown argument $cmd, choose one of save scene";
@ -696,6 +720,11 @@ LightScene_Get($@)
<a name="LightScene_Attr"></a>
<b>Attributes</b>
<ul>
<li>lightSceneRestoreOnlyIfChanged<br>
this attribute can be set on the lightscene and/or on the individual devices included in a scene.
the device settings have precedence over the scene setting.<br>
1 -> for each device do nothing if current device state is the same as the saved state
0 -> always set the state even if the current state is the same as the saved state. this is the default</li>
<li>lightSceneParamsToSave<br>
this attribute can be set on the devices to be included in a scene. it is set to a comma separated list of readings
that will be saved. multiple readings separated by : are collated in to a single set command (this has to be supported