2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-04 05:16:45 +00:00

10_MQTT2_DEVICE.pm: optimize parse time (Forum #116547)

git-svn-id: https://svn.fhem.de/fhem/trunk@23332 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2020-12-12 13:29:43 +00:00
parent 29b0758fd2
commit b8bdba9a82

View File

@ -115,6 +115,21 @@ MQTT2_DEVICE_checkSubscr()
} }
############################# #############################
sub
MQTT2_DEVICE_getRegexpHash($$$)
{
my ($step, $cid, $topic) = @_;
return $modules{MQTT2_DEVICE}{defptr}{"re:$cid"}
if($step == 1); # regexp for cid:topic:msg
return $modules{MQTT2_DEVICE}{defptr}{"re"}
if($step == 2); # regExp for topic:msg
return $modules{MQTT2_DEVICE}{defptr}{"re:$cid:$topic"}
if($step == 3); # regExp for msg, for specific cid:topic
return $modules{MQTT2_DEVICE}{defptr}{"re:*:$topic"}
if($step == 4); # regExp for msg, for specific topic
}
sub sub
MQTT2_DEVICE_Parse($$) MQTT2_DEVICE_Parse($$)
{ {
@ -139,9 +154,12 @@ MQTT2_DEVICE_Parse($$)
} }
my ($cid, $topic, $value) = split("\0", $msg, 3); my ($cid, $topic, $value) = split("\0", $msg, 3);
for my $step (1,2) { return "" if(!defined($topic));
next if($step == 1 && !$modules{MQTT2_DEVICE}{defptr}{"re:$cid"}); for my $step (1,2,3,4) {
my $dp = $modules{MQTT2_DEVICE}{defptr}{$step==1 ? "re:$cid" : "re"};
my $dp = MQTT2_DEVICE_getRegexpHash($step, $cid, $topic);
next if(!$dp);
foreach my $re (keys %{$dp}) { foreach my $re (keys %{$dp}) {
my $reAll = $re; my $reAll = $re;
$reAll =~ s/\$DEVICETOPIC/\.\*/g; $reAll =~ s/\$DEVICETOPIC/\.\*/g;
@ -561,16 +579,17 @@ MQTT2_DEVICE_delReading($)
my ($name) = @_; my ($name) = @_;
my $cid = $defs{$name}{CID}; my $cid = $defs{$name}{CID};
$cid = "" if(!defined($cid)); $cid = "" if(!defined($cid));
for my $step (1,2) { for my $key1 (sort keys %{$modules{MQTT2_DEVICE}{defptr}}) {
next if($step == 1 && !$modules{MQTT2_DEVICE}{defptr}{"re:$cid"}); next if($key1 !~ m/^re/);
my $dp = $modules{MQTT2_DEVICE}{defptr}{$step==1 ? "re:$cid" : "re"}; my $dp = $modules{MQTT2_DEVICE}{defptr}{$key1};
foreach my $re (keys %{$dp}) { foreach my $re (keys %{$dp}) {
foreach my $key (keys %{$dp->{$re}}) { foreach my $key2 (keys %{$dp->{$re}}) {
if($key =~ m/^$name,/) { delete($dp->{$re}{$key2}) if($key2 =~ m/^$name,/);
delete($dp->{$re}{$key});
delete($dp->{$re}) if(!int(keys %{$dp->{$re}}));
}
} }
delete($dp->{$re}) if(!int(keys %{$dp->{$re}}));
}
if(!int(keys %{$modules{MQTT2_DEVICE}{defptr}{$key1}}) && $key1 ne "re") {
delete($modules{MQTT2_DEVICE}{defptr}{$key1});
} }
} }
} }
@ -586,10 +605,19 @@ MQTT2_DEVICE_addReading($$)
return "Bad line >$line< for $name" if(!defined($code)); return "Bad line >$line< for $name" if(!defined($code));
my $errMsg = CheckRegexp($re, "readingList attribute for $name"); my $errMsg = CheckRegexp($re, "readingList attribute for $name");
return $errMsg if($errMsg); return $errMsg if($errMsg);
if($cid && $re =~ m/^$cid:/) { if($cid && $re =~ m/^$cid:/) {
$modules{MQTT2_DEVICE}{defptr}{"re:$cid"}{$re}{"$name,$code"} = 1; if($re =~ m/^$cid:([^\?.*\[\](|)]+):\.\*$/) { # cid:topic:.*
$modules{MQTT2_DEVICE}{defptr}{"re:$cid:$1"}{$re}{"$name,$code"} = 1;
} else {
$modules{MQTT2_DEVICE}{defptr}{"re:$cid"}{$re}{"$name,$code"} = 1;
}
} else { } else {
$modules{MQTT2_DEVICE}{defptr}{re}{$re}{"$name,$code"} = 1; if($re =~ m/^([^\?.*\[\](|)]+):\.\*$/) {
$modules{MQTT2_DEVICE}{defptr}{"re:*:$1"}{$re}{"$name,$code"} = 1;
} else {
$modules{MQTT2_DEVICE}{defptr}{re}{$re}{"$name,$code"} = 1;
}
} }
} }
return undef; return undef;