Seite 7 von 14

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

Verfasst: 21. Dez 2023 18:33
von PJH
Ja, das funktioniert in der Loganzeige, hat aber vorher auch funktioniert, das Problem liegt in der Zeile

"Date1stAdvent.postUpdate(new DateTimeType(firstAdvent))"

Danke für eure Bemühungen und einen schönen Gruß. PJH

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

Verfasst: 21. Dez 2023 19:11
von peter-pan
Ok. Hier noch eine Variante:

Item:

Code: Alles auswählen

DateTime Date1stAdvent  "1. Advent mit pattern"  { stateDescription="pattern"  [pattern="%1$ta, %1$td.%1$tm.%1$ty"] } // Advent, Advent .... 
Rule-Snippet:

Code: Alles auswählen

   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 {}, der {} Tag des Jahres", vFirstAdventDate, vFirstAdventDay)
    
  
   var vMemorialDayDate = LocalDate.of(now.year,12,24).withDayOfYear(vXMasDayNumber - vWeekDayXMAS - 28)  // Totensonntag
   var vMemorialDayDay = vMemorialDayDate.getDayOfYear                                                    // Tag-Nr. des Totensonntag
   logInfo("advent1", "Totensonntag ist am {} Tag des Jahres",  vMemorialDayDay)
   val vHourMinute = now.toLocalTime().getHour.toString + now.toLocalTime().getMinute.toString            // Stunde + Minute für Vergleich ob Ein- oder Ausschaltzeit (Minute kann ggf. weggelassen werden)
   val vDateOfDayOfYear = ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(vFirstAdventDay)    // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents
   val vDateOfDayOfYear1 = ZonedDateTime.now.withDayOfYear(vFirstAdventDay)                               // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents mit al#ktueller Uhrzeit
   logInfo("advent1", "1.Advent ist am: {} {} ",  vDateOfDayOfYear, vDateOfDayOfYear1)
        Date1stAdvent.postUpdate(new DateTimeType(vDateOfDayOfYear))
Die nicht benötigten Berechnungen kannst du ja raus werfen.

Wichtig die ersten beiden Berechnungen und die Berechnung "val vDateOfDayOfYear = ...". Und dann noch der Update am Schluss.

Vielleicht klappt's ja damit. Bei mir funktioniert's
Advent.jpg

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

Verfasst: 21. Dez 2023 20:47
von PJH
Leider klappt's bei mir nicht.

Ich bekomme die Fehlermeldung
"2023-12-21 20:45:17.708 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Advent-3' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.BigDecimalExtensions.operator_minus(java.math.BigDecimal,java.math.BigDecimal) on instance: null in Advent"

Schönen Gruß. PJH

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

Verfasst: 22. Dez 2023 00:14
von peter-pan
Also, das kann ich mir jetzt nicht mehr so einfach erklären. Poste doch einfach mal deine Rule.

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

Verfasst: 22. Dez 2023 10:11
von PJH

Code: Alles auswählen

rule "ErsterAdvent - Datum"
	when
	Time cron "0 01 00 ? * * *" or
    System started or
	Item vSystemRestart changed to ON
	then
	/*
	
	val firstAdvent = LocalDate.of(now.getYear,12,25).minusDays(LocalDate.of(now.getYear,12,25).getDayOfWeek.getValue + 21)
	val intStAdvent = firstAdvent.getDayOfYear
	// ersterAdvent.update(intStAdvent)
	// Date1stAdvent.postUpdate(new DateTimeType(firstAdvent))
	// logInfo("ErsterAdvent - Datum","Der erste Advent ist am {}", firstAdvent)
*/


	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 {}, der {} Tag des Jahres", vFirstAdventDate, vFirstAdventDay)

	var vMemorialDayDate = LocalDate.of(now.year,12,24).withDayOfYear(vXMasDayNumber - vWeekDayXMAS - 28)  // Totensonntag
   	var vMemorialDayDay = vMemorialDayDate.getDayOfYear                                                    // Tag-Nr. des Totensonntag
   	logInfo("advent1", "Totensonntag ist am {} Tag des Jahres",  vMemorialDayDay)
   	// val vHourMinute = now.toLocalTime().getHour.toString + now.toLocalTime().getMinute.toString            // Stunde + Minute für Vergleich ob Ein- oder Ausschaltzeit (Minute kann ggf. weggelassen werden)
   	val vDateOfDayOfYear = ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(vFirstAdventDay)    // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents
   	val vDateOfDayOfYear1 = ZonedDateTime.now.withDayOfYear(vFirstAdventDay)                               // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents mit al#ktueller Uhrzeit
   	logInfo("advent1", "1.Advent ist am: {} {} ",  vDateOfDayOfYear, vDateOfDayOfYear1)
        Date1stAdvent.postUpdate(new DateTimeType(vDateOfDayOfYear))

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

Verfasst: 22. Dez 2023 10:58
von nw378
Hi,

2 Anmerkungen:
a) ist ist sinnvoll, Code entsprechend zu formatieren, mittels

[code*] meine rule... [/code*] (ohne Sternchen hinter dem e)

b) du verwendest (copy/paste?) zwei Variablen, vXMasDayNumber - vWeekDayXMAS. Wenn du diesen zuvor keinen Wert zugewiesen hast, könnte das Ursache deiner Fehlermeldung sein.

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

Verfasst: 22. Dez 2023 12:48
von peter-pan
Wie @new378 geschrieben hat, musst du natürlich alle Variablen, die du benutzt, auch deklarieren.

Also, hier nochmal eine einfache, abgespeckte Version der Datums-Berechnung mit Update des Items, zur Anzeige in deiner Sitemap.

1. Item:

Code: Alles auswählen

DateTime Date1stAdvent  "1. Advent mit pattern"  { stateDescription="pattern"  [pattern="%1$ta, %1$td.%1$tm.%1$ty"] } // Advent, Advent .... 

2. Regel:

Code: Alles auswählen

rule "einfache Regel"

 when
    Item Dummy_3 changed to ON // Test-Switch
 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
        logInfo("einfach", "Heiligabend und 4 Advent sind gleich {} ", vWeekDayXMAS)
    }                                                              
    else {
         logInfo("einfach", "Heiligabend und 4 Advent sind nicht gleich {} ", vWeekDayXMAS)
    }
   var vFirstAdventDate = LocalDate.of(now.year,12,24).withDayOfYear(vXMasDayNumber - vWeekDayXMAS - 21)  // 1. Advent
   var vFirstAdventDay  = vFirstAdventDate.getDayOfYear                                                   // Tag-Nr. 1. Advent
       logInfo("einfach", "einfach 1.Advent ist am {}, der {} Tag des Jahres", vFirstAdventDate, vFirstAdventDay)
  
   val vDateOfDayOfYear = ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(vFirstAdventDay)    // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents Uhrzeit 00:00
   val vDateOfDayOfYear1 = ZonedDateTime.now.withDayOfYear(vFirstAdventDay)                               // Umrechnung Tag des Jahres in ein Datum, in diesem Falle Tag des 1. Advents mit al#ktueller Uhrzeit (alternativ)

   logInfo("einfach", "einfach 1.Advent ist am: {} {} ",  vDateOfDayOfYear, vDateOfDayOfYear1)
        Date1stAdvent.postUpdate(new DateTimeType(vDateOfDayOfYear))
end
So sollte es aber nun gehen.

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

Verfasst: 22. Dez 2023 13:30
von PJH
Danke, auf Grund eurer konzertierten Aktion geht es jetzt. Nochmals Danke und einen schönen Gruß. PJH

PS: Auf Grund dieses Erfolges würde ich auch gerne noch weitere Feiertage anzeigen.

Peter, ich würde dann, wenn Du gestattest, noch einmal auf dich zukommen.

Bildschirmfoto 2023-12-22 um 15.25.18.png

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

Verfasst: 22. Dez 2023 14:55
von udo1toni
Ich habe mir mal die Freiheit genommen, die Code Tags zu ergänzen.
Nur so am Rande... Eine Rule sollte nach Möglichkeit immer vollständig gepostet werden (oben fehlt mindestens noch ein end)
Außerdem sollte man den Code - gerade auch hier fürs Forum - möglichst gut lesbar gestalten. Bei Codebeispielen oder auch Fragen zu bestehenden Rules sind auskommentierte Zeilen nur Balast.
Hier im Forum wird ein <tab> für die Anzeige immer mit 8 Leerzeichen ersetzt, was meist zu viel ist. Deshalb bietet es sich an, im Originalcode vor dem Kopieren alle <tab> Zeichen durch jeweils 4 Leerzeichen ersetzen zu lassen.
Auch sonst ist es sinnvoll, auf gute Lesbarkeit zu achten (Text in einem Editor passend einrücken usw.), das hilft sogar manchmal, um Fehler im eigenen Code gleich selbst zu finden.

Wenn es darum geht, alle Feiertage anzuzeigen, möchte ich dringend empfehlen, dass Du Dir Ephemeris anschaust (das ist Bestandteil von openHAB).
Ephemeris berechnet Termine anhand vorgegebener Regeln. Die Regeln werden in einer xml Datei hinterlegt. Im offiziellen Repository gibt es z.B. das hier: https://github.com/svendiedrichsen/joll ... ays_de.xml, wobei die Datei meiner Meinung nicht vollständig, oder alternativ fehlerhaft ist (z.B. Ostersonntag müsste ebenfalls bundesweiter Feiertag sein, nicht nur in Brandenburg), aber sie mag als guter Ausgangspunkt dienen :) Man kann in dieser Datei auch die Adventssonntage mit abbilden.

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

Verfasst: 22. Dez 2023 15:24
von PJH
Hallo, ich bitte um Vergebung, werde mir Nächstens mehr Mühe geben.

Schöne Grüße und nochmals danke. PJH