KNX и правила

Добрый день,

Пытаюсь разобраться со связкой “KNX-устройство - виртуальное устройство WB - контрол, который создался автоматически при настройке групповых адресов KNX”.

Теперь более детально. Физическое устройство настроил. В WB групповой адрес прописал. В устройствах это выглядит так.

Если я исправляю значение в контроле temp_by_wall - оно отправляется на физическое устройство. Если нажимаю кнопку на физическом устройстве - меняется значение в контроле temp_by_wall.

Телеграмы KNX ходят все ок. Выглядит все это вот так:

> |12-10-2024 15:33:12.816|DEBUG: Received from knxd: from:1.1.1 to:1/1/50 tpdu(4):00 80 0d 46|
> |12-10-2024 15:33:11.647|DEBUG: Sent to knxd: to:1/1/50 tpdu(4):00 80 0d 2d|

Далее, добавляю виртуальное устройство my-virtual-device с контролом ControlName2.

Пишу правило, чтобы при нажатии кнопки (ищменение температуры) на физическом устройстве - соответственно менялось значение my-virtual-device/ControlName2:

defineRule({
  whenChanged: "temp_by_wall/temp_setpoint",
  then: function (newValue, devName, cellName) {
    dev["my-virtual-device/ControlName2"] = dev["temp_by_wall/temp_setpoint"]; 
  }
});

правило работает, когда я меняю температуру на физ.устройстве (понятно, потому что приходит сообщение и меняется значение temp_by_wall/temp_setpoint), при этом, если я изменяю температуру в UI, изображение выше - на физическом устройстве меняется, на виртуальном - нет. Предполагаю из-за того, что выполняется только “Send to knxd” или потому что я неправильно считываю изменившееся значение из temp_by_wall/temp_setpoint.

Также не работает и это правило:

defineRule({
  whenChanged: "my-virtual-device/ControlName2",
  then: function (newValue, devName, cellName) {
    dev["temp_by_wall/temp_setpoint"] = dev["my-virtual-device/ControlName2"]; 
  }
});

при изменении my-virtual-device/ControlName2 не отправляется изменение на физическое устройство.

Подскажите, пожалуйста, где я не прав… Спасибо!

Добрый день
Примеры правил расположены:

Попробуйте изменить правила так:

defineRule({
  whenChanged: "temp_by_wall/temp_setpoint",
  then: function (newValue, devName, cellName) {
    dev["my-virtual-device/ControlName2"] = newValue; 
  }
});
defineRule({
  whenCommand: "my-virtual-device/ControlName2",
  then: function (newValue, devName, cellName) {
    dev["temp_by_wall/temp_setpoint"] = newValue;
  }
});

Теперь, если вы измените значение через UI на виртуальном устройстве, это значение отправится на физическое устройство.

Александр, спасибо. Буду пробовать и читать документацию.

Александр, вот в этом правиле - whenCommand - правильная конструкция? Не нашел в описании (

Error: error error (rc -100) 
anon native strict preventsyield 
anon /usr/share/wb-rules-system/scripts/lib.js:246 
F /etc/wb-rules/virtual_termo.js:38 preventsyield

И все же - не работает как хочется. Попробую написать еще раз.

  1. при нажатии кнопок на KNX устройстве - от него приходит сообщение, я вижу его в топике “temp_by_wall/temp_setpoint”, значение отображается в UI и в виртуальном устройстве (как раз по правилу whenChanged)
  2. при изменении значения в виртуальном устройстве - меняется цифра на KNX устройстве, но не меняется значение в UI, привязанном к этому топику, в топике также старое значение. То есть делаю вывод, что изменение уходит на физическое устройство, но обратно в топик значение не возвращается (да и не должно).
  3. при изменении значения в UI, привязанном к этому топику - все аналогично п.2. Изменения не отражаются в виртуальном устройстве.

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

А задача простая - синхронизация значений (например, уставка температуры) на нескольких устройствах, в том числе виртуальных.

Добрый день,

К сожалению, я не могу воспроизвести вашу ситуацию на живом стенде, но могу предложить несколько полезных ресурсов, которые помогут вам:

Эти материалы содержат примеры правил и документацию, которые могут помочь решить вашу задачу.

Также стоит рассмотреть возможность добавления принудительного опроса для синхронизации и обратить внимание на риск зацикливания, о котором вы уже упомянули.

А whenCommand - это ошибка?

Хорошо, тем не менее, возможно, вы подскажете лучшие практики по работе с KNX устройствами. Как лучше передавать новое значение на устройство - писать в очередь непосредственно кодом или изменять значение объекта, который появляется автоматически после настройки групповых адресов KNX?

Посовещаюсь с коллегами и вернусь к вам с рекомендациями

1 лайк

Добрый день.

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

Пока могу только процитировать оригинальное сообщение

Детальные настройки в “Конфигурационных файлах” попробую прислать немного позже.

1/1/50 - адрес на котором сидит элемент setpoint на физическом устройстве - приходит сообщение, когда на устройстве нажимаю кнопку, уходит сообщение на устройство, когда вношу изменение в UI-контрол WB, привязанный к этому групповому адресу.

Вы не поняли.

Прошу показать интерфейс ETS этих групповых адресов.

ОК. Понял. Вышлю как это выглядит в ETS попозже вечером.

1 лайк

Если я правильно понял…

Здравствуйте.

Попробуйте разделить групповые адреса:

  • Один на Input
  • Другой на Output - там на каждом объекте активируйте флажки «Update»

Добрый день, удалось ли решить вопрос?

Добрый день, извините за долгую реакцию - могу разбираться с WB только по выходным)))

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

Что я сделал

  1. Присвоил отдельные групповые адреса для нажания кнопок input, нажатия кнопок output, дисплей input.

  2. Проставил вообще все флаги

  3. Присвоил перекрестно все эти функции ко всем трем групповым адресам

  4. Установил значение для всех групповых адресов (и кажется, что в этом была моя проблема)

Сейчас работает следующая логика - когда меняю на устройстве уставку - она меняется в UI и в виртуальном устройстве, когда меняю на виртуальном устройстве - меняется в UI и на самом устройстве. Вобщем все работает и нет зацикливания.

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

Осталось непонимание разницы работы флагов W и U - в интернете пишут вот так, что для меня одно и то же. Так как я не понимаю в каких случаях возникает GroupValueWrite и GroupValueResponse

The Write flag (W-flag)

This device object reacts back to a GroupValueWrite coming from the bus, meaning it will overwrite the object value. For a switch actuator, for example, this might mean that a certain relay representing these objects will be opened or closed.

The Update flag (U-flag)

A device with this object reacts to a GroupValueResponse telegram, capable of overwriting the object values.

Но в целом - спасибо - вы меня в нужную сторону направили. Буду экспериментировать )))

1 лайк

Здравствуйте.

Спасибо за обратную связь, хорошо что все получилось.

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

Это логически понятно как раз. Спасибо)