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

10_ZWave.pm: add command class version handling capability (Forum #53389)

git-svn-id: https://svn.fhem.de/fhem/trunk@11563 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2016-05-30 12:24:00 +00:00
parent bbfc4a260a
commit 85f2425b9a

View File

@ -417,7 +417,8 @@ my %zwave_class = (
"0b8612(..................)" => 'sprintf("version:Lib %d Prot '. "0b8612(..................)" => 'sprintf("version:Lib %d Prot '.
'%d.%d App %d.%d HW %d FWCounter %d FW %d.%d",'. '%d.%d App %d.%d HW %d FWCounter %d FW %d.%d",'.
'unpack("C*",pack("H*","$1")))', 'unpack("C*",pack("H*","$1")))',
"048614(..)(..)" => '"versionClass_$1:$2"' } }, "048614(..)(..)" => '"versionClass_$1:$2"' },
init => { ORDER=>12, CMD => '"get $NAME versionClassAll"' } },
INDICATOR => { id => '87', INDICATOR => { id => '87',
set => { indicatorOff => "0100", set => { indicatorOff => "0100",
indicatorOn => "01FF", indicatorOn => "01FF",
@ -482,12 +483,16 @@ my %zwave_class = (
NON_INTEROPERABLE => { id => 'f0' }, NON_INTEROPERABLE => { id => 'f0' },
); );
my %zwave_classVersion = (
dimWithDuration => { min => 2 },
);
my %zwave_cmdArgs = ( my %zwave_cmdArgs = (
set => { set => {
dim => "slider,0,1,99", dim => "slider,0,1,99",
indicatorDim => "slider,0,1,99", indicatorDim => "slider,0,1,99",
rgb => "colorpicker,RGB", rgb => "colorpicker,RGB",
configRGBLedColorForTesting => "colorpicker,RGB", # Aeon SmartSwitch 6 configRGBLedColorForTesting => "colorpicker,RGB", # Aeon SmartSwitch 6
}, },
get => { get => {
}, },
@ -645,6 +650,7 @@ ZWave_Define($$)
} }
} }
AssignIoPort($hash, $proposed); AssignIoPort($hash, $proposed);
$hash->{".vclasses"} = {};
if(@a) { # Autocreate: set the classes, execute the init calls if(@a) { # Autocreate: set the classes, execute the init calls
asyncOutput($hash->{IODev}{addCL}, "created $name") if($hash->{IODev}); asyncOutput($hash->{IODev}{addCL}, "created $name") if($hash->{IODev});
@ -1644,6 +1650,7 @@ ZWave_versionClassAllGet($@)
my %h = map { $_=>1 } split(" ", AttrVal($name, "vclasses", "")); my %h = map { $_=>1 } split(" ", AttrVal($name, "vclasses", ""));
return 0 if($data !~ m/^048614(..)(..)$/i); # ?? return 0 if($data !~ m/^048614(..)(..)$/i); # ??
$h{$zwave_id2class{lc($1)}.":".hex($2)} = 1; $h{$zwave_id2class{lc($1)}.":".hex($2)} = 1;
$hash->{".vclasses"}{$zwave_id2class{lc($1)}} = hex($2);
$attr{$name}{vclasses} = join(" ", sort keys %h); $attr{$name}{vclasses} = join(" ", sort keys %h);
return 1; # "veto" for parseHook return 1; # "veto" for parseHook
} }
@ -3515,6 +3522,16 @@ ZWave_getHash($$$)
map { $ptr->{$_} = $add->{$_} } keys %{$add} if($add); map { $ptr->{$_} = $add->{$_} } keys %{$add} if($add);
} }
my $version = $hash->{".vclasses"}{$cl};
if(defined($version) && ($type eq "get" || $type eq "set")) {
map {
my $zv = $zwave_classVersion{$_};
delete $ptr->{$_} if($zv &&
(($zv->{min} && $zv->{min} > $version) ||
($zv->{max} && $zv->{max} < $version)));
} keys %{$ptr};
}
return $ptr; return $ptr;
} }
@ -4157,16 +4174,28 @@ ZWave_computeRoute($;$)
sub sub
ZWave_Attr(@) ZWave_Attr(@)
{ {
my ($type, $devName, $attrName, @param) = @_; my ($type, $devName, $attrName, $param) = @_;
my $hash = $defs{$devName};
if($attrName eq "zwaveRoute") { if($attrName eq "zwaveRoute") {
if($type eq "del") { if($type eq "del") {
delete $defs{$devName}{route}; delete $hash->{route};
return undef; return undef;
} }
return ZWave_computeRoute($devName,join(" ",@param)) if($init_done); return ZWave_computeRoute($devName, $param) if($init_done);
InternalTimer(1, "ZWave_computeRoute", "TYPE=ZWave", 0); InternalTimer(1, "ZWave_computeRoute", "TYPE=ZWave", 0);
return undef;
} elsif($attrName eq "vclasses") {
if($type eq "del") {
$hash->{".vclasses"} = {};
return undef;
}
my %h = map { split(":", $_) } split(" ", $param);
$hash->{".vclasses"} = \%h;
return undef;
} }
return undef; return undef;
} }