Виртуальное устройство (rules)

Добрый день.

Хочу вывести вильты питания контроллера на виртуальное устройство через рулез

Что не так?

defineVirtualDevice("set", { 
    title: "Вольт",
    cells: {
      "s_1": {
        type: "value",
        value: 0,
        order: 1
      },
	}
});

defineRule("set", {
  whenChanged: ["/devices/power_status/controls/Vin"], 
	then: function (newValue, devName, cellName)  {
      dev["set"]["s_1"] = newValue;
    }
});

whenChanged - а оно меняется? Или стабильно?

стабильно

И тогда как оно сработает?

defineVirtualDevice("set", { 
    title: "Вольт",
    cells: {
      "s_1": {
        type: "value",
        value: 0,
      },
	}
});

defineRule("set", {
  asSoonAs: function () {
    // edge-triggered-правило - выполняется, только когда значение
    // данной функции меняется и при этом становится истинным
    return dev["/devices/power_status/controls/Vin"] && (dev["set/s_1"] == "0");
  },
  then: function (newValue, devName, cellName)  {
      dev["set"]["s_1"] = dev["power_status"]["Vin"];
  }
});

Для dev не указывается “devices”, “controls”.
Ожидается передача параметра в виде “power_status/Vin”, остальное для конвенционных - константа и подставится само.
То есть работать будет так:

dev["power_status/Vin"]

Это описано в документации.

Как указал выше - работает )))
Но корректнее, как в документации (и скорее всего приводит все равно к такому виду внутри).

Ну, это недокументировано, сегодня работает но никто не гарантирует что и завтра будет, случайно пофиксят при рефакторинге.

Не думаю.
Скорее всего нотация

dev["power_status/Vin"]

просто промежуточная до

`dev["set"]["s_1"]`

И полная будет поддерживаться всегда, так как до нее приводится (и так просто написана документация). Конечно, еще исходный код посмотреть надо, но …

В любом случае, желательно делать так, как описано в документации. Тут согласен.

Более того, имхо, правильнее описывать только в одной нотации все:

`dev["set"]["s_1"]`

А другие использовать при сложных подстановках (и таких примеров кода тут нет)

1 лайк