MessageSink blockiert Eventbehandlung

Hallo,

in meinem Modul (Blind Control) reagiere ich im MessageSink auf Variablenänderungen und stoße dann auch Rollladenfahrten an, die durchaus etwas länger dauern können. Nun beobachte ich, dass die auslösende Variable im Webfront erst nach meiner Verarbeitung umgesetzt wird. Also scheint mein MessageSink die Eventbehandlung zu blockieren. Das ist etwas unschön und ich weiß nicht, wie ich das lösen kann.

Gibt es da einen Trick :)?

Burkhard

Ja, die MessageSink nicht blockieren :wink:
Also mit z.b. RequestAction oder IPS_RunScriptText entkoppeln.

Michael

Danke! Dann werde ich es mal mit RequestAction probieren …

Burkhard

Muss mich korrigieren.
Habe IPS_RequestAction benutzt, damit der Ident unabhängig von dem Vorhandensein einer Variable ist.

Und, auch wenn es in deinem Fall wohl eher unbedeutend ist; aber eventuell für andere welche dieses Thema finden:
Das ist auch bei den Kernelmessages wichtig, weil ihr sonst ebenfalls IPS beim starten / beenden blockiert.
Michael

Besten Dank nochmals! Bei mir ist es IPS_RunScriptText geworden.

Burkhard

Ich nutze gerne IPS_RequestAction, dann brauche ich keine öffentliche Instanz-Funktion dafür bereitstellen.
Michael

Das habe ich auch zunächst versucht. Allerdings habe ich keine passende Statusvariable. Und die öffentliche Funktion BLC_BlindControl() war bereits vorhanden.[emoji1]

Burkhard

Ich zitiere mich Mal selber:
Habe IPS_RequestAction benutzt, damit der Ident unabhängig von dem Vorhandensein einer Variable ist.
Darum IPS_RequestAction und nicht RequestAction.
Michael

Ah, jetzt bei intensiverem Nachdenken verstehe ich deinen Hinweis erst. Man kann die Funktion mit einem beliebigen String aufrufen. Es hat mit einem Variablenident nicht unbedingt etwas zu tun.

Burkhard

Genau :smiley:
Nutze ich auch im MessageSink wenn es um Statusänderung des Parent oder trennen/verbinden mit einem Parent geht.
Gibt sonst immer unschöne Einträge im Log, wenn man die MessageQueue blockiert.
Michael

Wie Nall-Chan schon sagte: Wenn es länger dauert am besten per Timer entkoppeln (Oder IPS_RunScriptText).

paresy

Timer habe dafür tatsächlich nur einmal benutzt, im MySQL Modul wo dann die gesammelten Datensätze übertragen werden.
Für quasi Echtzeit finde die IPS_RequestAction eleganter. :smiley:
Michael

(IPS_)RequestAction ist aber (insbesondere bei nativen Instanzen) nicht entkoppelt.

paresy

Ups :o

Du hast natürlich Recht!

Deswegen ist das bei mit tatsächlich eine Kombi von IPS_RunScriptText und IPS_RequestAction :o

Entkopplung auf IM_CHANGESTATUS, FM_CONNECT und FM_DISCONNECT:

IPS_RunScriptText('IPS_RequestAction(' . $this->InstanceID . ',"IOChangeState",' . $State . ');');

Michael