Парсинг спецификации устройств Xiaomi для локализации в Home Assistant

Парсинг спецификации устройств Xiaomi для локализации в Home Assistant — статья Василия Киреева
С помощью вайб-кодинга в VSCode я сделал скрипт, который получает основу файла локализации для перевода функций устройств Xiaomi для интеграции с Home Assistant

Страница проекта на GitHub: https://github.com/vasiliykireev/multi_lang-for-miot-home-assistant-integration

При использовании официальной интеграции устройств Xiaomi в Home Assistant есть проблемы с локализацией. Значения списка не переводятся на русский язык — особенно, если устройства только для китайского региона.

Информация из документации Xiaomi

В документации по интеграции есть поддержка нескольких языков: https://github.com/XiaoMi/ha_xiaomi_home/?tab=readme-ov-file#multiple-language-support

При отображении имени сущности Home Assistant Xiaomi Home загружает многоязычный файл, настроенный поставщиком устройства из облака MIoT, который содержит переводы для экземпляров устройства MIoT-Spec-V2. multi_lang.jsonЭто локально поддерживаемый многоязычный словарь, который имеет более высокий приоритет, чем многоязычный файл, полученный из облака, и может использоваться для дополнения или изменения многоязычного перевода устройств.

Формат multi_lang.json следующий.

{
    "<MIoT-Spec-V2 device instance>": {
        "<language code>": {
            "<instance code>": <translation: str>
        }
    }
}

Ключом multi_lang.json словаря является urn без поля «версия» экземпляра устройства MIoT-Spec-V2.

Код языка — zh-Hans, zh-Hant, en, es, ru, fr, de или ja, что соответствует 8 выбираемым языкам, упомянутым выше.

Код экземпляра — это код экземпляра MIoT-Spec-V2, который имеет следующий формат:

service:<siid>                  # service
service:<siid>:property:<piid>  # property
service:<siid>:property:<piid>:valuelist:<index> # The index of a value in the value-list of a property
service:<siid>:event:<eiid>     # event
service:<siid>:action:<aiid>    # action

siid, piid, eiid, aiid и value — все это десятичные трехзначные целые числа. Пример:

{
    "urn:miot-spec-v2:device:health-pot:0000A051:chunmi-a1": {
        "zh-Hant": {
            "service:002": "養生壺",
            "service:002:property:001": "工作狀態",
            "service:002:property:001:valuelist:000": "待機中",
            "service:002:action:002": "停止烹飪",
            "service:005:event:001": "烹飪完成"
        }
    }
}

Где взять URN и как запросить информацию об устройстве Xiaomi

URN устройств Xiaomi можно найти на странице: http://miot-spec.org/miot-spec-v2/instances?status=all

Через этот сайт также можно получить техническую информацию об устройстве.

Вайб-кодинг

Основная задача — получить основу multi_lang.json с помощью вайб-кодинга

Я написал задание для скрипта на Python в файле requirements.txt.

C помощью Visual Studio Code и CoPilot был создан скрипт properties.py, который обрабатывает URN устройства Xiaomi и сохраняет основу lang-файла.

Также CoPilot составил основу файла с описанием проекта README.md и итоговый файл всех реализованных требований implementation.txt.

Реализацией очень доволен. Вайб-кодинг решил мою прикладную задачу и составил документацию, чтобы это решение могли использовать другие люди.

Результаты

Основа для добавлении локализации для устройств Xiaomi в multi_lang.json — готова. Дальше можно перевести все функции устройства на русский язык с помощью нейросетей или вручную.

Вот промт, который я использовал для перевода:

Действуй, как эксперт в бытовой технике и электронике, а также в умном доме. Мне нужно составить lang-файл на русском языке для

НАЗВАНИЕ ПРИБОРА

Xiaomi в умном доме. Из спецификации я составил основу lang-файла.

Нужно перевести на русский язык все нетехнические значения. Определить их можно следующим образом: они начинаются с заглавной буквы и могут содержать пробелы.

Технические значения, наоборот, переводить не нужно. Технические значения начинаются со строчной буквы и содержат дефис (-).

Хорошо подумай, прежде чем перевести то или иное значение. Приведи аргументы, почему ты остановился на том или ином переводе.