Часто задаваемые вопросы о разработке адаптеров

Краткие ответы на вопросы, заданные на форуме и в Discord-канале.#adapter Они встречаются неоднократно. Подробное описание можно найти на странице по ссылке.

Публиковать

В каких файлах находится номер версии?

Вpackage.json иio-package.json включая уведомление об изменении вio-package.json (common.news ) и вREADME.md Никому не нужно ухаживать за ним вручную:npm run release patch Выполните все задачи одновременно, присвойте метку и загрузите репозиторий в GitHub. См. раздел «Публикация» .

Цифры соответствуют семантическому версионированию :patch для исправления ошибок,minor для новых функций,major изменения, затрагивающие существующие установки.

Я выпустил его. Когда пользователи увидят новую версию?

Не сразу. Администратор перечитывает репозиторий не при каждом запросе, а через определенные промежутки времени. Если вы не хотите ждать, нажмите значок обновления в разделе «Адаптеры» в административном интерфейсе или выполните команду в консоли.iobroker update на.

Кроме того, новая версия впервые появляется в репозитории.latest Вstable Миграция будет выполнена только после пробного периода и без каких-либо сообщений об ошибках.

Как вообще новый адаптер попадает в репозиторий?

Путем отправки запроса на слияние в репозиторий ioBroker.repositories . Требования и порядок описаны в разделе «Публикация» .

Разработка и тестирование

Как проверить работу адаптера, не разбирая систему?

Используя dev-сервер , он создает собственную небольшую установку в папке проекта, запускает адаптер оттуда и перезагружает его при каждом изменении.

Как обнаружить ошибку выполнения?

dev-server debug в процессе разработки,iobroker debug <adapter>.0 в работающей системе. Оба описания касаются отладки .

Как проверить компактный режим?

В компактном режиме адаптер запускается не как отдельный процесс, а внутри процесса js-контроллера. Для этого файл должен содержать два метода запуска:

if (require.main !== module) {
    module.exports = options => new MeinAdapter(options);
} else {
    new MeinAdapter();
}

Эта функция включается в конфигурации экземпляра в режиме «Компактный режим» . Важно, чтобы адаптер находился в этом режиме.unload — Обработчик действительно очищает всё: таймеры, соединения, наблюдатели. В противном случае что-то останется в общем процессе.

Как я могу получать уведомления о сбоях?

Плагин @iobroker/plugin-sentry предоставляет информацию о том, какие данные передаются и как пользователи могут отключить их в разделе «Отчеты о сбоях» .

конфигурация

Как проверить ввод данных пользователем в коде адаптера?

Через окно сообщения . Страница конфигурации отправляет значения.sendTo Адаптер отправляет запрос экземпляру, проверяет его и возвращает результат. Конфигурация в формате JSON включает в себя готовые элементы, которые делают именно это.

Для того чтобы экземпляр мог принимать сообщения, он должен"messagebox": true в блокеcommon тотio-package.json стоять.

Нужно ли мне сделать еще один тест?index_m.html строить?

Нет. Страницы конфигурации теперь описываются как JSON-конфигурации . Старые HTML-страницы по-прежнему будут работать, но они больше не предназначены для использования с новым адаптером.

Файлы и данные

Я записываю файл и получаю предупреждение в журнале.

Суть сообщения такова:

writeFile will not write this file (picture.jpg) in future versions:
<adapter> is not an object of type "meta"

Для файлов требуется объект соответствующего типа.meta в качестве места для хранения. Самый простой способ — разместить его надinstanceObjects к:

"instanceObjects": [
    {
        "_id": "",
        "type": "meta",
        "common": {
            "name": "Dateien von <Adapter>",
            "type": "meta.user"
        },
        "native": {}
    }
]

Загрузка и сохранение выглядят следующим образом:

const antwort = await axios.get(url, { responseType: 'arraybuffer' });
await this.writeFileAsync(this.namespace, 'picture.jpg', antwort.data);

Почемуcommon.type иcommon.role А какое отношение это имеет к резервному копированию данных, объясняется в разделе «Сохранение файлов» .

Почему мое состояние не регистрируется?

Потому что соответствующий объект отсутствует.setState Если объект отсутствует, выдается предупреждение. Объекты обнаруживаются при запуске.setObjectNotExists создано, см. справочник по адаптеру .

Здесь чего-то не хватает.

Эта подборка активно поддерживается благодаря вкладу других пользователей. Если у вас есть вопрос, которого здесь нет, и вы нашли на него ответ, вы можете добавить его, используя ссылку «Редактировать» в правом верхнем углу. Ссылка на адаптер, где можно найти решение, будет полезнее для других, чем длинное объяснение.