+ Antworten
Ergebnis 1 bis 3 von 3
  1. #1
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    9,597

    Standard Workaround für Timer

    Hier mal ein paar Methoden um einen einfachen Timer in einem Modul zu nutzen.

    Verwendung :
    PHP-Code:
        public function Create()
        {
    //Never delete this line!
            
    parent::Create();
            
    $this->RegisterTimer('RequestPinState'$this->ReadPropertyInteger('Interval'), 'XBee_RequestState($_IPS[\'TARGET\']);');
    //                                                              IDENT                           INTERVAL                                           FUNKTION

        
    }
        public function 
    ApplyChanges()
        {
            
    //Never delete this line!
            
    parent::ApplyChanges();
            
    $this->SetTimerInterval('RequestPinState'$this->ReadPropertyInteger('Interval'));

    Methoden:
    PHP-Code:
        protected function RegisterTimer($Name$Interval$Script)
        {
            
    $id = @IPS_GetObjectIDByIdent($Name$this->InstanceID);
            if (
    $id === false)
                
    $id 0;


            if (
    $id 0)
            {
                if (!
    IPS_EventExists($id))
                    throw new 
    Exception("Ident with name " $Name " is used for wrong object type");

                if (
    IPS_GetEvent($id)['EventType'] <> 1)
                {
                    
    IPS_DeleteEvent($id);
                    
    $id 0;
                }
            }

            if (
    $id == 0)
            {
                
    $id IPS_CreateEvent(1);
                
    IPS_SetParent($id$this->InstanceID);
                
    IPS_SetIdent($id$Name);
            }
            
    IPS_SetName($id$Name);
            
    IPS_SetHidden($idtrue);
            
    IPS_SetEventScript($id$Script);
            if (
    $Interval 0)
            {
                
    IPS_SetEventCyclic($id00001$Interval);

                
    IPS_SetEventActive($idtrue);
            }
            else
            {
                
    IPS_SetEventCyclic($id000011);

                
    IPS_SetEventActive($idfalse);
            }
        }

        protected function 
    UnregisterTimer($Name)
        {
            
    $id = @IPS_GetObjectIDByIdent($Name$this->InstanceID);
            if (
    $id 0)
            {
                if (!
    IPS_EventExists($id))
                    throw new 
    Exception('Timer not present');
                
    IPS_DeleteEvent($id);
            }
        }

        protected function 
    SetTimerInterval($Name$Interval)
        {
            
    $id = @IPS_GetObjectIDByIdent($Name$this->InstanceID);
            if (
    $id === false)
                throw new 
    Exception('Timer not present');
            if (!
    IPS_EventExists($id))
                throw new 
    Exception('Timer not present');

            
    $Event IPS_GetEvent($id);

            if (
    $Interval 1)
            {
                if (
    $Event['EventActive'])
                    
    IPS_SetEventActive($idfalse);
            }
            else
            {
                if (
    $Event['CyclicTimeValue'] <> $Interval)
                    
    IPS_SetEventCyclic($id00001$Interval);
                if (!
    $Event['EventActive'])
                    
    IPS_SetEventActive($idtrue);
            }
        } 
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  2. #2
    Registriert seit
    Sep 2015
    Beiträge
    488

    Ich hab was ähnliches gebaut, aber etwas anders als du

    PHP-Code:
      protected function RegisterTimer($ident$interval$script) {
        
    $id = @IPS_GetObjectIDByIdent($ident$this->InstanceID);

        if (
    $id && IPS_GetEvent($id)['EventType'] <> 1) {
          
    IPS_DeleteEvent($id);
          
    $id 0;
        }

        if (!
    $id) {
          
    $id IPS_CreateEvent(1);
          
    IPS_SetParent($id$this->InstanceID);
          
    IPS_SetIdent($id$ident);
        }

        
    IPS_SetName($id$ident);
        
    IPS_SetHidden($idtrue);
        
    IPS_SetEventScript($id"\$id = \$_IPS['TARGET'];\n$script;");

        if (!
    IPS_EventExists($id)) throw new Exception("Ident with name $ident is used for wrong object type");

        if (!(
    $interval 0)) {
          
    IPS_SetEventCyclic($id000011);
          
    IPS_SetEventActive($idfalse);
        } else {
          
    IPS_SetEventCyclic($id00001$interval);
          
    IPS_SetEventActive($idtrue);
        }
      } 
    Unterschied zu deinem, mir war wichtig das ich immer nur eine Funktion aufrufe die das Event anlegt und updaten kann. Das sorgt dafür das auch bei einem Update der Timer angelegt wird, ohne das ich die Instanz wegwerden muss. Außerdem glaube ich nicht, dass es ein Performancenachteil darstellt immer vorher zu prüfen ob es das Event schon gibt. Ansonsten sind wir recht nah bei einander. Habe mir auch die Idee mit dem Interval von 0 abgeschaut, um das Script abzuschalten! Achja, zusätzlich wollte ich das $id im Script verwendet wird, so wie bei den Forms auch. Wobei mir eigentlich lieber gewesen wäre, nur den Funktionsnamen anzugeben, wie das auch in der Oberfläche geht, aber hier habe ich keine Funktion in der Doku gefunden.
    Symcon auf UDOO x86, HM CCU auf RPi3
    Meine Module: SymconHUE (Philipps HUE), SymconBotvac (VR200), SymconBTP (Beacon-Alternative), SymconE2 (Enigma2 TV)

  3. #3
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    9,597

    Die Umsetzung von mir ist an dem alten Delphi-SDK angeleht.
    Damit ist der Aufbau der alten und neuen Module bei mir ähnlich, was für mich einfacher zu warten ist.
    Klar kann man es jetzt (mit PHP) auch mit einer Funktion lösen, nur müßte ich dann jedesmal das Script mit übergeben.
    Aber es ist ja eh nur als Übergangslösung gedacht.

    Das mit der $id kommt aber aus der Konsole, und hat nichts mit dem PHP in IPS selbst zu tun.
    Die Konsole interpretiert $id in einem Konfig-Formular, als InstanzID welche du gerade geöffnet hast.

    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

Ähnliche Themen

  1. Workaround Lösung für Abkündigungen mit IPS v4.0 ???
    Von mr_cg im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 35
    Letzter Beitrag: 18.06.15, 06:11
  2. Status Digitalstromgeräte an IPS (Workaround Rückkanal)
    Von elektroniktommy im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 0
    Letzter Beitrag: 05.08.13, 11:28
  3. Timer für FHT80b einrichten
    Von andreashh im Forum Skripte, PHP, SQL
    Antworten: 8
    Letzter Beitrag: 08.12.11, 11:23
  4. Timer für das WebFront
    Von hirschbrat im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 1
    Letzter Beitrag: 25.11.09, 17:51
  5. Bug/Workaround/Tipp
    Von gwanjek im Forum IP-Symcon WIIPS für Version 1.0
    Antworten: 1
    Letzter Beitrag: 07.12.07, 12:11