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“

Falls es jemand braucht. Hier ein Skript das alle ID’s vom Objektbaum auflistet und in eine CSV schreibt.

<?php

// Lesbaren Objekttyp zurückgeben
function GetTypeName($type)
{
    switch ($type) {
        case 0: return 'Kategorie';
        case 1: return 'Instanz';
        case 2: return 'Variable';
        case 3: return 'Skript';
        case 4: return 'Ereignis';
        case 5: return 'Media';
        case 6: return 'Link';
        default: return 'Unbekannt';
    }
}

// Rekursive Funktion zum Aufbau der Baumstruktur
function ListObjectsTree($parentID = 0, $depth = 0)
{
    $result = [];

    $children = IPS_GetChildrenIDs($parentID);
    foreach ($children as $childID) {
        $object = IPS_GetObject($childID);
        $typeName = GetTypeName($object['ObjectType']);
        $name = IPS_GetName($childID);

        $indentation = str_repeat('  ', $depth); // Zwei Leerzeichen pro Ebene

        $result[] = [
            'ID'   => $childID,
            'Name' => $indentation . $name,
            'Typ'  => $typeName
        ];

        // Rekursiv weitermachen mit tieferer Ebene
        $result = array_merge($result, ListObjectsTree($childID, $depth + 1));
    }

    return $result;
}

// === Hauptausführung ===
$allObjects = ListObjectsTree(0);

// === Konsolenausgabe mit Einrückung ===
foreach ($allObjects as $obj) {
    echo "ID: {$obj['ID']} | Name: {$obj['Name']} | Typ: {$obj['Typ']}\n";
}

// === CSV-Datei erzeugen ===
$csvPath = IPS_GetKernelDir() . "object_tree.csv";

$csvFile = fopen($csvPath, 'w');
if ($csvFile !== false) {
    fputcsv($csvFile, ['ID', 'Name', 'Typ']); // Kopfzeile

    foreach ($allObjects as $obj) {
        fputcsv($csvFile, [$obj['ID'], $obj['Name'], $obj['Typ']]);
    }

    fclose($csvFile);
    echo "CSV mit Baumstruktur gespeichert unter: $csvPath\n";
} else {
    echo "Fehler beim Schreiben der CSV-Datei!\n";
}

Das Skript erweitert mit Spalten Trennung für ID etc. in Excel und die Ausgabe der Beschreibung hinzugefügt:

<?php

function GetTypeName($type)
{
    switch ($type) {
        case 0: return 'Kategorie';
        case 1: return 'Instanz';
        case 2: return 'Variable';
        case 3: return 'Skript';
        case 4: return 'Ereignis';
        case 5: return 'Media';
        case 6: return 'Link';
        default: return 'Unbekannt';
    }
}

function GetFullPath($objectID)
{
    $names = [];
    while ($objectID != 0) {
        $names[] = IPS_GetName($objectID);
        $objectID = IPS_GetObject($objectID)['ParentID'];
    }
    return implode('\\', array_reverse($names));
}

function ListObjectsTree($parentID = 0, $depth = 0)
{
    $result = [];
    $children = IPS_GetChildrenIDs($parentID);

    foreach ($children as $childID) {
        $object = IPS_GetObject($childID);
        $typeName = GetTypeName($object['ObjectType']);
        $name = IPS_GetName($childID);
        $indent = str_repeat('  ', $depth);
        $path = GetFullPath($childID);
        $info = $object['ObjectInfo'];

        $result[] = [
            'ID'          => $childID,
            'Name'        => $indent . $name,
            'Typ'         => $typeName,
            'Pfad'        => $path,
            'Beschreibung'=> $info
        ];

        $result = array_merge($result, ListObjectsTree($childID, $depth + 1));
    }

    return $result;
}

// === Hauptausführung ===
$allObjects = ListObjectsTree(0);

// === CSV-Datei erzeugen ===
$csvPath = IPS_GetKernelDir() . "object_tree_export.csv";
$csvFile = fopen($csvPath, 'w');

if ($csvFile !== false) {
    // Kopfzeile
    fputcsv($csvFile, ['ID', 'Name (baumartig)', 'Typ', 'Pfad', 'Beschreibung'], ';');

    // Zeilen schreiben
    foreach ($allObjects as $obj) {
        $line = [
            $obj['ID'],
            str_replace(["\r", "\n", ";"], [' ', ' ', ','], $obj['Name']),
            $obj['Typ'],
            str_replace(["\r", "\n", ";"], [' ', ' ', ','], $obj['Pfad']),
            str_replace(["\r", "\n", ";"], [' ', ' ', ','], $obj['Beschreibung'])
        ];
        fputcsv($csvFile, $line, ';');
    }

    fclose($csvFile);
    echo "✅ CSV gespeichert unter: $csvPath\n";
} else {
    echo "❌ Fehler beim Schreiben der CSV-Datei!\n";
}