Seite 1 von 1
Script aus einem Script aufrufen
Verfasst: 7. Apr 2022 14:24
von manes
Es gibt ja unter OH3 Rules und Scripte.
Wie ruft man aus einem Script heraus ein anderes Script auf? Am besten mit javascript programmiert.
Das hier liefert mir als Fehler zurück, das es das Script nicht finden kann. Wird hier versucht es auf der SD karte zu finden, oder wie ist es gemeint?
Ich möchte gerne ein Script aufrufen, das ich in der Oberfläche erstellt habe.
Code: Alles auswählen
var scriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
if (itemRegistry.getItem('ExpireItemSonnenschutzAus').getState() == 'OFF'){
scriptExecution.callScript('SonnenschutzRollosRunter');
}
events.sendCommand('ExpireItemSonnenschutzAn','ON');
ich habe den Code einfach mal so aus dem I-Net übernommen, weil er mir praktikabel aussah. Oder ist sowas nur für externe Scripte, die auf der SD abgelegt sind?
Re: Script aus einem Script aufrufen
Verfasst: 7. Apr 2022 18:00
von Harka
Moin,
spiel mal ein wenig mit Blockly rum.
Da gibt es unter OpenHAB/Run&Process einmal
"call script file ..." wobei Code wie bei Dir oben erzeugt wird. Lt. ToolTip muss das Script im config/scripts-Ordner der SD-Karte gespeichert sein.
Dann gibt es aber auch noch
"run rule or script ..." welches nur die UID des Scripts benötigt.
Code: Alles auswählen
function addFrameworkService (serviceClass) {
var bundleContext = Java.type('org.osgi.framework.FrameworkUtil').getBundle(scriptExtension.class).getBundleContext();
var serviceReference = bundleContext.getServiceReference(serviceClass);
return bundleContext.getService(serviceReference);
}
var ruleManager = addFrameworkService('org.openhab.core.automation.RuleManager');
function convertDictionaryToHashMap (dict) {
if (!dict || dict.length === 0) return null;
var map = new java.util.HashMap();
Object.keys(dict).forEach(function (key) {
map.put(key, dict[key]);
});
return map;
}
ruleManager.runNow('ad1bb88486', true, convertDictionaryToHashMap({}));
Die UID unten bei "ruleManager.runNow('
ad1bb88486' ... " eintragen. Benötigt halt etwas mehr "Drumherum"

Re: Script aus einem Script aufrufen
Verfasst: 7. Apr 2022 18:08
von udo1toni
Es gibt in der openHAB DSL von Beginn an eine Funktion callScript(), mit der ein DSL-Script (!) aufgerufen werden kann. Dieses Script muss dann im Ordner $OPENHAB_CONF/scripts/ liegen und die Endung .script haben. Beim Aufruf wird die Endung nicht mit angegeben, also z.B. auf einem Raspberry mit apt Installation (auch openHABian) führt callScript(MeinTest) zum Aufruf von /etc/openhab/scripts/MeinTest.script ($OPENHAB_CONF ist bei der Standard apt Installation auf /etc/openhab gesetzt). Zu beachten ist auch die Groß/Kleinschreibung.
Das Script muss ein DSL Script sein.
Es gibt keine Möglichkeit, direkt Variablen zu übergeben oder beim Aufruf Werte zu übergeben. Die einzige Möglichkeit dazu bestünde darin, Items zu verwenden. Wenn wir nun an diesem Punkt angekommen sind (Items für Parameter), sollte klar sein, dass man dann ebenso gut eine gewöhnliche Rule verwenden kann.
Scripte haben dennoch ihre Daseinsberechtigung. Ich habe z.B. ein Script zur Berechnung von Feiertagen und Ferienterminen. In der Rule verweise ich auf zwei Scripte, die einfach nacheinander aufgerufen werden und anhand von vorhandenen Werten die Berechnung vornehmen. Die Scripte sind länglich (z.B. 138 Zeilen für die Feiertage), also 138 Zeilen, welche nicht in meiner Rule stehen. Sie sind aber ungeeignet, um Funktionsblöcke zu bilden, die dann flexibel aus mehreren Rules heraus verwendet werden können.