Отображение позиции шторы в виджете

Прошу помощи с отображение в виджете актуальной позиции открытия штор.
Ситуация такая: по zigbee подключил карниз aqara. для управления сделал виртуальное устройство. Вот код:

var deviceName1 = 'living_room_curtain_virtual_device';

defineVirtualDevice(deviceName1, {
  title: {'en': 'Living room curtain', 'ru': 'Штора в гостинной'} ,
  cells: {
    enabled: {
      title: {'en': 'Open/Close', 'ru': 'Открыть/Закрыть'},
      type : "switch",
      value: false
    },
    resetlimits: {
      title: {'en': 'Reset limits', 'ru': 'Сбросить границы'},
      type : "switch",
      value: false
    },
    stop: {
      title: {'en': 'Stop', 'ru': 'Остановить'},
      type : "pushbutton",
      value: false
    },
    position: {
      title: {'en': 'Position', 'ru': 'Позиция'},
      type: "range",
      readonly: false,
      value: 100,
      max: 100,
      min: 0,
    },
  }
});

defineRule({
  whenChanged: deviceName1+"/position",
  then: function (newValue, devName, cellName) {
    publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ position: newValue }), 2, false);
  }
});

defineRule({
  whenChanged: deviceName1+"/enabled",
  then: function (newValue, devName, cellName) {
    if (newValue) {
      publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ state: "close" }), 2, false);
    } else {
      publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ state: "open" }), 2, false);
    }
  }
});

defineRule({
  whenChanged: deviceName1+"/resetlimits",
  then: function (newValue, devName, cellName) {
    if (newValue) {
      publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ "options": { "reset_limits": true } }), 2, false);
    } else {
      publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ "options": { "reset_limits": false } }), 2, false);
    }
  }
});

defineRule({
  whenChanged: deviceName1+"/stop",
  then: function (newValue, devName, cellName) {
    publish("zigbee2mqtt/curtain_living_room/set", JSON.stringify({ state: "stop" }), 2, false);
  }
});

Вот так выглядит виджет:


Я бы хотел, чтобы позиция отображала актуальное значение. Например, когда штора полностью закрыта, позиция дожна быть 100. а когда штора полностью открыта - 0.
Для этого добавил такое правило:

defineRule({
  whenChanged: "curtain_living_room/position",
  then: function (newValue, devName, cellName) {
    dev[deviceName1+ "/position"] = dev["curtain_living_room/position"];
  }
});

Но это правило не решило задачу. и актуальное значение в позиции не указывается.
Можете подсказать, как в итоге можно синхронизировать этот контрол и актуальное положение карниза?

Добрый день.

А что в топике “curtain_living_room/position”?
подпишитесь на него, посмотрите какого типа значение.

Положение карниза, значение от 0 до 100. Это сам карниз по zigbee туда пишет. Собственно, логика была такой: если поменялось реальное значение (меняется, когда мотор карниза останавливается), то поставить это же значение в виртуальное устройство в аналогичный контрол

Речь идет о типе возвращаемого значения. Например, 30 можно вернуть как текст/строка (string) 30 или как целочисленное значение.

log(typeof dev["curtain_living_room/position"]); - в ответ вы получите что-то из “number” или “string”

Контрол dev[deviceName1+ "/position"] ожидает на вход “цифровое” значение.
Можно явно указать, что вы желаете преобразовать возвращаемое значение dev["curtain_living_room/position"] в “цифру” используя Number(value), как-то вот так, например…

dev[deviceName1+ "/position"] = Number(dev["curtain_living_room/position"]) ;

PS Для отладки можно вывести возвращаемое значение в лог
log("Текущее положение шторы - ", dev["curtain_living_room/position"] );

2 лайка

спасибо. не додумался действительно