Ankündigung

Einklappen
Keine Ankündigung bisher.

reset Timer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    reset Timer

    Mein Flur Licht geht nach einer vorbestimmten Zeit ,Timer gesteuert, automatisch aus wenn ein bestimmter Status überschritten wird. Manchmal soll der Timer resetet werden. Ich habe anhand verschiedener beispiel rules eine Lösung zu finden, habe aber noch nicht brauchbares gefunden.

    Der aktuelle Versuch sieht so aus.

    Code:
    import org.openhab.model.script.actions.Timer
    import org.joda.time.*
    import org.openhab.core.library.types.*
    import org.openhab.model.script.actions.*
     
    var Timer timer_Flur = null
    
    rule korridortimer
    when
    Item KorridorFDimmer received update or 
    Item KorridorDDimmer received update 
    then
    
    if (KorridorFDimmer.state > 1 )
    	 {
                    
                   if (KorridorFDimmer.state > 1) { 
                   	
                   	 logInfo("runtime.busevents", "set timer")
                   createTimer(now.plusSeconds(10)) [|
                   	
                            sendCommand(KorridorFDimmer,0)
                            sendCommand(KorridorDDimmer,0)
                            
        ]} else { if(timer_Flur != null) 
                    timer_Flur.cancel()
                    logInfo("runtime.busevents", "cancel timer")
    	}		
    	}
    end
    Im Log sieht es dann so aus.

    Code:
    08:55:37.468 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:37.494 ERROR o.o.m.s.a.ScriptExecution[:134]- Failed to schedule code for execution.
    org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.2014-12-08T08:55:47.469+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: org.eclipse.xtext.xbase.impl.XClosureImplCustom@3b1e5cfc (explicitSyntax: true)', because one already exists with this identification.
    	at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:277)
    	at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:249)
    	at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:840)
    	at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:250)
    	at org.openhab.model.script.actions.ScriptExecution.makeTimer(ScriptExecution.java:130)
    	at org.openhab.model.script.actions.ScriptExecution.createTimer(ScriptExecution.java:92)
    08:55:38.519 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:38.532 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:38.559 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:41.622 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:41.628 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:41.672 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:41.716 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:41.723 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:43.066 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:55:43.094 INFO  o.o.m.script.runtime.busevents[:53]- set timer
    08:56:05.363 INFO  o.o.m.script.runtime.busevents[:53]- set timer

    #2
    Naja du solltest den Time schon noch zuweisen, wenn du darauf zugreifen möchtest:
    Code:
     timer_Flur = createTimer(now.plusSeconds(10)) [|
    dann sollte das auch funktionieren

    Kommentar


      #3
      Das bring leider auch nichts.
      Es waren sonst noch kleine Fehler im Code.

      Jetzt sieht es so aus.
      Code:
      import org.openhab.model.script.actions.Timer
      import org.joda.time.*
      import org.openhab.core.library.types.*
      import org.openhab.model.script.actions.*
       var Timer timer_Flur  = null 
      
      
      rule korridortimer
      when
      Item KorridorFDimmer received update or 
      Item KorridorDDimmer received update 
      then
      
      
                      
            if (KorridorFDimmer.state > 1 || KorridorDDimmer.state > 1) { 
                     	
                     	 logInfo("runtime.busevents", "set timer")
                     timer_Flur = createTimer(now.plusSeconds(10)) [|
                     	
                              sendCommand(KorridorFDimmer,0)
                              sendCommand(KorridorDDimmer,0)
                              
          ]} else { if(timer_Flur != null) {
                      logInfo("runtime.busevents", "cancel timer")
                      timer_Flur.cancel()
                                     
                      
                      }
                      
      	}		
      	
      end
      Im Log sieht es so aus

      Code:
      21:05:11.547 INFO  o.o.m.script.runtime.busevents[:53]- set timer
      21:05:12.076 INFO  o.o.m.script.runtime.busevents[:53]- cancel timer
      21:05:12.094 INFO  o.o.m.script.runtime.busevents[:53]- cancel timer
      21:05:12.120 INFO  o.o.m.script.runtime.busevents[:53]- set timer
      21:05:12.126 INFO  o.o.m.script.runtime.busevents[:53]- set timer
      21:05:13.150 INFO  o.o.m.script.runtime.busevents[:53]- cancel timer
      21:05:13.163 INFO  o.o.m.script.runtime.busevents[:53]- cancel timer
      21:05:13.166 INFO  o.o.m.script.runtime.busevents[:53]- cancel timer
      21:05:13.176 INFO  o.o.m.script.runtime.busevents[:53]- set timer
      21:05:13.192 INFO  o.o.m.script.runtime.busevents[:53]- set timer
      Aber der Timer wird nicht neu auf 10 Sekunden gesetzt sondern geht 10 Sekunden nach dem ersten update los.

      Kommentar


        #4
        Ich hab es noch nicht ganz verstanden was du machen willst, aber hier
        Code:
        sendCommand(KorridorFDimmer,0)
        sendCommand(KorridorDDimmer,0)
        wird die gleiche Regel noch 2x getriggert und das kann zu Problemen führen.
        Evtl. über eine zusätzliche globale Variable auflösen und darauf triggern.

        Holger

        Kommentar


          #5
          10 Sekunden sind recht kurz, aber ich würde es über einen Zähler machen, falls ich es richtig verstanden habe:
          - Betätigung / Änderung setzt einen Zähler auf 10, schaltet Licht ein
          - ist der Zähler > 0 wird er sekündlich herunter gezählt
          - ist er 0 (oder 1, Logik mit runterzählen einfacher) wird das Licht ausgeschaltet

          Holger

          Kommentar


            #6
            Danke HolgerW für deine immer hilfreichen Tips. 10 Sekunden sind nur zum debugen um schneller zusehen ob es funktioniert oder nicht. Das Ziel ist,dass das Flur Licht nach Zeit x automatisch ausgeht. Es gibt Momente da reicht die Zeit nicht aus und ich würde dann gerne den Timer neu starten. Später werde ich das mit einem Bewegungsmelder lösen.

            Kommentar


              #7
              Hier ist mein Ansatz....

              Wird der Taster für 1 sec gedrückt schaltet sich das Licht für 60 sec an.
              Drückt man den Tast >1 sec dann brennt das Licht für 120 sec und drückt
              man länger als 2 sec brennt das Licht für 5 Minuten.....

              Code:
              // ************************ Treppenhauslicht *******************************************
              
              rule "Taster Zaehler Ein"
              when
              		Item Schalter_Treppenhaus received command ON
              then
              		logInfo("Demo.rules", "Rule ausgeloest")
              		millisAgoAn=now.getMillisOfDay()
              		An.postUpdate(millisAgoAn)
              end
              
              // ************************ Treppenhauslicht *******************************************
              
              rule "Taster Zaehler AUS"
              when
              		Item Schalter_Treppenhaus received command OFF
              then
              		logInfo("Demo.rules", "Rule ausgeloest")
              		millisAgoAus=now.getMillisOfDay()
              		Aus.postUpdate(millisAgoAus)
              		dauer = millisAgoAus-millisAgoAn
              		Laufzeit.postUpdate(dauer)
              		if (dauer < 1000) {
              					sendCommand(Licht_Treppenhaus, ON)
              					timer3 = createTimer(now.plusSeconds(60)) [|
              					sendCommand(Licht_Treppenhaus, OFF)
              					]
              					timer3 = null
              						}
              		if (dauer > 1000 && dauer < 2000) {
              					sendCommand(Licht_Treppenhaus, ON)
              					timer3 = createTimer(now.plusSeconds(120)) [|
              					sendCommand(Licht_Treppenhaus, OFF)
              					]
              					timer3 = null
              		}
              		if (dauer > 2000) {
              					sendCommand(Licht_Treppenhaus, ON)
              					timer3 = createTimer(now.plusSeconds(500)) [|
              					sendCommand(Licht_Treppenhaus, OFF)
              					]
              					timer3 = null
              		}
              end

              Kommentar

              Lädt...
              X