2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

ZWave: added noArg modifier for sets/gets, sendNIF/getVirtualNodes commands

git-svn-id: https://svn.fhem.de/fhem/trunk@6592 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-09-21 20:01:13 +00:00
parent 8d93e48fdb
commit 637b5c74c8
2 changed files with 39 additions and 23 deletions

View File

@ -25,23 +25,27 @@ sub ZWave_HandleSendStack($);
# http://buzzdavidson.com/?p=68
# https://bitbucket.org/bradsjm/aeonzstickdriver
my %sets = (
"addNode" => { cmd => "4a%02x@", # ZW_ADD_NODE_TO_NETWORK',
"addNode" => { cmd => "4a%02x@", # ZW_ADD_NODE_TO_NETWORK',
param => {on=>0x81, off=>0x05 } },
"removeNode"=> { cmd => "4b%02x@", # ZW_REMOVE_NODE_FROM_NETWORK',
"removeNode"=> { cmd => "4b%02x@", # ZW_REMOVE_NODE_FROM_NETWORK',
param => {on=>0x81, off=>0x05 } },
"createNode"=> { cmd => "60%02x" }, # ZW_REQUEST_NODE_INFO',
"neighborUpdate"=> { cmd => "48" }, # ZW_REQUEST_NODE_NEIGHBOR_UPDATE
"createNode"=> { cmd => "60%02x" }, # ZW_REQUEST_NODE_INFO',
"neighborUpdate" => { cmd => "48",
param => {noArg => ""} }, # ZW_REQUEST_NODE_NEIGHBOR_UPDATE
"sendNIF" => { cmd => "12%02x05@" }, # ZW_SEND_NODE_INFORMATION
);
my %gets = (
"caps" => "07", # SERIAL_API_GET_CAPABILITIES
"ctrlCaps" => "05", # ZW_GET_CONTROLLER_CAPS
"nodeInfo" => "41%02x", # ZW_GET_NODE_PROTOCOL_INFO
"nodeList" => "02", # SERIAL_API_GET_INIT_DATA
"homeId" => "20", # MEMORY_GET_ID
"version" => "15", # ZW_GET_VERSION
"raw" => "%s",
"neighborList" => "80%02x0101", # GET_ROUTING_TABLE_LINE include dead links, include non-routing neigbors
"caps" => "07", # SERIAL_API_GET_CAPABILITIES
"ctrlCaps" => "05", # ZW_GET_CONTROLLER_CAPS
"nodeInfo" => "41%02x", # ZW_GET_NODE_PROTOCOL_INFO
"nodeList" => "02", # SERIAL_API_GET_INIT_DATA
"homeId" => "20", # MEMORY_GET_ID
"version" => "15", # ZW_GET_VERSION
"getVirtualNodes" => "a5", # ZW_GET_VIRTUAL_NODES
"neighborList" => "80%02x0101", # GET_ROUTING_TABLE_LINE include dead links,
# include non-routing neigbors
"raw" => "%s", # hex
);
# Known controller function.
@ -141,7 +145,6 @@ use vars qw(%zw_type6);
);
sub
ZWDongle_Initialize($)
{
@ -226,7 +229,7 @@ ZWDongle_Set($@)
}
my $cmd = $sets{$type}{cmd};
my $par = $sets{$type}{param};
if($par) {
if($par && !$par->{noArg}) {
return "Unknown argument for $type, choose one of ".join(" ",keys %{$par})
if(!defined($par->{$a[0]}));
$a[0] = $par->{$a[0]};
@ -259,7 +262,8 @@ ZWDongle_Get($@)
return "\"get $name\" needs at least one parameter" if(@a < 1);
my $type = shift @a;
return "Unknown argument $type, choose one of " . join(" ", sort keys %gets)
return "Unknown argument $type, choose one of " .
join(" ", map { $gets{$_} =~ m/%/ ? $_ : "$_:noArg" } sort keys %gets)
if(!defined($gets{$type}));
my @ga = split("%", $gets{$type}, -1);
@ -297,11 +301,12 @@ ZWDongle_Get($@)
for my $byte (0..31) {
my $bits = $r[10+$byte];
for my $bit (0..7) {
my $fn = $zw_func_id{sprintf("%02x", $byte*8+$bit)};
push @list, $fn if(($bits & (1<<$bit)) && $fn);
my $id = sprintf("%02x", $byte*8+$bit);
push @list, ($zw_func_id{$id} ? $zw_func_id{$id} : "UNKNOWN_$id")
if($bits & (1<<$bit));
}
}
$msg .= " ".join(",",@list);
$msg .= " ".join(" ",@list);
} elsif($type eq "homeId") { ############################
$msg = sprintf("HomeId:%s CtrlNodeId:%s",
@ -323,6 +328,9 @@ ZWDongle_Get($@)
}
$msg = join(" ", @list);
} elsif($type eq "getVirtualNodes") { ############################
$msg = join(" ", @r);
} elsif($type eq "nodeInfo") { ############################
my $id = sprintf("%02x", $r[6]);
if($id eq "00") {

View File

@ -264,11 +264,12 @@ my %zwave_class = (
SENSOR_CONFIGURATION => { id => '9e', },
MARK => { id => 'ef', },
NON_INTEROPERABLE => { id => 'f0', },
);
);
my %zwave_cmdArgs = (
dim => "slider,0,1,99",
indicatorDim => "slider,0,1,99",
);
);
sub
@ -362,10 +363,17 @@ ZWave_Cmd($$@)
}
if(!$cmdList{$cmd}) {
my $list = join(" ",sort keys %cmdList);
foreach my $cmd (keys %zwave_cmdArgs) { # add slider & co
$list =~ s/\b$cmd\b/$cmd:$zwave_cmdArgs{$cmd}/;
my @list;
foreach my $cmd (sort keys %cmdList) {
if($zwave_cmdArgs{$cmd}) {
push @list, "$cmd:$zwave_cmdArgs{$cmd}";
} elsif($cmdList{$cmd}{fmt} !~ m/%/) {
push @list, "$cmd:noArg";
} else {
push @list, $cmd;
}
}
my $list = join(" ",@list);
if($type eq "set") {
unshift @a, $name, $cmd;