Grundsätzliche Fragen zur Modulerstellung

…dann vielleicht die Dokumentationergänzen.:wink:
Bei den anderen neuen Befehlen steht es ja meist dabei…

Irgendwie beschleicht mich das Gefühl, Ihr wollt mich mit saften Nachdruck zur 4.1. „treiben“…:smiley:

Joachim

Ja das mit der Doku fiel mir eben auch auf… Leider geht das Feedback senden noch immer nicht in der Mobilen Ansicht der Website… Buhu…
Michael

Hallo Michael,

die Gedanken kreisen…

Diese Möglichkeit der Filterung, ist es dabei egal, ob es sich dabei um den Key oder den Value des Array handelt?

Hintergrund: Alle Sendungen die für I²C-Instanzen wichtig sind, beinhalten die Device-Adresse (=Value), man könnte - wenn ich die Funktion also richtig deute - diesen in der Instanz als Filter setzen…
Bei den GPIO-Instanzen wird manchmal ein Pin verwendet (=Value), manchmal aber auch mehrere. Da könnte man ggf. so vorgehen, dass man in den Instanzen, in denen nur ein Pin relevant ist, die Pin-Nummer (=Value) als Filter dient, in den Instanzen in denen mehr als ein Pin relevant ist, der „Pin“ (=Key) als Filter.

Habe ich das so richtig verstanden?

Joachim

Der Filter gilt für den JSON-String, somit ist alles möglich.

Es hängt somit auch auf den Aufbau deines Datenpaketes für den Datenaustausch ab, wie du Filtern kannst/musst.

Hier mal ein Beispiel, wo jedes Paket mit Pin =11 und Pin = 18 durchkommt, der Rest aber nicht.
pin12.png
Pin18.png
Michael

…das klingt ja toll!:slight_smile:

Sicherlich kann man den Filterstring dann auch aus

.*"Pin":11.*|.*"Pin":18.*

so etwas machen ?

.*"Pin":".$Variable1.".*|.*"Pin":".$Variable2." .*

Joachim

Ja, das geht.
Bei dem HomematicExtended baue ich den aus den Einstellungen der gewählten Datenpunkte zusammen und übergebe ihn im Appylchanges an IPS.
Vorher hatten gerade RPi User Probleme mit der Leistung, weil mein Modul bei jedem Event immer alle Daten bekommen hat. Jetzt ist das ganz entspannt :smiley:
Michael

…bei mir dauert es manchmal sehr lange, um beim Splitter nach „Übernehmen“ wieder Aktion in der Konsole auszuführen. Die Verwendung von Filtern - und der damit einhergehenden deutlichen Reduzierung von Datentelegrammen könnte dieses Problem nachhaltig lösen.

Auch andere Zustände könnten damit verbessert werden - daher werde ich wohl dann heute Abend mal den Sprung zur 4.1 machen…:wink:

Joachim

…so mal „gebastelt“:

$this->SetReceiveDataFilter(".*'DeviceAddress':".$this->ReadPropertyInteger("DeviceAddress").".*|.*'Function':status.*|.*'Function':get_used_i2c.*");

…sollte jetzt die den Filter passieren wenn:

  1. die DeviceAdresse der Einstellung in der Instanz entspricht
  2. die Funktion „status“ ist
  3. die Funktion „get_used_i2c“ ist

…bei den ganzen Sonderzeichen kann man sich ja schnell mal vertun…(mir ist nicht klar, ob ich davon auch etwas weglassen könnte).

Joachim

JSON nutzt " anstatt ’ .
So wird das dann nix :slight_smile:
Um das zu kontrollieren, Bau den String zusammen und gebe ich mit SendDebug aus.
Dann kannst du gleich erkennen ob Fehler im Filter sind.
Michael

…ich habe es jetzt zum Test mal so adaptiert:

$Test = 118;
$Filter = '.*"DeviceAddress":'.$Test.'.*|.*"Function":status.*|.*"Function":get_used_i2c.*';  
Echo $Filter;

Ergebnis:

.*"DeviceAddress":118.*|.*"Function":status.*|.*"Function":get_used_i2c.*

Wäre der Syntax dann so richtig?

Joachim

Ich bin da auch nicht der Spezi.
Sieht aber gut aus.
Kannst das ja auf der Website testen.
Den JSON kannst du vom Splitter ja auch ausgeben lassen und dann beides mal in Website kopieren.
Ist der JSON komplett blau hinterlegt, passt es.
Michael

…habe jetzt ein Upgrade auf die 4.1 gemacht - kann aber mein Modul nicht mehr laden bzw. aktualisieren, bekomme eine Zeitlimitüberschreitung (12002)!:confused:

Joachim

Nachtrag: Kann ich das Timeout irgendwie höher setzen?

Nachtrag 2: Es ist wohl so, das aktualisiert wird, kommt aber am Ende die besagte Fehlermeldung…

Hallo Michael,

magst Du bitte mal Beispiele für funktionierende ReceiveDataFilter posten?
Das haut irgendwie noch nicht hin…
Als Text sieht mein Filter so aus:

.*"DeviceAddress":118.*|.*"Function":status.*|.*"Function":get_used_i2c.*

Ich bin halt unsicher ob der vielen Sonderzeichen…

Joachim

Bei status und get_used_i2c fehlen jeweils die " .
Um dir wirklich zu helfen, wäre der JSON-String vom Datenaustausch nötig.
Michael

…hier mal die drei Kategorien:

  1. status:
$this->SendDataToChildren(json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"status", "Pin"=>$data->Pin, "Status"=>200, "HardwareRev"=>GetValueInteger($this->GetIDForIdent("HardwareRev")))));
  1. get_used_i2C:
$this->SendDataToChildren(json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"get_used_i2c")));
  1. Daten die die Device Adresse mitsenden:
$this->SendDataToChildren(json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"set_i2c_data", "DeviceAddress" => $this->GetI2C_HandleDevice($response[2]), "Value" => $response[4])));

Die drei unterschiedlichen Telegramme müssten durchgelassen werden…

Joachim

Das bringt aber so nix, weil ich nicht sehe welche Datentypen (String, Integer) da vorkommen.

Damit das Debuggen leichter fällt:

$Data = json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"status", "Pin"=>$data->Pin, "Status"=>200, "HardwareRev"=>GetValueInteger($this->GetIDForIdent("HardwareRev"))));        
$this->SendDebug('IPS_SendDataToChildren', $Data, 0);
$this->SendDataToChildren($Data);

$Data = json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"get_used_i2c"));
$this->SendDebug('IPS_SendDataToChildren', $Data, 0);
$this->SendDataToChildren($Data);

$Data = json_encode(Array("DataID" => "{8D44CA24-3B35-4918-9CBD-85A28C0C8917}", "Function"=>"set_i2c_data", "DeviceAddress" => $this->GetI2C_HandleDevice($response[2]), "Value" => $response[4]));
$this->SendDebug('IPS_SendDataToChildren', $Data, 0);
$this->SendDataToChildren($Data);     

Dann sieht du im Debug vom Splitter was du wirklich versendest.
Und im Child auch unmittelbar vor dem SetReceiveDataFilter ebenfalls ein SendDebug.

Mit den beiden Strings in den Debugs kann man dann auf der Website gegenprüfen.

Michael

.„DeviceAddress“:118.|.„Function“:status.|.„Function“:get_used_i2c.

Beim ersten möglichen Telegramm ist es ein Integer (Device Adresse ist zwischen 0 und 128)
Die anderen beiden müsste das Key/Value-Paar sein, das so als Text drinstehen müsste…

Joachim

„Function“:status kann nicht richtig sein, ist kein gültiges JSON.
Wenn dann „Function“:„status“
Bau das mit dem SendDebug bitte mal ein, dann findest du den Fehler eventuell.
Michael

…das mit dem Anführungszeichen hatte ich schon korigiert - war ein Copy&Paste-Fehler im Posting::::smiley:

Ist SendDebug irgendwo dokumentiert? Die Suchfunktion findet da bei mir nur Threads…:eek:

Joachim

Irgendwo hatte Paresy es in einem Changelog geschrieben… öhm…gerade keine Lust zu suchen :smiley:
Ich schreib Pio mal was so fehlt :rolleyes:
Michael