Eingeschaltete Lampen ermitteln und zählen

Vielen Dank für diese Idee - muß man erstmal drauf kommen :grin:
Ich hatte an ein Array gedacht mit den verschiedenen Kategorien, wäre das nicht dynamischer?
Nur bei Umsetzung des Arrays für die verschieden Kategorien scheitert es bei mir…

So würde ich es auch machen.

Klar, kann man auch machen… dazu muss man aber die Schleife umständlicher umbauen als den „pragmatischen“ Weg zu gehen. Manchmal ist einfach einfach einfacher…

Hast du mir evtl. ein Beispiel wie dieser Code mit einer Schleife für mehrere Kategorien ausschaut?
Meine Versuche sind leider kläglich gescheitert…

Ganz quick&dirty ohne es zu testen nur schnell hier geschrieben wäre das wohl so… du musst in der Zeile nur die ids eintragen nach dem Muster:
$kategorien = array(123,2345,6754);

<?
$zaehlerstand = 0;
$kategorien = array(id-von-katg1, id-von-katg2, id-vonkatg3);
foreach ($kategorien as $kategorie) {

$Kinder     = IPS_GetChildrenIDs(IPS_GetParent($kategorie) ); ;
foreach ($Kinder as $kind) {
    $objekt = IPS_GetObject($kind);
    verarbeiteObject($objekt);

}
SetValueInteger(34499,$zaehlerstand);
function verarbeiteObject($ZObjekt)
{
    global $zaehlerstand;
    if ($ZObjekt["ObjectType"] == 6) // Wenn Link hole Original-Objekt
        { 
		  $newObjID = IPS_GetLink($ZObjekt["ObjectID"])["TargetID"];
		  $newobj = IPS_GetObject($newObjID);
        if ($newobj["ObjectType"] == 2) // Ziel war Variable
        {
            if (GetValueBoolean($newObjID)) {$zaehlerstand++;}
     	  }
        }
    
 }   
}
?>

Vielen Dank für das Beispiel!
Leider erhalte ich hierbei einen Fehlerhinweis was mich auch nicht weiterbringt:
Fatal error: Uncaught Error: Call to undefined function verarbeiteObject()

dann ist ein } ausversehen nach unten gerutscht und muss vor die function-Zeile

Das war es leider auch nicht…
fehlt in der Zeile

verarbeiteObject($objekt);

nicht function um die vorherige Zeile zu definieren?

die Funktion hat du innerhalb der foreach-Schleife definiert

<?php

$zaehlerstand = 0;

function verarbeiteObject($ZObjekt)
{
    global $zaehlerstand;
    if ($ZObjekt['ObjectType'] == 6) { // Wenn Link hole Original-Objekt
        $newObjID = IPS_GetLink($ZObjekt['ObjectID'])['TargetID'];
        $newobj = IPS_GetObject($newObjID);
        if ($newobj['ObjectType'] == 2) { // Ziel war Variable
            if (GetValueBoolean($newObjID)) {
                $zaehlerstand++;
            }
        }
    }
}

$kategorien = [id - von - katg1, id - von - katg2, id - vonkatg3];
foreach ($kategorien as $kategorie) {
    $Kinder = IPS_GetChildrenIDs(IPS_GetParent($kategorie));
    foreach ($Kinder as $kind) {
        $objekt = IPS_GetObject($kind);
        verarbeiteObject($objekt);
    }
}

SetValueInteger(34499, $zaehlerstand);

ich hätte es auch ohne global-Variable gemacht (aber das ist eine persönliche Angewohnheit)

<?php
  
function verarbeiteObject($ZObjekt)
{
    $zaehler = 0;
    if ($ZObjekt['ObjectType'] == 6) { // Wenn Link hole Original-Objekt
        $newObjID = IPS_GetLink($ZObjekt['ObjectID'])['TargetID'];
        $newobj = IPS_GetObject($newObjID);
        if ($newobj['ObjectType'] == 2) { // Ziel war Variable
            if (GetValueBoolean($newObjID)) {
                $zaehler++;
            }
        }
    }
    return $zaehler;
}

$zaehlerstand = 0;
$kategorien = [id - von - katg1, id - von - katg2, id - vonkatg3];
foreach ($kategorien as $kategorie) {
    $Kinder = IPS_GetChildrenIDs(IPS_GetParent($kategorie));
    foreach ($Kinder as $kind) {
        $objekt = IPS_GetObject($kind);
        $zaehlerstand += verarbeiteObject($objekt);
    }
}

SetValueInteger(34499, $zaehlerstand);

und das einleitenden/abschließende PHP-Tag ist inzwischen anders (ob nur deprecated oder nicht mehr unterstützt kann ich nicht sagen)

das Problem war das ein } nach unten gerutscht war und das ich ein Parent zu viel drin hatte, weil es vorher seine eigenen „Kinder“ zählen sollte. Auch war beim Script nur die „Verlinkten“ Variablen zu zählen. Wenn man also einfach alle Boolean-Variablen unter den oben angegebenen Kategorien zählen will wäre das jetzt so hier richtig:

<?
$zaehlerstand = 0;
$kategorien = array(32957, 25767, 55220);
foreach ($kategorien as $kategorie) {

$Kinder     = IPS_GetChildrenIDs($kategorie ); 
foreach ($Kinder as $kind) {
    verarbeiteObject($kind);

}
}
echo ($zaehlerstand);
function verarbeiteObject($ZObjekt)
{
    global $zaehlerstand;
        $newobj=IPS_GetObject($ZObjekt);
        if ($newobj["ObjectType"] == 2) // Ziel war Variable
        {
            if (GetValueBoolean($ZObjekt)) {$zaehlerstand++;}
     	  }
        
    
 }   

?>

Wenn doch mit Verlinkungen wie oben gearbeitet werden soll, muss die verarbeiteObjekt-Methode wieder angepasst werden. Einen Preis für strukturierten Code bekomme ich damit zwar nicht, ist aber nur schnell im Forum hingebastelt. In Zeile 2 deine Kategorien-IDs einsetzen

1 „Gefällt mir“

nein, die Funktion wird weiter unten deklariert, das ist der Aufruf der Funktion. Die kann auch später im Code deklariert sein.