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.3.tar.gz (19.2 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.3-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file aiotnse-2.0.3.tar.gz.

File metadata

  • Download URL: aiotnse-2.0.3.tar.gz
  • Upload date:
  • Size: 19.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aiotnse-2.0.3.tar.gz
Algorithm Hash digest
SHA256 14f8512c3dae84f4d816b85a118a2ea8d7f1364a513a963e0ebdf70e56b03c07
MD5 8e29a16a9998bd7f39f702f7081c05af
BLAKE2b-256 2ae1f5ec9d88957d2c6fba29c789dcd6e49895b58d0cee503e031f611f6e567a

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiotnse-2.0.3.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.3-py3-none-any.whl.

File metadata

  • Download URL: aiotnse-2.0.3-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aiotnse-2.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7b9332450c352ea20204d1333f992d045b7223e13874639356b578fe2236874d
MD5 a3142fc10d6f560d6b833c633a4c45f1
BLAKE2b-256 1501fa75c3c5ed251b260615d1cf53cc992a89e226a49a951471fd4248a26ccb

See more details on using hashes here.

Provenance

The following attestation bundles were made for aiotnse-2.0.3-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