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
  • 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.10.tar.gz (203.8 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.10-py3-none-any.whl (76.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.7.10.tar.gz
  • Upload date:
  • Size: 203.8 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.10.tar.gz
Algorithm Hash digest
SHA256 fbd742427f57dfa9cfc224d356e9568099e8a501139795814a7a7211ec5d149b
MD5 43e36a93fb7c67d8eabf2eed743f3dee
BLAKE2b-256 769dae3b458e3c6dc3dbcc9b915ce0b497468f9fd16d9495ae776832820e2165

See more details on using hashes here.

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.7.10-py3-none-any.whl
  • Upload date:
  • Size: 76.8 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.10-py3-none-any.whl
Algorithm Hash digest
SHA256 ceeeda3195d476359acca48acfeff08da60c312d0dbb4cec9d88b9481bde2247
MD5 dd7d4c06df59fcf1b14f0be87698aa26
BLAKE2b-256 fb1371b589de2ab209e40e1eee96457de98c0e96c7b7b8a67a3b7462be3c483c

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