Проблема: для параметров использую
forceDefault : true
Т.е. хочу чтобы после перезагрузки контроллера значения сбрасывались в default.
наблюдаемое непонятное поведение: при сохранении кода в редакторе кода- в разделе “Устройства” - параметр status пропадает в карточке устройства. Помогает обновление страницы c виртуальным устройством.
lazyinit в коде не использую.
Как воспроизвести (воспроизводится не всегда):
- Открыть вкладку “устройства” и отдельно вкладку с редактором кода.
- Вставить код. Сохранить. Перейти на вкладку устройства. Устройство отобразится полностью (видны все параметры).
- Перейти в код. Закомментировать любую строчку кода, например
98 строчку // dev[“sauna_thermostat/operationTime”] = Math.floor(elapsedTime); - Перейти в окно с устройствами. Параметр status может пропасть, а может нет.
- Если не пропал - перейти в шаг 2, сделать изменения, сохраниться, проверить пропадание параметра.
- F5 со страницей устройств отобразит параметр.
код:
// Настройка виртуального устройства
defineVirtualDevice("sauna_thermostat", {
title: "Сауна Термостат",
cells: {
status: {
type: "switch",
readonly: false,
value: "false",
forceDefault : true
},
setTemperature: {
type: "range",
value: 80,
min: 50,
max: 110
},
currentTemperature: {
type: "value",
readonly: true,
value: 0
},
virtTemperature: {
type: "range",
value: 80,
min: 50,
max: 120
},
heaterStatus: {
type: "switch",
readonly: true,
value: "false",
forceDefault : true
},
fault: {
type: "switch",
readonly: true,
value: "false"
},
reset: {
type: "switch",
readonly: false,
value: "false"
},
operationTime: {
type: "value",
readonly: true,
value: 0 // Время в секундах
},
operationDuration: {
type: "value",
readonly: false,
value: 60 // Время в секундах
},
}
});
// Конфигурация
// var operationDuration = 60 * 60 * 1000; // 1 час
// var safetyInput = "wb-gpio/A1_IN"; // Заменить!!!
var saunaTimer = null;
var operationStartTime = null;
var virtualSensor = dev["sauna_thermostat/virtTemperature"]; // Виртуальный датчик температуры
var hysteresis = 2;
// Обновление температуры и проверка условий
defineRule("update_status", {
when: cron("@every 1s"), // Обновление каждую секунду
then: function() {
var currentTemp = dev["sauna_thermostat/virtTemperature"];
dev["sauna_thermostat/currentTemperature"] = currentTemp;
if ( dev["sauna_thermostat/status"] == true) {
if (currentTemp >= dev["sauna_thermostat/setTemperature"] + hysteresis /*|| checkSensorError()*/) {
dev["sauna_thermostat/heaterStatus"] = false;
// dev["wb-gpio/Relay_1"] = false; // Заменить!!!
}
if (currentTemp <= dev["sauna_thermostat/setTemperature"] - hysteresis /*|| checkSensorError()*/) {
dev["sauna_thermostat/heaterStatus"] = true;
// dev["wb-gpio/Relay_1"] = false; // Заменить!!!
}
}
if (operationStartTime) {
var elapsedTime = (Date.now() - operationStartTime) / 1000 +1;
dev["sauna_thermostat/operationTime"] = Math.floor(elapsedTime);
}
dev["systemController/saunaControllerScriptCounter"] +=1;
}
});
// Обработка ошибок датчика
function checkSensorError() {
//var temperature = dev[virtualSensor];
var temperature = virtualSensor;
return isNaN(temperature) ||/* temperature > maxTemperature ||*/ temperature < -20;
log ("ошибка датчика");
}
// Управления запуском/остановкой сауны
defineRule("start_stop_button", {
whenChanged: "sauna_thermostat/status",
then: function(newValue) {
if (dev["sauna_thermostat/status"] === true) {
if (!checkSensorError()) { // Поменять при подключении физического входа
// dev["sauna_thermostat/status"] = true;
// dev["sauna_thermostat/heaterStatus"] = "Включено";
// dev["wb-gpio/Relay_1"] = true; // Заменить!!!
operationStartTime = Date.now();
saunaTimer = setTimeout(stopSaunaByTimer, dev["sauna_thermostat/operationDuration"]*1000);
log("сауна запущена");
}
} else {
stopSauna();
}
}
});
// Функции управления сауной
function startSauna() {
// if (!checkSensorError() && !dev[safetyInput]) { // Заменить!!!
}
function stopSaunaByTimer() {
stopSauna();
log("сауна остановлена автоматически по таймеру");
};
function stopSauna() {
dev["sauna_thermostat/status"] = false;
dev["sauna_thermostat/heaterStatus"] = false;
// dev["wb-gpio/Relay_1"] = false; // Заменить!!!
if (saunaTimer) {
clearTimeout(saunaTimer);
saunaTimer = null;
}
operationStartTime = null;
log("сауна остановлена");
}
defineVirtualDevice("systemController", {
title: "systemController",
cells: {
saunaControllerScriptCounter: {
type: "value",
readonly: false,
value: "0",
forceDefault: true
},
}
});