Problem altes PHP Modul ab Version 4.3

Hallo,

ich habe heute das Update auf Version 4.3 installiert und mein altes PHP Modul funktioniert nicht mehr mit folgender Fehlermeldung:

„Warning: Cannot auto-convert value for parameter InstanceID in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 175
Fatal error: Uncaught exception ‚Exception‘ with message ‚Instance does not implement this function‘ in C:\Program Files\IP-Symcon\scripts__generated.inc.php:180“

Die Originalfunktion GetObjectIdByName($spezName) im Modul wird bei der Installation des Moduls in Utils_GetObjectIdByName($InstanceID, $spezName) in der Datei __generated.inc.php abgeändert. Dort scheint nun auch der Fehler zu passieren, da ich beim Aufruf (z. B. Utils_GetObjectIdByName("", „Statusübersicht“) keine $InstanceID an die Funktion übergebe.

In der Version 4.2 hat dies aber so funktioniert! Wie sieht hierfür die korrekte Lösung aus, oder habe ich im Modul schon etwas verkehrt gemacht?

Vielen Dank im Voraus!

Gruß Werner

Nach Namen solltest Du keinesfalls suchen sondern stattdessen GetIDForIdent nutzen, ansonsten must Du schon die Zeile posten in der der Fehler auftritt, hellsehen kann man noch nicht. Um welches Modul handelt es sich denn?

Dieses Problem scheint bei mehreren Modulen aufzutreten. Habe gerade das Modul SymconMisc installiert u. z. B. bei dem Umrechnen Modul.

Der Funktionsaufruf UMR_Calculate(12345) liefert die Warnung

Warning: Missing argument 2 for UMR_Calculate(), called in C:\Program Files\IP-Symcon\scripts\53838.ips.php on line 3 and defined in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 290

Ein Funktionsaufruf mit UMR_Calculate("", 12345) liefert

Warning: Cannot auto-convert value for parameter InstanceID in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 293
Warning: Cannot auto-convert value for parameter InstanceID in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 297
Warning: Cannot auto-convert value for parameter InstanceID in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 301
Fatal error: Uncaught exception ‚Exception‘ with message ‚Instance does not implement this function‘ in C:\Program Files\IP-Symcon\scripts__generated.inc.php:306
Stack trace:
#0 C:\Program Files\IP-Symcon\scripts\53838.ips.php(3): UMR_Calculate(’’, 2134)
#1 {main}
thrown in C:\Program Files\IP-Symcon\scripts__generated.inc.php on line 306

Alle Versionen vor 4.3 hatten dieses Problem nicht!?

Das kann nicht funktionieren. Die InstanzID ist Parameter 1 und vom Typ int. Keinesfalls ein Leerstring.
Also ist der Fehler im deinem Script und nicht im SymconMisc.

Michael

Wie Fonzo schon sagte, niemals mit Namen arbeiten.
Und was IPS macht ist korrekt.
Du musst immer die InstanzID übergeben.
Das es vorher funktionierte war definitiv falsch.
Michael

Ich stimme ja zu, nur dies ist nicht das Problem, da die Datei __generated.inc.php bei der Modulinstallation ja von IP Symcon generiert wird.
Das gleiche Problem ist ja auch bei dem SymconMisc Modul, das nicht von mir sondern von Paresy geschrieben wurde.

Wenn ich die die __generated.inc.php der Version 4.2 und der Version 4.3 vergleiche sind diese grundsätzlich unterschiedlich (siehe unten).

Version 4.2
function Utils_GetObjectIdByName($InstanceID, $spezName)
{
$old_handler = set_error_handler(‚IPSTypeHintHandler::CatchError‘);
require_once(‚C:\Program Files\IP-Symcon\modules\SymconUtilities\Utilities\module.php‘);
$result = (new SymconUtilities($InstanceID))->GetObjectIdByName($spezName);
set_error_handler($old_handler);
return $result;
}

Version 4.3
function Utils_GetObjectIdByName($InstanceID, $spezName)
{
$old_handler = set_error_handler(‚IPSTypeHintHandler::CatchError‘);
if(IPS_GetInstance($InstanceID)[„ModuleInfo“][„ModuleID“] == „{4B860F07-5C61-4A89-91EE-56BA590391E9}“) {
require_once(‚C:\Program Files\IP-Symcon\modules\SymconUtilities\Utilities\module.php‘);
$result = (new SymconUtilities($InstanceID))->GetObjectIdByName($spezName);
}
else {
throw new Exception(„Instance does not implement this function“);
}
set_error_handler($old_handler);
return $result;
}

Ja und das ist auch richtig so.
Damit der gleiche Prefix für verschiedene Module genutzt werden kann. Und ungültige Aufrufe, wie deine, ins Leere laufen.
Michael

UMR_Calculate

Erwartet zwei Parameter der erste ist die 5stellige ObjektID als Zahl, ohne „“, sonst wäre es ein String. Der zweite Parameter ist Float also auch eine Zahl.

Ja, dies macht ja alles schon Sinn und ich verstehe es auch.

Nur die ObjectID habe ich ja nicht immer zur Verfügung und wenn man sich das Beispiel mit UMR_Calculate ansieht, steht in der Online Doku zum Modul der Aufruf mit nur einem Parameter (Wert für die Berechnung) und ohne InstanceID - was ja auch sinnvoll ist. Der zweite Übergabeparameter mit der InstanceID entsteht erst durch die __generated.inc.php Datei.

Es ist wohl so gedacht, dass die InstanceID bei jedem Funktionsaufruf mit übergeben werden muss, nur woher bekomme ich diese?

Danke schon mal für die Hilfe!

Dann ist die Doku falsch.
Weil es ist nicht sinnvoll.
Für Funktionen welche Instanzen zur Verfügung stellen, muss immer die InstanzID angegeben werden, damit IPS weiß welche Instanz die Funktion ausführen soll.
Wie auch bei allen anderen Instanzen in IPS, sei es Homematic, Z-Wave usw… es braucht immer die InstanzID.
Die letzte Frage verstehe ich nicht… Wo willst du die her bekommen… Aus der Konsole?
Oder was meinst du.
Michael

Bei Instanzen von Geräten oder Variablen macht dies Sinn; dort habe ich natürlich die ObjectIDs aus der Konsole. Wenn ich aber ein Modul installiere, das bestimmte Funktionen zur Verfügung stellt, habe ich in der Konsole keine ObjectID, weil es ja kein Objekt oder keine Instance gibt.

Z. B. ein Modul für Zahlenberechnung, das eine Funktion zur Addition zweier Zahlen zur Verfügung stellt. Wenn ich diese Funktion im Editor verwende, habe ich dort ja keine InstanceID oder zumindest kenne ich diese bislang nicht!?

Gleiches gilt ja auch für das Umrechnen Modul von Paresy. Hier wird ja nicht die InstanceID des Moduls übergeben, sondern die ObjectID des Objekts das umgerechnet werden soll. Im Beispielcode ist hier nur ein Übergabeparameter angegeben - nämlich die ObjectID. Ich kenne hier ja auch die InstanceID des Moduls eigentlich nicht!

Gruß Werner

Ich glaube ich habe es verstanden - ich muss wohl erst eine Instanz des Moduls erzeugen und dann mit dessen InstanzID weiterarbeiten, um diese dann bei Funktionsaufrufen übergeben zu können!?!

Ja ohne eine Instanz wird das nix. Das es überhaupt funktioniert hat, war schon ein Fehler in IPS des gefixt wurde.
Michael