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.13.tar.gz (69.3 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.13-py3-none-any.whl (65.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: uapg-0.1.13.tar.gz
  • Upload date:
  • Size: 69.3 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.13.tar.gz
Algorithm Hash digest
SHA256 0f6a3b228164d9203a023ea9c3ba415283723ee6ab7287e5041f86eef347d3d3
MD5 226965f4b09728f1b5395d2b736c734e
BLAKE2b-256 92f0401069fed8bd7868c178b3ed5ccdf9d0648d89f075f47224079678f71ce7

See more details on using hashes here.

Provenance

The following attestation bundles were made for uapg-0.1.13.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.13-py3-none-any.whl.

File metadata

  • Download URL: uapg-0.1.13-py3-none-any.whl
  • Upload date:
  • Size: 65.5 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.13-py3-none-any.whl
Algorithm Hash digest
SHA256 e233f3d363e042a41aae1f8810d4e8850c2f7ac7332ce01e8eb4c8a36b53f9fc
MD5 b54ada6e8d10a74e82820d1a6b7d7011
BLAKE2b-256 aca986751042f0f806122ef7de3ae0129750bc5c92a6a028ba8195e264b919c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for uapg-0.1.13-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