From 29637784efb33cd8f04231898e6fecdabfc70579 Mon Sep 17 00:00:00 2001 From: erwin <> Date: Thu, 20 Jan 2022 18:53:45 +0000 Subject: [PATCH] 10_KNX.pm: bugfix dpt14 (Forum Thread #122582) git-svn-id: https://svn.fhem.de/fhem/trunk@25522 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/10_KNX.pm | 50 +++++++++++++++++++-------------------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index bf5dde0c0..59a94309e 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 10_KNX: fix dpt14 set 0 - bugfix: 89_FULLY: Fixed speak and overlayMessage commands. - bugfix: 74_XiaomiBTLESens: fix incurrect temperatur then value is negativ - feature: 30_HUEBridge: support eventstream api (push events) diff --git a/fhem/FHEM/10_KNX.pm b/fhem/FHEM/10_KNX.pm index 00f2ec042..db4a46e29 100644 --- a/fhem/FHEM/10_KNX.pm +++ b/fhem/FHEM/10_KNX.pm @@ -71,6 +71,8 @@ # corrections cmd-ref # optimize replaceByRegex # MH 20220108 fix KNX_scan sub (export-problem) +# MH 202201xx E05.02 fix dpt14 "0" +# avoid undefined event when autocreate ignoreTypes is set package FHEM::KNX; ## no critic 'package' @@ -100,7 +102,7 @@ BEGIN { qw(readingsSingleUpdate readingsBulkUpdate readingsBulkUpdateIfChanged readingsBeginUpdate readingsEndUpdate Log3 AttrVal ReadingsVal ReadingsNum - addToDevAttrList + addToDevAttrList AssignIoPort IOWrite CommandDefMod CommandModify CommandDelete defs modules attr @@ -277,15 +279,16 @@ my %dpttypes = ( 'dpt13.013' => {CODE=>'dpt13', UNIT=>q{kWh}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/ix, MIN=>-2147483648, MAX=>2147483647}, # 4-Octet single precision float - 'dpt14' => {CODE=>'dpt14', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef, +#E05.02 'dpt14' => {CODE=>'dpt14', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef, + 'dpt14' => {CODE=>'dpt14', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef, DEC=>\&dec_dpt14,ENC=>\&enc_dpt14,}, - 'dpt14.019' => {CODE=>'dpt14', UNIT=>q{A}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.027' => {CODE=>'dpt14', UNIT=>q{V}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.033' => {CODE=>'dpt14', UNIT=>q{Hz}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.056' => {CODE=>'dpt14', UNIT=>q{W}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.068' => {CODE=>'dpt14', UNIT=>q{°C}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.076' => {CODE=>'dpt14', UNIT=>q{m³}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, - 'dpt14.057' => {CODE=>'dpt14', UNIT=>q{cos Φ}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/ix, MIN=>undef, MAX=>undef}, + 'dpt14.019' => {CODE=>'dpt14', UNIT=>q{A}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.027' => {CODE=>'dpt14', UNIT=>q{V}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.033' => {CODE=>'dpt14', UNIT=>q{Hz}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.056' => {CODE=>'dpt14', UNIT=>q{W}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.068' => {CODE=>'dpt14', UNIT=>q{°C}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.076' => {CODE=>'dpt14', UNIT=>q{m³}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, + 'dpt14.057' => {CODE=>'dpt14', UNIT=>q{cosΦ}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[-+]?(?:\d*[\.\,])?\d+/ix, MIN=>undef, MAX=>undef}, # 14-Octet String 'dpt16' => {CODE=>'dpt16', UNIT=>q{}, FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/.{1,14}/ix, MIN=>undef, MAX=>undef, SETLIST=>'multiple,>CLR<', @@ -377,7 +380,7 @@ sub KNX_Define { # check if the last arg matches any IO-Device - and assign it - else use the automatic mechanism if ( $a[int(@a) - 1] !~ m/^(?:$PAT_GAD|$PAT_GAD_HEX)/ix ) { my $iodevCandidate = pop(@a); - my @tulList = devspec2array('TYPE=(TUL|KNXTUL|KNXIO)'); #E05.00 + my @tulList = devspec2array('TYPE=(TUL|KNXTUL|KNXIO)'); my $found = undef; foreach my $tuls (@tulList) { if ($tuls eq $iodevCandidate) { @@ -938,7 +941,7 @@ sub KNX_Attr { foreach my $iodev (@IOList) { return if ($iodev eq $aVal); # ok } -#E05.00 # add support for fhem2fhem as io-dev + # add support for fhem2fhem as io-dev my @IOList2 = devspec2array('TYPE=FHEM2FHEM'); foreach my $iodev (@IOList2) { next if ($iodev ne $aVal); @@ -1030,15 +1033,16 @@ sub KNX_Parse { #gad not defined yet, give feedback for autocreate if (not (exists $modules{KNX}{defptr}{$gadCode})) { -# #E05.00 check if any autocreate device is disabled -# my @acList = devspec2array('TYPE=autocreate'); -# foreach my $acdev (@acList) { -# return q{} if (Value($defs{$acdev}) eq 'disabled'); # dont go thru "UNDEFINED...." -# } #format gad my $gad = KNX_hexToName($gadCode); #create name my $newDevName = sprintf("KNX_%.2d%.2d%.3d",split (/\//x, $gad)); + #E05.02 check if any autocreate device has ignoretype "KNX..." set + my @acList = devspec2array('TYPE=autocreate'); + foreach my $acdev (@acList) { + my $igntypes = AttrVal($acdev,'ignoreTypes',''); + return q{} if($newDevName =~ /$igntypes/x); + } return "UNDEFINED $newDevName KNX $gad:$MODELERR"; } @@ -1171,13 +1175,8 @@ sub KNX_SetReadings { #append post-string, if supplied my $suffix = AttrVal($name, 'format', undef); $transval .= q{ } . $suffix if (defined($suffix)); -#E05.01 #execute stateRegex + #execute stateRegex my $state = KNX_replaceByRegex ($hash, $rdName, $transval); -# my $regAttr = AttrVal($name, "stateRegex", undef); -# my $state = KNX_replaceByRegex ($regAttr, $rdName, $transval); -# -# my $logstr = (defined($state))?$state:'UNDEFINED'; -# Log3 ($name, 5, "KNX_SetReadings: $name - replaced $rdName value from: $transval to $logstr") if ($transval ne $logstr); my $lsvalue = 'fhem'; # called from set $lsvalue = KNX_hexToName2($src) if (defined($src) && ($src ne q{})); # called from parse @@ -1310,7 +1309,6 @@ sub KNX_checkAndClean { return $value; } -#E05.01 # replace state-values by Attr stateRegex sub KNX_replaceByRegex { my ($hash, $rdName, $input) = @_; @@ -1319,11 +1317,6 @@ sub KNX_replaceByRegex { my $regAttr = AttrVal($name, 'stateRegex', undef); return $input if (! defined($regAttr)); -#sub KNX_replaceByRegex { -# my ($regAttr, $rdName, $input) = @_; -# -# return $input if (! defined($regAttr)); -# my $retVal = $input; #execute regex, if defined @@ -1841,7 +1834,6 @@ sub dec_dpt232 { #RGB-Code ### called with devspec as argument ### e.g : KNX_scan() / KNX_scan('device1') / KNX_scan('device1, dev2,dev3,...' / KNX_scan('room=Kueche'), ... ### returns number of "gets" executed -#E05.01 sub main::KNX_scan { my $devs = shift; my @devlist = ();