IPS_RequestAction Verständnisfrage

Moin Moin,

public functions im Modul stehen auch außerhalb des Moduls zur Verfügung:

function SetNotifyWarn(string $heading, string $text, int $headingColor, int $textColor) {
...
}

Über das Kontextmenü einer Instance kann auf diese Funktionen direkt zugegriffen werden:

Dabei stellt die Symcon-Konsole die Parameter entsprechend des Variablen-Typs dar. Wie kann hier ein Farbwähler „SelectColor“ angezeigt werden?

Wenn nun über ein Script auf diese Funktion zugegriffen werden soll, kann über

IPS_RequestAction(<InstanzUD>,<Ident>,<Wert>) zugegriffen werden.

Dieser Aufruf wird vom Modul über
public function RequestAction($Ident, $Value)
abgearbeitet, korrekt?
Wie können dann mehrere Werte übergeben werden? Muß das über einen json-String selbst auseinander gefummelt werden?

Somit müssen also public function immer auch in RequestAction aufgeführt werden, damit sie nicht nur über „Befehle testen“, Ablaufpläne oder Ereignisse genutzt werden können, sondern auch aus einem Script via IPS_RequestAction ?

Sorry für die Fragen, habe gerade einen Knoten im Kopf.

Grüße Detlev.

Gar nicht. Das ist eine Testfunktion und die Felder werden aus dem Datentypen generiert (bool, int, float, string)

ja, ebenso wie der Aufruf über RequestAction(VariableID, Wert) auch dort landet.

ja… aber warum?
Kannst doch einfach eine public funktion nutzen und dort array als Typ des Parameters nutzen.

Ne. Das eine hat nicht direkt was mit dem anderen zu tun.
Public Funktionen sind Instanz-Funktionen. Die stehen immer dann zur Verfügung wenn das Ziel bei einer Aktion die Instanz ist. Oder halt in einem PHP Script.

Meistens reicht als Ziel einer Aktion aber die Statusvariable. Die wird dann ‚intern‘ mit RequestAction(VariableID, Wert) geschaltet, was im Modul bei public RequestAction() landet. Das funktioniert nur bei Variablen welche auch eine Standard-Aktion haben (EnableAction).

IPS_RequestAction funktioniert auf Ebene der Instanz und ist unabhängig von Statusvariablen. Dort kannst du also irgendwas in Ident und Wert übergeben und das in public RequestAction() verarbeiten.

Michael
PS: Ich habe das Thema mal verschoben.

Hmm,
ich glaube das muß ich mir morgen nochmal in Ruhe anschauen, danke schon mal für die prompte Antwort.
Grüße Detlev.

Es ist doch nicht nur eine Testfunktion, die Parameter für die Instanzfunktion kann ich doch auch bei einem Ereignis oder einem Ablaufplan angeben, halt nicht nur in der Testfunktion „Befehle testen“

Ich denke RequestAction habe ich kapiert, aber diese Aussage

lässt mich an meinem Wissensstand noch etwas zweifeln.

Public Funktionen sind Instanz-Funktionen. Ok, aber wenn ich nun außerhalb des Moduls diese Funktion ansprechen möchte, bleibt mir doch nur IPS_RequestAction, oder habe ich da was übersehen?

Übergebe ich ein Array

IPS_RequestAction(43112,'SetNotifyWarn',array('zeile1','Zeile2',34567,56789));

erhalte ich eine auto-convert-Warnung

Warning: Cannot auto-convert value for parameter Value (Type is not supported)

public function RequestAction($Ident, $Value) {
switch ($Ident) {
				case "SetNotifyWarn":
					$this->LogMessage('SetNotifyWarn'.implode(':',$Value),KL_NOTIFY);
					break;
			}  
		}

Strings, int oder float kann ich übergeben.

Grüße Detlev.

Du verwendest das nur grundlegend falsch. IPS_RequestAction wird durch DICH niemals aufgerufen.
Und die Modul-Funktion RequestACtion wird entweder durch eine Status-Variable mit Standardaktion (musst du entsprechend aktivieren über

$this->EnableAction($IDENT);

Oder ein NUTZER macht das in seinem eigenen PHP Script mit RequestAction($instanzVariableID, $Wert);

Du wwürdest innerhalb deines Moduls ja über

$this->RequestAction('ident', $value); 

zugreifen.

Doch. Der Eintrag in der Konsole heißt Befehle testen. Das ist eine Testfunktionb (der Konsole), darum kannst du dort keine Felder wie SelectColor nutzen.
Es ist eine Funktion der Konsole um deine Instant-Funktion zu testen.

Dann hast du nicht verstanden was eine Instanz Funktion ist.
Das hier ist eine IG_UpdateImage(12345); oder DeinModulPrefix_PublicFunction(12345, 'werte');

Wenn du aber für eine Aktion spezielle Eingabefelder anbieten willst, dann musst du dafür eine Aktion bauen. Diese wiederum kann kann Formulare enthalten, PHP Code und das schlussendlich über eine Instant-Funktion an das Ziel der Aktion (deine Instanz) übergeben.
Michael

Nein, du definierst in der module.json einen prefix, mit dem prefix kannst du eine public funktion von ausserhalb deines moduls aufrufen.

Schau dir bspw das tibber modul an. In der module.json habe ich als prefix TIBBER hinterlegt.

Zudem habe ich eine public function PriceArray(). Du kannst nun diese funktion via

TIBBER_PriceArray(integer $InstanzID);

aufrufen.

Danke euch, jetzt ist es klar geworden.