Компонент Home Assistant, добавляющий Jinja2 фильтр для работы с числительными. Хорошо подходит в дополнение к моему второму компоненту YandexStation.
Способ 1. HACS
HACS > Интеграции > 3 точки (правый верхний угол) > Пользовательские репозитории > URL:
AlexxIT/MorphNumbers
, Категория: Интеграция > Добавить > подождать > MorphNumbers > Установить
Способ 2. Вручную скопируйте папку morph_numbers
из latest release в директорию /config/custom_components
.
Способ 1. GUI
Настройки > Интеграции > Добавить интеграцию > MorphNumbers
Если интеграции нет в списке - очистите кэш браузера.
Способ 2. YAML
morph_numbers:
Используется как дополнительный фильтр в шаблонах.
Полезно при отправке в Телеграм
{{ 24|format(morph='градус', as_text=false) }} => 24 градуса
Полезно для TTS. Яндекс и Google допускают ошибки при произнесении числительных.
В morph
желательно писать слово/фразу, согласованную с цифрой 1, например:
- "перезагружен за одну секунду" -
morph='секунду'
- "одна секунда это вечность" -
morph='секунда'
Сервер перезагружен, за {{ 31|round|format(morph='секунду') }} => Сервер перезагружен, за тридцать одну секунду
{{ 31|round|format(morph='секунда') }} - это целая вечность! => тридцать одна секунда - это целая вечность!
В morph
нужно указать пример, в какую форму преобразовать числительное.
и снова {{ 3|format(morph='первое', as_ordinal=True) }} сентября => и снова третье сентября
В случае, если автоматическая морфология допускает ошибки. Укажите слова для чисел: 1, 2, 5.
{{ 5|format(morph=['год','года','лет']) }} => пять лет
{{ 2000435|format(morph='') }} => два миллиона четыреста тридцать пять
{{ 5|format(morph='просроченная задача', as_text=None) }} => просроченных задач
{{ "два миллиона четыреста тридцать пять"|format(morph='', reverse=true) }} => 2000435
Согласно правилам, целая и дробная части числа согласуются со словом "часть".
{{ 22.2|format(morph='градус') }} => двадцать две целых и две десятых градуса
Старт занял {{ states('sensor.start_time')|round|format(morph='секунду') }}
{{ 1|format(morph='градус') }}
{{ 1|format(morph='задача') }}
{{ 1|format(morph='дерево') }}
{{ 2000435|format(morph='синее облако') }}
{{ 2|format(morph='запланированная задача', as_text=false) }}
{{ 5|format(morph='просроченная задача', as_text=false) }}
{{ 123|format(morph='') }}
{{ 0|format(morph='градус') }}
{{ -2|format(morph='градус') }}
{{ 5|format(morph=['год','года','лет']) }}
{{ 100|format(morph='первому', as_ordinal=True) }} игроку приготовиться
и снова {{ 3|format(morph='первое', as_ordinal=True) }} сентября
{{ 5|format(morph='просроченная задача', as_text=None) }}
script:
morph_numbers_test:
sequence:
- service: persistent_notification.create
data_template:
message: Старт занял {{ states('sensor.start_time')|round|format(morph='секунду') }}