Hallo Paresy und Michael,
was das Thema angeht bin ich ja noch sehr unsicher. Daher noch mal mein Gedankengang:
- Wird ein Child gelöscht soll der Parent (=Splitter) darüber benachrichtigt werden
- dazu habe ich in allen Childs etwas ähnliches wie dieses hier eingefügt:
// Überschreibt die interne IPS_Destroy($id) Funktion
public function Destroy() {
// Diese Zeile nicht löschen.
parent::Destroy();
IPS_LogMessage("IPS2GPIO GPIO Destroy: ","Genutzte Pin löschen");
$this->SendDataToParent(json_encode(Array("DataID"=> "{A0DAAF26-4A2D-4350-963E-CC02E74BD414}", "Function" => "gpio_destroy", "Pin" => $this->ReadPropertyInteger("Pin_I"))));
$this->SendDataToParent(json_encode(Array("DataID"=> "{A0DAAF26-4A2D-4350-963E-CC02E74BD414}", "Function" => "gpio_destroy", "Pin" => $this->ReadPropertyInteger("Pin_O"))));
}
Die IPS_LogMessages aus diesem Code sehe ich noch im Log
- im Parent (=Splitter) soll dieses angesprochen werden:
// GPIO Kommunikation
case "gpio_destroy":
// Löschen einer GPIO-Belegung
// aus der Liste der genutzten GPIO
$PinUsed = unserialize(GetValueString($this->GetIDForIdent("PinUsed")));
IPS_LogMessage("IPS2GPIO GPIO Destroy: ",$data->Pin);
if (in_array($data->Pin, $PinUsed)) {
IPS_LogMessage("IPS2GPIO GPIO Destroy: ","Pin in PinUsed");
array_splice($PinUsed, $data->Pin, 1);
}
SetValueString($this->GetIDForIdent("PinUsed"), serialize($PinUsed));
// aus der Liste der Notify-GPIO
$PinNotify = unserialize(GetValueString($this->GetIDForIdent("PinNotify")));
if (in_array($data->Pin, $PinNotify)) {
IPS_LogMessage("IPS2GPIO GPIO Destroy: ","Pin in PinNotify");
array_splice($PinNotify, $data->Pin, 1);
SetValueString($this->GetIDForIdent("PinNotify"), serialize($PinNotify));
If (GetValueInteger($this->GetIDForIdent("Handle")) >= 0) {
// Notify neu setzen
$this->CommandClientSocket(pack("LLLL", 19, GetValueInteger($this->GetIDForIdent("Handle")), $this->CalcBitmask(), 0), 16);
}
}
break;
Im Log erscheint aber keine - der dort extra zur Kontrolle eingefügten - IPS_LogMessages, stattdessen kommt eine Fehlermeldung das Instanz xxxxx nicht existiert. (wahrscheinlich die gelöschte Instanz).
Der Code selbst spielt jetzt m.E. keine Rolle, sondern das zumindest der Verdacht entsteht, dass der Sprung zum Parent gar nicht mehr durchgeführt wird.
Daher noch mal die Frage: Ist das parent::Destroy(); im Child an der richtigen Stelle? Oder sollte es ans Ende der Destroy-Funktion?
Joachim