Одно реле и две кнопки zigbee

Есть контроллер wb6 с zigbee
не могу понять как написать правило для изменения состояния релюхи при каждом нажатии кнопки, при этом она присылает состояние single, double, triple и тд,
Хочу чтобы меняла состояние при одном нажатии любой из кнопок,
для этого подписываюсь на топик

function test01(inValue){
  log.info("Callback relay01 ", inValue)
}
trackMqtt("/devices/0x00158d00064455b6/controls/click", function(newValue) {
  test01(newValue.value);
  if (newValue == "single") {
    dev["aqara"]["enabled"] = !dev["aqara"]["enabled"];
    log.info("its worked"); 
  }
});

при каждом нажатии приходят сообщения в лог но ничего не меняется в виртуальном реле, подскажите что не так делаю ?
полный код

Спойлер
defineVirtualDevice("aqara", {
    title: "aqara",
    cells: {
	enabled: {
	    type: "switch",
	    value: false
	},
    }
});

function test01(inValue){
  log.info("Callback relay01 ", inValue)
}

trackMqtt("/devices/0x00158d00064455b6/controls/click", function(newValue) {
  test01(newValue.value);
  if (newValue == "single") {
    dev["aqara"]["enabled"] = !dev["aqara"]["enabled"];
    log.info("its worked"); 
  }
});

как только заработает будет понятно как вторую кнопку задействовать

Из моей практики лучше обрабатывать сырой JSON от zigbee2mqtt.
Вот так должно работать:

function test01(inValue){
  var cmd = JSON.parse(inValue);

  if (!cmd.hasOwnProperty("click")) {
      return;
  }

  if (cmd.click == "single") {
    dev["aqara"]["enabled"] = !dev["aqara"]["enabled"];
  }
}

trackMqtt("zigbee2mqtt/0x00158d00064455b6", function(newValue) {
  test01(newValue.value);
});

trackMqtt("zigbee2mqtt/0x00124b0021089806", function(newValue) {
  test01(newValue.value);
});
1 лайк

Добрый день.
Покажите пожалуйста топики:

mosquitto_sub -v -t /devices/0x00158d00064455b6/#

Подозреваю что

сравнение некорректно. Ибо newValue - объект и со строкой не сравнивается.
Поправьте

  if (newValue.value == "single") {

Но код мне не нравится, если устройство в devices - зачем trackMqtt?

Всё работает, чуть допилил и получилось вот так


defineVirtualDevice("aqara", {  // Виртуальное устройство чтобыуправлять из интерфейса при желании
    title: "aqara",
    cells: {
	enabled: {
	    type: "switch",
	    value: false
	},
    }
});

function test01(inValue){ // Парсим ответ топика
  var cmd = JSON.parse(inValue);
  

  if (!cmd.hasOwnProperty("click")) {
      return;
  }

  if (cmd.click == "single") {
    dev["aqara"]["enabled"] = !dev["aqara"]["enabled"]; //Меняем значение виртуального устройства при нажатии
    if (dev["aqara"]["enabled"] == true) { 
      publish("zigbee2mqtt/0x00158d0005c0e29b/set", JSON.stringify({"state_l1": "ON"}), 2, false); // отправляем команду zigbee relay aqara
    } else {
      publish("zigbee2mqtt/0x00158d0005c0e29b/set", JSON.stringify({"state_l1": "OFF"}), 2, false);
    }
  }
}

// подписываемся на топики
trackMqtt("zigbee2mqtt/0x00158d00064455b6", function(newValue) {
  test01(newValue.value);
});

trackMqtt("zigbee2mqtt/0x00158d0006442370", function(newValue) {
  test01(newValue.value);
});



Наверное стоит обозвать адреса впеременные и для читаемости и чтобы остальные могли через копипаст юзать

Тут дописал и исправил нерабочие кнопки в интерфейсе

Спойлер
var Relay1 = "zigbee2mqtt/0x00158d0005c0e29b/set";
var Relay2 = "zigbee2mqtt/0x00158d0005c1a9e4/set";
var TrackButton1 = "zigbee2mqtt/0x00158d00064455b6";
var TrackButton2 = "zigbee2mqtt/0x00158d0006442370";


defineVirtualDevice("aqara1", {  // Виртуальное устройство для управления из интерфейса при желании
    title: "Комната",
    cells: {
	enabled: {
	    type: "switch",
	    value: false
	},
    }
});

defineVirtualDevice("aqara2", {  // Виртуальное устройство для управления из интерфейса при желании
    title: "Кухня",
    cells: {
	enabled: {
	    type: "switch",
	    value: false
	},
    }
});

defineRule("aqara1-rule", { 
  whenChanged: "aqara1/enabled",
  then: function (newValue, devName, cellName) {
    if (dev["aqara1"]["enabled"] == true) { 
      publish(Relay1, JSON.stringify({"state_l1": "ON"}), 2, false); // отправляем zigbee команду aqara1 ON, если хотим поменять канал то вместо state_l1 ставим state_l2 
      log.info("Relay1 set ON");
    } else {
      publish(Relay1, JSON.stringify({"state_l1": "OFF"}), 2, false); // отправляем zigbee команду aqara1 OFF, если хотим поменять канал то вместо state_l1 ставим state_l2 
      log.info("Relay1 set OFF");
    }
  }
});
defineRule("aqara2-rule", { 
  whenChanged: "aqara2/enabled",
  then: function (newValue, devName, cellName) {
    log.info("aqara2");
     if (dev["aqara2"]["enabled"] == true) { 
      publish(Relay2, JSON.stringify({"state_l1": "ON"}), 2, false); // отправляем zigbee команду aqara2 ON, если хотим поменять канал то вместо state_l1 ставим state_l2 
       log.info("Relay2 set ON");
    } else {
      publish(Relay2, JSON.stringify({"state_l1": "OFF"}), 2, false);// отправляем zigbee команду aqara2 OFF, если хотим поменять канал то вместо state_l1 ставим state_l2 
      log.info("Relay2 set OFF");
    }
  }
});


function test01(inValue){ // Обьявляем функцию парсинга
  var cmd = JSON.parse(inValue);
  
  if (!cmd.hasOwnProperty("click")) {// Парсим ответ топика
      return;
  }
  if (cmd.click == "single") {
    dev["aqara1"]["enabled"] = !dev["aqara1"]["enabled"]; //Меняем значение виртуального устройства при нажатии
    
  }
  if (cmd.click == "double") {
    dev["aqara2"]["enabled"] = !dev["aqara2"]["enabled"]; //Меняем значение виртуального устройства при нажатии
  }
}


// подписываемся на топики
trackMqtt(TrackButton1, function(newValue) {
  test01(newValue.value);
});

trackMqtt(TrackButton2, function(newValue) {
  test01(newValue.value);
});

3 лайка

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.