Persistente Variable in Modul Funktion

Guten Abend,

ich bin gerade dabei mein erstes Modul zu schreiben. Es ist ein Wecker bei dem man bis zu drei Automationen verlinken kann die zu einer eingestelten Uhrzeit ausgeführt werden.
Zusätlich zu der Gemeinsamen Auslösezeit lässt sich für jede Automation auch noch ein Offset angeben.

Eigentlich funktioniert das auch so weit. Das Modul registerit ein Ereignis was alle 10s ein Funktion des Moduls aufruft.
Diese Funktion prüft ob eine Automation auszulösen ist und führt diese dann aus.
Da die Prüfung alle 10 Sekunden pasiert und ich die Zeit nur auf die Minute genau angebe, wird die Automation bis zu 6 mal gestartet.
So nun zu meinem Probblem:
Um dies zu verhindern will ich mit der ersten ausfürung eine Variable auf „True“ setzen. Leider bekomme ich es nicht hin das die Variable nicht ihren Wert verliert beim nächsten Funktions Aufruf.

Hier kurz ein beispiel wie ich es versucht habe (habe alles raus gelöscht was nicht dirket mit dem problem zu tun hat. Nach meinem verständnis sollte sich der Variablen wert bei jedem aufruf von True nach False und zurück ändern):

public function CheckForAlarm() {
          
        static $Action1 = false; // Save if first action is triggerd

       
        $this->SetValue('ActualTime',("A1:".$Action1);
        if ($Action1 == false)
       { 
              $Action1 = true;
       } else {
             $Action1 = false; 
       }
}

Des weiteren hatte ich auch versucht die Variablen direkt in der Classe zu definierne dies hat aber leider auch nicht funkitoniert.

class Wecker extends IPSModule {
    // Überschreibt die interne IPS_Create($id) Funktion
   
    private $Action1 = false; // Save if first action is triggerd


    public function Create() {
        // Diese Zeile nicht löschen.      
        parent::Create();

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

    
    public function CheckForAlarm() {
   $this->SetValue('ActualTime',("A1:".$Action1);
        if ($this->$Action1 == false)
       { 
              $this->$Action1 = true;
       } else {
            $this-> $Action1 = false; 
       }
}

eventuell hat von euch einer ein Tip, sollte ja ein gängiges Problem sein

Mit freundlichen Grüßen
Max

Kein Problem, sondern korrektes Verhalten.
Die Instanz deiner PHP-Klasse wird verworfen, sobald Symcon das Skript ausgeführt hat.
Darum gibt es Buffer um Werte dort persistent zu speichern.

Wobei ich das hier nicht verstehe:

Das braucht ein Modul nicht.
Module arbeiten ohne Ereignisse.
Dafür gibt es Timer, oder RegisterMessage und die MessageSink.
Michael

Hi
Danke für die schnelle Antwort.

Ja Ereigniss war das falsche Wort ich verwende die
„RegisterTimer(…)“ Funktion.

OK das meine Instanz jedes Mal neu erzeugt und wieder vernichtet wird wusste ich nicht. Hätte erwartet das sie mit dem anlegen der Instanz im Objekt Baum erzeugt wird und dann bestehen bleibt.

Warum werden die Instanzen den wieder verworfen?

Gruß Max

Weil PHP eine Skriptsprache ist und somit die PHP Instanz deiner Klasse nur so lange lebt wie das Skript läuft.
Jedesmal wenn Symcon irgendwas mit der (Symcon) Instanz machen muss, wird ein PHP Skript gestartet, die PHP Instanz aus der Modulklasse erstellt, der Befehl ausgeführt und das Skript beendet.
Es können ja auch nur eine begrenzte Anzahl von PHP Skripten gleichzeitig laufen.

Aber warum hast du einen Timer der alle 10 Sekunden läuft? Wozu? Eine Zielzeit wenn etwas passieren soll, kann man errechnen.
Michael

Guten Morgen,

Um ehrlich zu sein weil ich zu faul war und ein Erfolgserlebnis haben wollte.
Ist wie schon geschrieben das erste Modul und auch meine ersten Schritte mit PHP.
Auch die 10 Sekunden könnte man auf 1min stellen aber dann hätte ich nicht das Problem gehabt, dass die Automation mehrmals aufgerufen wird und somit nicht erfahren wie man Variablen Inhalte von einem Aufruf in den nächsten mit nehmen kann.

Ich hätte ja auch eine Property registrieren können und dort die Informationen ablegen ob ich die Automation schon Mal gestartet hatte oder?

Gruß Max

Nein propertys (also die der Symcon Instanz) sind für die Parameter der Instanz, also die Einstellungen welche der User vornimmt.
Wenn schon dann ein Attribut, das ist auch über den Symcon Neustart persistent.
Michael

Ja schmeiß noch die Begriffe Durcheinander :see_no_evil: