Rule Trigger detektieren

Alle Infos und Tipps speziell zu openHAB 2

Moderatoren: seppy, udo1toni

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

Rule Trigger detektieren

Beitrag von Heavy-Dee » 15. Mai 2019 09:37

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.3.0.005) auf Synology DS216II [+Mosquitto MQTT (v. 1.4.14-9)]

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

Re: Rule Trigger detektieren

Beitrag von peter-pan » 15. Mai 2019 11:15

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.

Benutzeravatar
udo1toni
Beiträge: 1259
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Rule Trigger detektieren

Beitrag von udo1toni » 17. Mai 2019 13:01

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste