Skip to main content

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 Dict
  • list_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 erstellen
  • update() - Items aktualisieren
  • delete() - Items löschen

Verwaltung

  • create_namespace() - Namespace erstellen → Gibt NamedItemResult zurück
  • create_inventory() - Inventory erstellen mit typisierten Dataclasses → Gibt NamedItemResult zurück
  • list_namespaces() - Namespaces auflisten → Gibt list[Namespace] zurück
  • list_inventories() - Inventories auflisten → Gibt list[Inventory] zurück
  • get_system_info() - System-Informationen → Gibt SystemInfo zurück

Low-Level API (QuestraDataCore)

Zugriff über client.lowlevel:

  • inventory.* - Inventory-Operationen (GraphQL)
  • timeseries.* - Zeitreihen-Operationen (REST)
  • queries.* - GraphQL Queries
  • mutations.* - GraphQL Mutations
  • execute_raw() - Rohe GraphQL Query

Beispiele

Siehe:

Dokumentation

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

seven2one_questra_data-0.7.9.tar.gz (198.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

seven2one_questra_data-0.7.9-py3-none-any.whl (72.1 kB view details)

Uploaded Python 3

File details

Details for the file seven2one_questra_data-0.7.9.tar.gz.

File metadata

  • Download URL: seven2one_questra_data-0.7.9.tar.gz
  • Upload date:
  • Size: 198.0 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

Hashes for seven2one_questra_data-0.7.9.tar.gz
Algorithm Hash digest
SHA256 022c20bc1b2738803a2814c5e11f544f015ce5ea65185339f07ee17ab96d5f63
MD5 431f95899ac9fe3b6773cb7ede7c0f66
BLAKE2b-256 52caf21e5ad606ffc6b6b6877b865d5b5b74dae83a11c5f4707c8070b2ac0427

See more details on using hashes here.

File details

Details for the file seven2one_questra_data-0.7.9-py3-none-any.whl.

File metadata

  • Download URL: seven2one_questra_data-0.7.9-py3-none-any.whl
  • Upload date:
  • Size: 72.1 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

Hashes for seven2one_questra_data-0.7.9-py3-none-any.whl
Algorithm Hash digest
SHA256 256f20e3cccb2d49382f6fdcef4090c49155790011c379036670e9338309b393
MD5 3ece4a46bdfe2ae4baab2ae9ee001566
BLAKE2b-256 bed9bf3feb3ca91091e45039c537e7fa3a5ad48093590131143b68b1edf5fab0

See more details on using hashes here.

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