Виртуальные устройства - ошибка при создании

Добрый день! Несколько вопросов по виртуальным устройствам:

1). При создании вирт. устройства сервис ругается на поля “order”, “max” таким образом:

06-12-2022 13:03:31.277 [wb-mqtt-db.service] ERROR: [driver] failed to accept new meta “order” on control “curValue” of device “VinValue”: Invalid value “” of type “value” @ wblib/control.cpp:479

Ошибка возникает как для явно определенных в правиле устройств, так и для сгенерированных скриптом. Описание явно объявленного объекта ниже:

defineVirtualDevice("VinValue", {
  title: "Vin value",
  cells: {
    "curValue": {
      type: "value",
      value: 0,
      order: 1,
    },
    "testingRange": {
      type: "range",
      min: 0,
      max: 100,
      value: 0,
      order: 2,
    },    
  },
});

Почему возникает ошибка? как избавиться?

  1. Если удалить из веб-интерфейса ранее созданное вирт. устройство, затем заново сохранить правило, которое его создает скриптом, заметил, что некоторые контролы не создаются до тех пор, пока не сделаешь обновление страницы “devices”. В правилах при этом также контрол недоступен до момента обновления вкладки Devices (имеет значение null).
    В логах при этом сообщение (INFO) от сервиса wb-rules следующее:
    INFO: Thermostat_TS3/Setpoint: failed to convert value ‘’, passing raw

После обновления странцы на вкладке “devices” контрол добавляется в устройство, правило начинает работать. В чем может быть проблема с контролом при создании ВУ?

Скрипт создания ВУ ниже:

var tsCells = {
    "Setpoint": {
      type: "range",
      value: 25,
      min: 0,
      max: 100,
      order: 3
    },
    "runInterval": {
      type: "range",
      value: 60,
      min: 10,
      max: 60,
      order: 5
    },
};

function defineVirtualTS (nameTS, minSP, maxSP) {
  var tsCellsLocal = {};
  tsCellsLocal = tsCells;
  tsCellsLocal["Setpoint"]["min"] = minSP;
  tsCellsLocal["Setpoint"]["max"] = maxSP;
  //
  defineVirtualDevice("Thermostat_" + nameTS, {
    title:"Thermostat " + nameTS,
    cells: tsCellsLocal
  });
}
  1. Третий вопрос - не срабатывает свойство min у контрола range - в UI ползунок укатывается до нуля. Как исправить?

Здравствуйте! Какая аппаратная версия контроллера у вас? ПО контроллера обновлено?

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

уберите запятую после цифры

Не помогает. Уже все пробелы, табы, выравнивания -все проверял.

А какое значение вы вносите в order?
На Github описаны поля объекта:

  • title — имя, публикуемое в MQTT-топике /devices/.../controls/.../meta/title для данного параметра.
  • type — тип, публикуемый в MQTT-топике /devices/.../controls/.../meta/type для данного параметра. Список доступных типов смотрите в Wiren Board MQTT Conventions.
  • value — значение параметра по умолчанию (топик /devices/.../controls/...).
  • forceDefault — когда задано истинное значение, при запуске контроллера параметр всегда устанавливается в значение по умолчанию. Иначе он будет установлен в последнее сохранённое значение.
  • lazyInit — когда задано истинное значение, при описании контрола в коде фактическое создание его в mqtt происходить не будет до тех пор, пока этому контролу не будет присвоено какое-то значение (например dev[deviceID][controlID] = "string")
  • max для параметра типа range может задавать его максимально допустимое значение.
  • min для параметра типа range может задавать его минимально допустимое значение.
  • readonly — когда задано истинное значение, параметр объявляется read-only (публикуется 1 в /devices/.../controls/.../meta/readonly).

Передаю все свойства одним списком, как показано ниже. В order просто передаю значение. Возможно, Order и Max требуется передавать в виде вложенного объекта, подскажите с примером, если есть возможность.

“runInterval”: {
type: “range”,
value: 60,
min: 10,
max: 60,
order: 5
},
[/quote]

что значит у вас “order: 5”? значение чего?

“runInterval”: {
type: “range”,
value: 60,
min: 10,
max: 60,
order: 5
},

Значение min это минимум шкалы, положение ползунка это value — значение параметра по умолчанию (топик /devices/.../controls/...).

order: 5 - таким образом пытаюсь показать, что в карточке этого устрайства хочу видеть атрибут (контрол) runInterval на 5-ом месте по порядку. Если такое указание некорректно, посоветуйте примером

я правильно понимаю, что min и max задают диапазон (минимальное и макс. значения), в предлах которых ползунок должен в UI работать? Если утвержение верно, то вопрос тот же - ползунок укатывается до нуля (не работает ограничение min), при том, что max корректно работает. Оба свойства объявлены при описании ВУ одинаково, как видно из фрагмента кода

Обратие внимание, имя сервиса wb-mqtt-db.
Не надо связывать его с wb-rules.

Да, верно.
Какая версия wb-rules? В старых - был баг, в mqtt не записывался соответствующий meta.

Верно. Но min работает в testing, в тсабильной, 2207 - игнорируется.

wb-rules Version: 2.11.1
WB stable wb-2201

По п. 3 (свойство min), учту, проверю после обновления. Беспокоит п. 2 - то один, то другой контрол не создаются в устройстве (кстати, оба - range). И тут уже wb-rules ругается. Помогите с этим моментом разобраться.

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

Про пункт 2: попробуйте добавить поля forceDefault для принудительного выставления значения по умолчанию. Проверяю на скрипте ниже, все нормально создается после удаления из веб-интерфейса (релиз wb-2207 stable, wb-rules 2.11.4)

     
var tsCells = {
    "Setpoint": {
      type: "range",
      value: 25,
      min: 0,
      max: 50,
      order: 3,
      forceDefault: true
    },
    "runInterval": {
      type: "range",
      value: 60,
      min: 10,
      max: 60,
      order: 5,
      forceDefault: true
    },
};

function defineVirtualTS (nameTS, minSP, maxSP) {
  var tsCellsLocal = {};
  tsCellsLocal = tsCells;
  tsCellsLocal["Setpoint"]["min"] = minSP;
  tsCellsLocal["Setpoint"]["max"] = maxSP;
  //
  defineVirtualDevice("Thermostat_" + nameTS, {
    title:"Thermostat " + nameTS,
    cells: tsCellsLocal
  });
}

defineVirtualTS ("TS1", 1, 200);

Результат проверки после экспериментов с forceDefault

  1. Добавление forceDefault позволяет обойти (будет некорректно сказать “решить”) проблему. Устройство создается со всеми контролами.

  2. Судя по результату, полученному в п. 1, проблема возникает не в момент создания устройства по заданному шаблону tsCells, а в момент, когда сервис пытается считать (откуда?) последние значения контрола, для которого не задана опция forceDefault, не может сделать это корректно, и контрол не создается.

  3. На основании вывода в п. 2, предлагаю разобраться, откуда читаются предыдущие (последние) значения при создании устройства, и что может быть некорректно, и заканчиваться таким сообщением:
    2022-12-07T10:34:32.650Z [wb-rules] INFO: Thermostat_TS3/outManual: failed to convert value ‘’, passing raw

  4. Возможно, поможет разобраться с проблемой - аналогичные сообщений failed to convert value ‘’, passing raw присутсвуются по другим ресурсам, привожу пример ниже. Совпадение сообщений склоняет к мысли о системной (на уровен ОС или WB) проблеме.

INFO: network/GPRS IP: failed to convert value ‘’, passing raw
INFO: network/Wi-Fi 2 IP: failed to convert value ‘’, passing raw
INFO: network/Ethernet 2 IP: failed to convert value ‘’, passing raw
INFO: network/Ethernet IP: failed to convert value ‘’, passing raw

Похоже, что тут само слово “Setpoint” как-то влияет. Если его изменить на “setpoint” или “Setpoint2”, то отрабатывает все нормально и без forceDefault:

var tsCells = {
    setpoint: {
      type: "range",
      value: 25,
      min: 0,
      max: 5,
      order: 3,
      //forceDefault: true
    },

Данные могут быть сохранены в базе данных mosquitto, если это не было отключено

Эта ошибка не должна быть связана с указанным поведением.

  • тоже замечал подобное - после комментирования и удаления устройства, несколько раз устройство создалось нормально. Но потом, после изменения значения контрола через UI, снова перестало создаваться. Попробуйте у себя изменить значение, затем удалить, и снова создать без forceDef

большие сомнения на счет имени. Поведение одинаково для нескольких контролов. Как писал выше, наблюдения таковы, что влияет, было ли изменено значение (Value) после создания. Если да, то повторно после удаления контрол не создается. Если не было изменений, то наиболее вероятно создастся успешно.

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

Подскажите, у Вас получилось воспроизвети проблему с созданием контролов на Вашей конфигурации релиз (wb-2207 stable, wb-rules 2.11.4)?

И еще по ходу экспериментов обнаружил, что не получается (или нет возможности?) прочитать из созданного устройства (виртуального) значения свойств min/max. Скорее всего, с синтаксисом проблемы. Подскажите, как считать, если это возможно?

Воспроизводилось несколько раз, но теперь не могу повторить.