Verteilung der Objekte zählen

Es kam heute die Frage auf wieviele Objekte sich unter einer Instanz oder Kategorie verbergen. Ich habe mal ein Script für die Web-Console gebaut das rekursiv alle Objekte durchgeht und für alle Ebenen die Werte ausgibt. Am Ende steht es als array zur Verfügung und kann nach belieben sortiert werden.

So sieht der Anfang vom Ergebnis bei mir aus:

0=Home Instanzen:426 Variablen:3775 Scripte:3408 Events:357 Media:35 Links:556
    16844=Neeo IO Instanzen:0 Variablen:25 Scripte:0 Events:0 Media:0 Links:0
    57532=Utils Instanzen:0 Variablen:1 Scripte:0 Events:0 Media:0 Links:0
    34433=FritzBox 7590 IO Instanzen:0 Variablen:1 Scripte:0 Events:0 Media:4 Links:0
    36306=WZ2 Hub Instanzen:0 Variablen:6 Scripte:0 Events:0 Media:0 Links:0
    34847=IPSInformations Instanzen:0 Variablen:29 Scripte:0 Events:0 Media:0 Links:0
    55279=Medien Instanzen:0 Variablen:0 Scripte:0 Events:0 Media:2 Links:0
    17557=WZ1 Hub Instanzen:0 Variablen:6 Scripte:0 Events:0 Media:0 Links:0
    47329=Netzwerk Instanzen:75 Variablen:859 Scripte:520 Events:0 Media:0 Links:158
        31598=RSS Instanzen:0 Variablen:6 Scripte:1 Events:0 Media:0 Links:0
            23312=RSS Reader Instanzen:0 Variablen:6 Scripte:0 Events:0 Media:0 Links:0
        28620=SNMP-Walk Instanzen:4 Variablen:182 Scripte:0 Events:0 Media:0 Links:0
            55701=SNMPWalk DS920+ 1.3.6.1. Instanzen:0 Variablen:182 Scripte:0 Events:0 Media:0 Links:0
        15490=Device Monitor Instanzen:32 Variablen:64 Scripte:0 Events:0 Media:0 Links:0
            30589=QNAP 2 Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            30473=FritzBox Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            29744=AVM 3000 SZ3 Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            29480=SZ1-Hub Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            24015=SZ1-Mi-AndroidTV Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            39229=WZ1-Duo2 Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            15155=WZ2-Ultimo-4K Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            23973=WZ2-NVidia-Shield-Pro Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            14385=RB Quad1 Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0
            23847=IP-Cam Flur Instanzen:0 Variablen:2 Scripte:0 Events:0 Media:0 Links:0

Hier das Script:

<?php
// Lege Integervariable für Tiefe an falls noch nicht vorhanden
$TiefeID = @IPS_GetObjectIDByIdent("Tiefe", $_IPS['SELF']);
if ($TiefeID == false){
    $TiefeID = IPS_CreateVariable(1);
    IPS_SetName($TiefeID, "Tiefe"); // Variable benennen
    IPS_SetParent($TiefeID, $_IPS['SELF']); 
    IPS_SetIdent($TiefeID, "Tiefe"); 
}

$GesamtCategories = 0;
$GesamtInstances = 0;
$GesamtVariables = 0;
$GesamtScripts = 0;
$GesamtEvents = 0;
$GesamtMedia = 0;
$GesamtLinks = 0;
$List = array();
$Counts = GetChildren(0, $TiefeID);
$Count = count($List);
for ($loop = $Count - 1; $loop >= 0; $loop--){
    for ($intent = 0 ; $intent < $List[$loop]['Depth']; $intent++) echo ' ';
    echo $List[$loop]['ObjectID'] . '=' . IPS_GetName($List[$loop]['ObjectID']) . ' Instanzen:' . $List[$loop]['Instances'] . ' Variablen:' . $List[$loop]['Variables'] . ' Scripte:' . $List[$loop]['Scripts'] . ' Events:' . $List[$loop]['Events'] . ' Media:' . $List[$loop]['Media'] . ' Links:' . $List[$loop]['Links'] . PHP_EOL;
}
return;

function GetChildren(int $ObjectID, int $TiefeID){

    global $List;
    $Tiefe = GetValue($TiefeID) + 4;
    SetValue($TiefeID, $Tiefe);
    $Categories = 0;
    $Instances = 0;
    $Variables = 0;
    $Scripts = 0;
    $Events = 0;
    $Media = 0;
    $Links = 0;
    $ChildrenIDs = IPS_GetChildrenIDs($ObjectID);
    foreach ($ChildrenIDs as $ChildrenID){
        $Object = IPS_GetObject($ChildrenID);
        switch ($Object['ObjectType']){
            case 0:
                $Categories++;
                break;
            case 1:
                $Instances++;
                break;
            case 2:
                $Variables++;
                break;
            case 3:
                $Scripts++;
                break;
            case 4:
                $Events++;
                break;
            case 5:
                $Media++;
                break;
            case 6:
                $Links++;
                break;
        }
        if (IPS_HasChildren($ChildrenID)){
            $Counts = GetChildren($ChildrenID, $TiefeID);
            $Categories += $Counts['Categories'];
            $Instances += $Counts['Instances'];
            $Variables += $Counts['Variables'];
            $Scripts += $Counts['Scripts'];
            $Events += $Counts['Events'];
            $Media += $Counts['Media'];
            $Links += $Counts['Links'];
        }
    }
    SetValue($TiefeID, $Tiefe - 4);
    $List[] = [
        'ObjectID'  => $ObjectID,
        'Depth'     => $Tiefe - 4,
        'Categories'=> $Categories,
        'Instances' => $Instances,
        'Variables' => $Variables,
        'Scripts'   => $Scripts,
        'Events'    => $Events,
        'Media'     => $Media,
        'Links'     => $Links
    ];
    return [
        'Categories'=> $Categories,
        'Instances' => $Instances,
        'Variables' => $Variables,
        'Scripts'   => $Scripts,
        'Events'    => $Events,
        'Media'     => $Media,
        'Links'     => $Links
    ];
}
?>
1 „Gefällt mir“