Wie kann ich ein installiertes Modul von einem Standardmodul unterscheiden?

Hat jemand eine Idee, wie ich in einem Skript ein installiertes Modul ((z.B. Shelly) von einem Standard Modul (z.B. Homematic) unterscheiden kann?

Mein Anliegen ist, eine Liste aller IP-Symcon-„Standardfunktionen“ zu erstellen.

Dazu denke ich, mir mit IPS_GetFunctionList() alle im System registrierten Funktionen geben zu lassen und dann aus dem Ergebnis die Funktionen der zusätzlich installierten Module herauszufiltern.

Hat jemand eine Idee, ob das irgendwie machbar ist?

Abgleich mit der Symcon Online Doku.
Wobei ich das hier lange nicht mehr ausprobiert habe…

Michael

Ist das nicht genau dieser Vergleich nach ‚Kern-Bibliothek‘? IPS_GetModuleList — IP-Symcon :: Automatisierungssoftware

Danke euch beiden! Gerade das zweite Beispiel hat mich dann zum Erfolg geführt:

function getExternalModules(): array
{
    //Alle ModulPräfixe mit Modulname und GUID ausgeben
    $pair = [];
    foreach (IPS_GetModuleList() as $guid) {
        $module = IPS_GetModule($guid);
        // Nur Module, die nicht zur Kern-Bibliothek gehören
        if ($module['LibraryID'] !== "{0945206A-47AA-4FDD-9093-99051E410E82}") {
            $pair[$module['Prefix']] = ['ModuleName' => $module['ModuleName'], 'guid' => $guid];
        }
    }
    return $pair;
}

Einziger Schönheitsfehler: die HM_* Funktionen werden zu den Externen gezählt :frowning:

Hintergrund ist wohl das HomeMaticOveride Modul

Array
(
    [ParentRequirements] => Array
        (
        )

    [ChildRequirements] => Array
        (
        )

    [Implemented] => Array
        (
        )

    [Vendor] => 
    [Aliases] => Array
        (
            [0] => HomeMaticOverride
        )

    [Translation] => Array
        (
        )

    [URL] => 
    [Prefix] => HM
    [LibraryID] => {ADB2ACA9-FF2A-4B6A-AE35-5F2DE74F5397}
    [ModuleID] => {0100CA51-D2DA-11E4-8830-0800200C9A66}
    [ModuleName] => HomeMaticOverride
    [ModuleType] => 3
)

Das werde ich wohl explizit behandeln müssen. Ich hoffe, es ist das einzige.

Die fliegen eh raus. Aber erst mit der nächsten Version.
Michael

OK.

Gerade gesehen, dass noch ein Modul meine Logic stört :slight_smile:

Array
(
    [ParentRequirements] => Array
        (
            [0] => {75B6B237-A7B0-46B9-BBCE-8DF0CFE6FA52}
        )

    [ChildRequirements] => Array
        (
        )

    [Implemented] => Array
        (
            [0] => {98FEC99D-6AD9-4598-8F50-2976DA0A32C8}
        )

    [Vendor] => HomeMatic
    [Aliases] => Array
        (
            [0] => HomeMatic WR-Interface
        )

    [Translation] => Array
        (
        )

    [URL] => https://github.com/Nall-chan/HomematicExtended/blob/master/WRInterface/README.md
    [Prefix] => HM
    [LibraryID] => {AE6D87CF-041F-4603-9FBB-8D6F3EA82B81}
    [ModuleID] => {01C66202-7E94-49C4-8D8F-6A75CE944E87}
    [ModuleName] => HomeMatic WR Interface
    [ModuleType] => 3
)

Das Modul hat das gleiche Präfix (‚HM_‘) wie das Standardmodul.

Ich werde wohl doch den mühsameren Weg über IPS_GetFunctionListByModuleID() gehen müssen. :thinking:

Oh, vorhin falsch gelesen.
Das HomeMaticOverride ist sogar von Symcon und Bestandteil der TestModule :slight_smile:

Nur letzteres ist von mir.
Und ja, der Prefix mit HM_ ist da auch genutzt.
Michael

So, neuer Versuch. Die Liste der Standardfunktionen ermittele ich nun mit Hilfe zweier Funktionen

function getModuleFunctionsOfStandardLibrary(): array
{
    $functionList = [];
    foreach (IPS_GetModuleList() as $moduleName) {
        $module = IPS_GetModule($moduleName);
        if ($module['LibraryID'] === '{0945206A-47AA-4FDD-9093-99051E410E82}') {
            foreach (IPS_GetFunctionListByModuleID($module['ModuleID']) as $functionName) {
                if (strstr($functionName, '_', true) !== 'IPS') {
                    $functionList[] = $functionName;
                }
            }
        }
    }
    asort($functionList);
    return array_unique($functionList);
}

function getIPSFunctions(): array
{
    $functionList = [];
    foreach (IPS_GetFunctionList(0) as $functionName) {
        $praefix = strstr($functionName, '_', true);
        if ($praefix === false || $praefix === 'IPS') {
            $functionList[] = $functionName;
        }
    }
    asort($functionList);
    return $functionList;
}

Das sieht jetzt soweit gut aus.