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

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
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 habempeter-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.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.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
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.
Hallo Udo,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)Je nachdem, wie Du eine Nachricht versenden willst, sieht der Code da natürlich unterschiedlich aus.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
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
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.
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).
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).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?
ein weiterer Beleg, dass ich von Java keine Ahnung habpeter-pan hat geschrieben: ↑17. Mär 2022 00:09Nur 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.![]()
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.
ein blindes Huhn findet auch mal ein Korn.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...
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...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.