Asynchronous Python API for TNS-Energo
Project description
aioTNSE
Асинхронная Python-библиотека для работы с мобильным API ТНС-Энерго (российская энергосбытовая компания).
Используется как бэкенд для интеграции hass-tnse в Home Assistant.
Возможности
- Аутентификация по email/паролю с JWT-токенами
- Автоматическое обновление токенов (access token → refresh token → re-login)
- Получение списка лицевых счетов, баланса, показаний счётчиков
- Передача показаний счётчиков
- Получение квитанций (PDF) и истории операций
- Полная поддержка всех регионов ТНС-Энерго
- CLI для работы с API из командной строки
Установка
pip install aiotnse
Быстрый старт
import asyncio
import aiohttp
from aiotnse import SimpleTNSEAuth, TNSEApi, async_get_regions
async def main() -> None:
async with aiohttp.ClientSession() as session:
# Получить список регионов (авторизация не требуется)
regions = await async_get_regions(session)
for r in regions:
print(f"{r['name']} ({r['code']})")
# Авторизация
auth = SimpleTNSEAuth(
session, region="rostov", email="user@example.com", password="password"
)
await auth.async_login()
api = TNSEApi(auth)
# Лицевые счета
accounts = await api.async_get_accounts()
account_number = accounts[0]["number"]
# Баланс
balance = await api.async_get_balance(account_number)
print(f"К оплате: {balance['sumToPay']} руб.")
# Счётчики
counters = await api.async_get_counters(account_number)
for counter in counters:
print(f"Счётчик {counter['counterId']}: {counter['lastReadings']}")
asyncio.run(main())
Авторизация
Логин по email/паролю
auth = SimpleTNSEAuth(
session, region="rostov", email="user@example.com", password="password"
)
await auth.async_login()
Восстановление сессии из сохранённых токенов
async_get_access_token() автоматически обновляет токены или выполняет повторную
аутентификацию при необходимости:
from datetime import datetime
def on_token_update(token_data: dict) -> None:
"""Вызывается после логина или обновления токена — сохраните токены."""
save_to_storage(token_data)
auth = SimpleTNSEAuth(
session,
region="rostov",
email="user@example.com",
password="password",
access_token="saved_access_token",
refresh_token="saved_refresh_token",
access_token_expires=datetime.fromisoformat("2026-06-09T19:42:16"),
refresh_token_expires=datetime.fromisoformat("2026-10-09T19:42:16"),
token_update_callback=on_token_update,
)
# Вызов async_login() не нужен — токены обновятся автоматически при первом API-запросе
Автоматическое управление токенами
async_get_access_token() реализует трёхуровневую логику:
- Возвращает кэшированный токен, если он ещё действителен
- Обновляет через
async_refresh_token(), если access token истёк - Выполняет повторный логин через
async_login(), если оба токена истекли
asyncio.Lock предотвращает параллельное обновление токенов.
API-методы
Публичные (без авторизации)
| Функция | Описание |
|---|---|
async_get_regions(session) |
Список доступных регионов |
async_check_version(session, region) |
Проверка совместимости версии приложения |
Лицевые счета
| Метод | Описание |
|---|---|
async_get_accounts() |
Список лицевых счетов пользователя |
async_get_account_info(account_id) |
Детальная информация по ID |
async_get_information(account) |
Общая информация по номеру ЛС |
async_get_main_page_debt_info() |
Информация о задолженности |
Счётчики и показания
| Метод | Описание |
|---|---|
async_get_counters(account) |
Счётчики для лицевого счёта |
async_get_counter_readings(counter_id, account) |
История показаний счётчика |
async_send_readings(account, row_id, readings) |
Передача показаний |
Платежи и баланс
| Метод | Описание |
|---|---|
async_get_balance(account) |
Баланс и начисления |
async_get_history(account, year, month) |
История операций за месяц |
Квитанции
| Метод | Описание |
|---|---|
async_get_invoices(account, year) |
Список квитанций за год |
async_get_invoice_file(account, date) |
Квитанция в формате PDF (base64) |
async_get_invoice_settings(account) |
Настройки email-доставки квитанций |
Пользователь
| Метод | Описание |
|---|---|
async_get_user_info() |
Информация о текущем пользователе |
Подробная документация API: docs/API.md
Исключения
TNSEApiError — базовая ошибка API
├── TNSEAuthError — ошибка авторизации
│ ├── TNSETokenExpiredError — токен истёк
│ └── TNSETokenRefreshError — ошибка обновления токена
├── RegionNotFound — регион не найден
├── InvalidAccountNumber — неверный номер ЛС
└── RequiredApiParamNotFound — отсутствует обязательный параметр
CLI
Библиотека включает CLI для работы с API из командной строки:
# Список регионов (авторизация не требуется)
aiotnse-cli --regions
# Лицевые счета
aiotnse-cli --email user@example.com --password pass --region rostov --accounts
# Баланс
aiotnse-cli --email user@example.com --password pass --region rostov --balance 610000000001
# Счётчики
aiotnse-cli --email user@example.com --password pass --region rostov --counters 610000000001
# Передача показаний
aiotnse-cli --email user@example.com --password pass --region rostov send 610000000001 2000001 2690 1023
# Подробный вывод (отладка)
aiotnse-cli -vvv --email user@example.com --password pass --region rostov --accounts
Если --region не указан, CLI предложит выбрать регион интерактивно.
Таймауты
aiotnse не задаёт таймауты для запросов. Управление таймаутами — ответственность вызывающего кода:
import asyncio
async with asyncio.timeout(10):
data = await api.async_get_counters(account)
Разработка
# Клонирование
git clone https://github.com/lizardsystems/aiotnse.git
cd aiotnse
# Установка зависимостей для тестирования
pip install -e ".[test]"
# Запуск тестов
pytest tests/ -v
Ссылки
- Документация API
- Changelog
- hass-tnse — интеграция для Home Assistant
- Проблемы и предложения
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aiotnse-2.0.4.tar.gz.
File metadata
- Download URL: aiotnse-2.0.4.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0893f7a9f60d32e5ecd1031e82c950356884fb489b2fd9de7f762fb98971b79
|
|
| MD5 |
b0df00d85ddc7071e1bd07d6148120b8
|
|
| BLAKE2b-256 |
8edad596bd8c0982f2e01185665fa93104b451ed17bcc9e2bbe686b2659719af
|
Provenance
The following attestation bundles were made for aiotnse-2.0.4.tar.gz:
Publisher:
publish.yml on lizardsystems/aiotnse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aiotnse-2.0.4.tar.gz -
Subject digest:
c0893f7a9f60d32e5ecd1031e82c950356884fb489b2fd9de7f762fb98971b79 - Sigstore transparency entry: 1995399607
- Sigstore integration time:
-
Permalink:
lizardsystems/aiotnse@c497b06f95f063e0a3c71d678c442dbcea90d100 -
Branch / Tag:
refs/tags/v2.0.4 - Owner: https://github.com/lizardsystems
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c497b06f95f063e0a3c71d678c442dbcea90d100 -
Trigger Event:
release
-
Statement type:
File details
Details for the file aiotnse-2.0.4-py3-none-any.whl.
File metadata
- Download URL: aiotnse-2.0.4-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d05d427636a217510ae77df3e3edbeb76679a91ecb40ec6efd5cf94e57a02c30
|
|
| MD5 |
7b3965aa21c07ff7781b996277cf4fc6
|
|
| BLAKE2b-256 |
319fe72204f99ef1f0d606d6de977bc7afd488621cbd8c04cc917c00e74caf4d
|
Provenance
The following attestation bundles were made for aiotnse-2.0.4-py3-none-any.whl:
Publisher:
publish.yml on lizardsystems/aiotnse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aiotnse-2.0.4-py3-none-any.whl -
Subject digest:
d05d427636a217510ae77df3e3edbeb76679a91ecb40ec6efd5cf94e57a02c30 - Sigstore transparency entry: 1995399764
- Sigstore integration time:
-
Permalink:
lizardsystems/aiotnse@c497b06f95f063e0a3c71d678c442dbcea90d100 -
Branch / Tag:
refs/tags/v2.0.4 - Owner: https://github.com/lizardsystems
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c497b06f95f063e0a3c71d678c442dbcea90d100 -
Trigger Event:
release
-
Statement type: