From 0db9c9f58ac858cfb929637b03d665bc63a55edd Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Mon, 5 Nov 2018 15:54:15 +0000 Subject: [PATCH] 10_MQTT2_DEVICE.pm: add bridgeRegexp (Forum #91394) git-svn-id: https://svn.fhem.de/fhem/trunk@17685 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_MQTT2_DEVICE.pm | 53 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/fhem/FHEM/10_MQTT2_DEVICE.pm b/fhem/FHEM/10_MQTT2_DEVICE.pm index 23ad1b5e9..55d2a2b0c 100644 --- a/fhem/FHEM/10_MQTT2_DEVICE.pm +++ b/fhem/FHEM/10_MQTT2_DEVICE.pm @@ -22,6 +22,7 @@ MQTT2_DEVICE_Initialize($) no warnings 'qw'; my @attrList = qw( IODev + bridgeRegexp:textField-long devicetopic disable:0,1 disabledForIntervals @@ -32,7 +33,7 @@ MQTT2_DEVICE_Initialize($) ); use warnings 'qw'; $hash->{AttrList} = join(" ", @attrList)." ".$readingFnAttributes; - my %h = ( re=>{}, cid=>{}); + my %h = ( re=>{}, cid=>{}, bridge=>{} ); $modules{MQTT2_DEVICE}{defptr} = \%h; } @@ -128,8 +129,24 @@ MQTT2_DEVICE_Parse($$) # autocreate and expand readingList if($autocreate && !%fnd) { 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{ return if(!$defs{$nn}); my $add; @@ -146,7 +163,8 @@ MQTT2_DEVICE_Parse($$) CommandAttr(undef, "$nn readingList $rl$cid:$topic:.* $add"); MQTT2_DEVICE_Parse($iodev, $msg); }, undef); - return "UNDEFINED $nn MQTT2_DEVICE $cid" if(!$cidHash); + + return "UNDEFINED $nn MQTT2_DEVICE $newCid" if(!$cidHash); return ""; } @@ -303,6 +321,18 @@ MQTT2_DEVICE_Attr($$) } 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; } @@ -393,6 +423,21 @@ MQTT2_DEVICE_Undef($$) Attributes