Suchen in einer Kategorie

Moin,
ich stelle gerade sehr viel um und muss ca. 4000 Objekte anfassen/verändern/löschen. Im Prinzip hat mir die Suche in allen Scripten schon geholfen aber es gab zu viele Treffer. Ich habe mir ein kleines Script geschrieben das ab einer ObjectID alle Scripte in allen Kindern und Kindeskindern und … nach einem Text durchsucht und die ID anzeigt.

<?php
$Base = 59791;                          // BasisID die durchsucht werden soll
check_children($Base);
function check_children($Parent){
    $Search = "lhd_Send";        // Suchbegriff unabhängig von Groß-/Kleinschreibung
    $Object = IPS_GetObject($Parent);
    if ($Object["HasChildren"]){
        foreach ($Object["ChildrenIDs"] as $ID){
            check_children($ID);
        }
    }
    if ($Object["ObjectType"] == 2){
        $Variable = IPS_GetVariable($Object["ObjectID"]);
        if ($Variable["VariableType"] == 3){
            $String = GetValue($Object["ObjectID"]);
            $Pos = stristr($String, $Search, 0);
            if ($Pos != false) echo $Parent. PHP_EOL;
        }
    }
    if ($Object["ObjectType"] == 3){
        $Script = IPS_GetScriptContent($Object["ObjectID"]);
        $Pos = stristr($Script, $Search, 0);
        if ($Pos != false) echo $Parent . PHP_EOL;
    }
}
?>

Vielleicht kann es ja sonst noch jemand gebrauchen. Lang lebe die Rekursion :grinning:

Edit: Es war noch ein Denkfehler drin. Zusätzlich werden jetzt auch Stringvariablen nach dem Text durchsucht.

Ralf

3 „Gefällt mir“

Top, Danke fürs Teilen!
Hätte ich schon ein paarmal brauchen können, auch wenn meine Dimensionen sehr viel kleiner sind.
Cheers Seppm

Hier ist noch ein schönes Suchtool

$search = array ("testy");
$location = 'suchex';
$type = 2; // Objekt-Typ (0: Kategorie, 1: Instanz, 2: Variable, 3: Skript, 4: Ereignis, 5: Media, 6: Link)
$value = true; // in_array alternativ
$value = array();

$gesuchte_objekte = search($search,$location,$type,$value);

print_r($gesuchte_objekte);

function search ($search,$location,$type,$value)
{

    $gesuchte_objekte = array_filter(IPS_GetObjectList (), function ($object){global $search,$location,$type,$value; if(
        in_array(IPS_GetName ($object),  $search) 
        AND 
        strpos ( IPS_GetLocation($object),$location )
        AND
        (IPS_GetObject($object)['ObjectType'] == $type) 
        AND
        (in_array(GetValue($object), $value))
        )
        {return true;}});  
    return  $gesuchte_objekte ;
}

Danke! Magst kurz benennen was es macht, ich schnalle es nicht auf Anhieb.
Cheers Seppm

Search enthält die oder im Grenzfall den Namen des Objekts das gesucht wird
Location enthält den Namen des übergeordneten Objekts (Instanz oder Kategorie)
type definiert den Typ des Objekts (Variable oder Instanz etc.)
value enthält den Wert der Variable (z.B. wenn ich nur nach eingeschalteten Lampen suche)

Wenn eines der Suchkriterien nicht benötigt wird einfach die Abfrage bei den AND`s in der funktion auskommentieren

Danke Dir! Cheers Seppm

Hi,
ich habe mein Such-Script noch ein wenig erweitert weil ich es gerade brauchte:

<?php
$Base = 51119;                          // BasisID die durchsucht werden soll
check_children($Base);
function check_children($Parent){
    $Search = "last channel";        // Suchbegriff unabhängig von Groß-/Kleinschreibung
    $Object = IPS_GetObject($Parent);
    if ($Object["HasChildren"]){
        foreach ($Object["ChildrenIDs"] as $ID){
            check_children($ID);
        }
    }
    $String = IPS_GetName($Object["ObjectID"]);
    $Pos = stristr($String, $Search, 0);
    if ($Pos != false) echo $Parent. PHP_EOL;
    if ($Object["ObjectType"] == 2){
        $Variable = IPS_GetVariable($Object["ObjectID"]);
        if ($Variable["VariableType"] == 3){
            $String = GetValue($Object["ObjectID"]);
            $Pos = stristr($String, $Search, 0);
            if ($Pos != false) echo $Parent. PHP_EOL;
        }
    }
    if ($Object["ObjectType"] == 3){
        $Script = IPS_GetScriptContent($Object["ObjectID"]);
        if ($Object["ObjectID"] != $_IPS['SELF']){
            $Pos = stristr($Script, $Search, 0);
            if ($Pos != false) echo $Parent . PHP_EOL;
        }
    }
}
?>

Neben Scripten und Inhalt von Stringvariablen wird jetzt auch der Objektname durchsucht.

Ralf