I’m at the very beginning to learn the new automation engine starting with the conversion from some basic routines.
With the following code I try to convert some lambdas I had in Rules DSL. Unfortunately I’m not coming to test the code itself as I’m already struggling in the call of the function:
30-Aug-2020 11:52:09.981 [INFO ] [jsr223.jython.Test: Generisch ] - Test Rule getriggert
30-Aug-2020 11:52:11.566 [ERROR] [jsr223.jython.Test: Generisch ] - Traceback (most recent call last):
File "/etc/openhab2/automation/lib/python/core/log.py", line 51, in wrapper
return fn(*args, **kwargs)
File "<script>", line 61, in TestRule
IllegalArgumentException: java.lang.IllegalArgumentException: No instant converter found for type: org.python.core.PyFunction
The problem is the line:
NachtBeginn = DateTime(fnNachtBeginn)
but this one also doesn’t work
NachtEnde = fnNachtEnde
I don’t know how to solve that.
import time
from core.rules import rule
from core.triggers import when
from core.date import to_joda_datetime
from org.joda.time import DateTime
# prüfen, ob es Tag oder Nacht ist
def fnNachtBeginn():
now = DateTime.now()
Zeit2200Uhr = now.withTimeAtStartOfDay.plusHours(22) # 22 Uhr abends
#Sonnenuntergang = DateTime(ir.getItem("dtm_Astro_Sonnenuntergang").state).zonedDateTime.toInstant.toEpochMilli
Sonnenuntergang = to_joda_datetime(ir.getItem("dtm_Astro_Sonnenuntergang")).millis
Differenz = Sonnenuntergang - now.millis
NachtBeginn = now.plusMillis(Differenz.intValue / 2) # Mitte von civilDusk#start und civilDusk#end
# Nacht-Ende nicht nach 22 Uhr
if NachtBeginn.isAfter(Zeit2200Uhr):
NachtBeginn = Zeit2200Uhr
return NachtBeginn
# prüfen, ob es Tag oder Nacht ist
def fnNachtEnde():
now = DateTime.now()
Zeit0600Uhr = now.withTimeAtStartOfDay.plusHours(5).plusMinutes(59).plusSeconds(30) # 6 Uhr morgens (5:59:30)
Sonnenaufgang = DateTime(ir.getItem("dtm_Astro_Sonnenaufgang").state).zonedDateTime.toInstant.toEpochMilli
Differenz = Sonnenaufgang - now.millis
NachtEnde = now.plusMillis(Differenz.intValue / 2) # Mitte von civilDawn#start und civilDawn#end
# Nacht-Ende nicht vor 6 Uhr
if NachtEnde.isBefore(Zeit0600Uhr):
NachtEnde = Zeit0600Uhr
return int(NachtEnde.millis)
@rule("Test: Generisch")
@when("Item swi_Sys_Test changed to ON")
def TestRule(event):
TestRule.log.info("Test Rule getriggert")
# immer am Anfang, falls das Skript nicht zum Ende durchläuft...
time.sleep(1.5)
events.postUpdate("swi_Sys_Test", "OFF")
# eigentlicher Code
now = DateTime.now()
NachtBeginn = DateTime(fnNachtBeginn)
NachNachtBeginn = now.isAfter(NachtBeginn.millis)
NachtEnde = fnNachtEnde
VorNachtEnde = now.isBefore(DateTime(NachtEnde).millis)
if NachNachtBeginn or VorNachtEnde:
events.postUpdate("swi_Astro_Nacht", "ON")
TestRule.log.info("Es ist Nacht")
else:
events.postUpdate("swi_Astro_Nacht", "OFF")
TestRule.log.info("Es ist Tag")
# Ende vom eigentlichen Code
TestRule.log.info("Test Rule beendet")