Zitat von: Hoschiq am 17 Dezember 2015, 11:30:34
Wenn jetzt mehrere XML existieren wie bei einigen HMW Geräten, wie bestimmt der Homatic Teil in FHEM welche XML ausgewählt wird? Werden alle verglichen und dann der passende gewählt oder gewinnt der erste passende? Die Definitionen müssen natürlich eindeutig sein.
Ziel ist es zur gleichen Geräte ID mehre Gerätedateien und damit unterschiedliche Funktionsumfänge bereitzustellen.
Die Idee finde ich gut.
Ich habe es bei mir mal getestet, mit einer kleinen Änderung an der Device.pm funktioniert es.
Ich habe dazu bei meinem hbw_io_sw Modul die "txSenderAddress" und die Firmware Version geändert
#define MODULE_FIRMWARE_VERSION 0x0040
Ich habe ein weiteres devicefile "hbw_io_sw_V0_40.pm" angelegt und am Anfang folgendes rein geschrieben:
package HM485::Devicefile;
our %definition = (
'HBW_IO_SW_V0_40' => {
'version' => 11,
'eep_size' => 1024,
'supported_types' => {
"HBW_IO_SW" => {
"name" => "RS485 I/O module input and switch actuator",
"parameter" => {
"0" => {
"const_value" => 151,
"size" => 1
},
"1" => {
"const_value" => 0,
"size" => 1
},
"2" => {
"cond_op" => "GE",
"const_value" => 0x0040,
"size" => 2
}
},
"priority" => 2
}
},
In der Device.pm steht dann im hash %models dann u.a. folgendes:
$VAR9 = 'HBW_IO_SW';
$VAR10 = {
'name' => 'RS485 I/O module input and switch actuator',
'model' => 'HBW_IO_SW',
'type' => 151,
'versionDeviceKey' => {
'0009' => 'HBW_IO_SW_V0_09',
'0064' => 'HBW_IO_SW_V0_40',
'0256' => 'HBW_IO_SW'
}
};
In der Device.pm habe ich in der "sub getDeviceKeyFromHash" bei foreach ein sort eingefügt und das DeviceKey im devHash gecached
sub getDeviceKeyFromHash($) {
my ($hash) = @_;
if(defined($hash->{devHash})) {
$hash = $hash->{devHash};
}
if (defined($hash->{'DeviceKey'})) {
#HM485::Util::Log3($hash, 3, 'Device:getDeviceKeyFromHash: DeviceKey = ' . $hash->{'DeviceKey'});
return $hash->{'DeviceKey'};
}
my $retVal = '';
if ($hash->{'MODEL'}) {
my $model = $hash->{'MODEL'};
my $fw = $hash->{'FW_VERSION'} ? $hash->{'FW_VERSION'} : 0;
my $fw1 = $fw ? int($fw) : 0;
my $fw2 = ($fw * 100) - int($fw) * 100;
my $fwVersion = hex(
sprintf ('%02X%02X', ($fw1 ? $fw1 : 0), ($fw2 ? $fw2 : 0))
);
foreach my $version (sort keys (%{$models{$model}{'versionDeviceKey'}})) {
if ($version <= $fwVersion) {
$retVal = $models{$model}{'versionDeviceKey'}{$version};
$hash->{'DeviceKey'} = $retVal;
} else {
last;
}
}
HM485::Util::Log3($hash, 4, "Device:getDeviceKeyFromHash: fwVersion = $fwVersion ret = $retVal");
}
return $retVal;
}
Mir ist aber nicht klar wie dies seither ohne sort bei devices mit 2 Versionen funktionieren konnte.
Damit das sortieren auch klappt, habe ich in der "sub initModels()" was eingefügt:
my $minFW = $deviceDefinitions{$deviceKey}{'supported_types'}{$modelKey}{'parameter'}{'2'}{'const_value'};
$minFW = $minFW ? $minFW : 0;
$minFW = '000' . $minFW; # eingefügt
$minFW = substr($minFW, -4); # eingefügt
$models{$modelKey}{'versionDeviceKey'}{$minFW} = $deviceKey;
Gruß Ralf