diff --git a/CODEOWNERS b/CODEOWNERS index 9411bb3f3168e..8a82b49aa7d0a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,6 +8,7 @@ /bundles/org.openhab.automation.groovyscripting/ @wborn /bundles/org.openhab.automation.jrubyscripting/ @boc-tothefuture @ccutrer @jimtng /bundles/org.openhab.automation.jsscripting/ @jpg0 @florian-h05 +/bundles/org.openhab.automation.jsscriptingnashorn/ @wborn /bundles/org.openhab.automation.jythonscripting/ @openhab/add-ons-maintainers /bundles/org.openhab.automation.pidcontroller/ @fwolter /bundles/org.openhab.automation.pwm/ @fwolter @@ -414,6 +415,7 @@ /bundles/org.openhab.voice.voicerss/ @JochenHiller @lolodomo /bundles/org.openhab.voice.voskstt/ @GiviMAD /bundles/org.openhab.voice.watsonstt/ @GiviMAD +/itests/org.openhab.automation.jsscriptingnashorn.tests/ @wborn /itests/org.openhab.binding.astro.tests/ @gerrieg /itests/org.openhab.binding.avmfritz.tests/ @cweitkamp /itests/org.openhab.binding.feed.tests/ @svilenvul diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index 93ef9bbd563a9..d446bf5b49ed9 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -31,6 +31,11 @@ org.openhab.automation.jsscripting ${project.version} + + org.openhab.addons.bundles + org.openhab.automation.jsscriptingnashorn + ${project.version} + org.openhab.addons.bundles org.openhab.automation.jythonscripting diff --git a/bundles/org.openhab.automation.jsscriptingnashorn/NOTICE b/bundles/org.openhab.automation.jsscriptingnashorn/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/bundles/org.openhab.automation.jsscriptingnashorn/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.automation.jsscriptingnashorn/README.md b/bundles/org.openhab.automation.jsscriptingnashorn/README.md new file mode 100644 index 0000000000000..dec02996e65e4 --- /dev/null +++ b/bundles/org.openhab.automation.jsscriptingnashorn/README.md @@ -0,0 +1,49 @@ +# JavaScript Scripting (Nashorn) + +This add-on allows you to use your older ECMAScript 5.1 code on newer Java versions until the code is migrated to ECMAScript 2021+. +It should only be installed for providing backwards compatibility. +When writing new code it is preferred to do this using ECMAScript 2021+ for which support is provided by installing the [JavaScript Scripting](https://www.openhab.org/addons/automation/jsscripting/) add-on. + +This add-on uses a standalone [Nashorn Engine](https://github.com/openjdk/nashorn) to run ECMAScript 5.1 code. +The Nashorn Engine was pre-installed in openHAB 2 and openHAB 3 because it was part of Java. +Since Java 15 the Nashorn Engine has been removed from Java. + +## Creating JavaScript Scripts + +When this add-on is installed, JavaScript script actions will be run by this add-on and allow ECMAScript 5.1 features. + +Alternatively, you can create scripts in the `automation/jsr223` configuration directory. +If you create an empty file called `test.nashornjs`, you will see a log line with information similar to: + +```text + ... [INFO ] [.a.m.s.r.i.l.ScriptFileWatcher:150 ] - Loading script 'test.nashornjs' +``` + +To enable debug logging, use the [console logging]({{base}}/administration/logging.html) commands to enable debug logging for the automation functionality: + +```text +log:set DEBUG org.openhab.core.automation +``` + +For more information on the available APIs in scripts see the [JSR223 Scripting]({{base}}/configuration/jsr223.html) documentation. + +## Script Examples + +JavaScript scripts provide access to almost all the functionality in an openHAB runtime environment. +As a simple example, the following script logs "Hello, World!". +Note that `console.log` will usually not work since the output has no terminal to display the text. +The openHAB server uses the [SLF4J](https://www.slf4j.org/) library for logging. + +```js +var LoggerFactory = Java.type('org.slf4j.LoggerFactory'); + +LoggerFactory.getLogger("org.openhab.core.automation.examples").info("Hello, World!"); +``` + +Depending on the openHAB logging configuration, you may need to prefix logger names with `org.openhab.core.automation` for them to show up in the log file (or you modify the logging configuration). + +The script uses the [LoggerFactory](https://www.slf4j.org/apidocs/org/slf4j/Logger.html) to obtain a named logger and then logs a message like: + +```text + ... [INFO ] [org.openhab.core.automation.examples ] - Hello, World! +``` diff --git a/bundles/org.openhab.automation.jsscriptingnashorn/pom.xml b/bundles/org.openhab.automation.jsscriptingnashorn/pom.xml new file mode 100644 index 0000000000000..b76eb63164e6a --- /dev/null +++ b/bundles/org.openhab.automation.jsscriptingnashorn/pom.xml @@ -0,0 +1,56 @@ + + + + 4.0.0 + + + org.openhab.addons.bundles + org.openhab.addons.reactor.bundles + 4.0.0-SNAPSHOT + + + org.openhab.automation.jsscriptingnashorn + + openHAB Add-ons :: Bundles :: Automation :: JavaScript Scripting (Nashorn) + + + jdk.dynalink.*;resolution:=optional + 7.3.1 + + + + + org.openjdk.nashorn + nashorn-core + 15.4 + compile + + + org.ow2.asm + asm + ${asm.version} + + + org.ow2.asm + asm-analysis + ${asm.version} + + + org.ow2.asm + asm-commons + ${asm.version} + + + org.ow2.asm + asm-tree + ${asm.version} + + + org.ow2.asm + asm-util + ${asm.version} + + + + diff --git a/bundles/org.openhab.automation.jsscriptingnashorn/src/main/feature/feature.xml b/bundles/org.openhab.automation.jsscriptingnashorn/src/main/feature/feature.xml new file mode 100644 index 0000000000000..15e98bdaf6735 --- /dev/null +++ b/bundles/org.openhab.automation.jsscriptingnashorn/src/main/feature/feature.xml @@ -0,0 +1,9 @@ + + + mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features + + + openhab-runtime-base + mvn:org.openhab.addons.bundles/org.openhab.automation.jsscriptingnashorn/${project.version} + + diff --git a/bundles/org.openhab.automation.jsscriptingnashorn/src/main/java/org/openhab/automation/jsscriptingnashorn/internal/NashornScriptEngineFactory.java b/bundles/org.openhab.automation.jsscriptingnashorn/src/main/java/org/openhab/automation/jsscriptingnashorn/internal/NashornScriptEngineFactory.java new file mode 100644 index 0000000000000..d1711c20a6586 --- /dev/null +++ b/bundles/org.openhab.automation.jsscriptingnashorn/src/main/java/org/openhab/automation/jsscriptingnashorn/internal/NashornScriptEngineFactory.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2010-2022 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.automation.jsscriptingnashorn.internal; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.core.automation.module.script.AbstractScriptEngineFactory; +import org.openhab.core.automation.module.script.ScriptEngineFactory; +import org.osgi.service.component.annotations.Component; + +/** + * This is an implementation of a {@link ScriptEngineFactory} for Nashorn. + * + * @author Wouter Born - Initial contribution + */ +@Component(service = ScriptEngineFactory.class) +@NonNullByDefault +public class NashornScriptEngineFactory extends AbstractScriptEngineFactory { + + private final org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory factory = new org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory(); + + private final List scriptTypes = createScriptTypes(); + + private List createScriptTypes() { + List extensions = List.of("nashornjs"); + + String mimeTypeVersion = ";version=ECMAScript-5.1"; + List mimeTypes = factory.getMimeTypes().stream().map(mimeType -> mimeType + mimeTypeVersion) + .collect(Collectors.toUnmodifiableList()); + + return Stream.of(extensions, mimeTypes).flatMap(List::stream).collect(Collectors.toUnmodifiableList()); + } + + @Override + public List getScriptTypes() { + return scriptTypes; + } + + @Override + public void scopeValues(ScriptEngine scriptEngine, Map scopeValues) { + Set expressions = new HashSet<>(); + + for (Entry entry : scopeValues.entrySet()) { + scriptEngine.put(entry.getKey(), entry.getValue()); + if (entry.getValue() instanceof Class) { + expressions.add(String.format("%s = % scriptTypes = new NashornScriptEngineFactory().getScriptTypes(); + + assertThat(scriptTypes, + contains("nashornjs", "application/javascript;version=ECMAScript-5.1", + "application/ecmascript;version=ECMAScript-5.1", "text/javascript;version=ECMAScript-5.1", + "text/ecmascript;version=ECMAScript-5.1")); + assertThat(scriptTypes.size(), is(5)); + } +} diff --git a/bundles/pom.xml b/bundles/pom.xml index 003b1fa7d19d0..7ceb398af4889 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -21,6 +21,7 @@ org.openhab.automation.groovyscripting org.openhab.automation.jrubyscripting org.openhab.automation.jsscripting + org.openhab.automation.jsscriptingnashorn org.openhab.automation.jythonscripting org.openhab.automation.pidcontroller org.openhab.automation.pwm diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/NOTICE b/itests/org.openhab.automation.jsscriptingnashorn.tests/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/itest.bndrun b/itests/org.openhab.automation.jsscriptingnashorn.tests/itest.bndrun new file mode 100644 index 0000000000000..ef5d722d1c174 --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/itest.bndrun @@ -0,0 +1,69 @@ +-include: ../itest-common.bndrun + +Bundle-SymbolicName: ${project.artifactId} +Fragment-Host: org.openhab.automation.jsscriptingnashorn + +-runrequires: \ + bnd.identity;id='org.openhab.automation.jsscriptingnashorn.tests',\ + bnd.identity;id='org.openhab.core',\ + bnd.identity;id='org.openhab.automation.jsscriptingnashorn' + +# We would like to use the "volatile" storage only +-runblacklist: \ + bnd.identity;id='org.openhab.core.storage.json' + +# +# done +# +-runbundles: \ + org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\ + org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\ + org.osgi.service.event;version='[1.4.0,1.4.1)',\ + org.hamcrest;version='[2.2.0,2.2.1)',\ + org.opentest4j;version='[1.2.0,1.2.1)',\ + com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\ + jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\ + org.apache.servicemix.specs.activation-api-1.2.1;version='[1.2.1,1.2.2)',\ + org.glassfish.hk2.osgi-resource-locator;version='[1.0.3,1.0.4)',\ + jakarta.annotation-api;version='[2.0.0,2.0.1)',\ + jakarta.inject.jakarta.inject-api;version='[2.0.0,2.0.1)',\ + javax.measure.unit-api;version='[2.1.2,2.1.3)',\ + org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\ + org.jsr-305;version='[3.0.2,3.0.3)',\ + tech.units.indriya;version='[2.1.2,2.1.3)',\ + uom-lib-common;version='[2.1.0,2.1.1)',\ + si-units;version='[2.1.0,2.1.1)',\ + si.uom.si-quantity;version='[2.1.0,2.1.1)',\ + junit-jupiter-api;version='[5.8.1,5.8.2)',\ + junit-jupiter-engine;version='[5.8.1,5.8.2)',\ + junit-platform-commons;version='[1.8.1,1.8.2)',\ + junit-platform-engine;version='[1.8.1,1.8.2)',\ + junit-platform-launcher;version='[1.8.1,1.8.2)',\ + org.apache.felix.scr;version='[2.1.30,2.1.31)',\ + org.osgi.util.function;version='[1.2.0,1.2.1)',\ + org.osgi.util.promise;version='[1.2.0,1.2.1)',\ + org.eclipse.jetty.http;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.io;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.security;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.server;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.servlet;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.util;version='[9.4.46,9.4.47)',\ + org.eclipse.jetty.util.ajax;version='[9.4.46,9.4.47)',\ + org.ops4j.pax.logging.pax-logging-api;version='[2.0.16,2.0.17)',\ + ch.qos.logback.classic;version='[1.2.11,1.2.12)',\ + ch.qos.logback.core;version='[1.2.11,1.2.12)',\ + biz.aQute.tester.junit-platform;version='[6.4.0,6.4.1)',\ + org.openhab.core;version='[4.0.0,4.0.1)',\ + org.openhab.core.config.core;version='[4.0.0,4.0.1)',\ + org.openhab.core.test;version='[4.0.0,4.0.1)',\ + com.google.gson;version='[2.9.1,2.9.2)',\ + jollyday;version='[0.5.10,0.5.11)',\ + org.openhab.automation.jsscriptingnashorn;version='[4.0.0,4.0.1)',\ + org.openhab.automation.jsscriptingnashorn.tests;version='[4.0.0,4.0.1)',\ + org.openhab.core.automation;version='[4.0.0,4.0.1)',\ + org.openhab.core.automation.module.script;version='[4.0.0,4.0.1)',\ + org.openhab.core.ephemeris;version='[4.0.0,4.0.1)',\ + org.openhab.core.io.console;version='[4.0.0,4.0.1)',\ + org.openhab.core.thing;version='[4.0.0,4.0.1)',\ + org.openhab.core.transform;version='[4.0.0,4.0.1)',\ + org.threeten.extra;version='[1.5.0,1.5.1)' diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/pom.xml b/itests/org.openhab.automation.jsscriptingnashorn.tests/pom.xml new file mode 100644 index 0000000000000..6f45ca6d05b61 --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/pom.xml @@ -0,0 +1,25 @@ + + + + 4.0.0 + + + org.openhab.addons.itests + org.openhab.addons.reactor.itests + 4.0.0-SNAPSHOT + + + org.openhab.automation.jsscriptingnashorn.tests + + openHAB Add-ons :: Integration Tests :: JavaScript Scripting (Nashorn) + + + + org.openhab.addons.bundles + org.openhab.automation.jsscriptingnashorn + ${project.version} + + + + diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/java/org/openhab/automation/jsscriptingnashorn/ScriptScopeOSGiTest.java b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/java/org/openhab/automation/jsscriptingnashorn/ScriptScopeOSGiTest.java new file mode 100644 index 0000000000000..0260fd4eccdbd --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/java/org/openhab/automation/jsscriptingnashorn/ScriptScopeOSGiTest.java @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2010-2022 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.automation.jsscriptingnashorn; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openhab.core.automation.module.script.ScriptEngineContainer; +import org.openhab.core.automation.module.script.ScriptEngineManager; +import org.openhab.core.test.java.JavaOSGiTest; + +/** + * This tests the script modules using the Nashorn scripting engine. + * + * @author Kai Kreuzer - Initial contribution + */ +@NonNullByDefault +public class ScriptScopeOSGiTest extends JavaOSGiTest { + + private @NonNullByDefault({}) ScriptEngine engine; + + private final String path = "OH-INF/automation/jsr223/"; + private final String workingFile = "scopeWorking.nashornjs"; + private final String failureFile = "scopeFailure.nashornjs"; + + @BeforeEach + public void init() { + ScriptEngineManager scriptManager = getService(ScriptEngineManager.class); + ScriptEngineContainer container = scriptManager.createScriptEngine("nashornjs", "myJSEngine"); + engine = container.getScriptEngine(); + } + + @Test + public void testScopeDefinesItemTypes() throws ScriptException, IOException { + URL url = bundleContext.getBundle().getResource(path + workingFile); + engine.eval(new InputStreamReader(url.openStream())); + } + + @Test + public void testScopeDoesNotDefineFoobar() throws ScriptException, IOException { + URL url = bundleContext.getBundle().getResource(path + failureFile); + assertThrows(ScriptException.class, () -> engine.eval(new InputStreamReader(url.openStream()))); + } +} diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeFailure.nashornjs b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeFailure.nashornjs new file mode 100644 index 0000000000000..1fe2820b333db --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeFailure.nashornjs @@ -0,0 +1,5 @@ +'use strict'; + +if(FOOBAR === undefined && UnDefType.FOOBAR === undefined) { + throw "FOOBAR and UnDefType.FOOBAR not defined"; +} diff --git a/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeWorking.nashornjs b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeWorking.nashornjs new file mode 100644 index 0000000000000..d0cd6ba536c64 --- /dev/null +++ b/itests/org.openhab.automation.jsscriptingnashorn.tests/src/main/resources/OH-INF/automation/jsr223/scopeWorking.nashornjs @@ -0,0 +1,194 @@ +'use strict'; + +if(State === undefined) { + throw "State not defined"; +} + +if(Command === undefined) { + throw "Command not defined"; +} + +if(URLEncoder === undefined) { + throw "URLEncoder not defined"; +} + +if(File === undefined) { + throw "File not defined"; +} + +if(Files === undefined) { + throw "Files not defined"; +} + +if(Path === undefined) { + throw "Path not defined"; +} + +if(Paths === undefined) { + throw "Paths not defined"; +} + +//types +if(IncreaseDecreaseType === undefined) { + throw "IncreaseDecreaseType not defined"; +} + +if(DECREASE === undefined) { + throw "DECREASE not defined"; +} + +if(INCREASE === undefined) { + throw "INCREASE not defined"; +} + +if(OnOffType === undefined) { + throw "OnOffType not defined"; +} + +if(ON === undefined) { + throw "OFF not defined"; +} + +if(OpenClosedType === undefined) { + throw "OpenClosedType not defined"; +} + +if(CLOSED === undefined) { + throw "CLOSED not defined"; +} + +if(OPEN === undefined) { + throw "OPEN not defined"; +} + +if(StopMoveType === undefined) { + throw "StopMoveType not defined"; +} + +if(MOVE === undefined) { + throw "MOVE not defined"; +} + +if(STOP === undefined) { + throw "STOP not defined"; +} + +if(UpDownType === undefined) { + throw "UpDownType not defined"; +} + +if(DOWN === undefined) { + throw "DOWN not defined"; +} + +if(UP === undefined) { + throw "UP not defined"; +} + +if(UnDefType === undefined) { + throw "UnDefType not defined"; +} + +if(NULL === undefined) { + throw "NULL not defined"; +} + +if(NextPreviousType === undefined) { + throw "NextPreviousType not defined"; +} + +if(NEXT === undefined) { + throw "NEXT not defined"; +} + +if(PREVIOUS === undefined) { + throw "PREVIOUS not defined"; +} + +if(PlayPauseType === undefined) { + throw "PlayPauseType not defined"; +} + +if(PLAY === undefined) { + throw "PLAY not defined"; +} + +if(PAUSE === undefined) { + throw "PAUSE not defined"; +} + +if(RewindFastforwardType === undefined) { + throw "RewindFastforwardType not defined"; +} + +if(REWIND === undefined) { + throw "REWIND not defined"; +} + +if(FASTFORWARD === undefined) { + throw "FASTFORWARD not defined"; +} + +if(QuantityType === undefined) { + throw "QuantityType not defined"; +} + +if(StringListType === undefined) { + throw "StringListType not defined"; +} + +if(RawType === undefined) { + throw "RawType not defined"; +} + +if(DateTimeType === undefined) { + throw "DateTimeType not defined"; +} + +if(DecimalType === undefined) { + throw "DecimalType not defined"; +} + +if(DateTimeType === undefined) { + throw "DateTimeType not defined"; +} + +if(HSBType === undefined) { + throw "HSBType not defined"; +} + +if(PercentType === undefined) { + throw "PercentType not defined"; +} + +if(PointType === undefined) { + throw "PointType not defined"; +} + +if(StringType === undefined) { + throw "StringType not defined"; +} + +if(items === undefined) { + throw "items not defined"; +} + +if(ir === undefined) { + throw "ir not defined"; +} + +if(itemRegistry === undefined) { + throw "itemRegistry not defined"; +} + +if(things === undefined) { + throw "things not defined"; +} + +if(events === undefined) { + throw "events not defined"; +} + +if(rules === undefined) { + throw "rules not defined"; +} diff --git a/itests/pom.xml b/itests/pom.xml index 09e2f785879b8..d83e3e60fda1c 100644 --- a/itests/pom.xml +++ b/itests/pom.xml @@ -17,6 +17,7 @@ openHAB Add-ons :: Integration Tests + org.openhab.automation.jsscriptingnashorn.tests org.openhab.binding.astro.tests org.openhab.binding.avmfritz.tests org.openhab.binding.feed.tests