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.12.tar.gz (69.1 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.12-py3-none-any.whl (65.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: uapg-0.1.12.tar.gz
  • Upload date:
  • Size: 69.1 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.12.tar.gz
Algorithm Hash digest
SHA256 fc25b0cb9cc71ad29ba0bbe247f5f2d9f0cd7f731e6b26a7d057338ff0030771
MD5 8c1edc416c8dc034add33e31c4b0c75c
BLAKE2b-256 317ddfb0e769272ad12825a1a6c93821a245a0e01d4df1c4b456dad16b07e464

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: uapg-0.1.12-py3-none-any.whl
  • Upload date:
  • Size: 65.2 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.12-py3-none-any.whl
Algorithm Hash digest
SHA256 7233e00d374f1cdc05479c0936533ab3ad707b5265c7ebda2c8d4665cd3a234a
MD5 67dfb41f945379229f5aefc7f3f5f8b5
BLAKE2b-256 2d7eeeff47390ec084a510538043df7c0f6259cb6f19a4ef5a463948cf6e87d0

See more details on using hashes here.

Provenance

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