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;
}
};
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.
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;
}
};
?>
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.
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.
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
da hast du natürlich recht und andyt sollte deinen Ratschlag sofort beherzigen
Ich selbst war bislang zu bequem die vorhandenen Scripte zu ändern, bin mir aber der Problematik sehr bewusst 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.
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.