mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
ECMDDevice: speed up through caching of postproc and regex
git-svn-id: https://svn.fhem.de/fhem/trunk@6541 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d7985f6d6b
commit
e70e2872bf
@ -1,5 +1,6 @@
|
|||||||
# 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.
|
||||||
|
- feature: speed up through caching of postproc and regex in ECMDDevice
|
||||||
- bugfix: fixed handling of autocreation for 10_OWServer.pm
|
- bugfix: fixed handling of autocreation for 10_OWServer.pm
|
||||||
- feature: option to cope with partial messages in ECMD/ECMDDevice
|
- feature: option to cope with partial messages in ECMD/ECMDDevice
|
||||||
- bugfix: SOMFY: add module to CUL client list, to set IODev automatically
|
- bugfix: SOMFY: add module to CUL client list, to set IODev automatically
|
||||||
|
@ -91,6 +91,19 @@ ECMDDevice_DeviceParams2Specials($)
|
|||||||
return %specials;
|
return %specials;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
ECMDDevice_GetCachedSpecials($)
|
||||||
|
{
|
||||||
|
my($hash)= @_;
|
||||||
|
|
||||||
|
if(!defined($hash->{fhem}{cache}{specials})) {
|
||||||
|
my %specials= ECMDDevice_DeviceParams2Specials($hash);
|
||||||
|
$hash->{fhem}{cache}{specials}= \%specials;
|
||||||
|
}
|
||||||
|
|
||||||
|
return %{$hash->{fhem}{cache}{specials}}
|
||||||
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
ECMDDevice_ReplaceSpecials($%)
|
ECMDDevice_ReplaceSpecials($%)
|
||||||
{
|
{
|
||||||
@ -142,7 +155,7 @@ ECMDDevice_PostProc($$$)
|
|||||||
my ($hash, $postproc, $value)= @_;
|
my ($hash, $postproc, $value)= @_;
|
||||||
|
|
||||||
if($postproc) {
|
if($postproc) {
|
||||||
my %specials= ECMDDevice_DeviceParams2Specials($hash);
|
my %specials= ECMDDevice_GetCachedSpecials($hash);
|
||||||
my $command= ECMDDevice_ReplaceSpecials($postproc, %specials);
|
my $command= ECMDDevice_ReplaceSpecials($postproc, %specials);
|
||||||
$_= $value;
|
$_= $value;
|
||||||
Log3 $hash, 5, "Postprocessing \"" . escapeLogLine($value) . "\" with perl command $command.";
|
Log3 $hash, 5, "Postprocessing \"" . escapeLogLine($value) . "\" with perl command $command.";
|
||||||
@ -152,6 +165,37 @@ ECMDDevice_PostProc($$$)
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
ECMDDevice_EvalCommand($$$)
|
||||||
|
{
|
||||||
|
my ($hash, $command, $value)= @_;
|
||||||
|
|
||||||
|
if($command) {
|
||||||
|
$_= $value;
|
||||||
|
Log3 $hash, 5, "Postprocessing \"" . escapeLogLine($value) . "\" with perl command $command.";
|
||||||
|
$value= AnalyzePerlCommand(undef, $command);
|
||||||
|
Log3 $hash, 5, "Postprocessed value is \"" . escapeLogLine($value) . "\".";
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
ECMDDevice_GetCachedReadingsCommand($$$)
|
||||||
|
{
|
||||||
|
my ($hash, $classDef, $reading)= @_;
|
||||||
|
my $command= $hash->{fhem}{cache}{readings}{command}{$reading};
|
||||||
|
if(!defined($command)) {
|
||||||
|
my %specials= ECMDDevice_GetCachedSpecials($hash);
|
||||||
|
my $postproc= $classDef->{readings}{$reading}{postproc};
|
||||||
|
if($postproc) {
|
||||||
|
$command= ECMDDevice_ReplaceSpecials($postproc, %specials);
|
||||||
|
} else {
|
||||||
|
$command= undef;
|
||||||
|
}
|
||||||
|
$hash->{fhem}{cache}{readings}{command}{$reading}= $command;
|
||||||
|
}
|
||||||
|
return $command;
|
||||||
|
}
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
|
|
||||||
@ -178,7 +222,7 @@ ECMDDevice_Get($@)
|
|||||||
my $params= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{params};
|
my $params= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{params};
|
||||||
my $postproc= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{postproc};
|
my $postproc= $IOhash->{fhem}{classDefs}{$classname}{gets}{$cmdname}{postproc};
|
||||||
|
|
||||||
my %specials= ECMDDevice_DeviceParams2Specials($hash);
|
my %specials= ECMDDevice_GetCachedSpecials($hash);
|
||||||
# add specials for command
|
# add specials for command
|
||||||
if($params) {
|
if($params) {
|
||||||
shift @a; shift @a;
|
shift @a; shift @a;
|
||||||
@ -226,7 +270,7 @@ ECMDDevice_Set($@)
|
|||||||
my $params= $IOhash->{fhem}{classDefs}{$classname}{sets}{$cmdname}{params};
|
my $params= $IOhash->{fhem}{classDefs}{$classname}{sets}{$cmdname}{params};
|
||||||
my $postproc= $IOhash->{fhem}{classDefs}{$classname}{sets}{$cmdname}{postproc};
|
my $postproc= $IOhash->{fhem}{classDefs}{$classname}{sets}{$cmdname}{postproc};
|
||||||
|
|
||||||
my %specials= ECMDDevice_DeviceParams2Specials($hash);
|
my %specials= ECMDDevice_GetCachedSpecials($hash);
|
||||||
# add specials for command
|
# add specials for command
|
||||||
if($params) {
|
if($params) {
|
||||||
shift @a; shift @a;
|
shift @a; shift @a;
|
||||||
@ -251,6 +295,22 @@ ECMDDevice_Set($@)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#############################
|
||||||
|
sub
|
||||||
|
ECMDDevice_GetCachedReadingsMatch($$$)
|
||||||
|
{
|
||||||
|
my ($hash, $classDef, $r)= @_;
|
||||||
|
|
||||||
|
my $regex= $hash->{fhem}{cache}{readings}{match}{$r};
|
||||||
|
if(!defined($regex)) {
|
||||||
|
my %specials= ECMDDevice_GetCachedSpecials($hash);
|
||||||
|
$regex= ECMDDevice_ReplaceSpecials($classDef->{readings}{$r}{match}, %specials);
|
||||||
|
$hash->{fhem}{cache}{readings}{match}{$r}= $regex;
|
||||||
|
}
|
||||||
|
return $regex;
|
||||||
|
}
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
ECMDDevice_Parse($$)
|
ECMDDevice_Parse($$)
|
||||||
@ -323,18 +383,17 @@ ECMDDevice_Parse($$)
|
|||||||
#Debug " Checking device $d with class $classname...";
|
#Debug " Checking device $d with class $classname...";
|
||||||
next unless(defined($classDef->{readings}));
|
next unless(defined($classDef->{readings}));
|
||||||
#Debug " Trying to find a match in class $classname...";
|
#Debug " Trying to find a match in class $classname...";
|
||||||
my %specials= ECMDDevice_DeviceParams2Specials($hash);
|
|
||||||
# we run over all readings in that classdef
|
# we run over all readings in that classdef
|
||||||
foreach my $r (keys %{$classDef->{readings}}) {
|
foreach my $r (keys %{$classDef->{readings}}) {
|
||||||
my $regex= ECMDDevice_ReplaceSpecials($classDef->{readings}{$r}{match}, %specials);
|
my $regex= ECMDDevice_GetCachedReadingsMatch($hash, $classDef, $r);
|
||||||
#Debug " Trying to match reading $r with regular expressing \"$regex\".";
|
#Debug " Trying to match reading $r with regular expressing \"$regex\".";
|
||||||
if($msg =~ m/^$regex$/) {
|
if($msg =~ m/^$regex$/) {
|
||||||
# we found a match
|
# we found a match
|
||||||
Log3 $IOhash, 5, "$name: match regex $regex for reading $r of device $d with class $classname";
|
Log3 $IOhash, 5, "$name: match regex $regex for reading $r of device $d with class $classname";
|
||||||
$msgMatched++;
|
$msgMatched++;
|
||||||
push @matches, $d;
|
push @matches, $d;
|
||||||
my $postproc= $classDef->{readings}{$r}{postproc};
|
my $command= ECMDDevice_GetCachedReadingsCommand($hash, $classDef, $r);
|
||||||
my $value= ECMDDevice_PostProc($hash, $postproc, $msg);
|
my $value= ECMDDevice_EvalCommand($hash, $command, $msg);
|
||||||
Log3 $hash, 5, "postprocessed value is $value";
|
Log3 $hash, 5, "postprocessed value is $value";
|
||||||
ECMDDevice_Changed($hash, $r, $value);
|
ECMDDevice_Changed($hash, $r, $value);
|
||||||
}
|
}
|
||||||
@ -446,9 +505,16 @@ ECMDDevice_Define($$)
|
|||||||
} else {
|
} else {
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# create cache stubs
|
||||||
|
$hash->{fhem}{cache}{specials}= ();
|
||||||
|
$hash->{fhem}{cache}{readings}{match}= ();
|
||||||
|
$hash->{fhem}{cache}{readings}{command}= ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#############################
|
||||||
1;
|
1;
|
||||||
|
#############################
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
=begin html
|
=begin html
|
||||||
|
Loading…
x
Reference in New Issue
Block a user