Baumstruktur schalten

Wisst ihr wie man am besten folgendes realisieren kann?

würde gerne wie in der IPS-Light ganze Räume schalten.
Wenn ich ein Licht im Wohnzimmer einschalten, dann sollen die Überobjekte auch ein sein.

Wenn ich auf Alle einschalte, dann sollen alle Unterobjekte eingeschalten werden.

Hab schon hier mal was gebastelt. Allerdings komme ich da nicht mehr weiter.
Habt ihr schon mal was gemacht?
Ich will für die paar Lichter ungern den riesen IPS Library Baum nutzen. Obwohl es echt gut funktioniert.
Einfach mal ein wenig entschlanken.

Schau dir mal aus dem SymconMisc Repo das Szenensteuerungsmodul an.

SymconMisc/SzenenSteuerung at master · paresy/SymconMisc · GitHub

paresy

Sonst Rekursion nutzen…

Rekursive Programmierung – Wikipedia

Bin mittlerweile ganz schön weiter gekommen. Es funktioniert jetzt nach unten und nach oben.

ACHTUNG: Im Script muss aktuell noch die obere ID der Baumstruktur bei den Funktionen eingetragen werden!!!

Was jetzt noch fehlt sind die einzelnen Geräte einzubinden.

Für jeden Bool Schalter muss das Skript verknüpft werden.

Der Code für die Funktionen

<?
// -----------------------------------------------------------------------------
// Die Hauptfunktion, die die unteren Funktionen aufruft
// -----------------------------------------------------------------------------
function Schalten ($StartID, $ValueNew){
$ObereID = 16107 /[AAA TEst Library\Gruppenschaltung\Alle]/;
NachUntenAktualisieren ($StartID, $ValueNew);
NachObenAktualisieren ($StartID, $ObereID);
}

// Aktualisiert die Werte in der Baumstruktur nach unten
// -----------------------------------------------------------------------------
function NachUntenAktualisieren ($IDStart, $ValueNew){
// Schaltet alle nach Unten
foreach (IPS_GetChildrenIDs($IDStart) as &$Unterobjekte) {

  // Setzt den neuen Wert an alle unterlegenen Values
  setvalue ( $Unterobjekte, $ValueNew);
  // Ruft die Funktion in sich wieder auf bis es nichts mehr gibt
  NachUntenAktualisieren ($Unterobjekte, $ValueNew);

}
}

// Aktualisiert die Werte in der Baumstruktur nach oben
// -----------------------------------------------------------------------------
function NachObenAktualisieren ($StartID, $ObereID){
// Eltern IDs abfragen
$Eltern = IPS_GetParent ($StartID);
$Nachbarn = IPS_GetChildrenIDs ($Eltern);
$AnzahlAn = 0;

// Wenn der Oberste Ebene geschalten wird, dann sofort beenden
if ($StartID == $ObereID){goto EndeFunktion;}else{}

// Für jede Nachbar Variable abfragen ob diese true ist
foreach ($Nachbarn as &$value) {
if (getvalue ($value) == true){$AnzahlAn ++;}else{}
}

// Wenn Anzahl >0 ist dann die Übergeordnete Variable einschalten
setvalue ($Eltern, $AnzahlAn);

// Funktion wieder erneut aufrufen
NachObenAktualisieren ($Eltern, $ObereID);

EndeFunktion:
}

?>

Der Code für die Bool (SetValue)

<?
// Funktionen für Gruppenschaltung einbinden
include ‚32293.ips.php‘; // Funktionen

// Welche Gruppe geschalten werden soll
$ID = $_IPS[‚VARIABLE‘];
$Schaltwert = $_IPS[‚VALUE‘];

// Webfront aktualisieren
setvalue($ID, $Schaltwert);

// Schaltvorgang ausführen
Schalten ($ID, $Schaltwert);