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.9.tar.gz (61.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.9-py3-none-any.whl (57.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: uapg-0.1.9.tar.gz
  • Upload date:
  • Size: 61.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.9.tar.gz
Algorithm Hash digest
SHA256 63e52893c5dbecc2fb12e4a8cd6b7010ae3516418e24cc8acc3b136ad0f6b461
MD5 bdbf573b7aae8535022c3e816bf930e6
BLAKE2b-256 792f0d8cc1897e55dbf9a00e62f15f2b917315ce7ee06c9413a81fddf6976c7e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: uapg-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 57.3 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.9-py3-none-any.whl
Algorithm Hash digest
SHA256 49f136f0fd3d254527c18c583b8b017438b6e14d0a99b255484c9db2009d6daa
MD5 44c1d20eb90caa6d4d3634f8146d2cb8
BLAKE2b-256 43ed3c1d2ed52455778bbf36900d1276c8319cf3a94705fed905a5a3cbd57834

See more details on using hashes here.

Provenance

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