ZWave_Cmd mit Rohdaten

Begonnen von SamsonBox, 16 Juni 2019, 09:57:27

Vorheriges Thema - Nächstes Thema

SamsonBox

Ich versuche gerade das ZWave-Geräte OTA Update zu implementieren und stoße da gerade auf einen Frage, die ich mir aus dem Source Code gerade nicht beantworten kann:

Gibt es ein Möglichkeit dem ZWave Device in irgendeiner Art und Weise Rohdaten zu senden?

Hintergrunde der Frage ist, dass ich um bestimmte Antworten zu parsen die Version der Firmware Klasse brauche. Daher habe ich in der zwave_class unter "get" eine Funktion hinterlegt, die erst prüft ob es das entsprechende reading gibt und falls nicht das entsprechende ZWave_Get ausführt. Mit dem zwave_parseHook komme ich dann wieder in die Funktion aber ich weiß nicht, wie ich dem ZWave device jetzt die Nachricht "01" ("7a01" mit der Klasse) schicken kann. Gleiches Problem werde ich beim schicken der einzelnen Firmware-Datenpackte bekommen. Aber ich bin mir sicher, dass da schon etwas implementiert ist.

Danke für die Antwort

rudolfkoenig

Im ZWave Modul schickt doch jedes Befehl Daten an einem Device. Inwieweit sind deine Daten "roher"?

Die in zwave_class hinterlegeten Funktionen liefern Inhalt, ZWave_cmd() verpackt diese so, dass sie beim Geraet landen (fueegt Adresse/Checksum/SendeFlags/etc hinzu), inkl. warten auf Bestaetigung, Resend, usw.

Falls du diese Mechanismen umgehen moechtest, dann bist bist du in ZWDongle besser aufgehoben.

SamsonBox

Ich glaube ich muss das Problem etwas genauer umreißen: Im Prinzip will ich das FIRMWARE_MD_GET-Kommando senden und die Antwort dann parsen und in ein reading verpacken. Wie Du in Deiner Antwort schreibst würde man das folgende implementieren:


%zwave_class = (
.....
FIRMWARE_UPDATE_MD       => { id => '7a',
    get   => { fwMdGet  => '01' },
    parse => { '..7a(..)(.*)' => 'ZWave_fwParse($1, $2)'} },
.....
)

Das funktioniert super. Das Kommando "7a01" wird geschickt und bei der Antwort wird die Funktion "ZWave_fwParse" aufgerufen. Nur muss diese Funktion nun wissen welche Version der FIRMWARE_UPDATE_MD-Klasse das Device hat um die Antwort richtig zu interpretieren. Daher dachte ich ich mache folgendendes:

%zwave_class = (
.....
FIRMWARE_UPDATE_MD       => { id => '7a',
    get   => { fwMdGet  => 'ZWave_fwMdGet($hash, "")' },
    parse => { '..7a(..)(.*)' => 'ZWave_fwParse($1, $2)'} },
.....
)
....
sub
ZWave_fwMdGet($$)
{

  my ($hash,$data) = @_;
  my $classVersion = ReadingsVal($hash->{NAME}, "versionClass_122", 0);
  if($classVersion == 0 && !$data) #called by get cmd -> check for Version
  {
    $zwave_parseHook{"$hash->{nodeIdHex}:..8614"} = \&ZWave_firmwareMetaDataGet;
    delete($hash->{CL});
    ZWave_Get($hash, $hash->{NAME}, "versionClass", 122);
    return(ZWave_WibMsg($hash).", check the vclasses attribute first", "EMPTY");
  }
  else
  {
    #Sende das Komando "7a01" an das ZWave device
  }
}

Die Funktion checkt also ob das Reading "versionClass_122" schon da ist. Wenn nicht dann holt sie das Reading und widvon den Antwort wieder aufgerufen. Ist das Reading schon das oder kommt dieAntwort von "ZWave_Get($hash, $hash->{NAME}, "versionClass", 122);", dann sende bitte das eigentliche Kommando "7a01". Mir fehlt allerdings der Weg, wie ich am besten dieses Kommando zu dem ZWave Device schicke ohne den ganzen Aufbau der Nachricht (Adresse/Checksum/SendeFlags/etc) nochmal zu implementieren. Oder bin ich mit der ganzen Methode auf dem Holzweg?

Danke und Grüße

krikan

Am Rande:
ZitatNur muss diese Funktion nun wissen welche Version der FIRMWARE_UPDATE_MD-Klasse das Device hat um die Antwort richtig zu interpretieren.
Die Version der Class sollte im Attribut vclasses des jeweiligen ZWave-Devices stehen.
Wenn es das Attribut nicht gibt, würde ich von einem falsch eingebundenen Device ausgehen und erst einmal "get <device> versionClassAll" anstoßen (lassen) bevor es weitergeht.

Gruß, Christian

rudolfkoenig

@SamsonBox: du koenntest fhem("get NAME versionClass 122") absetzen, und vorher
$zwave_parseHook{"$hash->{nodeIdHex}:..8614"} = \&myFn;setzen.

Ich halte aber aus mehreren Gruenden wenig von komplexen Automatisierungen fuer Ausnahmefaelle.
Wie Christian schreibt, ist im Normalfall die Version vorhanden, und man sollte eine Fehlermeldung ausgeben, falls sie nicht gesetzt ist.

krikan

Mit dem hash %zwave_classVersion kann man übrigens die Befehle auf bestimmte Class-Versionen eingrenzen: https://forum.fhem.de/index.php/topic,53389.msg456222.html#msg456222

SamsonBox

Hallo zusammen,

erst mal Sorry, irgendwie habe ich die letzten Antworten verpasst. Dahabe ich keine Mails mehr bekommen. Ich denkeaber, dass ich einen Weg gefunden habe, das funktioniert. Danke