mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-21 20:06:18 +00:00
10_MQTT2_DEVICE.pm: add bridgeRegexp (Forum #91394)
git-svn-id: https://svn.fhem.de/fhem/trunk@17685 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
2069e8322a
commit
324a303f8a
@ -22,6 +22,7 @@ MQTT2_DEVICE_Initialize($)
|
|||||||
no warnings 'qw';
|
no warnings 'qw';
|
||||||
my @attrList = qw(
|
my @attrList = qw(
|
||||||
IODev
|
IODev
|
||||||
|
bridgeRegexp:textField-long
|
||||||
devicetopic
|
devicetopic
|
||||||
disable:0,1
|
disable:0,1
|
||||||
disabledForIntervals
|
disabledForIntervals
|
||||||
@ -32,7 +33,7 @@ MQTT2_DEVICE_Initialize($)
|
|||||||
);
|
);
|
||||||
use warnings 'qw';
|
use warnings 'qw';
|
||||||
$hash->{AttrList} = join(" ", @attrList)." ".$readingFnAttributes;
|
$hash->{AttrList} = join(" ", @attrList)." ".$readingFnAttributes;
|
||||||
my %h = ( re=>{}, cid=>{});
|
my %h = ( re=>{}, cid=>{}, bridge=>{} );
|
||||||
$modules{MQTT2_DEVICE}{defptr} = \%h;
|
$modules{MQTT2_DEVICE}{defptr} = \%h;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,8 +129,24 @@ MQTT2_DEVICE_Parse($$)
|
|||||||
# autocreate and expand readingList
|
# autocreate and expand readingList
|
||||||
if($autocreate && !%fnd) {
|
if($autocreate && !%fnd) {
|
||||||
return "" if($cid && $cid =~ m/mosqpub.*/);
|
return "" if($cid && $cid =~ m/mosqpub.*/);
|
||||||
my $cidHash = $modules{MQTT2_DEVICE}{defptr}{cid}{$cid};
|
|
||||||
my $nn = $cidHash ? $cidHash->{NAME} : "MQTT2_$cid";
|
################## bridge stuff
|
||||||
|
my $newCid = $cid;
|
||||||
|
my $bp = $modules{MQTT2_DEVICE}{defptr}{bridge};
|
||||||
|
foreach my $re (keys %{$bp}) {
|
||||||
|
next if(!("$topic:$value" =~ m/^$re$/s ||
|
||||||
|
"$cid:$topic:$value" =~ m/^$re$/s));
|
||||||
|
my $cidExpr = $bp->{$re};
|
||||||
|
$newCid = eval $cidExpr;
|
||||||
|
if($@) {
|
||||||
|
Log 1, "MQTT2_DEVICE: Error evaluating $cidExpr: $@";
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $cidHash = $modules{MQTT2_DEVICE}{defptr}{cid}{$newCid};
|
||||||
|
my $nn = $cidHash ? $cidHash->{NAME} : "MQTT2_$newCid";
|
||||||
PrioQueue_add(sub{
|
PrioQueue_add(sub{
|
||||||
return if(!$defs{$nn});
|
return if(!$defs{$nn});
|
||||||
my $add;
|
my $add;
|
||||||
@ -146,7 +163,8 @@ MQTT2_DEVICE_Parse($$)
|
|||||||
CommandAttr(undef, "$nn readingList $rl$cid:$topic:.* $add");
|
CommandAttr(undef, "$nn readingList $rl$cid:$topic:.* $add");
|
||||||
MQTT2_DEVICE_Parse($iodev, $msg);
|
MQTT2_DEVICE_Parse($iodev, $msg);
|
||||||
}, undef);
|
}, undef);
|
||||||
return "UNDEFINED $nn MQTT2_DEVICE $cid" if(!$cidHash);
|
|
||||||
|
return "UNDEFINED $nn MQTT2_DEVICE $newCid" if(!$cidHash);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,6 +321,18 @@ MQTT2_DEVICE_Attr($$)
|
|||||||
}
|
}
|
||||||
MQTT2_DEVICE_addReading($dev, $param) if($atype eq "reading");
|
MQTT2_DEVICE_addReading($dev, $param) if($atype eq "reading");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($attrName eq "bridgeRegexp" && $type eq "set") {
|
||||||
|
foreach my $el (split("\n", $param)) {
|
||||||
|
my ($par1, $par2) = split(" ", $el, 2);
|
||||||
|
next if(!$par1);
|
||||||
|
return "$dev attr $attrName: more parameters needed" if(!$par2);
|
||||||
|
eval { "Hallo" =~ m/^$par1$/ };
|
||||||
|
return "$dev $attrName regexp error: $@" if($@);
|
||||||
|
$modules{MQTT2_DEVICE}{defptr}{bridge}{$par1} = $par2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,6 +423,21 @@ MQTT2_DEVICE_Undef($$)
|
|||||||
<b>Attributes</b>
|
<b>Attributes</b>
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
|
<a name="bridgeRegexp"></a>
|
||||||
|
<li>bridgeRegexp <regexp> newClientId ...
|
||||||
|
Used to automatically redirect some types of topics to different
|
||||||
|
MQTT2_DEVICE instances. The regexp is checked against the
|
||||||
|
clientid:topic:message and topic:message. The newClientId is a perl
|
||||||
|
expression!. Example:
|
||||||
|
<ul>
|
||||||
|
attr zigbbe2mqtt bridgeRegexp zigbee2mqtt/0x00158d0001([^:]*):.*
|
||||||
|
"zigbee_$1"
|
||||||
|
</ul>
|
||||||
|
will create different MQTT2_DEVICE instances for different hex numbers in
|
||||||
|
the topic. Note: the newClientId is enclosed in "", as it is a perl
|
||||||
|
expression. Multiple tuples are separated by newline.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
<a name="devicetopic"></a>
|
<a name="devicetopic"></a>
|
||||||
<li>devicetopic value<br>
|
<li>devicetopic value<br>
|
||||||
replace $DEVICETOPIC in the topic part of readingList, setList and
|
replace $DEVICETOPIC in the topic part of readingList, setList and
|
||||||
|
Loading…
x
Reference in New Issue
Block a user