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:
parent
297839f6ad
commit
784eb0c002
@ -1,6 +1,7 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# 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.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
- SVN
|
- SVN
|
||||||
|
- feature: LightScene: added attribute lightSceneRestoreOnlyIfChanged
|
||||||
- bugfix: SYSMON: Fix: CPUTemp & BogoMIPS for utilite-Box.
|
- bugfix: SYSMON: Fix: CPUTemp & BogoMIPS for utilite-Box.
|
||||||
- bugfix: PRESENCE: fix present-check-interval to be equal with normal
|
- bugfix: PRESENCE: fix present-check-interval to be equal with normal
|
||||||
check-interval if not set in define statement and not 30 sec.
|
check-interval if not set in define statement and not 30 sec.
|
||||||
|
@ -30,6 +30,7 @@ sub LightScene_Initialize($)
|
|||||||
$hash->{FW_detailFn} = "LightScene_detailFn";
|
$hash->{FW_detailFn} = "LightScene_detailFn";
|
||||||
|
|
||||||
addToAttrList("lightSceneParamsToSave");
|
addToAttrList("lightSceneParamsToSave");
|
||||||
|
addToAttrList("lightSceneRestoreOnlyIfChanged:1,0");
|
||||||
|
|
||||||
eval "use JSON";
|
eval "use JSON";
|
||||||
$LightScene_hasJSON = 0 if($@);
|
$LightScene_hasJSON = 0 if($@);
|
||||||
@ -381,51 +382,11 @@ LightScene_Load($)
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub
|
sub
|
||||||
LightScene_Set($@)
|
LightScene_SaveDevice($$)
|
||||||
{
|
{
|
||||||
my ($hash, $name, $cmd, $scene, @a) = @_;
|
my($hash,$d) = @_;
|
||||||
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 = "";
|
my $state = "";
|
||||||
my $icon = undef;
|
my $icon = undef;
|
||||||
my $type = $defs{$d}->{TYPE};
|
my $type = $defs{$d}->{TYPE};
|
||||||
@ -470,7 +431,7 @@ LightScene_Set($@)
|
|||||||
$value = ReadingsVal($d,$get,undef);
|
$value = ReadingsVal($d,$get,undef);
|
||||||
}
|
}
|
||||||
$value = eval $regex if( $regex );
|
$value = eval $regex if( $regex );
|
||||||
Log3 $hash, 2, "$name: $@" if($@);
|
Log3 $hash, 2, "$hash->{NAME}: $@" if($@);
|
||||||
$saved .= $value;
|
$saved .= $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,6 +490,77 @@ LightScene_Set($@)
|
|||||||
$state = Value($d);
|
$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" ) {
|
if( $icon || ref($state) eq 'ARRAY' || $type eq "SWAP_0000002200000003" || $type eq "HUEDevice" ) {
|
||||||
my %desc;
|
my %desc;
|
||||||
$desc{state} = $state;
|
$desc{state} = $state;
|
||||||
@ -552,21 +584,13 @@ LightScene_Set($@)
|
|||||||
my $r = "";
|
my $r = "";
|
||||||
foreach my $entry (@{$state}) {
|
foreach my $entry (@{$state}) {
|
||||||
$r .= "," if( $ret );
|
$r .= "," if( $ret );
|
||||||
if( $entry =~m/^;/ ) {
|
$r .= LightScene_RestoreDevice($hash,$d,$entry);
|
||||||
$r .= AnalyzeCommandChain(undef,"$entry");
|
|
||||||
} else {
|
|
||||||
$r .= CommandSet(undef,"$d $entry");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$ret .= " " if( $ret );
|
$ret .= " " if( $ret );
|
||||||
$ret .= $r;
|
$ret .= $r;
|
||||||
} else {
|
} else {
|
||||||
$ret .= " " if( $ret );
|
$ret .= " " if( $ret );
|
||||||
if( $state =~m/^;/ ) {
|
$ret .= LightScene_RestoreDevice($hash,$d,$state);
|
||||||
$ret .= AnalyzeCommandChain(undef,"$state");
|
|
||||||
} else {
|
|
||||||
$ret .= CommandSet(undef,"$d $state");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$ret = "Unknown argument $cmd, choose one of save scene";
|
$ret = "Unknown argument $cmd, choose one of save scene";
|
||||||
@ -696,6 +720,11 @@ LightScene_Get($@)
|
|||||||
<a name="LightScene_Attr"></a>
|
<a name="LightScene_Attr"></a>
|
||||||
<b>Attributes</b>
|
<b>Attributes</b>
|
||||||
<ul>
|
<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>
|
<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
|
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
|
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