Gemeinsamer WebHook

Ich habe ein Modul erstellt welches einen WebHook nutzt

	public function ApplyChanges() {
		//Never delete this line!
		parent::ApplyChanges();

		$this->RegisterHook("/hook/waffi");
	}

Wenn ich jetzt ein weiteres Modul erstelle nutzt dieses den selben WebHook (soll es auch)
Lösche ich dieses Modul jetzt bekomme ich diese Abfrage
Screenshot_1535.jpg
Wie stelle ich das jetzt an dass der WebHook erst gelöscht wird wenn das letzte Modul der selben Art gelöscht wird ?

Ich kann den WebHook wenn ich das Konfigurationsformular neu speichere wieder anlegen (siehe Code oben) aber das ist nicht gerade User freundlich.

Mehrere Instanzen können nicht den gleichen Hook nutzen. Da hast du einen konzeptionellen Fehler in deinem Modul.
Michael

Der Webhook muss auf eine IO-Instanz gehen und die Daten dann an die Geräteinstanzen weiter reichen

Nicht falsch, aber auch nicht richtig.
Ein Webhook kann Daten nur an eine Instanz übergeben.
Ob dies eine IO, Splitter oder Geräte-Instanz ist, ist egal.
Auch immer daran denken, es kann u.u. auch mehrere IO oder Splitter vom gleichen Typ geben!
Siehe mehrere Kodi-Splitter für mehrere Systeme. Somit braucht jede Instanz seinen eigenen Webhook.
Michael

OKich habe das jetzt mal umgeschrieben und eine ID mitgegeben, bekomme aber weiterhin die Meldung. Die Hooks der nicht gelöschten Instanzen bleiben aber wie gewünscht erhalten

Register Hook

	private function RegisterHook($WebHook) {
		$ids = IPS_GetInstanceListByModuleID("{015A6EB8-D6E5-4B93-B496-0D3F77AE9FE1}");
		if(sizeof($ids) > 0) {
			$hooks = json_decode(IPS_GetProperty($ids[0], "Hooks"), true);
			$found = false;
			foreach($hooks as $index => $hook) {
				if($hook['Hook'] == $WebHook) {
					if($hook['TargetID'] == $this->InstanceID)
						return;
					$hooks[$index]['TargetID'] = $this->InstanceID;
					$found = true;
				}
			}
			if(!$found) {
				$hooks[] = Array("Hook" => $WebHook, "TargetID" => $this->InstanceID);
			}
			IPS_SetProperty($ids[0], "Hooks", json_encode($hooks));
			IPS_ApplyChanges($ids[0]);
		}
	}

Aufruf mit

	public function ApplyChanges() {
		//Never delete this line!
		parent::ApplyChanges();

		if(IPS_GetKernelRunlevel() == KR_READY) {
			$this->RegisterHook("/hook/waffi_" . $this->InstanceID);
		}
	}

UnRegister Hook (von Dir abgeguckt Nall Chan)

    protected function UnregisterHook($WebHook) {
        $ids = IPS_GetInstanceListByModuleID("{015A6EB8-D6E5-4B93-B496-0D3F77AE9FE1}");
        if (sizeof($ids) > 0) {
            $hooks = json_decode(IPS_GetProperty($ids[0], "Hooks"), true);
            $found = false;
            foreach ($hooks as $index => $hook) {
                if ($hook['Hook'] == $WebHook) {
                    $found = $index;
                    break;
                }
            }
            if ($found !== false) {
                array_splice($hooks, $index, 1);
                IPS_SetProperty($ids[0], "Hooks", json_encode($hooks));
                IPS_ApplyChanges($ids[0]);
            }
        }
    }

Hier im Destroy

    public function Destroy() {
        if (!IPS_InstanceExists($this->InstanceID)) {
            $this->UnregisterHook("/hook/waffi_" . $this->InstanceID);
        }
        parent::Destroy();
    }

Die Meldung wirst du auch nie wegbekommen.
Die Console fragt den Server ob es eine Referenz auf deine Instanz-ID gibt.
Als Antwort kommt das die Webhook-Instanz deine ID referenziert.
Beeinflussen kannst du das nicht, da die Webhook-Instanz ihre eigenen Referenz an den Kernel meldet.
Eine Funktion im SDK welche vor dem löschen der Instanz ausgeführt wird, gibt es nicht.
Destroy wird aufgerufen, wenn deine Instanz schon gelöscht wurde. (Ja, und wenn man den Dienst beendet)
Deswegen auch extra die Abfrage im Code:


if (!IPS_InstanceExists($this->InstanceID) // Instanz wurde eben gelöscht und existiert nicht mehr

Michael

Danke für die Erklärung, dann habe ich den Bereich jetzt „abgeschlossen“ :slight_smile: