var deviceBaseTopic = "KC868_A16"; var deviceUID = "8C4F00199778"; // Пример ID устройства var wbDeviceId = "wb-kc868-a16-" + deviceUID.toLowerCase(); // Уникальное имя устройства var entityTypes = [ { kc868: "output", wb: "switch", converter: "1_0" }, { kc868: "input", wb: "switch", converter: "1_0" }, { kc868: "adc", wb: "value" }, { kc868: "dac", wb: "range" }, { kc868: "sensor", wb: "text" } ]; // Создание устройства (если не существует) function createOrUpdateVirtualDevice() { log("Проверяем существование устройства: " + wbDeviceId); var device; try { device = getDevice(wbDeviceId); // Попытка получить устройство if (!device.isVirtual()) { log("Устройство с таким ID уже существует, но не является виртуальным!"); return; } log("Устройство уже существует, обновляем контролы."); } catch (e) { log("Устройство не существует, создаём новое."); defineVirtualDevice(wbDeviceId, { title: "KC868-A16 (" + deviceUID + ")", cells: {} }); device = getDevice(wbDeviceId); // Получаем устройство после создания } // Обновляем контролы addOrUpdateControls(device); } // Функция для добавления или обновления контролов function addOrUpdateControls(device) { // Добавление выходов (switch) for (var i = 1; i <= 16; i++) { var outputName = "output_" + i; if (!device.isControlExists(outputName)) { device.addControl(outputName, { type: "switch", value: false, readonly: false }); log("Добавлен контроль: " + outputName); } } // Добавление входов (input) for (var i = 1; i <= 16; i++) { var inputName = "input_" + i; if (!device.isControlExists(inputName)) { device.addControl(inputName, { type: "switch", value: false, readonly: true }); log("Добавлен контроль: " + inputName); } } // Добавление датчиков температуры for (var i = 1; i <= 3; i++) { var sensorName = "sensor_temp_" + i; if (!device.isControlExists(sensorName)) { device.addControl(sensorName, { type: "text", value: "", readonly: true }); log("Добавлен контроль: " + sensorName); } } // Добавление ADC for (var i = 1; i <= 4; i++) { var adcName = "adc_" + i; if (!device.isControlExists(adcName)) { device.addControl(adcName, { type: "value", value: 0, readonly: true }); log("Добавлен контроль: " + adcName); } } } // Обработка сообщений с устройства KC868-A16 trackMqtt(deviceBaseTopic + "/" + deviceUID + "/STATE", function (msg) { log("Получено сообщение от устройства: " + JSON.stringify(msg)); var data; try { data = typeof msg === "string" ? JSON.parse(msg) : msg; } catch (e) { log("Ошибка при разборе JSON: " + msg); return; } var device = getDevice(wbDeviceId); for (var key in data) { if (data.hasOwnProperty(key)) { var controlName = key; var entityType = entityTypes.find(function(type) { return key.indexOf(type.kc868) === 0; }); if (entityType) { controlName = key.replace(entityType.kc868, entityType.wb); if (device.isControlExists(controlName)) { var convertedValue = convertValue(entityType.converter, data[key]); device.getControl(controlName).setValue(convertedValue); log("Обновлено значение для " + controlName + " -> " + convertedValue); } else { log("Контроль не найден: " + controlName); } } else { log("Неизвестный тип данных: " + key); } } } }); // Преобразование значений function convertValue(converterType, value) { if (converterType === "1_0") { return value ? true : false; // Конвертация между 1/0 и true/false } return value; } // Отправка команд на устройство KC868-A16 defineRule("kc868_to_device", { whenChanged: "/devices/" + wbDeviceId + "/controls/+", then: function (newValue, devName, cellName) { var targetTopic = deviceBaseTopic + "/" + deviceUID + "/" + cellName + "/SET"; var message = JSON.stringify({ value: newValue }); log("Отправка команды: " + targetTopic + " с сообщением: " + message); publish(targetTopic, message); } }); // Создаем или обновляем виртуальное устройство при старте createOrUpdateVirtualDevice();