mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-20 07:16:03 +00:00
10_KNX.pm: cleaned get/set options, fixed set-handling, added summary
git-svn-id: https://svn.fhem.de/fhem/trunk@12659 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
599acb713d
commit
9afff6039d
@ -16,6 +16,9 @@
|
|||||||
# ABU 20160605 Changed Doku, changed autocreate-naming, fixed dpt10-sending-now
|
# ABU 20160605 Changed Doku, changed autocreate-naming, fixed dpt10-sending-now
|
||||||
# ABU 20160608 changed sprintf for int-dpt from %d to %.0f
|
# ABU 20160608 changed sprintf for int-dpt from %d to %.0f
|
||||||
# ABU 20160624 corrected Doku: till->until
|
# ABU 20160624 corrected Doku: till->until
|
||||||
|
# ABU 20161121 cleaned get/set options
|
||||||
|
# ABU 20161122 fixed set-handling
|
||||||
|
# ABU 20161126 added summary
|
||||||
|
|
||||||
package main;
|
package main;
|
||||||
|
|
||||||
@ -28,17 +31,27 @@ my $debug = 0;
|
|||||||
#string constant for autocreate
|
#string constant for autocreate
|
||||||
my $modelErr = "MODEL_NOT_DEFINED";
|
my $modelErr = "MODEL_NOT_DEFINED";
|
||||||
|
|
||||||
|
my $OFF = "off";
|
||||||
|
my $ON = "on";
|
||||||
|
my $ONFORTIMER = "on-for-timer";
|
||||||
|
my $ONUNTIL = "on-until";
|
||||||
|
my $VALUE = "value";
|
||||||
|
my $STRING = "string";
|
||||||
|
my $RAW = "raw";
|
||||||
|
my $RGB = "rgb";
|
||||||
|
|
||||||
#valid set commands
|
#valid set commands
|
||||||
my %sets = (
|
my %sets = (
|
||||||
#"off" => "noArg",
|
#"off" => "noArg",
|
||||||
#"on" => "noArg",
|
#"on" => "noArg",
|
||||||
"off" => "",
|
$OFF => "",
|
||||||
"on" => "",
|
$ON => "",
|
||||||
"on-for-timer" => "",
|
$ONFORTIMER => "",
|
||||||
"on-until" => "",
|
$ONUNTIL => "",
|
||||||
"value" => "",
|
$VALUE => "",
|
||||||
"string" => "",
|
$STRING => "",
|
||||||
"raw" => ""
|
$RAW => "",
|
||||||
|
$RGB => "colorpicker"
|
||||||
);
|
);
|
||||||
|
|
||||||
#identifier for TUL
|
#identifier for TUL
|
||||||
@ -103,30 +116,33 @@ my %dpttypes = (
|
|||||||
"dpt9.026" => {CODE=>"dpt9", UNIT=>"l/h", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,6}[.,]?\d{1,2}/, MIN=>-670760, MAX=>670760},
|
"dpt9.026" => {CODE=>"dpt9", UNIT=>"l/h", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,6}[.,]?\d{1,2}/, MIN=>-670760, MAX=>670760},
|
||||||
"dpt9.028" => {CODE=>"dpt9", UNIT=>"km/h", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,6}[.,]?\d{1,2}/, MIN=>-670760, MAX=>670760},
|
"dpt9.028" => {CODE=>"dpt9", UNIT=>"km/h", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,6}[.,]?\d{1,2}/, MIN=>-670760, MAX=>670760},
|
||||||
|
|
||||||
# Time of Day
|
# Time of Day
|
||||||
"dpt10" => {CODE=>"dpt10", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/((2[0-4]|[0?1][0-9]):(60|[0?1-5]?[0-9]):(60|[0?1-5]?[0-9]))|([nN][oO][wW])/, MIN=>undef, MAX=>undef},
|
"dpt10" => {CODE=>"dpt10", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/((2[0-4]|[0?1][0-9]):(60|[0?1-5]?[0-9]):(60|[0?1-5]?[0-9]))|([nN][oO][wW])/, MIN=>undef, MAX=>undef},
|
||||||
|
|
||||||
# Date
|
# Date
|
||||||
"dpt11" => {CODE=>"dpt11", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/((3[01]|[0-2]?[0-9]).(1[0-2]|0?[0-9]).(19[0-9][0-9]|2[01][0-9][0-9]))|([nN][oO][wW])/, MIN=>undef, MAX=>undef},
|
"dpt11" => {CODE=>"dpt11", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/((3[01]|[0-2]?[0-9]).(1[0-2]|0?[0-9]).(19[0-9][0-9]|2[01][0-9][0-9]))|([nN][oO][wW])/, MIN=>undef, MAX=>undef},
|
||||||
|
|
||||||
# 4-Octet unsigned value (handled as dpt7)
|
# 4-Octet unsigned value (handled as dpt7)
|
||||||
"dpt12" => {CODE=>"dpt12", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>0, MAX=>4294967295},
|
"dpt12" => {CODE=>"dpt12", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>0, MAX=>4294967295},
|
||||||
|
|
||||||
# 4-Octet Signed Value
|
# 4-Octet Signed Value
|
||||||
"dpt13" => {CODE=>"dpt13", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
"dpt13" => {CODE=>"dpt13", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
||||||
"dpt13.010" => {CODE=>"dpt13", UNIT=>"Wh", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
"dpt13.010" => {CODE=>"dpt13", UNIT=>"Wh", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
||||||
"dpt13.013" => {CODE=>"dpt13", UNIT=>"kWh", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
"dpt13.013" => {CODE=>"dpt13", UNIT=>"kWh", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,10}/, MIN=>-2147483647, MAX=>2147483647},
|
||||||
|
|
||||||
# 4-Octet single precision float
|
# 4-Octet single precision float
|
||||||
"dpt14" => {CODE=>"dpt14", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14" => {CODE=>"dpt14", UNIT=>"", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
"dpt14.019" => {CODE=>"dpt14", UNIT=>"A", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14.019" => {CODE=>"dpt14", UNIT=>"A", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
"dpt14.027" => {CODE=>"dpt14", UNIT=>"V", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14.027" => {CODE=>"dpt14", UNIT=>"V", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
"dpt14.056" => {CODE=>"dpt14", UNIT=>"W", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14.056" => {CODE=>"dpt14", UNIT=>"W", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
"dpt14.068" => {CODE=>"dpt14", UNIT=>"°C", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14.068" => {CODE=>"dpt14", UNIT=>"°C", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
"dpt14.076" => {CODE=>"dpt14", UNIT=>"m³", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
"dpt14.076" => {CODE=>"dpt14", UNIT=>"m³", FACTOR=>1, OFFSET=>0, PATTERN=>qr/[+-]?\d{1,40}[.,]?\d{1,4}/, MIN=>undef, MAX=>undef},
|
||||||
|
|
||||||
# 14-Octet String
|
# 14-Octet String
|
||||||
"dpt16" => {CODE=>"dpt16", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/.{1,14}/, MIN=>undef, MAX=>undef},
|
"dpt16" => {CODE=>"dpt16", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/.{1,14}/, MIN=>undef, MAX=>undef},
|
||||||
|
|
||||||
|
# Color-Code
|
||||||
|
"dpt232" => {CODE=>"dpt232", UNIT=>"", FACTOR=>undef, OFFSET=>undef, PATTERN=>qr/[0-9A-Fa-f]{6}/, MIN=>undef, MAX=>undef},
|
||||||
);
|
);
|
||||||
|
|
||||||
#Init this device
|
#Init this device
|
||||||
@ -154,6 +170,7 @@ KNX_Initialize($) {
|
|||||||
"answerReading:1,0 " . #allows FHEM to answer a read telegram
|
"answerReading:1,0 " . #allows FHEM to answer a read telegram
|
||||||
"stateRegex " . #modifies state value
|
"stateRegex " . #modifies state value
|
||||||
"stateCmd " . #modify state value
|
"stateCmd " . #modify state value
|
||||||
|
"stateCopy " . #backup content of state in this reading (only for received telegrams)
|
||||||
"format " . #supplies post-string
|
"format " . #supplies post-string
|
||||||
"slider " . #creates slider. Syntax: min, step, max
|
"slider " . #creates slider. Syntax: min, step, max
|
||||||
"$readingFnAttributes "; #standard attributes
|
"$readingFnAttributes "; #standard attributes
|
||||||
@ -221,8 +238,8 @@ KNX_Define($$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#convert to string, if supplied in Hex
|
#convert to string, if supplied in Hex
|
||||||
$group = hexToName ($group) if ($group =~ m/^[0-9a-f]{4}$/i);
|
$group = KNX_hexToName ($group) if ($group =~ m/^[0-9a-f]{4}$/i);
|
||||||
$groupc = nameToHex ($group);
|
$groupc = KNX_nameToHex ($group);
|
||||||
|
|
||||||
Log3 ($name, 5, "define $name: found GAD: $group, NO: $gno, HEX: $groupc, DPT: $model");
|
Log3 ($name, 5, "define $name: found GAD: $group, NO: $gno, HEX: $groupc, DPT: $model");
|
||||||
Log3 ($name, 5, "define $name: found Readings-Name: $rdname") if (defined ($rdname));
|
Log3 ($name, 5, "define $name: found Readings-Name: $rdname") if (defined ($rdname));
|
||||||
@ -298,7 +315,7 @@ KNX_Get($@) {
|
|||||||
|
|
||||||
#FHEM asks with a ? at startup - no action, no log
|
#FHEM asks with a ? at startup - no action, no log
|
||||||
#return "" if($a[1] && $a[1] eq "?");
|
#return "" if($a[1] && $a[1] eq "?");
|
||||||
return "Unknown argument ?, choose one of -" if($a[1] && $a[1] eq "?");
|
return "Unknown argument ?, only a group-adress is allowed" if($a[1] && $a[1] eq "?");
|
||||||
|
|
||||||
splice(@a, 1, 1) if (defined ($a[1]) and ($a[1] =~ m/-/));
|
splice(@a, 1, 1) if (defined ($a[1]) and ($a[1] =~ m/-/));
|
||||||
my $na = int(@a);
|
my $na = int(@a);
|
||||||
@ -353,7 +370,7 @@ KNX_Set($@) {
|
|||||||
|
|
||||||
my $tempStr = join (", ", @a);
|
my $tempStr = join (", ", @a);
|
||||||
#log only, if not called with cmd = ?
|
#log only, if not called with cmd = ?
|
||||||
Log3 ($name, 5, "enter set $name: hash: $hash, attributes: $tempStr") if (not ($a[1] eq "?"));
|
Log3 ($name, 5, "enter set $name: hash: $hash, attributes: $tempStr") if ((defined ($a[1])) and (not ($a[1] eq "?")));
|
||||||
|
|
||||||
#return, if no set value specified
|
#return, if no set value specified
|
||||||
return "no set value specified" if($na < 2);
|
return "no set value specified" if($na < 2);
|
||||||
@ -369,26 +386,14 @@ KNX_Set($@) {
|
|||||||
#get slider definition
|
#get slider definition
|
||||||
my $slider = AttrVal ($name, "slider", undef);
|
my $slider = AttrVal ($name, "slider", undef);
|
||||||
|
|
||||||
#check command
|
#hash has to be copied. Otherwise silder-operation affects all devices
|
||||||
#append slider, if wanted
|
my %mySets = %sets;
|
||||||
if(!defined($sets{$cmd}))
|
#append slider-definition, if set...Necessary for FHEM
|
||||||
{
|
$mySets{$VALUE} = $mySets{$VALUE} . "slider,$slider" if ((defined $slider) and !($mySets{$VALUE} =~ m/slider/));
|
||||||
#my $resp = "unknown argument, choose one of " . join(" ", sort keys %sets);
|
|
||||||
my $resp = "unknown argument, choose one of";
|
|
||||||
|
|
||||||
foreach my $key (sort keys %sets)
|
#create response, if cmd is wrong or gui asks
|
||||||
{
|
my $cmdTemp = KNX_getCmdList ($hash, $cmd, %mySets);
|
||||||
my $value = $sets{$key};
|
return $cmdTemp if (defined ($cmdTemp));
|
||||||
|
|
||||||
$resp = $resp . " " . $key;
|
|
||||||
$resp = $resp . ":" . $sets{$key} if (defined($value) and not ($value eq ""));
|
|
||||||
}
|
|
||||||
|
|
||||||
#append slider-definition, if set...Necessary for FHEM
|
|
||||||
$resp = $resp . ":slider,$slider" if(defined $slider);
|
|
||||||
|
|
||||||
return $resp;
|
|
||||||
}
|
|
||||||
|
|
||||||
#the command can be send to any of the defined groups indexed starting by 1
|
#the command can be send to any of the defined groups indexed starting by 1
|
||||||
#optional last argument starting with g indicates the group
|
#optional last argument starting with g indicates the group
|
||||||
@ -437,7 +442,7 @@ KNX_Set($@) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#set on-for-timer
|
#set on-for-timer
|
||||||
if ($cmd =~ m/on-for-timer/)
|
if ($cmd =~ m/$ONFORTIMER/)
|
||||||
{
|
{
|
||||||
return "\"on-for-timer\" only allowed for dpt1" if (not($code eq "dpt1"));
|
return "\"on-for-timer\" only allowed for dpt1" if (not($code eq "dpt1"));
|
||||||
#get duration
|
#get duration
|
||||||
@ -451,7 +456,7 @@ KNX_Set($@) {
|
|||||||
CommandDefine(undef, $name . "_timer_$groupnr at +$duration set $name off g$groupnr");
|
CommandDefine(undef, $name . "_timer_$groupnr at +$duration set $name off g$groupnr");
|
||||||
}
|
}
|
||||||
#set on-till
|
#set on-till
|
||||||
elsif ($cmd =~ m/on-until/)
|
elsif ($cmd =~ m/$ONUNTIL/)
|
||||||
{
|
{
|
||||||
return "\"on\" only allowed for dpt1" if (not($code eq "dpt1"));
|
return "\"on\" only allowed for dpt1" if (not($code eq "dpt1"));
|
||||||
#get off-time
|
#get off-time
|
||||||
@ -475,19 +480,19 @@ KNX_Set($@) {
|
|||||||
CommandDefine(undef, $name . "_until_$groupnr at $hms_til set $name off g$groupnr");
|
CommandDefine(undef, $name . "_until_$groupnr at $hms_til set $name off g$groupnr");
|
||||||
}
|
}
|
||||||
#set on
|
#set on
|
||||||
elsif ($cmd =~ m/on/)
|
elsif ($cmd =~ m/$ON/)
|
||||||
{
|
{
|
||||||
return "\"on\" only allowed for dpt1" if (not($code eq "dpt1"));
|
return "\"on\" only allowed for dpt1" if (not($code eq "dpt1"));
|
||||||
$value = 1;
|
$value = 1;
|
||||||
}
|
}
|
||||||
#set off
|
#set off
|
||||||
elsif ($cmd =~ m/off/)
|
elsif ($cmd =~ m/$OFF/)
|
||||||
{
|
{
|
||||||
return "\"off\" only allowed for dpt1" if (not($code eq "dpt1"));
|
return "\"off\" only allowed for dpt1" if (not($code eq "dpt1"));
|
||||||
$value = 0;
|
$value = 0;
|
||||||
}
|
}
|
||||||
#set raw <value>
|
#set raw <value>
|
||||||
elsif ($cmd =~ m/raw/)
|
elsif ($cmd =~ m/$RAW/)
|
||||||
{
|
{
|
||||||
return "no data for cmd $cmd" if ($lastArg < 2);
|
return "no data for cmd $cmd" if ($lastArg < 2);
|
||||||
|
|
||||||
@ -501,7 +506,7 @@ KNX_Set($@) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#set value <value>
|
#set value <value>
|
||||||
elsif ($cmd =~ m/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 "dpt1") or ($code eq "dpt16"));
|
||||||
return "\"value\" not allowed for dpt1 and dpt16" if ($code eq "dpt16");
|
return "\"value\" not allowed for dpt1 and dpt16" if ($code eq "dpt16");
|
||||||
@ -512,7 +517,7 @@ KNX_Set($@) {
|
|||||||
$value =~ s/,/\./g;
|
$value =~ s/,/\./g;
|
||||||
}
|
}
|
||||||
#set string <val1 val2 valn>
|
#set string <val1 val2 valn>
|
||||||
elsif ($cmd =~ m/string/)
|
elsif ($cmd =~ m/$STRING/)
|
||||||
{
|
{
|
||||||
return "\"string\" only allowed for dpt16" if (not($code eq "dpt16"));
|
return "\"string\" only allowed for dpt16" if (not($code eq "dpt16"));
|
||||||
return "no data for cmd $cmd" if ($lastArg < 2);
|
return "no data for cmd $cmd" if ($lastArg < 2);
|
||||||
@ -523,9 +528,24 @@ KNX_Set($@) {
|
|||||||
$value.= $a[$i]." ";
|
$value.= $a[$i]." ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#set RGB <RRGGBB>
|
||||||
|
elsif ($cmd =~ m/$RGB/)
|
||||||
|
{
|
||||||
|
return "\"RGB\" only allowed for dpt232" if (not($code eq "dpt232"));
|
||||||
|
return "no data for cmd $cmd" if ($lastArg < 2);
|
||||||
|
|
||||||
|
#check for 1-16 hex-digits
|
||||||
|
if ($a[2] =~ m/[0-9A-Fa-f]{6}/)
|
||||||
|
{
|
||||||
|
$value = lc($a[2]);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return "$a[2] has wrong syntax. Use hex-format only.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#check and cast value
|
#check and cast value
|
||||||
my $transval = checkAndClean($hash, $value, $groupnr);
|
my $transval = KNX_checkAndClean($hash, $value, $groupnr);
|
||||||
|
|
||||||
return "invalid value: $value" if (!defined($transval));
|
return "invalid value: $value" if (!defined($transval));
|
||||||
|
|
||||||
@ -534,7 +554,7 @@ KNX_Set($@) {
|
|||||||
return "did not send value - \"readonly\" is set." if (AttrVal ($name, "readonly", 0) =~ m/1/);
|
return "did not send value - \"readonly\" is set." if (AttrVal ($name, "readonly", 0) =~ m/1/);
|
||||||
|
|
||||||
#send value
|
#send value
|
||||||
$transval = encodeByDpt($hash, $transval, $groupnr);
|
$transval = KNX_encodeByDpt($hash, $transval, $groupnr);
|
||||||
IOWrite($hash, $id, "w" . $groupc . $transval);
|
IOWrite($hash, $id, "w" . $groupc . $transval);
|
||||||
|
|
||||||
Log3 ($name, 5, "set $name: cmd: $cmd, value: $value, translated: $transval");
|
Log3 ($name, 5, "set $name: cmd: $cmd, value: $value, translated: $transval");
|
||||||
@ -552,13 +572,13 @@ KNX_Set($@) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#re-read value, do not modify variable name due to usage in cmdAttr
|
#re-read value, do not modify variable name due to usage in cmdAttr
|
||||||
$transval = decodeByDpt($hash, $transval, $groupnr);
|
$transval = KNX_decodeByDpt($hash, $transval, $groupnr);
|
||||||
#append post-string, if supplied
|
#append post-string, if supplied
|
||||||
my $suffix = AttrVal($name, "format",undef);
|
my $suffix = AttrVal($name, "format",undef);
|
||||||
$transval = $transval . " " . $suffix if (defined($suffix));
|
$transval = $transval . " " . $suffix if (defined($suffix));
|
||||||
#execute regex, if defined
|
#execute regex, if defined
|
||||||
my $regAttr = AttrVal($name, "stateRegex", undef);
|
my $regAttr = AttrVal($name, "stateRegex", undef);
|
||||||
my $state = replaceByRegex ($regAttr, $rdName . ":", $transval);
|
my $state = KNX_replaceByRegex ($regAttr, $rdName . ":", $transval);
|
||||||
Log3 ($name, 5, "set name: $name - replaced $rdName:$transval to $state") if (not ($transval eq $state));
|
Log3 ($name, 5, "set name: $name - replaced $rdName:$transval to $state") if (not ($transval eq $state));
|
||||||
|
|
||||||
if (defined($state))
|
if (defined($state))
|
||||||
@ -744,7 +764,7 @@ KNX_Parse($$) {
|
|||||||
if ($cmd =~ /[w|p]/)
|
if ($cmd =~ /[w|p]/)
|
||||||
{
|
{
|
||||||
#decode message
|
#decode message
|
||||||
my $transval = decodeByDpt ($deviceHash, $val, $gno);
|
my $transval = KNX_decodeByDpt ($deviceHash, $val, $gno);
|
||||||
#message invalid
|
#message invalid
|
||||||
if (not defined($transval) or ($transval eq ""))
|
if (not defined($transval) or ($transval eq ""))
|
||||||
{
|
{
|
||||||
@ -771,14 +791,14 @@ KNX_Parse($$) {
|
|||||||
$transval = $transval . " " . $suffix if (defined($suffix));
|
$transval = $transval . " " . $suffix if (defined($suffix));
|
||||||
#execute regex, if defined
|
#execute regex, if defined
|
||||||
my $regAttr = AttrVal($name, "stateRegex", undef);
|
my $regAttr = AttrVal($name, "stateRegex", undef);
|
||||||
my $state = replaceByRegex ($regAttr, $rdName . ":", $transval);
|
my $state = KNX_replaceByRegex ($regAttr, $rdName . ":", $transval);
|
||||||
Log3 ($name, 5, "parse device hash: $deviceHash name: $name - replaced $rdName:$transval to $state") if (not ($transval eq $state));
|
Log3 ($name, 5, "parse device hash: $deviceHash name: $name - replaced $rdName:$transval to $state") if (not ($transval eq $state));
|
||||||
|
|
||||||
if (defined($state))
|
if (defined($state))
|
||||||
{
|
{
|
||||||
readingsBeginUpdate($deviceHash);
|
readingsBeginUpdate($deviceHash);
|
||||||
readingsBulkUpdate($deviceHash, $rdName, $transval);
|
readingsBulkUpdate($deviceHash, $rdName, $transval);
|
||||||
readingsBulkUpdate($deviceHash, "last-sender", hexToName($src));
|
readingsBulkUpdate($deviceHash, "last-sender", KNX_hexToName($src));
|
||||||
|
|
||||||
#execute state-command if defined
|
#execute state-command if defined
|
||||||
#must be placed after first readings, because it may have a reference
|
#must be placed after first readings, because it may have a reference
|
||||||
@ -797,7 +817,7 @@ KNX_Parse($$) {
|
|||||||
elsif (($cmd =~ /[r]/) && (AttrVal($name, "answerReading",0) =~ m/1/))
|
elsif (($cmd =~ /[r]/) && (AttrVal($name, "answerReading",0) =~ m/1/))
|
||||||
{
|
{
|
||||||
Log3 ($name, 5, "received hash: $deviceHash name: $name, GET");
|
Log3 ($name, 5, "received hash: $deviceHash name: $name, GET");
|
||||||
my $transval = encodeByDpt($deviceHash, $deviceHash->{STATE}, $gno);
|
my $transval = KNX_encodeByDpt($deviceHash, $deviceHash->{STATE}, $gno);
|
||||||
|
|
||||||
if (defined($transval))
|
if (defined($transval))
|
||||||
{
|
{
|
||||||
@ -822,7 +842,7 @@ KNX_Parse($$) {
|
|||||||
return @foundMsgs;
|
return @foundMsgs;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
my $gad = hexToName($dest);
|
my $gad = KNX_hexToName($dest);
|
||||||
#remove slashes
|
#remove slashes
|
||||||
#$name =~ s/\///g;
|
#$name =~ s/\///g;
|
||||||
#my $name = "KNX_" . $gad;
|
#my $name = "KNX_" . $gad;
|
||||||
@ -854,7 +874,7 @@ KNX_Notify($$)
|
|||||||
#Private function to convert GAD from hex to readable version
|
#Private function to convert GAD from hex to readable version
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
hexToName ($)
|
KNX_hexToName ($)
|
||||||
{
|
{
|
||||||
my $v = shift;
|
my $v = shift;
|
||||||
|
|
||||||
@ -870,7 +890,7 @@ hexToName ($)
|
|||||||
#Private function to convert GAD from readable version to hex
|
#Private function to convert GAD from readable version to hex
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
nameToHex ($)
|
KNX_nameToHex ($)
|
||||||
{
|
{
|
||||||
my $v = shift;
|
my $v = shift;
|
||||||
my $r = $v;
|
my $r = $v;
|
||||||
@ -890,7 +910,7 @@ nameToHex ($)
|
|||||||
#Private function to clean input string according DPT
|
#Private function to clean input string according DPT
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
checkAndClean ($$$)
|
KNX_checkAndClean ($$$)
|
||||||
{
|
{
|
||||||
my ($hash, $value, $gno) = @_;
|
my ($hash, $value, $gno) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
@ -947,7 +967,7 @@ checkAndClean ($$$)
|
|||||||
#Private function to encode KNX-Message according DPT
|
#Private function to encode KNX-Message according DPT
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
encodeByDpt ($$$) {
|
KNX_encodeByDpt ($$$) {
|
||||||
my ($hash, $value, $gno) = @_;
|
my ($hash, $value, $gno) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
@ -1170,6 +1190,12 @@ encodeByDpt ($$$) {
|
|||||||
$numval = $value;
|
$numval = $value;
|
||||||
$hexval = $dat;
|
$hexval = $dat;
|
||||||
}
|
}
|
||||||
|
#RGB-Code
|
||||||
|
elsif ($code eq "dpt232")
|
||||||
|
{
|
||||||
|
$hexval = "00" . $value;
|
||||||
|
$numval = $value;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log3 ($name, 2, "encode model: $model, no vaild model defined");
|
Log3 ($name, 2, "encode model: $model, no vaild model defined");
|
||||||
@ -1183,7 +1209,7 @@ encodeByDpt ($$$) {
|
|||||||
#Private function to replace state-values
|
#Private function to replace state-values
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
replaceByRegex ($$$) {
|
KNX_replaceByRegex ($$$) {
|
||||||
my ($regAttr, $prefix, $input) = @_;
|
my ($regAttr, $prefix, $input) = @_;
|
||||||
my $retVal = $input;
|
my $retVal = $input;
|
||||||
|
|
||||||
@ -1229,7 +1255,7 @@ replaceByRegex ($$$) {
|
|||||||
#Private function to decode KNX-Message according DPT
|
#Private function to decode KNX-Message according DPT
|
||||||
#############################
|
#############################
|
||||||
sub
|
sub
|
||||||
decodeByDpt ($$$) {
|
KNX_decodeByDpt ($$$) {
|
||||||
my ($hash, $value, $gno) = @_;
|
my ($hash, $value, $gno) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
@ -1433,6 +1459,14 @@ decodeByDpt ($$$) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#RGB-Code
|
||||||
|
elsif ($code eq "dpt232")
|
||||||
|
{
|
||||||
|
$numval = hex ($value);
|
||||||
|
$state = $numval;
|
||||||
|
|
||||||
|
$state = sprintf ("%.6x", $state);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log3 ($name, 2, "decode model: $model, no valid model defined");
|
Log3 ($name, 2, "decode model: $model, no valid model defined");
|
||||||
@ -1447,6 +1481,45 @@ decodeByDpt ($$$) {
|
|||||||
return $state;
|
return $state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#Private function to evaluate command-lists
|
||||||
|
#############################
|
||||||
|
sub KNX_getCmdList ($$$)
|
||||||
|
{
|
||||||
|
my ($hash, $cmd, %cmdArray) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
#return, if cmd is valid
|
||||||
|
return undef if (defined ($cmd) and defined ($cmdArray{$cmd}));
|
||||||
|
|
||||||
|
#response for gui or the user, if command is invalid
|
||||||
|
my $retVal;
|
||||||
|
foreach my $mySet (keys %cmdArray)
|
||||||
|
{
|
||||||
|
#append set-command
|
||||||
|
$retVal = $retVal . " " if (defined ($retVal));
|
||||||
|
$retVal = $retVal . $mySet;
|
||||||
|
#get options
|
||||||
|
my $myOpt = $cmdArray{$mySet};
|
||||||
|
#append option, if valid
|
||||||
|
$retVal = $retVal . ":" . $myOpt if (defined ($myOpt) and (length ($myOpt) > 0));
|
||||||
|
$myOpt = "" if (!defined($myOpt));
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return $retVal;
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@ -1705,7 +1778,9 @@ decodeByDpt ($$$) {
|
|||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
=end html
|
=end html
|
||||||
|
=device
|
||||||
|
=item summary Communicates to KNX via module TUL
|
||||||
|
=item summary_DE Kommuniziert mit dem KNX über das Modul TUL
|
||||||
=begin html_DE
|
=begin html_DE
|
||||||
|
|
||||||
<a name="KNX"></a>
|
<a name="KNX"></a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user