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

Добрый день!

Это мы поддерживать не будем. Собственно разделение на readonly и не readonly каналы и было введено, чтобы убрать бардак.

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

Я буду очень признателен, если вы найдёте 10 минут и напишите подробно про куцесть и непредсказуемость родного драйвера SNMP. Нам это важно, чтобы понять, что чинить и улучшать. Вы свою проблему уже решили, но другим пользователям это будет полезно. Спасибо!

Да, спасибо, напишем.

И создали новый бардак - свалив все в одну кучу. Т.е. одним параметром и канал в не readonly включаем и одновременно в WebUI поле редактируемым делаем. Нельзя, хотябы это отдельными параметрами задавать?

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

Даже если все делать в wb-rules (версии 2.x.x), то для того что бы произошло событие “whenChanged” в результате каких то вычислений и присвоение значений вирт. устройству - это вирт устройство должно быть readonly: false. И оно опять же становится редактируемым в интерфейсе.

либо, наоборот, внешний сервис опроса SNMP, в котором нужно будет создать структуру устройств.

Видимо, к этому все и прийдет - прийдется забыть про wb-rules и WebUI и использовать стороние сервисы.

И да - вы так и не ответили - в чём же логика. Почему readonly канал (по вашей терминологии) не может вызвать событие “whenChanged” путем записи в топик через MQTT типа /devices/DEV/controls/CONT/on

Все возникшие проблемы были описаны в теме ниже

Если кратко

  • Не поддерживались длиные OIDы
  • Не поддерживались некоторые типы данных
  • Падение сервиса, если при старте не мог “достучаться” до SNMP хоста
  • Если SNMP хост во время опроса становился не доступен - это ни как не фиксировалось в виде ошибки (как это сделано у wb-mqtt-serial по modbus)

Делали так изначально. Путались все, включая разработчиков и авторов.

Так мне кажется это вполне логичным. Вот пишете вы на wb-rules, например, драйвер внешнего термостата. Температура с его датчика - это параметр с readonly: true, потому что поменять его никак нельзя. Зачем там whenChanged?
Ну то есть выглядит так, как будто вы пытаетесь связывать какие-то внутренние компоненты через логику правил, которая для этого не предназначена. Значит, их нужно связать как-то по-другому. Функцию там вызвать, флажок поставить.

Логика в том, что если вы можете поменять значение этого канала снаружи wb-rules (или другого сервиса - держателя соответствующего устройства), то этот канал не readonly.

readonly - это свойство канала, которое показывает, можно ли его менять. Это не управление отображением в веб-интерфейсе.

С точки зрения wb-rules, MQTT и конвенций, веб-интерфейс - это ровно такой же сервис, как и все другие. Поэтому он подчиняется всем тем же правилам. Если кому-то можно менять канал, то и веб-интерфейсу можно.

Я думаю, что решение вашей задачи лежит где-то вокруг настройки виджетов в веб-интерфейсе, чтобы readonly:false каналу можно было отключить возможность задавать в этом виджете данные.

На “переходной” период для чтения “readonly” можно вообще использовать trackMqtt.

Делали так изначально. Путались все, включая разработчиков и авторов.

Думаю, тут вопрос больше понятий и терминологии. Назвали параметр, например, editable - сразу путаться бы перестали :slight_smile:

Логика в том, что если вы можете поменять значение этого канала снаружи wb-rules (или другого сервиса - держателя соответствующего устройства), то этот канал не readonly.

Склонен подозревать, что вы, вероятно, решили ограничить нагрузку на wb-rules, уменьшив количество отслеживаемых событий.

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

Стараюсь функцию whenChanged вообще не использовать (только как событие, того, что какой то контрол или уставки в интерфейсе изменили). Изменение значений с датчиков отслеживаю переодическим опросом. Так сказать - топор в бою надежней.

Я думаю, что решение вашей задачи лежит где-то вокруг настройки виджетов в веб-интерфейсе, чтобы readonly:false каналу можно было отключить возможность задавать в этом виджете данные.

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

На “переходной” период для чтения “readonly” можно вообще использовать trackMqtt.

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

И все же - почему в новом движке wb-rules “whenChanged” не реагирует на топики c /on на конце, если,

  • они опубликованные из сторонних программ
  • в вирт устройстве не выставлен флаг readonly: false

Но при этом, устройства созданные, например, wb-mqtt-serial визуально не имеют флага readonly: false - но они обрабатываются событием “whenChanged”

В чем логика?
Зачем создана такая путаница и “дискриминация” сторонних программ?

1 лайк

Так из bash через mosquitto_pub реагирует же!

Только контролы типа “switch” и “range” по умолчанию активны для изменения в виртуальном устройстве. Для остальных нужно указывать опцию readonly: false. По историческим причинам.

Только если в вирт. устройстве задано - readonly: false

В то время, как устройства созданные через wb-mqtt-serial реагируют на события WhenChnged даже без этой опции (в мета опциях readonly 0 отсутствует или даже напротив - устанвлена 1 “…/meta/readonly 1” )

Только контролы типа “switch” и “range” по умолчанию активны для изменения в виртуальном устройстве. Для остальных нужно указывать опцию readonly: false. По историческим причинам.

Вообще-то, wb-rules ver 1.7.1 реагирует на публикацию значений и величин в топиках …/on без всяких опций readonly: false. О каких исторических причинах идет речь?

@vugluskr Виталий, добрый день! Мне кажется, мы это уже обсуждали в другой теме и не уверен, что есть смысл начинать сначала.

В нашей MQTT-конвенции у каждого устройства есть драйвер-владелец. Только он может писать в топик без /on на конце - таким образом он сообщает всему остальному миру значение определённого канала. Этот же владелец подписывается на топик с /on на конце: в этом топике он ждёт новые значения канала от внешних по отношению к нему сервисов. В топик с /on могут писать все остальные. Топик с /on предназначается только для сервиса - владельца устройства.

readonly:true маркирует каналы, на которые внешние сервисы повлиять не могут. Это, например, показания датчика температуры. Эти показания сервис (драйвер) - владелец устройства считывает с физического датчика и публикует в сервис без /on.

Спасибо за разъяснения.

Единственно, на что я хотел обратить внимание, что в текущей реализации без readonly и без /on можно через командную строку писать в топик, данные в неё попадают (если верить web интерфейсу) но не вызывают срабатывания триггера.
Было бы логично, если бы данные не принимались вовсе, или наоборот, триггер срабатывал. Просто сейчас получается неопределённое промежуточное поведение, и как результат - недоумение :).
Ну и, вдогонку, я не нашёл описания именно этого расклада у вас в wiki. Может, плохо мскал. Если его там и вправду нет, добавить было бы полезно.

А так то проблема решена, механизм заработал.

1 лайк

Тут надо для сначала понять логику.
В /on пишем желаемое состояние устройства. А из топика (который без /on) читаем текущее.
Простой пример: диммер. У него яркость меняется плавно Записали в /on новое значение, “уставку” и наблюдаем изменение реального значения.
Сделано как раз для того чтобы один и тот же топик можно было использовать как интерфейсом или правилами (источник изменений) так и драйвером устройства.

https://wirenboard.com/wiki/MQTT#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.83.D1.81.D1.82.D1.80.D0.BE.D0.B9.D1.81.D1.82.D0.B2.D0.B0.D0.BC.D0.B8_.D0.B8.D0.B7_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4.D0.BD.D0.BE.D0.B9_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.B8

Подскажите, пожалуйста, как правильно удалять правило по аналогии с созданием defineRule. Мне надо менять условие срабатывания по cron и тут без удаления, видимо, никак.

https://wirenboard.com/wiki/Wb-rules_2.0#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.B0.D0.B2.D0.B8.D0.BB.D0.B0.D0.BC.D0.B8

Андрей, но там disable/enable вижу. А если поменять cron параметры динамически, то как управлять самим правилом без переопределения или удаления?

Пока не догнал, есть похожий пример? )

Хотел было прекратить дискуссию, но не смог, потому что все эти условности меня лично тоже вводят в недоумение:

По вашей логике WUI, как и остальные сервисы/драйверы WB должен быть подписан только на топики предназначенные для него.
Или реагировать, хотя бы только на все топики …/on (старая версия WebUI так и поступала). Но он, черт возьми, выводит все подряд, т.е. все значения, которые пишутся напрямую в device/control (без …/on на конце).

Таким образом, если через MQTT опубликовать напрямую в топик типа /devices/vdev/controls/vctrl определенное значений - в UI я вижу это значение вирт. устройства.
А когда пытаюсь прочитать значение этого вирт. устройства напрямую с помощью wb-rules, например,
var A = dev[“vdev”][“vctrl”]) -
то там совсем другое значение, которое он (wb-rules) получил в древности по подписке на …/on (/devices/vdev/controls/vctrl/on)

Теперь, я понимаю, что не должен писать в топик напрямую (это право только сервиса владельца данного вирт. устройства)
Но бесит :wink:
Считаю, что необходимо это разжёвывать в документации с примерами, которые были приведены выше.

1 лайк

Нет…
“Основной” топик и /on это текущее значение и уставка.

Мож переименовать уже его в /setValue… постепенно.

Можно. Можно даже “сразу”, но нельзя - потому что совместимость со сторонними решениями.