Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von peter-pan »

Hallo Marcus,
ich versuche gerade deine Ideen umzusetzen. Ich habe eine komplette Neuinstallation von OH2.5-stable auf einem RPi3b gemacht, auf dem eigentlich nur die Items, eine Mini-Sitemap und die Rules eingebunden sind. Ausserdem sind noch in den "services" folgende Dateien installiert, die ich in den entsprechenden Links gefunden habe:

Code: Alles auswählen

[21:19:03] hab@ohtest:/etc/openhab2/services$ ls -alF
insgesamt 576
drwxrwxr-x+  2 openhab openhab   4096 Jan  6 13:54 ./
drwxrwxr-x+ 14 openhab openhab   4096 Jan  6 13:29 ../
-rw-rw-r--   1 openhab openhab   2269 Dez 15 23:56 addons.cfg
-rwxrwxr-x+  1 openhab openhab 202163 Jan  6 01:40 country_descriptions_de.properties*
-rw-rw-r--   1 openhab openhab  47382 Jan  4 20:36 dashboard.cfg
-rw-rw-r--   1 openhab openhab    167 Jan  6 18:25 ephemeris.cfg
-rwxrwxr-x+  1 openhab openhab 154700 Jan  6 13:54 holiday_descriptions_de.properties*
-rwxrwxr-x+  1 openhab openhab 141675 Jan  6 01:39 Holidays_de.xml*
-rw-rw-r--   1 openhab openhab    333 Dez 15 23:56 readme.txt
-rw-rw-r--   1 openhab openhab   3682 Dez 15 23:56 runtime.cfg
[21:19:11] hab@ohtest:/etc/openhab2/services$
Die Regeln habe ich etwas modifiziert, da ich an verschiedenen Stellen die entsprechenden Felder nicht füllen kann. Trotzdem klappt's nicht

Wenn ich die erste Regel starte, bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

2020-01-06 21:24:18.098 [ome.event.ItemCommandEvent] - Item 'Dummy1' received command ON
2020-01-06 21:24:18.133 [vent.ItemStateChangedEvent] - Dummy1 changed from OFF to ON
==> /var/log/openhab2/openhab.log <==
2020-01-06 21:24:18.142 [INFO ] [ipse.smarthome.model.script.EphRegel] - Ephemeris Regel kommt bis 1
2020-01-06 21:24:18.368 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Ephemeris Regel': Cannot instantiate configuration from URL 'file:/etc/openhab2/services/Holidays_de.xml'.
Die Regel sieht momentan so aus:

Code: Alles auswählen

/**
 * Feiertage prüfen (neuer Weg seit 2.5 mit Ephemeris)
 */
 
rule "Ephemeris Regel" 
when    
   Item Dummy1 changed to ON
//        Time cron "0 0 * * * ?" 
then
   logInfo("EphRegel","Ephemeris Regel kommt bis 1")
   val String currentHoliday  = Ephemeris.getBankHolidayName("/etc/openhab2/services/Holidays_de.xml")
   val String nextHoliday  = Ephemeris.getNextBankHoliday("/etc/openhab2/services/Holidays_de.xml")
   val long untilHoliday    = Ephemeris.getDaysUntil(nextHoliday, "/etc/openhab2/services/Holidays_de.xml")
//   val String next_Holiday_Name = Ephemeris.getHolidayDescription(nextHoliday, "/etc/openhab2/services/holiday_description_de.properties")
//   val String untilWeekend = Ephemeris.isInDayset("beforeWeekend")
//   postUpdate(NextFeiertagName, next_Holiday_Name) 
//   val String current_Holiday_Name = Ephemeris.getHolidayDescription(currentHoliday, "/etc/openhab2/services/holiday_description_de.properties")
//   logInfo("Nächster Feiertag", next_Holiday_Name + " ist in " + untilHoliday + " Tagen" + currentHoliday)
logInfo("Nächster Feiertag", "next_Holiday_Name"  + " ist in " + untilHoliday + " Tagen" + currentHoliday)
   //logInfo("FILE","Heutiger Feiertag ist: " + current_Holiday_Name)
   if (Ephemeris.isBankHoliday == true) {
      //logInfo("FILE","Heute ist ein Feiertag")
//      Feiertag.sendCommand(ON) // Schalter Feiertag setzen
//      Urlaub.sendCommand(ON) // Schalter Urlaub setzen
//      postUpdate(FeiertagName, current_Holiday_Name) 
      } 
   if (Ephemeris.isWeekend == true) {
      logInfo("FILE","Wochenende") 
      Wochenende.sendCommand(ON) 
      Lange_schlafen.sendCommand(ON) 
      } 
   if (Ephemeris.isWeekend == false) { 
       logInfo("FILE","Arbeitswoche")
      Urlaub.sendCommand(OFF)
      Wochenende.sendCommand(OFF) 
      Lange_schlafen.sendCommand(OFF) 
      } 
   if (Ephemeris.isBankHoliday == false) {
      logInfo("FILE","Heute ist kein Feiertag")
      Feiertag.sendCommand(OFF) 
      Urlaub.sendCommand(OFF)
      Lange_schlafen.sendCommand(if(Wochenende.state == ON) ON else OFF) 
//      postUpdate(FeiertagName, current_Holiday_Name) 
      } 
   if (untilHoliday == 1) {
      logInfo("FILE","Nur noch ein Tag bis Feiertag") 
	 	Lange_schlafen.sendCommand(ON) // Lange schlafen ein
      }   
//   if (untilWeekend == true) {
//      logInfo("FILE","Nur noch ein Tag bis Wochenende") 
//	 	Lange_schlafen.sendCommand(ON) // Lange schlafen ein
//      } 
 end 
 
 rule "Ephemeris started rule"
when 
      Item Dummy2 changed to ON 
//     Time cron "0 0 * * * ?" 
then
   if (!isWeekend()) {
   logInfo("EphStart","Heute ist ein Wochentag") 
   }
   if (isWeekend()) {
	logInfo("EphStart","es ist Wochenende")
   }
   if (isWeekend(1)) {
	logInfo("EphStart","Morgen ist auch noch Wochenende")
   }
   if (isInDayset("beforeWeekend")) {
	logInfo("EphStart","heute ist Freitag, morgen ist Wochenende")
   Lange_schlafen.sendCommand(ON) // Lange schlafen ein
   }
   if (!isInDayset("beforeWeekend")) {
	logInfo("EphStart","Heute ist nicht Freitag")
   }
end
Ich habe auch 'einfache' Hochkommas, wie in deinem Beispiel ausprobiert, aber die Fehlermeldung bleibt die gleiche. Der VSC-Editor zeigt keine Fehler an. Muss ich noch etwas besonderes (grundlegendes) installieren ? :? :?:
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von Cyrelian »

Hi Peter,

ich habe das eben bei mir auch umgesetzt. Wo der Fehler bei Dir liegt habe ich jetzt auf die Schnelle nicht gesehen. Ich habs aber jetzt ohne die XML Files gemacht. Ich hatte aber mit dem XML Files auch keinen Fehler. Hab nur festgestellt, dass es auch ohne die Files geht.

Code: Alles auswählen

rule "Ephemeris - Ferien und Feiertag" 
when
	System started or 
    Time cron "5 45 3,19 * * ?" or
	Item UpdateHoliday received update ON 
then
   val String currentHoliday  = Ephemeris.getBankHolidayName()
   val String nextHoliday  = Ephemeris.getNextBankHoliday()
   val long untilHoliday    = Ephemeris.getDaysUntil(nextHoliday)
   val String nextHolidayName = Ephemeris.getHolidayDescription(nextHoliday)
   val String untilWeekend = Ephemeris.isInDayset("beforeWeekend")
   
   NextHolidayName.postUpdate(nextHolidayName) 
   
   val String currentHolidayName = Ephemeris.getHolidayDescription(currentHoliday)
   if (log) logInfo(filename, logPrefix + "Nächster Feiertag ({}) ist in ({}) Tagen",nextHolidayName, untilHoliday)
   
   if (Ephemeris.isBankHoliday == true) {
      if (log) logInfo(filename, logPrefix + "Heute ist ein Feiertag")
      Feiertag.sendCommand(ON) // Schalter Feiertag setzen
      Urlaub.sendCommand(ON) // Schalter Urlaub setzen
      FeiertagName.postUpdate(currentHolidayName)  
      } 
   if (Ephemeris.isWeekend == true) {
      if (log) logInfo(filename, logPrefix + "Wochenende") 
      Weekend.sendCommand(ON) 
      } 
   if (Ephemeris.isWeekend == false) { 
      if (log) logInfo(filename, logPrefix + "Arbeitswoche")
      Urlaub.sendCommand(OFF)
      Weekend.sendCommand(OFF)
      } 
   if (Ephemeris.isBankHoliday == false) {
      if (log) logInfo(filename, logPrefix + "Heute ist kein Feiertag")
      Feiertag.sendCommand(OFF) 
      Urlaub.sendCommand(OFF)
      FeiertagName.postUpdate(currentHolidayName) 
      } 
   if (untilHoliday == 1) {
      if (log) logInfo(filename, logPrefix + "Nur noch ein Tag bis Feiertag")
      }   
   if (untilWeekend == true) {
      if (log) logInfo(filename, logPrefix + "Nur noch ein Tag bis Wochenende") 
      }
 end 
So siehts dann im Log aus:

Code: Alles auswählen

[INFO ] [.smarthome.model.script.urlaub.rules] - Ferien und Feiertage - Nächster Feiertag (Karfreitag) ist in (95) Tagen
CU
Cyrelian

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

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von peter-pan »

Hallo Cyrelian,
Danke für deine schnelle Antwort. Die zweite Regel von Marcus klappt bei mir auch, aber ich werde deine gleich mal einsetzen und schauen was passiert.
Das ganze wäre halt auch interessant, wenn man eine eigene (Geburtstags-)Datei einbinden könnte, was ja wohl auch geht. Vielleicht habe ich auch die Dateien (XML) falsch kopiert. Kann mir im Moment aber keinen Reim drauf machen.

Jetzt beschäftige ich mich erst mal mit deiner Regel.

Danke und Gruss
Peter

Edit:
Hier bekomme ich eine Fehlermeldung von VSC:

Code: Alles auswählen

val String untilWeekend = Ephemeris.isInDayset("beforeWeekend")
und zwar, diese:

Code: Alles auswählen

Type mismatch: cannot convert from boolean to String(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
ephemeris.cfg ist:

Code: Alles auswählen

dayset-school=[MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY]
dayset-weekend=[SATURDAY,SUNDAY]
dayset-beforeWeekend=[Friday]
dayset-trash=[MONDAY]
country=de
region=bw
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von Tokamak »

peter-pan hat geschrieben: 6. Jan 2020 21:59 Hier bekomme ich eine Fehlermeldung von VSC:

Code: Alles auswählen

val String untilWeekend = Ephemeris.isInDayset("beforeWeekend")
und zwar, diese:

Code: Alles auswählen

Type mismatch: cannot convert from boolean to String(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
isInDayset() liefert true oder false zurück, also ein boolean, wie auch in der Fehlermeldung implizit steht. Das kleingeschriebene "boolean" ist ein "primitiver Datentyp", im Gegensatz zur Klasse "Boolean", und hat damit keine Methode zur Umwandlung in einen String.
Der String wäre letztlich "true" und würde damit eh nicht viel nützen.

Code: Alles auswählen

val boolean untilWeekend = Ephemeris.isInDayset("beforeWeekend")
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

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

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von peter-pan »

Tokamak hat geschrieben: 7. Jan 2020 07:37 Der String wäre letztlich "true" und würde damit eh nicht viel nützen
Danke für den Tipp. Fehlermeldung in VSC ist jetzt weg. Die Rule hat aber trotzdem funktioniert. Anscheinend ist DSL hier "gnädig" und verzeiht diesen Fehler, bzw. korrigiert ihn und macht das Richtige daraus, da weiter unten in der Regel auf "true" abgefragt wird.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

KlausGünther
Beiträge: 143
Registriert: 16. Jul 2018 08:57
Answers: 0
Wohnort: Werl
Kontaktdaten:

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von KlausGünther »

Auch von mir ein herzliches Dankeschön für die Arbeit!

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

Re: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von int5749 »

Hallo zusammen,

auch ich versuche mit sein geraumen Tagen an der Ephemeris "Funktion", bisher ist die leider noch ein K(r)ampf :roll:

Konfiguration hat geklappt, danke fortwährendem Bug zusätzlich noch über die *.cfg Datei, dort habe ich auch die XML abglegt.
Tokamak hat geschrieben: 6. Jan 2020 11:21 Da ich dann zwei Files habe, muss ich umständlicher arbeiten:

Code: Alles auswählen

    ...
    then
        val boolean istFeiertag=Ephemeris.isBankHoliday(0,"/etc/openhab2/services/Holidays_de.xml") || Ephemeris.isBankHoliday(0,"/etc/openhab2/services/eigeneFeiertage.xml")
Oder ginge das einfacher?
Das frage ich mich auch, und hatte "Christmas_Eve" in die Holidays_de.xml eingetragen. Dies hatte zunächst funktioniert, gestern habe ich dann noch andere Änderungen vorgenommen und auf einmal liest es zusätzliche Feiertage nicht mehr aus der Holidays_de.xml aus, nur die vorgegebenen :oops:

Ja, ich habe OpenHab jedes mal neu gestartet, da die Änderungen an der XML ja sonst nicht erkannt werden (was ich auch unschön finde)

1) Gibt es evtl. einen Weg, OpenHab (läuft bei mir auf Windows) aus der KARAF neu zu starten??

2) Kennt ihr das Problem, das Einträge in der Holidays_de.xml nicht erkannt werden??

3) Mir pers. fehlen die Feiertage am Wochenende, da die Funktion sich auf Feiertage an einem Werktag beschränkt. Klassisches Beispiel ist der Oster-Sonntag. Der wird zur Berechnung vieler christlicher Feiertage benötigt und auch berechnet, ist aber nicht in der Holidays_de.xml enthalten.

4) "rechnen" mit der Funktion: laut Source Code https://github.com/svendiedrichsen/joll ... arser.java kann mit "SECOND", "THiRD" etc auch um Wochen gesprungen werden. Ich wollte dies nutzen um die Adventssonntage zu "berechnen", Ausgang ist ja der 25.12 (fix) und dann eben die 4 Sonntage davor. Hier funktioniert keine Reihenfolge der möglichen Parameter und Änderungen zu testen ist natürlich durch den notwendigen Reboot von OpenHab sehr aufwendig

Nun bin ich gespannt auf den Austasuch dazu, da ich die Funktion schon attraktiver finde als das bisher eingesetzte Script.


Viele Grüße,

Jörg
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: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von int5749 »

Hallo zusammen,

auch hier => ich konnte Punkt 4 für mich mit der Funktion "FixedWeekdayRelativeToFixed" lösen
Bei Bedarf, kann ich gerne die Berechnugn auch hier posten.

Viele Grüße,

Jörg
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: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von int5749 »

Hello again,

nachdem ich bisher von den Erfolgen positiv überrascht war, hänge ich nun an der Übersetzung der Feiertage.

Test Rule

Code: Alles auswählen

val String nextHoliday  = Ephemeris.getNextBankHoliday('d:/OpenHAB/conf/services/Holidays_de.xml')
val long untilHoliday    = Ephemeris.getDaysUntil(nextHoliday, 'd:/OpenHAB/conf/services/Holidays_de.xml')
val String nameHoliday = Ephemeris.getHolidayDescription(nextHoliday)
logInfo("Test", "{} Tage bis {} in deutsch {}", untilHoliday, nextHoliday, nameHoliday)

val String thisHoliday  = Ephemeris.getBankHolidayName(new DateTimeType("2021-01-01").zonedDateTime)
logInfo("Test", "vorher: {} und nachher: {}", Ephemeris.getBankHolidayName((new DateTimeType("2021-01-01").zonedDateTime), 'd:/OpenHAB/conf/services/holidays_de.xml'), Ephemeris.getHolidayDescription(thisHoliday))

val String thisHoliday2  = Ephemeris.getBankHolidayName(new DateTimeType("2020-12-24").zonedDateTime)
logInfo("Test", "vorher: {} und nachher: {}", Ephemeris.getBankHolidayName((new DateTimeType("2020-12-24").zonedDateTime), 'd:/OpenHAB/conf/services/holidays_de.xml'), Ephemeris.getHolidayDescription(thisHoliday2))
Ergebnis im Log
18:45:50.573 [INFO ] [g.eclipse.smarthome.model.script.Test] - 46 Tage bis christian.GOOD_FRIDAY in deutsch Karfreitag
18:45:50.588 [INFO ] [g.eclipse.smarthome.model.script.Test] - vorher: NEW_YEAR und nachher: Neujahr
18:45:50.604 [INFO ] [g.eclipse.smarthome.model.script.Test] - vorher: CHRISTMAS_EVE und nachher: null
Die Werte dazu sind alle in der holiday_descriptions_de.properties enthalten und ich habe einen Eintrag in der holidays_de.xml erstellt, welche ja im Prinzip auch gefunden wird. Manche Einträge werden ja auch korrekt übersetzt.
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: Ephemeris Binding OH 2.5 (Feiertage, Wochenende)

Beitrag von int5749 »

Hallo zusammen,

da hier ja auch schon einige diese neue Ephemeris Action/Funktion nutzen, hoffe ich auf ein paar weitere Tipps ;-)

Wie geschrieben, konnte ich nun erfolgreich die ADvents-Sonntage und auch andere Tage in die xml einpflegen und mit "getBankHolidayName" auch den eingetragenen Namen abfragen. Aber: leider sind diese dann doch kein Feiertag :?:

Mein jüngster Test war dann heute am 01.03.2020

XML-Eintrag

Code: Alles auswählen

        <tns:Fixed month="MARCH" day="1" descriptionPropertiesKey="FIRST_MARCH"/><!-- personally added -->
        <tns:Fixed month="MARCH" day="2" descriptionPropertiesKey="SECOND_MARCH" localizedType="OFFICIAL_HOLIDAY"/><!-- personally added -->
        <tns:Fixed month="MARCH" day="3" descriptionPropertiesKey="THIRD_MARCH" localizedType="UNOFFICIAL_HOLIDAY"/><!-- personally added -->
Abfrage über eine Rules

Code: Alles auswählen

logInfo("Test", "Feiertag ohne? => {}", Ephemeris.isBankHoliday(0, 'd:/OpenHAB/conf/services/specialdays.xml'))
logInfo("Test", "Feiertag official? => {}", Ephemeris.isBankHoliday(1, 'd:/OpenHAB/conf/services/specialdays.xml'))
logInfo("Test", "Feiertag unofficial? => {}", Ephemeris.isBankHoliday(2, 'd:/OpenHAB/conf/services/specialdays.xml'))
Ergebnis
11:25:16.942 [INFO ] [g.eclipse.smarthome.model.script.Test] - Feiertag ohne? => false
11:25:16.942 [INFO ] [g.eclipse.smarthome.model.script.Test] - Feiertag official? => false
11:25:16.958 [INFO ] [g.eclipse.smarthome.model.script.Test] - Feiertag unofficial? => false
Wie bekomme ich denn diese Tage als Feiertag deklariert?

Ja, ich könnte private Feiertag mit einem Kürzel beginnend benennen und darauf filter, aber das wäre ja eine weitere rule und aus meiner Sicht nicht im Sinne der Action, die das ja liefern können sollte?

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

Antworten