[solved] Ein Newbie benötigt Hife bei einer Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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.:

Code: Alles auswählen

logInfo("x-mas","intStAdvent ist: {}", intStAdvent)
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. :(
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

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

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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 :(
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Ein Newbie benötigt Hife bei einer Rule

Beitrag 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
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: [solved] Ein Newbie benötigt Hife bei einer Rule

Beitrag 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. :D

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. :lol:

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?

Code: Alles auswählen

    Item vSystemRestart changed to ON or

@peter-pan

Danke für den Code. Fragt er hier den Zustand ab und schaltet erst, wenn er nicht an ist?

Code: Alles auswählen

        if (Dummy_5.state != ON) {
             Dummy_5.sendCommand(ON)
             
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

Antworten