(function() { // ===== КОНФИГУРАЦИЯ ===== var DEVICE_ID = "thermostat_zht006"; var HUB_ID = "6535EB0F093C07B5_1"; var ACCESSORY_ID = "80"; // MQTT топики (полные пути) var TOPICS = { state: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID, state_current_temp: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID + "/13/17", // currentTemperature state_target_temp: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID + "/13/18", // targetTemperature state_power: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID + "/13/16", // power state set_power: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID + "/13/16/set", set_temp: "Sprut.hub-" + HUB_ID + "/accessories/" + ACCESSORY_ID + "/13/18/set" }; // ===== ИНИЦИАЛИЗАЦИЯ УСТРОЙСТВА ===== defineVirtualDevice(DEVICE_ID, { title: "Термостат ZHT-006", cells: { power: { type: "switch", value: false, readonly: false, order: 1 }, current_temp: { type: "temperature", value: 0, unit: "°C", readonly: true, order: 2 }, target_temp: { type: "range", value: 20, unit: "°C", readonly: false, min: 5, max: 35, step: 0.5, order: 3 }, last_update: { type: "text", value: "Инициализация...", readonly: true, order: 4 } } }); // ===== ОБРАБОТКА СОСТОЯНИЯ ===== // Для каждого параметра создаем отдельное правило // 1. Обработка текущей температуры defineRule("thermostat_current_temp_handler", { whenChanged: "mqtt/" + TOPICS.state_current_temp, then: function(newValue) { try { var temp = parseFloat(newValue); if (!isNaN(temp)) { dev[DEVICE_ID].current_temp = temp; dev[DEVICE_ID].last_update = "Температура: " + temp + "°C (" + new Date().toLocaleTimeString() + ")"; } } catch(e) { dev[DEVICE_ID].last_update = "Ошибка температуры: " + e; } } }); // 2. Обработка целевой температуры defineRule("thermostat_target_temp_handler", { whenChanged: "mqtt/" + TOPICS.state_target_temp, then: function(newValue) { try { var temp = parseFloat(newValue); if (!isNaN(temp)) { dev[DEVICE_ID].target_temp = temp; dev[DEVICE_ID].last_update = "Уставка: " + temp + "°C (" + new Date().toLocaleTimeString() + ")"; } } catch(e) { dev[DEVICE_ID].last_update = "Ошибка уставки: " + e; } } }); // 3. Обработка состояния питания defineRule("thermostat_power_handler", { whenChanged: "mqtt/" + TOPICS.state_power, then: function(newValue) { try { var powerState = (newValue === "true" || newValue === "1" || newValue === "on"); dev[DEVICE_ID].power = powerState; dev[DEVICE_ID].last_update = "Питание: " + (powerState ? "ВКЛ" : "ВЫКЛ") + " (" + new Date().toLocaleTimeString() + ")"; } catch(e) { dev[DEVICE_ID].last_update = "Ошибка питания: " + e; } } }); // ===== УПРАВЛЕНИЕ УСТРОЙСТВОМ ===== // 1. Управление температурой defineRule("thermostat_temp_control", { whenChanged: DEVICE_ID + "/target_temp", then: function() { try { var temp = dev[DEVICE_ID].target_temp; // Отправляем просто число как строку publish(TOPICS.set_temp, temp.toString()); dev[DEVICE_ID].last_update = "Установка температуры: " + temp + "°C (" + new Date().toLocaleTimeString() + ")"; } catch(e) { dev[DEVICE_ID].last_update = "Ошибка отправки температуры: " + e; } } }); // 2. Управление питанием defineRule("thermostat_power_control", { whenChanged: DEVICE_ID + "/power", then: function() { try { var powerState = dev[DEVICE_ID].power; // Пробуем разные форматы команд var commands = [ powerState ? "1" : "0", powerState ? "true" : "false", powerState ? "on" : "off" ]; // Отправляем все варианты (один из них должен сработать) commands.forEach(function(cmd) { publish(TOPICS.set_power, cmd); }); dev[DEVICE_ID].last_update = "Установка питания: " + (powerState ? "ВКЛ" : "ВЫКЛ") + " (" + new Date().toLocaleTimeString() + ")"; } catch(e) { dev[DEVICE_ID].last_update = "Ошибка отправки питания: " + e; } } }); // ===== ИНИЦИАЛИЗАЦИЯ ===== // Запрос текущего состояния при старте setTimeout(function() { // Запрашиваем все параметры publish(TOPICS.state + "/get", "{}"); dev[DEVICE_ID].last_update = "Система инициализирована (" + new Date().toLocaleTimeString() + ")"; log("Термостат инициализирован. Топики:", JSON.stringify(TOPICS, null, 2)); }, 5000); })();