Laufende Wochenzahl errechnen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

PJH
Beiträge: 135
Registriert: 23. Mai 2017 08:32
Answers: 0
Wohnort: Duisburg
Kontaktdaten:

Re: Laufende Wochenzahl errechnen

Beitrag 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
openHAB 4.3 im Synology NAS Docker-Container.

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

Re: Laufende Wochenzahl errechnen

Beitrag 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?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

PJH
Beiträge: 135
Registriert: 23. Mai 2017 08:32
Answers: 0
Wohnort: Duisburg
Kontaktdaten:

Re: Laufende Wochenzahl errechnen

Beitrag 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
openHAB 4.3 im Synology NAS Docker-Container.

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

Re: Laufende Wochenzahl errechnen

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Laufende Wochenzahl errechnen

Beitrag 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.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

PJH
Beiträge: 135
Registriert: 23. Mai 2017 08:32
Answers: 0
Wohnort: Duisburg
Kontaktdaten:

Re: Laufende Wochenzahl errechnen

Beitrag 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.
openHAB 4.3 im Synology NAS Docker-Container.

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

Re: Laufende Wochenzahl errechnen

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

PJH
Beiträge: 135
Registriert: 23. Mai 2017 08:32
Answers: 0
Wohnort: Duisburg
Kontaktdaten:

Re: Laufende Wochenzahl errechnen

Beitrag von PJH »

Heute selbstständiger Wechsel von Wochennummer 40 auf 41.

Es funktioniert also.

Vielen Dank nochmal an alle Beteiligten.

Paul-Joachim Haucke
openHAB 4.3 im Synology NAS Docker-Container.

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

Re: Laufende Wochenzahl errechnen

Beitrag von peter-pan »

...immer gerne 👍
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
klab777
Beiträge: 8
Registriert: 23. Okt 2019 18:01
Answers: 0

Re: Laufende Wochenzahl errechnen

Beitrag 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())*/
-Raspberry pi3 mit openhab2
-habpanel
-MAX! Heizungssteuerung
-open weather map
-DWD-Wetter- und Healthdienste
-Heizungszeitenplaner

Antworten