Ошибка в работе wb-rules

Заметил странное поведение wb-rules, обращение к контролу через dev возвращает старое значение, пример скрипта:

defineRule("cpu_test_rule", {
  whenChanged: "hwmon/CPU Temperature",
  then: function (newValue, devName, cellName) {
    log("{}/{} => new={} dev={} dev2={}", devName, cellName, newValue, dev["hwmon/CPU Temperature"], dev["hwmon"]["CPU Temperature"]);
  }
})

Вывод в лог:

Oct 27 12:54:37: INFO: [rule info] hwmon/CPU Temperature => new=69.269 dev=73.45 dev2=73.45
Oct 27 12:54:47: INFO: [rule info] hwmon/CPU Temperature => new=69.156 dev=73.45 dev2=73.45
Oct 27 12:54:57: INFO: [rule info] hwmon/CPU Temperature => new=69.947 dev=73.45 dev2=73.45
Oct 27 12:55:07: INFO: [rule info] hwmon/CPU Temperature => new=68.365 dev=73.45 dev2=73.45
Oct 27 12:55:17: INFO: [rule info] hwmon/CPU Temperature => new=68.252 dev=73.45 dev2=73.45

Было настроено правило через wb-scenarios:

{
    "configVersion": 1,
    "scenarios": [
        {
            "actuator": "wb-mr6c_60/K5",
            "componentVersion": 1,
            "hysteresis": 1,
            "name": "Теплый пол в комнате",
            "scenarioType": "thermostat",
            "targetTemperature": 70,
            "temperatureLimits": {
                "max": 90,
                "min": 15
            },
            "temperatureSensor": "hwmon/CPU Temperature"
        }
    ]
}

Перезапуск wb-rules не помогает:

Oct 27 13:04:05 wirenboard wb-rules[7224]: INFO: [engine] Starting sync loop
Oct 27 13:04:06 wirenboard wb-rules[7224]: WARNING: [rule warning] DAC: no config file
Oct 27 13:04:06 wirenboard wb-rules[7224]: INFO: all rule files are loaded
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/current_temperature: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/rule_enabled: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/target_temperature: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/target_temperature: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/actuator_status: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/actuator_status: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/actuator_status: No such control
Oct 27 13:04:07 wirenboard wb-rules[7224]: WARNING: [frontend] failed to remove external control wbsc_teplyy_pol_v_komnate/actuator_status: No such control
Oct 27 13:04:08 wirenboard wb-rules[7224]: ERROR: [rule error] Error in getting device: Device with given ID doesn't exist
Oct 27 13:04:13 wirenboard wb-rules[7224]: INFO: [rule info] [WBSC‑base-mod/teplyy_pol_v_komnate]: Scenario "Теплый пол в комнате" base initialization completed
Oct 27 13:04:16 wirenboard wb-rules[7224]: INFO: [rule info] hwmon/CPU Temperature => new=69.043 dev=74.015 dev2=74.015
Oct 27 13:04:26 wirenboard wb-rules[7224]: INFO: [rule info] hwmon/CPU Temperature => new=68.93 dev=74.015 dev2=74.015

При этом виртуальное устройство из wb-scenarios показывает правильное значение.
Если обнулить сценарии echo '{"configVersion": 1,"scenarios": []}' > /etc/wb-scenarios.conf и перезапустить wb-rules проблема сохраняется.

Помогает только один способ touch /etc/wb-rules/rules.js:

Oct 27 13:08:34 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=68.478 dev=68.817 dev2=68.817
Oct 27 13:08:44 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=70.399 dev=68.817 dev2=68.817
Oct 27 13:08:54 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=68.704 dev=68.817 dev2=68.817
Oct 27 13:08:57 wirenboard wb-rules[9142]: INFO: reloading file: /etc/wb-rules/rules.js
Oct 27 13:09:04 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=68.478 dev=68.478 dev2=68.478
Oct 27 13:09:14 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=68.704 dev=68.704 dev2=68.704
Oct 27 13:09:24 wirenboard wb-rules[9142]: INFO: [rule info] hwmon/CPU Temperature => new=68.478 dev=68.478 dev2=68.478

Если перезагрузить wb-rules, то проблема возвращается:

Oct 27 13:11:52 wirenboard wb-rules[12763]: INFO: [rule info] hwmon/CPU Temperature => new=67.574 dev=67.574 dev2=67.574
Oct 27 13:12:02 wirenboard wb-rules[12763]: INFO: [rule info] hwmon/CPU Temperature => new=66.67 dev=67.574 dev2=67.574
Oct 27 13:12:12 wirenboard wb-rules[12763]: INFO: [rule info] hwmon/CPU Temperature => new=67.122 dev=67.574 dev2=67.574
Oct 27 13:12:22 wirenboard wb-rules[12763]: INFO: [rule info] hwmon/CPU Temperature => new=66.67 dev=67.574 dev2=67.574
Oct 27 13:12:32 wirenboard wb-rules[12763]: INFO: [rule info] hwmon/CPU Temperature => new=67.009 dev=67.574 dev2=67.574

Версия ПО последняя

Wiren Board 7.2.1, release unstable.latest (as testing)
Linux wirenboard 5.10.35-wb180 #1 SMP Mon Sep 1 07:21:40 UTC 2025 armv7l GNU/Linux
...
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Добрый день.
Интересно, попробую воспроизвести.

Версия движка:

dpkg -s wb-rules
Package: wb-rules
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 21692
Maintainer: Wiren Board team <info@wirenboard.com>
Architecture: armhf
Version: 2.35.2

Скрипт в общем тот же

defineRule("cpu_test_rule", {
  whenChanged: "hwmon/CPU Temperature",
  then: function (newValue, devName, cellName) {
    if (newValue != dev["hwmon/CPU Temperature"]){log.info("Alarm!")}
    log("{}/{} => new={} dev={} dev2={}", devName, cellName, newValue, dev["hwmon/CPU Temperature"], dev["hwmon"]["CPU Temperature"]);
  }
})

Получаю

2025-10-27 12:42:45
defineRule: cpu_test_rule
2025-10-27 12:42:55
hwmon/CPU Temperature => new=68.026 dev=68.026 dev2=68.026
2025-10-27 12:43:05
hwmon/CPU Temperature => new=67.8 dev=67.8 dev2=67.8
2025-10-27 12:43:15
hwmon/CPU Temperature => new=68.591 dev=68.591 dev2=68.591
2025-10-27 12:43:25
hwmon/CPU Temperature => new=67.8 dev=67.8 dev2=67.8
2025-10-27 12:43:35
hwmon/CPU Temperature => new=68.139 dev=68.139 dev2=68.139
2025-10-27 12:43:45
hwmon/CPU Temperature => new=68.591 dev=68.591 dev2=68.591
2025-10-27 12:43:55
hwmon/CPU Temperature => new=67.574 dev=67.574 dev2=67.574
2025-10-27 12:44:05
hwmon/CPU Temperature => new=68.478 dev=68.478 dev2=68.478
2025-10-27 12:44:15
hwmon/CPU Temperature => new=68.93 dev=68.93 dev2=68.93
2025-10-27 12:44:25
hwmon/CPU Temperature => new=68.365 dev=68.365 dev2=68.365
2025-10-27 12:44:35
hwmon/CPU Temperature => new=68.252 dev=68.252 dev2=68.252

У меня было предположение что значение в log вычисляется при создании функции - но не подтвердилось.
Проверьте пожалуйста версию wb-rules.
Ага, перезапустил движок, вижу:

2025-10-27 12:46:10
defineRule: _system_buzzer_params
2025-10-27 12:46:10
defineRule: _system_buzzer_onof
2025-10-27 12:46:10
defineRule: _system_track_vin
2025-10-27 12:46:10
defineRule: (anon)
2025-10-27 12:46:10
+ Обработка ключа "setEnable"
2025-10-27 12:46:10
- Текущее значение "null"
2025-10-27 12:46:11
- Установка "function setDisable() {/* source code */}"
2025-10-27 12:46:11
- Новое значение "function setDisable() {/* source code */}"
2025-10-27 12:46:11
+ Обработка ключа "setDisable"
2025-10-27 12:46:11
- Текущее значение "null"
2025-10-27 12:46:11
- Установка "function setEnable() {/* source code */}"
2025-10-27 12:46:11
- Новое значение "function setEnable() {/* source code */}"
2025-10-27 12:46:11
+ Обработка ключа "setValueNumericInput"
2025-10-27 12:46:11
- Текущее значение "null"
2025-10-27 12:46:11
- Установка "function setValueNumericZero() {/* source code */}"
2025-10-27 12:46:11
- Новое значение "function setValueNumericZero() {/* source code */}"
2025-10-27 12:46:11
+ Обработка ключа "setValueNumericZero"
2025-10-27 12:46:11
resetResolverName для действия "setValueNumericZero" не установлен
2025-10-27 12:46:11
[WBSC-init-main]: Start initialisation all types scenarios
2025-10-27 12:46:11
[WBSC-devicesControl-init]: Start initialisation "devicesControl" type scenarios
2025-10-27 12:46:11
[WBSC-helper]: Input config path: "/etc/wb-scenarios.conf"
2025-10-27 12:46:11
[WBSC-helper]: The input config contains: "{"scenarios":[],"configVersion":1}"
2025-10-27 12:46:11
[WBSC-helper]: "scenarios" array is empty
2025-10-27 12:46:11
[WBSC-lightControl-init]: Start initialisation "lightControl" type scenarios
2025-10-27 12:46:11
[WBSC-helper]: Input config path: "/etc/wb-scenarios.conf"
2025-10-27 12:46:11
[WBSC-helper]: The input config contains: "{"configVersion":1,"scenarios":[]}"
2025-10-27 12:46:11
[WBSC-helper]: "scenarios" array is empty
2025-10-27 12:46:11
[WBSC-thermostat-init]: Start initialisation "thermostat" type scenarios
2025-10-27 12:46:11
[WBSC-helper]: Input config path: "/etc/wb-scenarios.conf"
2025-10-27 12:46:11
[WBSC-helper]: The input config contains: "{"scenarios":[],"configVersion":1}"
2025-10-27 12:46:11
[WBSC-helper]: "scenarios" array is empty
2025-10-27 12:46:11
defineRule: _system_reboot
2025-10-27 12:46:11
defineRule: Update devices
2025-10-27 12:46:11
defineRule: Permit join
2025-10-27 12:46:11
defineRule: _reset_calib
2025-10-27 12:46:11
defineRule: cpu_test_rule
2025-10-27 12:46:11
add your rules to /etc/wb-rules/
2025-10-27 12:46:21
hwmon/CPU Temperature => new=68.026 dev=68.026 dev2=68.026
2025-10-27 12:46:31
Alarm!
2025-10-27 12:46:31
hwmon/CPU Temperature => new=67.687 dev=68.026 dev2=68.026
2025-10-27 12:46:41
Alarm!
2025-10-27 12:46:41
hwmon/CPU Temperature => new=67.8 dev=68.026 dev2=68.026
2025-10-27 12:46:51
Alarm!
2025-10-27 12:46:51
hwmon/CPU Temperature => new=67.687 dev=68.026 dev2=68.026

Описал, отдал разработчикам.

1 Like

Бага в работе, поправят.
Сейчас можно использовать получение значения так:

getDevice("hwmon").getControl("CPU Temperature").getValue() вместо dev[“hwmon/CPU Temperature”]

Добрый день.
Исправлено, тут. Сегодня, думаю, соберется для testing пакет.

1 Like