Синхронизация кнопок виртуального устройства с реальным

Здравствуйте,
как лучше всего организовать синхронизацию свитчей виртуального устройства с реальным?
При этом необходимо, чтобы после перезапуска эти свитчи были синхронизированы и, очевидно, не происходило рекурсивных вызовов.

Допустим я хочу сделать виртуальное устройство клапана у которого есть свич вкл выкл реле открытия (open_relay). Соответствующее ему устройство - dev[‘open_device’].
Сейчас я сделал 3 правила, но иногда в процессе отладки при перезаливке файла правил кнопки не синхронизированы - в последний раз кнопка на виртуальном устройстве была ВКЛ в то время как реле было ВЫКЛ.

defineVirtualDevice('valve', {
        title: 'my valve',
        cells: {
            open_relay: {type: "switch", value: false, order: 1}
        }
    });

defineRule({
        whenChanged: ["valve/open"],
        then: function (value, device, name) {
            dev['open_device'] = value;
        }
    });

defineRule({
        asSoonAs: function () {
            return dev['open_device'];
        },
        then: function () {
            // продублировать на кнопку в клапане
            dev['valve/open'] = true;
        }
    });

defineRule({
        asSoonAs: function () {
            return !(dev['open_device']);
        },
        then: function () {
            // продублировать на кнопку в клапане
            dev['valve/open'] = false;
        }
    });

Может быть стоит выставить lazyInit и вручную присваивать значение сразу после инициализации (dev[‘valve’][‘open’] = dev[‘open_device’])?
Или же лучше forceDefault и value: dev[‘open_device’] ?

Добрый день.
Хороший архитектурный вопрос. Я обычно решаю его правилами так:

defineRule({
        whenChanged: ["valve/open"],
        then: function (value, device, name) {
            if (dev["open_device"] != value){
              dev["open_device"] = value;
            }
        }
    });

То есть устанавливаю контрол по изменивщемуся контролу только в том случае если у них разные значения.

Не очень хорошо. Если, например, устройство-источник еще не создано, вернется null.

Мне кажется при таком подходе whenChanged не синхонизирует кнопки если при первом инициализации одно устройство вкл а другое выкл. Получается нужно в этом правили слушать оба контрола?

Два правила нужно, в каждом слушаем по устройству и устанавливаем другое.
Виртуальное устройство при запуске установится в состояние считанное с “реального”.
Но да, можно и инициализацию…

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.