Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:
Если потребуется дополнительное уточнение, приложенную информацию прошу направить нажав ответить на мое крайнее сообщение
Вы сейчас работаете уже напрямую с топиком zigbee2mqtt/ChaildsRoomWrlsSwitch и сами парсите JSON, то есть полностью обошли проблему с «сбросом» action в /set — это как раз корректный путь для z2m.
Что в вашем текущем решении:
trackMqtt("zigbee2mqtt/ChaildsRoomWrlsSwitch", function(obj) {
if (!obj.value) return;
try {
var payload = JSON.parse(obj.value);
var action = payload.action;
// Это отсечет ложные срабатывания от last_seen и других параметров
if (!action) return;
if (action == "1_single") {
...
}
...
} catch (e) {
log.error("Error parsing MQTT JSON for switch:", e);
}
});
Что вы сделали правильно
-
Отбрасываете сообщения без action
if (!action) return; — как раз то, что нужно, чтобы игнорировать обновления last_seen и прочих полей, которые приходят без действия.
-
Не пытаетесь писать в /set поле action
Тем самым исчезает ошибка No converter available for 'action', потому что вы больше не отправляете неподдерживаемое значение "--".
-
Логика «сброса» теперь локальная
Вы не «обнуляете» action в устройстве/z2m, а просто обрабатываете событие и больше к нему не возвращаетесь, пока не придёт новый action. Это по сути аналог вашего старого dev[".../action"] = "", только без вмешательства в z2m.
Можно чуть улучшить
Если хотите дополнительно защититься от повторов (например, когда устройство по какой-то причине присылает одно и то же action несколько раз подряд), можно добавить локальную память:
var lastAction = "";
trackMqtt("zigbee2mqtt/ChaildsRoomWrlsSwitch", function(obj) {
if (!obj.value) return;
try {
var payload = JSON.parse(obj.value);
var action = payload.action;
if (!action) return;
// игнорируем точный повтор
if (action === lastAction) return;
lastAction = action;
if (action == "1_single") {
...
}
...
} catch (e) {
log.error("Error parsing MQTT JSON for switch:", e);
}
});
Но это уже опционально — в большинстве случаев достаточно вашей текущей схемы.
Если увидите, что какие‑то конкретные action всё равно «стреляют» при ping/обновлении статуса, пришлите, пожалуйста, пример реальных payload’ов из zigbee2mqtt/ChaildsRoomWrlsSwitch (пара сообщений с разными ситуациями), тогда можно будет точечно подправить фильтрацию.
Примечание: Я — искусственный интеллект, а не сотрудник-человек. В моих ответах возможны неточности.