Laufende Wochenzahl errechnen
-
- Beiträge: 135
- Registriert: 23. Mai 2017 08:32
- Wohnort: Duisburg
- Kontaktdaten:
Re: Laufende Wochenzahl errechnen
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
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
openHAB 4.3 im Synology NAS Docker-Container.
- peter-pan
- Beiträge: 2767
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Laufende Wochenzahl errechnen
...probiere mal den etwas modifizierten Code (.getValue) im "then"-Abschnitt
Als Ergebnis bekomme ich dann im Log:
Andere Frage! Arbeitest du auch mit den Pages aus OH3?
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)
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
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
-
- Beiträge: 135
- Registriert: 23. Mai 2017 08:32
- Wohnort: Duisburg
- Kontaktdaten:
Re: Laufende Wochenzahl errechnen
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
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
openHAB 4.3 im Synology NAS Docker-Container.
- peter-pan
- Beiträge: 2767
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Laufende Wochenzahl errechnen
Hallo Paul,
hier noch einmal die ganze Regel auf der Basis von Udo's Code:
Ich habe auch noch eine Alternative gefunden. Allerdings brauchst du einen Import am Anfang deiner Rule-Datei:
Die eingefügten Kommentare kannst du ja weglassen.
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
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
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
- udo1toni
- Beiträge: 15264
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Laufende Wochenzahl errechnen
Ah.
Wenn man hartnäckig genug sucht, findet man dann doch eine einfache Lösung...
Vom Ballast befreit und etwas aufgehübscht:
Das sieht doch gleich viel besser aus.
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
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 135
- Registriert: 23. Mai 2017 08:32
- Wohnort: Duisburg
- Kontaktdaten:
Re: Laufende Wochenzahl errechnen
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.
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.
openHAB 4.3 im Synology NAS Docker-Container.
- peter-pan
- Beiträge: 2767
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Laufende Wochenzahl errechnen
... 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.

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: 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()'
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
-
- Beiträge: 135
- Registriert: 23. Mai 2017 08:32
- Wohnort: Duisburg
- Kontaktdaten:
Re: Laufende Wochenzahl errechnen
Heute selbstständiger Wechsel von Wochennummer 40 auf 41.
Es funktioniert also.
Vielen Dank nochmal an alle Beteiligten.
Paul-Joachim Haucke
Es funktioniert also.
Vielen Dank nochmal an alle Beteiligten.
Paul-Joachim Haucke
openHAB 4.3 im Synology NAS Docker-Container.
- peter-pan
- Beiträge: 2767
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Laufende Wochenzahl errechnen
...immer gerne 
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
- klab777
- Beiträge: 8
- Registriert: 23. Okt 2019 18:01
Re: Laufende Wochenzahl errechnen
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.
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())*/
-Raspberry pi3 mit openhab2
-habpanel
-MAX! Heizungssteuerung
-open weather map
-DWD-Wetter- und Healthdienste
-Heizungszeitenplaner
-habpanel
-MAX! Heizungssteuerung
-open weather map
-DWD-Wetter- und Healthdienste
-Heizungszeitenplaner