2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 23:06:37 +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
MQTT2_DEVICE_Parse($$)
{
@ -139,9 +154,12 @@ MQTT2_DEVICE_Parse($$)
}
my ($cid, $topic, $value) = split("\0", $msg, 3);
for my $step (1,2) {
next if($step == 1 && !$modules{MQTT2_DEVICE}{defptr}{"re:$cid"});
my $dp = $modules{MQTT2_DEVICE}{defptr}{$step==1 ? "re:$cid" : "re"};
return "" if(!defined($topic));
for my $step (1,2,3,4) {
my $dp = MQTT2_DEVICE_getRegexpHash($step, $cid, $topic);
next if(!$dp);
foreach my $re (keys %{$dp}) {
my $reAll = $re;
$reAll =~ s/\$DEVICETOPIC/\.\*/g;
@ -561,16 +579,17 @@ MQTT2_DEVICE_delReading($)
my ($name) = @_;
my $cid = $defs{$name}{CID};
$cid = "" if(!defined($cid));
for my $step (1,2) {
next if($step == 1 && !$modules{MQTT2_DEVICE}{defptr}{"re:$cid"});
my $dp = $modules{MQTT2_DEVICE}{defptr}{$step==1 ? "re:$cid" : "re"};
for my $key1 (sort keys %{$modules{MQTT2_DEVICE}{defptr}}) {
next if($key1 !~ m/^re/);
my $dp = $modules{MQTT2_DEVICE}{defptr}{$key1};
foreach my $re (keys %{$dp}) {
foreach my $key (keys %{$dp->{$re}}) {
if($key =~ m/^$name,/) {
delete($dp->{$re}{$key});
delete($dp->{$re}) if(!int(keys %{$dp->{$re}}));
}
foreach my $key2 (keys %{$dp->{$re}}) {
delete($dp->{$re}{$key2}) if($key2 =~ m/^$name,/);
}
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));
my $errMsg = CheckRegexp($re, "readingList attribute for $name");
return $errMsg if($errMsg);
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 {
$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;