Schalten verschiedener Systeme in einer Schleife

Hallo,

ich möchte in einem Skript alle in einem Array aufgelisteten Schalter (Variable Status), die von verschiedenen Herstellern/Systemen kommen, schalten.

Erst dache ich ich kann die Standardaktion der Varaible nutzen, aber ich denke das ist wohl aus einem Skript nicht vorgesehen.

Also dachte ich ich kann anhand der Art des Schalters (Homematic, FS20, ZWave) die ensprechende Schaltfunktion aufrufen. Leider habe ich keine Ahnung wie ich die entsprechende Zuordnung hinbekomme.

Hier mal die Entwürfe die ich so im Kopf hatte (Mix aus Code und Ideen)

$Parent_ID = 26343 /*[Gewerke und Reporte\Beleuchtung\LampenLinks]*/; 

$LinkIDs = IPS_GetChildrenIDs($Parent_ID);
foreach($LinkIDs as $Child_ID) 
   {
	$LinkInfo = IPS_GetLink($Child_ID);
    $Original_ID = $LinkInfo["TargetID"];
	// 1. Ansatz
	//"Standardaktion"($Original_ID, True);
	
	//2. Ansatz
	// Eruieren der Art des Schalters (evtl anhand des Gateways?)
	switch($interface)
	{
	case z-wave:
	//schalten z-wave
	break;
	case homematic:
	//schalten homematic
	break;
	}
   };

vielleicht hat ja jemand eine Idee.

viele Grüße
cervicor

Hi,

dein zweiter Ansatz sollte auf jeden Fall funktionieren.
Du solltest als erstes mit IPS_GetObject den Type des Objektes prüfen. Wenn es den Wert 1=Instanz hat, dann mit IPS_GetInstance die ModuleID mit der Case-Verzweigung auf die einzelnen Hardware-typischen Befehle die Schaltfunktion ausführen. Wenn es noch nicht die Instance ist, dann mit IPS_GetParent zum Objekt darüber springen und nochmals prüfen.

Grüße
Kevin

Hallo Kevin,

danke für den Tipp - das hat mir weitergeholfen.

Die Prüfung auf den Typ des Objektes kann ich mir sparen, da ich sicher bin, dass ich nur Statusvariablen in meiner Linksammlung habe. Das würde ja dann so aussehen:

    $Original_ID = IPS_GetLink($Child_ID)["TargetID"];
	$Object_Info = IPS_GetObject($Original_ID);
	
	switch ($Object_Info['ObjectType'])
	{
	 case 1: // Typ ist Instance
		$Instance_ID = $Original_ID;
		break;
	 case 2: // Type ist Variable
		$Instance_ID = $Object_Info['ParentID'];
		break;
	};

Das habe ich aber entfernt und nun sieht das bei mir so aus:

<?
$SwitchTo = true;	       // anknipsen
$Parent_ID = 26343;	// Kategorie mit allen Links zu den Statusvariablen (brauche ich noch anderweitig)

$LinkIDs = IPS_GetChildrenIDs($Parent_ID);             // alle Links in's Körbchen
foreach($LinkIDs as $Child_ID)                                       // alle im Körbchen abklappern
   {
    $Original_ID = IPS_GetLink($Child_ID)["TargetID"];                                                              // folge dem Link
	$Instance_ID = IPS_GetObject($Original_ID)['ParentID'];                                                   // ermittle die Instance
	$Module_Name = IPS_GetInstance($Instance_ID)['ModuleInfo']['ModuleName'];    // was bist'n du für Einer?
	
	switch($Module_Name)        // wähle den Richtigen
	{                                                    // und tue es
	 case 'HomeMatic Device':
		HM_WriteValueBoolean($Instance_ID, "STATE", $SwitchTo);
		break;
	 case 'Z-Wave Module':
		ZW_SwitchMode($Instance_ID, $SwitchTo);
		break;
	 case 'FS20':
		FS20_SwitchMode($Instance_ID, $SwitchTo);
		break;
	}
   };
   ?>

Danke und Gruß
cervicor

Hallo zusammen,

danke für das Script funktioniert soweit ganz gut.

Ich bin noch auf der Sucher nach einer zusätzlichen Unterscheidung bei den Devices zwischen Dimmer und Schalter.

Kann mir da wer einen Tip geben?

Besten Dank

Hallo Andyt,

ich mache es so, dass ich im Objektbaum des Gerätes abfrage, ob es über LEVEL oder STATE verfügt. Bei LEVEL ist es ein Dimmer, bei STATE ein Schalter. Bislang habe ich damit keine Probleme.

Gruß
Hans

hi,

Danke für die Info, aber ich steh heute echt auf der Leitung.
Wie fragst du den Objektbaum des Gerätes ab?

Danke dir

Moin,

ich habe zentrale Steuerungsprogramme für die verschiedenen Lampen und Dimmer sowie ein Schema nach dem die Kategorien und Lampen benannt sind. Auf diese Weise ist es mir sehr leicht möglich, die ID des Homematic Gerätes zu ermitteln. Danach benötigt man nur noch Befehle wie IPS_GetChildrenIDs und IPS_GetName um zu wissen, ob es sich um STATE oder LEVEL handelt.

Näheres dazu findest du hier https://www.symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/

Gruß
Hans

Der Name ist bei Statusvariablen immer eine schlechte Idee. Weil umbenennen ist ja erlaubt und auch sinnvoll.
Besser IPS_GetObject und den ObjectIdent nutzen.
Michael

Hallo Michael,

da hast du natürlich recht und andyt sollte deinen Ratschlag sofort beherzigen :slight_smile:

Ich selbst war bislang zu bequem die vorhandenen Scripte zu ändern, bin mir aber der Problematik sehr bewusst :wink: Hinzu kommt bei mir, dass alle Kategorien und Instanzen auf einer stringenten Namensvergabe basieren und ich von daher einiges zu tun hätte. Trotzdem vielen Dank für den Hinweis.

Gruß
Hans

Hallo Leute,

danke für die Tips. Ich hab’s jetzt mal so gelöst:


<?
$SwitchTo = false;           // ausschalten
$SwitchToLevel = 0;           // ausschalten Dimmer
$Parent_ID = 26714 /*[Haus\Licht]*/;    // Kategorie mit allen Links zu den Statusvariablen

$LinkIDs = IPS_GetChildrenIDs($Parent_ID);             // alle Links in's Körbchen

foreach($LinkIDs as $Child_ID)                                       // alle im Körbchen abklappern
   {
    $Original_ID = IPS_GetLink($Child_ID)["TargetID"];                                                              // folge dem Link
    $Instance_ID = IPS_GetObject($Original_ID)['ParentID'];                                                   // ermittle die Instance
    $Module_Name = IPS_GetInstance($Instance_ID)['ModuleInfo']['ModuleName'];    // was bist'n du für Einer?
    
	
	
	switch($Module_Name)        // wähle den Richtigen
    {                                                    // und tue es
     case 'HomeMatic Device':
						$ChildrenIDName = array();  																// array definieren
						foreach (IPS_GetChildrenIDs($Instance_ID) as $value) {						// alle ChildIDs auslesen
						$ChildrenIDName[] = IPS_GetName($value);										// deren Name in array schreiben
						}
						if (in_array("LEVEL", $ChildrenIDName)) {										// nachschauen ob "LEVEL" in array steht
							HM_WriteValueFloat($Instance_ID, "LEVEL", $SwitchToLevel);   
						}
						else{
							HM_WriteValueBoolean($Instance_ID, "STATE", $SwitchTo);
						}
		break;
     case 'Z-Wave Module':
        ZW_SwitchMode($Instance_ID, $SwitchTo);
        break;
     case 'FS20':
        FS20_SwitchMode($Instance_ID, $SwitchTo);
        break;
    }
   };
   ?>


geht mit Sicherheit noch eleganter, funktioniert aber.

lg
Andreas

Hey

schau mal nach, ich hab hier gerade mal mein System veröffentlicht.
Evtl kannst du es auch gebrauchen.

https://www.symcon.de/forum/threads/35498-Hersteller%C3%BCbergreifende-Gruppenschaltung?p=333834#post333834