[beta testers wanted!] Jython addon w/ helper libraries

Tags: #<Tag:0x00007f186bcb5888> #<Tag:0x00007f186bcb5798>

I just submitted a PR that adds a core feature for a JythonScriptEngineFactory and it would be great to have some testers! Basically, this will allow for the installation of Jython with the core and community helper libraries through Paper UI, once the PR is merged. If you’d like to test it, you’ll need to…

  1. Shutdown OH
  2. Backup OH
  3. Clear your cache
  4. Copy the org.openhab.core.automation.modules.script-2.5.0-SNAPSHOT.jar to the OPENHAB_RUNTIME/system/org/openhab/core/bundles/org.openhab.core.automation.module.script/2.5.0-SNAPSHOT/ directory, replacing the one that exists. You may want to change the file extension of the existing jar, in case you want to easily rollback without a full restore (just clear the cache again after changing it back).
  5. Copy the org.core.automation.modules.script.scriptenginefactory.jython-2.5.0-SNAPSHOT.jar to OPENHAB_CONF/addons/. This jar contains the core and community libraries, so there’s no need to copy them from the repo, however, the scripts will need to be copied to /automation.jsr223/python/core/.
  6. Restart OH and watch the logs

The files are located here.

These instructions are very short and assume you are familiar with how to setup Jython and the HLs. Once these jars are installed, the core and community libraries are installed, but you still need to setup your personal libraries and scripts. Include step 7, but understand that the core libraries (/automation/lib/python/) are in the jar, so the ones you copy will be ignored. You still need the configuration.py though. I’ll update the docs when the PR is approved. Steps 10 and 11 should be skipped. I’ll come back to answer questions and fill in some gaps!

Edit: Just had a thought. If you already have Jython setup, stop OH, remove your EXTRA_JAVA_OPTS setup for Jython, clear the cache, and install the jars. The existing libraries on your filesystem will be ignored.

10 Likes

At least I made it to

2019-12-01 19:02:30.941 [INFO ] [Jython Hello World (cron decorators)] - Hello World!
2019-12-01 19:02:30.950 [DEBUG] [e.automation.internal.RuleEngineImpl] - The rule '46430ae7-e87e-4db7-b264-ff4a720edefa' is executed.

(#1766, manual install on Debian Buster).

Thx for all your effort you are putting into this :+1:

Now I need to find the time over the next days to convert my first rule to Jython. :heart_eyes:

3 Likes

Thank you, @sihui… I really appreciate your testing this! The more positive responses I get, the sooner the PR may get merged. Just shout if you need any help!

With any luck, @kai will let this one slide in to 2.5!

3 Likes

How do you find this when using docker?

IIRC, the official Docker containers are using manual installations, so the default path would be /opt/openhab2/runtime/.

On Centos7 I found it using this command:

find /var/lib/docker -name org.openhab.core.model.script

I’m currently using 2.5M5 (and considering upgrading to 2.5M6). Should I go to SNAPSHOT instead in order to test this?

You should be fine on 2.5M5. I can’t think of any reason why this wouldn’t work on anything back to 2.5.M2.

Oops, as soon as the docker is stopped, the files disappeared from /var/lib/docker. I’m still trying to figure out where exactly it’s stored with docker

I’m on my phone, but if memory serves its all installed in the container root:

/openhab2/runtime/
/openhab2/userdata/
/openhab2/conf/
1 Like

It sounds like you are looking in the wrong place. Just took a look and the directory structure is /openhab/runtime/. So, shell into your OH docker container and copy the core file to

/openhab/runtime/system/org/openhab/core/bundles/org.openhab.core.automation.module.script/2.5.0-SNAPSHOT/

… and the JythonScriptEngineFactory to…

/openhab/addons/
14:33:22.488 [WARN ] [org.apache.felix.fileinstall         ] - Error while starting bundle: file:/openhab/addons/org.openhab.core.automation.module.script.scriptenginefactory.jython-2.5.0-SNAPSHOT.jar
org.osgi.framework.BundleException: Could not resolve module: org.openhab.core.automation.module.script.scriptenginefactory.jython [204]
  Unresolved requirement: Import-Package: org.openhab.core.automation.module.script; version="[2.5.0,3.0.0)"

	at org.eclipse.osgi.container.Module.start(Module.java:444) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:383) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1260) [bundleFile:3.6.4]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1233) [bundleFile:3.6.4]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1221) [bundleFile:3.6.4]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:515) [bundleFile:3.6.4]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365) [bundleFile:3.6.4]
	at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316) [bundleFile:3.6.4]

The files are there, and I restarted openhab.

root@server:/openhab/runtime/system/org/openhab/core/bundles/org.openhab.core.automation.module.script/2.5.0.M5# ls -l
total 96
-rw-r--r-- 1 openhab openhab 45135 Dec  2 14:23 org.openhab.core.automation.module.script-2.5.0-SNAPSHOT.jar
-rw-r--r-- 1 openhab openhab 45135 Dec  2 14:23 org.openhab.core.automation.module.script-2.5.0.M5.jar.org

root@server:/openhab/addons# ls -l
total 40568
-rw-r--r-- 1 openhab openhab 41537918 Dec  2 14:27 org.openhab.core.automation.module.script.scriptenginefactory.jython-2.5.0-SNAPSHOT.jar

You cleared the cache, so the dependencies need to be resolved. This is normal. Follow the other setup instructions and it should start up and there will be additional logging (including the hello world). These files just eliminate the need to download the Jython jar, copy it in, setup the EXTRA_JAVA_OPTS, and setup the helper libraries. There is still setup needed.

I copied the two jar files, restarted openhab, installed NGRE addon via paperui, restarted openhab again. However there’s no OPENHAB_CONF/automation directory being created. Am I supposed to create it manually?

Yes. This should be covered in step 7. You can delete the core libraries or leave them (they will be ignored).

A bit confused because you said to skip step 7 “except for the scripts” which I didn’t understand

Yeah… I should clarify that in the OP. Go ahead and do step 7. The libraries will be ignored, since they are in the jar.

So I just copied Core/automation from master.zip into OPENHAB_CONF/ ? What do you mean by “the libraries”?

In my OPENHAB_CONF/automation/ I have: two directories: jsr223 and lib

Should I delete OPENHAB_CONF/automation/lib ?

I just updated the OP. Let me know if that is clearer.

(the libraries are everything under /lib/, but you need the configuration.py… probably best to just ignore them)

OK, now I got this in the log

15:19:13.340 [INFO ] [port.shared.ScriptedAutomationManager] - removeAll added handlers
15:19:13.343 [INFO ] [ome.core.service.AbstractWatchService] - Loading script 'python/personal/hello_world.py'
15:19:14.177 [DEBUG] [ript.internal.ScriptEngineManagerImpl] - Added ScriptEngine for language 'py' with identifier: file:/openhab/conf/automation/jsr223/python/personal/hello_world.py
15:19:15.213 [ERROR] [org.openhab.core.ephemeris           ] - bundle org.openhab.core.ephemeris:2.5.0.M5 (144)[org.openhab.ephemeris(69)] : The activate method has thrown an exception
java.lang.IllegalArgumentException: No enum constant java.time.DayOfWeek.SATURDAY,SUNDAY
	at java.lang.Enum.valueOf(Enum.java:238) ~[?:1.8.0_222]
	at java.time.DayOfWeek.valueOf(DayOfWeek.java:109) ~[?:1.8.0_222]
	at org.eclipse.smarthome.core.ephemeris.internal.EphemerisManagerImpl.addDayset(EphemerisManagerImpl.java:330) ~[?:?]
	at org.eclipse.smarthome.core.ephemeris.internal.EphemerisManagerImpl.lambda$2(EphemerisManagerImpl.java:151) ~[?:?]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:1.8.0_222]
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[?:1.8.0_222]
	at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[?:1.8.0_222]
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[?:1.8.0_222]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[?:1.8.0_222]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[?:1.8.0_222]
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:1.8.0_222]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:1.8.0_222]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:1.8.0_222]
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:485) ~[?:1.8.0_222]
	at org.eclipse.smarthome.core.ephemeris.internal.EphemerisManagerImpl.modified(EphemerisManagerImpl.java:131) ~[?:?]
	at org.eclipse.smarthome.core.ephemeris.internal.EphemerisManagerImpl.activate(EphemerisManagerImpl.java:126) ~[?:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
	at org.apache.felix.scr.impl.inject.methods.BaseMethod.invokeMethod(BaseMethod.java:228) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.BaseMethod.access$500(BaseMethod.java:41) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.BaseMethod$Resolved.invoke(BaseMethod.java:664) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.BaseMethod.invoke(BaseMethod.java:510) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:317) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:307) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:340) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:114) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:982) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:955) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:900) ~[?:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:212) ~[org.eclipse.osgi-3.12.100.jar:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_222]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:210) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:111) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:45) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:508) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:461) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:624) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:86) ~[?:?]
	at org.apache.felix.scr.impl.inject.BindParameters.getServiceObject(BindParameters.java:47) ~[?:?]
	at org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:664) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2308) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.prebind(DependencyManager.java:1154) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1568) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1029) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:935) ~[?:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:900) ~[?:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:212) ~[org.eclipse.osgi-3.12.100.jar:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_222]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:210) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:111) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:45) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:508) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:461) ~[org.eclipse.osgi-3.12.100.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:624) ~[org.eclipse.osgi-3.12.100.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
	at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:188) ~[?:?]
	at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:206) ~[?:?]
	at org.python.core.PyObject.__call__(PyObject.java:497) ~[?:?]
	at org.python.core.PyObject.__call__(PyObject.java:501) ~[?:?]
	at org.python.core.PyMethod.__call__(PyMethod.java:141) ~[?:?]
	at core.osgi$py.find_services$2(/openhab/conf/automation/lib/python/core/osgi/__init__.py:55) ~[?:?]
	at core.osgi$py.call_function(/openhab/conf/automation/lib/python/core/osgi/__init__.py) ~[?:?]
	at org.python.core.PyTableCode.call(PyTableCode.java:171) ~[?:?]
	at org.python.core.PyBaseCode.call(PyBaseCode.java:154) ~[?:?]
	at org.python.core.PyFunction.__call__(PyFunction.java:423) ~[?:?]
	at core.actions$py.f$0(/openhab/conf/automation/lib/python/core/actions.py:46) ~[?:?]
	at core.actions$py.call_function(/openhab/conf/automation/lib/python/core/actions.py) ~[?:?]
	at org.python.core.PyTableCode.call(PyTableCode.java:171) ~[?:?]
	at org.python.core.PyCode.call(PyCode.java:18) ~[?:?]
	at org.python.core.imp.createFromCode(imp.java:436) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:237) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:205) ~[?:?]
	at org.python.core.imp.loadFromSource(imp.java:657) ~[?:?]
	at org.python.core.imp.find_module(imp.java:551) ~[?:?]
	at org.python.core.PyModule.impAttr(PyModule.java:111) ~[?:?]
	at org.python.core.imp.import_next(imp.java:840) ~[?:?]
	at org.python.core.imp.import_logic(imp.java:905) ~[?:?]
	at org.python.core.imp.import_module_level(imp.java:970) ~[?:?]
	at org.python.core.imp.importName(imp.java:1057) ~[?:?]
	at org.python.core.ImportFunction.__call__(__builtin__.java:1280) ~[?:?]
	at org.python.core.PyObject.__call__(PyObject.java:450) ~[?:?]
	at org.python.core.__builtin__.__import__(__builtin__.java:1232) ~[?:?]
	at org.python.core.imp.importFromAs(imp.java:1149) ~[?:?]
	at org.python.core.imp.importFrom(imp.java:1124) ~[?:?]
	at core.utils$py.f$0(/openhab/conf/automation/lib/python/core/utils.py:263) ~[?:?]
	at core.utils$py.call_function(/openhab/conf/automation/lib/python/core/utils.py) ~[?:?]
	at org.python.core.PyTableCode.call(PyTableCode.java:171) ~[?:?]
	at org.python.core.PyCode.call(PyCode.java:18) ~[?:?]
	at org.python.core.imp.createFromCode(imp.java:436) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:237) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:205) ~[?:?]
	at org.python.core.imp.loadFromSource(imp.java:657) ~[?:?]
	at org.python.core.imp.find_module(imp.java:551) ~[?:?]
	at org.python.core.PyModule.impAttr(PyModule.java:111) ~[?:?]
	at org.python.core.imp.import_next(imp.java:840) ~[?:?]
	at org.python.core.imp.import_logic(imp.java:905) ~[?:?]
	at org.python.core.imp.import_module_level(imp.java:970) ~[?:?]
	at org.python.core.imp.importName(imp.java:1057) ~[?:?]
	at org.python.core.ImportFunction.__call__(__builtin__.java:1280) ~[?:?]
	at org.python.core.PyObject.__call__(PyObject.java:450) ~[?:?]
	at org.python.core.__builtin__.__import__(__builtin__.java:1232) ~[?:?]
	at org.python.core.imp.importFromAs(imp.java:1149) ~[?:?]
	at org.python.core.imp.importFrom(imp.java:1124) ~[?:?]
	at core.triggers$py.f$0(/openhab/conf/automation/lib/python/core/triggers.py:744) ~[?:?]
	at core.triggers$py.call_function(/openhab/conf/automation/lib/python/core/triggers.py) ~[?:?]
	at org.python.core.PyTableCode.call(PyTableCode.java:171) ~[?:?]
	at org.python.core.PyCode.call(PyCode.java:18) ~[?:?]
	at org.python.core.imp.createFromCode(imp.java:436) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:237) ~[?:?]
	at org.python.core.imp.createFromPyClass(imp.java:205) ~[?:?]
	at org.python.core.imp.loadFromSource(imp.java:657) ~[?:?]
	at org.python.core.imp.find_module(imp.java:551) ~[?:?]
	at org.python.core.PyModule.impAttr(PyModule.java:111) ~[?:?]
	at org.python.core.imp.import_next(imp.java:840) ~[?:?]
	at org.python.core.imp.import_logic(imp.java:905) ~[?:?]
	at org.python.core.imp.import_module_level(imp.java:970) ~[?:?]
	at org.python.core.imp.importName(imp.java:1057) ~[?:?]
	at org.python.core.ImportFunction.__call__(__builtin__.java:1280) ~[?:?]
	at org.python.core.PyObject.__call__(PyObject.java:450) ~[?:?]
	at org.python.core.__builtin__.__import__(__builtin__.java:1232) ~[?:?]
	at org.python.core.imp.importFromAs(imp.java:1149) ~[?:?]
	at org.python.core.imp.importFrom(imp.java:1124) ~[?:?]
	at org.python.pycode._pyx24.f$0(<script>:8) ~[?:?]
	at org.python.pycode._pyx24.call_function(<script>) ~[?:?]
	at org.python.core.PyTableCode.call(PyTableCode.java:171) ~[?:?]
	at org.python.core.PyCode.call(PyCode.java:18) ~[?:?]
	at org.python.core.Py.runCode(Py.java:1614) ~[?:?]
	at org.python.core.__builtin__.eval(__builtin__.java:497) ~[?:?]
	at org.python.core.__builtin__.eval(__builtin__.java:501) ~[?:?]
	at org.python.util.PythonInterpreter.eval(PythonInterpreter.java:259) ~[?:?]
	at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:57) ~[?:?]
	at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:64) ~[?:?]
	at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249) ~[?:1.8.0_222]
	at org.openhab.core.automation.module.script.internal.ScriptEngineManagerImpl.loadScript(ScriptEngineManagerImpl.java:155) ~[?:?]
	at org.openhab.core.automation.module.script.rulesupport.internal.loader.ScriptFileWatcher.importFile(ScriptFileWatcher.java:176) ~[?:?]
	at org.openhab.core.automation.module.script.rulesupport.internal.loader.ScriptFileWatcher.processWatchEvent(ScriptFileWatcher.java:143) ~[?:?]
	at org.eclipse.smarthome.core.service.WatchQueueReader.lambda$3(WatchQueueReader.java:323) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_222]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_222]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_222]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_222]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_222]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_222]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]
15:19:15.241 [ERROR] [ript.internal.ScriptEngineManagerImpl] - Error during evaluation of script 'file:/openhab/conf/automation/jsr223/python/personal/hello_world.py': AttributeError: 'NoneType' object has no attribute 'actionClass' in <script> at line number 6

Line 6 in hello_world.py is just this

from core.triggers import when
log:set TRACE org.openhab.core.automation

Set that and restart OH. There ill be a log entry like…

2019-12-01 05:53:22.840 [TRACE] [org.openhab.core.automation.module.script.scriptenginefactory.jython.JythonScriptEngineFactory] - python.home [/mnt/data/openhab/openhab2-1764/userdata/cache/org.eclipse.osgi/211/0/bundleFile], python.path [/mnt/data/openhab/openhab2-1764/conf/automation/lib/python]

What does yours have?