Seite 1 von 1

[SOLVED)Timer restart - aber nur die laufenden

Verfasst: 18. Dez 2021 13:50
von Boris099
Ich habe hier ein Rule welches mit
- mehreren trigger items
- mehrere items schaltet

Wenn das item != ON wird es eingeschaltet und ein Timer gesetzt
Ein Timer pro item verhindert dabei, dass manuell aktivierte items nicht beeinflusst werden.

Mein Problem:
Wenn nun einer der trigger items geschaltet wird, sollen genau die laufenden Timer
zurückgesetzt und damit praktisch verlängert werden - aber nicht alle Timer

Geht das?

Code: Alles auswählen

var Timer LED_Nachbar_Timer = null
var Timer LED_GVorne_Timer = null
var Timer LED_GWald_Timer = null

rule "Einfahrt_Licht"
when
        Item DW2_TOR received update ON or
        Item S_Touch90_1 received update ON or
        Item zwave_device_6c898019_node8_scene_number received update 4
then
        if(Nacht != OFF) {
                if(LED_Nachbar.state != ON) {
                LED_Nachbar.sendCommand(ON)
                LED_Nachbar_Timer = createTimer(now.plusSeconds(240), [|
                LED_Nachbar.sendCommand(OFF)
                ])
                }
                if(LED_GVorne.state != ON) {
                LED_GVorne.sendCommand(ON)
                LED_GVorne_Timer = createTimer(now.plusSeconds(240), [|
                LED_GVorne.sendCommand(OFF)
                ])
                }
                if(LED_GWald.state != ON) {
                LED_GWald.sendCommand(ON)
                LED_GWald_Timer = createTimer(now.plusSeconds(240), [|
                LED_GWald.sendCommand(OFF)
                ])
                }
        }
end

Re: Timer restart - aber nur die laufenden

Verfasst: 19. Dez 2021 01:38
von udo1toni
Ja, das geht sogar ganz leicht.

Code: Alles auswählen

var Timer LED_Nachbar_Timer = null
var Timer LED_GVorne_Timer  = null
var Timer LED_GWald_Timer   = null

rule "Einfahrt Licht"
when
    Item DW2_TOR     received update ON or
    Item S_Touch90_1 received update ON or
    Item zwave_device_6c898019_node8_scene_number received update 4
then
    if(Nacht.state != OFF) {
        if(LED_Nachbar_Timer !== null)
            LED_Nachbar_Timer.reschedule(now.plusSeconds(240))
        if(LED_Nachbar.state != ON) {
            LED_Nachbar.sendCommand(ON)
            LED_Nachbar_Timer = createTimer(now.plusSeconds(240), [|
                LED_Nachbar.sendCommand(OFF)
                LED_Nachbar_Timer = null
            ])
        }
        if(LED_GVorne_Timer !== null)
            LED_GVorne_Timer.reschedule(now.plusSeconds(240))
        if(LED_GVorne.state != ON) {
            LED_GVorne.sendCommand(ON)
            LED_GVorne_Timer = createTimer(now.plusSeconds(240), [|
                LED_GVorne.sendCommand(OFF)
                LED_GVorne_Timer = null
            ])
        }
        if(LED_GWald_Timer !== null)
            LED_GWald_Timer.reschedule(now.plusSeconds(240))
        if(LED_GWald.state != ON) {
            LED_GWald.sendCommand(ON)
            LED_GWald_Timer = createTimer(now.plusSeconds(240), [|
                LED_GWald.sendCommand(OFF)
                LED_GWald_Timer = null
            ])
        }
    }
end
Wichtig ist halt, dass der Timer beim Ablaufen korrekt deinitialisiert wird (also auf null gesetzt wird). Beim Vergleich mit null muss der Operator === bzw. !== verwendet werden.

Re: Timer restart - aber nur die laufenden

Verfasst: 19. Dez 2021 11:26
von Boris099
Ah OK, Du setzt also die Timer bei jedem Triggern einfach zurück und dazu ein reschedule, und das ist unabhängig vom Zustand der Lampen.
Dann Laufen die Timer, aber das tangiert die Lampen nicht wenn sie schon an waren, denn der zweite Teil fürs Ausschalten kommt ja nicht zum Zug.
Das ist gar nicht schlecht 8-) würde ich behaupten

BTW:
Ich habe jedoch jetzt noch ein kleines Problem mit der "Nacht" die wird nicht geschaltet, aber das hänge ich am Besten noch an den anderen
Beitrag mit dem Astro Binding dran, da gehört das ja hin...

Re: [SOLVED)Timer restart - aber nur die laufenden

Verfasst: 19. Dez 2021 13:42
von udo1toni
Nein, das Problem in Deiener Rule ist, dass Du nicht auf den Status des Items zugreifst, sondern auf das Item selbst (ich gehe davon aus, dass Du ein Item namens Nacht hast). Da Du mit != OFF vergleichst, ist diese Bedingung immer erfüllt, denn das Item liefert immer etwas anderes als OFF zurück ;) Mit dem (in der Rule oben angegebenen) Nacht.state sollte es funktionieren...

Re: [SOLVED)Timer restart - aber nur die laufenden

Verfasst: 19. Dez 2021 14:50
von Boris099
Das mit dem .state hate ich schon geändert, ja das war nach dem Zeitpunkt.
Aber der Channel den ich für den Morgen gewählt habe, der hat nicht getriggert. Im Log sehr ich aber andere Channels obwohl ich die deaktiviert habe,. Sehr komisch

Im anderen Beitrag habe ich das detailliert dargestellt.
Ich glaube ich mach Mal noch einen Neustart.