Skip to main content

OPC UA PostgreSQL History Storage Backend

Project description

UAPG - OPC UA PostgreSQL History Storage Backend

Python 3.12 License: MIT

UAPG - это модуль для хранения исторических данных OPC UA в PostgreSQL с поддержкой TimescaleDB для эффективной работы с временными рядами.

Возможности

  • 📊 Хранение исторических данных OPC UA в PostgreSQL
  • ⚡ Поддержка TimescaleDB для оптимизации временных рядов
  • 🔄 Автоматическое управление жизненным циклом данных
  • 📈 Индексация для быстрых запросов
  • 🎯 Поддержка событий и изменений данных
  • 🛡️ Валидация имен таблиц для безопасности
  • 🚀 Пул подключений PostgreSQL для высокой производительности
  • 🔒 Решение проблемы "another operation is in progress"

Установка

pip install uapg

Быстрый старт

Базовое использование

import asyncio
from uapg import HistoryPgSQL

async def main():
    # Создание экземпляра истории с пулом подключений
    history = HistoryPgSQL(
        user='postgres',
        password='your_password',
        database='opcua',
        host='localhost',
        port=5432,
        min_size=5,      # Минимальное количество соединений в пуле
        max_size=20      # Максимальное количество соединений в пуле
    )
    
    # Инициализация пула подключений
    await history.init()
    
    # Настройка историзации узла
    await history.new_historized_node(
        node_id=ua.NodeId(1, "MyVariable"),
        period=timedelta(days=30),  # Хранить данные 30 дней
        count=10000  # Максимум 10000 записей
    )
    
    # Сохранение значения
    datavalue = ua.DataValue(
        Value=ua.Variant(42.0, ua.VariantType.Double),
        SourceTimestamp=datetime.now(timezone.utc),
        ServerTimestamp=datetime.now(timezone.utc)
    )
    await history.save_node_value(node_id, datavalue)
    
    # Чтение истории
    start_time = datetime.now(timezone.utc) - timedelta(hours=1)
    end_time = datetime.now(timezone.utc)
    results, continuation = await history.read_node_history(
        node_id, start_time, end_time, nb_values=100
    )
    
    # Закрытие пула подключений
    await history.stop()

# Запуск
asyncio.run(main())

Конфигурация пула подключений

UAPG поддерживает настройку пула подключений для различных сценариев использования:

Для высоконагруженных систем

history = HistoryPgSQL(
    user='postgres',
    password='your_password',
    database='opcua',
    host='localhost',
    min_size=10,     # Больше минимальных соединений для быстрого отклика
    max_size=50      # Больше максимальных соединений для пиковых нагрузок
)

Для ресурсоэффективных систем

history = HistoryPgSQL(
    user='postgres',
    password='your_password',
    database='opcua',
    host='localhost',
    min_size=2,      # Минимальное количество соединений
    max_size=10      # Ограниченное количество максимальных соединений
)

Для сбалансированных систем (по умолчанию)

history = HistoryPgSQL(
    user='postgres',
    password='your_password',
    database='opcua',
    host='localhost',
    min_size=5,      # Умеренное количество минимальных соединений
    max_size=20      # Умеренное количество максимальных соединений
)

Решение проблем

Ошибка "another operation is in progress"

Эта ошибка возникает при использовании одного соединения для нескольких одновременных операций. UAPG решает эту проблему с помощью пула подключений:

  • До: Одно соединение asyncpg.Connection для всех операций
  • После: Пул соединений asyncpg.Pool с автоматическим управлением
# Старый способ (может вызывать ошибки)
self._db = await asyncpg.connect(**self._conn_params)
await self._db.execute(query)

# Новый способ (решает проблему)
self._pool = await asyncpg.create_pool(**self._conn_params, min_size=5, max_size=20)
async with self._pool.acquire() as conn:
    await conn.execute(query)

Мониторинг пула подключений

# Получение статуса пула
pool_status = await history._pool.get_status()
print(f"Active connections: {pool_status['active_connections']}")
print(f"Free connections: {pool_status['free_size']}")

Требования

  • Python 3.12+
  • PostgreSQL 12+
  • TimescaleDB (рекомендуется для больших объемов данных)

Зависимости

  • asyncua>=1.0.0 - OPC UA клиент/сервер
  • asyncpg>=0.29.0 - Асинхронный драйвер PostgreSQL

Примеры

Базовый пример

cd examples
python basic_usage.py

Продвинутая конфигурация пула

cd examples
python advanced_pool_config.py

Разработка

Установка для разработки

git clone https://github.com/rts-iot/uapg.git
cd uapg
pip install -e ".[dev]"

Запуск тестов

pytest

Форматирование кода

black src/
isort src/

Проверка типов

mypy src/

Лицензия

MIT License - см. файл LICENSE для подробностей.

Поддержка

Если у вас есть вопросы или проблемы, создайте issue в репозитории проекта.

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

uapg-0.1.11.tar.gz (67.7 kB view details)

Uploaded Source

Built Distribution

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

uapg-0.1.11-py3-none-any.whl (63.8 kB view details)

Uploaded Python 3

File details

Details for the file uapg-0.1.11.tar.gz.

File metadata

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

File hashes

Hashes for uapg-0.1.11.tar.gz
Algorithm Hash digest
SHA256 958f906f72536e45bb93b49bb01d0a2de0244e8b129428e753932bfb55a8d86b
MD5 f4f430edd0e04c3cc18a04d262f2a0a2
BLAKE2b-256 fc983d2b1feb7eadd208e2cb51dd288383427bd56ea38005960ae84877ddef4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for uapg-0.1.11.tar.gz:

Publisher: python-publish.yml on CyberNet-Git/uapg

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

File details

Details for the file uapg-0.1.11-py3-none-any.whl.

File metadata

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

File hashes

Hashes for uapg-0.1.11-py3-none-any.whl
Algorithm Hash digest
SHA256 e3379fa1bdb824c00c2b4dbfab8b8035ecbe31d33a9cd72ac4e95c12a3d35191
MD5 5198a50b8a7381745fb305b336592f63
BLAKE2b-256 827343b5fb114b3a527e3c3fc4b06d1e4e3fbcd6160c265ccfd5ef12ae0a634b

See more details on using hashes here.

Provenance

The following attestation bundles were made for uapg-0.1.11-py3-none-any.whl:

Publisher: python-publish.yml on CyberNet-Git/uapg

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