2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-01 15:44:52 +00:00

10_KNX.pm: ABU 20170427 reintegrated mechanism for extended adressing, integrated setExtensions, added dpt1.010 (start/stop), added dpt2

git-svn-id: https://svn.fhem.de/fhem/trunk@14127 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
andi291 2017-04-28 10:01:12 +00:00
parent 0e1025056e
commit 73370b5b8b

View File

@ -26,6 +26,10 @@
# ABU 20170110 removed mod for extended adressing
# ABU 20100114 fixed dpt9-regex
# ABU 20100116 fixed dpt9-regex again
# ABU 20170427 reintegrated mechanism for extended adressing
# ABU 20170427 integrated setExtensions
# ABU 20170427 added dpt1.010 (start/stop)
# ABU 20170427 added dpt2
package main;
@ -68,10 +72,9 @@ my $id = 'C';
#regex patterns
my $PAT_GAD = qr/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,3}$/;
#old syntax
my $PAT_GAD_HEX = qr/^[0-9a-f]{4}$/;
#my $PAT_GAD_HEX = qr/^[0-9a-f]{4}$/;
#new syntax for extended adressing
#removed, seems to be broken
#my $PAT_GAD_HEX = qr/^[0-9a-f]{5}$/;
my $PAT_GAD_HEX = qr/^[0-9a-f]{5}$/;
my $PAT_GNO = qr/[gG][1-9][0-9]?/;
#CODE is the identifier for the en- and decode algos. See encode and decode functions
@ -87,8 +90,12 @@ my %dpttypes = (
"dpt1.003" => {CODE=>"dpt1", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/(([eE][nN]|[dD][iI][sS])[aA][bB][lL][eE])|(0?1)|(0?0)/, MIN=>"disable", MAX=>"enable"},
"dpt1.008" => {CODE=>"dpt1", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/([uU][pP])|([dD][oO][wW][nN])|(0?1)|(0?0)/, MIN=>"up", MAX=>"down"},
"dpt1.009" => {CODE=>"dpt1", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/([cC][lL][oO][sS][eE][dD])|([oO][pP][eE][nN])|(0?1)|(0?0)/, MIN=>"open", MAX=>"closed"},
"dpt1.009" => {CODE=>"dpt1", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/([sS][tT][aA][rR][tT])|([sS][tT][oO][pP])|(0?1)|(0?0)/, MIN=>"stop", MAX=>"start"},
"dpt1.019" => {CODE=>"dpt1", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/([cC][lL][oO][sS][eE][dD])|([oO][pP][eE][nN])|(0?1)|(0?0)/, MIN=>"closed", MAX=>"open"},
#Step value (two-bit)
"dpt2" => {CODE=>"dpt2", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/([oO][nN])|([oO][fF][fF])|([fF][oO][rR][cC][eE][oO][nN])|([fF][oO][rR][cC][eE][oO][fF][fF])/, MIN=>undef, MAX=>undef},
#Step value (four-bit)
"dpt3" => {CODE=>"dpt3", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,3}/, MIN=>-100, MAX=>100},
@ -257,9 +264,9 @@ KNX_Define($$) {
#convert to string, if supplied in Hex
#old syntax
$group = KNX_hexToName ($group) if ($group =~ m/^[0-9a-f]{4}$/i);
#$group = KNX_hexToName ($group) if ($group =~ m/^[0-9a-f]{4}$/i);
#new syntax for extended adressing
#$group = KNX_hexToName ($group) if ($group =~ m/^[0-9a-f]{5}$/i);
$group = KNX_hexToName ($group) if ($group =~ m/^[0-9a-f]{5}$/i);
$groupc = KNX_nameToHex ($group);
@ -415,7 +422,8 @@ KNX_Set($@) {
#create response, if cmd is wrong or gui asks
my $cmdTemp = KNX_getCmdList ($hash, $cmd, %mySets);
return $cmdTemp if (defined ($cmdTemp));
#return "Unknown argument $cmd, choose one of " . $cmdTemp if (defined ($cmdTemp));
return SetExtensions($hash, $cmdTemp, $name, $cmd, @a) if (defined ($cmdTemp));
#the command can be send to any of the defined groups indexed starting by 1
#optional last argument starting with g indicates the group
@ -530,8 +538,8 @@ KNX_Set($@) {
#set value <value>
elsif ($cmd =~ m/$VALUE/)
{
#return "\"value\" not allowed for dpt1 and dpt16" if (($code eq "dpt1") or ($code eq "dpt16"));
return "\"value\" not allowed for dpt1 and dpt16" if ($code eq "dpt16");
return "\"value\" not allowed for dpt1, dpt16 and dpt232" if (($code eq "dpt1") or ($code eq "dpt16") or ($code eq "dpt232"));
#return "\"value\" not allowed for dpt1 and dpt16" if ($code eq "dpt16");
return "no data for cmd $cmd" if ($lastArg < 2);
$value = $a[2];
@ -749,10 +757,9 @@ KNX_Parse($$) {
#split message into parts
#old syntax
$msg =~ m/^$id(.{4})(.{1})(.{4})(.*)$/;
#$msg =~ m/^$id(.{4})(.{1})(.{4})(.*)$/;
#new syntax for extended adressing
#removed, seems to be broken
#$msg =~ m/^$id(.{5})(.{1})(.{5})(.*)$/;
$msg =~ m/^$id(.{5})(.{1})(.{5})(.*)$/;
my $src = $1;
my $cmd = $2;
my $dest = $3;
@ -906,15 +913,14 @@ KNX_hexToName ($)
my $v = shift;
#old syntax
my $p1 = hex(substr($v,0,1));
my $p2 = hex(substr($v,1,1));
my $p3 = hex(substr($v,2,2));
#my $p1 = hex(substr($v,0,1));
#my $p2 = hex(substr($v,1,1));
#my $p3 = hex(substr($v,2,2));
#new syntax for extended adressing
#removed, seems to be broken
#my $p1 = hex(substr($v,0,2));
#my $p2 = hex(substr($v,2,1));
#my $p3 = hex(substr($v,3,2));
my $p1 = hex(substr($v,0,2));
my $p2 = hex(substr($v,2,1));
my $p3 = hex(substr($v,3,2));
my $r = sprintf("%d/%d/%d", $p1,$p2,$p3);
@ -932,10 +938,9 @@ KNX_nameToHex ($)
if($v =~ /^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{1,3})$/)
{
#old syntax
$r = sprintf("%01x%01x%02x",$1,$2,$3);
#$r = sprintf("%01x%01x%02x",$1,$2,$3);
#new syntax for extended adressing
#removed, seems to be broken
#$r = sprintf("%02x%01x%02x",$1,$2,$3);
$r = sprintf("%02x%01x%02x",$1,$2,$3);
}
#elsif($v =~ /^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{1,3})$/)
#{
@ -1045,6 +1050,16 @@ KNX_encodeByDpt ($$$) {
$hexval = $numval;
}
#Step value (two-bit)
elsif ($code eq "dpt2")
{
$numval = "00" if ($value =~ m/[oO][fF][fF]/);
$numval = "01" if ($value =~ m/[oO][nN]/);
$numval = "02" if ($value =~ m/[fF][oO][rR][cC][eE][oO][fF][fF]/);
$numval = "03" if ($value =~ m/[fF][oO][rR][cC][eE][oO][nN]/);
$hexval = $numval;
}
#Step value (four-bit)
elsif ($code eq "dpt3")
{
@ -1330,6 +1345,17 @@ KNX_decodeByDpt ($$$) {
$numval = $max if (lc($value) eq "01");
$state = $numval;
}
#Step value (two-bit)
elsif ($code eq "dpt2")
{
#get numeric value
$numval = hex ($value);
$state = "off" if ($numval == 0);
$state = "on" if ($numval == 1);
$state = "forceOff" if ($numval == 2);
$state = "forceOn" if ($numval == 3);
}
#Step value (four-bit)
elsif ($code eq "dpt3")
{
@ -1551,14 +1577,14 @@ sub KNX_getCmdList ($$$)
Log3 ($name, 5, "parse cmd-table - Set:$mySet, Option:$myOpt, RetVal:$retVal");
}
if (!defined ($retVal))
{
$retVal = "error while parsing set-table" ;
}
else
{
$retVal = "Unknown argument $cmd, choose one of " . $retVal;
}
#if (!defined ($retVal))
#{
# $retVal = "error while parsing set-table" ;
#}
#else
#{
# $retVal = "Unknown argument $cmd, choose one of " . $retVal;
#}
return $retVal;
@ -1776,7 +1802,9 @@ sub KNX_getCmdList ($$$)
dpt1.003 enable, disable<br>
dpt1.008 up, down<br>
dpt1.009 open, closed<br>
dpt1.010 start, stop<br>
dpt1.019 closed, open<br>
dpt2 value on, value off, value forceOn, value forceOff<br>
dpt3 -100..+100<br>
dpt5 0..255<br>
dpt5.001 0..100 %<br>
@ -2040,7 +2068,9 @@ sub KNX_getCmdList ($$$)
dpt1.003 enable, disable<br>
dpt1.008 up, down<br>
dpt1.009 open, closed<br>
dpt1.010 start, stop<br>
dpt1.019 closed, open<br>
dpt2 value on, value off, value forceOn, value forceOff<br>
dpt3 -100..+100<br>
dpt5 0..255<br>
dpt5.001 0..100 %<br>