Ситуация в следующем. Есть некое виртуальное устройство со списком каналов, количество и название каналов будет известно только в процессе описания устройства и каждый раз этот список будет меняться в зависимости от текущих задач.
Требуется получить все каналы в один массив для последующего обращения к конкретному каналу по индексу, без привязки к имени. Подскажите как это реализовать
Добрый день.
Подготовил пример, можете воспользоваться им:
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 лайк