Daten persistent speichern

Nicht ganz, glaube ich :slight_smile:

Die Liste für den Splitter kann ich mir immer direkt aus den Instanzen generieren, da ich ja auch nur diese übergeben muss, da hast du recht, die anderen kann ich ja eh noch nicht ansteuern bzw. die Daten auswerten.

Allerdings in der Liste für’n Konfigurator müssten halt auch die angezeigt werden, die noch keine Instanzen haben. Das wäre ja dann blöd, da man beim Öffnen vom Konfigurator/Aktualisieren der Liste einige Sekunden warten muss.

Und? Wann musst du Mal an den Konfigurator?
Sonst öffnen und auf suchen klicken, schließen und neu öffnen.
Letztes nur so lange bis die Listen wirklich dynamisch in IPS sind :wink:
So wie z.b. bei OneWire oder Homematic.
Michael

Okay, ich fange erstmal an, das wird sowieso Arbeit ohne Ende :slight_smile: Ich hab noch nichtmal die Kommunikation/WaitForResponse richtig am laufen. Alles Neuland für mich, danke!

Aber nochmal um das klar zu stellen: Wenn ich z.B. den Gerätecode aus einer Instanz abfrage oder irgend ne Variable wissen will, darf ich die nicht direkt auslesen, sondern muss das alles über den Datenaustausch lösen? Gibts dazu irgendwo schon einfache Beispiele?

Gruß Basti

Nein gibt es so nicht.
Du wirst aber nicht drum herum kommen direkt deine Childs zu ermitteln und direkt den Gerätecode auszulesen.
Der Datenaustausch zu den Childs hat keinen Rückkanal.
Wobei ich nicht wüsste warum du eine Variable auslesen willst. Ist mit noch kein Anwendungsfall untergeommen und würde ich persönlich auch vermeiden wollen.
Michael

Alles klar, dann arbeite ich mich mal langsam durch, danke!

Den Gerätecode dann in nem Property speichern?

Ja, und den auch den Code im Splitter beim SendDataToChildren mit übergeben.
So das deine Devices aus der Property einen ReceiveFilter setzen um auch nur ihre Daten zu erhalten und keine Fremden.
Michael

Ich hab hierzu nochmal eine Frage: Wenn der Datenaustausch zu den Childs keinen Rückkanal hat, kann ich die Gerätecodes doch nur mit IPS_GetProperty bekommen, oder liege ich da falsch?

Danke!

Basti

Genau so, aber das braucht nur der Konfigurator damit er einen Abgleich zwischen vorhandenen Geräten und vorhandenen Instanzen machen kann. Und das auch nur wenn die Konfig geöffnet wird (GetKonfigurationForm)
Der Splitter braucht diese Info ja nicht, er sendet einfach weiter.
Michael

Doch der Splitter brauch die auch leider für den Initprozess. Ich wollte die Liste dann in einem Buffer im Splitter halten. Hole ich mir die für den Konfigurator dann aus dem Splitter oder auch über GetProperty?

Basti

Sorry, habe das mit einem anderen Thread verwechselt und Mal nachgelesen.
Ja wie in Post 15 & 16 geschrieben.
Ja mit IPS_GetProperty.
Habe aber noch mal überlegt ob ein Buffer sinnvoll ist um die Liste zu cachen.
Weil du ja Einträge entfernen (IM_DELETE) und hinzufügen (IM_CREATE) und ändern (IM_CHANGESETTINGS) beachten musst, ist es vielleicht einfacher immer die ganze Liste neu zu generieren.
Diese Liste von Instanzen musst du ja auch bei der Registrierung der Nachrichten in IPS übergeben.
Wobei IM_CREATE eher blöd ist, da es ja noch keine zu registrierende ObjektID gibt.
Also stattdessen eher FM_CONNECT und FM_DISCONNECT auf den Splitter registrieren um zu erfahren ob eine Geräte-Instanz verbunden / getrennt wurde. Und IM_CHANGESETTINGS mit der jeweiligen Geräte-Instanz registrieren um eine Änderung der Property zu erfahren.

Michael

Hallo Michael,

wenn das Property nicht geändert werden kann, dann brauche ich IM_CHANGESETTINGS aber nicht oder? Der DuoFern Code der Geräte kann nicht verändert werden nur der vom Gateway. Hm wo ist jetzt der Unterschied von FM_CONNECT und DM_CONNECT? Gibt es da ne Doku oder nen Beispiel von? Finde da nicht so richtig was. Habe jetzt DM_CONNECT/DM_DISCONNECT angemeldet um zu schauen, ob der Parent sich ändert.

Danke!

Gruß Basti

Offiziell in der Doku ist es FM und nicht DM.
Gemeint ist das gleiche.
Nachrichten — IP-Symcon :: Automatisierungssoftware
Beispiele was in den Data ankommt von MessageSink gibt es nicht.
Aber den Property muss der User ändern können, oder soll er etwa beim Austausch eines Gerätes eine neue Instanz anlegen und alle seine Scripte überarbeiten, Links neu erstellen und Ereignisse anpassen?

Michael

Ah okay :slight_smile: Ich habe bei deinen Modulen auch eine Liste gefunden, die ist aber nicht mit Doku identisch. Sollte ich vielleicht mal eine aktuelle Liste aus der Dokus erstellen, oder ist die Doku unvollständig?

Gruß Basti

Meine Liste ist aus dem Delphi SDK von IPS 3.4 :wink:
Bis auf einige Bezeichnung sind die Werte aber identisch.
Michael

Guter Einwand…

Du würdest die Geräteliste also garnicht buffern, sondern jedes mal bei FM_CONNECT/FM_DISCONNECT mit IPS_GetChildrenIDs($this->InstanceID) alle Kinder ermitteln und dann mit IPS_GetProperty ( $childId, „deviceCode“ ); die Gerätecodes auslesen und das Array dann an Init($deviceCodeList) übergeben?

Weißt du wie FM_CONNECT/FM_DISCONNECT genau funktioniert? Muss ich das noch auf den Kindern anmelden, oder reicht die eigene InstanzID? Beim Parent habe ich es nicht angemeldet und bekomme trotzdem die Nachrichten.


$this->RegisterMessage ( $this->InstanceID, FM_CONNECT );
$this->RegisterMessage ( $this->InstanceID, FM_DISCONNECT );

Gruß Basti

P.S.: Ich hab mal die Liste aus der Doku mit deiner verglichen und aktualisiert:


/**
 * IP-Symcon message
 * https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/nachrichten/
 */
if (@constant ( 'IPS_BASE' ) == null) {
	define ( 'IPS_BASE', 10000 ); // Wertebasis für Kernel
	define ( 'IPS_MODULBASE', 20000 ); // Wertebasis für Module
	                                   
	// Kernel Manager
	define ( 'IPS_KERNELMESSAGE', IPS_BASE + 100 );
	define ( 'KR_CREATE', IPS_KERNELMESSAGE + 1 ); // Kernel wurde erstellt
	define ( 'KR_INIT', IPS_KERNELMESSAGE + 2 ); // Kernel Komponenten werden initialisiert, Module geladen und Settings eingelesen
	define ( 'KR_READY', IPS_KERNELMESSAGE + 3 ); // Kernel ist bereit und läuft
	define ( 'KR_UNINIT', IPS_KERNELMESSAGE + 4 ); // "Shutdown"-Befehl erhalten, finalisiere alles geladene
	define ( 'KR_SHUTDOWN', IPS_KERNELMESSAGE + 5 ); // Finalisierung abgeschlossen, entferne Kernel
	                                                 
	// Meldungen Manager
	define ( 'IPS_LOGMESSAGE', IPS_BASE + 200 );
	define ( 'KL_MESSAGE', IPS_LOGMESSAGE + 1 ); // Normale Nachricht
	define ( 'KL_SUCCESS', IPS_LOGMESSAGE + 2 ); // Erfolg
	define ( 'KL_NOTIFY', IPS_LOGMESSAGE + 3 ); // Änderungsbenachrichtung
	define ( 'KL_WARNING', IPS_LOGMESSAGE + 4 ); // Warnung
	define ( 'KL_ERROR', IPS_LOGMESSAGE + 5 ); // Fehlermeldung
	define ( 'KL_DEBUG', IPS_LOGMESSAGE + 6 ); // Debug Information
	define ( 'KL_CUSTOM', IPS_LOGMESSAGE + 7 ); // Sonstige Nachrichten
	                                            
	// Modul Manager
	define ( 'IPS_MODULEMESSAGE', IPS_BASE + 300 );
	define ( 'ML_LOAD', IPS_MODULEMESSAGE + 1 ); // Modul geladen
	define ( 'ML_UNLOAD', IPS_MODULEMESSAGE + 2 ); // Modul entladen
	                                               
	// Objekt Manager
	define ( 'IPS_OBJECTMESSAGE', IPS_BASE + 400 );
	define ( 'OM_REGISTER', IPS_OBJECTMESSAGE + 1 ); // Objekt erstellt
	define ( 'OM_UNREGISTER', IPS_OBJECTMESSAGE + 2 ); // Objekt entfernt
	define ( 'OM_CHANGEPARENT', IPS_OBJECTMESSAGE + 3 ); // Übergeordnetes Objekt hat sich geändert
	define ( 'OM_CHANGENAME', IPS_OBJECTMESSAGE + 4 ); // Name hat sich geändert
	define ( 'OM_CHANGEINFO', IPS_OBJECTMESSAGE + 5 ); // Info hat sich geändert
	define ( 'OM_CHANGETYPE', IPS_OBJECTMESSAGE + 6 ); // Typ hat sich geändert
	define ( 'OM_CHANGESUMMARY', IPS_OBJECTMESSAGE + 7 ); // Kurzinfo hat sich geändert
	define ( 'OM_CHANGEPOSITION', IPS_OBJECTMESSAGE + 8 ); // Position hat sich geändert
	define ( 'OM_CHANGEREADONLY', IPS_OBJECTMESSAGE + 9 ); // "Nur-Lesen"-Status hat sich geändert
	define ( 'OM_CHANGEHIDDEN', IPS_OBJECTMESSAGE + 10 ); // Sichtbarkeit hat sich geändert
	define ( 'OM_CHANGEICON', IPS_OBJECTMESSAGE + 11 ); // Icon hat sich geändert
	define ( 'OM_CHILDADDED', IPS_OBJECTMESSAGE + 12 ); // Untergeordnetes Objekt hinzugefügt
	define ( 'OM_CHILDREMOVED', IPS_OBJECTMESSAGE + 13 ); // Untergeordnetes Objekt entfernt
	define ( 'OM_CHANGEIDENT', IPS_OBJECTMESSAGE + 14 ); // Ident hat sich geändert
	define ( 'OM_CHANGEDISABLED', IPS_OBJECTMESSAGE + 15 ); // Ident hat sich geändert
	                                                        
	// Instanz Manager
	define ( 'IPS_INSTANCEMESSAGE', IPS_BASE + 500 );
	define ( 'IM_CREATE', IPS_INSTANCEMESSAGE + 1 ); // Instanz erstellt
	define ( 'IM_DELETE', IPS_INSTANCEMESSAGE + 2 ); // Instanz entfernt
	define ( 'IM_CONNECT', IPS_INSTANCEMESSAGE + 3 ); // Instanzinterface verfügbar
	define ( 'IM_DISCONNECT', IPS_INSTANCEMESSAGE + 4 ); // Instanzinterface nicht mehr verfügbar
	define ( 'IM_CHANGESTATUS', IPS_INSTANCEMESSAGE + 5 ); // Status hat sich geändert
	define ( 'IM_CHANGESETTINGS', IPS_INSTANCEMESSAGE + 6 ); // Einstellungen haben sich geändert
	                                                         
	// Such Manager
	define ( 'IPS_SEARCHMESSAGE', IPS_BASE + 510 );
	define ( 'IM_SEARCHSTART', IPS_SEARCHMESSAGE + 1 ); // Suche wurde gestartet
	define ( 'IM_SEARCHSTOP', IPS_SEARCHMESSAGE + 1 ); // Suche wurde gestoppt
	define ( 'IM_SEARCHUPDATE', IPS_SEARCHMESSAGE + 1 ); // Suche hat neue Ergebnisse
	                                                     
	// Variablen Manager
	define ( 'IPS_VARIABLEMESSAGE', IPS_BASE + 600 );
	define ( 'VM_CREATE', IPS_VARIABLEMESSAGE + 1 ); // Variable wurde erstellt
	define ( 'VM_DELETE', IPS_VARIABLEMESSAGE + 2 ); // Variable wurde entfernt
	define ( 'VM_UPDATE', IPS_VARIABLEMESSAGE + 3 ); // Variable wurde aktualisiert
	define ( 'VM_CHANGEPROFILENAME', IPS_VARIABLEMESSAGE + 4 ); // Variablenprofilname wurde geändert
	define ( 'VM_CHANGEPROFILEACTION', IPS_VARIABLEMESSAGE + 5 ); // Variablenprofilaktion wurde geändert
	                                                              
	// Script Manager
	define ( 'IPS_SCRIPTMESSAGE', IPS_BASE + 700 );
	define ( 'SM_CREATE', IPS_SCRIPTMESSAGE + 1 ); // Skript wurde erstellt
	define ( 'SM_DELETE', IPS_SCRIPTMESSAGE + 2 ); // Skript wurde entfernt
	define ( 'SM_CHANGEFILE', IPS_SCRIPTMESSAGE + 3 ); // Skript wurde Datei angehangen
	define ( 'SM_BROKEN', IPS_SCRIPTMESSAGE + 4 ); // Skript Fehlerstatus hat sich geändert
	                                               
	// Event Manager
	define ( 'IPS_EVENTMESSAGE', IPS_BASE + 800 ); // Event Scripter Message
	define ( 'EM_CREATE', IPS_EVENTMESSAGE + 1 ); // Ereignis wurde erstellt
	define ( 'EM_DELETE', IPS_EVENTMESSAGE + 2 ); // Ereignis wurde entfernt
	define ( 'EM_UPDATE', IPS_EVENTMESSAGE + 3 ); // Ereignis wurde aktualisiert
	define ( 'EM_CHANGEACTIVE', IPS_EVENTMESSAGE + 4 ); // Ereignisaktivierung hat sich geändert
	define ( 'EM_CHANGELIMIT', IPS_EVENTMESSAGE + 5 ); // Ereignisaufruflimit hat sich geändert
	define ( 'EM_CHANGESCRIPT', IPS_EVENTMESSAGE + 6 ); // Ereignisskriptinhalt hat sich geändert
	define ( 'EM_CHANGETRIGGER', IPS_EVENTMESSAGE + 7 ); // Ereignisauslöser hat sich geändert
	define ( 'EM_CHANGETRIGGERVALUE', IPS_EVENTMESSAGE + 8 ); // Ereignisgrenzwert hat sich geändert
	define ( 'EM_CHANGETRIGGEREXECUTION', IPS_EVENTMESSAGE + 9 ); // Ereignisgrenzwertauslösung hat sich geändert
	define ( 'EM_CHANGECYCLIC', IPS_EVENTMESSAGE + 10 ); // Zyklisches Ereignis hat sich geändert
	define ( 'EM_CHANGECYCLICDATEFROM', IPS_EVENTMESSAGE + 11 ); // Startdatum hat sich geändert
	define ( 'EM_CHANGECYCLICDATETO', IPS_EVENTMESSAGE + 12 ); // Enddatum hat sich geändert
	define ( 'EM_CHANGECYCLICTIMEFROM', IPS_EVENTMESSAGE + 13 ); // Startzeit hat sich geändert
	define ( 'EM_CHANGECYCLICTIMETO', IPS_EVENTMESSAGE + 14 ); // Endzeit hat sich geändert
	define ( 'EM_ADDSCHEDULEACTION', IPS_EVENTMESSAGE + 15 ); // Eintrag in der Aktionstabelle des Wochenplans wurde hinzugefügt
	define ( 'EM_REMOVESCHEDULEACTION', IPS_EVENTMESSAGE + 16 ); // Eintrag in der Aktionstabelle des Wochenplans wurde entfernt
	define ( 'EM_CHANGESCHEDULEACTION', IPS_EVENTMESSAGE + 17 ); // Eintrag in der Aktionstabelle des Wochenplans hat sich geändert
	define ( 'EM_ADDSCHEDULEGROUP', IPS_EVENTMESSAGE + 18 ); // Gruppierung der Wochenplantage wurde hinzugefügt
	define ( 'EM_REMOVESCHEDULEGROUP', IPS_EVENTMESSAGE + 19 ); // Gruppierung der Wochenplantage wurde entfernt
	define ( 'EM_CHANGESCHEDULEGROUP', IPS_EVENTMESSAGE + 20 ); // Gruppierung der Wochenplantage hat sich geändert
	define ( 'EM_ADDSCHEDULEGROUPPOINT', IPS_EVENTMESSAGE + 21 ); // Schaltpunkt einer Gruppierung wurde hinzugefügt
	define ( 'EM_REMOVESCHEDULEGROUPPOINT', IPS_EVENTMESSAGE + 22 ); // Schaltpunkt einer Gruppierung wurde entfernt
	define ( 'EM_CHANGESCHEDULEGROUPPOINT', IPS_EVENTMESSAGE + 23 ); // Schaltpunkt einer Gruppierung hat sich geändert
	                                                                 
	// Medien Manager
	define ( 'IPS_MEDIAMESSAGE', IPS_BASE + 900 );
	define ( 'MM_CREATE', IPS_MEDIAMESSAGE + 1 ); // Medienobjekt wurde erstellt
	define ( 'MM_DELETE', IPS_MEDIAMESSAGE + 2 ); // Medienobjekt wurde entfernt
	define ( 'MM_CHANGEFILE', IPS_MEDIAMESSAGE + 3 ); // Datei des Medienobjekts wurde geändert
	define ( 'MM_AVAILABLE', IPS_MEDIAMESSAGE + 4 ); // Verfügbarkeit des Medienobjekts hat sich geändert
	define ( 'MM_UPDATE', IPS_MEDIAMESSAGE + 5 ); // Medienobjekt wurde aktualisiert
	define ( 'MM_CHANGECACHED', IPS_MEDIAMESSAGE + 6 ); // Cacheoption vom Medienobjekt hat sich geändert
	                                                    
	// Link Manager
	define ( 'IPS_LINKMESSAGE', IPS_BASE + 1000 );
	define ( 'LM_CREATE', IPS_LINKMESSAGE + 1 ); // Link wurde erstellt
	define ( 'LM_DELETE', IPS_LINKMESSAGE + 2 ); // Link wurde entfernt
	define ( 'LM_CHANGETARGET', IPS_LINKMESSAGE + 3 ); // Ziel des Links hat sich geändert
	                                                   
	// Flow Manager
	define ( 'IPS_DATAMESSAGE', IPS_BASE + 1100 );
	define ( 'FM_CONNECT', IPS_DATAMESSAGE + 1 ); // Instanz wurde verbunden
	define ( 'FM_DISCONNECT', IPS_DATAMESSAGE + 2 ); // Instanz wurde getrennt
	                                                 
	// Script Engine
	define ( 'IPS_ENGINEMESSAGE', IPS_BASE + 1200 );
	define ( 'SE_UPDATE', IPS_ENGINEMESSAGE + 1 ); // Scriptengine wurde neu geladen
	define ( 'SE_EXECUTE', IPS_ENGINEMESSAGE + 2 ); // Script wurde ausgeführt
	define ( 'SE_RUNNING', IPS_ENGINEMESSAGE + 3 ); // Script wird ausgeführt
	                                                
	// Profile Pool
	define ( 'IPS_PROFILEMESSAGE', IPS_BASE + 1300 );
	define ( 'PM_CREATE', IPS_PROFILEMESSAGE + 1 ); // Profil wurde erstellt
	define ( 'PM_DELETE', IPS_PROFILEMESSAGE + 2 ); // Profil wurde entfernt
	define ( 'PM_CHANGETEXT', IPS_PROFILEMESSAGE + 3 ); // Profilprefix/Profilsuffix hat sich geändert
	define ( 'PM_CHANGEVALUES', IPS_PROFILEMESSAGE + 4 ); // Profilwerte haben sich geändert
	define ( 'PM_CHANGEDIGITS', IPS_PROFILEMESSAGE + 5 ); // Profilnachkommastellen haben sich geändert
	define ( 'PM_CHANGEICON', IPS_PROFILEMESSAGE + 6 ); // Profilicon hat sich geändert
	define ( 'PM_ASSOCIATIONADDED', IPS_PROFILEMESSAGE + 7 ); // Profilassoziation wurde hinzugefügt
	define ( 'PM_ASSOCIATIONREMOVED', IPS_PROFILEMESSAGE + 8 ); // Profilassoziation wurde entfernt
	define ( 'PM_ASSOCIATIONCHANGED', IPS_PROFILEMESSAGE + 9 ); // Profilassoziation hat sich geändert
	                                                            
	// Timer Pool
	define ( 'IPS_TIMERMESSAGE', IPS_BASE + 1400 );
	define ( 'TM_REGISTER', IPS_TIMERMESSAGE + 1 ); // Timer wurde erstellt
	define ( 'TM_UNREGISTER', IPS_TIMERMESSAGE + 2 ); // Timer wurde entfernt
	define ( 'TM_SETINTERVAL', IPS_TIMERMESSAGE + 3 ); // Timer Interval hat sich geändert
	define ( 'TM_UPDATE', IPS_TIMERMESSAGE + 4 ); // Timer Fortschritt hat sich geändert
	define ( 'TM_RUNNING', IPS_TIMERMESSAGE + 5 ); // Timer Nachricht
}

/**
 * IP-Symcon status
 * https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/konfigurationsformulare/statusmeldung/
 */
if (@constant ( 'IS_SBASE' ) == null) {
	// Status
	define ( 'IS_SBASE', 100 );
	define ( 'IS_CREATING', IS_SBASE + 1 ); // Instanz wird erstellt
	define ( 'IS_ACTIVE', IS_SBASE + 2 ); // Instanz ist aktiv
	define ( 'IS_DELETING', IS_SBASE + 3 ); // Instanz wird gelöscht
	define ( 'IS_INACTIVE', IS_SBASE + 4 ); // Instanz ist inaktiv
	                                        
	// Error
	define ( 'IS_EBASE', 200 ); // Instanz ist fehlerhaft
}

Wenn der Benutzer den Gerätecode vom Device ändern kann, müsste ich aber IM_CHANGESETTINGS auf allen Kindern welche einen Gerätecode haben anmelden/abmelden, um eine Änderung mitzubekommen, richtig? Ich hoffe, ich bekomme dann in $Data mit, welche Property geändert wurde.


	/**
	 * Updates children data, buffers child instance ids and register/unregister msgs
	 *
	 * @return int parent instance id
	 */
	private function UpdateChildrenData() {
		$oldChildrenIds = $this->ChildrenInstanceIDs;
		$childrenIds = @IPS_GetChildrenIDs ( $this->InstanceID );
		
		// no children changes
		if ($childrenIds == $oldChildrenIds) {
			return $childrenIds;
		}
		
		// unregister messagesat old children
		foreach ( array_diff ( $oldChildrenIds, $childrenIds ) as $oldChildId ) {
			// child has no duo fern code property
			if (@IPS_GetProperty ( $oldChildId, "duoFernCode" ) === false) {
				continue;
			}
			
			// unregister messages
			if ($oldChildId > 0) {
				$this->UnregisterMessage ( $oldChildId, IM_CHANGESETTINGS );
			}
		}
		
		// register messages at new children
		foreach ( array_diff ( $childrenIds, $oldChildrenIds ) as $childId ) {
			// child has no duo fern code property
			if (@IPS_GetProperty ( $childId, "duoFernCode" ) === false) {
				continue;
			}
			
			// register messages
			if ($childId > 0) {
				$this->RegisterMessage ( $childId, IM_CHANGESETTINGS );
			}
		}
		
		$this->ChildrenInstanceIDs = $childrenIds;
		
		return $childrenIds;
	}


	/**
	 * Handles registered messages
	 * Will be called when receiving a registered msg
	 *
	 * @param int $TimeStamp        	
	 * @param int $SenderID        	
	 * @param string $Message        	
	 * @param array $Data        	
	 */
	public function MessageSink($TimeStamp, $SenderID, $Message, $Data) {
		switch ($Message) {
			case IPS_KERNELMESSAGE :
				if ($Data [0] == KR_READY)
					$this->ApplyChanges ();
				break;
			case FM_CONNECT :
			case FM_DISCONNECT :
				$this->ForceRefresh ();
				$this->UpdateChildrenData();
				break;
			case IM_CHANGESTATUS :
				if (($SenderID == @IPS_GetInstance ( $this->InstanceID ) ['ConnectionID']) and ($Data [0] == IS_ACTIVE)) {
					$this->ForceRefresh ();
				}
				break;
		}
	}

Macht das so Sinn, oder bin ich da auf dem Holzweg?

Danke!

Gruß Basti

Nicht IPS_GetChildrenIDs
Das ist für den logischen Baum.
Du musst IPS_GetInstanceListByModuleID — IP-Symcon :: Automatisierungssoftware nutzen und dann auf jeden Fall noch filtern auf die ConnectionID mit IPS_GetInstance — IP-Symcon :: Automatisierungssoftware
Connect Disconnect musst du auf deinen Splitter zu registrieren.
Michael

So sollte es gehen, nutze ich für Listen eines Konfigurators :slight_smile:


        $InstanceIDList = IPS_GetInstanceListByModuleID("{DEINE GUID HIER EINTRAGEN}");
        $List = array();
        $MyParent = IPS_GetInstance($this->InstanceID)['ConnectionID'];
        foreach ($InstanceIDList as $InstanceID)
        {
            // Fremde Geräte überspringen
            if (IPS_GetInstance($InstanceID)['ConnectionID'] != $MyParent)
                continue;

            $Device = array(
                'instanceID' => $InstanceID,
                'DeviceID' => (string) IPS_GetProperty($InstanceID, 'duoFernCode')
            );
            $List[] = $Device;
        }


MessageSink mußt du wohl noch etwas ändern, was genau mußt du mal testen.


    public function MessageSink($TimeStamp, $SenderID, $Message, $Data) { 
        switch ($Message) { 
            case IPS_KERNELMESSAGE : 
                if ($Data [0] == KR_READY) 
                    $this->ApplyChanges (); 
                break; 
            case FM_CONNECT : 
            case FM_DISCONNECT : 
                $this->ForceRefresh (); 
//                $this->UpdateChildrenData();   Würde ich in ApplyChanges verlagern, welches ja über ForceRefresh ausgeführt wird.
// Zumal hier ja auch der Parent der Sender sein kann, wenn dein Splitter vom Parent getrennt / verbunden wird.
// Somit macht es schon sinn die Liste neu zu holen und an den Parent neu zu übertragen.
                break; 
            case IM_CHANGESTATUS : 
                if (($SenderID == @IPS_GetInstance ( $this->InstanceID ) ['ConnectionID']) and ($Data [0] == IS_ACTIVE)) { 
                    $this->ForceRefresh (); 
                } 
                break; 
            case IM_CHANGESETTINGS: 
// Hier dann die Childes verarbeiten. !
// Vermutlich am einfachsten wieder über ForceRefresh  / Applychanges ?
// Vorsicht dass du ja nicht die Childes umkonfigurierst aus dem Splitter, sonst Endlosschleife !
                break; 

        } 
    }  

Michael

Hallo Michael,

danke, aber deine Methode schließt den Konfigurator nicht aus. Reicht es nicht einfach zu testen ob es das Property duoFernCode gibt? So kann ich Konfigurator und ParentIO recht einfach ausschließen. Oder muss ich zwingend auf ConnectionID prüfen?

Gruß Basti

Ja, musst du.
Was wenn jemand (OK unwahrscheinlich aber möglich) zwei Sticks mit zwei Splittern in Betrieb hat ?
Immerhin kann man ja mit USB over LAN auch mehrere Liegenschaften in seinem IPS haben.
Ich prüfe gar nicht ob der Property existiert, da ich über die GUID ja nur meine Child-Geräte mit diesem Property habe (Parent und Konfigurator haben eh andere GUIDs).
Was wolltest du den machen?
Alle Instanzen in IPS durchgehen?
Das wäre etwas übertrieben, zumal es ja auch viel mehr Rechenleistung benötigt.

Das mit den Code war nicht auf (d)einen Konfigurator bezogen, sondern das ich diese Anforderung von dir schon Mal selbst umgesetzt habe. Und in meinem Fall war es ein Konfigurator.
Michael