Seite 5 von 6
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 15:07
von PJH
Hallo udo1toni,
ich habe Deine Arbeit jetzt einmal ausprobiert, weiß jedoch nicht genau wie ich das machen soll.
Ich habe eine Regel erstellt und Deinen Code eingegeben und bekomme erst einmal die Fehlermeldung:
Script execution of rule with UID 'woche-1' failed: An error occurred during the script execution: Could not invoke method: java.time.ZonedDateTime.minusDays(long) on instance: 2021-01-08T00:00+01:00[Europe/Berlin] in woche"
Meine Regel schaut so aus:
rule "wochenr"
when
Item DatumZeit changed // (nur mal so, damit sich schnell was tut)
then
val firstMonday = now.with(LocalTime.MIDNIGHT).withDayOfYear(8).minusDays(now.withDayOfYear(1).getDayOfWeek).getDayOfYear
val actualMonday = now.with(LocalTime.MIDNIGHT).plusDays(7).minusDays(now.getDayOfWeek).getDayOfYear
var weeks = ((actualMonday-firstMonday)/7).intValue + if(firstMonday > 3) 1 else 0
if(weeks == 0)
weeks = if(firstMonday == 3) 53 else 52
else if (weeks == 53)
if(now.with(LocalTime.MIDNIGHT).plusDays(14).minusDays(now.getDayOfWeek).getDayOfYear > 3)
weeks = 1
lfdW.postUpdate(weeks)
end
Kannst Du noch mal nachschauen? Danke
Schöne Grüße. PJH
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 15:33
von peter-pan
...probiere mal den etwas modifizierten Code (.getValue) im "then"-Abschnitt
Code: Alles auswählen
var firstMonday = now.with(LocalTime.MIDNIGHT).withDayOfYear(8).minusDays(now.withDayOfYear(1).getDayOfWeek.getValue).getDayOfYear
var actualMonday = now.with(LocalTime.MIDNIGHT).plusDays(7).minusDays(now.getDayOfWeek.getValue).getDayOfYear
var weeks = ((actualMonday-firstMonday)/7).intValue + if(firstMonday > 3) 1 else 0
if(weeks == 0)
weeks = if(firstMonday == 3) 53 else 52
else if (weeks == 53)
if(now.with(LocalTime.MIDNIGHT).plusDays(14).minusDays(now.getDayOfWeek.getValue).getDayOfYear > 3)
weeks = 1
logInfo("Testwoche", "firstMonday ist: {} actualMonday ist {} weeks ist {}", firstMonday, actualMonday, weeks)
Als Ergebnis bekomme ich dann im Log:
Code: Alles auswählen
2021-10-06 15:26:35.238 [INFO ] [.openhab.core.model.script.Testwoche] - firstMonday ist: 3 actualMonday ist 283 weeks ist 40
Andere Frage! Arbeitest du auch mit den Pages aus OH3?
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 15:54
von PJH
Hallo Peter, die Regel wird zwar geladen, aber wenn sie ausgeführt wird, gibt es denselben Fehler.
Nein, mit den Pages arbeite ich nicht, habe nur mal so drei, vier Einträge zum ausprobieren.
Mir ist das zu umständlich!?
Schöne Grüße. Paul
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 15:55
von peter-pan
Hallo Paul,
hier noch einmal die ganze Regel auf der Basis von Udo's Code:
Code: Alles auswählen
rule "Test Kalenderwoche"
// Found:
// https://openhabforum.de/viewtopic.php?p=37982#p37982 von udo1toni
when
Item Dummy_6 changed to ON // Testschalter
then
val firstMonday = now.with(LocalTime.MIDNIGHT).withDayOfYear(8).minusDays(now.withDayOfYear(1).getDayOfWeek.getValue).getDayOfYear
val actualMonday = now.with(LocalTime.MIDNIGHT).plusDays(7).minusDays(now.getDayOfWeek.getValue).getDayOfYear
var weeks = ((actualMonday-firstMonday)/7).intValue + if(firstMonday > 3) 1 else 0
if(weeks == 0)
weeks = if(firstMonday == 3) 53 else 52
else if (weeks == 53)
if(now.with(LocalTime.MIDNIGHT).plusDays(14).minusDays(now.getDayOfWeek.getValue).getDayOfYear > 3)
weeks = 1
logInfo("Testwoche", "firstMonday ist: {} actualMonday ist {} weeks ist {}", firstMonday, actualMonday, weeks)
// CalWeek.postUpdate(weeks)
end
Ich habe auch noch eine Alternative gefunden. Allerdings brauchst du einen Import am Anfang deiner Rule-Datei:
Code: Alles auswählen
import java.time.temporal.IsoFields // Test Kalenderwoche
rule "Test Kalenderwoche"
// Found:
// https://community.openhab.org/t/convert-now-getweekofweekyear-for-oh3/112332/4
// Item needed:
// String CalWeek "Kalenderwoche [%s] " <calendar> (gSystem) // Rule Test Kalenderwoche
// Import needed (On Top of the Rule-File):
// import java.time.temporal.IsoFields
when
Item Dummy_6 changed to ON // Testschalter
then
val int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
// val int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR )
// logInfo("Test", "Now = " + now.toString) //aktuelles Datum
logInfo("Testwoche", "Week = " + week.toString) //Kalenderwoche
// logInfo("Test", "WeekYear = " + weekYear.toString) //Kalenderjahr
// CalWeek.postUpdate(week)
end
Die eingefügten Kommentare kannst du ja weglassen.
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 18:18
von udo1toni
Ah.
Wenn man hartnäckig genug sucht, findet man dann doch eine einfache Lösung...
Vom Ballast befreit und etwas aufgehübscht:
Code: Alles auswählen
import java.time.temporal.IsoFields
rule "Test Kalenderwoche"
when
Item Dummy_6 changed to ON // Testschalter
then
val Integer week = now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)
logInfo("Testwoche", "Week = {}", week) // Kalenderwoche
end
Das sieht doch gleich viel besser aus.
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 18:39
von PJH
Ja, jetzt funktionieren beide Varianten auch bei mir.
Jetzt müssen wir den Wochenwechsel mal abwarten.
Ihr seid schon echte openHAB Spezialisten! Danke!
Ich hatte das wohl auch alles nachgelesen (java.time), aber es waren halt alles Böhmische Dörfer für mich.
Danke nochmals und schöne Grüße.
Re: Laufende Wochenzahl errechnen
Verfasst: 6. Okt 2021 20:24
von peter-pan
udo1toni hat geschrieben: ↑6. Okt 2021 18:18
vom Ballast befreit und etwas aufgehübscht:
... es hat etwas gedauert, aber durch die Import-Möglichkeiten in DSL ergeben sich immer wieder Möglichkeiten von Alternativen Packages/Funktionen/Methoden in OH einzubinden, wenn auch nur in .rules-Dateien, was mir persönlich aber lieber ist, obwohl ich die Variante EXEC-Binding/Bash-Script auch nicht schlecht finde. Die wird wahrscheinlich auch noch unter OH7 laufen, da hier ja nur eine Standard-Abfrage aus Linux generiert wird.
PJH hat geschrieben: ↑6. Okt 2021 18:39
Jetzt müssen wir den Wochenwechsel mal abwarten.
Ich denke doch, dass diese beiden Varianten deinen Anspruch erfüllen können.
Vielleicht noch eine kleine Variation für OH3-Pages als OH-Clock-Card:
clock.jpg
und der Yaml-Code dazu:
Code: Alles auswählen
component: oh-clock-card
config:
background: peachpuff
dateFontSize: 20px
dateFontWeight: normal
dateFormat: dddd, DD.MMMM.YYYY
datePos: above
footer: '="Datum - KW: " + dayjs().isoWeek()'
showDate: true
timeFontSize: 20px
timeFontWeight: normal
timeFormat: HH:mm:ss
title: '="Datum - KW: " + dayjs().isoWeek()'
Wobei hier die JS-Funktion/Methode "dayjs().isoWeek()", das interessante sein dürfte. Die kann man ja fast in jeder Widget-Card verwenden.
Re: Laufende Wochenzahl errechnen
Verfasst: 11. Okt 2021 20:10
von PJH
Heute selbstständiger Wechsel von Wochennummer 40 auf 41.
Es funktioniert also.
Vielen Dank nochmal an alle Beteiligten.
Paul-Joachim Haucke
Re: Laufende Wochenzahl errechnen
Verfasst: 12. Okt 2021 00:19
von peter-pan
...immer gerne

Re: Laufende Wochenzahl errechnen
Verfasst: 22. Jan 2022 06:23
von klab777
Hallo,
Ich taste mich gerade an die DSL.Rule von openHab 3.2 heran und versuche erstmal meine 2.5. rules umzuschreiben. Eine import-Anweisung wird dort leider nicht erkannt. Aber ich habe
http://www.salesianer.de/util/kalwoch.html gefunden und mich erst einmal gewundert, wie einfach das ist. Ich habe es für ein LocalDate umgeschrieben und es mit
http://kalenderwoche.net/alle-kalenderwochen-2005.php über einige Jahre hinweg getestet.
Code: Alles auswählen
/* Der Donnerstag, des angegebenen Datums
* http://www.salesianer.de/util/kalwoch.html
*/
val derDonnerstag =
[
LocalDate datum|
val LocalDate datumDo = datum.plusDays ((3 - ((datum.getDayOfWeek().getValue() + 6) % 7)))
return datumDo
]
val LocalDate datum = LocalDate.now()
val LocalDate doDat = derDonnerstag.apply (datum)
val int jahr = doDat.getYear()
val LocalDate ersteWo = LocalDate.of (jahr, 1, 4)
val LocalDate do1 = derDonnerstag.apply (ersteWo)
val int kw = 1 + (doDat.getDayOfYear() - do1.getDayOfYear()) / 7
WeekOfYear.postUpdate (kw)
/*logInfo ("KW", "Datum: " + datum.toString())
logInfo ("KW", "Woche: " + kw.toString())*/