Contenuti

Gli script Javascript in Openhab hanno smesso di funzionare? Ecco la soluzione

Il problema

Nel mio caso si è manifestato aggiornando Openhab alla versione Milestone 4.0. Tutti i miei script in Javascript hanno smesso di funzionare con errori del tipo Reference error “event” is not defined. oppure Reference error “items” is not defined.

La situazione

Dalla versione 3 di Openhab, il plugin nella categoria Automation che consentiva di interpretare gli script in Javascript era Javascript Scripting basato sul Nashorn Engine. Questo motore, parte di Java fino alla versione 15, consente di utilizzare codice Javascript con la sintassi ECMA Script 5.1. A partire dalla Milestone 4 di Openhab, si è aggiornata la versione Java dell’intero progetto, comportando un ammodernamento anche del motore di interpretazione Javascript, che adesso supporta la sintassi ECMA Script 2022+. A differenza del suo predecessore, molti oggetti come items, events, itemRegistry, rules non vengono più richiamati automaticamente dall’ambiente di esecuzione degli script.

Questo ha causato problemi simili di compatibilità anche agli script in Blocklies in quanto utilizzano anch’essi codice Javascript.

Soluzione 1: scelta del dialetto

La prima soluzione che si può mettere in campo senza modificare gli script già esistenti consiste nell’installare i plugin di Automation relativi a Javascript ECMA 5 e 2022+.
Andando ad aprire lo script direttamente dalla GUI di Openhab, tramite la freccia in basso a destra, sarà possibile scorrere in basso fino alla scelta dell’interprete da utilizzare (quindi nel caso dei vecchi script ECMScript-5.1).

Scelta del linguaggio per lo script

Scelta del linguaggio per lo script

Dopo non dimenticarti di salvare le modifiche allo script!

Problemi in caso di script con sintassi diverse
Ho notato che si verificano degli errori saltuari nell’esecuzione degli script nel caso in cui uno script con sintassi Javascript moderna richiama uno con versione obsoleta o viceversa. Per questo motivo valuta di rendere compatibili i tuoi script con la nuova versione di Javascript continuando con la Soluzione 2.

Soluzione 2: inclusione manuale delle dipendenze mancanti

Come fare per rendere i nostri script nativamente compatibili con il nuovo engine? Principalmente andando ad importare manualmente le dipendenze che prima trovavamo automaticamente a disposizione. Per fare questo si può aggiungere come prima parte dello script:

1
2
var runtime = require("@runtime");
var itemRegistry =runtime.itemRegistry, events=runtime.events, HSBType=runtime.HSBType, rules=runtime.rules;

In questo modo gran parte dei problemi di compatibilità dovuti alla mancanza di dipendenze dovrebbe essere risolto. Ho notato che, a discapito di quanto riportato in documentazione, qualcosa nelle classi di gestione per i colori deve essere cambiato, infatti non è più disponibile il metodo statico HSBType.fromRGB(). Nel mio caso ho preferito variare la logica dei miei script per utilizzare nativamente i colori in codifica HSB, ma nel caso servisse una conversione RGB->HSB sarà necessario definire un metodo manualmente.

Richiamare uno script da un altro script?

Trovo estremamente comodo chiamare da uno script un’altro script. Tramite gli script i gradi di libertà sono maggiori rispetto all’impiego delle rule, basti pensare alle capacità di gestire i timer o inserire logiche complesse nell’automatismo. In più, adottando la pratica di chiamare uno script da altri script, riusciamo a creare una libreria di comandi di pronto uso senza troppe ripetizioni:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
var callScriptById = function(id){
  var classname = "org.openhab.core.automation.RuleManager"
  var rulemanager = osgi.getService(classname);
  try {
    rulemanager.runNow(id);  
    //rulemanager.runNow(id, true, {something:1});  // in case you want to pass some parameters
  } catch (error) {
    console.error(error);
  }
}