ntfy клиент (Неофициальный)

Неофициальный клиентский адаптер ntfy.sh для ioBroker

Текущий релиз
0.1.4
Разработчик
lubepi
Лицензия
MIT

Неофициальный клиентский адаптер ntfy.sh для ioBroker

Отправляйте и получайте уведомления через ntfy.sh напрямую из ioBroker. Этот адаптер является проектом сообщества и не связан с ntfy LLC.

Функции

  • Публикация уведомлений с полной поддержкой параметров ntfy.
  • Подписывайтесь на темы и получайте сообщения в режиме реального времени через SSE (Server-Sent Events).
  • Статистика учетной записи – просмотр статистики использования (сообщения, электронные письма, звонки, вложения, бронирования)
  • Проверка версии сервера – обнаружение доступных обновлений для самостоятельно размещенных экземпляров ntfy.
  • Состояние подключения – отслеживание подключения адаптера к серверу NTFI с помощью динамических проверок работоспособности.
  • Поддержка базовой аутентификации и токенов носителя.
  • Пользовательские URL-адреса сервера (или стандартный экземпляр ntfy.sh)
  • ИнтегрированныйsendTo Блоки Blockly для графических скриптов (отправка и управление)
  • Отклонить (очистить) и удалить уведомления по идентификатору последовательности.
  • Загрузка файлов и вложений осуществляется методом PUT.

Поддерживаемые параметры уведомлений

ПараметрОписание
messageТекст уведомления (по умолчанию — "сработало", если поле пустое)
topicЦелевая тема (в случае отказа используется настроенная тема по умолчанию)
titleЗаголовок уведомления
priorityУровень приоритета: 1 (мин.), 2 (низкий), 3 (по умолчанию), 4 (высокий), 5 (макс.)
tagsТеги или короткие коды эмодзи (строка или массив, разделенные запятыми)
clickURL-адрес открывается при нажатии на уведомление.
attachURL файла для прикрепления
attach_fileЛокальный путь к файлу для загрузки в качестве вложения (используется метод PUT)
filenameПользовательское имя файла для вложения
actionsКнопки действий (строка или объект JSON)
markdownВключить форматирование Markdown (true /false )
delayЗадержка доставки (например, "30 с", "5 м", "2 ч")
emailПерешлите уведомление на этот адрес электронной почты
callНомер телефона для звонка с использованием TTS (требуется ntfy Pro)
iconURL-адрес значка отображается рядом с уведомлением.
sequence_idЗаменить/обновить существующее уведомление с тем же идентификатором последовательности (Sequence-ID).
disable_cacheУстановить наtrue /yes отключить кэширование на стороне сервера
disable_firebaseУстановить наtrue /yes чтобы отключить пересылку сообщений в Firebase Cloud Messaging (Android)
unified_pushУстановить на1 включить поддержку UnifiedPush
templateИспользоватьtrue /yes для встроенных шаблонов или с именем, например:github для предопределенных
dataОбъект данных JSON или строка, используемая в контексте шаблона.

Подписка на темы (получение сообщений)

Настройте темы в параметрах адаптера на вкладке «Темы» . Адаптер подписывается на эти темы через SSE и создает состояния для каждой темы.ntfy-client.0.topics.<topicName> :

СостояниеОписание
lastMessageТекст последнего полученного сообщения
lastTitleПоследнее полученное название
lastPriorityПоследний полученный приоритет
lastTagsПоследние полученные теги (разделенные запятыми)
lastClickURL последнего полученного клика
lastIconURL последнего полученного значка
lastActionsПоследние полученные действия (JSON)
lastAttachmentUrlURL последнего полученного вложения
lastAttachmentNameНазвание последнего полученного вложения
lastAttachmentTypeТип MIME последнего полученного вложения
lastAttachmentSizeРазмер последнего полученного вложения (байты)
lastAttachmentExpiresОтметка времени истечения срока действия последнего полученного вложения
lastTimestampОтметка времени последнего сообщения
lastExpiresОтметка времени истечения срока действия последнего сообщения
lastMessageIdПоследний идентификатор сообщения
lastSequenceIdПоследний идентификатор последовательности (для управления сообщениями)
lastTopicНазвание последней полученной темы
lastEventПоследний полученный тип события
lastJsonПолный JSON-код последнего полученного сообщения
subscribedАктивна ли подписка

Статистика аккаунта

При настройке аутентификации адаптер получает статистику учетной записи каждые 15 минут и сохраняет ее в соответствующем разделе.ntfy-client.0.stats :

  • Сообщения : опубликовано, осталось, лимит, срок действия
  • Количество отправленных писем , оставшееся количество, лимит
  • Количество совершенных телефонных звонков , оставшийся лимит, лимит
  • Зарезервированные темы : количество, остаток, лимит
  • Вложения : использованное/оставшееся/лимит хранилища, срок действия, лимит размера файла, лимит пропускной способности.
  • Учетная запись : уровень подписки

Проверка состояния соединения и работоспособности

Адаптер отслеживает соединение с сервером NTFI черезinfo.connection состояние:

СостояниеОписание
info.connectionСтатус подключения к серверу ntfy
info.serverVersionТекущая версия сервера ntfy
info.latestVersionПоследняя доступная версия (только для самостоятельного размещения)
info.updateAvailableДоступно ли обновление сервера?

Проверка состояния здоровья проводится в соответствии с/v1/health конечная точка с динамическими интервалами :

  • Каждые 6 часов, когда сервер исправен.
  • Каждые 5 минут, если последняя проверка не удалась (для более быстрого восстановления).

Кроме того, статус подключения автоматически устанавливается в состояние «подключено» , когда:

  • Уведомление успешно отправлено.
  • Подписка SSE успешно подключена.
  • Получено сообщение по теме, на которую оформлена подписка.

Примеры блочных структур

В категории «Отправить» используйте следующие блоки:

1. Уведомление ntfy-client (отправка)

Отправьте сообщение со всеми поддерживаемыми параметрами:

  1. Установить экземпляр .
  2. Установить сообщение .
  3. Укажите тему (или оставьте поле пустым, чтобы использовать тему по умолчанию).
  4. При желании можно добавить дополнительные параметры с помощью мутатора (значок шестеренки): заголовок, приоритет, теги, значок, URL-адрес клика, действия, вложения, задержка, электронная почта, звонок и т. д.
  5. Используйте идентификатор последовательности, если вы хотите позже обновить/перезаписать существующее уведомление.

2. Управление ntfy-клиентом (manage)

Очистить или удалить существующее уведомление:

  1. Установить экземпляр .
  2. Установите действие (пометить как прочитанное и закрыть, или удалить).
  3. Задайте тему .
  4. Укажите идентификатор последовательности сообщения, которым вы хотите управлять.

Примечание об идентификаторах: каждому уведомлению присваивается уникальный идентификатор.id (Идентификатор сообщения) предоставлен сервером.

  • Если вы предоставитеsequence_id При отправке необходимо использовать это.sequence_id для всех управленческих действий (отклонить, удалить).
  • Если вы не предоставитеsequence_id сгенерированный серверомid (Идентификатор сообщения) служит в качествеsequence_id для руководства.

Несколько сообщений, содержащих одно и то жеsequence_id сформировать последовательность — отображается только последнее сообщение в последовательности.

Примеры на JavaScript

Отправить уведомление

sendTo("ntfy-client.0", "send", {
  message: "Motion detected in the backyard!",
  title: "Security Alert",
  topic: "home_alerts_xyz",
  priority: "high",
  tags: "warning,motion",
  click: "https://example.com",
  markdown: true,
});

Отправить с пересылкой электронной почты и иконкой

sendTo("ntfy-client.0", "send", {
  message: "Temperature above threshold!",
  topic: "home_alerts_xyz",
  email: "admin@example.com",
  icon: "https://example.com/icon.png",
  priority: "4",
});

Отправить с прикрепленным файлом

sendTo("ntfy-client.0", "send", {
  message: "Security camera snapshot",
  topic: "home_alerts_xyz",
  attach_file: "/tmp/snapshot.jpg",
  filename: "camera_snapshot.jpg",
});

Отправить с кнопками действий

sendTo("ntfy-client.0", "send", {
  message: "Doorbell rang!",
  topic: "home_alerts_xyz",
  actions: [
    { action: "view", label: "Open Camera", url: "https://camera.example.com" },
    {
      action: "http",
      label: "Turn on Light",
      url: "https://ha.example.com/api/light/on",
      method: "POST",
    },
  ],
});

Отправить с использованием шаблона (встроенный / ручной)

Используйтеmessage Используйте поле в качестве шаблонной строки и укажите контекст JSON в...data поле:

sendTo("ntfy-client.0", "send", {
  topic: "home_alerts_xyz",
  template: true,
  message: "Current temperature is {{.temp}}°C from {{.sensor}}",
  data: { temp: 42, sensor: "living_room" },
});

Отправка с использованием шаблона (заранее определенного / например, GitHub)

Для предопределенных шаблонов, таких какgithub укажите исходные JSON-данные веб-перехватчика вdata Поле. Структура данных должна соответствовать той, которую отправляет исходный сервис ( см. исходный код шаблона ):

sendTo("ntfy-client.0", "send", {
  topic: "github_webhooks",
  template: "github",
  data: {
    action: "opened",
    issue: {
      number: 42,
      title: "Found a bug",
      html_url: "https://github.com/my/repo/issues/42",
      user: { html_url: "https://github.com/octocat" },
    },
    repository: {
      full_name: "my/repo",
      html_url: "https://github.com/my/repo",
    },
  },
});

Примечание: Предварительно определенные шаблоны ожидают точную структуру данных из исходного сервиса. Отсутствующие или неправильно названные поля будут отображаться как<no value> Для полного контроля над форматированием используйте встроенный шаблон.template: true ) вместо.

Отклонить уведомление

sendTo("ntfy-client.0", "dismiss", {
  topic: "home_alerts_xyz",
  sequence_id: "abc123",
});

Удалить уведомление

sendTo("ntfy-client.0", "delete", {
  topic: "home_alerts_xyz",
  sequence_id: "abc123",
});

Аутентификация

Ntfy поддерживает несколько вариантов:

  • None : Подходит для стандартных серверов ntfy.sh (темы публичные!).
  • Базовая аутентификация : настройте локальный сервер с именем пользователя и паролем.
  • Токен доступа : Создайте токены и используйте проверку токенов Bearer для вашей темы.

Команды

КомандованиеОписание
send /publishОтправить уведомление
dismiss /clearОтклонить (пометить как прочитанное) уведомление по sequence_id
deleteУдалить уведомление по sequence_id

Юридическое уведомление

Этот адаптер НЕ является официальным продуктом ntfy LLC. Название ntfy , логотип и фирменная символика являются товарными знаками ntfy LLC. Этот адаптер — проект сообщества, предназначенный для интеграции с ioBroker.

Changelog

WORK IN PROGRESS

  • (ioBroker-Bot) Adapter requires admin >= 7.8.23 now.

0.1.4 (2026-06-07)

  • (lubepi) FIXED: Adapter now creates missing parent folder objects (stats, topics) so they appear correctly in the object tree
  • (lubepi) FIXED: Corrected state roles for attachment-related states (storage, file size, bandwidth)
  • (lubepi) ENHANCED: Hardened error handling throughout the adapter and extracted reusable helper methods
  • (lubepi) ENHANCED: Cleaned up orphaned translation keys from all language files

0.1.3 (2026-04-12)

  • (lubepi) Refactor: Move internal config signature to local file storage (remove useless object from tree)

0.1.2 (2026-04-12)

  • (lubepi) Update axios due to critical security fixes (SSRF, Header Injection)

0.1.1 (2026-04-12)

  • (lubepi) Reset runtime states on server or account configuration changes
  • (lubepi) Mask credentials in logs and only log the configured authentication type

0.1.0 (2026-04-12)

  • (lubepi) Initial release with full ntfy.sh support
  • Subscribe to topics via SSE (receive messages in real-time)
  • Publish notifications with all ntfy parameters (title, priority, tags, click, attach, actions, markdown, delay, email, call, icon, sequence_id, disable_cache, disable_firebase, unified_push, template)
  • File upload attachments via PUT
  • Dismiss and delete notifications by sequence_id
  • Account statistics (messages, emails, calls, attachments, reservations)
  • Server version check for self-hosted instances
  • Dynamic connection status monitoring with health checks
  • Blockly blocks for sending and managing notifications
  • Full i18n support (en, de, ru, pt, nl, fr, it, es, pl, uk, zh-cn)

License

MIT License

Copyright (c) 2026 lubepi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.