https://github.com/alexxit/morphnumbers
Компонент Home Assistant для работы с числительными в Jinja2
https://github.com/alexxit/morphnumbers
home-assistant
Last synced: 10 months ago
JSON representation
Компонент Home Assistant для работы с числительными в Jinja2
- Host: GitHub
- URL: https://github.com/alexxit/morphnumbers
- Owner: AlexxIT
- Created: 2020-03-17T11:46:08.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2025-08-25T14:38:32.000Z (10 months ago)
- Last Synced: 2025-08-25T16:29:27.631Z (10 months ago)
- Topics: home-assistant
- Language: Python
- Homepage: https://t.me/AlexxIT_SmartHome
- Size: 725 KB
- Stars: 98
- Watchers: 3
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Morph Numbers для Home Assistant
[](https://github.com/custom-components/hacs)
Компонент [Home Assistant](https://www.home-assistant.io/), добавляющий **Jinja2** фильтр для работы с числительными. Хорошо подходит в дополнение к моему второму компоненту [YandexStation](https://github.com/AlexxIT/YandexStation).

## Установка
**Способ 1.** [HACS](https://hacs.xyz/)
> HACS > Интеграции > 3 точки (правый верхний угол) > Пользовательские репозитории > URL: `AlexxIT/MorphNumbers`, Категория: Интеграция > Добавить > подождать > MorphNumbers > Установить
**Способ 2.** Вручную скопируйте папку `morph_numbers` из [latest release](https://github.com/AlexxIT/MorphNumbers/releases/latest) в директорию `/config/custom_components`.
## Настройка
**Способ 1.** GUI
> Настройки > Интеграции > Добавить интеграцию > **MorphNumbers**
Если интеграции нет в списке - очистите кэш браузера.
**Способ 2.** YAML
```yaml
morph_numbers:
```
## Использование
Используется как дополнительный фильтр в шаблонах.
### Согласование слов с числительными
Полезно при отправке в Телеграм
```jinja2
{{ 24|format(morph='градус', as_text=false) }} => 24 градуса
```
### Преобразование чисел в текст
Полезно для TTS. Яндекс и Google допускают ошибки при произнесении числительных.
В `morph` желательно писать слово/фразу, согласованную с цифрой 1, например:
- "перезагружен за одну секунду" - `morph='секунду'`
- "одна секунда это вечность" - `morph='секунда'`
```jinja2
Сервер перезагружен, за {{ 31|round|format(morph='секунду') }} => Сервер перезагружен, за тридцать одну секунду
{{ 31|round|format(morph='секунда') }} - это целая вечность! => тридцать одна секунда - это целая вечность!
```
### Порядковые числительные
В `morph` нужно указать пример, в какую форму преобразовать числительное.
```jinja2
и снова {{ 3|format(morph='первое', as_ordinal=True) }} сентября => и снова третье сентября
```
### Ручной шаблон согласования
В случае, если автоматическая морфология допускает ошибки. Укажите слова для чисел: 1, 2, 5.
```jinja2
{{ 5|format(morph=['год','года','лет']) }} => пять лет
```
### Число без согласования
```jinja2
{{ 2000435|format(morph='') }} => два миллиона четыреста тридцать пять
```
### Согласование без вывовда числа
```jinja2
{{ 5|format(morph='просроченная задача', as_text=None) }} => просроченных задач
```
### Обратное преобразование
```jinja2
{{ "два миллиона четыреста тридцать пять"|format(morph='', reverse=true) }} => 2000435
```
### Дробные числа
Согласно правилам, целая и дробная части числа согласуются со словом "часть".
```jinja2
{{ 22.2|format(morph='градус') }} => двадцать две целых и две десятых градуса
```
## Шаблон из скриншота
```yaml
Старт занял {{ 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) }}
```
```yaml
script:
morph_numbers_test:
sequence:
- service: persistent_notification.create
data_template:
message: Старт занял {{ states('sensor.start_time')|round|format(morph='секунду') }}
```