Home Assistant — одна из самых гибких платформ для управления умным домом, но её мощь раскрывается только при правильной конфигурации. Один из ключевых элементов, который часто упускают новички (а иногда и опытные пользователи), — это device class. От него зависит, как система будет интерпретировать данные с датчиков, какие иконки отобразит в интерфейсе, и даже как будут работать автоматизации.
Представьте: вы подключили датчик температуры, но в интерфейсе он отображается как обычный сенсор без градусов, или ваш датчик движения срабатывает как освещённость. Это типичные проблемы, вызванные неправильным (или отсутствующим) указанием device class. В этой статье мы разберём, что это такое, какие классы существуют, как их назначать в configuration.yaml и YAML-конфигах устройств, а также раскроем нюансы, о которых не пишут в официальной документации.
Что такое Device Class и зачем он нужен
Device class — это метка, которая сообщает Home Assistant, к какому типу относится устройство или сенсор. Она определяет:
- 📊 Формат отображаемых данных (например, °C для температуры, % для влажности).
- 🎨 Иконку в интерфейсе (термометр, лампочка, дверь и т.д.).
- 🤖 Логику автоматизаций (например, триггеры для датчиков движения или открытия окон).
- 📱 Интеграцию с голосовыми помощниками (Google Assistant, Alexa).
Без правильного device class ваш датчик углекислого газа может отображаться как бессмысленное число, а датчик протечки воды — как обычный бинарный сенсор. Более того, некоторые интеграции (например, Energy Dashboard) просто не будут работать без корректных классов.
- Через configuration.yaml
- В интерфейсе Home Assistant
- Использую готовые интеграции
- Не знаю, что это такое
Официальная документация Home Assistant перечисляет десятки классов, но не всегда объясняет, как их применять на практике. Например, мало кто знает, что класс humidity автоматически добавляет единицу измерения "%", а класс power — "Вт". Это экономит время на ручной настройке.
Основные типы Device Class и их назначение
Все классы в Home Assistant делятся на несколько категорий. Рассмотрим самые востребованные:
| Категория | Примеры классов | Типичное применение |
|---|---|---|
| Бинарные сенсоры | motion, door, window, smoke |
Датчики движения, открытия дверей, дыма, протечек |
| Сенсоры окружающей среды | temperature, humidity, pressure, co2 |
Термометры, гигрометры, барометры, датчики CO₂ |
| Энергетика | power, energy, voltage, current |
Умные розетки, счётчики электроэнергии, солнечные панели |
| Освещение | illuminance, light |
Датчики освещённости, лампы с регулировкой яркости |
| Прочее | battery, signal_strength, timestamp |
Уровень заряда батареи, сила сигнала Wi-Fi, время последнего обновления |
Особняком стоят классы для климатического оборудования (например, hvac_mode для кондиционеров) и мультимедиа (например, media_player). Их настройка требует отдельного внимания, так как они влияют на работу панелей управления в интерфейсе.
Если ваш датчик не попадает ни под один стандартный класс, используйте none или оставьте поле пустым. Это лучше, чем назначить неверный класс, который исказит данные.
Как назначить Device Class: пошаговая инструкция
Способы назначения device class зависят от типа устройства и метода его подключения к Home Assistant. Рассмотрим основные сценарии:
1. Через configuration.yaml (для ручной настройки)
Если вы настраиваете устройство через YAML, добавьте параметр device_class в соответствующий раздел. Пример для бинарного сенсора:
binary_sensor:
- platform: mqtt
name: "Датчик движения в коридоре"
state_topic: "home/motion/corridor"
device_class: motion
Для обычных сенсоров (не бинарных) синтаксис аналогичный:
sensor:
- platform: template
name: "Температура на улице"
unit_of_measurement: "°C"
device_class: temperature
value_template: "{{ states('sensor.outdoor_temp') | float }}"
2. Через интерфейс Home Assistant (для интеграций с поддержкой UI)
Многие современные интеграции (например, Zigbee2MQTT, ESPHome) позволяют назначить device class прямо в веб-интерфейсе:
- Перейдите в
Настройки → Устройства и службы. - Выберите нужное устройство и нажмите
Настроить. - Найдите поле
Device Class(илиТип устройства) и выберите подходящий вариант из выпадающего списка.
☑️ Проверка корректности device class
3. Для MQTT-устройств
Если ваше устройство общается по MQTT, класс можно задать либо в конфигурации Home Assistant (как в первом примере), либо прямо в топике config (если устройство поддерживает MQTT Discovery):
homeassistant/binary_sensor/pir_1/config:
{
"name": "Датчик движения",
"device_class": "motion",
"state_topic": "home/pir_1/state",
"payload_on": "ON",
"payload_off": "OFF"
}
Важно: некоторые интеграции (например, Z-Wave JS) автоматически назначают классы на основе модели устройства. В этом случае ручное изменение может привести к конфликтам.
Распространённые ошибки и как их избежать
Даже опытные пользователи иногда сталкиваются с проблемами из-за неверного назначения device class. Вот самые частые ошибки:
⚠️ Внимание: Никогда не используйте класс temperature для датчиков, измеряющих что-то кроме температуры воздуха (например, температуру воды или процессора). Это нарушит работу Energy Dashboard и климатических автоматизаций.
- 🔄 Путаница между бинарными и обычными сенсорами. Например, датчик протечки воды должен иметь класс
moisture(бинарный), а неhumidity(сенсор). - ⚡ Несовпадение единиц измерения. Класс
powerподразумевает ватты (Вт), аenergy— киловатт-часы (кВт·ч). Если ваш счётчик отдаёт данные в других единицах, их нужно конвертировать. - 🚪 Игнорирование состояний "открыто/закрыто". Для классов
door,window,garage_doorважно, чтобы состояния передавались какon/offилиopen/closed, иначе иконки будут отображаться некорректно.
Ещё одна распространённая проблема — невидимые сенсоры. Если вы назначили класс, но датчик не появляется в интерфейсе, проверьте:
- Поддерживает ли выбранный класс отображение в текущей версии Home Assistant (некоторые классы, например
aqiдля качества воздуха, требуют последних обновлений). - Нет ли конфликтов с другими конфигурациями (например, дублирующиеся
entity_id). - Корректно ли указан
unit_of_measurement(для некоторых классов он обязателен).
Что делать, если класс не применяется?
Если вы изменили device class, но изменения не отображаются, попробуйте:
1. Перезагрузить Home Assistant.
2. Очистить кэш браузера (иногда старые иконки остаются в кэше).
3. Проверить логи на ошибки с помощью Developer Tools → Logs.
4. Удалить и заново добавить сущность (если это возможно без потери данных).
Продвинутые сценарии: кастомные Device Class и шаблоны
Иногда стандартных классов недостаточно. Например, у вас может быть датчик, который измеряет уровень шума в децибелах, но в Home Assistant нет для этого отдельного класса. В таких случаях можно:
1. Использовать шаблоны для создания кастомных сенсоров
С помощью Template Sensor вы можете назначить любой класс, даже если он не документирован. Пример для датчика шума:
sensor:
- platform: template
name: "Уровень шума в комнате"
unit_of_measurement: "dB"
device_class: sound # Неофициальный класс, но работает
value_template: "{{ states('sensor.noise_level') | float }}"
Не все неофициальные классы будут корректно отображаться в интерфейсе, но они позволят фильтровать сущности в автоматизациях по типу.
2. Комбинировать классы с атрибутами
Если класс не полностью описывает ваше устройство, добавьте дополнительные атрибуты. Например, для датчика качества воздуха:
sensor:
- platform: mqtt
name: "Качество воздуха"
state_topic: "home/air_quality"
device_class: aqi
json_attributes_topic: "home/air_quality/attributes"
value_template: "{{ value_json.pm25 }}"
В этом случае основной класс — aqi, но дополнительные данные (например, уровни PM10, CO₂) будут доступны через атрибуты сущности.
3. Создавать виртуальные устройства с несколькими классами
Например, один физический датчик может предоставлять и температуру, и влажность. В этом случае создайте две отдельные сущности:
sensor:
- platform: mqtt
name: "Температура в гостиной"
state_topic: "home/livingroom/sensor"
device_class: temperature
unit_of_measurement: "°C"
value_template: "{{ value_json.temperature }}"
- platform: mqtt
name: "Влажность в гостиной"
state_topic: "home/livingroom/sensor"
device_class: humidity
unit_of_measurement: "%"
value_template: "{{ value_json.humidity }}"
Используйте атрибут entity_category (например, diagnostic или config) для служебных сущностей, чтобы они не загромождали основной интерфейс.
Device Class и автоматизации: нюансы, о которых не говорят
Корректный device class не только влияет на отображение, но и меняет логику работы автоматизаций. Вот несколько примеров:
- 🌡️ Датчики с классом
temperatureможно использовать в климатических автоматизациях (например, включение обогревателя при падении температуры ниже порога). - 🚶 Датчики движения (
motion) автоматически сбрасываются в состояниеoffчерез заданный интервал (по умолчанию 30 секунд), если не поступает обновлений. Это поведение можно изменить в настройках интеграции. - 🔋 Для классов
batteryиsignal_strengthв Home Assistant есть встроенные уведомления о низком уровне заряда или слабом сигнале.
Особое внимание стоит уделить бинарным сенсорам. Их классы определяют, какие триггеры доступны в автоматизациях. Например:
- Класс
doorпозволяет использовать триггеры "открыто" и "закрыто". - Класс
smokeдобавляет возможность отправки экстренных уведомлений. - Класс
occupancy(наличие человека) часто используется для управления освещением.
⚠️ Внимание: Если вы используете классgarage_door, убедитесь, что ваш датчик поддерживает состояние "открывается/закрывается" (opening/closing), а не только "открыто/закрыто". В противном случае панель управления в интерфейсе будет работать некорректно.
Для энергетических классов (power, energy) Home Assistant автоматически рассчитывает статистику потребления, которая отображается в Energy Dashboard. Однако если ваш счётчик сбрасывается (например, раз в месяц), необходимо настроить параметр state_class: total_increasing, чтобы система правильно учитывала данные:
sensor:
- platform: mqtt
name: "Потребление электроэнергии"
state_topic: "home/energy/meter"
device_class: energy
state_class: total_increasing
unit_of_measurement: "kWh"
Device Class в интеграциях: что нужно знать
Разные интеграции по-разному работают с device class. Вот что важно учитывать:
1. Zigbee2MQTT
В Zigbee2MQTT классы назначаются в файле configuration.yaml или через веб-интерфейс. Особенности:
- 🔹 Поддерживаются не все классы (например, нет
aqiдля качества воздуха). - 🔹 Для некоторых устройств (например, Xiaomi) классы назначаются автоматически, но не всегда корректно.
- 🔹 Чтобы переопределить класс, используйте параметр
device_classв конфигурации устройства.
2. ESPHome
В ESPHome классы указываются прямо в коде прошивки. Пример для датчика температуры:
sensor:
- platform: dht
temperature:
name: "Температура"
device_class: "temperature"
humidity:
name: "Влажность"
device_class: "humidity"
Важно: в ESPHome классы чувствительны к регистру! Всегда используйте нижний регистр (например, temperature, а не Temperature).
3. Z-Wave JS
Эта интеграция обычно назначает классы автоматически на основе Z-Wave Command Class. Однако иногда требуется ручная корректировка. Например, датчики Fibaro Door/Window Sensor могут определяться как opening вместо door. Чтобы исправить это:
- Откройте файл конфигурации Z-Wave JS.
- Найдите раздел с вашим устройством.
- Добавьте параметр
device_classс нужным значением.
Для устройств Aeotec (например, Aeotec Multisensor 6) может потребоваться дополнительная настройка параметров sensor_type в конфигурации узла.
4. Modbus
При работе с Modbus классы назначаются вручную в configuration.yaml. Особенность: если ваш счётчик электроэнергии отдаёт данные в формате 0.01 кВт·ч, не забудьте умножить значение на 100, чтобы получить корректные показания:
sensor:
- platform: modbus
name: "Электроэнергия"
device_class: energy
state_class: total_increasing
unit_of_measurement: "kWh"
scale: 0.01
address: 1000
FAQ: ответы на частые вопросы
Можно ли изменить device class для устройства, добавленного через интеграцию (например, Tuya или Philips Hue)?
Да, но способы зависят от интеграции:
- Для Tuya и Philips Hue обычно требуется создать Template Sensor, который будет дублировать оригинальный датчик с нужным классом.
- В некоторых случаях можно использовать
customize:вconfiguration.yaml, но это работает не для всех интеграций.
Пример через customize::
homeassistant:
customize:
sensor.my_tuya_sensor:
device_class: temperature
Почему после смены device class иконка в интерфейсе не изменилась?
Возможные причины:
- Кэш браузера — попробуйте обновить страницу с очисткой кэша (Ctrl+F5).
- Сущность не обновила состояние — проверьте логи на ошибки.
- Класс не поддерживается текущей темой оформления — попробуйте сменить тему.
- Конфликт с кастомными карточками (например, Mushroom Cards) — проверьте их настройки.
Как назначить device class для группы устройств?
Для групп (Group) в Home Assistant нельзя напрямую указать device class. Решения:
- Создайте Template Sensor, который будет агрегировать данные группы и назначьте класс ему.
- Используйте Utility Meter для энергетических групп.
Пример для группы датчиков температуры:
sensor:
- platform: template
name: "Средняя температура в доме"
device_class: temperature
unit_of_measurement: "°C"
value_template: >-
{{ (states('sensor.livingroom_temp') | float +
states('sensor.bedroom_temp') | float) / 2 | round(1) }}
Какие device class поддерживают историю и статистику?
Для сбора истории и отображения графиков класс должен соответствовать одному из следующих типов:
- Все классы, связанные с энергетикой (
power,energy,voltageи др.). - Классы окружающей среды (
temperature,humidity,pressure). - Классы с состоянием
totalилиtotal_increasing(например, счётчики воды).
Чтобы включить сбор статистики, добавьте параметр state_class:
sensor:
- platform: mqtt
name: "Расход воды"
device_class: water
state_class: total_increasing
unit_of_measurement: "m³"
Можно ли создать свой собственный device class?
Технически да, но:
- Новый класс не будет иметь стандартной иконки в интерфейсе.
- Автоматизации и дашборды могут некорректно обрабатывать кастомные классы.
- Лучше использовать атрибуты или шаблоны для нестандартных устройств.
Если вам действительно нужен кастомный класс, объявите его в configuration.yaml и используйте в шаблонах:
homeassistant:
customize:
sensor.my_custom_sensor:
device_class: my_custom_class