OPC UA PostgreSQL History Storage Backend
Project description
UAPG - OPC UA PostgreSQL History Storage Backend
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uapg-0.1.10.tar.gz.
File metadata
- Download URL: uapg-0.1.10.tar.gz
- Upload date:
- Size: 67.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01488718882a5e5414d86d4b12e6ec6e12e26b797bc1f9af5e8dadd7e8782877
|
|
| MD5 |
9fb8023cf68df778a62225aa50799694
|
|
| BLAKE2b-256 |
69aff3b7d50acd9a44c23cef2ad71b93b7b421e5108f8f33da7a208d7c419d9b
|
Provenance
The following attestation bundles were made for uapg-0.1.10.tar.gz:
Publisher:
python-publish.yml on CyberNet-Git/uapg
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uapg-0.1.10.tar.gz -
Subject digest:
01488718882a5e5414d86d4b12e6ec6e12e26b797bc1f9af5e8dadd7e8782877 - Sigstore transparency entry: 719596512
- Sigstore integration time:
-
Permalink:
CyberNet-Git/uapg@fc4bdaca1d3a8cc39751f9596510f2cefc244d60 -
Branch / Tag:
refs/tags/0.1.10 - Owner: https://github.com/CyberNet-Git
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@fc4bdaca1d3a8cc39751f9596510f2cefc244d60 -
Trigger Event:
release
-
Statement type:
File details
Details for the file uapg-0.1.10-py3-none-any.whl.
File metadata
- Download URL: uapg-0.1.10-py3-none-any.whl
- Upload date:
- Size: 63.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51c7f793a9e2486d98db1a5bb94aac293adb700f40863634ad4b9fb647f61b42
|
|
| MD5 |
ddc0dab98bd7ffa9edebf8a74084228e
|
|
| BLAKE2b-256 |
028568bbe41b3c1eac4cd440da38813949f99731b0bc0ba6d114bb8c22cd65c2
|
Provenance
The following attestation bundles were made for uapg-0.1.10-py3-none-any.whl:
Publisher:
python-publish.yml on CyberNet-Git/uapg
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uapg-0.1.10-py3-none-any.whl -
Subject digest:
51c7f793a9e2486d98db1a5bb94aac293adb700f40863634ad4b9fb647f61b42 - Sigstore transparency entry: 719596514
- Sigstore integration time:
-
Permalink:
CyberNet-Git/uapg@fc4bdaca1d3a8cc39751f9596510f2cefc244d60 -
Branch / Tag:
refs/tags/0.1.10 - Owner: https://github.com/CyberNet-Git
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@fc4bdaca1d3a8cc39751f9596510f2cefc244d60 -
Trigger Event:
release
-
Statement type: