Синхронизация ошибки виртуального и реального устройства

Я создал виртуальное устройство. Реальное устройство контроллов cleaning и sensorDoor не показывает ошибку устройства. А виртуальное устройство говорит об ошибке. Вот мой код, подскажите в чем моя ошибка?

//    1. НЕОБХОДИМО ЗАПОЛНИТЬ ДАННЫЕ ПО УСТРОЙСТВУ

// 1.1 путь до внешних физических устройств
var temperatureSensorDoor = "wb-m1w2_145/External Sensor 1"
var temperatureSensorDeep = "wb-m1w2_145/External Sensor 2"
var redLamp = "wb-mr6cu_188/K1"
var greenLamp = "wb-mr6cu_188/K3"
var yellowLamp = "wb-mr6cu_188/K2"
var sensorDoor = "wb-mai6_66/IN 4 N State"
var cleaning = "wb-mai6_66/IN 2 N State"


// ----------------- список комнат -------------------------------- //
var room_4 = "Ресторан"
var room_4_1 = "Гостевой тамбур"
var room_4_2 = "Зал №1"
var room_4_3 = "Зал №2"
var room_4_4 = "Гостевой туалет"
var room_4_5 = "Детская"
var room_4_6 = "Моповая в зале"
var room_4_7 = "Кассовая зона"

var room_5 = "Кухня"
var room_5_1 = "Служебный тамбур"
var room_5_2 = "Курьерская"
var room_5_3 = "Служебный туалет"
var room_5_4 = "Раздевалка"
var room_5_5 = "Персоналка"
var room_5_6 = "Сухой склад"
var room_5_7 = "Горячий цех"
var room_5_8 = "Холодный цех"
var room_5_9 = "Моечная"
var room_5_10 = "Моповая на кухне"

// 1.2 введите Id и Имя холодильника. Номер комнаты возьми из списка выше (room_5_7)
var idDevice = "1_4"
var idName = "Холодильник 4 хранение сыра" + "/fridge_"+idDevice + "/" + room_5_7


// -------------------------------------------------------------------------- // 

//   2. СКРИПТ НА СОЗДАНИЕ УСТРОЙСТВА
defineVirtualDevice("fridge_"+idDevice, {
    title: idName ,
    cells: {
      temperatureSensorDoor: {
        title: "Температура у двери",
        type: "temperature",
        value: 0,
        order: 9
      },
      temperatureSensorDeep: {
        title: "Температура у блока",
        type: "temperature",
        value: 0,
        order: 10
      },
      redLamp: {
        title: "Красная лампа",
        type: "switch",
        value: false,
        order: 4
      },
      greenLamp: {
        title: "Зеленая лампа",
        type: "switch",
        value: false,
        order: 6
      },
      yellowLamp: {
        title: "Желтая лампа",
        type: "switch",
        value: false,
        order: 8
      },
       cleaning: {
        title: "Режим уборки",
        type: "switch",
        value: false,
        order: 5
      },
      sensorDoor: {
        title: "Дверь заперта",
        type: "switch",
        value: false,
        readonly: true,
        order: 7
        },
      alarm: {
        title: "ОШИБКА",
        type: "alarm",
        value: false,
        order: 1,
      },
      textAlarm: {
        title: "служебное",
        type: "text",
        value: "описание ошибки",
        readonly: false,
        order: 11
      },
      textAlarm2: {
        title: "",
        type: "text",
        value: "описание ошибки",
        readonly: true,
        order: 2
      },
        errorReset: {
        title: "сброс ошибки",
        type: "pushbutton",
        value: 0,
        order: 3
      },
    }
});

// Привязка датчиков к устройству
defineRule( { 
  whenChanged: temperatureSensorDoor,
  then: function (newValue) {
  dev ["fridge_" +idDevice+ "/temperatureSensorDoor"] = parseFloat(newValue.toFixed(1));
  }
});
defineRule( { 
  whenChanged: temperatureSensorDeep,
  then: function (newValue) {
  dev ["fridge_" +idDevice+ "/temperatureSensorDeep"] = parseFloat(newValue.toFixed(1));
  }
});

// Красная лампа - привязка к устройству
defineRule( { 
  whenChanged: redLamp,
  then: function (newValue) {
    dev ["fridge_"+idDevice+"/redLamp"] = newValue
    dev ["fridge_"+idDevice+"/alarm"] = newValue
  }
});
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/redLamp",
  then: function (newValue) {
    dev [redLamp] = newValue
  }
});

// Привязка аларм к красной лампе
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/alarm",
  then: function (newValue) {
  dev [redLamp] = newValue
  }
});


// Зеленая лампа - привязка к устройству
defineRule( { 
  whenChanged: greenLamp,
  then: function (newValue) {
  dev ["fridge_"+idDevice+"/greenLamp"] = newValue
  }
});
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/greenLamp",
  then: function (newValue) {
  dev [greenLamp] = newValue
  }
});

// Желтая  лампа - привязка к устройству
defineRule( { 
  whenChanged: yellowLamp,
  then: function (newValue) {
  dev ["fridge_"+idDevice+"/yellowLamp"] = newValue
  }
});
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/yellowLamp",
  then: function (newValue) {
  dev [yellowLamp] = newValue
  }
});

// геркон (датчик на закрытие двери)
defineRule( { 
  whenChanged: sensorDoor,
  then: function (newValue) {
  dev ["fridge_" + idDevice + "/sensorDoor"] = !newValue;
  dev [yellowLamp] = !newValue
  }
});

//  Включение режима уборки
defineRule( { 
  whenChanged: cleaning,
  then: function () {
  dev ["fridge_"+idDevice+"/cleaning"] = true
  }
});

// синхронизация режима уборки и лампы
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/cleaning",
  then: function (newValue) {
  dev ["fridge_"+idDevice+"/greenLamp"] = newValue
  }
});
defineRule( { 
  whenChanged: "fridge_"+idDevice+"/greenLamp",
  then: function (newValue) {
  dev ["fridge_"+idDevice+"/cleaning"] = newValue
  }
});


// сообщения об ошибках
defineRule({
whenChanged: "fridge_" +idDevice+ "/textAlarm",
then: function (newValue, devName, cellName) {
dev ["fridge_" +idDevice+ "/textAlarm2"] = newValue;
}
});

// нажатие кнопки с панели на сброс ошибки
defineRule({
whenChanged: "fridge_" +idDevice+ "/errorReset",
then: function (newValue) {
dev ["fridge_" +idDevice+ "/alarm"] = false;
}
});

// ------------------------------------------------------- 
//Синхронизация ошибок с виртуальными устройствами
defineRule({
  when: function() {
    return (dev [temperatureSensorDoor +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/temperatureSensorDoor#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [temperatureSensorDeep +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/temperatureSensorDeep#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [redLamp +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/redLamp#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [greenLamp +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/greenLamp#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [yellowLamp +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/yellowLamp#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [sensorDoor +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/sensorDoor#error"] = "r";
  }
});

defineRule({
  when: function() {
    return (dev [cleaning +"#error"]);
  },
  then: function () {
    dev["fridge_" +idDevice+ "/cleaning#error"] = "r";
  }
});

вот список с ошибками виртуального устройства

Ошибки выходят и они вроде прекращаются вот лог с подписки на реальное устройство

Вот ссылка на mqtt топики что нет ошибок у реального устройства

получается у меня виртуальное устройство саму ошибку пишет а вот лог /meta/error (null) не убирает ошибку у виртуального устройства. А реальное устройство без ошибки

/devices/wb-mai6_66/controls/IN 4 P Temperature/meta/error r
/devices/wb-mai6_66/controls/IN 4 N State/meta/error r
/devices/wb-mai6_66/controls/IN 4 P Temperature/meta/error (null)
/devices/wb-mai6_66/controls/IN 4 N State/meta/error (null)

Подскажите как правильно сделать код синхронизации по ошибкам виртуального и реального устройства.

Поменял код на такой

defineRule({
  when: function() {
    if (dev [sensorDoor +"#error"] == "r") {
         return (dev [sensorDoor +"#error"]);
    }
  },
  then: function () {
    dev["fridge_" +idDevice+ "/sensorDoor#error"] = "r";
  }
});

defineRule({
  when: function() {
    if (dev [cleaning +"#error"] == "r") {
      return (dev [cleaning +"#error"]);
    }
  },
  then: function () {
    dev["fridge_" +idDevice+ "/cleaning#error"] = "r";
  }
});

/devices/wb-mai6_66/controls/IN 2 N State/meta/error r
/devices/wb-mai6_66/controls/IN 2 N State/meta/error (null)

не помогло после такой команды у меня опять виртуальное устройство в ошибке а реальное нет

Доброго дня.
А где у вас обработка случая когда значение топика с “#error” не равно “r”?

так вот ее нет

нужно так?

defineRule({
  when: function() {
    if (dev [sensorDoor +"#error"] == "r") {
         return (dev [sensorDoor +"#error"]);
    }
  },
  then: function () {
    dev["fridge_" +idDevice+ "/sensorDoor#error"] = "r";
  }
});


defineRule({
  when: function() {
    if (dev [sensorDoor +"#error"] != "r") {
         return (dev [sensorDoor +"#error"]);
    }
  },
  then: function () {
    dev["fridge_" +idDevice+ "/sensorDoor#error"] = "";
  }
});

если нет ошибки то как сделать нет ошибки на виртуальном устройстве? Просто “”?

так не сработало, все равно ошибка осталась

defineRule("onChange", {
  whenChanged: sensorDoor + "#error",
  then: function (newValue, devName, cellName) {
    log(newValue)
    if(newValue !== "") {
      dev["fridge_" + idDevice + "/sensorDoor#error"] = "r";
    } else {
      dev["fridge_" + idDevice + "/sensorDoor#error"] = "";
    }
  }
});

Это всё есть в примерах в документации.

И рекомендую пользоваться функцией log().

1 Like

а где можно поподробнее прочитать про функцию log?