2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

98_RandomTimer.pm: modify timer admin

git-svn-id: https://svn.fhem.de/fhem/trunk@23689 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Beta-User 2021-02-07 06:10:29 +00:00
parent ff2137252a
commit 17a16981ab

View File

@ -99,7 +99,7 @@ sub Define {
if ( !defined $timeToSwitch );
my ( $rel, $rep, $tspec );
if ( $timespec_start =~ m{^(\+)?(\*)?(.*)$}ixms ) {
if ( $timespec_start =~ m{\A(\+)?(\*)?(.*)\z}ixms ) {
$rel = $1;
$rep = $2;
$tspec = $3;
@ -111,11 +111,11 @@ sub Define {
my ( $err, $hr, $min, $sec, $fn ) = GetTimeSpec($tspec);
return $err if ($err);
$rel = $rel // "";
$rep = $rep // "";
$rel = $rel // q{};
$rep = $rep // q{};
my ( $srel, $srep, $stspec );
if ( $timespec_stop =~ m{^(\+)?(\*)?(.*)$}ixms ) {
if ( $timespec_stop =~ m{\A(\+)?(\*)?(.*)\z}ixms ) {
$srel = $1;
$srep = $2;
$stspec = $3;
@ -162,8 +162,10 @@ sub Define {
readingsSingleUpdate( $hash, "TimeToSwitch", $hash->{helper}{TIMETOSWITCH},
1 );
RmInternalTimer( "RT_SetTimer", $hash );
MkInternalTimer( "RT_SetTimer", time(), \&RT_SetTimer, $hash, 0 );
RemoveInternalTimer($hash,\&RT_SetTimer);
InternalTimer(time,\&RT_SetTimer,$hash);
#RmInternalTimer( "RT_SetTimer", $hash );
#MkInternalTimer( "RT_SetTimer", time(), \&RT_SetTimer, $hash, 0 );
return;
}
@ -172,9 +174,11 @@ sub Undef {
my $hash = shift;
my $arg = shift // return;
RemoveInternalTimer($hash);
RmInternalTimer( "RT_SetTimer", $hash );
RmInternalTimer( "RT_Exec", $hash );
#RmInternalTimer( "RT_SetTimer", $hash );
#RmInternalTimer( "RT_Exec", $hash );
delete $modules{RandomTimer}{defptr}{ $hash->{NAME} };
return;
}
@ -191,20 +195,23 @@ sub Attr {
if ( $attrName =~ m{\A disable(Cond)? \z}xms ) {
# Immediately execute next switch check
RmInternalTimer( "RT_Exec", $hash );
MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
RemoveInternalTimer( $hash, \&RT_Exec );
InternalTimer( time, \&RT_Exec, $hash );
#RmInternalTimer( "RT_Exec", $hash );
#MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
}
if ( $attrName eq 'offState' ) {
my ( $offRegex, $offReading ) = split ' ', $attrVal, 2;
my ( $offRegex, $offReading ) = split m{\s+}x, $attrVal, 2;
$hash->{helper}{offRegex} = $offRegex;
$hash->{helper}{offReading} = $offReading // 'state';
}
if ( $attrName eq 'disableCond' ) {
if( $cmd eq "set" ) {
if( $cmd eq 'set' ) {
my $err = perlSyntaxCheck($attrVal);
return $err if ( $err );
return $err if $err;
}
}
@ -227,8 +234,10 @@ sub Set {
Log3( $hash, 3, "[$name] is disabled, set execNow not possible" );
}
else {
RmInternalTimer( "RT_Exec", $hash );
MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
RemoveInternalTimer($hash,\&RT_Exec);
InternalTimer(time + 1,\&RT_Exec,$hash);
#RmInternalTimer( "RT_Exec", $hash );
#MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
}
return;
}
@ -239,8 +248,10 @@ sub Set {
}
my $statevalue = $v eq "active" ? "activated" : $v;
readingsSingleUpdate( $hash, "state", $statevalue, 1 );
RmInternalTimer( "RT_Exec", $hash );
MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
RemoveInternalTimer($hash,\&RT_Exec);
InternalTimer(time + 1,\&RT_Exec,$hash);
#RmInternalTimer( "RT_Exec", $hash );
#MkInternalTimer( "RT_Exec", time() + 1, \&RT_Exec, $hash, 0 );
return;
}
return;
@ -357,12 +368,9 @@ sub down {
}
sub RT_Exec {
my $myHash = shift // return;
my $hash = shift // return;
my $hash = GetHashIndirekt( $myHash, ( caller(0) )[3] );
return if ( !defined($hash) );
my $now = time();
my $now = time;
# Wenn aktiv aber disabled, dann timer abschalten, Meldung ausgeben.
my $active = isAktive($hash);
@ -456,10 +464,12 @@ sub RT_Exec {
}
my $nextSwitch = time() + getSecsToNextAbschaltTest($hash);
RmInternalTimer( "RT_Exec", $hash );
#RmInternalTimer( "RT_Exec", $hash );
$hash->{helper}{NEXT_CHECK} =
strftime( "%d.%m.%Y %H:%M:%S", localtime($nextSwitch) );
MkInternalTimer( "RT_Exec", $nextSwitch, \&RT_Exec, $hash, 0 );
#MkInternalTimer( "RT_Exec", $nextSwitch, \&RT_Exec, $hash, 0 );
RemoveInternalTimer($hash,\&RT_Exec);
InternalTimer($nextSwitch,\&RT_Exec,$hash);
return;
}
@ -486,10 +496,10 @@ sub isDisabled {
my $disable =
IsDisabled( $hash->{NAME} ); #AttrVal($hash->{NAME}, "disable", 0 );
return $disable if ($disable);
return $disable if $disable;
my $disableCond = AttrVal( $hash->{NAME}, "disableCond", "nf" );
return 0 if ( $disableCond eq "nf" );
return 0 if $disableCond eq "nf";
return AnalyzePerlCommand( $hash, $disableCond );
}
@ -503,8 +513,6 @@ sub schaltZeitenErmitteln {
readingsBeginUpdate($hash);
# readingsBulkUpdate ($hash, "Startzeit", FmtDateTime($hash->{helper}{startTime}));
# readingsBulkUpdate ($hash, "Stoppzeit", FmtDateTime($hash->{helper}{stopTime}));
readingsBulkUpdate( $hash, "StartTime",
FmtDateTime( $hash->{helper}{startTime} ) );
readingsBulkUpdate( $hash, "StopTime",
@ -561,10 +569,8 @@ sub setSwitchmode {
}
sub RT_SetTimer {
my $myHash = shift // return;
my $hash = GetHashIndirekt( $myHash, ( caller(0) )[3] );
return if ( !defined($hash) );
my $hash = shift // return;
my $now = time();
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime($now);
@ -584,15 +590,21 @@ sub RT_SetTimer {
my $secToMidnight = 24 * 3600 - ( 3600 * $hour + 60 * $min + $sec );
my $setExecTime = max( $now, $hash->{helper}{startTime} );
RmInternalTimer( "RT_Exec", $hash );
MkInternalTimer( "RT_Exec", $setExecTime, \&RT_Exec, $hash, 0 );
RemoveInternalTimer($hash,\&RT_Exec);
InternalTimer($setExecTime,\&RT_Exec,$hash);
#RmInternalTimer( "RT_Exec", $hash );
#MkInternalTimer( "RT_Exec", $setExecTime, \&RT_Exec, $hash, 0 );
if ( $hash->{helper}{REP} gt "" ) {
my $setTimerTime =
max( $now + $secToMidnight + 15, $hash->{helper}{stopTime} ) +
$hash->{helper}{TIMETOSWITCH} + 15;
RmInternalTimer( "RT_SetTimer", $hash );
MkInternalTimer( "RT_SetTimer", $setTimerTime, \&RT_SetTimer, $hash, 0 );
#RmInternalTimer( "RT_SetTimer", $hash );
#MkInternalTimer( "RT_SetTimer", $setTimerTime, \&RT_SetTimer, $hash, 0 );
RemoveInternalTimer($hash,\&RT_SetTimer);
InternalTimer($setTimerTime,\&RT_SetTimer,$hash);
}
return;
}
@ -683,7 +695,7 @@ sub zeitBerechnen {
my @jetzt_arr = localtime($now);
#Stunden Minuten Sekunden
#Stunden Minuten Sekunden
$jetzt_arr[2] = $hour;
$jetzt_arr[1] = $min;
$jetzt_arr[0] = $sec;
@ -691,54 +703,6 @@ sub zeitBerechnen {
return $next;
}
sub MkInternalTimer {
my ( $modifier, $tim, $callback, $hash, $waitIfInitNotDone ) = @_;
my $timerName = "$hash->{NAME}_$modifier";
my $mHash = {
HASH => $hash,
NAME => "$hash->{NAME}_$modifier",
MODIFIER => $modifier
};
if ( defined( $hash->{TIMER}{$timerName} ) ) {
Log3( $hash, 1, "[$hash->{NAME}] possible overwriting of timer $timerName - please delete first" );
stacktrace();
}
else {
$hash->{TIMER}{$timerName} = $mHash;
}
Log3( $hash, 5,
"[$hash->{NAME}] setting Timer: $timerName " . FmtDateTime($tim) );
InternalTimer( $tim, $callback, $mHash, $waitIfInitNotDone );
return $mHash;
}
################################################################################
sub RmInternalTimer {
my $modifier = shift;
my $hash = shift // return;
my $timerName = "$hash->{NAME}_$modifier";
my $myHash = $hash->{TIMER}{$timerName};
if ( defined($myHash) ) {
delete $hash->{TIMER}{$timerName};
Log3( $hash, 5, "[$hash->{NAME}] removing Timer: $timerName" );
RemoveInternalTimer($myHash);
}
return;
}
sub GetHashIndirekt {
my $myHash = shift;
my $function = shift // return;
if ( !defined( $myHash->{HASH} ) ) {
Log3( $myHash, 3, "[$function] myHash not valid" );
return;
}
return $myHash->{HASH};
}
1;
__END__