bumaas
29. Oktober 2024 um 11:58
1
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…
IPSFunktionsDoku.php
<?php
ini_set('max_execution_time', 300); // kann schon mal dauern :)
$IPSDoku = array();
$urls=[];
$urls['Befehlsreferenz'] = "https://www.symcon.de/service/dokumentation/befehlsreferenz/";
$urls['Modulreferenz'] = "https://www.symcon.de/service/dokumentation/modulreferenz/";
foreach ($urls as $Name => $url)
{
$dom = new DOMDocument();
@$dom->loadHTMLFile($url);
This file has been truncated. show original
Michael
tobiasr
29. Oktober 2024 um 12:41
3
Ist das nicht genau dieser Vergleich nach ‚Kern-Bibliothek‘? IPS_GetModuleList — IP-Symcon :: Automatisierungssoftware
bumaas
29. Oktober 2024 um 13:50
4
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
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
bumaas
29. Oktober 2024 um 15:32
6
OK.
Gerade gesehen, dass noch ein Modul meine Logic stört
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.
bumaas:
HomeMaticOverride
Oh, vorhin falsch gelesen.
Das HomeMaticOverride ist sogar von Symcon und Bestandteil der TestModule
Nur letzteres ist von mir.
Und ja, der Prefix mit HM_ ist da auch genutzt.
Michael
bumaas
29. Oktober 2024 um 16:44
8
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.