OH3 rule Differenz zwischen zwei Daten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45
Answers: 0

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udi »

int5749 hat geschrieben: 15. Mär 2022 20:51
udi hat geschrieben: 15. Mär 2022 17:59 Wenn ich Udo richtig verstanden habe, brauche ich doch aber einen "Auslöser", sprich ein Event. Ist dafür auch ein cron möglich? :shock:
Ja, siehe meine Rules, 2 davon werden auch über Cron getriggert
Du hast recht. Ich hatte den Code nur bis zur Mitten der 2 rule gelesen. Und dann kamen mir Zweifel, ob das für mich das Richtige ist :D Aber trotzdem herlichen Dank für den Suppport!!!

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45
Answers: 0

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udi »

peter-pan hat geschrieben: 15. Mär 2022 15:50 ...hier noch ein Beispiel einer DSL-Rule, das den Unterschied, zwischen einem bestimmten Item-Datum und "Jetzt" berechnet.

Code: Alles auswählen

rule "Datumvergleich mit jetzt"
  when
   Item Dummy_4 changed to ON
  then
   logInfo("test","------------------------------------------------------")
   var vSpringStartMet = (Spring_Start_Met.state as DateTimeType).getZonedDateTime.getDayOfYear()
   logInfo("test","Met Frühling ist an Tag: {}", vSpringStartMet)
   var vDayOfYear = LocalDate.now.getDayOfYear()
   logInfo("test","Heute ist Tag: {}", vDayOfYear)
   var vDiff = vSpringStartMet - vDayOfYear
   logInfo("test","Differenz ist : {}", vDiff)
// oder kurz
   vDiff = (Spring_Start_Met.state as DateTimeType).getZonedDateTime.getDayOfYear() - LocalDate.now.getDayOfYear()
   logInfo("test","Differenz ist : {}", vDiff)
   logInfo("test","------------------------------------------------------")
end
Als Trigger habe ich einfach einen Dummy-Switch benutzt. Für die Berechnung brauchst du eigentlich nur die Zeile die nach dem // oder kurz steht.

Was davor kommt ist eigentlich nur die Auflösung zum besseren Verständnis.

Hast du deine Regel schon mal ausprobiert ? Irgendwie scheint das nicht DSL zu sein, oder das ist eine neuere Version, die ich nicht kenne. Man kann auch mit der Item-Registry arbeiten, aber die muss man dann vor der (den) Rule(s) definieren.
Danke Peter für deinen Ansatz. Ich wollte DSL rules gerne vermeiden. Ich versuche alles in Java zu pressen und per VC Code zu pflegen. Da ich mehrere Systeme pflege, ist es so für mich einfacher, alles im Überblick zu habem :geek:

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45
Answers: 0

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udi »

udo1toni hat geschrieben: 15. Mär 2022 17:26 Wie meine Vorredner das schon erläutert haben, wird man so etwas eher über eine Time cron Expression auslösen.
Wenn Datum und Uhrzeit (auch wenn die Zeit keine Rolle spielen soll, ist dieser Anteil immer vorhanden) aus einem DateTime Item kommen, musst Du dieses vor einem Vergleich nach JavaTime umrechnen lassen.
now() oder LocalDate.now() liefert das aktuelle Datum und die aktuelle Zeit (LocalDate mit Information über die Zeitzone). Solange es nur um den Tag geht, wäre .getDayOfYear() sicherlich sinnvoll (das müsste Integer oder Long sein, aber auf jeden Fall ohne Nachkommastellen)

Code: Alles auswählen

rule "Einnerung Mülltonne"
when 
    Time cron "15 15 7 ? * 1-6" // Montag bis Samstag um 07:15:15 Uhr
then
    if(!(event3_name.state instanceof DateTimeType)) {
        logInfo("muell","Kein gültiges Datum! ({})",event3_name.state)
        return;
    }
    val Integer iDiff = (event3_name.state as DateTimeType).getZonedDateTime.getDayOfYear() - LocalDate.now.getDayOfYear()

    if(iDiff == 1) {       // Ereignis morgen?
        // sende Nachricht
    }
end
Je nachdem, wie Du eine Nachricht versenden willst, sieht der Code da natürlich unterschiedlich aus.
Hallo Udo,

Du hast es auf den Punkt getroffen! :D :D :D So funktioniert die Erinnerung. Zum Testen haben ich auf der Differenz 1 mal eine 8 gemacht. In 8 Tagen kommt die nächste Abholung. Und den cron habe ich auf eine aktuelle Zeit gesetzt. Hat wunderbar geklappt.

2 kurze Fragen haben ich noch zu deinem Code:

1. ist die erste if Bedingung notwendig oder dient diese nur dem Log? D.h. man könnte diese Zeiten auch raus nehmen?
2. warum war dein Cron auf 6 Tage eingerichtet? Weil Sonntags kein Müll abgeholt wird? Samstag bei uns zumindest auch nicht. Aber dann müsste man den Cron doch für Freitag und Samstag ausetzen, denn die Meldung erfolgt einen Tag im Voraus. Sprich die letzte Prüfung Donnerstag früh. Und dann wieder ab Sonntag früh. Oder denke ich falsch?

Zum Schluss möchte ich meine finale rule noch teilen, damit vielleicht auch andere davon profitieren oder lernen können :)

Code: Alles auswählen

rule "Erinnerung Restabfall"
when
    Time cron "00 30 07 ? * 1-7" 
then
     if(!(event3_name.state instanceof DateTimeType)) {
        logInfo("muell","Kein gültiges Datum! ({})",event3_name.state)
        return;
    }
    val Integer iDiff = (event3_name.state as DateTimeType).getZonedDateTime.getDayOfYear() - LocalDate.now.getDayOfYear()

    if(iDiff == 1) {
    val urlmessage = URLEncoder::encode("Die schwarze Tonne wird Morgen abgeholt!", 'UTF-8')
    sendHttpGetRequest("https://api.callmebot.com/whatsapp.php?source=openHAB&phone=+xxxxxxxxxx&apikey=xxxxxx&text=" + urlmessage)
    }
end
Der cron löste jeden Tag 7:30 aus. An Tagen, an denen nichts abgeolt wird, kann auch die Differenz nicht 1 sein. Von daher kommt es nicht zu unnötigen Benachrichtigungen. Sobald der Abgleich des aktuellen Datums mit dem des Events auf einen Tag fällt, also morgen die Abholung erfolgt, geht eine Nachricht raus. Das Ganze habe ich für die unterschiedlichen Events, sprich Müllarten, dupliziert.

Ich möchte mich nochmal ganz herzlich bei allen für eure Hilfe bedanken! Udo, Peter, und und und. Im Forum hier und auch in anderen Foren habe ich schon viel von euch gelesen und gelernt. Super Community! Macht weiter so! :mrgreen: :mrgreen: :mrgreen:

Viele Grüße
udi

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

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von peter-pan »

udi hat geschrieben: 16. Mär 2022 21:19 Danke Peter für deinen Ansatz. Ich wollte DSL Rules gerne vermeiden.
Nur der guten Ordnung halber. Du weisst schon, dass die Regeln (egal ob von Udo, int5749 oder mir) alles DSL-Rules sind. Das hat mit Java zunächst einmal gar nichts zu tun.
Und der VSC-Editor ist ein Editor den man um das OH-Plugin erweitern kann, mit dem man dann, wenn das LSP-Protokol aktiviert worden ist, ein Syntax-Prüfung für DSL und die OH-Umgebung(z.B.:Items) vornehmen (lassen) kann. ;)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udo1toni »

udi hat geschrieben: 16. Mär 2022 21:58 1. ist die erste if Bedingung notwendig oder dient diese nur dem Log? D.h. man könnte diese Zeiten auch raus nehmen?
Ja, die ist notwendig. Wenn das Item kein gültiges Datum enthält, wird es sonst eine NullPointer Exception geben (unabhängig von der verwendeten Programmiersprache).
udi hat geschrieben: 16. Mär 2022 21:58 2. warum war dein Cron auf 6 Tage eingerichtet? Weil Sonntags kein Müll abgeholt wird? Samstag bei uns zumindest auch nicht. Aber dann müsste man den Cron doch für Freitag und Samstag ausetzen, denn die Meldung erfolgt einen Tag im Voraus. Sprich die letzte Prüfung Donnerstag früh. Und dann wieder ab Sonntag früh. Oder denke ich falsch?
Erwischt. Also wäre der Test 1-4,7 oder alternativ MON-THU,SUN (keine Leerzeichen, die trennen ja die einzelnen Felder im cron Ausdruck).
Natürlich kannst Du die Rule auch einfach täglich laufen lassen (dann reicht ein *), mir ging es dabei vor allem darum, unauffällig darauf hinzuweisen, dass so etwas geht...

Programmiersprache: Die DSL ist mit XText/XTend gebaut, welches auf Java aufsetzt. Dennoch handelt es sich nicht um Java. Und man kann in openHAB auch kein Java zum Programmieren von Rules verwenden, allenfalls JavaScript. JavaScript hat abgesehen von der Namensähnlichkeit nicht all zu viel mit Java zu tun.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45
Answers: 0

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udi »

peter-pan hat geschrieben: 17. Mär 2022 00:09
udi hat geschrieben: 16. Mär 2022 21:19 Danke Peter für deinen Ansatz. Ich wollte DSL Rules gerne vermeiden.
Nur der guten Ordnung halber. Du weisst schon, dass die Regeln (egal ob von Udo, int5749 oder mir) alles DSL-Rules sind. Das hat mit Java zunächst einmal gar nichts zu tun.
Und der VSC-Editor ist ein Editor den man um das OH-Plugin erweitern kann, mit dem man dann, wenn das LSP-Protokol aktiviert worden ist, ein Syntax-Prüfung für DSL und die OH-Umgebung(z.B.:Items) vornehmen (lassen) kann. ;)
ein weiterer Beleg, dass ich von Java keine Ahnung hab :shock: :shock: :shock: Mna, wie peinlich!

udi
Beiträge: 26
Registriert: 31. Okt 2020 10:45
Answers: 0

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udi »

udo1toni hat geschrieben: 17. Mär 2022 00:58 Ja, die ist notwendig. Wenn das Item kein gültiges Datum enthält, wird es sonst eine NullPointer Exception geben (unabhängig von der verwendeten Programmiersprache).
ok, verstehe. Das würde dann zum Beispiel auf Weihnachtsbäume zutreffen. Die werden ja nur ein Mal im Jahr abgeholt und die Events schauen nur 30 Tage in die Zukunft.
udo1toni hat geschrieben: 17. Mär 2022 00:58 Erwischt. Also wäre der Test 1-4,7 oder alternativ MON-THU,SUN (keine Leerzeichen, die trennen ja die einzelnen Felder im cron Ausdruck).
Natürlich kannst Du die Rule auch einfach täglich laufen lassen (dann reicht ein *), mir ging es dabei vor allem darum, unauffällig darauf hinzuweisen, dass so etwas geht...
ein blindes Huhn findet auch mal ein Korn. :D Verstanden, danke für den Hinweis! Bezüglich cron habe ich mich im Zuge deiner rule auch noch etwas belesen.
udo1toni hat geschrieben: 17. Mär 2022 00:58 Programmiersprache: Die DSL ist mit XText/XTend gebaut, welches auf Java aufsetzt. Dennoch handelt es sich nicht um Java. Und man kann in openHAB auch kein Java zum Programmieren von Rules verwenden, allenfalls JavaScript. JavaScript hat abgesehen von der Namensähnlichkeit nicht all zu viel mit Java zu tun.
Ich habe das total durcheinander gebracht. Sorry! Peter hat mich ja freundlicher Weise auch schon darauf hingewiesen. Bisher dachte ich DSL rules kann man nur über das Frontend von OH anlegen. Was über VS Code (mit OH Plugin) erstellt wird, ist JavaScript. Mein Fehler...

Auf jeden Fall läuft es nun wunderbar und ich habe dazu gelernt! Danke für eure Zeit :P

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

Re: OH3 rule Differenz zwischen zwei Daten

Beitrag von udo1toni »

Immer gerne!
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten