Ошибка service must be a mapping not a NoneType появляется в Home Assistant при проверке конфигурации или вызове сервиса и означает, что в YAML-файле вместо ожидаемого блока с параметрами парсер получил пустое значение — None. Чаще всего виновником оказывается строка вида service: без указания самого сервиса, лишний отступ или двоеточие, за которым ничего не следует.
Проблема относится к синтаксису YAML, а не к сбою системы: автоматизация просто не загружается, и в журнале появляется соответствующая запись. Хорошая новость — исправляется она правкой текстового файла конфигурации, без переустановки и сброса настроек. Ниже разберём, откуда берётся NoneType, как локализовать ошибочную строку и как оформить вызов сервиса правильно.
Что означает эта ошибка
В терминах Python NoneType — это тип значения None, то есть «ничего». Когда Home Assistant читает YAML-файл, пустой ключ превращается именно в него. Система ожидает, что после service: будет строка с именем сервиса (например, light.turn_on) или вложенный словарь параметров, а получает пустоту — и останавливает загрузку автоматизации или скрипта.
Аналогичная ситуация возникает и в других инструментах на базе YAML — например, в Docker Compose, где ключ services: без вложенных определений даёт похожую ошибку валидации. Логика везде одна: парсер ждёт mapping (словарь «ключ: значение»), а находит None.
Важно понимать: ошибка не говорит, что сервис не существует. Она говорит, что структура файла нарушена до того, как система вообще добралась до проверки имени сервиса.
Типичные причины появления
Чтобы не перебирать файл вслепую, полезно знать, какие паттерны чаще всего приводят к NoneType. Ниже — основные сценарии, которые стоит проверить в первую очередь.
- 🔍 Пустой ключ — строка
service:есть, а имя сервиса после двоеточия не написано. - 📏 Неверные отступы — вложенный блок сдвинут не на тот уровень, и парсер «теряет» значение.
- ➡️ Табуляция вместо пробелов — YAML категорически не принимает табы, редактор может подставить их незаметно.
- 📋 Ошибка при копировании — при переносе примера с форума потерялась часть строк или добавились невидимые символы.
- 🔗 Неудачный !include — подключаемый файл пуст или содержит только комментарии.
Отдельный источник путаницы — использование - service: в списке действий. Дефис создаёт элемент списка, и если дальше структура оформлена неверно, весь элемент превращается в None.
Как найти проблемное место
Начните с журнала: в Home Assistant откройте Настройки → Система → Журналы и найдите полный текст ошибки. Обычно там указан файл и порядковый номер строки, где парсер споткнулся. Если номер строки не показан, ориентируйтесь на имя автоматизации, которая перестала загружаться.
Дальше — проверка конфигурации. Перед каждой перезагрузкой используйте встроенный валидатор: Настройки → Система → Перезапустить → Проверить конфигурацию. Он укажет конкретный файл и часто — фрагмент, который не удалось разобрать.
Если файл большой, временно закомментируйте подозрительные блоки символом # и проверяйте конфигурацию по частям. Метод половинного деления — отключить половину блоков, затем половину оставшихся — позволяет локализовать ошибку за несколько итераций даже в объёмном файле.
Пошаговое исправление
Разберём корректное оформление вызова сервиса. Вот типичный «сломанный» фрагмент автоматизации:
action:
- service:
target:
entity_id: light.kitchen
Здесь после service: стоит перевод строки, а следующий блок имеет тот же или меньший отступ — парсер считает значение пустым. Правильный вариант:
action:
- service: light.turn_on
target:
entity_id: light.kitchen
☑️ Проверка и исправление ошибки
После правки сохраните файл, снова запустите проверку конфигурации и только после успешного результата перезагружайте Home Assistant. Если ошибка ушла, но автоматизация не срабатывает — проблема уже в логике триггеров, а не в синтаксисе.
⚠️ Внимание: не редактируйте файлы конфигурации во время перезапуска Home Assistant — частично записанный файл может привести к новым ошибкам загрузки. Всегда делайте резервную копию файла перед правками.
Ошибка в Docker Compose
В Docker Compose похожее сообщение возникает, когда секция services: объявлена, но внутри неё нет ни одного описания контейнера, либо отступы сбиты так, что содержимое «выпадает» из секции. Парсер видит пустое значение и сообщает, что services должен быть словарём, а не None.
Проверьте, что каждый сервис начинается с имени на одном уровне отступов внутри services:, а его параметры (image, ports, volumes) вложены ещё на один уровень глубже. Валидировать файл можно командой:
docker compose config
Команда выведет итоговую конфигурацию после разбора — если YAML корректен, вы увидите нормализованный текст; если нет, получите указание на проблемное место.
Почему YAML так чувствителен к отступам
YAML строит структуру данных исключительно по пробельным отступам — в нём нет скобок или явных маркеров конца блока. Сдвиг строки на один пробел меняет её место в иерархии: значение может «переехать» в другой ключ или вовсе остаться без родителя. Поэтому два визуально похожих файла могут разбираться совершенно по-разному.
Как не допустить ошибку в будущем
Несколько привычек заметно снижают шанс снова увидеть NoneType в журнале. Настройте редактор на замену табуляции пробелами и включите отображение невидимых символов — это сразу покажет проблемные места при вставке чужих примеров.
- ✅ Валидируйте перед перезапуском — проверка конфигурации занимает секунды и ловит синтаксис заранее.
- 🧩 Копируйте примеры целиком — включая все отступы, и сверяйте структуру с документацией.
- 💾 Храните резервные копии рабочих версий файлов, чтобы быстро откатиться после неудачной правки.
- 🧪 Меняйте по одному блоку — так проще понять, какая правка вызвала ошибку.
⚠️ Внимание: онлайн-валидаторы YAML проверяют только синтаксис, но не семантику Home Assistant. Файл может быть валидным YAML и при этом содержать несуществующий сервис — используйте оба уровня проверки.
Часто задаваемые вопросы
Ошибка указывает на строку, где всё выглядит правильно. Что делать?
Парсер сообщает строку, где он «понял», что структура сломана, — реальная причина часто находится на несколько строк выше. Проверьте предыдущий блок: незакрытый ключ или лишний дефис там смещают весь дальнейший разбор.
Может ли ошибка возникнуть из-за пустого файла, подключённого через !include?
Да. Если подключаемый файл пуст или содержит только комментарии, его содержимое разбирается как None. Либо заполните файл корректной структурой, либо удалите строку подключения.
После исправления ошибка осталась. Почему?
Возможные причины: файл не был сохранён, правка внесена не в тот файл (например, дубликат автоматизации в другом месте) или в конфигурации несколько однотипных ошибок — валидатор показывает их по одной. Повторите проверку конфигурации и посмотрите, изменился ли номер строки.
Чем NoneType отличается от ошибки «service not found»?
Service not found означает, что синтаксис корректен, но сервис с таким именем не зарегистрирован — например, интеграция не загружена. NoneType же возникает раньше, на этапе разбора YAML, когда значение ключа вообще отсутствует.
Нужно ли перезагружать Home Assistant после правки автоматизаций?
Не всегда: автоматизации и скрипты можно перезагрузить через Настройки → Система → Перезапустить — там доступны варианты быстрой перезагрузки отдельных компонентов. Полная перезагрузка требуется при изменении базовой конфигурации.