mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
10_ZWave.pm: MANUFACTURER_PRORIETARY/model revisited (Forum #27455)
git-svn-id: https://svn.fhem.de/fhem/trunk@6662 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
8c6a06f94a
commit
5094e252a0
@ -13,16 +13,11 @@ sub ZWave_Get($@);
|
|||||||
sub ZWave_Cmd($$@);
|
sub ZWave_Cmd($$@);
|
||||||
sub ZWave_ParseMeter($);
|
sub ZWave_ParseMeter($);
|
||||||
sub ZWave_SetClasses($$$$);
|
sub ZWave_SetClasses($$$$);
|
||||||
|
sub ZWave_getParse($$$);
|
||||||
|
|
||||||
use vars qw(%zw_func_id);
|
use vars qw(%zw_func_id);
|
||||||
use vars qw(%zw_type6);
|
use vars qw(%zw_type6);
|
||||||
|
|
||||||
my @zwave_models = qw(
|
|
||||||
Everspring_AN1582
|
|
||||||
Everspring_AN1583
|
|
||||||
Fibaro_FGRM222
|
|
||||||
);
|
|
||||||
|
|
||||||
my %zwave_id2class;
|
my %zwave_id2class;
|
||||||
my %zwave_class = (
|
my %zwave_class = (
|
||||||
NO_OPERATION => { id => '00', },
|
NO_OPERATION => { id => '00', },
|
||||||
@ -193,7 +188,8 @@ my %zwave_class = (
|
|||||||
parse => { "..7105(..)(..)" => '"alarm_type_$1:level $2"',}, },
|
parse => { "..7105(..)(..)" => '"alarm_type_$1:level $2"',}, },
|
||||||
MANUFACTURER_SPECIFIC => { id => '72',
|
MANUFACTURER_SPECIFIC => { id => '72',
|
||||||
get => { model => "04", },
|
get => { model => "04", },
|
||||||
parse => { "087205(....)(....)(....)" => 'ZWave_mfsParse($1,$2,$3)'}},
|
parse => { "087205(....)(....)(....)" => 'ZWave_mfsParse($1,$2,$3)',
|
||||||
|
"087205(....)(....)(.{4})" => '"modelId:$1-$2-$3"', }},
|
||||||
POWERLEVEL => { id => '73', },
|
POWERLEVEL => { id => '73', },
|
||||||
PROTECTION => { id => '75',
|
PROTECTION => { id => '75',
|
||||||
set => { protectionOff => "0100",
|
set => { protectionOff => "0100",
|
||||||
@ -278,6 +274,7 @@ my %zwave_cmdArgs = (
|
|||||||
indicatorDim => "slider,0,1,99",
|
indicatorDim => "slider,0,1,99",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
my %modelIdAlias = ( "010f-0301-1001" => "Fibaro_FGRM222" );
|
||||||
my %manuf_proprietary = ( # MANUFACTURER_PROPRIETARY ist model dependent
|
my %manuf_proprietary = ( # MANUFACTURER_PROPRIETARY ist model dependent
|
||||||
Fibaro_FGRM222 => {
|
Fibaro_FGRM222 => {
|
||||||
set => { positionSlat=>"010f26010100%02x",
|
set => { positionSlat=>"010f26010100%02x",
|
||||||
@ -298,9 +295,7 @@ ZWave_Initialize($)
|
|||||||
$hash->{UndefFn} = "ZWave_Undef";
|
$hash->{UndefFn} = "ZWave_Undef";
|
||||||
$hash->{ParseFn} = "ZWave_Parse";
|
$hash->{ParseFn} = "ZWave_Parse";
|
||||||
$hash->{AttrList} = "IODev do_not_notify:1,0 ".
|
$hash->{AttrList} = "IODev do_not_notify:1,0 ".
|
||||||
"ignore:1,0 dummy:1,0 showtime:1,0 classes ".
|
"ignore:1,0 dummy:1,0 showtime:1,0 classes $readingFnAttributes";
|
||||||
"$readingFnAttributes " .
|
|
||||||
"model:".join(",", sort @zwave_models);
|
|
||||||
map { $zwave_id2class{lc($zwave_class{$_}{id})} = $_ } keys %zwave_class;
|
map { $zwave_id2class{lc($zwave_class{$_}{id})} = $_ } keys %zwave_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,12 +362,7 @@ ZWave_Cmd($$@)
|
|||||||
my %cmdList;
|
my %cmdList;
|
||||||
my $classes = AttrVal($name, "classes", "");
|
my $classes = AttrVal($name, "classes", "");
|
||||||
foreach my $cl (split(" ", $classes)) {
|
foreach my $cl (split(" ", $classes)) {
|
||||||
my $ptr = $zwave_class{$cl}{$type}
|
my $ptr = ZWave_getHash($hash, $cl, $type);
|
||||||
if($zwave_class{$cl} && $zwave_class{$cl}{$type});
|
|
||||||
if($cl eq "MANUFACTURER_PROPRIETARY") {
|
|
||||||
my $p = $manuf_proprietary{AttrVal($name, "model", "")};
|
|
||||||
$ptr = $p->{$type} if($p && $p->{$type});
|
|
||||||
}
|
|
||||||
next if(!$ptr);
|
next if(!$ptr);
|
||||||
|
|
||||||
foreach my $k (keys %{$ptr}) {
|
foreach my $k (keys %{$ptr}) {
|
||||||
@ -468,29 +458,18 @@ ZWave_Cmd($$@)
|
|||||||
no strict "refs";
|
no strict "refs";
|
||||||
my $iohash = $hash->{IODev};
|
my $iohash = $hash->{IODev};
|
||||||
my $fn = $modules{$iohash->{TYPE}}{ReadAnswerFn};
|
my $fn = $modules{$iohash->{TYPE}}{ReadAnswerFn};
|
||||||
my ($err, $data) = &{$fn}($iohash, $cmd, "^000400$id");
|
my ($err, $data) = &{$fn}($iohash, $cmd, "^000400$id") if($fn);
|
||||||
use strict "refs";
|
use strict "refs";
|
||||||
|
|
||||||
return $err if($err);
|
return $err if($err);
|
||||||
$val = ZWave_Parse($iohash, $data, 1);
|
$val = ($data ? ZWave_Parse($iohash, $data, $type) : "no data returned");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$cmd .= " ".join(" ", @a) if(@a);
|
$cmd .= " ".join(" ", @a) if(@a);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $tn = TimeNow();
|
readingsSingleUpdate($hash, "state", $cmd, 1) if($type eq "set");
|
||||||
if($type eq "set") {
|
|
||||||
readingsSingleUpdate($hash, "state", $cmd, 1);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
my $mval = $val;
|
|
||||||
($cmd, $mval) = split(":", $val) if($val);
|
|
||||||
if($cmd && $mval) {
|
|
||||||
readingsSingleUpdate($hash, $cmd, $mval, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return $val;
|
return $val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -664,13 +643,31 @@ ZWave_mfsParse($$$)
|
|||||||
return sprintf("model:0x%s 0x%s 0x%s", $mf, $prod, $id);
|
return sprintf("model:0x%s 0x%s 0x%s", $mf, $prod, $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
ZWave_getHash($$$)
|
||||||
|
{
|
||||||
|
my ($hash, $cl, $type) = @_;
|
||||||
|
|
||||||
|
my $ptr = $zwave_class{$cl}{$type}
|
||||||
|
if($zwave_class{$cl} && $zwave_class{$cl}{$type});
|
||||||
|
|
||||||
|
if($cl eq "MANUFACTURER_PROPRIETARY") {
|
||||||
|
my $modelId = ReadingsVal($hash, "modelId", "");
|
||||||
|
$modelId = $modelIdAlias{$modelId} if($modelIdAlias{$modelId});
|
||||||
|
my $p = $manuf_proprietary{$modelId};
|
||||||
|
$ptr = $p->{$type} if($p && $p->{$type});
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ptr;
|
||||||
|
}
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
# 0004000a03250300 (sensor binary off for id 11)
|
# 0004000a03250300 (sensor binary off for id 11)
|
||||||
# { ZWave_Parse($defs{zd}, "0004000c028407", 0) }
|
# { ZWave_Parse($defs{zd}, "0004000c028407", "") }
|
||||||
sub
|
sub
|
||||||
ZWave_Parse($$@)
|
ZWave_Parse($$@)
|
||||||
{
|
{
|
||||||
my ($iodev, $msg, $local) = @_;
|
my ($iodev, $msg, $srcCmd) = @_;
|
||||||
my $homeId = $iodev->{homeId};
|
my $homeId = $iodev->{homeId};
|
||||||
my $ioName = $iodev->{NAME};
|
my $ioName = $iodev->{NAME};
|
||||||
if(!$homeId) {
|
if(!$homeId) {
|
||||||
@ -751,7 +748,7 @@ ZWave_Parse($$@)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($evt) {
|
if($evt) {
|
||||||
return "$cmd $evt" if($local);
|
return "$cmd $evt" if($srcCmd);
|
||||||
DoTrigger($ioName, "$cmd $evt");
|
DoTrigger($ioName, "$cmd $evt");
|
||||||
Log3 $ioName, 4, "$ioName $cmd $evt";
|
Log3 $ioName, 4, "$ioName $cmd $evt";
|
||||||
return "";
|
return "";
|
||||||
@ -805,13 +802,7 @@ ZWave_Parse($$@)
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $ptr = $zwave_class{$className}{parse}
|
my $ptr = ZWave_getHash($hash, $className, "parse");
|
||||||
if($zwave_class{$className}{parse});
|
|
||||||
if($className eq "MANUFACTURER_PROPRIETARY") {
|
|
||||||
my $p = $manuf_proprietary{AttrVal($name, "model", "")};
|
|
||||||
$ptr = $p->{parse} if($p && $p->{parse})
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$ptr) {
|
if(!$ptr) {
|
||||||
Log3 $hash, 4, "$name: Unknown message ($className $arg)";
|
Log3 $hash, 4, "$name: Unknown message ($className $arg)";
|
||||||
next;
|
next;
|
||||||
@ -836,7 +827,6 @@ ZWave_Parse($$@)
|
|||||||
$baseHash->{lastMsgTimestamp} = time();
|
$baseHash->{lastMsgTimestamp} = time();
|
||||||
|
|
||||||
return "" if(!@event);
|
return "" if(!@event);
|
||||||
return join(" ", @event) if($local);
|
|
||||||
|
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
for(my $i = 0; $i < int(@event); $i++) {
|
for(my $i = 0; $i < int(@event); $i++) {
|
||||||
@ -847,6 +837,8 @@ ZWave_Parse($$@)
|
|||||||
if($vn eq "state"); # different from set
|
if($vn eq "state"); # different from set
|
||||||
}
|
}
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
|
|
||||||
|
return join("\n", @event) if($srcCmd);
|
||||||
return $name;
|
return $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1220,7 +1212,6 @@ s2Hex($)
|
|||||||
<li><a href="#ignore">ignore</a></li>
|
<li><a href="#ignore">ignore</a></li>
|
||||||
<li><a href="#dummy">dummy</a></li>
|
<li><a href="#dummy">dummy</a></li>
|
||||||
<li><a href="#showtime">showtime</a></li>
|
<li><a href="#showtime">showtime</a></li>
|
||||||
<li><a href="#model">model</a></li>
|
|
||||||
<li><a href="#readingFnAttributes">readingFnAttributes</a></li>
|
<li><a href="#readingFnAttributes">readingFnAttributes</a></li>
|
||||||
<li><a href="#classes">classes</a>
|
<li><a href="#classes">classes</a>
|
||||||
This attribute is needed by the ZWave module, as the list of the possible
|
This attribute is needed by the ZWave module, as the list of the possible
|
||||||
|
Loading…
x
Reference in New Issue
Block a user