Получение списка Каналов виртуального устройства

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

Добрый день.
Подготовил пример, можете воспользоваться им:

defineVirtualDevice('dev', {
    cells: {
        ControlName1: {
            title: "Name 1",
            type: "switch",
            value: false
        },
        ControlName2: {
            title: "Name 2",
            type: "switch",
            value: false
        },
    }
})

runShellCommand("timeout 2 mosquitto_sub -v -t /devices/dev/controls/+", {
    captureOutput: true,
    exitCallback: function(exitCode, capturedOutput) {
        var arr = capturedOutput.replace(/\n/g, ' ').split(' ');
        for (i = arr.length - 1; i >= 0; i--) {
            if (i % 2 === 1) {
                arr.splice(i, 1);
            }
        }
        log(arr[0]);
        log(arr[1]);
    }
});

Взял за основу пример, немного под себя переделал. Худо-бедно но работает:

var command = “timeout 2 mosquitto_sub -v -t /devices/+/controls/+/meta/type”;
runShellCommand(command, {
captureOutput: true,
exitCallback: function(exitCode, capturedOutput) {
if (exitCode !== 0 && exitCode !== 124) {
log.warning(“Command exited with code: {}”, exitCode);
return;
}

    var devices = {};
  var DevCh = {};
  var CountCh=0;
    capturedOutput.split(/\r?\n/).forEach(function (entry) {
        var parts = entry.match("/devices/(.+)/controls/(.+)/meta/type (.+)");

        if (parts != null && parts.length === 4 && parts[1] == "Virtual-device_n2") {
            var device = parts[1];
            var control = parts[2];
            var control_type = parts[3];
            if (!(device in devices)) {
                devices[device] = {};
            }

            devices[device][control] = control_type;
            DevCh[CountCh] = control;
            CountCh++;
        }
    });

    for (var i =0; i < CountCh; i++){
      log(DevCh[i]);
    }

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

На всякий случай скажу, что в wb-rules есть API создания/управления устройств и с ним это делается довольно тривиально:

getDevice("deviceName").controlsList().forEach(function(ctrl) {
    log(ctrl.getId())
});
1 лайк