Modul: Wochenplan erzeugen und in Reihenfolge bringen

Hallo,
ich arbeite gerade wieder an einem Modul und habe schon diverse Variablen (Int, Float etc.) erzeugt.

Zusätzlich habe ich auch einen Wochenplan erzeugt den ich benötigt.
Dieser wird allerdings nicht bei den anderen Variablen unterhalb der „root-Instanz“ angelegt, wo er eigentlich hin sollte.

Ich habe schon versucht die ID von z.B. Ist-Temperatur auszulesen und anhand dieser Info den Wochenplan zu dorthin zu verschieben, aber das hat irgendwie nicht geklappt.

Wisst ihr, wie ich ihn dort hinbringe bzw. meine Frage ist eher ob man das bei der Erstellung des Moduls beeinflussen kann?

IPS_SetParent($id, $this->InstanceID); sollte helfen :slight_smile:

paresy

Es wäre viel einfach wenn du den Code nicht als Screenshot einbindest.

CreateEvent liefert dir die ID zurück.
Anschließend einfach mit IPS_SetParent korrekt einsortieren.
Michael

Danke euch beiden, funktioniert. :slight_smile:


        // Überschreibt die interne IPS_Create($id) Funktion
        public function Create() {
            // Diese Zeile nicht löschen.
            parent::Create();

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

            $id = IPS_CreateEvent(2);
            IPS_SetParent($id, $this->InstanceID);
            IPS_SetPosition($id, 4);
            IPS_SetEventScheduleAction($id, 0, "Absenken", 0xFF7F00, "");
            IPS_SetEventScheduleAction($id, 1, "Heizen", 0xFF0000, "");
            IPS_SetEventScheduleGroup($id, 0, 31); //Mo - Fr (1 + 2 + 4 + 8 + 16)
            IPS_SetEventScheduleGroup($id, 1, 96); //Sa + So (32 + 64)
            IPS_SetName($id, "Heizplan");

So nicht!
Dann hast du bei jedem Modul Reload oder Symcon Neustart ein weiteren Wochenplan.
Michael

Hallo Nall-chan, danke dir
Das ist mir auch aufgefallen ich bin aber noch nicht auf die Lösung gekommen. Wie wäre den der Ansatz?

Bin Grad dabei mich Einzuarbeiten in das Thema Module, daher im Moment auch noch Fragen zu eigentlich einfachen Sachen, wie ich merke.

Vielleicht indem du vorher prüfst ob er schon vorhanden ist?
Und das natürlich über den Ident!
Michael

Den Ansatz hatte ich heute Mittag auch schon im Kopf. Allerdings bin ich noch am überlegen wie das umgesetzt wird.

Den wenn ich einen Wochenplan erstellt habe und das ganze dann nochmal durchführe z.B. über einen Module-Reload, dann weiß ich ja nicht mehr welche ID der Wochenplan beim ersten Mal hatte und kann diesen somit nicht vergleichen bzw auf existens überprüfen.

Hier bin ich Grad noch dran rauszufinden, wie sich das am geschicktesten umsetzen lässt.

Noch Mal lesen und überlegen was ich wohl mit dem Ident meinte :smiley:

Schau dir sonst doch einfach an, wie andere Module das machen.
Michael

Schau mal hier: GetIDForIdent — IP-Symcon :: Automatisierungssoftware

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Okay, ich habe deinen Beitrag erneut gelesen und glaube zu verstehen bzw. wenn nicht wirst du mir es gleich sagen.
Auch den Link von Kai habe ich mir angeschaut.

Von meiner Seite:
Der Wochenplan hat doch gar keinen Ident, oder? Somit kann ich diesen nicht prüfen.
Wie komme ich darauf?

–> Ich habe mir einmal ein Array mit allen Informationen eines Wochenplans ausgeben lassen und unter „ObjectIdent“ war nichts zu sehen.

Oder muss ich den Ident erst mit „IPS_SETIDENT“ setzen?
https://www.symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/ips-setident/

Ja, den Ident musst du setzen.
IPS_CreateXYZ erzeugt immer nur Objekte ohne Ident.
Eventuell solltest du dir andere Module anschauen.
Oder zuerst innerhalb eines normalen Scripten testen, ohne Verwendung von festen IDs und nur mit Idents.

Michael

Danke dir Nall-chan :slight_smile:

Ich habe es geschafft:


        // Überschreibt die interne IPS_Create($id) Funktion
        public function Create() {
            // Diese Zeile nicht löschen.
            parent::Create();

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


            if (@$this->GetIDForIdent("heatingplan") == false) {
                $heatingplan = IPS_CreateEvent(2);
                IPS_SetParent($heatingplan, $this->InstanceID);
                IPS_SetPosition($heatingplan, 4);
                IPS_SetEventScheduleAction($heatingplan, 0, "Absenkung", 0xFF7F00, "");
                IPS_SetEventScheduleAction($heatingplan, 1, "Heizen", 0xFF0000, "");
                IPS_SetEventScheduleGroup($heatingplan, 0, 31); //Mo - Fr (1 + 2 + 4 + 8 + 16)
                IPS_SetEventScheduleGroup($heatingplan, 1, 96); //Sa + So (32 + 64)
                IPS_SetName($heatingplan, "Heizplan");
                IPS_SetIdent($heatingplan, "heatingplan");
            }

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

Ich hänge mal noch ein Thema an (habe den Threadtitel angepasst), damit ich kein neues Thema aufmachen muss.

Ich bin gut weitergekommen und möchte jetzt eine Aktion ausführen, wenn eine bestimmte Variable im Webfront gedrückt / geändert wird.
Hierzu habe ich mir den Befehl: RequestAction angesehen.
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/module/requestaction/

Zusätzlich habe ich mir ein bereits existierendes Modul von ESERA angesehen um die Funktion zu verstehen bzw. nachzuvollziehen.

Ich bekomme bei der Ausführung keinen Fehler aber auch kein Ergebnis / keine Änderung.
Meine Beispielprogrammierung zum testen:


<?
    // Klassendefinition
    class Heizkoerpersteuerung 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->RegisterVariableInteger("ShouldTemperature", $this->Translate("Should temperature"),"",1);
            $reduction          = $this->RegisterVariableInteger("Reduction", $this->Translate("Reduction"),"",2);
            $heatingphase       = $this->RegisterVariableInteger("HeatingPhase", $this->Translate("Heatingphase"),"",3); 

            if (@$this->GetIDForIdent("heatingplan") == false) {
                $heatingplan = IPS_CreateEvent(2);
                IPS_SetParent($heatingplan, $this->InstanceID);
                IPS_SetPosition($heatingplan, 4);
                IPS_SetEventScheduleAction($heatingplan, 0, "Absenkung", 0xFF7F00, "");
                IPS_SetEventScheduleAction($heatingplan, 1, "Heizen", 0xFF0000, "");
                IPS_SetEventScheduleGroup($heatingplan, 0, 31); //Mo - Fr (1 + 2 + 4 + 8 + 16)
                IPS_SetEventScheduleGroup($heatingplan, 1, 96); //Sa + So (32 + 64)
                IPS_SetName($heatingplan, "Heizplan");
                IPS_SetIdent($heatingplan, "heatingplan");
            }
  

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

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

        }

 
        /**
        * Die folgenden Funktionen stehen automatisch zur Verfügung, wenn das Modul über die "Module Control" eingefügt wurden.
        * Die Funktionen werden, mit dem selbst eingerichteten Prefix, in PHP und JSON-RPC wiefolgt zur Verfügung gestellt:
        *
        * H_heizung($ist_temperatur,$soll_temperatur,$soll_absenkung,$heizphase,$wochenplan);
        *
        */

    public function RequestAction($Ident, $Value) {
     $this->test();
    }


     public function test()
     {
      echo "testausgabe";
      SetValue(15338, $Value);

	 }

    }
?>

Ich erwarte das es mir die Variable 15338 auf den eingegeben Wert setzt, aber es passiert nichts. Irgendwo ist noch ein Fehler.

So wie ich das verstanden habe wird bei einer Änderung im Webfrontend automatisch die Funktion „RequestAction“ aufgerufen hier wird dann der auslösende Ident übergeben + den Wert den man eingegeben hat. Anschließend kann man diese Daten weiterverarbeiten bzw. wie bei mir beim testen an eine andere Funktion weiterleiten um das Ergebnis in eine andere Variable zu schreiben.

In Test ist $Value gar nicht deklariert.
Und… Auch wenn es zum testen ist.
Keine IDs benutzen!
Es gibt SetValue als Funktion im SDK.

Du hast doch gar keine Variable mit einer aktive Aktion im Modul.
Wie soll da aus dem WebFront eine Bedienung erfolgen, welche RequestAction triggert?

Michael

Ich hatte es so verstanden das er automatisch den Ident + Value der Variablen, die im Webfrontend gedrückt wurde,an die Funktion übergibt.

Habe die Variable jetzt deklariert und initailisiert:

$Value = 5;

Bezüglich keine IDs verewenden, an welche Stelle meinst du genau?
Das werde ich beachten.

Kannst du mir den Befehl sagen bzw. wo ich schauen muss, wie ich einer Variable eine aktive Aktion zuweisen kann?
Hier hatte ich verstanden, das das von „RequestAction“ automatisch übernommen wird.

Aber ich muss der Variablen ja eine aktive Aktion geben das ich auch mit ihr arbeiten bzw. tippen kann.
Hast du eventuell ein Modul von dir wo man das leicht sehen kann?

Habs gefunden hier:
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/module/enableaction/

Ohman, ich habe mir die Aktion die ganze Zeit nicht angeschaut, da ich dachte die ist zur aktivieren oder deaktivieren von Wochenplänen…

Ereignisse sind im SDK gar nicht vorgesehen.
Da musst du dir selber etwas überlegen.

Statische IDs kannst du nirgends verwenden, immer nur über z.b. GetIDForIdent.

Es gibt hier schöne Demo Module, wo du dir bestimmt Teilaspekte anschauen kannst.

Michael

Ich bin weitergekommen, die Auswertung einer Action bekomme ich jetzt hin, danke für die Hilfe Nall-chan.

Da habe ich aber gleich die nächste Frage, im Create-Bereich, erstelle ich einen Wochenplan:
(Über diesen sollen die Heizzeiten gesteuert werden)

            if (@$this->GetIDForIdent("heatingplan") == false) {
                $heatingplan = IPS_CreateEvent(2);
                IPS_SetParent($heatingplan, $this->InstanceID);
                IPS_SetPosition($heatingplan, 4);
                IPS_SetEventScheduleAction($heatingplan, 0, "Absenkung", 0xFF7F00, "");
                IPS_SetEventScheduleAction($heatingplan, 1, "Heizen", 0xFF0000, "");
                IPS_SetEventScheduleGroup($heatingplan, 0, 31); //Mo - Fr (1 + 2 + 4 + 8 + 16)
                IPS_SetEventScheduleGroup($heatingplan, 1, 96); //Sa + So (32 + 64)
                IPS_SetName($heatingplan, "Heizplan");
                IPS_SetIdent($heatingplan, "heatingplan");
            }

Ich versuch jetzt den aktuellen Schaltzustand des Wochenplans herauszufinden, dafür habe ich eine Funktion im Modul mit der ich den aktuellen Schaltzustand herausfinden kann. Diese arbeitet mit IDs, die ja nicht verwendet werden soll. (Hier suche ich noch nach einer anderen Lösung.

Das ganze versuche ich mit:

$this->wochenplan_status($this->GetValue("heatingplan"));

→ Hier sagt er mir das die Variable mit IDxxx nicht existiert.

Wie kann ich von der Funktion unten auf den Wochenplan im Create-Bereich zugreifen um den aktuellen Schaltzustand auszulesen?
Hier einmal mein ganzer Quelltext:


<?
    // Klassendefinition
    class Heizkoerpersteuerung 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->RegisterVariableInteger("ShouldTemperature", $this->Translate("Should temperature"),"",1);
            $reduction          = $this->RegisterVariableInteger("Reduction", $this->Translate("Reduction"),"",2);
            $heatingphase       = $this->RegisterVariableInteger("HeatingPhase", $this->Translate("Heatingphase"),"",3); 
            $this->RegisterPropertyFloat("Faktor", 0.5);

            $this->EnableAction("ShouldTemperature");
            $this->EnableAction("Reduction");

            if (@$this->GetIDForIdent("heatingplan") == false) {
                $heatingplan = IPS_CreateEvent(2);
                IPS_SetParent($heatingplan, $this->InstanceID);
                IPS_SetPosition($heatingplan, 4);
                IPS_SetEventScheduleAction($heatingplan, 0, "Absenkung", 0xFF7F00, "");
                IPS_SetEventScheduleAction($heatingplan, 1, "Heizen", 0xFF0000, "");
                IPS_SetEventScheduleGroup($heatingplan, 0, 31); //Mo - Fr (1 + 2 + 4 + 8 + 16)
                IPS_SetEventScheduleGroup($heatingplan, 1, 96); //Sa + So (32 + 64)
                IPS_SetName($heatingplan, "Heizplan");
                IPS_SetIdent($heatingplan, "heatingplan");
            }
  
            $this->RegisterPropertyInteger("Aktor-ID", 0);
            $this->RegisterPropertyString("Schaltbefehl", "0");
            $this->RegisterPropertyInteger("Temperatur-ID", 0);
        }
        

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

 




        }

 
    public function RequestAction($Ident, $Value) {
    $this->temperatursteuerung($this->GetValue("IsTemperature"),$this->GetValue("ShouldTemperature"),
    $this->GetValue("Reduction"),
    $this->GetValue("HeatingPhase"),
    5 #Die 5 ist ein Platzhalter im Moment);
    

    $this->wochenplan_status($this->GetValue("heatingplan"));


    }


        public function temperatursteuerung($istemperature,$soll_temperatur,$soll_absenkung,$heizphase,$wochenplan) {

            if ($wochenplan == 0)
            {
                #SetValueInteger($heizphase,2); #Abgesenkt
                //echo "Wochenplan Aktion: Abgesenkt --> ";
            }
            else
            {
                #SetValueInteger($heizphase,3); #Heizen
                //echo "Wochenplan Aktion: Heizen --> ";
            }

            #$heizphase = GetValueInteger($heizphase);
            #$soll_absenkung = GetValueInteger($soll_absenkung);
            #$soll_temperatur = GetValueInteger($shouldtemperature);

            switch ($heizphase) {
                case 0:
                    #HM_WriteValueFloat($aktor, $set_parameter, 0);
                    break;
                case 1:
                    #HM_WriteValueFloat($aktor, $set_parameter, $temperatur_frostschutz );
                    break;
                case 2:
                    #HM_WriteValueFloat($aktor, $set_parameter, $soll_temperatur-$soll_absenkung);    
                    break;
                case 3:
                    #HM_WriteValueFloat($aktor, $set_parameter, $soll_temperatur);
                    break;
                }
               
        }


        public function wochenplan_status($id) {
            $e = IPS_GetEvent($id);
            $actionID = false;
            //Durch alle Gruppen gehen
            foreach($e['ScheduleGroups'] as $g) {
                //Überprüfen ob die Gruppe für heute zuständig ist
                if(($g['Days'] & pow(2,date("N",time())-1)) > 0)  {
                    //Aktuellen Schaltpunkt suchen. Wir nutzen die Eigenschaft, dass die Schaltpunkte immer aufsteigend sortiert sind.
                    foreach($g['Points'] as $p) {
                       if(date("H") * 3600 + date("i") * 60 + date("s") >= $p['Start']['Hour'] * 3600 + $p['Start']['Minute'] * 60 + $p['Start']['Second']) {
                          $actionID = $p['ActionID'];
                       } else {
                          break; //Sobald wir drüber sind, können wir abbrechen.
                       }
                   }
                    break; //Sobald wir unseren Tag gefunden haben, können wir die Schleife abbrechen. Jeder Tag darf nur in genau einer Gruppe sein.
                }
            }
            #var_dump($actionID);
            #return $actionID;
        }
    }
?>

Ich habe nach einem Beispielmodul gesucht wo ein Wochenplan ausgewertet werden soll, habe aber keins gefunden.