Probleme mit GetConfigurationForParent und ClientSocket

Irgendwie kann ich das Problem nicht nachvollziehen… aber villeicht jemand aus dem Forum.


class MeinModul	extends IPSModule {
		
		
	public function GetConfigurationForParent(){
		// Version 1
		// hier kann ich Aktive/Open noch ändern und beim öffnene des ClientSockets wurde der Host und der Port übernommen
  
		return json_encode(['Host'=>parse_url($this->ReadPropertyString('Host'),PHP_URL_HOST),'Port'=>1012]); 

		// Version 2
		// hier kann ich Aktive/Open nicht mehr ändern. Soweit auch ok
		// wenn ich den lientSocket vom modul disconnecte  wird mir beim öffnene des ClientSockets  kein Host oder Port angezeigt

		return json_encode(['Host'=>parse_url($this->ReadPropertyString('Host'),PHP_URL_HOST),'Port'=>1012,'Open'=>true]);
		
		// in beiden fällen wird der Socket jedoch nicht geöffnet sondern als Fehlerhaft makiert 
		// und nur in Version 1. kann ich dann den Socket über die Konfiguration einmal ändern und Übernehmen klicken. 
		// Dann wird der Socket auch geöffnet

	}
	
	
	public function ApplyChanges(){
		parent::ApplyChanges();
		
		
		$conID=IPS_GetInstance($this->InstanceID)['ConnectionID'];
		if($this->ReadPropertyBoolean('CallmonEnabled')){
			if(!$conID){ // Kein Socket connected dann ...
				if($this->ConnectParent('{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}')){
					$conID=IPS_GetInstance($this->InstanceID)['ConnectionID'];
				}
			}
 			// nun dachte ich dieses Connect problem damit lösen zu können
			if($conID){
 				$status=IPS_GetInstance($conID)['InstanceStatus'];
 				if($status==104){
 					IPS_SetProperty($conID, 'Open', true);
 					IPS_ApplyChanges($conID); // <== Aber hier kommt der Fehler:  
					// 	Warning : Die angeforderte Adresse ist in diesem Kontext ungültig.
					// Dabei ist es egal ob ich version 1 oder 2 in der GetConfigurationForParent nutze.
 				}
 			}
		} 
		elseif($conID){
			IPS_DisconnectInstance($this->InstanceID);
			$status=IPS_GetInstance($conID)['InstanceStatus'];
			if($status==102){
				IPS_SetProperty($conID, 'Open', false);
				IPS_ApplyChanges($conID);  // <== hier klappt es einwandfrei mit dem Übernehmen
			}
	  		// IPS_DeleteInstance($conID);
		}
	}
}


Im MessageLog erscheint folgendes:
04.08.2019 13:16:00*| Event Control*| Wiederverbinden [Client Socket (FritzCallmon #21694)] fehlgeschlagen = Die angeforderte Adresse ist in diesem Kontext ungültig.

:banghead: Xaver :confused:

GetConfigurationForParent ist eine Funktion welche die Console aufruft und Felder vorbelegt.
Es ändert aktiv nichts an der Konfiguration.
Wenn du also in der Konsole nicht auf übernehmen klicken kannst, weil du alle Felder readonly vorgibst, dann wird da nie eine Konfig für den IO übernommen.
Lass doch einfach aktiv weg, damit der User auch ggfls. den IO und somit alles deaktivieren kann.
Michael
PS: Die WebConsole müsste allerdings melden das du die Konfig übernehmen sollst, weil eine untergeordnete Instanz eine Konfig vorgibt.

Aha … ja der Teufel steckt im detail :wink: und im Grunde hast du ja recht . Danke für die Info.
LG Xaver

Ich arbeite immer noch vorzugsweise mit der windows ips_console :wink:

PS:
mit der ergänzung:
IPS_SetProperty($conID, ‚Host‘, parse_url($this->ReadPropertyString(‚Host‘),PHP_URL_HOST));
IPS_SetProperty($conID, ‚Port‘, 1012);
IPS_SetProperty($conID, ‚Open‘, true);
IPS_ApplyChanges($conID);
läuft es auch :wink:

Von unserer Seite her ist GetConfigurationForParent die bevorzugte Variante. Wie Michael schon erörtert hat, wird dies auch durch die webbasierte Konsole entsprechend dargestellt.

Wenn dein Ansatz für dich funktioniert, dann kannst du ihn natürlich gerne weiter verwenden, das würde aber so nicht durch den Review-Prozess des Module Stores kommen.

PS: Auch wenn ein bisschen OT: Was hält dich momentan noch bei der Windows-Konsole? Vielleicht kannst du mir ja mal eine PM schreiben, was dir noch fehlt um dich zum Wechsel zu überzeugen.

ich würde die GetConfigurationForParent() auch bevorzugen unklar ist mir jedoch warum der Benutzer nochmals auf Übernehmen klicken soll, wenn die Daten von GetConfigurationForParent() komplett vorgegeben werden da der Benutzer in diesem Fall ja nichts mehr ändern darf.
Irgendwie widerspricht sich die Funktionsweise denn so wie es aussieht ist sie ja darauf ausgelegt vorgegebene Felder nicht nur zu füllen sondern auch für Benutzereingaben zu disablen, damit sollte sich ein Socket auch connecten, bzw. die Vorgaben , wenn nichts änderbar ist) auch automatisch speichern. Ist zumindest meine Meinung :slight_smile:
Xaver

Gegenfrage, warum gibst du überhaupt den Host vor?
Port kann ich nachvollziehen, aber Host kann der User doch dort einstellen.
Michael

Nun ich möchte es so einfach wie möglich machen, im Haupt Modul ist der Host bereits hinterlegt. Der Port ist immer gleich und warum sollte der User nun den Host nochmals eingeben ? Ich dachte eben gerade dafür ist diese Funktion vorgesehen.

Natürlich ist es kein Problem den Host oder generell die Daten einzugeben, mich nervt es jedoch wenn ich Daten doppelt und dreifach eingeben muss. Die EDV sollte uns das leben doch einfacher machen, das fängt mit Kleinigkeiten an :):smiley:

Xaver

Warum hast du überhaupt den Host in deinem Modul als Eigenschaften?
Wenn du ihn wirklich brauchst, dann lese ihn aus dem Parent aus.
Michael

In einem meiner Hauptmodule kommuniziere ich per SOAP mit der Fritzbox.

Dieses Modul überwacht den Callmonitor und öffnet bei bedarf ein parent ClientSocket zur Fritzbox für den Anrufmonitor.

Daher ist im Modul die Host Adresse hinterlegt. Es läuft auch alles einwandfrei …

mir ging es nur darum zu verstehen warum sich die GetConfigurationForParent so eigenartig verhält und den Socket nicht öffnet.
Bei Konfigurationen die komplexer sind ist diese vorgehen durchaus sinnvoll , bei 3 Parametern jedoch und gerade dann wenn der Benutzer nichts mehr ändern kann, sollte die Instance die Konfiguration doch korrekt übernehmen und speichern.

Auf der einen Seite speichert IPS die changes bevor es ApplyChanges() aufruft, löscht die Instance bevor Destroy() aufgerufen wird … und hier spart IPS am speichern.:confused:

LG
Xaver