2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-25 03:44:52 +00:00

98_PID20.pm: improve startup behavior (thx to Beta-User)

git-svn-id: https://svn.fhem.de/fhem/trunk@29441 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
betateilchen 2024-12-20 15:38:56 +00:00
parent df818958d4
commit ee6ec25096

View File

@ -93,6 +93,8 @@
# #
# 2024-04-05 remove smartmatch issues # 2024-04-05 remove smartmatch issues
# #
# 2024-12-20 1.0.0.11 - add some patches for better startup (thx to Beta-User)
#
#################################################################################################### ####################################################################################################
=cut =cut
@ -105,7 +107,7 @@ use vars qw(%defs);
use vars qw($readingFnAttributes); use vars qw($readingFnAttributes);
use vars qw(%modules); use vars qw(%modules);
my $PID20_Version = "1.0.0.10"; my $PID20_Version = "1.0.0.11";
sub PID20_Calc($); sub PID20_Calc($);
######################################## ########################################
sub PID20_Log($$$) sub PID20_Log($$$)
@ -193,18 +195,28 @@ sub PID20_Define($$$)
my ( $hash, $def ) = @_; my ( $hash, $def ) = @_;
my @a = split( "[ \t][ \t]*", $def ); my @a = split( "[ \t][ \t]*", $def );
my $name = $a[0]; my $name = $a[0];
my $err = 0;
my $reFloat = '^([\\+,\\-]?\\d+\\.?\d*$)'; # gleitpunkt
if ( @a != 4 ) if ( @a != 4 )
{ {
return "wrong syntax: define <name> PID20 " return "wrong syntax: define <name> PID20 "
. "<sensor>:reading:[regexp] <actor>[:cmd] "; . "<sensor>:reading:[regexp] <actor>[:cmd] ";
} }
return if !$init_done;
return PID20_Check($hash, $a[2], $a[3]);
}
sub PID20_Check($$$)
{ my ( $hash, $sensorinfo, $actorinfo ) = @_;
################### ###################
# Sensor # Sensor
my ( $sensor, $reading, $regexp ) = split( ":", $a[2], 3 ); my ( $sensor, $reading, $regexp ) = split( ":", $sensorinfo, 3 );
my $msg;
# if sensor unkonwn # if sensor unkonwn
my $name = $hash->{NAME};
my $err = 0;
if ( !$defs{$sensor} ) if ( !$defs{$sensor} )
{ {
my $msg = "$name: Unknown sensor device $sensor specified"; my $msg = "$name: Unknown sensor device $sensor specified";
@ -214,27 +226,28 @@ sub PID20_Define($$$)
} }
# if reading of sender is unknown # if reading of sender is unknown
if ( ReadingsVal( $sensor, $reading, 'unknown' ) eq 'unkown' ) if ( ReadingsVal( $sensor, $reading, 'unknownReading' ) eq 'unkownReading' )
{ {
my $msg = "$name: Unknown reading $reading for sensor device $sensor specified"; $msg = "$name: Unknown reading $reading for sensor device $sensor specified";
PID20_Log $hash, 1, $msg; #PID20_Log $hash, 1, $msg;
#return $msg;
$err = 1; $err = 1;
} }
#my $reFloat = '^([\\+,\\-]?\\d+\\.?\d*$)'; # gleitpunkt
# defaults for regexp # defaults for regexp
if ( !$regexp ) if ( !$regexp )
{ {
$regexp = $reFloat; #$regexp = $reFloat;
$regexp = '^([\\+,\\-]?\\d+\\.?\d*$)';
} }
# Actor # Actor
my ( $actor, $cmd ) = split( ":", $a[3], 2 ); my ( $actor, $cmd ) = split( ":", $actorinfo, 2 );
if ( !$defs{$actor} ) if ( !$defs{$actor} )
{ {
my $msg = "$name: Unknown actor device $actor specified"; $msg .= '\n' if $msg;
PID20_Log $hash, 1, $msg; $msg .= "$name: Unknown actor device $actor specified";
#return $msg; #PID20_Log $hash, 1, $msg;
$err = 1; $err = 1;
} }
@ -252,10 +265,12 @@ sub PID20_Define($$$)
RemoveInternalTimer($name); RemoveInternalTimer($name);
InternalTimer( gettimeofday() + 10, 'PID20_Calc', $name, 0 ); InternalTimer( gettimeofday() + 10, 'PID20_Calc', $name, 0 );
} else { } else {
PID20_Log $hash, 1, $msg;
readingsSingleUpdate( $hash, 'state', 'PID defined with errors! See logfile for details.', 0 ); readingsSingleUpdate( $hash, 'state', 'PID defined with errors! See logfile for details.', 0 );
} }
return undef; return $msg;
} }
######################################## ########################################
sub PID20_Undef($$) sub PID20_Undef($$)
{ {
@ -275,6 +290,17 @@ sub PID20_Notify($$)
# no action if disabled # no action if disabled
return if IsDisabled($name); return if IsDisabled($name);
if ( $dev->{NAME} eq 'global' ) {
my $events = $dev->{CHANGED};
return if !$events; # Some previous notify deleted the array.
for my $evnt(@{$events}){
if ($evnt =~ m/INITIALIZED|REREADCFG/){
my ($sensorinfo, $actorinfo) = split m{\s+}xms, $hash->{DEF};
return PID20_Check($hash, $sensorinfo, $actorinfo );
}
}
}
return if ( $dev->{NAME} ne $sensorName ); return if ( $dev->{NAME} ne $sensorName );
my $sensorReadingName = $hash->{helper}{reading}; my $sensorReadingName = $hash->{helper}{reading};