From 5bb77c20071a8a4fc80bb4e781ba65db68024b9f Mon Sep 17 00:00:00 2001
From: rudolfkoenig <>
Date: Fri, 6 May 2016 06:32:49 +0000
Subject: [PATCH] ZWDongle/ZWave: add SUC/SIS capabilities by krikan (Forum
#53066)
git-svn-id: https://svn.fhem.de/fhem/trunk@11399 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/00_ZWDongle.pm | 51 +++++++++-----
fhem/FHEM/10_ZWave.pm | 149 +++++++++++++++++++++------------------
2 files changed, 114 insertions(+), 86 deletions(-)
diff --git a/fhem/FHEM/00_ZWDongle.pm b/fhem/FHEM/00_ZWDongle.pm
index 35db9a776..e07cbb95a 100755
--- a/fhem/FHEM/00_ZWDongle.pm
+++ b/fhem/FHEM/00_ZWDongle.pm
@@ -32,6 +32,8 @@ my %sets = (
"sendNIF" => { cmd => "12%02x05@" },# ZW_SEND_NODE_INFORMATION
"setNIF" => { cmd => "03%02x%02x%02x%02x" },
# SERIAL_API_APPL_NODE_INFORMATION
+ "sucNodeId" => { cmd => "54%02x%02x25%02x@"},
+ # ZW_SET_SUC_NODE_ID
"timeouts" => { cmd => "06%02x%02x" }, # SERIAL_API_SET_TIMEOUTS
"reopen" => { cmd => "" },
"backupCreate" => { cmd => "" },
@@ -48,9 +50,10 @@ my %gets = (
"nodeInfo" => "41%02x", # ZW_GET_NODE_PROTOCOL_INFO
"nodeList" => "02", # SERIAL_API_GET_INIT_DATA
"random" => "1c%02x", # ZW_GET_RANDOM
- "version" => "15", # ZW_GET_VERSION
+ "sucNodeId" => "56", # ZW_GET_SUC_NODE_ID
"timeouts" => "06", # SERIAL_API_SET_TIMEOUTS
- "raw" => "%s", # hex
+ "version" => "15", # ZW_GET_VERSION
+ "raw" => "%s", # hex
);
sub
@@ -119,7 +122,7 @@ ZWDongle_Define($$)
my @empty;
$hash->{SendStack} = \@empty;
ZWDongle_shiftSendStack($hash, 0, 5, undef);
-
+
my $ret = DevIo_OpenDev($hash, 0, "ZWDongle_DoInit");
return $ret;
}
@@ -390,6 +393,9 @@ ZWDongle_Get($@)
$msg =~ s/^....//;
$msg = zwlib_parseNeighborList($hash, $msg);
+ } elsif($cmd eq "sucNodeId") { ############################
+ $msg = ($r[2]==0)?"no":hex($r[2])
+
}
$cmd .= "_".join("_", @a) if(@a);
@@ -422,7 +428,7 @@ ZWDongle_DoInit($)
DevIo_SetHwHandshake($hash) if($hash->{USBDev});
$hash->{PARTIAL} = "";
-
+
ZWDongle_Clear($hash);
ZWDongle_Get($hash, $name, "caps");
ZWDongle_Get($hash, $name, "homeId");
@@ -480,12 +486,12 @@ sub
ZWDongle_ProcessSendStack($)
{
my ($hash) = @_;
-
+
#Log3 $hash, 1, "ZWDongle_ProcessSendStack: ".@{$hash->{SendStack}}.
# " items on stack, waitForAck ".$hash->{WaitForAck};
-
+
RemoveInternalTimer($hash);
-
+
my $ts = gettimeofday();
if($hash->{WaitForAck}){
@@ -508,11 +514,11 @@ ZWDongle_ProcessSendStack($)
if($hash->{SendRetries} > $hash->{MaxSendRetries}){
ZWDongle_shiftSendStack($hash, 1, 1, "ERROR: max send retries reached");
}
-
+
return if(!@{$hash->{SendStack}} ||
$hash->{WaitForAck} ||
!DevIo_IsOpen($hash));
-
+
my $msg = $hash->{SendStack}->[0];
DevIo_SimpleWrite($hash, $msg, 1);
@@ -618,9 +624,9 @@ ZWDongle_Read($@)
ZWDongle_shiftSendStack($hash, 1, 5, "device ack reveived", $1)
if($msg =~ m/^0013(..)/);
-
+
last if(defined($local) && (!defined($regexp) || ($msg =~ m/$regexp/)));
- $hash->{PARTIAL} = $data; # Recursive call by ZWave get, Forum #37418
+ $hash->{PARTIAL} = $data; # Recursive call by ZWave get, Forum #37418
ZWDongle_Parse($hash, $name, $msg) if($init_done);
$data = $hash->{PARTIAL};
@@ -628,10 +634,10 @@ ZWDongle_Read($@)
}
$hash->{PARTIAL} = $data;
-
+
# trigger sending of next message
ZWDongle_ProcessSendStack($hash) if(length($data) == 0);
-
+
return $msg if(defined($local));
return undef;
}
@@ -658,7 +664,7 @@ ZWDongle_ReadAnswer($$$)
if($hash->{GotCAN}) {
ZWDongle_ProcessSendStack($hash);
next;
- }
+ }
return ("Timeout reading answer for get $arg", undef);
}
@@ -733,7 +739,7 @@ ZWDongle_Attr($$$$)
my ($cmd, $name, $attr, $value) = @_;
my $hash = $defs{$name};
$attr = "" if(!$attr);
-
+
if($attr eq "disable") {
if($cmd eq "set" && ($value || !defined($value))) {
DevIo_CloseDev($hash) if(!AttrVal($name,"dummy",undef));
@@ -759,7 +765,7 @@ ZWDongle_Attr($$$$)
}
return undef;
-
+
}
#####################################
@@ -875,6 +881,12 @@ ZWDongle_Ready($)
replaceFailedNode
Replace a non-responding node with a new one. The non-responding node
must be on the failed Node list.
+
+ sucNodeId [nodeId] [sucState] [capabilities]
+ Configure a Controller Node to be a SUC/SIS or not.
+ [nodeId] to be SUC/SIS
+ [sucState] 0 = deactivate; 1 = activate
+ [capabilities] 0 = basic SUC 1 = SIS
@@ -912,6 +924,11 @@ ZWDongle_Ready($)
raw
Send raw data to the controller. Developer only.
+
+ sucNodeId
+ return the currently registered SUC node ID.
+
+
@@ -954,6 +971,8 @@ ZWDongle_Ready($)
ZW_REQUEST_NODE_NEIGHBOR_UPDATE [started|done|failed]
+ ZW_SET_SUC_NODE_ID [setSucNodeOk|setSucNodefailed]
+
diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm
index a7356debd..d05da09c4 100755
--- a/fhem/FHEM/10_ZWave.pm
+++ b/fhem/FHEM/10_ZWave.pm
@@ -972,7 +972,7 @@ ZWave_scheduleEntryLockAllSet ($$)
my $name = $hash->{NAME};
return ("wrong format, see commandref", "")
if($arg !~ m/((en|dis)abled)/);
-
+
my $rt = sprintf("02%02x", ($1 eq "enabled") ? "01" : "02");
return ("",$rt);
@@ -986,26 +986,26 @@ ZWave_scheduleEntryLockWeekDayParse ($$)
my $userId = sprintf("userID: %d", hex($1));
my $scheduleSlotId = sprintf("slotID: %d", hex($2));
-
+
# Attention! scheduleEntryLock use different definition of weekday!
my @dow = ("sun","mon","tue","wed","thu","fri","sat");
my $dayOfWeek = (hex($3) < 7) ? $dow[hex($3)] : "invalid";
-
-
+
+
my $start = sprintf("%02d:%02d", hex($4), hex($5));
my $end = sprintf("%02d:%02d", hex($6), hex($7));
-
+
my $rt1 = sprintf ("weekDaySchedule_%d:", hex($1));
$rt1 .= "$userId $scheduleSlotId $dayOfWeek $start $end";
return ($rt1);
}
-
+
sub
ZWave_scheduleEntryLockWeekDaySet ($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if($arg !~
m/([01]) $p1_b $p1_b $p1_wd $p2_hm $p2_hm/) {
return ("wrong format, see commandref", "");
@@ -1022,7 +1022,7 @@ ZWave_scheduleEntryLockWeekDaySet ($$)
map { $wd=sprintf("%02x",$_) if($dow[$_] eq $4) }(0..int($#dow));
return ("Unknown weekday $4, use one of ".join(" ", @dow), "")
if(!defined($wd));
-
+
my $rt = sprintf("03%02x%02x%02x%02x%02x%02x%02x%02x",
$1,$2,$3,$wd,$5,$6,$7,$8);
@@ -1034,10 +1034,10 @@ ZWave_scheduleEntryLockDailyRepeatingParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(..)(..)(..)(..)(..)/);
-
+
my $userID = sprintf ("userID: %d", hex($1));
my $scheduleID = sprintf ("slotID: %d", hex($2));
-
+
# bit field for week day: b7 reserved, b6 sat, b5 fri, ..., b0 sun
my $w = hex($3);
#my $wd = sprintf("weekDaySchedule: %07b ", $w);
@@ -1050,7 +1050,7 @@ ZWave_scheduleEntryLockDailyRepeatingParse ($$)
$wd .= (($w & 0x20) == 0x20) ? "fri" : $nu;
$wd .= (($w & 0x40) == 0x40) ? "sat" : $nu;
$wd .= (($w & 0x01) == 0x01) ? "sun" : $nu;
-
+
my $start = sprintf("Start: %02d:%02d" , hex($4), hex($5));
my $duration = sprintf("Duration: %02d:%02d" , hex($6), hex($7));
@@ -1064,7 +1064,7 @@ ZWave_scheduleEntryLockDailyRepeatingSet ($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if($arg !~
m/([01]) $p1_b $p1_b ((?:[\.a-zA-Z]{3}){1,7}) $p2_hm $p2_hm/) {
return ("wrong format, see commandref", "");
@@ -1092,7 +1092,7 @@ ZWave_scheduleEntryLockYearDayParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(..)(..)(..)(..)(..)(..)(..)(..)(..)(..)/);
-
+
my $userID = sprintf ("userID: %d", hex($1));
my $scheduleID = sprintf ("slotID: %d", hex($2));
my $startdate = sprintf ("start: %4d-%02d-%02d %02d:%02d",
@@ -1110,7 +1110,7 @@ ZWave_scheduleEntryLockYearDaySet ($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if($arg !~
m/([01]) $p1_b $p1_b $p3_ymd $p2_hm $p3_ymd $p2_hm/) {
return ("wrong format, see commandref", "");
@@ -1133,13 +1133,13 @@ ZWave_scheduleEntryLockTimeOffsetParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(..)/);
-
+
my $sTZO = ((hex($1) & 0x80) == 0x80) ? '-' : '+';
my $TZO = sprintf("TZO: %s%02d:%02d", $sTZO, (hex($1) & 0x7f), hex($2));
-
+
my $sDST = ((hex($3) & 0x80) == 0x80) ? '-' : '+';
my $DST = sprintf("DST: %s%02d", $sDST, (hex($3) & 0x7f));
-
+
my $rt1 = "scheduleEntryLockTimeOffset: $TZO $DST";
return ($rt1);
}
@@ -1149,7 +1149,7 @@ ZWave_scheduleEntryLockTimeOffsetSet ($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if($arg !~ m/([\+\-])$p2_hm ([\+\-])$p1_b/) {
return ("wrong format, see commandref", "");
}
@@ -1168,14 +1168,14 @@ ZWave_scheduleEntryLockTypeSupportedParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(.*)/);
-
+
my $numWDslots = sprintf ("WeekDaySlots: %d", hex($1));
my $numYDslots = sprintf ("YearDaySlots: %d", hex($2));
-
+
# only for V3
my $numDailySlots = '';
$numDailySlots = sprintf (" DailyRepeatingSlots: %d", hex($3)) if ($3);
-
+
my $rt1 = "scheduleEntryLockEntryTypeSupported:"
." $numWDslots $numYDslots$numDailySlots";
return ($rt1);
@@ -1185,7 +1185,7 @@ sub
ZWave_thermostatSetpointGet($)
{
my ($type) = @_;
-
+
$type = (($type eq "%s") ? "1" : $type);
return ("wrong format, only 1-15 allowed","")
if ($type !~ m/^(1[0-5]?|[0]?[1-9])$/);
@@ -1203,19 +1203,19 @@ ZWave_thermostatSetpointSet ($$)
my $p1_type = "(1[0-5]?|[0]?[1-9])";
my $p1_prec = "([0-7])";
my $p1_size = "([124])";
-
+
if($arg !~
m/$p1_temp+ ?$p1_scale?+ ?$p1_type?+ ?$p1_prec?+ ?$p1_size?+/) {
return ("wrong format, see commandref", "");
}
-
+
my $temp = $1;
my $scale = (defined $2) ? $2 : "c"; # default to c = celsius
$scale = (lc($scale) eq "f") ? 1 : 0;
my $type = ((defined $3) ? $3 : 1) & 0x0f; # default to 1 = heating
my $prec = ((defined $4) ? $4 : 1) & 0x07; # default to 1 decimal
my $size = ((defined $5) ? $5 : 2) & 0x07; # default to 2 byte size
-
+
my $sp = int($temp * (10 ** $prec));
my $max = (2 ** (8*$size-1)) - 1;
my $min = -1 * (2 ** (8*$size-1));
@@ -1226,13 +1226,13 @@ ZWave_thermostatSetpointSet ($$)
$prec, $min/(10**$prec), $prec, $max/(10**$prec));
return ($rt, "");
}
-
+
$sp = ($sp < 0) ? $sp + 2**(8*$size) : $sp;
$sp = sprintf("%0*x", 2*$size, $sp);
$type = sprintf("%02x", $type);
my $precScaleSize = sprintf("%02x", ($size | ($scale<<3) | ($prec<<5)));
my $rt = "01$type$precScaleSize$sp";
-
+
return ("",$rt);
}
@@ -1241,9 +1241,9 @@ ZWave_thermostatSetpointParse ($$)
{
my ($hash, $val) = @_;
my $name = $hash->{NAME};
-
+
return if($val !~ m/^(..)(..)(.*)/);
-
+
my @setpointtype = ( # definition from V3
"notSupported",
"heating",
@@ -1266,7 +1266,7 @@ ZWave_thermostatSetpointParse ($$)
my $prec = (hex($2) & 0xe0)>>5;
my $scale = (((hex($2) & 0x18)>>3) == 1) ? "F": "C";
my $size = (hex($2) & 0x07);
-
+
if (length($3) != $size*2) {
Log3 $name, 1, "$name: THERMOSTAT_SETPOINT_REPORT "
."wrong number of bytes received";
@@ -1275,7 +1275,7 @@ ZWave_thermostatSetpointParse ($$)
my $sp = hex($3);
$sp -= (2 ** ($size*8)) if $sp >= (2 ** ($size*8-1));
$sp = $sp / (10 ** $prec);
-
+
# output temperature with variable decimals as reported (according to $prec)
my $rt = sprintf("setpointTemp:%0.*f %s %s", $prec, $sp, $scale, $type);
@@ -1288,9 +1288,9 @@ ZWave_thermostatSetpointSupportedParse ($$)
# only defined for version >= V3
my ($hash, $val) = @_;
my $name = $hash->{NAME};
-
+
return if($val !~ m/^(.*)/);
-
+
my $n = length($val)/2;
my @supportedType = ( # definition from V3
"none", # 0x00
@@ -1377,7 +1377,7 @@ ZWave_scheduleSet ($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if($arg !~
# 1 2 3 4 5 6 7 8 9 10 11 12
m/(.*?) (.*?) (....)-(..)-(..) (.*?) (.*?) (..):(..) (.*?) (.*?) (.*)/) {
@@ -1395,7 +1395,7 @@ ZWave_scheduleSet ($$)
my $sMinute = sprintf("%02x", $9 & 0x3f);
my $duration = sprintf("%04x", $10);
my $numReports = sprintf("%02x", $11);
-
+
my $cmdgroup ="";
my @param;
if (length($12)>0) { # cmd(s) given
@@ -1409,10 +1409,10 @@ ZWave_scheduleSet ($$)
my $rt = "03" .$ID .$uID .$sYear .$sMonth .$sDay .$sWDay;
$rt .= $sHour .$sMinute .$duration .$numReports .$numCmd .$cmdgroup;
-
+
#~ Log3 $name, 1, "$name: $rt";
return ("",$rt);
-
+
}
sub
@@ -1420,7 +1420,7 @@ ZWave_scheduleParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(..)(..)(..)(..)(..)(..)(....)(..)(..)(..)(.*)/);
-
+
my $scheduleID = sprintf ("ID: %d", hex($1));
my $userID = sprintf ("userID: %d", hex($2));
my $startYear = sprintf ("sYear: %d", 2000 + hex($3));
@@ -1449,7 +1449,7 @@ ZWave_scheduleStateParse ($$)
{
my ($hash, $val) = @_;
return if($val !~ m/^(..)(..)(..)(..)/);
-
+
my $numSupportedIDs = sprintf ("numIDs: %d", hex($1));
my $override = sprintf ("overried: %b", (hex($2) & 0x01));
my $numReports = sprintf ("numReportsToFollow: %d", (hex($2) & 0xfe)>>1);
@@ -1457,7 +1457,7 @@ ZWave_scheduleStateParse ($$)
my $ID2 = sprintf ("ID2: %d", (hex($3) & 0xf0)>>4);
my $ID3 = sprintf ("ID3: %d", (hex($4) & 0x0f));
my $IDN = sprintf ("IDn: %d", (hex($4) & 0xf0)>>4);
-
+
my $rt1 .= "scheduleState:$numSupportedIDs $override $numReports ".
"$ID1 $ID2 $ID3 $IDN";
return ($rt1);
@@ -1713,7 +1713,7 @@ ZWave_applicationStatusBusyParse($$$)
$rt .= sprintf("waitTime: %d", hex($wTime));
return ("applicationBusy:$rt");
}
-
+
sub
ZWave_timeParametersReport($$)
{
@@ -1785,15 +1785,15 @@ ZWave_timeOffsetReport($$)
my $monthEndDST = hex($7);
my $dayEndDST = hex($8);
my $hourEndDST = hex($9);
-
+
my $UTCoffset = "UTC-Offset: ";
$UTCoffset .= ($signTZO ? "-" : "+");
$UTCoffset .= sprintf ("%02d:%02d", $hourTZO, $minuteTZO);
-
+
my $DSToffset = "DST-Offset(minutes): ";
$DSToffset .= ($signOffsetDST ? "-" : "+");
$DSToffset .= sprintf ("%02d", $minuteOffsetDST);
-
+
my $startDST = "DST-Start: ";
$startDST .= sprintf ("%02d-%02d_%02d:00",
$monthStartDST, $dayStartDST, $hourStartDST);
@@ -1825,7 +1825,7 @@ ZWave_timeOffsetSet($$)
my $monthEndDST = $9;
my $dayEndDST = $10;
my $hourEndDST = $11;
-
+
my $rt = sprintf("%02x%02x",
($hourTZO | ($signTZO eq "-" ? 0x01 : 0x00)), $minuteTZO);
$rt .= sprintf("%02x",
@@ -1833,10 +1833,10 @@ ZWave_timeOffsetSet($$)
$rt .= sprintf("%02x%02x%02x",
$monthStartDST, $dayStartDST, $hourStartDST);
$rt .= sprintf("%02x%02x%02x", $monthEndDST, $dayEndDST, $hourEndDST);
-
+
return ("", sprintf("05%s", $rt));
}
-
+
sub
ZWave_DoorLockOperationReport($$)
{
@@ -1926,7 +1926,7 @@ ZWave_DoorLockOperationSet($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
my $rt;
$rt = ($arg eq 'open') ? "00" :
($arg eq 'close') ? "FF" :
@@ -1937,10 +1937,10 @@ ZWave_DoorLockOperationSet($$)
($arg eq "20") ? "20" :
($arg eq "21") ? "21" :
($arg eq "FF") ? "FF" : "";
-
+
return ("DoorLockOperationSet: wrong parameter, see commandref")
if ($rt eq "");
-
+
return ("", "01".$rt);
}
@@ -1951,13 +1951,13 @@ ZWave_DoorLockConfigSet($$)
# userinput: operationType, ohandles, ihandles, seconds_dez
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if ($arg !~ m/\b(.+)\b \b([01]{4})\b \b([01]{4})\b \b([0-9]+)$/) {
#~ Log3 $name, 1, "$name: doorLockConfigurationSet wrong ".
#~ "format, see commandref: $arg";
return ("doorLockConfigurationSet: wrong format, see commandref","");
}
-
+
my $oT;
if (lc($1) eq "constant") {
$oT = 1;
@@ -1966,9 +1966,9 @@ ZWave_DoorLockConfigSet($$)
} else {
return ("wrong operationType: only [constant|timed] is allowed","");
}
-
+
my $handles = ((oct("0b".$2))<<4 | oct("0b".$3));
-
+
if (($4 < 1) || ($4) > 15239) { # max. 253 * 60 + 59 seconds
return ("doorLockConfigurationSet: 1-15238 seconds allowed","");
}
@@ -2193,7 +2193,7 @@ ZWave_ccsAllGet ($)
}
return ("working in the background","EMPTY");
}
-
+
sub
ZWave_ccsParse($$)
{
@@ -2758,7 +2758,7 @@ ZWave_secIncludeStart($$)
my ($hash, $iodev) = @_;
my $name = $hash->{NAME};
my $ioName = $iodev->{NAME};
-
+
readingsSingleUpdate($hash, "SECURITY",
"INITIALIZING (starting secure inclusion)", 0);
my $classes = AttrVal($name, "classes", "");
@@ -2775,7 +2775,7 @@ ZWave_secIncludeStart($$)
# starting secure inclusion by setting the scheme
$zwave_parseHook{"$hash->{nodeIdHex}:..9805"} = \&ZWave_secSchemeReport;
ZWave_secAddToSendStack($hash, "980400"); # only scheme "00" is defined
-
+
return 1;
} else {
Log3 $ioName,1,"No secure inclusion as $ioName has no networkKey";
@@ -2804,7 +2804,7 @@ ZWave_secSchemeReport($$) # only called by zwave_parseHook during Include
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
-
+
if ($arg =~ m/..9805(..)/) { # 03980500 is expected
if ($1 == 0) { # supported SECURITY-Scheme, prepare for setting networkkey
$zwave_parseHook{"$hash->{nodeIdHex}:..9880"} = \&ZWave_secNetworkkeySet;
@@ -2838,10 +2838,10 @@ ZWave_secNetworkkeySet($$) # only called by zwave_parseHook during Include
my $mynonce_hex = substr (ZWave_secCreateNonce($hash), 2, 16);
my $cryptedNetworkKeyMsg = ZWave_secNetworkkeyEncode($r_nonce_hex,
$mynonce_hex, $key_hex, $hash->{nodeIdHex});
-
+
$zwave_parseHook{"$hash->{nodeIdHex}:..9807"} = \&ZWave_secNetWorkKeyVerify;
ZWave_secAddToSendStack($hash, '98'.$cryptedNetworkKeyMsg);
-
+
readingsSingleUpdate($hash, "SECURITY", 'INITIALIZING (Networkkey sent)',0);
Log3 $name, 5, "$name: SECURITY initializing, networkkey sent";
@@ -2862,12 +2862,12 @@ ZWave_secNetWorkKeyVerify ($$) # only called by zwave_parseHook during Include
if (!ZWave_secIsEnabled($hash)) {
return 1;
}
-
+
RemoveInternalTimer($hash->{networkkeyTimer});
delete $hash->{networkkeyTimer};
readingsSingleUpdate($hash, "SECURITY", 'ENABLED', 0);
Log3 $name, 3, "$name: SECURITY enabled, networkkey was verified";
-
+
$zwave_parseHook{"$hash->{nodeIdHex}:..9803"} = \&ZWave_secIncludeFinished;
ZWave_Cmd("set", $hash, $name, ("secSupportedReport"));
return 1; # "veto" for parseHook
@@ -2879,7 +2879,7 @@ ZWave_secIncludeFinished($$) # only called by zwave_parseHook during Include
my ($hash, $arg) = @_;
my $iodev = $hash->{IODev};
my $name = $hash->{NAME};
-
+
if ($iodev->{secInitName}) {
# Secure inclusion is finished, remove readings and execute "normal" init
delete $iodev->{secInitName};
@@ -2895,7 +2895,7 @@ ZWave_secTestNetworkkeyVerify ($)
my $hash = $p->{hash};
my $name = $hash->{NAME};
my $sec_status = ReadingsVal($name, "SECURITY", undef);
-
+
delete $hash->{networkkeyTimer};
if ($sec_status !~ m/ENABLED/) {
readingsSingleUpdate($hash, "SECURITY",
@@ -2910,7 +2910,7 @@ ZWave_secAddToSendStack($$)
{
my ($hash, $cmd) = @_;
my $name = $hash->{NAME};
-
+
my $id = $hash->{nodeIdHex};
my $len = sprintf("%02x", (length($cmd)-2)/2+1);
my $cmdEf = (AttrVal($name, "noExplorerFrames", 0) == 0 ? "25" : "05");
@@ -2926,7 +2926,7 @@ ZWave_secStart($)
$hash->{secTime} = $dt;
$hash->{secTimer} = { hash => $hash };
InternalTimer($dt+7, "ZWave_secUnlock", $hash->{secTimer}, 0);
-
+
return if($hash->{secInProgress});
$hash->{secInProgress} = 1;
my @empty;
@@ -3704,6 +3704,15 @@ ZWave_Parse($$@)
DoTrigger($ioName, "$cmd $retval");
return "";
}
+ if($cmd eq "ZW_SET_SUC_NODE_ID") {
+ my $retval;
+ if($arg eq "00") { $retval = 'setSucNodeFailed';
+ } elsif($arg eq "01") { $retval = 'setSucNodeOk';
+ } else { $retval = 'unknown_'.$arg; # should never happen
+ }
+ DoTrigger($ioName, "$cmd $retval");
+ return "";
+ }
Log3 $ioName, 4, "$ioName unhandled ANSWER: $cmd $arg";
return "";
@@ -4390,7 +4399,7 @@ s2Hex($)
set configuration for a specific scene.
Parameters are: groupId, sceneId, dimmingDuration.
-
+
Class SCHEDULE_ENTRY_LOCK, V1, V2, V3
scheduleEntryLockSet USER_ID ENABLED
enables or disables schedules for a specified user ID (V1)
@@ -4585,7 +4594,7 @@ s2Hex($)
TIME: Time (UTC) in the format hh:mm:ss.
Note: Time zone offset to UTC must be set with command class TIME.
-
+
Class USER_CODE
userCode id status code
set code and status for the id n. n ist starting at 1, status is 0 for
@@ -4799,7 +4808,7 @@ s2Hex($)
groupConfig
returns the settings for a given group. Parameter is groupId
-
+
Class SCHEDULE_ENTRY_LOCK, V1, V2, V3
scheduleEntryLockTypeSupported
returns the number of available slots for week day and year day
@@ -5341,7 +5350,7 @@ s2Hex($)
Class TIME_PARAMETERS, V1
timeParameters: date: $date time(UTC): $time
-
+
Class USER_CODE
userCode:id x status y code z