[Homematic Homebrew Wired] Device XML

Begonnen von Hoschiq, 17 Dezember 2015, 11:30:34

Vorheriges Thema - Nächstes Thema

Hoschiq

Hallo,

kennt jemand einen Weg wie man in der XML des Gerätes definieren kann für welche Firmware Version die XML zuständig ist..

Es gibt ja den Teil:

<type name="RS485 switch actuator 8-channel (DIN rails)" id="HMW-SW8-DR" priority="2">
<parameter index="0" size="1" const_value="131"></parameter>
<parameter index="1" size="1" const_value="0"></parameter>
<parameter index="2" size="2" cond_op="GE" const_value="0x0002"></parameter>
</type>


in der XML.

Hier kannn man beim Parameter 2 ja auch Bedingungen hinterlegen. Funktionieren da auch Ranges?
Also z.B. muss größer 0x002 und kleiner 0x006 sein.

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. Wie zum Beispiel beim Universalsensor von Dirk, der ja unterschiedliche Sensoren bestückt haben kann. Die nicht bestückten sollten dann auch nicht im FHEM angelegt werden..

Damit würde man nicht zu viele Geräte ID verbrauchen, da nicht für jede Funktion eine neue ID vergeben werden muss.
Bei HBW könnte man dann flexibler sein, es kann aber auch unübersichtlich werden.

Ralf9

#1
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
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7