Frage zu ausgelöstem Ereignis

Guten Morgen,
vorab wünsche ich euch allen Frohe Weihnachten! :slight_smile:

Ich programmiere aktuell an einem Modul und habe eine Frage zu Ereignissen.
Ich möchte eine gemessen Temperatur eines Sensors über einen Befehl in eine Variable in mein Modul bringen. Hierzu wähle ich die Variable im Modul aus um den Wert der Variable zu erhalten.

Das funktioniert aktuell soweit schon und der Wert wird immer übernommen sobald die „Request Action Function“ im Modul ausgeführt wird. (public function RequestAction($Ident, $Value) )
variable_auswaehlen

Die Werte sollen aber immer bei einer Änderung der Quellvariable automatisch in die Variable des Moduls aktualisiert werden.

Über " REGISTERTIMER" kann ich einen Timer festlegen damit der den Wert z.B. alle 5 Minuten von der Quelle in die Ziel-Variable schreibt. Das passiert dann auch, wenn sich der Quellwert gar nicht geändert hat.

Frage:
Kann ich diese Aktion auch durchführen damit der Wert nur geschrieben wird wenn er wirklich in der Quell-Variable geändert / aktualisiert wurde? Das kann dann auch z.B. erst nach 30 Sekunden sein.
Wie bei einem Ereignis „Ausgelöst“.

Kurz gesagt:
Der Wert der „Ist-Temperatur“ unter Simulation soll bei jeder Aktualisierung automatisch in die Variable „Ist-Temperatur“ der Modulinstanz „Raumregelung“ übertragen werden.
Ohne Timer, sondern wirklich nur bei einer Änderung.

Ich hatte jetzt schon viel gesucht und ähnliche Module angesehen, aber komme leider nicht weiter.
Ist das möglich?

Dazu benutzt man RegisterMessage und MessageSink.
Schau in das Beispiel von Symcon, hier ist es eine Instanz. Kann aber natürlich auch eine Variable sein.

Michael

Hi Michael,
danke dir für die schnelle Rückmeldung, ich hatte den Code in Beispielen gesehen gesehen konnte ihn aber nicht richtig zuordnen, jetzt ist es klarer.

Unter Apply Changes habe ich jetzt folgenden Code:
$this->RegisterMessage($this->ReadPropertyFloat("Temperatur-ID"), IM_CHANGESTATUS);

Wenn ich das richtig verstanden habe, sage ich somit, sobald sich der Wert der ID, der hinter „Temperatur-ID“ ausgewählt wurde ändert, wird die Aktion ausgeführt.

Ich glaub ich habe trotz Doku noch ein Verständnisproblem.
Mein bisheriger (gekürzter Code):

<?
// Klassendefinition
class Raumregelung extends IPSModule {
    // Überschreibt die interne IPS_Create($id) Funktion
    public function Create() {
        // Diese Zeile nicht löschen.
        parent::Create();

        $istemperature      = $this->RegisterVariableFloat("IsTemperature", $this->Translate("Is temperature"),"",0);
        $shouldtemperature  = $this->RegisterVariableFloat("ShouldTemperature", $this->Translate("Should temperature"),"",1);
        $reduction          = $this->RegisterVariableFloat("Reduction", $this->Translate("Reduction"),"",2);
        $heatingphase       = $this->RegisterVariableInteger("HeatingPhase", $this->Translate("Heatingphase"),"",3); 

        $this->RegisterPropertyInteger("Aktor-ID", 0);
        $this->RegisterPropertyString("Schaltbefehl-An", "0");
        $this->RegisterPropertyString("Schaltbefehl-Aus", "0");
        $this->RegisterPropertyString("Schaltbefehl", "0");
        $this->RegisterPropertyFloat("Temperatur-ID", 0);
        $this->RegisterPropertyString("DeviceType", "0");
    }

    
    // Überschreibt die intere IPS_ApplyChanges($id) Funktion
    public function ApplyChanges() {
        // Diese Zeile nicht löschen
        parent::ApplyChanges();


        $this->RegisterMessage($this->ReadPropertyFloat("Temperatur-ID"), IM_CHANGESTATUS);



    }

    public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
    {
        $value = GetValueFloat($SenderID);
        SetValue("IsTemperature", $value);
    }

    public function RequestAction($Ident, $Value) {
        $this->get_heatingplan_status(); //Aufruf Heizplan Rausfinden
        $this->set_temperature();

    
    
          switch ($Ident) {
              case 'ShouldTemperature':
                SetValue(IPS_GetObjectIDByIdent('ShouldTemperature', $this->InstanceID), $Value);
                break;
              case 'Reduction':
               SetValue(IPS_GetObjectIDByIdent('Reduction', $this->InstanceID), $Value);
                break;
                }
    
        }
}
?>

Ich kenne die Funktion nicht im Detail, vermute aber, dass die einen Integer benötigt, da die IP-Symcon IDs alle Integer sind. Auch die Property sollte vom Typ INT sein.

Ui… wo soll man da anfangen…
Erstmal ist RegisterPropertyFloat und ReadPropertyFloat für Temperatur-ID falsch, da du die VariableID (also die ObjektID) in der Eigenschaft speicherst und das ist ein integer.
Dann solltest du die Eigenschaft prüfen, ob die Variable überhaupt existiert, bevor du einfach die ID an RegisterMessage übergibst.
Entsprechend dem Objekt muss bei RegisterMessage natürlich die korrekte Nachricht angegeben werden. IM_CHANGESTATUS ist da falsch. Die SDK-Doku hat alle Nachrichten gelistet, such die für Variablenupdates raus.

Hier hast du das Beispiel nicht genutzt, welches $Data ausgibt. Dann siehst du (sobald du die Nachricht oben korrigiert hast) dass $Data alles enthält was du brauchst.
Ein GetValue auf jeden Fall nicht :slight_smile:

Michael