2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

ZWave: Parse MULTI_CMD + THERMOSTAT_SETPOINT

git-svn-id: https://svn.fhem.de/fhem/trunk@3864 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2013-09-06 11:35:02 +00:00
parent eb30dc2d18
commit ad2b2ae883

View File

@ -62,12 +62,12 @@ my %zwave_class = (
SWITCH_ALL => { id => '27', }, SWITCH_ALL => { id => '27', },
SWITCH_TOGGLE_BINARY => { id => '28', }, SWITCH_TOGGLE_BINARY => { id => '28', },
SWITCH_TOGGLE_MULTILEVEL => { id => '29', }, SWITCH_TOGGLE_MULTILEVEL => { id => '29', },
CHIMNEY_FAN => { id => '2A', }, CHIMNEY_FAN => { id => '2a', },
SCENE_ACTUATOR_CONF => { id => '2C', }, SCENE_ACTIVATION => { id => '2b', },
SCENE_CONTROLLER_CONF => { id => '2D', }, SCENE_ACTUATOR_CONF => { id => '2c', },
ZIP_ADV_SERVICES => { id => '2F', }, SCENE_CONTROLLER_CONF => { id => '2d', },
SCENE_ACTIVATION => { id => '2B', }, ZIP_CLIENT => { id => '2e', },
ZIP_CLIENT => { id => '2E', }, ZIP_ADV_SERVICES => { id => '2f', },
SENSOR_BINARY => { id => '30', SENSOR_BINARY => { id => '30',
get => { sbStatus => "02", }, get => { sbStatus => "02", },
parse => { "03300300" => "state:closed", parse => { "03300300" => "state:closed",
@ -81,18 +81,22 @@ my %zwave_class = (
HRV_STATUS => { id => '37', }, HRV_STATUS => { id => '37', },
THERMOSTAT_HEATING => { id => '38', }, THERMOSTAT_HEATING => { id => '38', },
HRV_CONTROL => { id => '39', }, HRV_CONTROL => { id => '39', },
METER_TBL_CONFIG => { id => '3C', }, METER_TBL_CONFIG => { id => '3c', },
METER_TBL_MONITOR => { id => '3D', }, METER_TBL_MONITOR => { id => '3d', },
METER_TBL_PUSH => { id => '3E', }, METER_TBL_PUSH => { id => '3e', },
THERMOSTAT_MODE => { id => '40', }, THERMOSTAT_MODE => { id => '40', },
THERMOSTAT_OPERATING_STATE => { id => '42', }, THERMOSTAT_OPERATING_STATE=>{ id => '42', },
THERMOSTAT_SETPOINT => { id => '43', }, THERMOSTAT_SETPOINT => { id => '43',
get => { setpoint => "02" },
parse => { "064303(..)(..)(....)" => 'sprintf("temperature:%0.1f %s %s", '.
'hex($3)/(10**int(hex($2)/32)), '.
'hex($2)&8 ? "F":"C", $1==1 ? "heating":"cooling")' }, },
THERMOSTAT_FAN_MODE => { id => '44', }, THERMOSTAT_FAN_MODE => { id => '44', },
THERMOSTAT_FAN_STATE => { id => '45', }, THERMOSTAT_FAN_STATE => { id => '45', },
CLIMATE_CONTROL_SCHEDULE => { id => '46', }, CLIMATE_CONTROL_SCHEDULE => { id => '46', },
THERMOSTAT_SETBACK => { id => '47', }, THERMOSTAT_SETBACK => { id => '47', },
DOOR_LOCK_LOGGING => { id => '4C', }, DOOR_LOCK_LOGGING => { id => '4c', },
SCHEDULE_ENTRY_LOCK => { id => '4E', }, SCHEDULE_ENTRY_LOCK => { id => '4e', },
BASIC_WINDOW_COVERING => { id => '50', }, BASIC_WINDOW_COVERING => { id => '50', },
MTP_WINDOW_COVERING => { id => '51', }, MTP_WINDOW_COVERING => { id => '51', },
MULTI_CHANNEL => { id => '60', # Version 2, aka MULTI_INSTANCE MULTI_CHANNEL => { id => '60', # Version 2, aka MULTI_INSTANCE
@ -119,10 +123,10 @@ my %zwave_class = (
PROTECTION => { id => '75', }, PROTECTION => { id => '75', },
LOCK => { id => '76', }, LOCK => { id => '76', },
NODE_NAMING => { id => '77', }, NODE_NAMING => { id => '77', },
GROUPING_NAME => { id => '7B', }, FIRMWARE_UPDATE_MD => { id => '7a', },
FIRMWARE_UPDATE_MD => { id => '7A', }, GROUPING_NAME => { id => '7b', },
REMOTE_ASSOCIATION_ACTIVATE => { id => '7c', }, REMOTE_ASSOCIATION_ACTIVATE=>{id => '7c', },
REMOTE_ASSOCIATION => { id => '7D', }, REMOTE_ASSOCIATION => { id => '7d', },
BATTERY => { id => '80', BATTERY => { id => '80',
get => { battery => "02" }, get => { battery => "02" },
parse => { "038003(..)"=> '"battery:".hex($1)." %"' }, }, parse => { "038003(..)"=> '"battery:".hex($1)." %"' }, },
@ -147,12 +151,12 @@ my %zwave_class = (
INDICATOR => { id => '87', }, INDICATOR => { id => '87', },
PROPRIETARY => { id => '88', }, PROPRIETARY => { id => '88', },
LANGUAGE => { id => '89', }, LANGUAGE => { id => '89', },
TIME_PARAMETERS => { id => '8B', }, TIME => { id => '8a', },
GEOGRAPHIC_LOCATION => { id => '8C', }, TIME_PARAMETERS => { id => '8b', },
COMPOSITE => { id => '8D', }, GEOGRAPHIC_LOCATION => { id => '8c', },
MULTI_CMD => { id => '8F', }, COMPOSITE => { id => '8d', },
TIME => { id => '8A', }, MULTI_CHANNEL_ASSOCIATION=> { id => '8e', }, # aka MULTI_INSTANCE_ASSOCIATION
MULTI_CHANNEL_ASSOCIATION=> { id => '8E', }, # aka MULTI_INSTANCE_ASSOCIATION MULTI_CMD => { id => '8f', }, # Handled in Parse
ENERGY_PRODUCTION => { id => '90', }, ENERGY_PRODUCTION => { id => '90', },
MANUFACTURER_PROPRIETARY => { id => '91', }, MANUFACTURER_PROPRIETARY => { id => '91', },
SCREEN_MD => { id => '92', }, SCREEN_MD => { id => '92', },
@ -163,13 +167,14 @@ my %zwave_class = (
AV_CONTENT_SEARCH_MD => { id => '97', }, AV_CONTENT_SEARCH_MD => { id => '97', },
SECURITY => { id => '98', }, SECURITY => { id => '98', },
AV_TAGGING_MD => { id => '99', }, AV_TAGGING_MD => { id => '99', },
IP_CONFIGURATION => { id => '9A', }, IP_CONFIGURATION => { id => '9a', },
ASSOCIATION_COMMAND_CONFIGURATION => { id => '9B', }, ASSOCIATION_COMMAND_CONFIGURATION
SENSOR_ALARM => { id => '9C', }, => { id => '9b', },
SENSOR_CONFIGURATION => { id => '9E', }, SENSOR_ALARM => { id => '9c', },
SILENCE_ALARM => { id => '9d', }, SILENCE_ALARM => { id => '9d', },
MARK => { id => 'EF', }, SENSOR_CONFIGURATION => { id => '9e', },
NON_INTEROPERABLE => { id => 'F0', }, MARK => { id => 'ef', },
NON_INTEROPERABLE => { id => 'f0', },
); );
my %zwave_cmdArgs = ( my %zwave_cmdArgs = (
dim => "slider,0,1,100", dim => "slider,0,1,100",
@ -190,7 +195,7 @@ ZWave_Initialize($)
"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); "model:".join(",", sort @zwave_models);
map { $zwave_id2class{uc($zwave_class{$_}{id})} = $_ } keys %zwave_class; map { $zwave_id2class{lc($zwave_class{$_}{id})} = $_ } keys %zwave_class;
} }
@ -380,6 +385,7 @@ ZWave_ParseMeter($)
return "$txt:$v3 $unit"; return "$txt:$v3 $unit";
} }
sub sub
ZWave_SetClasses($$$$) ZWave_SetClasses($$$$)
{ {
@ -394,8 +400,8 @@ ZWave_SetClasses($$$$)
my @classes; my @classes;
for my $classId (grep /../, split(/(..)/, lc($classes))) { for my $classId (grep /../, split(/(..)/, lc($classes))) {
push @classes, $zwave_id2class{uc($classId)} ? push @classes, $zwave_id2class{lc($classId)} ?
$zwave_id2class{uc($classId)} : "UNKNOWN_".uc($classId); $zwave_id2class{lc($classId)} : "UNKNOWN_".lc($classId);
} }
my $name = $def->{NAME}; my $name = $def->{NAME};
$attr{$name}{classes} = join(" ", @classes) if(@classes); $attr{$name}{classes} = join(" ", @classes) if(@classes);
@ -419,8 +425,8 @@ ZWave_mcCapability($$)
my @classes; my @classes;
for my $classId (@l) { for my $classId (@l) {
push @classes, $zwave_id2class{uc($classId)} ? push @classes, $zwave_id2class{lc($classId)} ?
$zwave_id2class{uc($classId)} : "UNKNOWN_".uc($classId); $zwave_id2class{lc($classId)} : "UNKNOWN_".uc($classId);
} }
return "mcCapability_$chid:no classes" if(!@classes); return "mcCapability_$chid:no classes" if(!@classes);
@ -497,9 +503,6 @@ ZWave_Parse($$@)
$id = "$id$1"; $id = "$id$1";
$arg = sprintf("%02x$3", length($3)/2); $arg = sprintf("%02x$3", length($3)/2);
} }
return if($arg !~ m/^..(..)/);
my $class = $1;
my $hash = $modules{ZWave}{defptr}{"$homeId $id"}; my $hash = $modules{ZWave}{defptr}{"$homeId $id"};
if(!$hash) { if(!$hash) {
$id = hex($id); $id = hex($id);
@ -507,16 +510,34 @@ ZWave_Parse($$@)
return ""; return "";
} }
my @event;
my @args = ($arg); # MULTI_CMD handling
my $className = $zwave_id2class{uc($class)} ? while(@args) {
$zwave_id2class{uc($class)} : "UNKNOWN_".uc($class); $arg = shift(@args);
my $ptr = $zwave_class{$className}{parse} if($zwave_class{$className}{parse});
if(!$ptr) { return if($arg !~ m/^..(..)/);
Log3 $ioName, 4, "$hash->{NAME}: Unknown message ($className $arg)"; my $class = $1;
return "";
my $className = $zwave_id2class{lc($class)} ?
$zwave_id2class{lc($class)} : "UNKNOWN_".uc($class);
if($className eq "MULTI_CMD") {
my ($ncmd, $off) = (0, 4);
while(length($arg) > $off*2) {
my $l = hex(substr($arg, $off*2, 2))+1;
push @args, substr($arg, $off*2, $l*2);
$off += $l;
}
next;
}
my $ptr = $zwave_class{$className}{parse}
if($zwave_class{$className}{parse});
if(!$ptr) {
Log3 $hash, 4, "$hash->{NAME}: Unknown message ($className $arg)";
next;
} }
my @event;
foreach my $k (keys %{$ptr}) { foreach my $k (keys %{$ptr}) {
if($arg =~ m/$k/) { if($arg =~ m/$k/) {
my $val = $ptr->{$k}; my $val = $ptr->{$k};
@ -524,6 +545,7 @@ ZWave_Parse($$@)
push @event, $val; push @event, $val;
} }
} }
}
return "" if(!@event); return "" if(!@event);
return join(" ", @event) if($local); return join(" ", @event) if($local);