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.6.tar.gz (397.3 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.6-py3-none-any.whl (70.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.7.6.tar.gz
  • Upload date:
  • Size: 397.3 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.6.tar.gz
Algorithm Hash digest
SHA256 7989c096551b0f03196f593feb8460faf37b81be214544e2f3b43979001e8bd4
MD5 ee4376334378aba37465af1b9d546f47
BLAKE2b-256 5a726a5e8b1d85517bf47148843e341994b39083efd4abaa9e9dccf668fd33cc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.7.6-py3-none-any.whl
  • Upload date:
  • Size: 70.5 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.6-py3-none-any.whl
Algorithm Hash digest
SHA256 60cb8b80cf1b97e0c853e6c675a02465c9719d0c55cd719d6f177776d7f5dbcd
MD5 4899ce6440708531e96497d23c6e9f3a
BLAKE2b-256 7a4bac08bd1a1b6080c8ffb22b77a5b99274b7079303bfdb705ea9593b9077a2

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