Баг в работе виджетов

Заметил такую особенность, например есть у меня виртуальное устройство такого вида

defineVirtualDevice("outdoor", {
    title: "OutdoorWidget" ,
    readonly: false,
    cells: {
      Temperature: {
          title: "Temperature",
	        type: "temperature",
	        value: dev["wb-ms_138/Temperature"]
	    },
      Humidity: {
          title: "Humidity",
	        type: "rel_humidity", 
	        value: dev["wb-ms_138/Humidity"]
	    }
    }
})

и я хочу чтоб виджет отображал его параметры соответственно

{
  "name": "Температура за бортом",
  "description": "",
  "compact": false,
  "cells": [
    {
      "id": "outdoor/Temperature",
      "name": "Температура",
      "extra": {},
      "type": "temperature"
    },
    {
      "id": "outdoor/Humidity",
      "name": "Влажность",
      "extra": {},
      "type": "rel_humidity"
    }
  ]
}

особенность заключается в том что данные по температуре/влажности в какой то момент перестают обновляться и зависают, при чем ни на работу правил ни на что то еще кроме виджета это не влияет. если заменить "id": "outdoor/Temperature", на "id": "wb-ms_138/Temperature" то все отображается нормально. В принципе это не критичный момент если у тебя пара датчиков, но если их несколько десятков то было бы удобнее давать им более осмысленные названия…

Добрый день.
Интересно. То есть значение (топик) в виртуальном устройстве меняется а в виджете - нет?
Попробую воспроизвести, сделаю стенд. А как долго ждать? Какой релиз на контроллере?

релиз wb-2207. В общем проверил все еще раз и воспроизвел проблему и могу уточнить следующее:
в mqtt сообщения тоже не публикуются(я проверил свои правила, ониработали нормально потому что я везде явно указал топик датчиков, а не через виртуальное устройство). Перестают обновляться значения практически сразу же. Вот код для воспроизведения проблемы:

defineVirtualDevice("test-widget", {
    title: "test" ,
    readonly: false,
    cells: {
      Temperature: {
          title: "Temperature",
	        type: "temperature",
	        value: dev["wb-ms_132/Temperature"]
	    },

      TestControl: {
          type: "range",
          value: 22, 
          min:5,
          max: 30
      },
      TestButton: {
          type: "switch",
          value: false
      }
    }
})

defineRule({
    whenChanged: function() {
        return dev["test-widget/Temperature"];
    },
    then: function() {
        log("temperature is {}", dev[test-widget.Temperature]);
    }
})

defineRule({
    whenChanged: function() {
        return dev["test-widget/Temperature", "test-widget/TestControl"];
    },
    then: function() {
        log("temperature set to {}", dev["test-widget/TestControl"]);
        if (dev["test-widget/Temperature"] < dev["test-widget/TestControl"]) {
            dev["test-widget/TestButton"] = true;
        } else  dev["test-widget/TestButton"] = false;
    }
})

1 лайк

Не очень понятно, где еще изменяется значение.
Кроме этого места - не вижу.

Я вас наверное немного запутал, прошу прощения. Вот минимальный пример:

defineVirtualDevice("test-widget", {
    title: "test" ,
    readonly: false,
    cells: {
      Temperature: {
          title: "Temperature",
	        type: "temperature",
	        value: dev["wb-ms_132/Temperature"]
	    },

      TestRelay: {
          type: "switch",
          value: dev["wb-mr6c_24/K3"]
      }
    }
})

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

Да. Так и должно быть. Конструкция dev["wb-ms_132/Temperature"] возвращает значение. То есть именно то, что там на момент ее выполнения.
Если требуется значение менять - то нужно правило.

Вам надо отслеживать топик реле с помощью whenChanged и менять состояние виртуального устройства.

Спасибо, теперь я понял.

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