Seite 1 von 1

Time Cron problem täglich

Verfasst: 13. Jan 2022 20:56
von LDG
Hallo zusammen,
lang ist her das ich hier was erfragt habe aber nun komme ich seit ein paar Tagen nicht weiter.

Situation:
Ich habe einen IRobot Roomba den ich leider über das Irobot bindig nicht ansteuern kann. Nun hat bei mir der Weg aber über die Amazon Alexa funktioniert. Nun dachte ich mir, damit ich ein wenig mehr Übung im Regeln schreiben bekomme, dass ich den Staubsaugroboter über Openhab täglich gegen Mittag starten lasse.

Er soll täglich um 11 Uhr fahren udn dann auch die beiden Philipss Bewegungsmelder ausschalten, damit die nicht das Licht einschalten wenn er drunter her fährt( Schon tagelang passiert bis ich dahinter kam :lol: )
Der Timer unten drunter ist dafür da, dass er nach 3900 sek( 65 min) die beiden Bewegungsmelder wieder einschaltet.

Folgenden Code hatte ich mir überlegt:

Code: Alles auswählen

var Timer tguenni=null

rule "Guenni Staubsaugen"
when
	Time cron "0 0 11 1/1 * ? *"
then
	tguenni?.cancel
	if(WZ_Guenni_Nicht==OFF)								// Manueller Schalter falls ich mal zuhause bin morgens
	{
		if(WZ_Guenni.state== OFF)							
		{
		WZ_Guenni.sendCommand(ON)							// Schalter welcher An Alexa das Ein signal schickt
		K_BM_Betrieb.sendCommand(OFF)						// Küche Bewegungsmelder
		WZ_BM_Betrieb.sendCommand(OFF)						// Wohnzimmer Bewegungsmelder
		}
		else
		{
			tguenni=createTimer(now.plusSeconds(3900),[|
					if(K_BM_Betrieb.state != ON)
					{
						K_BM_Betrieb.sendCommand(ON)
					}
					if(WZ_BM_Betrieb.state != ON)
					{
						WZ_BM_Betrieb.sendCommand(ON)
					}
			])
		}
	}
end
Ich vermute mal das der Trigger oben nicht richtig läuft. Im Log steht leider nichts ausser das die Regel normal reingeladen wurde. Wenn ich den Schalter WZ_Guenni per Sitemap auf dem Handy auswähle fährt er los und der Schalter schaltet wie ein Taster wieder zurück.

log:

Code: Alles auswählen

2022-01-13 18:29:35.656 [WARN ] [g.icalendar.internal.handler.PullJob] - Download of calendar failed.
2022-01-13 19:54:31.573 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Guenni_Staubsaugen.rules'
2022-01-13 19:54:33.177 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'Guenni_Staubsaugen.rules'
Vielen Dank im vorraus für eure Hilfe.

LDG

Re: Time Cron problem täglich

Verfasst: 13. Jan 2022 21:12
von int5749
Also,

zunächst einmal ist Deine cron expression falsch ;)

Code: Alles auswählen

0 0 11 1/1 * ? *
bedeutet => At 11:00:00am, every day starting on the 1st, every month
Somit müsstest Du bis zum nächsten 1. (also nun 1. Februar) warten.

Jeden Tag um 11:00 Uhr wäre

Code: Alles auswählen

0 0 11 ? * * *
Ich nutze dafür gerne einen => cron-expression-generator 8-)
Loading model 'Guenni_Staubsaugen.rules'
bedeutet nicht, das die Regel geladen wurde, aber die Datei zeigt zumindest keine auffälligen Fehler die eine Abarbeitung verhindern würden.

Optimierung (für 2 Items braucht es evtl. noch keine Gruppe) aber wenn Du nur einen Befehl ausführen möchtest, sollte anstatt

Code: Alles auswählen

if(K_BM_Betrieb.state != ON) {
	K_BM_Betrieb.sendCommand(ON)
}
auch einfach

Code: Alles auswählen

if(K_BM_Betrieb.state != ON) K_BM_Betrieb.sendCommand(ON)
funktionieren.

Ich arbeite für die erste Testphasen auch gerne mit einem TestSwitch zum triggern.
Also z.B.

Code: Alles auswählen

rule "Guenni Staubsaugen"
when
	Item TestSwitch changed from OFF to ON or
	Time cron "0 0 11 ? * * *"
then
Wenn alles läuft kann die Zeile mit dem TestSwitch (der natürlich als Item angelegt sein muss) im Anschluß gelöscht werden.

Viele Grüße

Re: Time Cron problem täglich

Verfasst: 13. Jan 2022 21:20
von LDG
Vielen Dank für die wirklich schnelle Rückmeldung.

Das der Time Cron falsch ist habe ich mir schon fast gedacht. Ich habe ihn mit http://www.cronmaker.com/;jsessionid=no ... 12.node0?0
erstellt aber ich denke dann nutz ich in Zukunft deinen link.

Was den Code angeht hast du recht es geht auch ohne die geschweiften Klammern aber so habe ich es ordentlich, überall gleich und ich habe es so gelernt weil der Lehrer bei mir in der Schule das genauso haben will.


Das mit dem Testswitch werde ich dann in 2 Wochen ausprobieren, wenn ich die Shellys für die Jalousie verdrahte und anschließe.

Re: Time Cron problem täglich

Verfasst: 14. Jan 2022 19:40
von udo1toni
Also, zunächst mal ist der Time cron Ausdruck nicht wirklich falsch :) 1/1 heißt halt "ab 1 Schrittweite 1". Das funktioniert auch, wenn die Rule erst am 13. angelegt wird. Da aber das Feld schlicht keine Rolle spielt, ist der * hier tatsächlich sinnvoller. Ob man nun schreibt "Egal welcher Wochentag" oder "Egal welcher Tag im Monat" ist vor allem Geschmacksache, zumindest, wenn weder das eine noch das andere Feld eine Rolle spielen soll. Time cron Ausrücke (bei Quartz cron!) müssen nämlich zwingend exakt ein Fragezeichen enthalten, entweder auf dem Wochentagsfeld oder auf dem Tagesfeld. Mit dieser Schreibweise soll verdeutlicht werden, dass es nicht möglich ist, einen solchen Time cron Trigger zu schreiben: Time cron "8 9 10 13 * FRI" (übersetzt: Um 10:09:08 Uhr an jedem Freitag, dem 13.)
Das Jahr ist optional. WEnn man also einen Time cron Ausdruck erstellt, bei dem das Jahr keine Rolle spielt, muss man keinen Stern am Ende schreiben, sondern kann diesen einfach weg lassen. das ergibt also als Time cron Ausdruck "0 0 11 * * ?" für "Täglich um 11:00:00 Uhr" - wie gesagt kann man auch das Fragezeichen auf die vierte Position setzen und auf der 6. Position ein Sternchen schreiben, also "0 0 11 ? * *" , ist beides gleichbedeutend. Letztere Variante hat den Vorteil, dass man vielleicht den Sonntag ausklammern möchte und dann nur den letzten Stern durch ein MON-SAT ersetzen muss:
"0 0 11 ? * MON-SAT" -> Montags bis Samstags um 11:00:00 Uhr.

Du hast In Deiner Rule noch einen Fehler. Die Rule triggert einmal täglich um 11:00:00 Uhr, prüft, ob die Automatik aktiv ist, falls das der Fall ist, prüft die Rule, ob WZ_Guenni aktiv ist, ist das nicht der Fall, wird WZ_Guenni aktiviert und die Bewegungsmelder abgeschaltet. ist er aktiv, wird stattdessen ein Timer gestartet, der die Bewegungsmelder nach 3900 Sekunden aktiviert. In Wirklichkeit willst Du den Roboter starten, die Bewegungsmelder deaktivieren und diese nach der Zeitspanne wieder aktivieren, also so:

Code: Alles auswählen

var Timer tguenni=null

rule "Guenni Staubsaugen"
when
    Time cron "0 0 11 * * ?"                                            // täglich 11:00:00 Uhr
then
    tguenni?.cancel                                                     // Timer löschen, falls vorhanden
    if(WZ_Guenni_Nicht == OFF && WZ_Guenni.state == OFF) {
        WZ_Guenni.sendCommand(ON)                                       // Schalter welcher An Alexa das Ein signal schickt
         K_BM_Betrieb.sendCommand(OFF)                                  // Küche Bewegungsmelder
        WZ_BM_Betrieb.sendCommand(OFF)                                  // Wohnzimmer Bewegungsmelder
        tguenni = createTimer(now.plusMinutes(65), [ |                  // Timer starten
            if(K_BM_Betrieb.state != ON)   K_BM_Betrieb.sendCommand(ON) // Bewegungsmelder reaktivieren
            if(WZ_BM_Betrieb.state != ON) WZ_BM_Betrieb.sendCommand(ON) // Bewegungsmelder reaktivieren
        ])
    }
end

Re: Time Cron problem täglich

Verfasst: 15. Jan 2022 13:20
von LDG
Hallo Udo, vielen dank auch für deine Rückmeldung. Nach dem verändern des Time cron lief es immernoch nicht. Mal schauen ob es an dem von dir entdeckten Fehler noch liegt.

Re: Time Cron problem täglich

Verfasst: 22. Jan 2022 17:20
von LDG
Hallo zusammen,
ich bins wieder.... leider mit keinen Guten Nachrichten. Die Regel läuft trotzdem nicht und startet den Staubsaugroboter nicht. Wenn ich den Schalter per hand betätige fährt er allerdings los... Der Schalter geht dann auch alleine wieder zurück auf aus.

Openhab habe ich auch schon einmal neu gestartet...

Habt ihr evtl noch eine Idee?

Re: Time Cron problem täglich

Verfasst: 22. Jan 2022 18:57
von udo1toni
Ach Mist... Ich habe gerade noch einen Fehler gesehen... Im ersten if() prüfst Du auf WZ_Guenni_Nicht == OFF. Vermutlich ist WZ_Guenni_Nicht ein Item? Dann muss es natürlich WZ_Guenni_Nicht.state == OFF heißen...

Re: Time Cron problem täglich

Verfasst: 23. Jan 2022 09:11
von LDG
Guten Morgen Udo,

ja genau WZ_Guenni_nicht ist ein Item... ich habe es mal berichtigt und warte nun auf den 11 Uhr trigger.

Edit: 09.13 Uhr
handelt es sich eig bei dem Timer um einen globalen Timer den ich auch aus einer anderen Regel aus aufrufen kann? oder nur um einen lokalen.
ICh habe für jede Regel eine extra .rules angelegt. Daher kam mir gerade die Frage zu dem Timer auf.

Re: Time Cron problem täglich

Verfasst: 23. Jan 2022 17:01
von udo1toni
Du kannst den Timer ja nicht "aufrufen". Du kannst nur beim Anlegen des Timers (genauer: des Scheduler Eintrags) einen Zeiger auf diesen Eintrag in einem Objekt speichern. Dieses Objekt muss global definiert werden, um es sinnvoll zu nutzen. Global bedeutet allerdings im Zusammenhang mit openHAB nicht zwingend "uneingeschränkt". Globale Variablen gelten innerhalb der Datei, in der sie definiert werden.
Wenn Du also mehrere Rules hast, die auf einen Timer zugreifen sollen (über den Zeiger, der in der Timer Variablen gespeichert wird), so musst Du all diese Rules in einer Datei speichern.