Symcon Pflege - alle Variablen mit Name XYZ finden

Hallo Zusammen,

ich stand vor der Herausforderung ein neues Variablen-Profil für die Variable UNREACH (Homematic) auszurollen.
Eine manuelle Änderung kam auf Grund der Vielzahl der Devices und der Verschachtelungstiefe nicht in Frage, darauf hin habe ich folgende Funktion verwendet:

/***********************************************************************
$ID: Start-Kategorie in IP-Symcon ab welcher gesucht werden soll. 0 durchsucht die gesamte vorhandene Struktur
$NAME: String welcher den Variablen-Name enthält
************************************************************************/
function FN_GetAllVariablesByName($ID, $NAME)
{
    global $arResultList;
    $InstObj = IPS_GetObject($ID);
    
    if (IPS_HasChildren($ID)) {
        $arVarList[] = IPS_GetChildrenIDs($ID);
        foreach (IPS_GetChildrenIDs($ID) as $VarChildID1) {
            if (IPS_GetName($VarChildID1) == $NAME)
                $arResultList[] = $VarChildID1;
            FN_GetAllVariablesByName($VarChildID1, $NAME);
        }
    }
    return $arResultList;
}

Um nun pauschal allen UNREACH-Variablen in IP-Symcon ein neues Profil zuzuordnen, kann z.B. folgendes Script verwendet werden:

<?
$arResultList;
$arResultList = FN_GetAllVariablesByName(0, "UNREACH");
print_r($arResultList);

foreach ($arResultList as &$value) {
    IPS_SetVariableCustomProfile($value, "DeviceState.OnlineOffline");
}

/***********************************************************************
$ID: Start-Kategorie in IP-Symcon ab welcher gesucht werden soll. 0 durchsucht die gesamte vorhandene Struktur
$NAME: String welcher den Variablen-Name enthält
************************************************************************/
function FN_GetAllVariablesByName($ID, $NAME)
{
    global $arResultList;
    $InstObj = IPS_GetObject($ID);
    
    if (IPS_HasChildren($ID)) {
        $arVarList[] = IPS_GetChildrenIDs($ID);
        foreach (IPS_GetChildrenIDs($ID) as $VarChildID1) {
            if (IPS_GetName($VarChildID1) == $NAME)
                $arResultList[] = $VarChildID1;
            FN_GetAllVariablesByName($VarChildID1, $NAME);
        }
    }
    return $arResultList;
}
?>

Etwas sauberer wäre, sich erst alle HM-Instanzen zu holen und darunter jeweils die Variable anhand des Ident (nicht Namen).

Ich nutze diese „rekursive Suche“ schon länger.
Sie klappt gut, solange die Funktion bei einem Programmdurchlauf nur 1 mal aufgerufen wird.
Wenn die Funktion innerhalb des selben Programms aber nochmal aufgerufen wird, werden die Werte des 1. Aufrufs mit den Werten des 2. Aufrufs zusammengeführt.

Die Ergebnisliste „vermischt“ also die Ergebnisse der Suchen.

Ich fand noch keine Idee, wie man die

global $arResultList;

für den 2. Funktionsaufruf zurücksetzen kann. Da die Global nur innerhalb der Funktion gilt, klappt ein Zurücksetzen vor dem 2. Aufruf leider auch nicht.
Das „individualisieren“ der Global-Variable in Form von „global $arResultList$ID;“ klappt auch nicht.

Hat jemand eine Idee, wie man das vermischen verhindert?

<?php
$ResultListSollwert = FN_GetAllVariablesByName(44091,"Sollwert");
$ResultListEinAus = FN_GetAllVariablesByName(44091,"Ein/Aus");

function FN_GetAllVariablesByName($ID, $NAME) {
    global $arResultList;
    if (IPS_HasChildren($ID)) {
        $arVarList[] = IPS_GetChildrenIDs($ID);
        foreach (IPS_GetChildrenIDs($ID) as $VarChildID1) {
            if (IPS_GetName($VarChildID1) == $NAME)
                $arResultList[] = $VarChildID1  ;
               FN_GetAllVariablesByName($VarChildID1, $NAME);
               } }
    return $arResultList;
}