mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-21 07:56:03 +00:00
73_AutoShuttersControl: fix SelfDefense drive up then coming home at night
git-svn-id: https://svn.fhem.de/fhem/trunk@20705 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
cb5e8e7422
commit
5f4bed36f4
@ -1,5 +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.
|
||||||
|
- bugfix: 73_AutoShuttersControl: fix SelfDefense drive up then coming home
|
||||||
|
up at night
|
||||||
- feature: 30_HUEBridge, 31_HUEDevice: added deCONZ scenes (by shadowghost)
|
- feature: 30_HUEBridge, 31_HUEDevice: added deCONZ scenes (by shadowghost)
|
||||||
- feature: 14_SD_RSL.PM: support for setExtensions added
|
- feature: 14_SD_RSL.PM: support for setExtensions added
|
||||||
- change: 59_Weather: delete table options in commandref
|
- change: 59_Weather: delete table options in commandref
|
||||||
|
@ -184,6 +184,7 @@ GP_Export(
|
|||||||
qw(
|
qw(
|
||||||
Initialize
|
Initialize
|
||||||
ascAPIget
|
ascAPIget
|
||||||
|
DevStateIcon
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -363,11 +364,9 @@ sub Define($$) {
|
|||||||
if ( AttrVal( $name, 'room', 'none' ) eq 'none' );
|
if ( AttrVal( $name, 'room', 'none' ) eq 'none' );
|
||||||
CommandAttr( undef, $name . ' icon fts_shutter_automatic' )
|
CommandAttr( undef, $name . ' icon fts_shutter_automatic' )
|
||||||
if ( AttrVal( $name, 'icon', 'none' ) eq 'none' );
|
if ( AttrVal( $name, 'icon', 'none' ) eq 'none' );
|
||||||
|
|
||||||
CommandAttr( undef,
|
CommandAttr( undef,
|
||||||
$name
|
$name . ' devStateIcon { AutoShuttersControl_DevStateIcon($name) }' )
|
||||||
. ' devStateIcon selfDefense.terrace:fts_door_tilt created.new.drive.timer:clock .*asleep:scene_sleeping roommate.(awoken|home):user_available residents.(home|awoken):status_available manual:fts_shutter_manual selfDefense.active:status_locked selfDefense.inactive:status_open day.open:scene_day night.close:scene_night shading.in:weather_sun shading.out:weather_cloudy'
|
if ( AttrVal( $name, 'devStateIcon', 'none' ) eq 'none' );
|
||||||
) if ( AttrVal( $name, 'devStateIcon', 'none' ) eq 'none' );
|
|
||||||
|
|
||||||
addToAttrList('ASC:0,1,2');
|
addToAttrList('ASC:0,1,2');
|
||||||
|
|
||||||
@ -1392,9 +1391,10 @@ sub EventProcessingResidents($@) {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('selfDefense active');
|
$shutters->setLastDrive('selfDefense absent active');
|
||||||
$shutters->setSelfDefenseAbsent( 0, 1 )
|
$shutters->setSelfDefenseAbsent( 0, 1 )
|
||||||
; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen
|
; # der erste Wert ist ob der timer schon läuft, der zweite ist ob self defense aktiv ist durch die Bedingungen
|
||||||
|
$shutters->setSelfDefenseState(1);
|
||||||
$shutters->setDriveCmd( $shutters->getClosedPos );
|
$shutters->setDriveCmd( $shutters->getClosedPos );
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
@ -1421,7 +1421,8 @@ sub EventProcessingResidents($@) {
|
|||||||
$shutters->setHardLockOut('off');
|
$shutters->setHardLockOut('off');
|
||||||
if ( $shutters->getSelfDefenseMode ne 'off' ) {
|
if ( $shutters->getSelfDefenseMode ne 'off' ) {
|
||||||
|
|
||||||
$shutters->setLastDrive('selfDefense');
|
$shutters->setLastDrive('selfDefense gone active');
|
||||||
|
$shutters->setSelfDefenseState(1);
|
||||||
$shutters->setDriveCmd( $shutters->getClosedPos );
|
$shutters->setDriveCmd( $shutters->getClosedPos );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1448,6 +1449,7 @@ sub EventProcessingResidents($@) {
|
|||||||
and ( $getResidentsLastStatus ne 'asleep'
|
and ( $getResidentsLastStatus ne 'asleep'
|
||||||
or $getResidentsLastStatus ne 'awoken' )
|
or $getResidentsLastStatus ne 'awoken' )
|
||||||
and IsAfterShuttersTimeBlocking($shuttersDev)
|
and IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
|
and not $shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('residents come home');
|
$shutters->setLastDrive('residents come home');
|
||||||
@ -1465,6 +1467,7 @@ sub EventProcessingResidents($@) {
|
|||||||
and not $shutters->getShadingManualDriveStatus
|
and not $shutters->getShadingManualDriveStatus
|
||||||
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
and $shutters->getShuttersPlace eq 'terrace' )
|
and $shutters->getShuttersPlace eq 'terrace' )
|
||||||
|
and not $shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('shading in');
|
$shutters->setLastDrive('shading in');
|
||||||
@ -1479,6 +1482,7 @@ sub EventProcessingResidents($@) {
|
|||||||
and not $shutters->getShadingManualDriveStatus
|
and not $shutters->getShadingManualDriveStatus
|
||||||
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
and not( CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
and $shutters->getShuttersPlace eq 'terrace' )
|
and $shutters->getShuttersPlace eq 'terrace' )
|
||||||
|
and not $shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setLastDrive('shading out');
|
$shutters->setLastDrive('shading out');
|
||||||
@ -1490,7 +1494,7 @@ sub EventProcessingResidents($@) {
|
|||||||
and not $shutters->getIfInShading
|
and not $shutters->getIfInShading
|
||||||
and ( $getResidentsLastStatus eq 'gone'
|
and ( $getResidentsLastStatus eq 'gone'
|
||||||
or $getResidentsLastStatus eq 'absent' )
|
or $getResidentsLastStatus eq 'absent' )
|
||||||
and $shutters->getLastDrive eq 'selfDefense active'
|
and $shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
RemoveInternalTimer( $shutters->getSelfDefenseAbsentTimerhash )
|
RemoveInternalTimer( $shutters->getSelfDefenseAbsentTimerhash )
|
||||||
@ -1511,6 +1515,7 @@ sub EventProcessingResidents($@) {
|
|||||||
or $getModeUp eq 'off' )
|
or $getModeUp eq 'off' )
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$shutters->setSelfDefenseState(0);
|
||||||
$shutters->setLastDrive('selfDefense inactive');
|
$shutters->setLastDrive('selfDefense inactive');
|
||||||
$shutters->setDriveCmd(
|
$shutters->setDriveCmd(
|
||||||
(
|
(
|
||||||
@ -1529,6 +1534,7 @@ sub EventProcessingResidents($@) {
|
|||||||
or $getModeUp eq 'always' )
|
or $getModeUp eq 'always' )
|
||||||
and IsAfterShuttersTimeBlocking($shuttersDev)
|
and IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
and not $shutters->getIfInShading
|
and not $shutters->getIfInShading
|
||||||
|
and not $shutters->getSelfDefenseState
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( $getResidentsLastStatus eq 'asleep'
|
if ( $getResidentsLastStatus eq 'asleep'
|
||||||
@ -1996,19 +2002,19 @@ sub EventProcessingBrightness($@) {
|
|||||||
|
|
||||||
$shutters->setLastDrive($lastDrive);
|
$shutters->setLastDrive($lastDrive);
|
||||||
|
|
||||||
if ( $shutters->getPrivacyDownStatus != 2
|
if (
|
||||||
and $posValue != $shutters->getStatus )
|
$shutters->getPrivacyDownStatus != 2
|
||||||
|
and ( $posValue != $shutters->getStatus
|
||||||
|
or $shutters->getSelfDefenseState )
|
||||||
|
)
|
||||||
{
|
{
|
||||||
print( 'ASC_DEBUG!!! PrivacyStatus_2: '
|
|
||||||
. $shutters->getPrivacyDownStatus
|
|
||||||
. ' Innerhalb der unless Abfrage'
|
|
||||||
. "\n" );
|
|
||||||
$shutters->setSunrise(0);
|
$shutters->setSunrise(0);
|
||||||
$shutters->setSunset(1);
|
$shutters->setSunset(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$shutters->setPrivacyDownStatus(0)
|
$shutters->setPrivacyDownStatus(0)
|
||||||
if ( $shutters->getPrivacyDownStatus == 2 );
|
if ( $shutters->getPrivacyDownStatus == 2
|
||||||
|
and $shutters->getSunset );
|
||||||
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
|
ShuttersCommandSet( $hash, $shuttersDev, $posValue );
|
||||||
|
|
||||||
ASC_Debug( 'EventProcessingBrightness: '
|
ASC_Debug( 'EventProcessingBrightness: '
|
||||||
@ -4244,6 +4250,62 @@ sub _IsAdv {
|
|||||||
return $adv;
|
return $adv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub DevStateIcon($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
$hash = $defs{$hash} if ( ref($hash) ne 'HASH' );
|
||||||
|
|
||||||
|
return undef if ( !$hash );
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
if ( ReadingsVal( $name, 'state', undef ) eq 'created new drive timer' ) {
|
||||||
|
return '.*:clock';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'selfDefense terrace' ) {
|
||||||
|
return '.*:fts_door_tilt';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) =~ /.*asleep$/ ) {
|
||||||
|
return '.*:scene_sleeping';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) =~ /^roommate.(awoken|home)$/ )
|
||||||
|
{
|
||||||
|
return '.*:user_available';
|
||||||
|
}
|
||||||
|
elsif (
|
||||||
|
ReadingsVal( $name, 'state', undef ) =~ /^residents.(home|awoken)$/ )
|
||||||
|
{
|
||||||
|
return '.*:status_available';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'manual' ) {
|
||||||
|
return '.*:fts_shutter_manual';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'selfDefense inactive' ) {
|
||||||
|
return '.*:status_open';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) =~ /^selfDefense.*.active$/ ) {
|
||||||
|
return '.*:status_locked';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'day open' ) {
|
||||||
|
return '.*:scene_day';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'night close' ) {
|
||||||
|
return '.*:scene_night';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'shading in' ) {
|
||||||
|
return '.*:fts_shutter_shadding_run';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'shading out' ) {
|
||||||
|
return '.*:fts_shutter_shadding_stop';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) eq 'active' ) {
|
||||||
|
return '.*:hourglass';
|
||||||
|
}
|
||||||
|
elsif ( ReadingsVal( $name, 'state', undef ) =~ /.*privacy.*/ ) {
|
||||||
|
return '.*:fts_shutter_50';
|
||||||
|
}
|
||||||
|
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
######################################
|
######################################
|
||||||
######################################
|
######################################
|
||||||
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
|
########## Begin der Klassendeklarierungen für OOP (Objektorientierte Programmierung) #########################
|
||||||
@ -4352,7 +4414,8 @@ sub setDriveCmd {
|
|||||||
or ( $shutters->getAdv
|
or ( $shutters->getAdv
|
||||||
and not $shutters->getQueryShuttersPos($posValue)
|
and not $shutters->getQueryShuttersPos($posValue)
|
||||||
and not $shutters->getAdvDelay
|
and not $shutters->getAdvDelay
|
||||||
and not $shutters->getExternalTriggerState)
|
and not $shutters->getExternalTriggerState
|
||||||
|
and not $shutters->getSelfDefenseState )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$shutters->setDelayCmd($posValue);
|
$shutters->setDelayCmd($posValue);
|
||||||
@ -4403,7 +4466,7 @@ sub setDriveCmd {
|
|||||||
if ( $shutters->getSelfDefenseAbsent
|
if ( $shutters->getSelfDefenseAbsent
|
||||||
and not $shutters->getSelfDefenseAbsentTimerrun
|
and not $shutters->getSelfDefenseAbsentTimerrun
|
||||||
and $shutters->getSelfDefenseMode ne 'off'
|
and $shutters->getSelfDefenseMode ne 'off'
|
||||||
and $shutters->getLastDrive eq 'selfDefense active'
|
and $shutters->getSelfDefenseState
|
||||||
and $ascDev->getSelfDefense eq 'on' )
|
and $ascDev->getSelfDefense eq 'on' )
|
||||||
{
|
{
|
||||||
InternalTimer(
|
InternalTimer(
|
||||||
@ -4563,6 +4626,13 @@ sub setPrivacyUpStatus {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub setSelfDefenseState {
|
||||||
|
my ( $self, $value ) = @_;
|
||||||
|
|
||||||
|
$self->{ $self->{shuttersDev} }{selfDefenseState} = $value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sub setAdvDelay {
|
sub setAdvDelay {
|
||||||
my ( $self, $advDelay ) = @_;
|
my ( $self, $advDelay ) = @_;
|
||||||
|
|
||||||
@ -4673,6 +4743,14 @@ sub getNoDelay {
|
|||||||
return $self->{ $self->{shuttersDev} }{noDelay};
|
return $self->{ $self->{shuttersDev} }{noDelay};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub getSelfDefenseState {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return $self->{ $self->{shuttersDev} }{selfDefenseState}
|
||||||
|
if ( defined( $self->{ $self->{shuttersDev} }{selfDefenseState} ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
sub getSelfDefenseAbsent {
|
sub getSelfDefenseAbsent {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
@ -5744,8 +5822,15 @@ sub getExternalTriggerPosInactive {
|
|||||||
sub getExternalTriggerState {
|
sub getExternalTriggerState {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ( (defined($self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event})
|
return (
|
||||||
and $self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}) ? 1 : 0 );
|
(
|
||||||
|
defined(
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
|
||||||
|
)
|
||||||
|
and
|
||||||
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{event}
|
||||||
|
) ? 1 : 0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getDelay {
|
sub getDelay {
|
||||||
@ -7812,7 +7897,7 @@ sub getblockAscDrivesAfterManual {
|
|||||||
],
|
],
|
||||||
"release_status": "under develop",
|
"release_status": "under develop",
|
||||||
"license": "GPL_2",
|
"license": "GPL_2",
|
||||||
"version": "v0.8.6",
|
"version": "v0.8.7",
|
||||||
"author": [
|
"author": [
|
||||||
"Marko Oldenburg <leongaultier@gmail.com>"
|
"Marko Oldenburg <leongaultier@gmail.com>"
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user