Rule Trigger detektieren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Heavy-Dee
Beiträge: 139
Registriert: 18. Jan 2018 16:38

Rule Trigger detektieren

Beitrag von Heavy-Dee »

Hallo zusammen,

Ich habe eine Rule die über Cron zu zwei Zeiten (6:00 u. 18:00) durchgeführt wird. In dieser Rule werden als erstes verschiedene Parameter überprüft und dann entsprechende Aktionen durchgeführt. (wenn die Parameter erfüllt sind).
Allerdings sollen je nach Ausführungszeit unterschiedliche Variablen benutzt werden. (z.B. 6:00 -> optDurationMorning = 12min u. 18:00 -> optDurationEvening = 18min).
Bisher habe ich zwei einzelne Rules benutzt. Diese möchte ich jetzt optimieren, da die Vorraussetzungen bei beiden gleich sind.

Kann ich in einer Rule den auslösenden Trigger detektieren und so entsprechende Variablen verwenden?

Code: Alles auswählen

rule "AUTO-Bewässerung - morgens"
when
	Time cron "0 00 6 * * ?"	OR
	Time cron "0 00 18 * * ?"
then
    if (autoBewaesserung.state == OFF) 
    {                   
        //Die Automatische Bewässerung ist deaktiviert.
        logInfo(filename,"AUTO-Bewässerung: -> deaktiviert!")
        return
    }

    if (autoBewaesserung.state == ON) 
    {
        var boolean delay1day = false

	// Es hat gestern geregnet min. 4mm
	if (RainYesterday.state >= minPrecip)
	{
            delay1day = true
        }
        // Es hat heute geregnet min. 4mm;
	if (RainToday.state >= minPrecip) 
	{
            delay1day = true
        }
        // Regen im Forecast min. 4mm
        if (RainForecast.state >= minPrecip) 
	{
            delay1day = true
	}
        // Regenwahrscheinlichkeit im Forecast min. 60%
        if (PrecipForecast.state >= minPrecipPercent) 
	{
            delay1day = true
	}
        // ScaleFaktor zu niedrig min. 5
        if (vScaleFactor < minScaleFactor) 
	{
            delay1day = true
	}	

	// Wenn "delay1day" gesetzt
        if (delay1day) 
	{  
		logInfo(filename,"AUTO-Bewässerung: -> keine Bewässerung nötig!")
		return
        }
	else
	{
		// in die tatsächlichen Laufzeiten umrechnen (durch Anwendung des Skalierungsfaktors)
		var int optDuration = ((nomDuration * vScaleFactor) / 100).intValue
		
		// anpassen der opt. Laufzeit an die prozentuale Verteilung morgens/abends
		var int optDurationMorning = (probDurationMorning * optDuration).intValue
		var int optDurationEvening = (probDurationEvening * optDuration).intValue

*) an dieser Stelle sollte die CronZeit abgefragt werden.
If (Time cron "0 00 6 * * ?")
{
var int actDuration = optDurationMorning.intValue
}
If (Time cron "0 00 18 * * ?")
{
var int actDuration = optDurationEvening.intValue
}

Code: Alles auswählen

		// Bewässerung starten
		Sonoff_45CD46.sendCommand(ON)

		if(BewTimer === null) 
		{
			BewTimer = createTimer(now.plusMinutes(actDuration), 
			[|
				Sonoff_45CD46.sendCommand(OFF)
				logInfo(filename,"AUTO-Bewässerung: -> beendet!")
			])
		}
		else 
		{
			BewTimer = null
			BewTimer.reschedule(now.plusMinutes(5)) 
			logInfo(filename,"AUTO-Bewässerung: -> Neustart wartet!")
		}
	}
    }
end
wäre Nett wenn mir jmd sagen könnte ob und wie das zu realisieren wäre.
openHab2 (v. 2.5.2) Docker auf Synology DS920+
openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

Benutzeravatar
peter-pan
Beiträge: 2564
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Rule Trigger detektieren

Beitrag von peter-pan »

Ich habe in der Rules-Doku nichts gefunden, was die Benutzung impliziter Variablen für Cron-Trigger betrifft. Aber vielleicht hilft dir dieser Link weiter. Da wird mit "now.isBefore" und "now.isAfter" gearbeitet.

Ich benutze so etwas ähnliches auch in einer Regel, aber bitte frag mich nicht, wie das genau funktioniert. Ich hab zwar verstanden, dass hier was umgewandelt wird, aber letzlich hab ich die Syntax auch nur geklaut. Hier ein Snippet aus der Rule mit Link-Verweis auf den Original-Post:

Code: Alles auswählen

.....
      if(now.isBefore((Sunset_Time_Test.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)) { // https://community.openhab.org/t/solved-datetimetype-is-deprecated/37296/31
          logInfo("homematic ", "now {} is before {} ", now, Sunset_Time_Test.state)
          return;
      }
      Sonoff_Pow_02.sendCommand(ON)
end
Vielleicht kannst du damit was anfangen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.1 openhabian

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule Trigger detektieren

Beitrag von udo1toni »

Es gibt triggeringItem als implizite Variable. Die wird gesetzt, wenn die Rule durch ein Item getriggert wurde. Hier ist das nicht der Fall, aber Du kannst natürlich prüfen, welche der beiden Trigger erfüllt sein kann:

Code: Alles auswählen

if(now.getHourOfDay == 18) // der zweite Trigger hat ausgelöst
Wenn es genauer sein muss (weil vielleicht noch mehr Trigger dabei sind, die ebenfalls nicht über triggeringItem detektierbar sind), kannst Du die Zeit auch sekundengenau überprüfen:

Code: Alles auswählen

if(now.getSecondOfDay == 18*60*60) // der zweite Trigger hat ausgelöst
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten