在 Openhab 中成功运行 1 次脚本后,ECMAScript 显示错误

问题描述 投票:0回答:1

平台信息:

Hardware: Synology with docker
OS: Linux/4.4.302+ (amd64)
Java Runtime Environment: debian 17.0.12
openHAB version: openHAB 4.2.2

主题问题: 我有一个规则,当小部件(加热)更改恒温器(evohome)的设定值时触发。规则的脚本基于 ecmascript (v11) 构建。它将一些变量 + 项目值转换为 mqtt 代理的命令主题上的字符串化 JSON 消息。第一次触发时,脚本运行并在代理上发布消息,并更改设置点。 之后,剧本就被‘破坏’了。这需要一段时间,重新初始化脚本引擎使其再次工作一次。我无法理解为什么会发生这种情况

尝试了不同的事情,具体取决于我检查的主题 Javascript/JSON/MQTT/Graalvm/Openhab 等的各个论坛,但没有一个特定的论坛在 Openhab 4 上讨论 mqtt 与 evohome。 了解代码可以工作,并且成功触发,但只有一次。

代码构建(完整规则):

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Thermostaat_zone_temperature_setpoint
    type: core.ItemStateUpdateTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        var item = items.Thermostaat_zone_temperature_setpoint;

        var obj = new Object();

        obj.command = "set_zone_setpoint";

        obj.setpoint = item.state;

        obj.zone_idx = 1;

        obj.ctl_id = "ID";

        var val = parseFloat (obj.setpoint);

        obj.setpoint = val;

        var message = JSON.stringify(obj);

        var actions = actions.get("mqtt", "mqtt:broker:master");

        actions.publishMQTT("evohome/evogateway/_zone_independent/command",
        message);

        console.log(message);
    type: script.ScriptAction

记录给出以下内容(成功时记录):

2024-10-17 20:17:02.354 [DEBUG] [.internal.OpenhabGraalJSScriptEngine] - Initializing GraalJS script engine...
2024-10-17 20:17:02.360 [DEBUG] [.internal.OpenhabGraalJSScriptEngine] - Injecting ThreadsafeTimers into the JS runtime...
2024-10-17 20:17:02.361 [DEBUG] [.internal.OpenhabGraalJSScriptEngine] - Evaluating cached global script...
2024-10-17 20:17:02.362 [DEBUG] [.internal.OpenhabGraalJSScriptEngine] - Evaluating cached openhab-js injection...
2024-10-17 20:17:02.417 [DEBUG] [.internal.OpenhabGraalJSScriptEngine] - Successfully initialized GraalJS script engine.
2024-10-17 20:17:02.420 [INFO ] [ab.automation.script.ui.evo_zone] - {"command":"set_zone_setpoint","setpoint":20.5,"zone_idx":1,"ctl_id":"id code"}
2024-10-17 20:17:02.420 [DEBUG] [ing.mqtt.internal.action.MQTTActions] - MQTT publish to evohome/evogateway/_zone_independent/command performed

记录给出以下内容(失败时记录):

2024-10-18 06:51:42.850 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'evo_zone' failed: org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (get) on org.openhab.binding.mqtt.internal.action.MQTTActions@27c6d6d2 failed due to: Unknown identifier: get
2024-10-18 06:54:44.350 [ERROR] [ation.script.javascript.evo_eetkamer] - Failed to execute script: TypeError: invokeMember (get) on org.openhab.binding.mqtt.internal.action.MQTTActions@27c6d6d2 failed due to: Unknown identifier: get
        at <js>.:program(<eval>:10)
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
javascript mqtt graalvm openhab
1个回答
0
投票

将其写为完整答案。

从评论中可以确定,问题在于您在第一次运行结束时覆盖了

actions
对象,这意味着第二次运行时没有
get
函数。

一些额外的事情

堆栈跟踪实际上包含一些有用的东西

2024-10-18 06:54:44.350 [ERROR] [ation.script.javascript.evo_eetkamer] - Failed to execute script: TypeError: invokeMember (get) on org.openhab.binding.mqtt.internal.action.MQTTActions@27c6d6d2 failed due to: Unknown identifier: get
        at <js>.:program(<eval>:10)
        at org.graalvm.polyglot.Context.eval(Context.java:399)

第二行实际上是脚本中失败的地方,

<js>
表示它在JavaScript中,
<eval>:10
是第10行。

如果您将

script: >-
部分中的所有空白行去掉,您将得到:

var item = items.Thermostaat_zone_temperature_setpoint;
var obj = new Object();
obj.command = "set_zone_setpoint";
obj.setpoint = item.state;
obj.zone_idx = 1;
obj.ctl_id = "ID";
var val = parseFloat (obj.setpoint);
obj.setpoint = val;
var message = JSON.stringify(obj);
var actions = actions.get("mqtt", "mqtt:broker:master");  // << line 10
actions.publishMQTT("evohome/evogateway/_zone_independent/command", message);
console.log(message);

最快的解决方法是不要在脚本中重复使用

actions
作为变量名,因此第 10 行和第 11 行变成

var action = actions.get("mqtt", "mqtt:broker:master");  
action.publishMQTT("evohome/evogateway/_zone_independent/command", message);
© www.soinside.com 2019 - 2024. All rights reserved.