mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 10:46:53 +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:
parent
297839f6ad
commit
784eb0c002
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user