First steps in jython


I want to give a try to jython rules. I installed the automation plugin and also folloed the instructions posted here.

When reaching the verification step with the, I get an error in the log

2021-01-24 23:15:04.069 [INFO ] [ab.core.service.AbstractWatchService] - Loading script '/etc/openhab/automation/jsr223/python/personal/'
2021-01-24 23:15:07.647 [DEBUG] [ipt.internal.ScriptEngineManagerImpl] - Added ScriptEngine for language 'py' with identifier: file:/etc/openhab/automation/jsr223/python/personal/
2021-01-24 23:15:12.121 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error during evaluation of script 'file:/etc/openhab/automation/jsr223/python/personal/': ImportError: No module named joda in <script> at line number 6

I have not customized (except for the email address), nor set EXTRA_JAVA_OPTS (according to this).

So, what am I missing?

FYI, the addition error appears at the start - see below.


2021-01-24 23:08:17.452 [WARN ] [jython.startup                      ] - 
Jython version:   
Operating system:           Linux
OS Version:                 5.4.83-v7l+
Java vendor:                Azul Systems, Inc.
Java VM name:               OpenJDK Client VM
Java runtime name:          OpenJDK Runtime Environment
Java runtime version:       11.0.9+11-LTS installed: True
sys.path:                   /etc/openhab/automation/lib/python
2021-01-24 23:08:17.459 [INFO ] [ab.core.service.AbstractWatchService] - Loading script '/etc/openhab/automation/jsr223/python/core/components/'
2021-01-24 23:08:19.845 [WARN ] [mmon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception: 
java.lang.NullPointerException: null
	at org.openhab.binding.mqtt.generic.MqttChannelTypeProvider.derive( ~[?:?]
	at org.openhab.binding.mqtt.homeassistant.internal.discovery.HomeAssistantDiscovery.publishResults( ~[?:?]
	at java.util.concurrent.Executors$ ~[?:?]
	at ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker( [?:?]
	at java.util.concurrent.ThreadPoolExecutor$ [?:?]
	at [?:?]
2021-01-24 23:08:21.802 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error during evaluation of script 'file:/etc/openhab/automation/jsr223/python/core/components/': java.lang.NullPointerException: java.lang.NullPointerException in <script> at line number 8

With openhab 3 you no longer need to modify the EXTRA_JAVA_OPTS. The error you are seeing is because the helper libraries have not been upgraded to work with OH3 yet, but there is an open Pull Request #376 with a version that works.

have a look here

@CrazyIvan359 , @HaKuNa

thanks for pointing out to the issue - I am not sure if I want to wait for the official release or going for the cutting edge… I am not a big fan of DSL rules :wink:


@Max77 I finally migrated to OH3 with the Jithon helper libs workaround one week ago. No issues so far. I have 70 things, around 700 items and around 100 Jithon rules. There is only one DSL rule remaining (timeLinePicker).

@Max77 the changes required to get the libraries working on OH3 are actually quite small. I’ve done previous work on the Helper Libraries and went over Jim’s work and fixed a few things that were missed (that PR contains those updates). I have been running that version ever since with no issues, you should not be concerned about stability.

@HaKuNa , @CrazyIvan359

thanks a lot, patch installed and working :slight_smile:


Next (small?) issue - I have tried the as instructed

This script uses a decorated cron rule that will generate logs every 10s and can be used to test your initial setup.

from core.rules import rule
from core.triggers import when

@rule("Jython Hello World (cron decorators)", description="This is an example cron triggered rule using decorators", tags=["Test tag", "Hello World"])# description and tags are optional
@when("Time cron 0/10 * * * * ?")
def hello_world_cron_decorators(event):"Hello World!")

and I can see the rule is triggered by the cron event (in 10s +/- 2ms :sunglasses:)

2021-01-27 22:55:31.362 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'iPadMax_Location' changed...
2021-01-27 22:55:40.372 [DEBUG] [e.automation.internal.RuleEngineImpl] - The trigger 'Time_cron_0_10_27eeb05e60ea11ebb38bdca63251b192_28834f4060ea11ebbc57dca63251b192' of rule '8377f5bd-38a0-4ab7-887f-40965cc56b74' is triggered.
2021-01-27 22:55:40.375 [DEBUG] [e.automation.internal.RuleEngineImpl] - The rule '8377f5bd-38a0-4ab7-887f-40965cc56b74' is executed.
2021-01-27 22:55:50.374 [DEBUG] [e.automation.internal.RuleEngineImpl] - The trigger 'Time_cron_0_10_27eeb05e60ea11ebb38bdca63251b192_28834f4060ea11ebbc57dca63251b192' of rule '8377f5bd-38a0-4ab7-887f-40965cc56b74' is triggered.
2021-01-27 22:55:50.378 [DEBUG] [e.automation.internal.RuleEngineImpl] - The rule '8377f5bd-38a0-4ab7-887f-40965cc56b74' is executed.

But why I do not see any β€œHello World!” message? Am I missing something? I have looked to the different OH logging capabilities, but no explanation came to my mind.

Thanks for your help!

Did you create a file? If so, you may need to set the log level for whatever LOG_PREFIX is set to in karaf.

try log.warn or log.error

I have renamed and just left as-is

# -*- coding: utf-8 -*-
LOG_PREFIX = "jsr223.jython"

admin_email = ""

openhabHost = "localhost"
openhabPort = "8080"# "8443"

My karaf reports

openhab> log:list                                                                                                                                  
Logger                                             β”‚ Level
ROOT                                               β”‚ ERROR
javax.jmdns                                        β”‚ ERROR
javax.mail                                         β”‚ ERROR
openhab.event                                      β”‚ INFO
openhab.event.AddonEvent                           β”‚ ERROR
openhab.event.InboxUpdatedEvent                    β”‚ ERROR
openhab.event.ItemAddedEvent                       β”‚ ERROR
openhab.event.ItemChannelLinkAddedEvent            β”‚ ERROR
openhab.event.ItemChannelLinkRemovedEvent          β”‚ ERROR
openhab.event.ItemRemovedEvent                     β”‚ ERROR
openhab.event.ItemStateEvent                       β”‚ ERROR
openhab.event.RuleAddedEvent                       β”‚ ERROR
openhab.event.RuleRemovedEvent                     β”‚ ERROR
openhab.event.RuleStatusInfoEvent                  β”‚ ERROR
openhab.event.StartlevelEvent                      β”‚ ERROR
openhab.event.ThingAddedEvent                      β”‚ ERROR
openhab.event.ThingRemovedEvent                    β”‚ ERROR
openhab.event.ThingStatusInfoEvent                 β”‚ ERROR
openhab.event.ThingUpdatedEvent                    β”‚ ERROR
org.apache.cxf.jaxrs.sse.SseEventSinkImpl          β”‚ ERROR
org.apache.karaf.jaas.modules.audit                β”‚ INFO
org.apache.karaf.kar.internal.KarServiceImpl       β”‚ ERROR                β”‚ ERROR                     β”‚ OFF
org.apache.sshd                                    β”‚ WARN
org.eclipse.lsp4j                                  β”‚ OFF
org.jupnp                                          β”‚ ERROR
org.openhab                                        β”‚ INFO
org.openhab.core.automation                        β”‚ DEBUG
org.ops4j.pax.url.mvn.internal.AetherBasedResolver β”‚ ERROR
org.ops4j.pax.web.pax-web-runtime                  β”‚ OFF

I am not really sure where to go from here…

Run log:set DEBUG jsr223.jython and see if that makes the log entries appear.

1 Like

Thanks, it works now!

Now I can start working with JS223 rules - they seem the right way to get access to semantic data (as compared to DSL rules) and achieve what I want to do :slight_smile:

1 Like