API сценариев wb-rules: различия между версиями

Материал из Wiren Board
м (Добавил ссылки)
(Перенаправление на Wb-rules)
Метка: новое перенаправление
 
Строка 1: Строка 1:
== API управления девайсами и контролами ==
#REDIRECT [[wb-rules]]
 
Наравне с доступом к контролам через специальную переменную dev есть также API, позволяющий получить возможности, которые недоступны при использовании dev.
Например, можно сначала определить виртуальное устройство без контролов и после этого вызывая метод addControl() добавлять динамически к нему необходимые контролы.
 
Приведённый ниже код при изменении положения переключателя создаст новый контрол, если его в данный момент нет на девайсе и удалит, если он присутствует:
<syntaxhighlight lang="ecmascript">
 
var ctrlID = "myCtrlID";
defineRule({
  whenChanged: ["spawner/spawn"],
  then: function(newValue) {
    if (getDevice("spawner").isControlExists(ctrlID)) {
      getDevice("spawner").removeControl(ctrlID);
    } else {
      var newControl = {type: "text", value: "test-text", readonly: false};
      getDevice("spawner").addControl(ctrlID, newControl);
    }
  }
});
 
defineVirtualDevice("spawner", {
  title: "spawner",
  cells: {
    "spawn": {
      type: "switch",
      value: false,
    },
  },
});
 
</syntaxhighlight>
 
Здесь использованы методы getDevice() для получения объекта девайса, для этого объекта вызывается метод isControlExists() для проверки на существование контрола с указанным ID. addControl() и removeControl() добавляет и удаляет контрол соответсвенно.
 
Для получения объекта девайса также можно использовать возврат функции defineVirtualDevice(). Пример выше можно переписать с использованием этого метода следующим образом:
<syntaxhighlight lang="ecmascript">
 
var spawnerDevice;
 
spawnerDevice = defineVirtualDevice("spawner", {
  title: "spawner",
  cells: {
    "spawn": {
      type: "switch",
      value: false,
    },
  },
});
 
defineRule({
  whenChanged: ["spawner/spawn"],
  then: function(newValue) {
    if (spawnerDevice.isControlExists(ctrlID)) {
      spawnerDevice.removeControl(ctrlID);
    } else {
      var newControl = {type: "text", value: "test-text", readonly: false};
      spawnerDevice.addControl(ctrlID, newControl);
    }
  }
});
 
</syntaxhighlight>
 
Также для получения всех контролов в данный момент существующих у девайса можно использовать метод controlsList() - он возвращает массив объектов, которые представляют контролы.
 
Например, чтобы получить доступ по всем контролам девайса "some-device" и вывести их ID и значение ошибки можно использовать такой код:
 
<syntaxhighlight lang="ecmascript">
 
getDevice("some-device").controlsList().forEach(function (ctrl) {
  log("ctrlID: {}, error: {}".format(ctrl.getId(), ctrl.getError()))
})
 
</syntaxhighlight>
 
Здесь используются методы объекта контрола getId(), который возвращает строковое значения id контрола и getError(), который возвращает строку, содержащуюю текст ошибки или пустую строку при её отсутствии.
 
У контролов также есть методы-сеттеры, с помощью которых можно устанавливать различные опции.
Например, если необходимо при нештатной ситуации установить ошибку на контролле, который не может отобразить данные можно использовать такой код:
 
<syntaxhighlight lang="ecmascript">
 
runShellCommand("cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave", {
  captureOutput: true,
  exitCallback: function (exitCode, capturedOutput) {
    if (exitCode != 0) {
      getDevice("Temperature").getControl("term1").setError("sensor unreachable");
      return;
    }
    ...
  }
});
 
</syntaxhighlight>
 
Полный список доступных методов для девайсов:
 
<syntaxhighlight lang="ecmascript">
 
getDeviceId() - возвращает id девайса
getCellId() - возвращает строку "device_id/ctrl_id" для использования с dev[]
addControl() - создаёт новый контрол на девайсе
getControl() - возвращает контрол по id
isControlExists() - возвращает true, если контрол с указанным id существует, иначе - false
removeControl() - удаляет контрол с указанным id
controlsList() - возвращает массив всех контролов на девайсе
 
</syntaxhighlight>
 
Полный список доступных методов для контролов:
 
<syntaxhighlight lang="ecmascript">
 
getId() - возвращает строку, содержащую id контрола
[get|set]Description() - возвращает/устанавливает строку description
[get|set]Type() - возвращает/устанавливает строку type
[get|set]setUnits() - возвращает/устанавливает строку units
[get|set]Readonly() - возвращает/устанавливает булево значение readonly
[get|set]Max() - возвращает/устанавливает число поля max
[get|set]Error() - возвращает/устанавливает строку поля error
[get|set]Order() - возвращает/устанавливает число поля order
 
</syntaxhighlight>
 
== Полезные ссылки ==
* [[Wb-rules | Описание wb-rules на wiki]]
* [[Wb-jscript | Написание скриптов для начинающих]]
* [[How to write rules | Как писать правила]]
* [[Rule Examples | Примеры правил]]
* [https://github.com/wirenboard/wb-rules Репозиторий wb-rules на Github]

Текущая версия на 13:26, 19 января 2022

Перенаправление на: