Python client for Questra Data with high-level API, type-safe dataclasses, and optional pandas integration for user-defined data models and timeseries management
Project description
Seven2one Questra Data
Python Client für Questra Dynamic Objects (GraphQL + REST API).
Features
- High-Level API: Vereinfachte Schnittstelle für häufige Operationen
- Low-Level API: Direkter Zugriff auf GraphQL und REST Endpoints
- Typsichere Dataclasses: IDE-Unterstützung für Inventory-Erstellung ✨ NEU!
- Zeitreihen-Verwaltung: Effiziente Verwaltung von TimeSeries-Daten
- Inventory-Operationen: CRUD-Operationen für Dynamic Objects
- Optional: pandas Integration: DataFrames für Zeitreihen- und Inventory-Daten
Installation
# Basis-Installation
pip install seven2one-questra-data
# Mit pandas-Unterstützung (empfohlen für Data Science)
pip install seven2one-questra-data[pandas]
Siehe INSTALLATION.md für detaillierte Installations-Anleitungen.
Schnellstart
High-Level API (empfohlen)
from questra_authentication import QuestraAuthentication
from questra_data import QuestraData
from datetime import datetime
# Authentifizierung
auth_client = QuestraAuthentication(
url="https://authentik.dev.example.com",
username="ServiceUser",
password="secret"
)
# Client initialisieren
client = QuestraData(
graphql_url="https://dev.example.com/dynamic-objects/graphql",
auth_client=auth_client
)
# Inventory Items auflisten
items = client.list(
inventory_name="Stromzaehler",
namespace_name="Energie",
properties=["_id", "stromzaehlernummer", "hersteller"],
limit=10
)
# Zeitreihen-Werte laden (kombiniert automatisch Inventory + TimeSeries!)
result = client.list_timeseries_values(
inventory_name="Stromzaehler",
namespace_name="Energie",
timeseries_property="messwerte_Energie",
from_time=datetime(2025, 1, 1),
to_time=datetime(2025, 12, 31)
)
for item_id, data in result.items():
print(f"Stromzähler: {data['item']['stromzaehlernummer']}")
print(f"Anzahl Werte: {len(data['values'])}")
Inventory erstellen mit Property-Klassen ✨ NEU!
from questra_data import (
StringProperty,
IntProperty,
InventoryRelation,
RelationType,
ConflictAction
)
# Typsichere Property-Definitionen (vereinfachte API)
properties = [
StringProperty(
propertyName="Name",
maxLength=200,
isRequired=True,
isUnique=True
),
IntProperty(
propertyName="Age",
isRequired=False
)
]
# Inventory erstellen
client.create_inventory(
name="TEC",
properties=properties,
if_exists=ConflictAction.IGNORE
)
# Mit Relationen
relations = [
InventoryRelation(
propertyName="Technologie",
relationType=RelationType.ONE_TO_MANY,
parentInventoryName="TEC",
parentPropertyName="Anlagen"
)
]
client.create_inventory(
name="ANL",
properties=properties,
relations=relations,
if_exists=ConflictAction.IGNORE
)
Vorteile der Dataclasses:
- ✅ IDE-Autovervollständigung und Typprüfung
- ✅ Fehler werden zur Entwicklungszeit erkannt
- ✅ Klare, selbstdokumentierende API
- ✅ Rückwärtskompatibel (Dictionary-API funktioniert weiterhin)
Siehe docs/INPUT_DATACLASSES.md für vollständige Dokumentation.
Mit pandas (Optional)
# Zeitreihen als DataFrame
df = client.list_timeseries_values_df(
inventory_name="Stromzaehler",
namespace_name="Energie",
timeseries_property="messwerte_Energie",
from_time=datetime(2025, 1, 1),
to_time=datetime(2025, 12, 31),
include_metadata=True # Item-Felder als Spalten
)
# DataFrame:
# value quality item_id item_stromzaehlernummer
# time
# 2025-01-01 12:00:00 100.5 VALID 630... SZ-12345
# 2025-01-02 12:00:00 105.2 VALID 630... SZ-12345
# Direkt weiterverarbeiten
df.resample('1D').mean() # Tägliche Mittelwerte
df.plot() # Plotten
df.groupby('item_id')['value'].agg(['mean', 'std']) # Statistiken
# Inventory Items als DataFrame
df_items = client.list_df(
inventory_name="Stromzaehler",
properties=["_id", "stromzaehlernummer", "hersteller"]
)
Low-Level API (für fortgeschrittene Operationen)
# Zugriff auf Low-Level Client
lowlevel = client.lowlevel
# Direkte GraphQL Query
result = lowlevel.execute_raw("""
query {
_timeZones(first: 5) {
name
baseUtcOffset
}
}
""")
API-Übersicht
High-Level API (QuestraData)
Zeitreihen
list_timeseries_values()- Zeitreihen-Werte als Dictlist_timeseries_values_df()- Zeitreihen-Werte als DataFrame (benötigt pandas)save_timeseries_values()- Zeitreihen-Werte speichern
Inventory
list()- Items auflisten als List[Dict]list_df()- Items auflisten als DataFrame (benötigt pandas)create()- Items erstellenupdate()- Items aktualisierendelete()- Items löschen
Verwaltung
create_namespace()- Namespace erstellen → GibtNamedItemResultzurückcreate_inventory()- Inventory erstellen mit typisierten Dataclasses → GibtNamedItemResultzurücklist_namespaces()- Namespaces auflisten → Gibtlist[Namespace]zurücklist_inventories()- Inventories auflisten → Gibtlist[Inventory]zurückget_system_info()- System-Informationen → GibtSystemInfozurück
Low-Level API (QuestraDataCore)
Zugriff über client.lowlevel:
inventory.*- Inventory-Operationen (GraphQL)timeseries.*- Zeitreihen-Operationen (REST)queries.*- GraphQL Queriesmutations.*- GraphQL Mutationsexecute_raw()- Rohe GraphQL Query
Beispiele
Siehe:
- example_highlevel_usage.py - High-Level API mit Dataclasses
- example_usage.py - Low-Level API mit Dataclasses und Legacy-API
- example_rest_usage.py - REST API Beispiele
- example_nested_fields.py - Verschachtelte Felder
Dokumentation
- docs/INPUT_DATACLASSES.md - Vollständige Dataclasses-Dokumentation
- PANDAS_DEPENDENCY.md - Warum pandas als optionale Dependency?
- INSTALLATION.md - Detaillierte Installations-Anleitungen
Entwicklung
Setup
# Repository klonen
git clone <repo-url>
cd questra-data
# Dependencies installieren (nutzt .python-version für Python 3.10)
uv sync --all-groups
Hinweis: uv muss installiert sein. Siehe INSTALLATION.md für Details.
Tests
# Alle Tests
uv run pytest
# Mit Coverage
uv run pytest --cov=questra_data
# Nur pandas Tests
uv run pytest tests/test_pandas_integration.py
Requirements
- Python >= 3.10
- gql >= 3.5.0
- requests >= 2.31.0
- loguru >= 0.7.0
- questra-authentication >= 0.1.4
Optional
- pandas >= 2.0.0 (für DataFrame-Unterstützung)
License
Proprietär - Seven2one GmbH
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 seven2one_questra_data-0.7.7.tar.gz.
File metadata
- Download URL: seven2one_questra_data-0.7.7.tar.gz
- Upload date:
- Size: 395.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc0016f3cf2efd2bf4201319c29a3769ca5f0c4a40632a635cccb8c1b513d124
|
|
| MD5 |
4b0aa2bc3a20f08a285ad7ecb6e17090
|
|
| BLAKE2b-256 |
9741309a216d7e94cec4f7f8fa53af9188aacd34f3c0d2383379663cd4e8209a
|
File details
Details for the file seven2one_questra_data-0.7.7-py3-none-any.whl.
File metadata
- Download URL: seven2one_questra_data-0.7.7-py3-none-any.whl
- Upload date:
- Size: 70.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0df44ac28adb957a40ae87bff8ba5de459ccaf16282851682eb3a35dd3531cd
|
|
| MD5 |
be2c0aa61d6dc793c30ae0f197254f42
|
|
| BLAKE2b-256 |
fd2e2ec3acb84cd160991662321b080b81213360c3f85b1063bb60b95d340cf8
|