Skip to main content

Asynchronous Python API for TNS-Energo

Project description

aioTNSE

PyPI Python License: MIT CI

Асинхронная 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() реализует трёхуровневую логику:

  1. Возвращает кэшированный токен, если он ещё действителен
  2. Обновляет через async_refresh_token(), если access token истёк
  3. Выполняет повторный логин через 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

Ссылки

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiotnse-2.0.4.tar.gz (19.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aiotnse-2.0.4-py3-none-any.whl (15.3 kB view details)

Uploaded Python 3

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

Hashes for aiotnse-2.0.4.tar.gz
Algorithm Hash digest
SHA256 c0893f7a9f60d32e5ecd1031e82c950356884fb489b2fd9de7f762fb98971b79
MD5 b0df00d85ddc7071e1bd07d6148120b8
BLAKE2b-256 8edad596bd8c0982f2e01185665fa93104b451ed17bcc9e2bbe686b2659719af

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiotnse-2.0.4.tar.gz:

Publisher: publish.yml on lizardsystems/aiotnse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for aiotnse-2.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d05d427636a217510ae77df3e3edbeb76679a91ecb40ec6efd5cf94e57a02c30
MD5 7b3965aa21c07ff7781b996277cf4fc6
BLAKE2b-256 319fe72204f99ef1f0d606d6de977bc7afd488621cbd8c04cc917c00e74caf4d

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiotnse-2.0.4-py3-none-any.whl:

Publisher: publish.yml on lizardsystems/aiotnse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page