Новая версия движка правил

Если в описании самого контрола не стоит “ForceDefault” = true, то да, сохраняется.

Обычно время прошедшее с какого-то события - вообще не хранят, никто. Сохраняется время события и просто рассчитывается now() - Сохраненное время.
Если выводить результат в поле где значение не сохраняется - то и записи не будет.

Правильно ли я понял, что для того, чтобы прошедшее время не сохранялось в памяти, мне достаточно записывать его в контрол виртуального устройства с:
“ForceDefault” = true?

Да, верно.

У меня есть контролы, которые считаются на основании значений из других контролов при помощи вб-рулс.
Как сделать, чтобы вб-рулс мог записывать в них значения, но при этом в веб-интерфейсе их значения отображались не в поле для ввода, а как значения нередактируемых контролов?

А приложите пожалуйста сюда минимальный пример правила, где это работает не так как нужно, скриншоты и логи. По-идее это должно работать просто через установку readonly: true в канале в defineVirtualDevices

Действительно, с wb-rules работает. Не работает при задании новых значений напрямую через mqtt.

defineVirtualDevice("testdevice", {
  title: "TestDevice",
  cells: {
    testcontrol: {
      type: "switch",
      value: false,
	  readonly: true
    }
  }
});

wb-rules[5674]: ERROR: [backend] failed to process /on request to testdevice/testcontrol: This control is not writable

Использовать publish?
А версия wb-rules какая?

dpkg -s wb-rules
Package: wb-rules
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 15362
Maintainer: Nikita webconn Maslov n.maslov@contactless.ru
Architecture: armhf
Version: 2.6.0
Depends: libc6 (>= 2.13)
Breaks: wb-mqtt-confed (<< 1.0.2), wb-rules-system (<< 1.6.3)
Conffiles:
/etc/init.d/wb-rules 1579ece52285107cde1482052f47615d
/etc/wb-configs.d/13wb-rules 1236e2e4343d949e0a21de865706c00b
/etc/wb-rules/alarms.conf 2051dd214a6232c5e778c50e52d5fb6a
/etc/wb-rules/rules.js 926c30d0fd63e272f6f9ad370dffb1b0
Description: Wiren Board Rule Engine

Использовать publish?

У меня в mqtt из shell значения приходят. Через publish как-то очень замудренно будет.

Так, воспроизвел, wb-rules 2.6.0:

//03_15_test_01.js
defineVirtualDevice("testdevice", {
  title: "TestDevice",
  cells: {
    testcontrol: {
      type: "switch",
      value: false,
	  readonly: true
    },
    testcontrol1: {
      type: "switch",
      value: false,
	  readonly: false
    }
  }
});

defineRule("testRule", {
  whenChanged: "testdevice/testcontrol1",
    then: function(newValue, devName, cellName) {
      log.info("rule executed newValue=", newValue);
      dev["testdevice/testcontrol"] = newValue
    }
});

При переключении testdevice/testcontrol1 - отлично переключается testdevice/testcontrol правилом
.Screenshot from 2021-03-15 09-06-01
При этом “вручную” - не переключается. все работает как должно…
Задача - изменять readOnly switch из wb-rules?

Нет, речь про другое - когда контрол ReadOnly не срабатывает при отправке команды через mosquitto_pub.

Для вашего устройства -
mosquitto_pub -t /devices/testdevice/controls/testcontrol/on -r -m 0
или
mosquitto_pub -t /devices/testdevice/controls/testcontrol/on -r -m 1

А что должно обработать топик “on” для виртуального устройства?
Используйте

mosquitto_pub -t '/devices/testdevice/controls/testcontrol' -r -m 0
mosquitto_pub -t '/devices/testdevice/controls/testcontrol' -r -m 1

должно обработать топик “on” для виртуального устройства?

Да, нужно, чтобы далее wb-rules на основании новых данных произвел расчеты.
Но при этом нужно, чтобы значение новых данных нельзя было устанавливать вручную.

Не используйте “/on” для виртуальных устройств.
Команда

dev["testdevice/testcontrol"] = true

эквивалентна

mosquitto_pub -t /devices/testdevice/controls/testcontrol -r -m 1

Не используйте “/on” для виртуальных устройств.

Ранее без этого не работало. Со второй версии начало работать?

Для виртуальных всегда так было.

Коллеги ничего не понимаю. но у меня не работает простой скрипт по инкрементированию значения виртуального устройства по появлению

Version: 2.6.0

defineVirtualDevice("WaterCount", {
    title: "WaterCount",
    cells: {
      "HW99": {//ГВС кв99
	    type: "value",
	    value: 15,
        forceDefault: true,
	    },
      "CW99": {//ХВС кв99
	    type: "value",
	    value: 55,
        forceDefault: true,        
	    },
      "HW100": {//ГВС кв100
	    type: "value",
	    value: 34580,
        forceDefault: true,        
	    },
      "CW100": {//ХВС кв100
	    type: "value",
	    value: 32000,
        forceDefault: true,        
	    }
	}
});

function WaterCount(name, control, virt, count) {
defineRule(name, { 
  whenChanged: control, //при новом импульсе
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    // прибавляем к текущему значению +1
    if (newValue) {
    	var test = dev[virt][count] + 1;
    	dev[virt][count] = test;
	    log.info("rules = " + name + "   count = " + dev[virt][count]);
    }
  }
});
}

WaterCount("CW99Count", "wb-gpio/EXT2_IN6","WaterCount", "СW99");
WaterCount("HW99Count", "wb-gpio/EXT2_IN7", "WaterCount","HW99");
WaterCount("CW100Count","wb-gpio/EXT2_IN8","WaterCount","СW100");
WaterCount("HW100Count","wb-gpio/EXT2_IN9","WaterCount","HW100");

при работе скрипта вывод ниже, что бы я не делал как бы я не обращался к виртуальному устройству

dev["WaterCount/СW99"]
dev["WaterCount"]["СW99"]

Результат работы скрипта:
2021-03-26 12:33:42rules = CW99Count count = null

При этом в соседнем файле скрипта нормально работают правила с другим виртуальным устройством определенном в другом скрипте.

например

defineVirtualDevice("Termostat", {
    title: "Termostat",
    cells: {
      // =============== Прихожая теплый пол
      "R01-TS16-1-mode": {//режим 0-ручной 1-по расписанию
	    type: "switch",
	    value: false,
	    },
      "R01-TS16-1-setpoint": {//уставка
	    type: "range",
	    value: 25,
        max: 30,
        readonly: false
	    },
      "R01-TS16-1-lock": {//блокировка в визуализации 0-снята 1-заблокирована
	    type: "switch",
	    value: false,
	    },.......

var hysteresis = 0.5;
function Termostat(name, temp, setpoint, TS, TS_onoff) {
defineRule(name, { 
  whenChanged: temp, //при изменении состояния датчика
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (dev[TS_onoff]) {
    	if ( newValue < dev[setpoint] - hysteresis) { //если температура датчика меньше уставки - гистерезис
      	dev[TS] = true;
    	}
    	if ( newValue > dev[setpoint] + hysteresis) { //если температура датчика больше виртуальной уставки + гистерезис
      	dev[TS] = false;
    	}
    }
    else dev[TS] = false;
  }
});
}

Termostat("R01-TS16-1", "A60-M1W3/External Sensor 1", "Termostat/R01-TS16-1-setpoint", "wb-gpio/EXT4_R3A1", "Termostat/R01-TS16-1-onoff"); // Прихожая теплый пол


коды символов

&#1057;&#87;&#57;&#57;

перепишите вручную или скопируйте из места, где обращаетесь к функции
Имею в виду что первый символ, “C” у вас странной кодировки

Во истину странно!
Переписал, заработало. Спасибо!

Русскую “С” от английской “C” на вид довольно сложно отличить, сам так попадался.

Предпринял новую попытку обновить wb-rules c 1.7.1 на 2.6.3 на «боевом» контроллере. Опять - неудача:

Первое
На этом контроллере кроме штатных сервисов Wiren работают дополнительные сервисы:

  • Работают сервисы, которые опрашивают и управляют устройствами, работающие по протоколу SNMP. Родной драйвер WB мне использовать не удалось, ввиду его куцести и непредсказуемости.
  • Работают сервисы, которые опрашивают и управляют устройствами по REST HTTP.
  • Работает сервис, который проверяет, актуальны ли данные с устройств в MQTT БД, или уже “протухли” (на основе меняющих значений Uptime в регистрах датчиков и исполнительных устройств). Если данные протухли – сигнализирует или перезапускает wb-mqtt-serial

Всё это взаимодействует через wb-mqtt-db (через подписку и публикацию топиков по MQTT).

В старой версии wb-rules все виртуальные устройства были по умолчанию как бы “writable” и wb-rules реагировал на событие “whenChanged” , когда производилась публикация в mqtt топик вида /devices/DEV/controls/CONT/on
Параметр readonly: false в описании вирт устройств влиял только на возможность редактировать значение данного устройства в интерфейсе (WebUI)

В новой версии, для того чтобы wb-rules реагировал на событие “whenChanged” при записи в топик вида /devices/DEV/controls/CONT/on необходимо явно задавать параметр readonly: false и соответственно данные устройства становятся автоматически редактируемыми в WebUI ! Что для меня лично – совсем не желательно.
Мне нужно, что бы вирт. устройство отображалась в интерфейсе без возможности редактирования и реагировало на событие “whenChanged” при записи в топик вида /devices/DEV/controls/CONT/on

Мне непонятно - в чем логика того, что если устройство readonly, то оно не дожно реагировать на событие при записи в топик вида /devices/DEV/controls/CONT/on?

Второе
В версии wb-rules 1.7.1. при описании виртуальных устройств типа value и ряда других к нему приравненных (Temperature, Power, Voltage и прочих) допускалось указывать значение в кавычках. Движок автоматически преобразовывал текстовое значение в число. В новой же версии присвоение значения не происходит. Приходится убирать лишние кавычки (’ ')

В документации в разделе «Совместимость скриптов при обновлении wb-rules» об этом типе данных явно ничего не указано.
Было бы не плохо добавить эту информацию для тугих, как я.

PS
Прошу еще обратить внимание на виртуальные устройства типа «wo-switch». Они не реагируют на присвоение значений value: , да и вообще ,по-моему, ни на что не реагируют.
А для чего этот тип устройств нужен?