Отсутсвует значение сенсора при старте wb-rules

После перезапуска wb-rules у сенсора, который не обновлял данные, отсутствует значение через переменную dev, хотя в mqtt есть retained запись:

# mosquitto_sub -t '/devices/wb-m1w2_207/controls/External Sensor 1' --retained-only
25.9375

rules.js:

log("m1w2={}", dev["wb-m1w2_207/External Sensor 1"]);

journalctl -f -t wb-rules:

Dec 20 10:18:45 wb wb-rules[5255]: INFO: [engine] Starting sync loop
Dec 20 10:18:46 wb wb-rules[5255]: INFO: [rule info] m1w2=null

Даже если поменять файл, чтобы wb-rules его перечитало, значение не появляется (не было новых значений от температурного сенсора):

Dec 20 10:19:19 wb wb-rules[5255]: INFO: [rule info] m1w2=null
Dec 20 10:19:20 wb wb-rules[5255]: INFO: reloading file: /etc/wb-rules/rules.js

Температура у сенсора m1w2 может очень долгое время не обновляться и скрипт термостата не может из-за этого корректно работать, думая что ошибка с датчиком, т.к. значение null.
Ожидаемое поведение, чтобы объект dev отдавал retained значение после запуска.

Добрый день. Воспроизвожу:

log.info("Для теста:", dev["WindSensorDemo/Result"]);

Единственная строчка в скрипте получает значение топика, который точно не обновляется.
Результат:
Screenshot_20221220_153107

Поэтому - какая версия wb-rules?

Package: wb-rules
Version: 2.17.2

Release name: staging.06643.cf98af374eb4
Release suite: testing

решил проверить еще:

log("m1w2_207={}", dev["wb-m1w2_207/External Sensor 1"]);
log("m1w2_104={}", dev["wb-m1w2_104/External Sensor 1"]);
log("msw={}", dev["wb-msw-v3_176/Temperature"]);

важно сделать рестарт wb-rules:

Dec 20 20:01:52 wb wb-rules[4501]: INFO: [rule info] m1w2_207=null
Dec 20 20:01:52 wb wb-rules[4501]: INFO: [rule info] m1w2_104=null
Dec 20 20:01:52 wb wb-rules[4501]: INFO: [rule info] msw=null

пришло значение в 207 датчик:

Dec 20 20:02:13 wb wb-rules[4501]: INFO: [rule info] m1w2_207=26.4375
Dec 20 20:02:13 wb wb-rules[4501]: INFO: [rule info] m1w2_104=null
Dec 20 20:02:13 wb wb-rules[4501]: INFO: [rule info] msw=null

Так, не совсем понятно…
Перезапускаю wb-rules - значение, если оно на момент запуска есть в mqtt - читается.

Сделал так:

// place your rules here or add more .js files in this directory
log("m1w2_207={}", dev["wb-m1w2_207/External Sensor 1"]);
log("m1w2_104={}", dev["wb-m1w2_104/External Sensor 1"]);
log("msw={}", dev["wb-msw-v3_176/Temperature"]);
log("ip={}", dev["network/Ethernet IP"]);
log("mwac={}", dev["wb-mwac_60/P1 Counter"]);

Результат после перезапуска:

Dec 20 20:12:32 wb wb-rules[13629]: INFO: [rule info] m1w2_207=null
Dec 20 20:12:32 wb wb-rules[13629]: INFO: [rule info] m1w2_104=null
Dec 20 20:12:32 wb wb-rules[13629]: INFO: [rule info] msw=null
Dec 20 20:12:32 wb wb-rules[13629]: INFO: [rule info] ip=10.10.0.3
Dec 20 20:12:32 wb wb-rules[13629]: INFO: [rule info] mwac=null

Не воспроизводится. А с такой строкой?

log.info("4test 5V_OUT:", dev["wb-gpio/5V_OUT"]);
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] m1w2_207=null
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] m1w2_104=null
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] msw=null
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] ip=10.10.0.3
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] mwac=null
Dec 20 20:38:47 wb wb-rules[32247]: INFO: [rule info] 4test 5V_OUT: false

Что я успел понять: Те устройства, топики кторых создаются прямо или косвенно из wb-rules на момент его (пере)запуска могут быть как созданы так и еще нет, в зависимости от порядка выполнения скриптов. Те же, кторые создаются автономными сервисами, такими как wb-mqtt-gpio - читаются удачно.

Те которые созданы через wb-mqtt-serial тоже НЕ читаются…

Еще тесты:

log.info("MR6CU:", dev["wb-mr6cu_115/K1"]);
log.info("mrgbw_range:", dev["wb-mrgbw-d-fw3_19/Channel 1 (B) Brightness"]);
log.info("mrgbw_switch:", dev["wb-mrgbw-d-fw3_19/Channel 1 (B)"]);
log.info("mr6c_number:", dev["wb-mr6c_203/Input 0 counter"]);
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] m1w2_207=null
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] m1w2_104=null
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] msw=null
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] ip=10.10.0.3
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] mwac=null
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] 4test 5V_OUT: false
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] MR6CU: false
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] mrgbw_range: null
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] mrgbw_switch: false
Dec 20 21:55:21 wb wb-rules[22502]: INFO: [rule info] mr6c_number: null

Может еще как то тип значения влияет…

Тип значения не влияет. Так не должно быть. Я бы сделал reboot контроллера и посмотрел логи - что-то вы должны там увидеть.

Перезагрузка не помогла, после рестарта wb-rules также пустые значения:

Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] m1w2_207=null
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] m1w2_104=null
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] msw=23.4
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] ip=10.10.0.3
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] mwac=null
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] 4test 5V_OUT: false
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] MR6CU: false
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] mrgbw_range: null
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] mrgbw_switch: false
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] mr6c_number: null
Dec 22 21:42:17 wb wb-rules[4314]: INFO: [rule info] adc_vin: null

Что посмотреть? Какие логи вам показать?

Да, иногда воспроизводится. Честно говоря не вижу в этом бага. Скорее связано с тем что скрипты выполняются раньше чем читаются значения.
Дело в том что работать со значениями не в функциях - явно запрещено в документации.

Так не должно же быть? Я же делаю перезапуск wb-rules, все значения есть в веб интерфейсе при этом. Мне приходит значение по одному каналу, для работы скрипта мне нужно прочитать значение датчика температуры, а там null. Все внутри функции будет, но значения нету, т.к. wb-rules почему то не считывает retain значения. А датчик температуры в полу и он значение не меняет и поэтому по mqtt ничего может до часа не прилетать…

Не следует использовать объект dev вне кода правил

Пример выше я для простоты сделал, который воспроизводит проблему. В реальности у меня через правило отслеживается изменение переключателя и запускается скрипт, который считывает температуру датчика, но получает значение null, хотя все значения показываются в веб интерфейсе.

И не должен, собственно.

Если значение не меняется - то зачем на него реагировать?

То есть в произвольный момент?
а как это воспроизвести?

Сделать правило через definerule на изменение чего либо (переключатель, счетчик нажатий) , цель включить “термостат”. По событию попадаем в “функцию”, где мы считываем температуру модуля и решаем включать теплый пол или нет, но получаем в ответ null, явно ошибка в логике работы wb-rules? Как я вижу, wb-rules должен при старте считывать значения retain топиков и потом эти значения уже отдавать, на деле такого не происходит сейчас.

Пример который приводит к багу:

defineRule('test', {
  whenChanged: ['wb-mr6c_201/K5'],
  then: function (value, devName, cellName) {
	log("switch_value={} temperature={}", value, dev["wb-m1w2_104/External Sensor 1"]);
  }
});

Вывод в лог:

Dec 22 23:05:51 wb wb-rules[21438]: INFO: [rule info] switch_value=true temperature=null

Использую для проверки:

defineVirtualDevice("12_22_test_01", {
    title: "Example 12_22_test_01",
    cells: {
        NameOfButton1: {
             type: "pushbutton",
        },
        textStatus: {
            type: "text",
      		value: ""
        }
    }
});



defineRule('test12_22_test_01', {
  whenChanged: ['12_22_test_01/NameOfButton1'],
  then: function (value, devName, cellName) {
	log("metrics/ram_total={}", dev["metrics/ram_total"], value);
  }
});

Значение в топике точно не меняется. Во всяком случае с момента перезапуска wb-rules до нажатия кнопки.
Получаю:

mosquitto_sub -v -t /devices/metrics/controls/ram_total
/devices/metrics/controls/ram_total 997
systemctl restart wb-rules && journalctl -u wb-rules -f |grep ram_totalal
Dec 22 16:41:53 wirenboard-AQASN7R6 wb-rules[27516]: INFO: [rule info] metrics/ram_total=997 true

Тест не корректный, нужно значения именно от wb-mqtt-serial пробовать. Ram устанавливается в момент запуска wb-rules. И важно перезапустить wb-rules.

Сделал через defineVirtualDevice:

defineVirtualDevice("12_22_test_01", {
    title: "Example 12_22_test_01",
    cells: {
        NameOfButton1: {
             type: "pushbutton",
        }
    }
});

defineRule('test12_22_test_01', {
  whenChanged: ['12_22_test_01/NameOfButton1'],
  then: function (value, devName, cellName) {
	log("temperature={}", dev["wb-m1w2_153/External Sensor 1"], value);
  }
});

Результат после рестарта wb-rules:

Dec 22 23:52:45 wb wb-rules[16742]: INFO: all rule files are loaded
Dec 22 23:52:46 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:48 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:50 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:51 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:53 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:55 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:56 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:52:58 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:53:00 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:53:02 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:53:04 wb wb-rules[16742]: INFO: [rule info] temperature=null true
Dec 22 23:53:06 wb wb-rules[16742]: INFO: [rule info] temperature=null true

Можно пробовать считывать любой счетчик от modbus модуля (“wb-mdm3_195/Input 3 counter”), тут 100% воспроизводится.

Сменил топик:

systemctl restart wb-rules && journalctl -u wb-rules -f |grep wb-msw-v3_98\/Temperature
Dec 22 19:55:16 wirenboard-ACAX3M6K wb-rules[5540]: INFO: [rule info] wb-msw-v3_98/Temperature=20.3 true

Для проверки:

systemctl restart wb-rules && journalctl -u wb-rules -f |grep wb-msw-v3_98\/Temperature
Dec 22 19:56:24 wirenboard-ACAX3M6K wb-rules[6418]: INFO: [rule info] wb-msw-v3_98/Temperature=20.3 true

Как-то по-особому?

Мне кажется что мы занимаемся чем-то не имеющим отношения к реальным задачам. Перзапуск контроллера - вещь ну настолько редкая…
У меня даже тестовый на табильной версии перезапускается только с обновлением ядра.