Änderung von Funktionsparametern wird in __generated.inc.php nicht nachgefühlt

Hallo,

ich habe ab und an folgendes Problem:

wenn ich bei der Modul-Entwicklung einer vorhandenen public-Funktion, also einer Funktion, die bereits in der __generated.inc.php steht, an den Parameter etwas ändere, z.B. einen hinzufüge, wird das in der __generated.inc.php nicht nachgeführt und daher gibt es Fehlermeldungen.

Dabei ist egal, ob ich die Änderung per MC_ReloadModule() oder per GUI ein Modul-Update bekannt mache - ich vermute, das die intern verwendete Funktion sowieso die gleiche ist.

Nur ein Restart des IPS hilft, dann wird ja die __generated.inc.php komplett neu aufgebaut.

Ist das etwas, was man auch ohne IPS-Restart beheben kann?

Das kann ja schon mal sein, das ein Funktionsaufruf sich ändert - sollte natürlich nach Möglichkeit nicht sein, aber ist ja nicht auszuschliessen.

Gruß
demel

Also bei mir hat das bisher immer mit MC_Reload funktioniert.
Aber eventuell hat sich da ja etwas geändert, seitdem IPS ja die __generated nicht mehr ausversehen kaputt macht.
Michael
PS: Ich schiebe es in den Entwickler Bereich.

Danke,

zum Nachtrag: das passiert mir auch bei IPS 5.0

demel

Also bei 5.0 und 5.1 hat das bei mir definitiv funktioniert.
Wird das Modul den überhaupt neu geladen?
Tauchen entsprechende Einträge im LogFile/Meldungen auf?
Michael

Ja ganz sicher, definitiv die üblichen Meldungen im Logfile und keine Fehlermeldung.
Bei einem anderen User ist es heute aufgetreten, als er ein Modul von mir upgedatet hat.

Ich werde aber morgen nochmal einen Test machen um es (hoffentlich) nachvollziehbar zu machen.

Ich melde mich wieder.

Gruß
demel

Was definitiv nicht geht, und bei der generated zu Problemen führt, sind Module mit identischen Präfix, gleicher Funktion aber unterschiedliche Parameter dieser Funktion.
Hast du sonst ein Beispiel zum anschauen?
Michael

Zuletzt aufgetreten in GitHub - demel42/IPSymconNetatmoSecurity: Access to Netatmo Security-Products

Da habe ich zB. in NetatmoSecurityCamera in der Funktion GetTimeline() den Parameter withDebug hinzugefügt.

Und CodingLizard hatte mir folgendes gemeldet:


Cannot register function NetatmoSecurity_CleanupVideoPath: Parameter count does not match

bei dem Update des Moduls.

bei der Funktion kam ebenfalls ein Parameter dazu: preferLocal

das Modul ist noch beta, daher die Änderungen …

demel

Die Meldung ist korrekt, es gibt keine optionalen Parameter bei Instanz-Funktionen.
Und du hast da einen:
IPSymconNetatmoSecurity/module.php at 7ac2d5997d8e8336ffd461eaffafbad9649c40ce · demel42/IPSymconNetatmoSecurity · GitHub
Trick 17, so wie bei bei einigen IPS Funktionen:
GetTimeline()
Und
GetTimelineEx($Value)
Michael

Ok, verstehe ich. Ist auch nicht wirlich optional, kann ich ändern … aber

  1. er hat sich geweigert die Funktion (aus einem Script) aufzurufen
  2. nach IPS-Reboot war es kein Problem mehr und funktioniert einwandfrei.

Ist mir ja eigentlich klar, das es da keine optionalen Parameter gibt und gebe beim Aufruf natürlich alle Parameter ab.

Bei dem 2. Fall war es (aus dem Gedächtnis) ein optionaler Parameter, der weggefallen ist …

Ich werde morgen mal etwas testen, ob sich das darauf zurückführen lässt.

demel

Hallo Nall-chan,

ich habe heute morgen weiter versucht und kann den Zusammenhang mit opt. Parametern nicht herstellen.

Umfass einfach nachstellen zu können habe ich ein Modul angelegt (GitHub - demel42/Test)

Das enthält eine FUnktion


public function TestFunc()
    {
        return 'abc';
    }

Modul ganz normal installiert, ein Script angelegt


<?

echo Test_TestFunc(56880 /*[Test]*/);

Ausgabe ist natürlich „abc“;

Dann habe ich die Funktion geändert


public function TestFunc(string $s)
    {
        return 'abc';
    }

dann


<?

MC_ReloadModule(31892 /*[Modules]*/, 'Test');

im Logfile kommt:

22.07.2019 10:27:20 | 00000 | MESSAGE | ModuleLoader | #Modul entladen: Test
22.07.2019 10:27:20 | 00000 | MESSAGE | ModuleLoader | #Bibliothek entladen: Test
22.07.2019 10:27:20 | 00000 | MESSAGE | ModuleLoader | Überspringe Built-In Bibliothek…

2.07.2019 10:27:20 | 00000 | MESSAGE | ModuleLoader | Lade Test Bibliothek…
22.07.2019 10:27:20 | 00000 | MESSAGE | ModuleLoader | # Test geladen
22.07.2019 10:27:20 | 00000 | MESSAGE | PHPLibrary | Registriere Funktionen… TEST_TestFunc
22.07.2019 10:27:20 | 00000 | MESSAGE | PHPLibrary | Registriere Funktion… TEST_TestFunc: Nicht registrierbare Funktion TEST_TestFunc: Parameter count does not match

trotzdem ein Versuch:

<?

echo Test_TestFunc(56880 /*[Test]*/, 'def');

[Fatal error: Uncaught ArgumentCountError: Too few arguments to function Test::TestFunc(), 0 passed in /var/lib/symcon/scripts/__generated.inc.php on line 5067 and exactly 1 expected in /var/lib/symcon/modules/Test/Test/module.php:34
Stack trace:
#0 /var/lib/symcon/scripts/__generated.inc.php(5067): Test->TestFunc()
#1 /var/lib/symcon/scripts/48712.ips.php(3): TEST_TestFunc(56880, ‚def‘)
#2 {main}
thrown in /var/lib/symcon/modules/Test/Test/module.php on line 34

Eintrag in __generated.inc.php:


function TEST_TestFunc($InstanceID)
{
    if(IPS_GetInstance($InstanceID)["ModuleInfo"]["ModuleID"] == "{B85F0CC0-5764-4A5B-9E6F-069CE00C46C4}") {
        require_once('/var/lib/symcon/modules/Test/Test/module.php');
        $result = (new Test($InstanceID))->TestFunc();
    }
    elseif(IPS_GetInstance($InstanceID)["ModuleInfo"]["ModuleID"] == "{B85F0CC0-5764-4A5B-9E6F-069CE00C46C4}") {
        require_once('/var/lib/symcon/modules/Test/Test/module.php');
        $result = (new Test($InstanceID))->TestFunc();
    }
    else {
        throw new Exception("Instance does not implement this function");
    }
    return $result;
}

Meine Umgebung ist Ubuntu und Raspberry, dieser Versuch ist unter IPS 5.0 (IP-Symcon 5.0, Ubuntu, 13.12.2018, 93cb63bbeb25)

Was mache ich falsch, was kann ich noch testen?

Gruß
demel

5.0 ist ja nicht aktuell. Mit der 5.1 stable getestet?

Michael

Ich habe zur Zeit kein 5.1, da ich mein ProdSys mit 5.0 erst nach dem Urlab aktualisieren wollte.
Mein Testsystem ist 5.2.

Soll ich es damit mal testen?

demel

Auf jeden Fall besser als mit 5.0.
Die generated ist da bei dir auch merkwürdig, da bei dem GUID Vergleich die gleiche GUID steht.
Michael

Hallo,

ich habe es mit 5.2 (IP-Symcon 5.2, Raspberry Pi, 18.07.2019, 133c4b680f06) getestet.
Da hat es funktioniert.

In der __generated.inc.php gust es auch nur einen Eintrag für die Funktion


function TEST_TestFunc($InstanceID)
{
        if(IPS_GetInstance($InstanceID)["ModuleInfo"]["ModuleID"] == "{B85F0CC0-5764-4A5B-9E6F-069CE00C46C4}") {
                require_once('/var/lib/symcon/modules/Test/Test/module.php');
                $result = (new Test($InstanceID))->TestFunc();
        }
        else {
                throw new Exception("Instance does not implement this function");
        }
        return $result;
}

Wenn ich auch meinem ProdSys auf 5.1 umgestellt habe, werden ich es nochmal testen, ob das dann auch unter Ubuntu funktioniert.

Was mich irritiert ist, das es bei Dir mit 5.0 funktioniert … wenn ich es richtig sehe, fährst Du IPS unter Windows?

Gruß
demel

Kann mich zumindest nicht an dieses Probleme mit 5.0 erinnern, egal ob unter Ubuntu oder Windows.
Oder es viel nicht auf, weil beim MC_Reload es mir immer die generated zerlegt hat :slight_smile:

Produktiv habe ich die 5.1, da ist es mir bisher nie bewusst aufgefallen, das es Probleme gibt. Da mache ich aber selten solche Änderungen an einem Modul.
Michael

Ich hab es gerade nicht zu 100% im Kopf. Aber ich glaube das Problem müsste mit der 5.1 gelöst worden sein.

paresy

Hallo,

ich habe das IPS heute auf 5.1 gebracht und den o.g. Test wiederholt.

Das Problem trat nicht mehr auf. __generated.inc.php ist in Ordnung und ich kann die Funktionen mit geänderten Parametern aufrufen. Kein Gemecker in Logfile.

Danke & Gruß
demel