Seite 4 von 14
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 11:23
von int5749
mike69 hat geschrieben: ↑2. Dez 2021 11:19
Werde mal das Backup von gestern oder das 2.5.12er Backup rüberbügeln, aber erst heute Abend, muss gleich zur Schicht.
Ähmm, aber nur die Rules, oder? Nicht, das Du ein altes Backup in Deine OH 3 Konfig zurücksicherst??
Mit den wachsenden Informationen bestätigt sich Peter's Verdacht: Bei Dir wir die Variable nicht gefüllt.
Such mal im Log nach intStAdvent, denn diese müsste ja bei einem Systemstart gefüllt werden.
Bei ist es für den Test natürlich alles in einer Rule.
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 11:33
von mike69
peter-pan hat geschrieben: ↑2. Dez 2021 11:06
Ich könnte mir vorstellen, dass die Variable "intStAdvent" evtl. keinen Wert enthält bei dem Vergleich "Grösser als". Mach einfach mal einen Log vor der If-Bedingung in der Regel test-2, z.B.:
und/oder ersetze mal die Variable "intStAdvent" in der If-Bedingung mit einem Wert, z.B.: 331.
Hab noch paar Minuten
mit einem vorgegebenen Wert wird geschaltet.

Hier der log:
Code: Alles auswählen
2021-12-02 11:25:30.187 [INFO ] [org.openhab.core.model.script.x-mas ] - intStAdvent ist: null
2021-12-02 11:25:40.186 [INFO ] [org.openhab.core.model.script.x-mas ] - intStAdvent ist: null
2021-12-02 11:25:50.186 [INFO ] [org.openhab.core.model.script.x-mas ] - intStAdvent ist: null
Rule:
Code: Alles auswählen
var int intStAdvent
rule "Feiertage" when
Time cron "5 0 0 * * ?" or
System started
then
intStAdvent = LocalDate.now.withMonth(12).withDayOfMonth(25).getDayOfYear - (now.withMonth(12).withDayOfMonth(25).getDayOfWeek.getValue +27)
// intStAdvent = parse(now.getYear + "-12-25").minusDays(((parse(now.getYear + "-12-25").getDayOfWeek) + 28)).getDayOfYear + 1 // Montag vor 1. Advent
end
rule "Weihnachtslicht ein"
when
Time cron "0/20 * * * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > 331) {
logDebug("x-mas","Weihnachtsbeleuchtung ein.")
logInfo("x-mas","intStAdvent ist: {}", intStAdvent)
delock05.sendCommand(ON)
}
end
rule "Weihnachtslicht aus"
when
Time cron "10/20 * * * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > 331) {
logDebug("x-mas","Weihnachtsbeleuchtung aus.")
logInfo("x-mas","intStAdvent ist: {}", intStAdvent)
delock05.sendCommand(OFF)
}
end
irgendwie wird der "intStAdvent" nicht errechnet.

Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 11:44
von mike69
int5749 hat geschrieben: ↑2. Dez 2021 11:23
Ähmm, aber nur die Rules, oder? Nicht, das Du ein altes Backup in Deine OH 3 Konfig zurücksicherst??
Die alten Rules sind alle in ein extra Ordner unter /rules/old, die tausche ich schon fleissig hin und her.
Kann mir vorstellen, das in OH3 irgendwas quer liegt, deswegen ein komplettes recovern.
Such mal im Log nach intStAdvent, denn diese müsste ja bei einem Systemstart gefüllt werden.
Bei ist es für den Test natürlich alles in einer Rule.
Nope, kein Logeintrag ausser wie gehabt. Weder event.log oder openhab.log
Dein Test habe ich noch nicht ausgeführt, muss jetzt los. Melde mich eventuell heute Abend, wenn die Familie es zulässt.
Danke schonmal für die Inputs.
Mike
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 12:34
von peter-pan
Fakt ist nun, dass die Variable den Wert nicht enthält. D.h. dass die Regel, die die globale Variable setzt nicht gelaufen ist. Das sagt der Log, den Mike in die zweite Regel eingebaut hat und anstatt der Variablen auf den Wert 331 vergleicht.
Ob alles ok ist, kannst du testen, wenn du die erste Regel (globale Variable setzen) händisch (evtl. mit Testschalter) anlaufen lässt und dann danach die zweite und dritte Regel (auch händisch).
aber vielleicht gibt es ja eine Möglichkeit, dass in eine Regel zu packen. Ich mach mir mal ein paar Gedanken.
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 14:32
von int5749
Also, mir hat dies keine Ruhe gelassen und ich habe alles in eine neue xmas.rules verschoben.
Natürlich war die Var beim speichern der Rules leer und es hagelte den bekannten Fehler.
Also einen Restart gemacht (ist ja keiner zu Hause) und dann arbeitet es wie gewünscht.
2021-12-02 14:19:39.675 [INFO ] [.core.internal.i18n.I18nProviderImpl] - Time zone set to 'Europe/Berlin'.
2021-12-02 14:20:10.490 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'xmas.rules'
2021-12-02 14:20:51.605 [INFO ] [org.openhab.core.model.script.XMAS ] - Jahrestag des 1.Advent: 332
2021-12-02 14:21:22.561 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung ein.
2021-12-02 14:21:30.581 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung aus.
2021-12-02 14:21:40.579 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung ein.
2021-12-02 14:21:50.580 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung aus.
2021-12-02 14:22:00.578 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung ein.
2021-12-02 14:22:10.580 [INFO ] [org.openhab.core.model.script.x-mas ] - Weihnachtsbeleuchtung aus.
Meine Rules Datei
Code: Alles auswählen
var int intStAdvent
rule "Get 1. Advent"
when
Time cron "5 0 0 * * ?" or
Item vSystemRestart changed to ON or
System started
then
intStAdvent = LocalDate.now.withMonth(12).withDayOfMonth(25).getDayOfYear - (now.withMonth(12).withDayOfMonth(25).getDayOfWeek.getValue +21)
// intStAdvent = parse(now.getYear + "-12-25").minusDays(((parse(now.getYear + "-12-25").getDayOfWeek) + 28)).getDayOfYear + 1 // Montag vor 1. Advent
logInfo("XMAS", "Jahrestag des 1.Advent: {}", intStAdvent.toString)
end
rule "Weihnachtslicht ein"
when
Time cron "0/20 * * * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > intStAdvent) {
logInfo("x-mas","Weihnachtsbeleuchtung ein.")
}
end
rule "Weihnachtslicht aus"
when
Time cron "10/20 * * * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > intStAdvent) {
logInfo("x-mas","Weihnachtsbeleuchtung aus.")
}
end
Im Moment bin ich mit dem Latein am Ende und kann den Fehler nicht nachstellen

Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 17:16
von udo1toni
Also ein paar Dinge...
1. Bitte nach Möglichkeit Integer statt int verwenden. also var Integer intStAdvent. Grund: Integer definiert ein Objekt, int definiert ein Primitive. openHAB braucht für ein Primitive ungleich länger als für ein Objekt.
2. Inaktive Rules sollten tunlichst nicht in der Verzeichnis-Struktur gespeichert werden, allenfalls kannst Du sie in eine Datei verschieben, deren Endung nicht rules lautet, also z.B. rules/xmas.rules.old wäre ok, aber NICHT rules/old/xmas.rules, weil das Verhalten von openHAB hierfür nicht eindeutig definiert ist.
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 18:13
von int5749
udo1toni hat geschrieben: ↑2. Dez 2021 17:16
1. Bitte nach Möglichkeit
Integer statt
int verwenden. also
var Integer intStAdvent. Grund: Integer definiert ein Objekt, int definiert ein Primitive. openHAB braucht für ein Primitive ungleich länger als für ein Objekt.
So oft gelesen, aber ich nutze dies zu wenig um daran zu denken

Danke für den Hinweis
udo1toni hat geschrieben: ↑2. Dez 2021 17:16
2. Inaktive Rules sollten tunlichst nicht in der Verzeichnis-Struktur gespeichert werden, allenfalls kannst Du sie in eine Datei verschieben, deren Endung nicht rules lautet, also z.B. rules/xmas.rules.old wäre ok, aber NICHT rules/old/xmas.rules, weil das Verhalten von openHAB hierfür nicht eindeutig definiert ist.
Evtl. war das wording unglücklich gewählt. Ich habe eine neue xmas.rules angelegt und den Code aus der Test.rules per cut & paste verschoben.
Falls ich mal eine Rules ausser Dienst setze wird diese zunächst nach xyz.rulex umbenannt und wenn noch alles läuft gelöscht.
Natürlich gibt es keine Verzeichnisse unnterhalb von Rules und bei mir in keinem der Config-Folder.
Viele Grüße
Re: Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 20:41
von int5749
udo1toni hat geschrieben: ↑30. Nov 2021 19:59
Ja, die Formel stammt aus der Vor-Ephemeris-Zeit. Da ich aber sowohl für Ostersonntag (= alle beweglichen Feiertage) als auch für die Adventszeit funktionierenden Code habe und Ephemeris auch nicht eben selbsterklärend ist und dann doch einiges an Nacharbeit verlangt, sehe ich für mich hier keinen Vorteil.
Und deutlich weniger umfangrich ist die Formel auch nicht, aber einfach mal zur Ansicht.
Code: Alles auswählen
val String strSpecialday = '/etc/openhab/services/specialdays.xml'
val Long vEphemeris = Ephemeris.getDaysUntil(new DateTimeType().zonedDateTime.withDayOfYear(1), "FIRST_ADVENT", strSpecialday)+1
Viele Grüße
int5749
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 21:14
von peter-pan
Ich hab mich mal an einer Regel ohne globale Variable versucht. Es wird hier alles in einer Regel bearbeitet. Das ist jetzt nicht "optimiert", aber kann evtl. als Grundlage dienen:
Code: Alles auswählen
rule "Weihnachtsschaltung1"
when
// Item Dummy_4 changed to ON or // Test-Switch
Time cron "0 0 16 * * ? *" or
Time cron "0 30 20 * * ? *"
then
var vXMasDayNumber = LocalDate.of(now.year,12,24).getDayOfYear() // Heiligabend - Tag des Jahres - Day of the Year
var vWeekDayXMAS = LocalDate.of(now.year,12,24).getDayOfWeek().getValue // Heiligabend - Christmas eve - Wochentag - Day of the Week
if (vWeekDayXMAS == 7) vWeekDayXMAS = 0 // Wenn Sonntag, dann Heiligabend und 4.Advent gleich - if Christmas eve is Sunday it equals to 4. Advent
var vFirstAdventDate = LocalDate.of(now.year,12,24).withDayOfYear(vXMasDayNumber - vWeekDayXMAS - 21) // 1. Advent
var vFirstAdventDay = vFirstAdventDate.getDayOfYear // Tag-Nr. 1. Advent
// logInfo("advent1", "1.Advent ist am {} Tag des Jahres", vFirstAdventDate)
var vMemorialDayDate = LocalDate.of(now.year,12,24).withDayOfYear(vXMasDayNumber - vWeekDayXMAS - 28) // Totensonntag
var vMemorialDayDay = vMemorialDayDate.getDayOfYear // Tag-Nr. des Totensonntag
val vHourMinute = now.toLocalTime().getHour.toString + now.toLocalTime().getMinute.toString // Stunde + Minute für Vergleich ob Ein- oder Ausschaltzeit (Minute kann ggf. weggelassen werden)
// Ist es Weihnachtszeit ?
if (now.getDayOfYear < 7 || now.getDayOfYear > vMemorialDayDay) {
// Ist es Einschaltzeit ? -> an Cron anpassen
if (vHourMinute == "1600") {
if (Dummy_5.state != ON) {
Dummy_5.sendCommand(ON)
logInfo("advent1", "Beleuchtung eingeschaltet {}", Dummy_5.state)
}
}
// Ist es Ausschaltzeit ? -> an Cron anpassen
if (vHourMinute == "2030") {
if (Dummy_5.state != OFF) {
Dummy_5.sendCommand(OFF)
logInfo("advent1", "Beleuchtung ausgeschaltet {}", Dummy_5.state)
}
}
}
else {
logInfo("advent1", "Es ist keine Weihnachtszeit")
return;
}
end
Das "Dummy_5" musst du natürlich mit deinem "delock05" ersetzen und die Cron-Werte anpassen. Wahrscheinlich werden auch nicht alle Variablen benötigt.
Die zweite Version mit der Tagesermittlung auf der Vasis von Udo und int5749 könnte auch so aussehen:
Code: Alles auswählen
rule "Weihnachtsschaltung2"
when
Item Dummy_4 changed to ON // or // Test-Switch
// Time cron "0 0 16 * * ? *" or
// Time cron "0 0 22 * * ? *"
then
var intStAdvent = LocalDate.now.withMonth(12).withDayOfMonth(25).getDayOfYear - (now.withMonth(12).withDayOfMonth(25).getDayOfWeek.getValue +28)
val vHourMinute = now.toLocalTime().getHour.toString + now.toLocalTime().getMinute.toString // Stunde + Minute für Vergleich ob Ein- oder Ausschaltzeit (Minute kann ggf. weggelassen werden)
logInfo("Advent 2", "wert intAdvent ist {} ", intStAdvent)
// Ist es Weihnachtszeit ?
if (now.getDayOfYear < 7 || now.getDayOfYear > intStAdvent) {
// Ist es Einschaltzeit ? -> an Cron anpassen
if (vHourMinute == "1600") {
if (Dummy_5.state != ON) {
Dummy_5.sendCommand(ON)
logInfo("advent1", "Beleuchtung eingeschaltet {}", Dummy_5.state)
}
}
// Ist es Ausschaltzeit ? -> an Cron anpassen
if (vHourMinute == "2200") {
if (Dummy_5.state != OFF) {
Dummy_5.sendCommand(OFF)
logInfo("advent1", "Beleuchtung ausgeschaltet {}", Dummy_5.state)
}
}
}
else {
logInfo("advent1", "Es ist keine Weihnachtszeit")
return;
}
end
Auch hier müssen natürlich noch individuelle Anpassungen vorgenommen werden.
Re: [solved] Ein Newbie benötigt Hife bei einer Rule
Verfasst: 2. Dez 2021 22:12
von mike69
Nabend.
Frauchen is bei der Nachbarin, also sturmfreie Bude
udo1toni hat geschrieben: ↑2. Dez 2021 17:16
Also ein paar Dinge...
1. Bitte nach Möglichkeit
Integer statt
int verwenden. also
var Integer intStAdvent. Grund: Integer definiert ein Objekt, int definiert ein Primitive. openHAB braucht für ein Primitive ungleich länger als für ein Objekt.
2. Inaktive Rules sollten tunlichst nicht in der Verzeichnis-Struktur gespeichert werden, allenfalls kannst Du sie in eine Datei verschieben, deren Endung nicht rules lautet, also z.B. rules/xmas.rules.old wäre ok, aber NICHT rules/old/xmas.rules, weil das Verhalten von openHAB hierfür nicht eindeutig definiert ist.
Zu 1: wird geändert.

Zu 2: Wie bei int5749, Endung wird abgeändert, auf z. B.: *.rule_ oder *.item_. Die ganzen Prereleases oder nicht benötigten Configs werden mit mod. Endung in ein Unterordner verschoben, wegen der übersichtlichkeit. Hat bis jetzt keine erkennbaren Auswirkungen, alles in eine .txt Datei ist auch eine Möglichkeit. Jede Rule ist übrigens eine Datei. hier.
Jetzt das verrückte, mit der Rule von int5749 looft es auf einmal. Ein Restart von openhab und alles ist schön.
Meine raus gefunden zu haben, nach JEDER Änderung die christmas.rules braucht OH einen Neustart. Ohne ein Neustart gibt es die Fehlermeldung. Hat das mit dem Errechnen von intSTAdvent zu tun? Andere einfache Rules , die stumpf nach Zeit laufen brauchen keinen Neustart.
Jedenfalls ging pünktlich um 22 Uhr das Licht aus. Hab mir jetzt einen Wein verdient.
So sieht übrigens die Rule aus:
Code: Alles auswählen
var Integer intStAdvent
rule "Feiertage" when
Time cron "5 0 0 * * ?" or
System started
then
intStAdvent = LocalDate.now.withMonth(12).withDayOfMonth(25).getDayOfYear - (now.withMonth(12).withDayOfMonth(25).getDayOfWeek.getValue +27)
logInfo("XMAS", "intStAdvent: {}", intStAdvent.toString)
end
rule "Weihnachtslicht ein"
when
Time cron "0 0 16 * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > intStAdvent) {
logInfo("x-mas","Weihnachtsbeleuchtung an.")
gChristmas.sendCommand(ON)
}
end
rule "Weihnachtslicht aus"
when
Time cron "0 0 22 * * ?"
then
if (now.getDayOfYear < 7 || now.getDayOfYear > intStAdvent) {
logInfo("x-mas","Weihnachtsbeleuchtung aus.")
gChristmas.sendCommand(OFF)
}
end
@int5749
Ist der Schnipsel notwendig?
@peter-pan
Danke für den Code. Fragt er hier den Zustand ab und schaltet erst, wenn er nicht an ist?