Seite 1 von 1

Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 20. Mär 2020 15:22
von Boris099
Ich möchte für mein Alarmanalage rule eine zeitliche Verzögerung einbauen.
Wie gehe ich denn da vor?

das ist die IF-Abfrage mit der das rule losrennt

Code: Alles auswählen

    if(E_Touch10_2.state == OFF) {           
        logInfo("bw_alarm","Alarmanlage aus, Rule Ende!")	
        return;										
    }
nun würde ich gerne die Aktivierung des Switch E_Touch10_2, oder die Aktivierung des rule an sich, um 3 Minuten verzögern, geht das?

Re: Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 20. Mär 2020 15:33
von Darkwin101
na mit einem Timer und bitte poste die ganze rule eventuell kann mann auch einiges eleganter schreiben wenn z.B. solche Leute wie Udo1Toni drüber schauen. Es ist immer schwer etwas zu beurteilen wenn mann nur Code Schnipsel hat und den Kontext nicht kennt.

Re: Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 20. Mär 2020 16:40
von Boris099
OK,
also die eigentliche Aktivierung ist mit dem Switch E_Touch10_2.state == OFF

Code: Alles auswählen

import java.util.List																			
var List<Timer> timers = newArrayList                                                       	
var Timer shutoffTimer = null                                                               
var Timer LEDTimer1 = null                                                                  	
var Timer LEDTimer2 = null                                                                  	
var Timer SireneTimer1 = null																	
var DateTime lastRun = 0																		

rule "Rule Datei eingelesen"
when
    System started
then
    lastRun = now.minusMinutes(2)															
end

rule "Bewegung 5 mal in einer Minute"
when
    Member of gBW changed from OFF to ON
then
    if(MailSenden.state == ON) {                                                               
        val mailText = "Bewegungsmelder " + triggeringItem.name + " hat ausgelöst"				
        mailActions.sendMail("xxxx@gmail.com","Alarm "+ triggeringItem.name, mailText)																								
    }																							
    if(TelegramSenden.state == ON) {                                                           
	val telegramAction = getActions("telegram","telegram:telegramBot:xxxx")				
        telegramAction.sendTelegram("Bewegungsmelder An  - %s", triggeringItem.name)			
    }																							
                                                                                               
    if(E_Touch10_2.state == OFF) {                                                              
        logInfo("bw_alarm","Alarmanlage aus, Rule Ende!")										
        return;																					
    }																							
                                                                                              
    if(LEDTimer1 === null) {                                                                    
        gLED.sendCommand(ON)                                                                 	
        LEDTimer1 = createTimer(now.plusSeconds(7), [ |                                        
            gLED.sendCommand(OFF)																
            LEDTimer1 = null																	
        ] )																						
    }																							
    if(SireneTimer1 === null) {                                                                
        Sirene_Gaeste.sendCommand(ON)                                                          
        SireneTimer1 = createTimer(now.plusSeconds(1), [ |                                 		
            Sirene_Gaeste.sendCommand(OFF)														
            SireneTimer1 = null																	
        ] )																						
    }																							
    if(shutoffTimer !== null) {                                                                 
        logInfo("bw_alarm","Alarm schon aktiv, Rule Ende!")									
        return;																					
    }															
    if(lastRun.isAfter(now.minusMinutes(2))) {                                              
        logInfo("bw_alarm","letzter Alarm vor weniger als 2 Minuten, Rule Ende!")				
        return;																					
    }																							
                                                                                              
    if(timers.size < 5) {                                                                      
        val t = createTimer(now.plusMinutes(1), [ |												
        timers.remove(0)																	
        ] )																					
        timers.add(t)																		
    }																							
    if(timers.size == 5) {                                                                     
        if(MailSenden.state == ON) {                                                            
	val mailActions = getActions("mail","mail:smtp:xxxx")								
	mailActions.sendMail("xxx@gmail.com","Sirene aktiviert ", "Sirene ON")		
        }																						
        if(TelegramSenden.state == ON) {                                                      
	val telegramAction = getActions("telegram","telegram:telegramBot:xxxx")				
        telegramAction.sendTelegram("Sirene AN")												
        }																						
        Sirene_Gaeste.sendCommand(ON)															
		
        LEDTimer2 = createTimer(now.plusMillis(10), [ |                                         
            if(gLED.state != ON) {                                                       		
                gLED.sendCommand(ON)                                                     		
                LEDTimer2.reschedule(now.plusSeconds(3))                                        
            } else {                                                                            
                gLED.sendCommand(OFF)                                                    		
                LEDTimer2.reschedule(now.plusSeconds(3))                                       
            }																				
        ] )																						
        lastRun = now																			
        while(timers.size > 0) {																
            timers.get(0).cancel																
            timers.remove(0)																	
        }																						
        shutoffTimer = createTimer(now.plusSeconds(90), [ |                                     
            Sirene_Gaeste.sendCommand(OFF)						
            logInfo("Alarmrule", "Sirene Ende")													
            LEDTimer2?.cancel                                                                   
            LEDTimer2 = null																	
            if(gLED.state != OFF)                                                        		
     	    gLED.sendCommand(OFF)                                                    		
            shutoffTimer = null																	
        ] )																						
    }																							
end				

Re: Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 21. Mär 2020 12:55
von udo1toni
Ich erinnere mich an die Rule :)

Du solltest den Alarm Switch E_Touch10_2 durch ein Proxy Item ersetzen. Das Proxy Item wiederum schaltest Du über eine Rule ein und aus. Das Einschalten verzögerst Du mittels Timer um drei Minuten.

Re: Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 21. Mär 2020 16:39
von Boris099
Proxy Item? Ups da muss ich erst Mal recherchieren, habe ich noch nie was von gehört...

Da fällt mir noch was ein, wenn der Alarm nun ausgelöst wird, kann ich den Alarm eigentlich mit dem Deaktivieren des Switch, momentan noch ohne Proxy und später mit Proxy, ausschalten?

Oder ist ein Proxy Item ein Dummy Item?

Re: Verzögerung für die Aktivierung eines rules (Alarm)

Verfasst: 21. Mär 2020 18:57
von udo1toni
Ein Proxy Item ist ein Item ohne Bindung an einen Channel. Es wird eingesetzt, um Signale über einen Umweg an andere Items weiterzugeben. Wenn Du über *.items Dateien konfigurierst, lässt Du einfach den Teil in den geschweiften Klammern {} weg.