mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-04 05:16:45 +00:00
10_MQTT2_DEVICE.pm: optimize performance for lot of devices (Forum #106539)
git-svn-id: https://svn.fhem.de/fhem/trunk@20794 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
8310ea1a36
commit
9619fcb298
@ -138,25 +138,26 @@ MQTT2_DEVICE_Parse($$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
my ($cid, $topic, $value) = split("\0", $msg, 3);
|
my ($cid, $topic, $value) = split("\0", $msg, 3);
|
||||||
my $dp = $modules{MQTT2_DEVICE}{defptr}{re};
|
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"};
|
||||||
foreach my $re (keys %{$dp}) {
|
foreach my $re (keys %{$dp}) {
|
||||||
my $reAll = $re;
|
my $reAll = $re;
|
||||||
$reAll =~ s/\$DEVICETOPIC/\.\*/g;
|
$reAll =~ s/\$DEVICETOPIC/\.\*/g;
|
||||||
|
|
||||||
next if(!("$topic:$value" =~ m/^$reAll$/s ||
|
next if(!("$topic:$value" =~ m/^$reAll$/s ||
|
||||||
"$cid:$topic:$value" =~ m/^$reAll$/s));
|
"$cid:$topic:$value" =~ m/^$reAll$/s));
|
||||||
foreach my $key (keys %{$dp->{$re}}) {
|
foreach my $key (keys %{$dp->{$re}}) { # multiple entries for one topic-re
|
||||||
my ($dev, $code2) = split(",",$key,2);
|
my ($dev, $code) = split(",",$key,2);
|
||||||
my $hash = $defs{$dev};
|
my $hash = $defs{$dev};
|
||||||
next if(!$hash);
|
next if(!$hash);
|
||||||
next if(IsDisabled($dev));
|
|
||||||
my $reRepl = $re;
|
my $reRepl = $re;
|
||||||
$reRepl =~ s/\$DEVICETOPIC/$hash->{DEVICETOPIC}/g;
|
$reRepl =~ s/\$DEVICETOPIC/$hash->{DEVICETOPIC}/g;
|
||||||
next if(!("$topic:$value" =~ m/^$reRepl$/s ||
|
next if(!("$topic:$value" =~ m/^$reRepl$/s ||
|
||||||
"$cid:$topic:$value" =~ m/^$reRepl$/s));
|
"$cid:$topic:$value" =~ m/^$reRepl$/s));
|
||||||
|
next if(IsDisabled($dev));
|
||||||
|
|
||||||
my @retData;
|
my @retData;
|
||||||
my $code = $dp->{$re}{$key};
|
|
||||||
Log3 $dev, 4, "MQTT2_DEVICE_Parse: $dev $topic => $code";
|
Log3 $dev, 4, "MQTT2_DEVICE_Parse: $dev $topic => $code";
|
||||||
|
|
||||||
if($code =~ m/^{.*}$/s) {
|
if($code =~ m/^{.*}$/s) {
|
||||||
@ -184,6 +185,7 @@ MQTT2_DEVICE_Parse($$)
|
|||||||
$fnd{$dev} = 1;
|
$fnd{$dev} = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
# IODevs autocreate and/or expand readingList
|
# IODevs autocreate and/or expand readingList
|
||||||
@ -513,7 +515,10 @@ sub
|
|||||||
MQTT2_DEVICE_delReading($)
|
MQTT2_DEVICE_delReading($)
|
||||||
{
|
{
|
||||||
my ($name) = @_;
|
my ($name) = @_;
|
||||||
my $dp = $modules{MQTT2_DEVICE}{defptr}{re};
|
my $cid = $defs{$name}{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"};
|
||||||
foreach my $re (keys %{$dp}) {
|
foreach my $re (keys %{$dp}) {
|
||||||
foreach my $key (keys %{$dp->{$re}}) {
|
foreach my $key (keys %{$dp->{$re}}) {
|
||||||
if($key =~ m/^$name,/) {
|
if($key =~ m/^$name,/) {
|
||||||
@ -523,22 +528,42 @@ MQTT2_DEVICE_delReading($)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
MQTT2_DEVICE_addReading($$)
|
MQTT2_DEVICE_addReading($$)
|
||||||
{
|
{
|
||||||
my ($name, $param) = @_;
|
my ($name, $param) = @_;
|
||||||
MQTT2_DEVICE_delReading($name);
|
MQTT2_DEVICE_delReading($name);
|
||||||
|
my $cid = $defs{$name}{CID};
|
||||||
foreach my $line (split("\n", $param)) {
|
foreach my $line (split("\n", $param)) {
|
||||||
my ($re,$code) = split(" ", $line,2);
|
my ($re,$code) = split(" ", $line,2);
|
||||||
return "Bad line >$line< for $name" if(!defined($re) || !defined($code));
|
return "Bad line >$line< for $name" if(!defined($re) || !defined($code));
|
||||||
eval { "Hallo" =~ m/^$re$/ };
|
eval { "Hallo" =~ m/^$re$/ };
|
||||||
return "Bad regexp: $@" if($@);
|
return "Bad regexp: $@" if($@);
|
||||||
$modules{MQTT2_DEVICE}{defptr}{re}{$re}{"$name,$code"} = $code;
|
if($cid && $re =~ m/^$cid:/) {
|
||||||
|
$modules{MQTT2_DEVICE}{defptr}{"re:$cid"}{$re}{"$name,$code"} = 1;
|
||||||
|
} else {
|
||||||
|
$modules{MQTT2_DEVICE}{defptr}{re}{$re}{"$name,$code"} = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
MQTT2_DEVICE_dumpInternal()
|
||||||
|
{
|
||||||
|
my $dp = $modules{MQTT2_DEVICE}{defptr};
|
||||||
|
my @ret;
|
||||||
|
for my $k1 (sort keys %{$dp}) {
|
||||||
|
push(@ret, $k1);
|
||||||
|
for my $k2 (sort keys %{$dp->{$k1}}) {
|
||||||
|
push(@ret, " $k2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return join("\n", @ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
sub
|
sub
|
||||||
|
Loading…
x
Reference in New Issue
Block a user