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 seven2one.questra.authentication import QuestraAuthentication
from seven2one.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 seven2one.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

Proprietary - Seven2one Informationssysteme 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.8.0.tar.gz (178.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.8.0-py3-none-any.whl (65.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.8.0.tar.gz
  • Upload date:
  • Size: 178.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.8.0.tar.gz
Algorithm Hash digest
SHA256 be2cb968eca04a26e5a03f8020794946829af6cdb6e4a97164a6f58e2250ffeb
MD5 92ff26fdb794eb4199a2e45800ec39f9
BLAKE2b-256 1abc33d547411ee6a55fb576c00cd8bcc9a2a8fc423a241daa1133b50d4363d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: seven2one_questra_data-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 65.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.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c44b119dff689cc7681a89d696834f3b854d63a91f4020d6d91a464d9cd45083
MD5 4f8ad5d82c8f51495ad7366d14b975ff
BLAKE2b-256 e107bf63024f1c2979e6ec78e6fd83f689b4c92fedab7244ad0fc3f0d3319b3f

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