Пропадание параметров виртуального устройства при сохранении без использоавния lazyinit

Проблема: для параметров использую
forceDefault : true
Т.е. хочу чтобы после перезагрузки контроллера значения сбрасывались в default.

наблюдаемое непонятное поведение: при сохранении кода в редакторе кода- в разделе “Устройства” - параметр status пропадает в карточке устройства. Помогает обновление страницы c виртуальным устройством.
lazyinit в коде не использую.

Как воспроизвести (воспроизводится не всегда):

  1. Открыть вкладку “устройства” и отдельно вкладку с редактором кода.
  2. Вставить код. Сохранить. Перейти на вкладку устройства. Устройство отобразится полностью (видны все параметры).
  3. Перейти в код. Закомментировать любую строчку кода, например
    98 строчку // dev[“sauna_thermostat/operationTime”] = Math.floor(elapsedTime);
  4. Перейти в окно с устройствами. Параметр status может пропасть, а может нет.
  5. Если не пропал - перейти в шаг 2, сделать изменения, сохраниться, проверить пропадание параметра.
  6. 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
        },


    }
});

value: false,

1 лайк

Почти помогло. Кстати, “спасибо” чатуГПТ, баловался, смотрел как он скрипты пишет. Это “его косяк”))) научить его можно как-то как правильно и как не правильно?)))

Проблема осталась только с параметром virtTemperature. Воспроизводится также.

Можно - просто укажите ему на эту ошибку. Но гарантировать, что в будущем он вам такое не подкинет, нельзя, надо все проверять.

Если убрать все строковые значения (value: “…”) у не строковых контролов, то не воспроизводится.