/MorphNumbers

Компонент Home Assistant для работы с числительными в Jinja2

Primary LanguagePython

Morph Numbers для Home Assistant

hacs_badge

Компонент Home Assistant, добавляющий Jinja2 фильтр для работы с числительными. Хорошо подходит в дополнение к моему второму компоненту YandexStation.

template

Установка

Способ 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='секунду') }}