add setter for commandref, fix roomate fn if roommate come home and shading active
This commit is contained in:
parent
8d748b65ce
commit
7a60b04777
@ -1166,11 +1166,11 @@ sub Initialize {
|
|||||||
<tr><td>BlockingTimeBeforNightClose</td><td>setzt den Wert in Sekunden zur Blockade vor der Nachtfahrt</tr>
|
<tr><td>BlockingTimeBeforNightClose</td><td>setzt den Wert in Sekunden zur Blockade vor der Nachtfahrt</tr>
|
||||||
<tr><td>BlockingTimeBeforDayOpen</td><td>setzt den Wert in Sekunden zur Blockade vor der Tagfahrt</tr>
|
<tr><td>BlockingTimeBeforDayOpen</td><td>setzt den Wert in Sekunden zur Blockade vor der Tagfahrt</tr>
|
||||||
<tr><td>PosCmd</td><td>setzt den Readingnamen zur Positionserkennung des Rollos</tr>
|
<tr><td>PosCmd</td><td>setzt den Readingnamen zur Positionserkennung des Rollos</tr>
|
||||||
<tr><td>OpenPos</td><td>setzt den Wert für die offen Position</tr>
|
<tr><td>OpenPos</td><td>setzt den Wert für die offen Position</tr>
|
||||||
<tr><td>VentilatePos</td><td> </tr>
|
<tr><td>VentilatePos</td><td>setzt den Wert für die ventilate Position</tr>
|
||||||
<tr><td>VentilatePosAfterDayClosed</td><td> </tr>
|
<tr><td>VentilatePosAfterDayClosed</td><td>was soll passieren wenn am Tag das Fenster geschlossen wird - open/lastManual</tr>
|
||||||
<tr><td>ClosedPos</td><td> </tr>
|
<tr><td>ClosedPos</td><td>setzt den Wert für die geschlossen Position</tr>
|
||||||
<tr><td>SleepPos</td><td> </tr>
|
<tr><td>SleepPos</td><td>setzt den Wert für die schlafen Position</tr>
|
||||||
<tr><td>VentilateOpen</td><td> </tr>
|
<tr><td>VentilateOpen</td><td> </tr>
|
||||||
<tr><td>ComfortOpenPos</td><td> </tr>
|
<tr><td>ComfortOpenPos</td><td> </tr>
|
||||||
<tr><td>PartyMode</td><td> </tr>
|
<tr><td>PartyMode</td><td> </tr>
|
||||||
@ -1288,7 +1288,7 @@ sub Initialize {
|
|||||||
],
|
],
|
||||||
"release_status": "testing",
|
"release_status": "testing",
|
||||||
"license": "GPL_2",
|
"license": "GPL_2",
|
||||||
"version": "v0.9.22",
|
"version": "v0.9.23",
|
||||||
"author": [
|
"author": [
|
||||||
"Marko Oldenburg <leongaultier@gmail.com>"
|
"Marko Oldenburg <leongaultier@gmail.com>"
|
||||||
],
|
],
|
||||||
|
@ -1338,6 +1338,20 @@ sub EventProcessingRoommate {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
|
$shutters->getIsDay
|
||||||
|
&& $shutters->getIfInShading
|
||||||
|
&& $shutters->getStatus != $shutters->getShadingPos
|
||||||
|
&& !$shutters->getShadingManualDriveStatus
|
||||||
|
&& !(
|
||||||
|
CheckIfShuttersWindowRecOpen($shuttersDev) == 2
|
||||||
|
&& $shutters->getShuttersPlace eq 'terrace'
|
||||||
|
)
|
||||||
|
&& !$shutters->getSelfDefenseState
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ShadingProcessingDriveCommand( $hash, $shuttersDev );
|
||||||
|
}
|
||||||
|
elsif (
|
||||||
!$shutters->getIsDay
|
!$shutters->getIsDay
|
||||||
&& IsAfterShuttersTimeBlocking($shuttersDev)
|
&& IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
&& ( $getModeDown eq 'home'
|
&& ( $getModeDown eq 'home'
|
||||||
@ -1372,6 +1386,7 @@ sub EventProcessingRoommate {
|
|||||||
&& IsAfterShuttersTimeBlocking($shuttersDev)
|
&& IsAfterShuttersTimeBlocking($shuttersDev)
|
||||||
&& ( $getModeUp eq 'home'
|
&& ( $getModeUp eq 'home'
|
||||||
|| $getModeUp eq 'always' )
|
|| $getModeUp eq 'always' )
|
||||||
|
&& !$shutters->getIfInShading
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( $shutters->getIfInShading
|
if ( $shutters->getIfInShading
|
||||||
@ -4625,10 +4640,9 @@ sub _SetCmdFn {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $ascDev->getSlatDriveCmdInverse
|
if ( $ascDev->getSlatDriveCmdInverse
|
||||||
&& $slatPos > -1
|
&& $slatPos > -1
|
||||||
&& $shutters->getSlatPosCmd ne 'none'
|
&& $shutters->getSlatPosCmd ne 'none' )
|
||||||
)
|
|
||||||
{
|
{
|
||||||
CommandSet(
|
CommandSet(
|
||||||
undef,
|
undef,
|
||||||
@ -4640,7 +4654,7 @@ sub _SetCmdFn {
|
|||||||
. ' '
|
. ' '
|
||||||
. $shutters->getSlatPosCmd . ' '
|
. $shutters->getSlatPosCmd . ' '
|
||||||
. $slatPos
|
. $slatPos
|
||||||
);
|
);
|
||||||
|
|
||||||
InternalTimer(
|
InternalTimer(
|
||||||
gettimeofday() + 3,
|
gettimeofday() + 3,
|
||||||
@ -4653,7 +4667,7 @@ sub _SetCmdFn {
|
|||||||
. $driveCommand );
|
. $driveCommand );
|
||||||
},
|
},
|
||||||
$shuttersDev
|
$shuttersDev
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CommandSet( undef,
|
CommandSet( undef,
|
||||||
@ -4679,7 +4693,7 @@ sub _SetCmdFn {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
$shuttersDev
|
$shuttersDev
|
||||||
)
|
)
|
||||||
if ( $slatPos > -1
|
if ( $slatPos > -1
|
||||||
&& $shutters->getSlatPosCmd ne 'none' );
|
&& $shutters->getSlatPosCmd ne 'none' );
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,8 @@ package FHEM::Automation::ShuttersControl::Dev;
|
|||||||
use FHEM::Automation::ShuttersControl::Dev::Readings;
|
use FHEM::Automation::ShuttersControl::Dev::Readings;
|
||||||
use FHEM::Automation::ShuttersControl::Dev::Attr;
|
use FHEM::Automation::ShuttersControl::Dev::Attr;
|
||||||
|
|
||||||
our @ISA = qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr);
|
our @ISA =
|
||||||
|
qw(FHEM::Automation::ShuttersControl::Dev::Readings FHEM::Automation::ShuttersControl::Dev::Attr);
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
@ -79,5 +80,4 @@ sub getName {
|
|||||||
return $self->{name};
|
return $self->{name};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -223,8 +223,8 @@ sub _getResidentsDev {
|
|||||||
&& ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
|
&& ( gettimeofday() - $self->{ASC_residentsDev}->{LASTGETTIME} ) < 2 );
|
||||||
$self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
|
$self->{ASC_residentsDev}->{LASTGETTIME} = int( gettimeofday() );
|
||||||
my ( $device, $reading ) =
|
my ( $device, $reading ) =
|
||||||
FHEM::Automation::ShuttersControl::GetAttrValues( $name, 'ASC_residentsDev',
|
FHEM::Automation::ShuttersControl::GetAttrValues( $name,
|
||||||
'none' );
|
'ASC_residentsDev', 'none' );
|
||||||
|
|
||||||
$self->{ASC_residentsDev}->{device} = $device;
|
$self->{ASC_residentsDev}->{device} = $device;
|
||||||
$self->{ASC_residentsDev}->{reading} =
|
$self->{ASC_residentsDev}->{reading} =
|
||||||
@ -272,7 +272,9 @@ sub _getRainSensor {
|
|||||||
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
|
: ( $self->{ASC_rainSensor}->{triggermax} * 0 )
|
||||||
);
|
);
|
||||||
$self->{ASC_rainSensor}->{shuttersClosedPos} =
|
$self->{ASC_rainSensor}->{shuttersClosedPos} =
|
||||||
( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getClosedPos );
|
( $pos ne 'none'
|
||||||
|
? $pos
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getClosedPos );
|
||||||
$self->{ASC_rainSensor}->{waitingTime} =
|
$self->{ASC_rainSensor}->{waitingTime} =
|
||||||
( $pos ne 'none' ? $wait : 900 );
|
( $pos ne 'none' ? $wait : 900 );
|
||||||
|
|
||||||
@ -384,5 +386,4 @@ sub getBlockAscDrivesAfterManual {
|
|||||||
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
|
return AttrVal( $name, 'ASC_blockAscDrivesAfterManual', 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -62,9 +62,13 @@ sub setDelayCmdReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate( $hash,
|
readingsSingleUpdate(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastDelayPosValue',
|
$hash,
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getDelayCmd, 1 );
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. '_lastDelayPosValue',
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getDelayCmd,
|
||||||
|
1
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,8 +79,15 @@ sub setStateReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate( $hash, 'state',
|
readingsSingleUpdate(
|
||||||
( defined($value) ? $value : $FHEM::Automation::ShuttersControl::shutters->getLastDrive ), 1 );
|
$hash, 'state',
|
||||||
|
(
|
||||||
|
defined($value)
|
||||||
|
? $value
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getLastDrive
|
||||||
|
),
|
||||||
|
1
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,8 +97,13 @@ sub setPosReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_PosValue',
|
readingsSingleUpdate(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getStatus, 1 );
|
$hash,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. '_PosValue',
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getStatus,
|
||||||
|
1
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,8 +113,13 @@ sub setLastPosReading {
|
|||||||
my $name = $self->{name};
|
my $name = $self->{name};
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
readingsSingleUpdate( $hash, $FHEM::Automation::ShuttersControl::shutters->getShuttersDev . '_lastPosValue',
|
readingsSingleUpdate(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getLastPos, 1 );
|
$hash,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
|
. '_lastPosValue',
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getLastPos,
|
||||||
|
1
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +159,9 @@ sub getMonitoredDevs {
|
|||||||
sub getOutTemp {
|
sub getOutTemp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTempSensor, $FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
|
return ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getTempSensor,
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->getTempSensorReading,
|
||||||
-100 );
|
-100 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +169,8 @@ sub getResidentsStatus {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val =
|
my $val =
|
||||||
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, $FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
|
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->getResidentsReading,
|
||||||
'none' );
|
'none' );
|
||||||
|
|
||||||
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
||||||
@ -154,8 +178,10 @@ sub getResidentsStatus {
|
|||||||
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'homealoneType', '-' ) eq
|
ReadingsVal(
|
||||||
'PET' )
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
|
'homealoneType', '-' ) eq 'PET'
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return ( 'pet', 'absent' ) if (wantarray);
|
return ( 'pet', 'absent' ) if (wantarray);
|
||||||
return 'absent';
|
return 'absent';
|
||||||
@ -169,15 +195,19 @@ sub getResidentsStatus {
|
|||||||
sub getResidentsLastStatus {
|
sub getResidentsLastStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $val = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastState', 'none' );
|
my $val =
|
||||||
|
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
|
'lastState', 'none' );
|
||||||
|
|
||||||
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
if ( $val =~ m{^(?:(.+)_)?(.+)$}xms ) {
|
||||||
return ( $1, $2 ) if (wantarray);
|
return ( $1, $2 ) if (wantarray);
|
||||||
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
return $1 && $1 eq 'pet' ? 'absent' : $2;
|
||||||
}
|
}
|
||||||
elsif (
|
elsif (
|
||||||
ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev, 'lastHomealoneType', '-' ) eq
|
ReadingsVal(
|
||||||
'PET' )
|
$FHEM::Automation::ShuttersControl::ascDev->_getResidentsDev,
|
||||||
|
'lastHomealoneType', '-' ) eq 'PET'
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return ( 'pet', 'absent' ) if (wantarray);
|
return ( 'pet', 'absent' ) if (wantarray);
|
||||||
return 'absent';
|
return 'absent';
|
||||||
@ -209,10 +239,18 @@ sub getAzimuth {
|
|||||||
|
|
||||||
my $azimuth;
|
my $azimuth;
|
||||||
|
|
||||||
$azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'azimuth', -1 )
|
$azimuth = ReadingsVal(
|
||||||
if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
$azimuth = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAz', -1 )
|
'azimuth', -1 )
|
||||||
if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
|
if (
|
||||||
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
|
->{TYPE} eq 'Twilight' );
|
||||||
|
$azimuth = ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
|
'SunAz', -1 )
|
||||||
|
if (
|
||||||
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
|
->{TYPE} eq 'Astro' );
|
||||||
|
|
||||||
return $azimuth;
|
return $azimuth;
|
||||||
}
|
}
|
||||||
@ -222,10 +260,18 @@ sub getElevation {
|
|||||||
|
|
||||||
my $elevation;
|
my $elevation;
|
||||||
|
|
||||||
$elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'elevation', -1 )
|
$elevation = ReadingsVal(
|
||||||
if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Twilight' );
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
$elevation = ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice, 'SunAlt', -1 )
|
'elevation', -1 )
|
||||||
if ( $defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }->{TYPE} eq 'Astro' );
|
if (
|
||||||
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
|
->{TYPE} eq 'Twilight' );
|
||||||
|
$elevation = ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice,
|
||||||
|
'SunAlt', -1 )
|
||||||
|
if (
|
||||||
|
$defs{ $FHEM::Automation::ShuttersControl::ascDev->_getTwilightDevice }
|
||||||
|
->{TYPE} eq 'Astro' );
|
||||||
|
|
||||||
return $elevation;
|
return $elevation;
|
||||||
}
|
}
|
||||||
@ -238,5 +284,4 @@ sub getASCenable {
|
|||||||
return ReadingsVal( $name, 'ascEnable', 'none' );
|
return ReadingsVal( $name, 'ascEnable', 'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -59,7 +59,9 @@ sub _getRoommateStatus {
|
|||||||
|
|
||||||
my $roommate = $self->{roommate};
|
my $roommate = $self->{roommate};
|
||||||
|
|
||||||
return ReadingsVal( $roommate, $FHEM::Automation::ShuttersControl::shutters->getRoommatesReading, 'none' );
|
return ReadingsVal( $roommate,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getRoommatesReading,
|
||||||
|
'none' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _getRoommateLastStatus {
|
sub _getRoommateLastStatus {
|
||||||
@ -72,5 +74,4 @@ sub _getRoommateLastStatus {
|
|||||||
return ReadingsVal( $roommate, 'lastState', $default );
|
return ReadingsVal( $roommate, 'lastState', $default );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -111,18 +111,22 @@ sub setHardLockOut {
|
|||||||
my $cmd = shift;
|
my $cmd = shift;
|
||||||
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq 'hard'
|
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOut eq 'hard'
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd ne 'none' )
|
&& $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd ne
|
||||||
|
'none' )
|
||||||
{
|
{
|
||||||
CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd )
|
CommandSet( undef, $self->{shuttersDev} . ' inhibit ' . $cmd )
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'inhibit' );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq
|
||||||
|
'inhibit' );
|
||||||
CommandSet( undef,
|
CommandSet( undef,
|
||||||
$self->{shuttersDev} . ' '
|
$self->{shuttersDev} . ' '
|
||||||
. ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) )
|
. ( $cmd eq 'on' ? 'blocked' : 'unblocked' ) )
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'blocked' );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq
|
||||||
|
'blocked' );
|
||||||
CommandSet( undef,
|
CommandSet( undef,
|
||||||
$self->{shuttersDev} . ' '
|
$self->{shuttersDev} . ' '
|
||||||
. ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) )
|
. ( $cmd eq 'on' ? 'protectionOn' : 'protectionOff' ) )
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq 'protected' );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getLockOutCmd eq
|
||||||
|
'protected' );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -153,19 +157,29 @@ sub setDriveCmd {
|
|||||||
my $offSetStart;
|
my $offSetStart;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
( $FHEM::Automation::ShuttersControl::shutters->getPartyMode eq 'on' && $FHEM::Automation::ShuttersControl::ascDev->getPartyMode eq 'on' )
|
(
|
||||||
|| ( $FHEM::Automation::ShuttersControl::shutters->getAdv
|
$FHEM::Automation::ShuttersControl::shutters->getPartyMode eq 'on'
|
||||||
&& !$FHEM::Automation::ShuttersControl::shutters->getQueryShuttersPos($posValue)
|
&& $FHEM::Automation::ShuttersControl::ascDev->getPartyMode eq 'on'
|
||||||
|
)
|
||||||
|
|| (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getAdv
|
||||||
|
&& !$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getQueryShuttersPos(
|
||||||
|
$posValue)
|
||||||
&& !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay
|
&& !$FHEM::Automation::ShuttersControl::shutters->getAdvDelay
|
||||||
&& !$FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState
|
&& !$FHEM::Automation::ShuttersControl::shutters
|
||||||
&& !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState )
|
->getExternalTriggerState
|
||||||
|
&& !$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getSelfDefenseState
|
||||||
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
|
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd($posValue);
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
|
$FHEM::Automation::ShuttersControl::ascDev->setDelayCmdReading;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0)
|
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0)
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState );
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getExternalTriggerState );
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug( 'setDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
@ -176,24 +190,37 @@ sub setDriveCmd {
|
|||||||
$FHEM::Automation::ShuttersControl::shutters->setAdvDelay(0)
|
$FHEM::Automation::ShuttersControl::shutters->setAdvDelay(0)
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAdvDelay );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getAdvDelay );
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd('none')
|
$FHEM::Automation::ShuttersControl::shutters->setDelayCmd('none')
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne 'none' )
|
if ( $FHEM::Automation::ShuttersControl::shutters->getDelayCmd ne
|
||||||
|
'none' )
|
||||||
; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
|
; # setzt den Wert auf none da der Rolladen nun gesteuert werden kann.
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0)
|
$FHEM::Automation::ShuttersControl::shutters->setExternalTriggerState(0)
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getExternalTriggerState );
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getExternalTriggerState );
|
||||||
|
|
||||||
### antifreeze Routine
|
### antifreeze Routine
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus > 0 ) {
|
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus >
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreezeStatus != 1 ) {
|
0 )
|
||||||
|
{
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getAntiFreezeStatus != 1 )
|
||||||
|
{
|
||||||
|
|
||||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getStatus;
|
$posValue =
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setLastDrive('no drive - antifreeze defense');
|
$FHEM::Automation::ShuttersControl::shutters->getStatus;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setLastDriveReading;
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
||||||
|
'no drive - antifreeze defense');
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->setLastDriveReading;
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->setStateReading;
|
$FHEM::Automation::ShuttersControl::ascDev->setStateReading;
|
||||||
}
|
}
|
||||||
elsif ( $posValue == $FHEM::Automation::ShuttersControl::shutters->getClosedPos ) {
|
elsif ( $posValue ==
|
||||||
$posValue = $FHEM::Automation::ShuttersControl::shutters->getAntiFreezePos;
|
$FHEM::Automation::ShuttersControl::shutters->getClosedPos )
|
||||||
|
{
|
||||||
|
$posValue = $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getAntiFreezePos;
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
$FHEM::Automation::ShuttersControl::shutters->setLastDrive(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getLastDrive . ' - antifreeze mode' );
|
$FHEM::Automation::ShuttersControl::shutters->getLastDrive
|
||||||
|
. ' - antifreeze mode' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,43 +229,67 @@ sub setDriveCmd {
|
|||||||
posValue => $posValue,
|
posValue => $posValue,
|
||||||
);
|
);
|
||||||
|
|
||||||
$offSet = $FHEM::Automation::ShuttersControl::shutters->getDelay if ( $FHEM::Automation::ShuttersControl::shutters->getDelay > -1 );
|
$offSet = $FHEM::Automation::ShuttersControl::shutters->getDelay
|
||||||
$offSet = $FHEM::Automation::ShuttersControl::ascDev->getShuttersOffset if ( $FHEM::Automation::ShuttersControl::shutters->getDelay < 0 );
|
if ( $FHEM::Automation::ShuttersControl::shutters->getDelay > -1 );
|
||||||
$offSetStart = $FHEM::Automation::ShuttersControl::shutters->getDelayStart;
|
$offSet = $FHEM::Automation::ShuttersControl::ascDev->getShuttersOffset
|
||||||
|
if ( $FHEM::Automation::ShuttersControl::shutters->getDelay < 0 );
|
||||||
|
$offSetStart =
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getDelayStart;
|
||||||
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsent
|
if ( $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsent
|
||||||
&& !$FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentTimerrun
|
&& !$FHEM::Automation::ShuttersControl::shutters
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseMode ne 'off'
|
->getSelfDefenseAbsentTimerrun
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseMode
|
||||||
|
ne 'off'
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState
|
&& $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseState
|
||||||
&& $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq 'on' )
|
&& $FHEM::Automation::ShuttersControl::ascDev->getSelfDefense eq
|
||||||
|
'on' )
|
||||||
{
|
{
|
||||||
InternalTimer(
|
|
||||||
gettimeofday() + $FHEM::Automation::ShuttersControl::shutters->getSelfDefenseAbsentDelay,
|
|
||||||
\&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h );
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent( 1, 0, \%h );
|
|
||||||
}
|
|
||||||
elsif ( $offSetStart > 0 && !$FHEM::Automation::ShuttersControl::shutters->getNoDelay ) {
|
|
||||||
InternalTimer(
|
InternalTimer(
|
||||||
gettimeofday() +
|
gettimeofday() +
|
||||||
int( rand($offSet) + $FHEM::Automation::ShuttersControl::shutters->getDelayStart ),
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getSelfDefenseAbsentDelay,
|
||||||
\&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h
|
\&FHEM::Automation::ShuttersControl::_SetCmdFn, \%h
|
||||||
);
|
);
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->setSelfDefenseAbsent(
|
||||||
|
1, 0, \%h );
|
||||||
|
}
|
||||||
|
elsif ( $offSetStart > 0
|
||||||
|
&& !$FHEM::Automation::ShuttersControl::shutters->getNoDelay )
|
||||||
|
{
|
||||||
|
InternalTimer(
|
||||||
|
gettimeofday() + int(
|
||||||
|
rand($offSet) +
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getDelayStart
|
||||||
|
),
|
||||||
|
\&FHEM::Automation::ShuttersControl::_SetCmdFn,
|
||||||
|
\%h
|
||||||
|
);
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. ' - versetztes fahren' );
|
. ' - versetztes fahren' );
|
||||||
}
|
}
|
||||||
elsif ( $offSetStart < 1 || $FHEM::Automation::ShuttersControl::shutters->getNoDelay ) {
|
elsif ($offSetStart < 1
|
||||||
|
|| $FHEM::Automation::ShuttersControl::shutters->getNoDelay )
|
||||||
|
{
|
||||||
FHEM::Automation::ShuttersControl::_SetCmdFn( \%h );
|
FHEM::Automation::ShuttersControl::_SetCmdFn( \%h );
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. ' - NICHT versetztes fahren' );
|
. ' - NICHT versetztes fahren' );
|
||||||
}
|
}
|
||||||
|
|
||||||
FHEM::Automation::ShuttersControl::ASC_Debug( 'FnSetDriveCmd: '
|
FHEM::Automation::ShuttersControl::ASC_Debug(
|
||||||
|
'FnSetDriveCmd: '
|
||||||
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
. $FHEM::Automation::ShuttersControl::shutters->getShuttersDev
|
||||||
. ' - NoDelay: '
|
. ' - NoDelay: '
|
||||||
. ( $FHEM::Automation::ShuttersControl::shutters->getNoDelay ? 'JA' : 'NEIN' ) );
|
. (
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getNoDelay
|
||||||
|
? 'JA'
|
||||||
|
: 'NEIN'
|
||||||
|
)
|
||||||
|
);
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
$FHEM::Automation::ShuttersControl::shutters->setNoDelay(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,7 +362,8 @@ sub setLastDriveReading {
|
|||||||
);
|
);
|
||||||
|
|
||||||
InternalTimer( gettimeofday() + 0.1,
|
InternalTimer( gettimeofday() + 0.1,
|
||||||
\&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed, \%h );
|
\&FHEM::Automation::ShuttersControl::_setShuttersLastDriveDelayed,
|
||||||
|
\%h );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +456,8 @@ sub setAdvDelay {
|
|||||||
sub getHomemode {
|
sub getHomemode {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $homemode = $FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
|
my $homemode =
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getRoommatesStatus;
|
||||||
$homemode = $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
|
$homemode = $FHEM::Automation::ShuttersControl::ascDev->getResidentsStatus
|
||||||
if ( $homemode eq 'none' );
|
if ( $homemode eq 'none' );
|
||||||
return $homemode;
|
return $homemode;
|
||||||
@ -473,16 +526,23 @@ sub getAntiFreezeStatus {
|
|||||||
# $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann.
|
# $outTemp = $FHEM::Automation::ShuttersControl::shutters->getOutTemp if ( $FHEM::Automation::ShuttersControl::shutters->getOutTemp != -100 ); sollte raus das der Sensor im Rollo auch ein Innentemperatursensor sein kann.
|
||||||
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze ne 'off'
|
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze ne 'off'
|
||||||
&& $outTemp <= $FHEM::Automation::ShuttersControl::ascDev->getFreezeTemp )
|
&& $outTemp <=
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->getFreezeTemp )
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'soft' ) {
|
if ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq
|
||||||
|
'soft' )
|
||||||
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq $daytime ) {
|
elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq
|
||||||
|
$daytime )
|
||||||
|
{
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq 'hard' ) {
|
elsif ( $FHEM::Automation::ShuttersControl::shutters->getAntiFreeze eq
|
||||||
|
'hard' )
|
||||||
|
{
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -492,7 +552,8 @@ sub getAntiFreezeStatus {
|
|||||||
sub getShuttersPosCmdValueNegate {
|
sub getShuttersPosCmdValueNegate {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ( $FHEM::Automation::ShuttersControl::shutters->getOpenPos < $FHEM::Automation::ShuttersControl::shutters->getClosedPos ? 1 : 0 );
|
return ( $FHEM::Automation::ShuttersControl::shutters->getOpenPos <
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getClosedPos ? 1 : 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getQueryShuttersPos
|
sub getQueryShuttersPos
|
||||||
@ -501,7 +562,8 @@ sub getQueryShuttersPos
|
|||||||
my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
|
my $posValue = shift; # wenn dem so ist wird 1 zurück gegeben ansonsten 0
|
||||||
|
|
||||||
return (
|
return (
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShuttersPosCmdValueNegate
|
$FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getShuttersPosCmdValueNegate
|
||||||
? $FHEM::Automation::ShuttersControl::shutters->getStatus > $posValue
|
? $FHEM::Automation::ShuttersControl::shutters->getStatus > $posValue
|
||||||
: $FHEM::Automation::ShuttersControl::shutters->getStatus < $posValue
|
: $FHEM::Automation::ShuttersControl::shutters->getStatus < $posValue
|
||||||
);
|
);
|
||||||
@ -669,9 +731,16 @@ sub getRoommatesStatus {
|
|||||||
);
|
);
|
||||||
my $minPrio = 10;
|
my $minPrio = 10;
|
||||||
|
|
||||||
for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) {
|
for my $ro (
|
||||||
|
split(
|
||||||
|
",", $FHEM::Automation::ShuttersControl::shutters->getRoommates
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
||||||
my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateStatus };
|
my $currentPrio =
|
||||||
|
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->_getRoommateStatus };
|
||||||
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -695,9 +764,16 @@ sub getRoommatesLastStatus {
|
|||||||
);
|
);
|
||||||
my $minPrio = 10;
|
my $minPrio = 10;
|
||||||
|
|
||||||
for my $ro ( split( ",", $FHEM::Automation::ShuttersControl::shutters->getRoommates ) ) {
|
for my $ro (
|
||||||
|
split(
|
||||||
|
",", $FHEM::Automation::ShuttersControl::shutters->getRoommates
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
$FHEM::Automation::ShuttersControl::shutters->setRoommate($ro);
|
||||||
my $currentPrio = $statePrio{ $FHEM::Automation::ShuttersControl::shutters->_getRoommateLastStatus };
|
my $currentPrio =
|
||||||
|
$statePrio{ $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->_getRoommateLastStatus };
|
||||||
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
$minPrio = $currentPrio if ( $minPrio > $currentPrio );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -708,15 +784,20 @@ sub getRoommatesLastStatus {
|
|||||||
sub getOutTemp {
|
sub getOutTemp {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getTempSensor,
|
return ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getTempSensorReading, -100 );
|
$FHEM::Automation::ShuttersControl::shutters->_getTempSensor,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getTempSensorReading,
|
||||||
|
-100 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getIdleDetection {
|
sub getIdleDetection {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $self->{shuttersDev},
|
return ReadingsVal(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading, 'none' );
|
$self->{shuttersDev},
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->_getIdleDetectionReading,
|
||||||
|
'none'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
### Begin Beschattung Objekt mit Daten befüllen
|
### Begin Beschattung Objekt mit Daten befüllen
|
||||||
@ -729,7 +810,8 @@ sub setShadingStatus {
|
|||||||
&& exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
|
&& exists( $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} )
|
||||||
&& $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value );
|
&& $self->{ $self->{shuttersDev} }{ShadingStatus}{VAL} eq $value );
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus( ( $value eq 'in' ? 'out' : 'in' ) )
|
$FHEM::Automation::ShuttersControl::shutters->setShadingLastStatus(
|
||||||
|
( $value eq 'in' ? 'out' : 'in' ) )
|
||||||
if ( $value eq 'in'
|
if ( $value eq 'in'
|
||||||
|| $value eq 'out' );
|
|| $value eq 'out' );
|
||||||
|
|
||||||
@ -814,7 +896,8 @@ sub setPushBrightnessInArray {
|
|||||||
@{
|
@{
|
||||||
$self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
|
$self->{ $self->{shuttersDev} }->{BrightnessAverageArray}->{VAL}
|
||||||
}
|
}
|
||||||
) > $FHEM::Automation::ShuttersControl::shutters->getMaxBrightnessAverageArrayObjects
|
) > $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getMaxBrightnessAverageArrayObjects
|
||||||
);
|
);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -878,8 +961,10 @@ sub getIfInShading {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
(
|
(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne 'off'
|
$FHEM::Automation::ShuttersControl::shutters->getShadingMode ne
|
||||||
&& $FHEM::Automation::ShuttersControl::shutters->getShadingLastStatus eq 'out'
|
'off'
|
||||||
|
&& $FHEM::Automation::ShuttersControl::shutters
|
||||||
|
->getShadingLastStatus eq 'out'
|
||||||
) ? 1 : 0
|
) ? 1 : 0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -939,5 +1024,4 @@ sub getShadingLastStatusTimestamp {
|
|||||||
}
|
}
|
||||||
### Ende Beschattung
|
### Ende Beschattung
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -67,10 +67,10 @@ sub _setAttributs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub _getPosition {
|
sub _getPosition {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $attr = shift;
|
my $attr = shift;
|
||||||
my $userAttrList = shift;
|
my $userAttrList = shift;
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
return $self->{ $self->{shuttersDev} }->{$attr}->{position}
|
||||||
if (
|
if (
|
||||||
@ -184,7 +184,8 @@ sub setAntiFreezePos {
|
|||||||
sub getAntiFreezePos {
|
sub getAntiFreezePos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Antifreeze_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
|
'ASC_Antifreeze_Pos',
|
||||||
'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
|
'ASC_Antifreeze_Pos:5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -192,8 +193,9 @@ sub getAntiFreezePos {
|
|||||||
sub getAntiFreezePosAssignment {
|
sub getAntiFreezePosAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Antifreeze_Pos',
|
return
|
||||||
'getAntiFreezePos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Antifreeze_Pos', 'getAntiFreezePos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setShuttersPlace {
|
sub setShuttersPlace {
|
||||||
@ -314,9 +316,13 @@ sub getPrivacyUpTime {
|
|||||||
( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 );
|
( $upBrightnessVal ne 'none' ? $upBrightnessVal : -1 );
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setPrivacyUpStatus(0)
|
$FHEM::Automation::ShuttersControl::shutters->setPrivacyUpStatus(0)
|
||||||
if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus )
|
if (
|
||||||
|
defined(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getPrivacyUpStatus
|
||||||
|
)
|
||||||
&& $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
&& $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{uptime} == -1 );
|
->{uptime} == -1
|
||||||
|
);
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
return $self->{ $self->{shuttersDev} }->{ASC_PrivacyUpValue_beforeDayOpen}
|
||||||
->{uptime};
|
->{uptime};
|
||||||
@ -389,9 +395,13 @@ sub getPrivacyDownTime {
|
|||||||
( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 );
|
( $downBrightnessVal ne 'none' ? $downBrightnessVal : -1 );
|
||||||
|
|
||||||
$FHEM::Automation::ShuttersControl::shutters->setPrivacyDownStatus(0)
|
$FHEM::Automation::ShuttersControl::shutters->setPrivacyDownStatus(0)
|
||||||
if ( defined( $FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus )
|
if (
|
||||||
|
defined(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getPrivacyDownStatus
|
||||||
|
)
|
||||||
&& $self->{ $self->{shuttersDev} }
|
&& $self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1 );
|
->{ASC_PrivacyDownValue_beforeNightClose}->{downtime} == -1
|
||||||
|
);
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }
|
return $self->{ $self->{shuttersDev} }
|
||||||
->{ASC_PrivacyDownValue_beforeNightClose}->{downtime};
|
->{ASC_PrivacyDownValue_beforeNightClose}->{downtime};
|
||||||
@ -436,14 +446,16 @@ sub setPrivacyUpPos {
|
|||||||
sub getPrivacyUpPos {
|
sub getPrivacyUpPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' );
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
|
'ASC_PrivacyUp_Pos', 'ASC_PrivacyUp_Pos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getPrivacyUpPositionAssignment {
|
sub getPrivacyUpPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyUp_Pos',
|
return
|
||||||
'getPrivacyUpPos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_PrivacyUp_Pos', 'getPrivacyUpPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setPrivacyDownPos {
|
sub setPrivacyDownPos {
|
||||||
@ -458,15 +470,16 @@ sub setPrivacyDownPos {
|
|||||||
sub getPrivacyDownPos {
|
sub getPrivacyDownPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_PrivacyDown_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
'ASC_PrivacyDown_Pos' );
|
'ASC_PrivacyDown_Pos', 'ASC_PrivacyDown_Pos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getPrivacyDownPositionAssignment {
|
sub getPrivacyDownPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_PrivacyDown_Pos',
|
return
|
||||||
'getPrivacyDownPos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_PrivacyDown_Pos', 'getPrivacyDownPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setSelfDefenseMode {
|
sub setSelfDefenseMode {
|
||||||
@ -547,15 +560,16 @@ sub setShadingPos {
|
|||||||
sub getShadingPos {
|
sub getShadingPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Shading_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' );
|
'ASC_Shading_Pos', 'ASC_Shading_Pos:10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getShadingPositionAssignment {
|
sub getShadingPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Shading_Pos',
|
return
|
||||||
'getShadingPos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Shading_Pos', 'getShadingPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setShadingMode {
|
sub setShadingMode {
|
||||||
@ -1040,7 +1054,9 @@ sub getExternalTriggerDevice {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive} =
|
||||||
$posActive;
|
$posActive;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posinactive} =
|
||||||
( $posInactive ne 'none' ? $posInactive : $FHEM::Automation::ShuttersControl::shutters->getLastPos );
|
( $posInactive ne 'none'
|
||||||
|
? $posInactive
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getLastPos );
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{valueactive2} =
|
||||||
$valueActive2;
|
$valueActive2;
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
|
$self->{ $self->{shuttersDev} }->{ASC_ExternalTrigger}->{posactive2} =
|
||||||
@ -1308,14 +1324,16 @@ sub setOpenPos {
|
|||||||
sub getOpenPos {
|
sub getOpenPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Open_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
'ASC_Open_Pos', 'ASC_Open_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getOpenPositionAssignment {
|
sub getOpenPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Open_Pos', 'getOpenPos' );
|
return
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Open_Pos', 'getOpenPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setVentilatePos {
|
sub setVentilatePos {
|
||||||
@ -1330,15 +1348,17 @@ sub setVentilatePos {
|
|||||||
sub getVentilatePos {
|
sub getVentilatePos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Ventilate_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
|
'ASC_Ventilate_Pos',
|
||||||
'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' );
|
'ASC_Ventilate_Pos:10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getVentilatePositionAssignment {
|
sub getVentilatePositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Ventilate_Pos',
|
return
|
||||||
'getVentilatePos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Ventilate_Pos', 'getVentilatePos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setVentilatePosAfterDayClosed {
|
sub setVentilatePosAfterDayClosed {
|
||||||
@ -1370,15 +1390,16 @@ sub setClosedPos {
|
|||||||
sub getClosedPos {
|
sub getClosedPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Closed_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
'ASC_Closed_Pos', 'ASC_Closed_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getClosedPositionAssignment {
|
sub getClosedPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Closed_Pos',
|
return
|
||||||
'getClosedPos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Closed_Pos', 'getClosedPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setSleepPos {
|
sub setSleepPos {
|
||||||
@ -1393,14 +1414,16 @@ sub setSleepPos {
|
|||||||
sub getSleepPos {
|
sub getSleepPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_Sleep_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
'ASC_Sleep_Pos', 'ASC_Sleep_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getSleepPositionAssignment {
|
sub getSleepPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_Sleep_Pos', 'getSleepPos' );
|
return
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_Sleep_Pos', 'getSleepPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setVentilateOpen {
|
sub setVentilateOpen {
|
||||||
@ -1431,15 +1454,17 @@ sub setComfortOpenPos {
|
|||||||
sub getComfortOpenPos {
|
sub getComfortOpenPos {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPosition( 'ASC_ComfortOpen_Pos',
|
return $FHEM::Automation::ShuttersControl::shutters->_getPosition(
|
||||||
|
'ASC_ComfortOpen_Pos',
|
||||||
'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
'ASC_ComfortOpen_Pos:0,10,20,30,40,50,60,70,80,90,100' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getComfortOpenPositionAssignment {
|
sub getComfortOpenPositionAssignment {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return $FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment( 'ASC_ComfortOpen_Pos',
|
return
|
||||||
'getComfortOpenPos' );
|
$FHEM::Automation::ShuttersControl::shutters->_getPositionAssignment(
|
||||||
|
'ASC_ComfortOpen_Pos', 'getComfortOpenPos' );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub setPartyMode {
|
sub setPartyMode {
|
||||||
@ -1533,7 +1558,9 @@ sub getWindMax {
|
|||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggerhyst} =
|
||||||
( $hyst ne 'none' ? $max - $hyst : $max - 20 );
|
( $hyst ne 'none' ? $max - $hyst : $max - 20 );
|
||||||
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
|
$self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{closedPos} =
|
||||||
( $pos ne 'none' ? $pos : $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
|
( $pos ne 'none'
|
||||||
|
? $pos
|
||||||
|
: $FHEM::Automation::ShuttersControl::shutters->getOpenPos );
|
||||||
|
|
||||||
return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
|
return $self->{ $self->{shuttersDev} }->{ASC_WindParameters}->{triggermax};
|
||||||
}
|
}
|
||||||
@ -1944,5 +1971,4 @@ sub getDriveUpMaxDuration {
|
|||||||
return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
|
return AttrVal( $self->{shuttersDev}, 'ASC_DriveUpMaxDuration', 60 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#
|
#
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
|
||||||
## Subklasse Readings von ASC_Shutters ##
|
## Subklasse Readings von ASC_Shutters ##
|
||||||
package FHEM::Automation::ShuttersControl::Shutters::Readings;
|
package FHEM::Automation::ShuttersControl::Shutters::Readings;
|
||||||
|
|
||||||
@ -59,21 +58,25 @@ BEGIN {
|
|||||||
sub getBrightness {
|
sub getBrightness {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsNum( $FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
|
return ReadingsNum(
|
||||||
$FHEM::Automation::ShuttersControl::shutters->getBrightnessReading, -1 );
|
$FHEM::Automation::ShuttersControl::shutters->_getBrightnessSensor,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getBrightnessReading,
|
||||||
|
-1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getWindStatus {
|
sub getWindStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
|
return ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::ascDev->_getWindSensor,
|
||||||
$FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
|
$FHEM::Automation::ShuttersControl::ascDev->getWindSensorReading, -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getStatus {
|
sub getStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsNum( $self->{shuttersDev}, $FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
|
return ReadingsNum( $self->{shuttersDev},
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getPosCmd, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub getDelayCmd {
|
sub getDelayCmd {
|
||||||
@ -88,5 +91,4 @@ sub getASCenable {
|
|||||||
return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
|
return ReadingsVal( $self->{shuttersDev}, 'ASC_Enable', 'on' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -47,7 +47,7 @@ use utf8;
|
|||||||
use FHEM::Automation::ShuttersControl::Window::Attr;
|
use FHEM::Automation::ShuttersControl::Window::Attr;
|
||||||
use FHEM::Automation::ShuttersControl::Window::Readings;
|
use FHEM::Automation::ShuttersControl::Window::Readings;
|
||||||
|
|
||||||
our @ISA = qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings);
|
our @ISA =
|
||||||
|
qw(FHEM::Automation::ShuttersControl::Window::Attr FHEM::Automation::ShuttersControl::Window::Readings);
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -125,5 +125,4 @@ sub getWinDevReading {
|
|||||||
return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading};
|
return $self->{ $self->{shuttersDev} }->{ASC_WindowRec}->{reading};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -57,9 +57,10 @@ BEGIN {
|
|||||||
sub getWinStatus {
|
sub getWinStatus {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
return ReadingsVal( $FHEM::Automation::ShuttersControl::shutters->_getWinDev, $FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
|
return ReadingsVal(
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->_getWinDev,
|
||||||
|
$FHEM::Automation::ShuttersControl::shutters->getWinDevReading,
|
||||||
'closed' );
|
'closed' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user