Не срабатывают правила при изменении контрола виртуального девайса извне

Всем привет!

Не могу понять, что я делаю не так, помогите разобраться.
Есть виртуальное устройство и у него есть контрол типа text, на него подписана пара правил. Примерно так:

log('File loaded');

defineVirtualDevice('someVirtualDevice', {
    title: 'Some virtual device',
    cells: {
        someValue: {
            type: 'text',
            value: '',
            forceDefault: true
        }
    }
});

defineRule('Foo', {
    whenChanged: ['someVirtualDevice/someValue'],
    then: function() {
        log('Foo rule body');
    }
});

defineRule('Bar', {
    when: function() {
        log('Bar rule condition');
        return dev['someVirtualDevice']['someValue'] != '';
    },
    then: function() {
        log('Bar rule body');
    }
});

Когда я сохраняю файл с таким содержимым, я получаю в консоли со включенной отладкой такие сообщения:

2019-12-04 23:32:14 File loaded
2019-12-04 23:32:14 defineRule: Foo
2019-12-04 23:32:14 defineRule: Bar
2019-12-04 23:32:14 Bar rule condition

Логично. Также я вижу новый девайс в разделе Devices веб-интерфейса. И вижу дерево девайса в MQTT Explorer, мета присутствует, всё как положено.

Теперь я извне отправляю в MQTT непустое сообщение в топик /devices/someVirtualDevice/controls/someValue

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

Пробую изменять значение контрола в самом движке правил:

defineRule('Random', {
    when: cron('0 * * * * *'),
    then: function() {
        var randomNumber = Math.floor(Math.random() * 100);
        log('Random number: {}', randomNumber);
        dev['someVirtualDevice']['someValue'] = randomNumber;
    }
});

А вот так работает. Каждую минуту я получаю в консоли сообщения типа:

2019-12-05 00:34:58 Random number: 36
2019-12-05 00:34:58 Foo rule body
2019-12-05 00:34:58 Bar rule condition
2019-12-05 00:34:58 Bar rule body

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

Почему так? Где я согрешил?
Мой вопрос казалось бы очень похож на этот, но мне перезагрузка никак не помогает.
Версия wb-rules 1.7.1, контроллер WB6.

Добавьте /on на конце.

1 Like

Спасибо, так работает.
/on надо использовать для изменения состояния контролов любых типов? Я решил, что это только для switch, из документации это неочевидно. И при изменении значения через переменную dev, не публикуется сообщение в /devices/someVirtualDevice/controls/someValue/on.

2 Likes

Добрый день!

Да.

Согласен. Если есть желание/возможность, можете сделать Pull request сюда: https://github.com/contactless/homeui/blob/master/conventions.md

Проверим.