OH3 - Rule arbeitet nicht automatisch, aber manuell

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von int5749 »

Hallo zusammen,

Ich habe ein seltsames Phänomen entdeckt, was ich nicht aufschlüsseln kann.
Zur Bestimmung eines Feiertages habe ich bereits vor Monates vom alten holiday.script umgestellt auf Ephemeris, was unter OH2 auch ganz gut funktioniert hat, solange die Systemzeit bei dem alten System synchron mit NTP war (was leider nicht immer der Fall war).

Unter OH3 wird die Regel nun Nachts durchlaufen, aber die if-Schleife nicht ausgeführt.

Code: Alles auswählen

rule Feiertage
when
    Time cron "0 0 0 * * ?" or
    Item vSystemRestart changed to ON or
    System started
then
    if (Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml') == true) {
    	postUpdate(TodayIs, Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml')))
    	postUpdate(Holiday, ON)
    } else if (Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml') == false && Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/specialdays.xml') == true) {
    	postUpdate(TodayIs, Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/specialdays.xml')))
    	postUpdate(Holiday, OFF)
    } else {
    	postUpdate(TodayIs, Datum.state.format("%1$tA, %1$td.%1$tm.%1$ty"))
    	postUpdate(Holiday, OFF)
    }
    logInfo("Ephemeris", "Heute ist: {}", TodayIs.state)
end
Logeintrag (Zumindest passt auf dem neuen System die Zeit :) )
2021-01-12 00:00:01.101 [INFO ] [.openhab.core.model.script.Ephemeris] - Heute ist: Montag, 11.01.21
Die ist ja der letzte Teil der Rule, die somit zumindest getriggert wurde

Da ich für Testzwecke einen Schalter eingebaut habe, funktioniert die Regel komplett beim manunellen Trigger.
2021-01-12 07:13:06.643 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'vSystemRestart' received command ON
2021-01-12 07:13:06.643 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'vSystemRestart' changed from OFF to ON
2021-01-12 07:13:06.674 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TodayIs' changed from Montag, 11.01.21 to Dienstag, 12.01.21

2021-01-12 07:13:06.659 [INFO ] [.openhab.core.model.script.Ephemeris] - Heute ist: Dienstag, 12.01.21
Nun bin ich ratlos :?

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von KellerK1nd »

Die Zeit holst du dir übers NTP-Binding? Wenn ja, kann es sein, dass das Binding zu dem Zeitpunkt sich noch gar nicht aktualisiert hat? Mein NTP Binding zieht sich nur aller einer Minute ein Update, eventuell mal den Triggerzeitpunkt nach hinten schieben.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

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

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von int5749 »

KellerK1nd hat geschrieben: 12. Jan 2021 07:47 Die Zeit holst du dir übers NTP-Binding? Wenn ja, kann es sein, dass das Binding zu dem Zeitpunkt sich noch gar nicht aktualisiert hat? Mein NTP Binding zieht sich nur aller einer Minute ein Update, eventuell mal den Triggerzeitpunkt nach hinten schieben.
Der Wald vor Bäumen :o

Die magische Zeile heißt

Code: Alles auswählen

postUpdate(TodayIs, Datum.state.format("%1$tA, %1$td.%1$tm.%1$ty"))
Alles erfolgt zur Laufzeit aber wie vermutet wird Datum über NTP befüllt und zwar 1x pro Minute.

Ich glaube, ich baue die noch einmal etwas um. Danke für den Schubs
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: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von int5749 »

So, ich habe mich entschieden einen möglichen "Spezial-Tag" (Feiertag oder auch nicht) separat und nur bei zutreffend anzeigen zu lassen.

Items

Code: Alles auswählen

Switch Holiday			"Feiertag"
String TodayIs			"Heute ist: [%s]"
DateTime Datum		"[%1$tA, %1$td.%1$tm.%1$ty]"	<calendar>			{channel="knx:device:bridge:Vopenhab:datum",channel="ntp:ntp:home:dateTime"}
Rule

Code: Alles auswählen

rule Feiertage
when
    Time cron "0 0 0 * * ?" or
    Item vSystemRestart changed to ON or
    System started
then
    if (Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml') == true) {
    	postUpdate(TodayIs, Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml')))
    	postUpdate(Holiday, ON)
    } else if (Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/holidays_de.xml') == false && Ephemeris.isBankHoliday(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/specialdays.xml') == true) {
    	postUpdate(TodayIs, Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(new DateTimeType().zonedDateTime.plusDays(0), 'c:/openHAB/conf/services/specialdays.xml')))
    	postUpdate(Holiday, OFF)
    } else {
    	postUpdate(TodayIs, "regular")
    	postUpdate(Holiday, OFF)
    }
    logInfo("Ephemeris", "Heute ist: {}", TodayIs.state)
end
Sitemap

Code: Alles auswählen

Text item=TodayIs visibility=[TodayIs!="regular"]
Text item=Datum 
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von udo1toni »

Was die Systemzeit betrifft: Es ist wichtig, zu verstehen, dass das NTP Binding ausschließlich für den openHAB Bus zuständig ist. Das ist die Heimat der Items. NTP wirkt sich nur auf Items aus, sonst nichts. Alles andere, was Zeit betrifft, bedient sich der Systemzeit. Die Systemzeit ist NICHT mit dem NTP Binding verknüpft.

Warum ist das so? Warum kann man nicht einfach die Systemzeit statt des NTP Bindings verwenden? Ganz einfach: Weil man beliebige Zeiten anzeigen lassen kann, nicht nur die vor Ort. Ich könnte mir z.B. eine Weltzeitanzeige bauen (kennt man aus Nachrichtenredaktionen oder auch von der Börse...).

Und was bedeutet das jetzt für die Systemzeit?
Man muss auf Systemebene ebenfalls ntp einrichten. Dazu gibt es zwei Wege.

Der eine Weg heißt ntpd, das ist ein ntp Server und ntp Client. Gewöhnlich wird man nur den Client einrichten.
ntpd korrigiert auch den Takt der internen Uhr, es sorgt also dafür, dass der eingebaute Zeitgeber möglichst wenig von der ntp Zeit abweicht. Da der interne Zeitgeber aber über verschiedene Parameter stark driftet (Temperatur, Spannungsschwankungen, Luftfeuchte, Alter...) rettet einen das höchstens über den Tag, aber nicht über die Woche :)

Die zweite Option ist der in systemd eingebaute ntp client, der über timedatectl eingestellt werden kann. Ich bin mir nicht sicher, ob timedatectl die Drift der RTC korrigiert, wie ntpd das macht.

In beiden Fällen wird aber die Systemzeit anschließend über die konfigurierten ntp Server automatisch abgeglichen.
Wie gesagt, dieser Prozess ist völlig unabhängig vom NTP Binding.

Was die Rule betrifft, so möchte ich empfehlen, Variablen und Konstanten zu verwenden, das ist nicht nur übersichtlicher, sondern kostet auch weniger Rechenzeit.

So:

Code: Alles auswählen

rule Feiertage
when
    Time cron "5 0 0 * * ?" or
    Item vSystemRestart changed to ON or
    System started
then
    val String strHolidays = 'c:/openHAB/conf/services/holidays_de.xml'
    val String strSpecialdays = 'c:/openHAB/conf/services/specialdays.xml'
    val dtDate = new DateTimeType().zonedDateTime.plusDays(0)

    var String strToday = "regular"

    if(Ephemeris.isBankHoliday(dtDate, strHolidays)) {
        strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strHolidays)
        Holiday.postUpdate(ON)
    } else {
        Holiday.postUpdate(OFF)
        if(Ephemeris.isBankHoliday(dtDate, strSpecialdays))
            strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strSpecialdays)
    }
    TodayIs.postUpdate(strToday)
    logInfo("Ephemeris", "Heute ist: {}", strToday)
end
Alles, was mehrfach genutzt wird, wird in eine Konstante gepackt. Die Variable strToday bekommt als Default den Normalfall. Ist ein Feiertag, so wird strToday überschrieben und das Feiertagsflag gesetzt. Ist kein Feiertag, so wird das Feiertagsflag gelöscht. Außerdem wird nach Specialday geprüft. Sollte dieser vorliegen, wird strToday entsprechend gesetzt. Zum Abschluss wird der Inhalt von strToday in TodayIs geschrieben und im Log ausgegeben.

EDIT: Code korrigiert.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

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

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von int5749 »

udo1toni hat geschrieben: 12. Jan 2021 12:55 Was die Rule betrifft, so möchte ich empfehlen, Variablen und Konstanten zu verwenden, das ist nicht nur übersichtlicher, sondern kostet auch weniger Rechenzeit.
Da hatte ich aufgehört zu lesen oder es war noch nicht mehr da ;-). Ich hatte die Empfehlung aufgegriffen und einige Variablen eingebaut aber Dein Ergebnis übertrifft es bei Weitem!! Danke dafür!!!!

Code: Alles auswählen

Time cron "5 0 0 * * ?" or
OK, Du hast es auch 5 Min nach hinten geschoben ;)

Einige Fragen habe ich da noch :)

Code: Alles auswählen

 val DateTimeType dtDate = new DateTimeType().zonedDateTime.plusDays(0)
Dies hatte einen Fehler, daher musste ich die Typisierung entfernen

Code: Alles auswählen

 val dtDate = new DateTimeType().zonedDateTime.plusDays(0)
Gibt es einen funktionalen Unterschied zwischen:

Code: Alles auswählen

Holiday.postUpdate(OFF)
und

Code: Alles auswählen

postUpdate(Holiday, OFF)

Code: Alles auswählen

logInfo("Ephemeris", "Heute ist: {}", strToday)
habe ich geändert zu

Code: Alles auswählen

logInfo("Ephemeris", "Heute ist: {}", TodayIs.state)
damit ich sehe, was wirklich angekommen ist.

Der aktuelle Stand des Code

Code: Alles auswählen

rule Feiertage
when
    Time cron "5 0 0 * * ?" or
    Item vSystemRestart changed to ON or
    System started
then
    val String strHoliday = 'c:/openHAB/conf/services/holidays_de.xml'
    val String strSpecialday = 'c:/openHAB/conf/services/specialdays.xml'
    val dtDate = new DateTimeType().zonedDateTime.plusDays(0)

    var String strToday = "regular"

    if  (Ephemeris.isBankHoliday(dtDate, strHoliday)) {
        strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strHoliday))
        Holiday.postUpdate(ON)
    } else {
        Holiday.postUpdate(OFF)
        if (Ephemeris.isBankHoliday(dtDate, strSpecialday))
            strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strSpecialday))
    }
    TodayIs.postUpdate(strToday)
    logInfo("Ephemeris", "Heute ist: {}", TodayIs.state)
end
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von udo1toni »

int5749 hat geschrieben: es war noch nicht mehr da
Genau :)
int5749 hat geschrieben:

Code: Alles auswählen

Time cron "5 0 0 * * ?" or
OK, Du hast es auch 5 Min nach hinten geschoben ;)
5 Sekunden, nicht 5 Minuten. Dies hier ist immer noch Quartz Cron!
int5749 hat geschrieben:
Einige Fragen habe ich da noch :)

Code: Alles auswählen

 val DateTimeType dtDate = new DateTimeType().zonedDateTime.plusDays(0)
Dies hatte einen Fehler, daher musste ich die Typisierung entfernen
Ja, das passiert manchmal... Ich schreibe den Typ immer mit dazu, weg lassen geht ja leicht...
int5749 hat geschrieben:
Gibt es einen funktionalen Unterschied zwischen:

Code: Alles auswählen

Holiday.postUpdate(OFF)
und

Code: Alles auswählen

postUpdate(Holiday, OFF)
Ja, die action erwartet zwei Strings, die Methode kommt mit allem möglichen als Input zurecht. Die Methode sollte immer bevorzugt werden.
int5749 hat geschrieben:

Code: Alles auswählen

logInfo("Ephemeris", "Heute ist: {}", strToday)
habe ich geändert zu

Code: Alles auswählen

logInfo("Ephemeris", "Heute ist: {}", TodayIs.state)
damit ich sehe, was wirklich angekommen ist.
Das ist aber nicht gut, denn die Wahrscheinlichkeit, dass TodayIs.state noch den Stand vor dem postUpdate hat, ist groß. OpenHAB arbeitet asynchron.


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

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

Re: OH3 - Rule arbeitet nicht automatisch, aber manuell

Beitrag von int5749 »

udo1toni hat geschrieben: 12. Jan 2021 16:54 5 Sekunden, nicht 5 Minuten. Dies hier ist immer noch Quartz Cron!
Shame on me :oops:
udo1toni hat geschrieben: 12. Jan 2021 16:54 Ja, das passiert manchmal... Ich schreibe den Typ immer mit dazu, weg lassen geht ja leicht...
Ja, solange es dann noch funktioniert, wie es soll ;)
udo1toni hat geschrieben: 12. Jan 2021 16:54

Code: Alles auswählen

Holiday.postUpdate(OFF)
Ja, die action erwartet zwei Strings, die Methode kommt mit allem möglichen als Input zurecht. Die Methode sollte immer bevorzugt werden.
OK, dann habe ich ja richtigerweise die eine Action noch angepasst
udo1toni hat geschrieben: 12. Jan 2021 16:54 Das ist aber nicht gut, denn die Wahrscheinlichkeit, dass TodayIs.state noch den Stand vor dem postUpdate hat, ist groß. OpenHAB arbeitet asynchron.
Das erklärt das ursprüngliche Verhalten meiner alten Regel, da war im Log meist der alte Wert. Habe es wieder geändert

Falls jemand Interesse hat, hier noch einmal die aktuellste Regel

Code: Alles auswählen

rule Feiertage
when
    Time cron "5 0 0 * * ?" or
    Item vSystemRestart changed to ON or
    System started
then
    val String strHoliday = 'c:/openHAB/conf/services/holidays_de.xml'
    val String strSpecialday = 'c:/openHAB/conf/services/specialdays.xml'
    val dtDate = new DateTimeType().zonedDateTime.plusDays(0)

    var String strToday = "regular"

    if  (Ephemeris.isBankHoliday(dtDate, strHoliday)) {
        strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strHoliday))
        Holiday.postUpdate(ON)
    } else {
        Holiday.postUpdate(OFF)
        if (Ephemeris.isBankHoliday(dtDate, strSpecialday))
            strToday = Ephemeris.getHolidayDescription(Ephemeris.getBankHolidayName(dtDate, strSpecialday))
    }
    TodayIs.postUpdate(strToday)
    logInfo("Ephemeris", "Heute ist: {}", strToday)
end
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten