MQTT discovery: deprecated object_id, несовместимость с Home Assistant 2026.4

Добрый день.

Использую Wiren Board с Home Assistant через MQTT discovery. После обновления Home Assistant появились предупреждения о том, что используется устаревшее поле `object_id` в discovery-конфигурации. Сейчас Wiren Board публикует конфигурацию в таком виде:

{

  "unique_id": "wb-mr6cu_168_k3",

  "object_id": "wb-mr6cu_168_k3",

  ...

}


Однако согласно текущим требованиям Home Assistant необходимо использовать:

{

  "unique_id": "wb-mr6cu_168_k3",

  "default_entity_id": "switch.wb_mr6cu_168_k3",

  ...

}


Вопросы:

1. Планируется ли обновление MQTT discovery, чтобы заменить `object_id` на `default_entity_id`?

2. Рассматривается ли вариант добавить `default_entity_id`, сохранив `object_id` для обратной совместимости?

3. Есть ли уже версия или ветка с этим изменением?

Буду благодарен за комментарий, так как это влияет на совместимость с будущими версиями Home Assistant.

С уважением,

Артем

P.S.

Информация о контроллере:

Batch No: 7.4.2A/2COM 1D/G-2GC

HW Revision: 7.4.2

DTS Version: 742

Release: wb-2602 (stable)

SN: A2RC46TV

Manufacturing Date: 2023-10-12 13:28:32

Uptime: 7d 1h 15m

Temperature Grade: commercial

PP.S.

Пример предупреждений Home Assistant:

  • The configuration for entity switch.wb_mr6cu_168_k3 uses the deprecated option `object_id` to set the default entity id. Replace the `“object_id”: “wb mr6cu_168_k3”` option with `“default_entity_id”: “switch.wb-mr6cu_168_k3”` in your published discovery configuration to fix this issue, or contact the maintainer of the integration that published this config to fix this. This will stop working in Home Assistant Core 2026.4

Добрый день.
А как (чем) вы формируете MQTT discovery топики? Официальный способ интеграции - это явное описание без discovery.

Добрый день,

Используется we-engine. Понял что дальше делать. Спасибо большое. Обращение можно закрывать.

С уважением,

Артем.

Ну, я предпочитаю, для discovery, просто скрипты.
Для примера:

log.info("Light2HA: запуск");

var HA_BASE = "homeassistant";

/**
 * Регистрирует источник света в Home Assistant через MQTT Discovery.
 *
 * Маршруты синхронизации:
 *   HA → Контроллер:
 *     HA публикует "1"/"0" в command_topic (/devices/.../controls/.../on).
 *     WirenBoard обрабатывает это нативно и обновляет состояние устройства.
 *     Правило ha2wb_* перехватывает смену состояния и позволяет добавить логику.
 *
 *   Контроллер → HA:
 *     Правило wb2ha_* следит за топиком WB и публикует состояние в state_topic.
 *     HA читает state_topic и отображает актуальное состояние.
 *
 * @param {string} lightName  - Отображаемое имя в Home Assistant
 * @param {string} wbTopic    - Топик WB в формате "устройство/контрол"
 *                              Например: "wb-gpio/EXT1_R3A"
 * @param {string} uniqueId   - Уникальный ID (только латиница, цифры, _)
 * @param {string} [suggestedArea] - Рекомендуемая зона/помещение в HA (опционально)
 */
function registerLight(lightName, wbTopic, uniqueId, suggestedArea) {
  var parts   = wbTopic.split("/");
  var device  = parts[0];
  var control = parts[1];

  // MQTT-пути WirenBoard
  var wbStatePath   = "/devices/" + device + "/controls/" + control;
  var wbCommandPath = wbStatePath + "/on";
  var wbErrorCell   = wbTopic + "#error";

  // Топики Home Assistant
  var haAvailTopic  = HA_BASE + "/light/" + uniqueId + "/availability";
  var haConfigTopic = HA_BASE + "/light/" + uniqueId + "/config";

  // --- 1. MQTT Discovery ---
  // Используем нативные пути WB: HA читает и пишет напрямую в MQTT-брокер контроллера.
  var config = {
    name:               lightName,
    command_topic:      wbCommandPath,  // HA пишет "1" или "0" сюда
    state_topic:        wbStatePath,    // HA читает актуальное состояние отсюда
    payload_on:         "1",
    payload_off:        "0",
    state_on:           "1",
    state_off:          "0",
    availability_topic: haAvailTopic,
    unique_id:          uniqueId,
    device: {
      identifiers:  [uniqueId],
      name:         lightName,
      manufacturer: "WirenBoard",
      model:        "MQTT Light"
    }
  };

  // suggested_area добавляем только если параметр задан и не пустой
  if (typeof suggestedArea === "string" && suggestedArea.trim() !== "") {
    config.device.suggested_area = suggestedArea.trim();
  }

  // Публикует availability по содержимому meta/error:
  // пусто -> online, непусто -> offline
  function publishAvailability(errorValue) {
    var hasError = (errorValue !== undefined &&
                    errorValue !== null &&
                    String(errorValue).trim() !== "");
    publish(haAvailTopic, hasError ? "offline" : "online", 1, true);
  }

  // retain=true гарантирует, что HA получит конфиг и доступность при переподключении
  publish(haConfigTopic, JSON.stringify(config), 1, true);
  publishAvailability(dev[wbErrorCell]);

  log.info("Light2HA: зарегистрирован [" + lightName + "]" +
           " | WB: " + wbTopic +
           " | HA id: " + uniqueId);

  // --- 2. Контроллер → HA: availability по meta/error ---
  defineRule("wb2ha_avail_" + uniqueId, {
    whenChanged: wbErrorCell,
    then: function (newError) {
      publishAvailability(newError);
      if (newError !== undefined && newError !== null && String(newError).trim() !== "") {
        log.warning("Light2HA: [availability] " + lightName + " -> offline | error: " + newError);
      } else {
        log.info("Light2HA: [availability] " + lightName + " -> online");
      }
    }
  });

  // --- 3. Контроллер → HA: при изменении состояния на WB ---
  // Срабатывает при любом изменении: физический выключатель, автоматизация WB,
  // а также как результат команды от HA (после обработки WB).
  defineRule("wb2ha_light_" + uniqueId, {
    whenChanged: wbTopic,
    then: function (newValue, devName, cellName) {
      var state = newValue ? "1" : "0";
      log.debug("Light2HA [wb→ha] " + lightName + " = " + state);
      // Публикуем явно — на случай, если HA потерял retain-сообщение
      publish(wbStatePath, state, 0, true);
    }
  });

  // --- 4. HA → Контроллер: при получении команды от HA ---
  // HA пишет в wbCommandPath (/on), WB обрабатывает нативно.
  // Правило добавляем для кастомной логики (логирование, сцены и т.п.).
  defineRule("ha2wb_light_" + uniqueId, {
    whenChanged: wbTopic,
    then: function (newValue, devName, cellName) {
      log.debug("Light2HA [ha→wb] " + lightName +
                " | устройство: " + devName +
                " | канал: " + cellName +
                " | значение: " + newValue);
      // Место для дополнительной логики: сцены, уведомления, зависимые устройства
    }
  });

  // Публикуем текущее состояние сразу при запуске скрипта
  publish(wbStatePath, dev[wbTopic] ? "1" : "0", 0, true);
}


// ============================================================
// Регистрация источников света
// Формат: registerLight("Название в HA", "устройство/канал", "уникальный_id", "помещение")
// "устройство/канал" — как в топике /devices/{устройство}/controls/{канал}
// ============================================================

// registerLight("Свет в коридоре", "wb-gpio/EXT1_R3A", "light_corridor");
// registerLight("Свет на кухне",   "wb-gpio/EXT1_R3B", "light_kitchen");
// registerLight("Подсветка",       "wb-gpio/EXT2_R1A", "light_backlight");
registerLight("свет",       "2fl_light_0/K5", "WorkChamber", "Кабинет");
registerLight("свет",       "2fl_light_0/K6", "Bedroom_light", "Спальня");
registerLight("свет",       "2fl_light_0/K6", "Storage_light", "Кладовка");

И могу в них добавлять/модифицировать публикуемое как угодно.