Request Action im Modul

Ich habe einen Modul Nutzer der beim setzen einer Statusvariablen in meinem Modul die default Fehlermeldung ausloest.

public function RequestAction($Ident, $Value)
    {
        switch ($Ident) {
            case "Activate_all_Cameras":
                // Update the value of the status variable
                $this->SetValue($Ident, $Value);

                // Execute your custom function when the status changes
                $this->ExecuteMotionDetectionAPI($Value);
                break;

            // Handle other variables or actions if necessary
            default:
                throw new Exception("Invalid Ident");
        }
    }

image

Wenn ich bei mir eine Neuinstallation mache funktioniert alles perfekt.
Hat jemand eine Idee was hier schief laeuft ?

Dann hat der User vielleicht einen falschen Ident genutzt?
Michael

Moin,

In der meldung steht das requestaction mit dem ident status aufgerufen wird. In deiner funktion gibt es kein case mit status daher wird default aufgerufen.

Viele Grüße

2 „Gefällt mir“

Hier ist ein Screenshot den mir der Nutzer geschickt hat. Da sieht alles normal aus.

Das mit dem Status ist mir auch aufgefallen aber ich weiss halt nicht wie Symcon das intern organisiert. Der Name der Variable scheint keine Rolle zu spielen

Der Name ist wurscht. Der Ident ist wichtig.
Auch wenn es keine Variable mit dem Ident Status gibt, wo kann die Funktion RequestAction dennoch getriggert werden.
Symcon macht damit erstmal nix, solange man nicht selber irgendwelchen Code hat wie IPS_RequestAction(InstanzID, ‚Status‘… Welcher dann in RequestAction landet.
Oder im Modul selber mit $this->RequestAction irgendwas macht.
Michael

Ich nutze das Egg Timer Modul in meinem Modul und mache einen aufruf auf die Eieruhr mit request action. Muss ich deinen Kommentar so interpretieren das ich aus einem Modul heraus kein requestaction of externe Module machen sollte ? Falls ja was ist die alternative ?

Keine Ahnung was du da wie machst, also :man_shrugging:

Grundsätzlich sollte eine Instanz von einem Modul unabhängig von anderen Modulen funktionieren.

Man kann natürlich Features einbauen wozu man Modul XYZ installieren muss, aber auch dann sollte das natürlich so umgesetzt werden (oder dem User überlassen werden) das es keine Nebeneffekte gibt.

Ohne dein Modul bzw. den Code zu kennen, kann es natürlich sein das du hier irgendwas vermischt hast, was so einen Fehler auslöst.
Michael

Klar, verstehe ich
Mein Modul hat nur eine einzige Status Variable :

    // Register a boolean status variable
        $this->RegisterVariableBoolean("Activate_all_Cameras", "Activate_all_Cameras", "~Switch", 0);
        $this->SetValue("Activate_all_Cameras",true);
        $this->EnableAction("Activate_all_Cameras");

Ich habe im Moment schwierigkeiten zu verstehen wie ein Nutzer von aussen einen anderen Ident aufrufen kann. Der Fehler entsteht wenn der Nutzer mit requestaction die Boolean Variable Activate_all_Cameras neu setzen will

Das passt aber nicht zur Fehlermeldung im Screenshot.
Ohne den Code vom ganzen Modul zu kennen, kann man da nicht viel helfen.
Michael

Du meinst ein ident von einem anderem modul?

Gar nicht. Aber wenn das modul eine public function hat, die das setzen erlaubt, dann kann man die nutzen.

Das kann ma einfach prüfen, indem mab bei der instanz ses fremdmoduls ein rechtsklick machst und auf „Befehle testen“ gejst und da nachschaust. Da steht auch wie der externe aufruf zu lauten hat.

Man muss aber prüfen ob das modul auch installiert ist, am besten auf die uuid prüfen. Sonst kommen weitere fehler

Doch klar geht das.
Der Befehl nennt sich IPS_RequestAction($InstanzId, $Ident, $Value);
Damit kannst du jeder Instanz einen beliebigen Ident und Value unterschieben, welcher dann in RequestAction landet.
Michael

PS: Darum prüft man ja auch auf Fehlerhafte :wink:

1 „Gefällt mir“

ist das was undokumentiertes? In der Sufu finde ich nichts dazu…

Ich glaube es war mal dokumentiert. Ist aber durch RequestAction größtenteils abgelöst, welches allerdings auf die Variable und ein eventuell vorhandenen Aktions-Skript wirkt. Somit braucht man IPS_RequestAction auch noch, da dieses direkt auf eine Instanz einwirkt (also die Eigene Aktion einer Variable umgeht).

Außerdem kann man es gut benutzen um Modul interne Funktionen zu starten :slight_smile:
Michael

Ich werde mal alle requestaction Befehle in meinem Modul fuer den Egg Timer auf IPS_RequestAction umstellen. Ich habe den Verdacht das hier das Problem liegt.

Im Modul habe ich ja die function RequestAction neu definiert, in meiner case struktur gibt es allerdings nur meine Status Variable. Das Egg Timer Modul ist extern und dessen Status Variablen sind in meinem Modul nicht bekannt und meine Case Struktur kennt sie auch nicht.

Das sollte nicht nötig sein, weil ein RequestAction und ein $this->RequestAction sind ja zwei verschiedene Funktionen.
Und du musst ja selber RequestAction als Methode deiner Klasse definieren, sonst kannst du keine Schaltanforderung im Modul verarbeiten.
Michael

Das Problem ist geloest, der Nutzer hatte eine neue Version installiert in der ich den Variablen Namen von Status auf Activate_all_Cameras geändert hatte. Er hat dann eine RequestAction auf die alte Status Variable gemacht und die Fehlermeldung erzeugt

Ich hätte darauf hinweisen müssen das im derzeitigen Beta Status des Moduls es zwingend notwendig ist bei diesem update die alte instanz komplett zu löschen und dann neu zu installieren
Nochmals vielen Dank fuer eure Tipps

Kleiner Tipp:

default:
                throw new Exception("Invalid Ident: $Ident");

hätte bei der Suche die Ursache vermutlich schneller aufgezeigt :slightly_smiling_face:

Stimmt und ist schon eingebaut