mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-30 18:12:28 +00:00
10_KNX.pm: few bugfixes & new sub-dpts, (Forum #122582)
git-svn-id: https://svn.fhem.de/fhem/trunk@27449 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d37a54e26d
commit
4237a16c02
@ -122,8 +122,12 @@
|
||||
# MH 20230328 syntax check on attr stateregex
|
||||
# reminder to migrate to KNXIO
|
||||
# announce answerreading as deprecated
|
||||
# MH 202304xx implement KNX_Log
|
||||
# MH 20230407 implement KNX_Log
|
||||
# simplyfy checkAndClean-sub
|
||||
# MH 20230415 fixed unint in define2 [line 543]
|
||||
# fixed allowed range for dpt6.001
|
||||
# add dpt7.002 - 7.004
|
||||
# fixed scaling dpt8.003 .004 .010
|
||||
# todo replace cascading if..elsif with given
|
||||
|
||||
|
||||
@ -158,7 +162,7 @@ BEGIN {
|
||||
AttrVal InternalVal ReadingsVal ReadingsNum
|
||||
addToDevAttrList
|
||||
AssignIoPort IOWrite
|
||||
CommandDefMod CommandModify CommandDelete
|
||||
CommandDefMod CommandModify CommandDelete CommandDeleteAttr
|
||||
defs modules attr cmds
|
||||
perlSyntaxCheck
|
||||
FW_detail FW_wname FW_directNotify
|
||||
@ -267,40 +271,43 @@ my %dpttypes = (
|
||||
'dpt4.002' => {CODE=>'dpt4', UNIT=>q{}, FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/[\x20-\xFF].*/ixms, MIN=>undef, MAX=>undef}, # iso-8859-1
|
||||
|
||||
# 1-Octet unsigned value
|
||||
'dpt5' => {CODE=>'dpt5', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>255,
|
||||
'dpt5' => {CODE=>'dpt5', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}/ixms, MIN=>0, MAX=>255,
|
||||
DEC=>\&dec_dpt5,ENC=>\&enc_dpt5,},
|
||||
'dpt5.001' => {CODE=>'dpt5', UNIT=>q{%}, FACTOR=>100/255, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>100},
|
||||
'dpt5.003' => {CODE=>'dpt5', UNIT=>q{°}, FACTOR=>360/255, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>360},
|
||||
'dpt5.004' => {CODE=>'dpt5', UNIT=>q{%}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>255},
|
||||
'dpt5.010' => {CODE=>'dpt5', UNIT=>q{p}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>255}, # counter pulses
|
||||
'dpt5.001' => {CODE=>'dpt5', UNIT=>q{%}, FACTOR=>100/255, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}/ixms, MIN=>0, MAX=>100},
|
||||
'dpt5.003' => {CODE=>'dpt5', UNIT=>q{°}, FACTOR=>360/255, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}/ixms, MIN=>0, MAX=>360},
|
||||
'dpt5.004' => {CODE=>'dpt5', UNIT=>q{%}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}/ixms, MIN=>0, MAX=>255},
|
||||
'dpt5.010' => {CODE=>'dpt5', UNIT=>q{p}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}/ixms, MIN=>0, MAX=>255}, # counter pulses
|
||||
|
||||
# 1-Octet signed value
|
||||
'dpt6' => {CODE=>'dpt6', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>-128, MAX=>127,
|
||||
DEC=>\&dec_dpt6,ENC=>\&enc_dpt6,},
|
||||
'dpt6.001' => {CODE=>'dpt6', UNIT=>q{%}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>0, MAX=>100},
|
||||
'dpt6.001' => {CODE=>'dpt6', UNIT=>q{%}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>-128, MAX=>127},
|
||||
'dpt6.010' => {CODE=>'dpt6', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/ixms, MIN=>-128, MAX=>127},
|
||||
|
||||
# 2-Octet unsigned Value
|
||||
'dpt7' => {CODE=>'dpt7', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535,
|
||||
'dpt7' => {CODE=>'dpt7', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535,
|
||||
DEC=>\&dec_dpt7,ENC=>\&enc_dpt7,},
|
||||
'dpt7.001' => {CODE=>'dpt7', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.005' => {CODE=>'dpt7', UNIT=>q{s}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.006' => {CODE=>'dpt7', UNIT=>q{m}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.007' => {CODE=>'dpt7', UNIT=>q{h}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.012' => {CODE=>'dpt7', UNIT=>q{mA}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.013' => {CODE=>'dpt7', UNIT=>q{lux}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.001' => {CODE=>'dpt7', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.002' => {CODE=>'dpt7', UNIT=>q{ms}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.003' => {CODE=>'dpt7', UNIT=>q{s}, FACTOR=>0.01, OFFSET=>0, PATTERN=>qr/[+]?\d{1,3}(\.\d+)?/ixms, MIN=>0, MAX=>655.35},
|
||||
'dpt7.004' => {CODE=>'dpt7', UNIT=>q{s}, FACTOR=>0.1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,4}(\.\d+)?/ixms, MIN=>0, MAX=>6553.5},
|
||||
'dpt7.005' => {CODE=>'dpt7', UNIT=>q{s}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.006' => {CODE=>'dpt7', UNIT=>q{m}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.007' => {CODE=>'dpt7', UNIT=>q{h}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.012' => {CODE=>'dpt7', UNIT=>q{mA}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.013' => {CODE=>'dpt7', UNIT=>q{lux}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>65535},
|
||||
'dpt7.600' => {CODE=>'dpt7', UNIT=>q{K}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+]?\d{1,5}/ixms, MIN=>0, MAX=>12000}, # Farbtemperatur
|
||||
|
||||
# 2-Octet signed Value
|
||||
'dpt8' => {CODE=>'dpt8', UNIT=>q{}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767,
|
||||
DEC=>\&dec_dpt8,ENC=>\&enc_dpt8,},
|
||||
'dpt8.001' => {CODE=>'dpt8', UNIT=>q{p}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767},
|
||||
'dpt8.003' => {CODE=>'dpt8', UNIT=>q{s}, FACTOR=>0.01, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-327.68, MAX=>327.67},
|
||||
'dpt8.004' => {CODE=>'dpt8', UNIT=>q{s}, FACTOR=>0.1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-3276.8, MAX=>3276.7},
|
||||
'dpt8.003' => {CODE=>'dpt8', UNIT=>q{s}, FACTOR=>0.01, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}(\.\d+)?/ixms, MIN=>-327.68, MAX=>327.67},
|
||||
'dpt8.004' => {CODE=>'dpt8', UNIT=>q{s}, FACTOR=>0.1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,4}(\.\d+)?/ixms, MIN=>-3276.8, MAX=>3276.7},
|
||||
'dpt8.005' => {CODE=>'dpt8', UNIT=>q{s}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767},
|
||||
'dpt8.006' => {CODE=>'dpt8', UNIT=>q{min}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767},
|
||||
'dpt8.007' => {CODE=>'dpt8', UNIT=>q{h}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767},
|
||||
'dpt8.010' => {CODE=>'dpt8', UNIT=>q{%}, FACTOR=>0.01, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-327.68, MAX=>327.67}, # min/max
|
||||
'dpt8.010' => {CODE=>'dpt8', UNIT=>q{%}, FACTOR=>0.01, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}(\.\d+)?/ixms, MIN=>-327.68, MAX=>327.67}, # min/max
|
||||
'dpt8.011' => {CODE=>'dpt8', UNIT=>q{°}, FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,5}/ixms, MIN=>-32768, MAX=>32767},
|
||||
|
||||
# 2-Octet Float value
|
||||
@ -427,12 +434,12 @@ sub Initialize {
|
||||
$hash->{AttrList} = 'IODev ' . #define IO-Device to communicate with. Deprecated at definition line.
|
||||
'disable:1 ' . #device disabled
|
||||
'showtime:1,0 ' . #shows time instead of received value in state
|
||||
'answerReading:1,0 ' . #allows FHEM to answer a read telegram
|
||||
'stateRegex:textField-long ' . #modifies state value
|
||||
'stateCmd:textField-long ' . #modify state value
|
||||
'putCmd:textField-long ' . #called when the KNX bus asks for a -put reading
|
||||
'putCmd:textField-long ' . #enable FHEM to answer KNX read telegrams
|
||||
'format ' . #supplies post-string
|
||||
'KNX_toggle:textField ' . #toggle source <device>:<reading>
|
||||
'answerReading:1,0 ' . #DEPRECATED allows FHEM to answer a read telegram
|
||||
'listenonly:1,0 ' . #DEPRECATED
|
||||
'readonly:1,0 ' . #DEPRECATED
|
||||
'slider ' . #DEPRECATED
|
||||
@ -540,12 +547,10 @@ sub KNX_Define2 {
|
||||
|
||||
if (scalar(@gadArgs)) {
|
||||
$gadNoSuffix = pop(@gadArgs) if ($gadArgs[-1] =~ /$PAT_GAD_SUFFIX/ixms);
|
||||
$gadOption = pop(@gadArgs) if ($gadArgs[-1] =~ /^($PAT_GAD_OPTIONS)$/ixms);
|
||||
$gadOption = pop(@gadArgs) if (@gadArgs && $gadArgs[-1] =~ /^($PAT_GAD_OPTIONS)$/ixms);
|
||||
$gadName = pop(@gadArgs) if (@gadArgs);
|
||||
|
||||
return qq{KNX_define2 $name: forbidden gad-name $gadName} if ($gadName =~ /$PAT_GAD_NONAME$/ixms);
|
||||
# return qq{KNX_define2 $name: invalid option for group-number $gadNo. Use one of: $PAT_GAD_OPTIONS} if (defined($gadOption) && ($gadOption !~ m/^(?:$PAT_GAD_OPTIONS)$/ixms));
|
||||
# return qq{KNX_define2 $name: invalid suffix for group-number $gadNo. Use $PAT_GAD_SUFFIX} if (defined($gadNoSuffix) && ($gadNoSuffix !~ m/$PAT_GAD_SUFFIX/ixms));
|
||||
}
|
||||
|
||||
###GADTABLE
|
||||
@ -921,24 +926,26 @@ sub KNX_Attr {
|
||||
my $hash = $defs{$name};
|
||||
my $value = undef;
|
||||
|
||||
if ($cmd eq 'set' && $aName =~ m/(listenonly|readonly|slider)/ixms) {
|
||||
if ($cmd eq 'set') {
|
||||
if ($aName =~ m/(listenonly|readonly|slider)/ixms) {
|
||||
KNX_Log ($name, 3, qq{Attribute "$aName" is not supported/have no function at all, pls. check cmdref for equivalent function.});
|
||||
return qq{KNX_Attr ($name): Attribute "$aName" is not supported/have no function at all, pls. check cmdref for equivalent function.};
|
||||
}
|
||||
|
||||
if ($cmd eq 'set' && $aName eq 'answerReading') { # deprecate announcement
|
||||
if (defined(AttrVal($name,'putCmd',undef))) {
|
||||
delete ($attr{$name}{$aName});
|
||||
return qq{Attribute $aName will be deleted now! It has no function while Attr. "putCmd" is defined. };
|
||||
} else {
|
||||
if ($aName eq 'answerReading') { # deprecate announcement 03/2023
|
||||
KNX_Log ($name, 3, qq{Attribute "$aName" will be deprecated soon, consider using Attr "putCmd" instead});
|
||||
=pod
|
||||
# set attr putCmd
|
||||
KNX_Log ($name, 3, qq{Attribute "$aName" is deprecated, Attr. is converted to "putCmd"}).
|
||||
# CommandDeleteAttr(undef,"$hash $aName -silent");
|
||||
# set attr putCmd
|
||||
@_[2] = q{putCmd};
|
||||
@_[3] = '{return $state;}';
|
||||
=cut
|
||||
}
|
||||
elsif ($aName eq 'putCmd' && defined(AttrVal($name,'answerReading',undef))) {
|
||||
KNX_Log ($name, 3, q{Attribute "answerReading" will be deleted now! It has no function while Attr. "putCmd" is defined. });
|
||||
CommandDeleteAttr(undef,"$hash answerReading -silent");
|
||||
}
|
||||
}
|
||||
|
||||
if ($cmd eq 'set' && $init_done) {
|
||||
@ -1715,7 +1722,9 @@ sub dec_dpt7 { #2-Octet unsigned Value
|
||||
my $model = shift;
|
||||
my $hash = shift;
|
||||
my $state = KNX_limit ($hash, $numval, $model, 'DECODE');
|
||||
return sprintf ('%.0f', $state);
|
||||
return sprintf ('%.2f', $state) if ($model eq 'dpt7.003');
|
||||
return sprintf ('%.1f', $state) if ($model eq 'dpt7.004');
|
||||
return sprintf ('%d', $state);
|
||||
}
|
||||
|
||||
sub dec_dpt8 { #2-Octet signed Value
|
||||
@ -1724,6 +1733,8 @@ sub dec_dpt8 { #2-Octet signed Value
|
||||
my $hash = shift;
|
||||
$numval = unpack('s',pack('S',$numval));
|
||||
my $state = KNX_limit ($hash, $numval, $model, 'DECODE');
|
||||
return sprintf ('%.2f', $state) if ($model =~ /^(dpt8\.003|dpt8\.010)/ixms);
|
||||
return sprintf ('%.1f', $state) if ($model eq 'dpt8.004');
|
||||
return sprintf ('%d', $state);
|
||||
}
|
||||
|
||||
@ -1904,7 +1915,7 @@ sub KNX_Log {
|
||||
sub main::KNX_scancmd {
|
||||
my $cl = shift;
|
||||
my $devs = shift;
|
||||
$devs = undef if ($devs eq q{});
|
||||
$devs = 'TYPE=KNX' if (! defined($devs) || $devs eq q{}); # select all if nothing defined
|
||||
return main::KNX_scan($devs);
|
||||
}
|
||||
|
||||
@ -1958,10 +1969,15 @@ sub main::KNX_scan {
|
||||
### issue all get cmd's - each one delayed by InternalTimer
|
||||
sub doKNX_scan {
|
||||
my ($devgad, $arr) = split(/,/xms,shift,2);
|
||||
|
||||
main::fhem("get $devgad");
|
||||
return if (! defined($arr) || $arr eq q{});
|
||||
|
||||
if (defined($arr) && $arr ne q{}) {
|
||||
return InternalTimer(gettimeofday() + 0.2,\&doKNX_scan,$arr); # does not support array-> use string...
|
||||
}
|
||||
Log3 (undef, 3, q{KNX_scan: finished});
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
@ -2253,6 +2269,9 @@ The answer from the bus-device updates the readings <getName> and state.</
|
||||
<li><b>dpt6.010 </b> -128..+127</li>
|
||||
<li><b>dpt7 </b> 0..65535</li>
|
||||
<li><b>dpt7.001 </b> 0..65535 s</li>
|
||||
<li><b>dpt7.002 </b> 0..65535 ms</li>
|
||||
<li><b>dpt7.003 </b> 0..655.35 s</li>
|
||||
<li><b>dpt7.004 </b> 0..6553.5 s</li>
|
||||
<li><b>dpt7.005 </b> 0..65535 s</li>
|
||||
<li><b>dpt7.006 </b> 0..65535 m</li>
|
||||
<li><b>dpt7.007 </b> 0..65535 h</li>
|
||||
|
Loading…
x
Reference in New Issue
Block a user