Python Skripte schreiben

Skript-Definition

Wenn ein neues Skript im Eliona-System erstellt wird, wird automatisch ein Funktionsheader generiert. Dieser Header enthält zwei Parameter:

  • id: Die eindeutige ID des Skripts.

  • eliona: Ein Objekt, über das der Benutzer mit dem Eliona-System interagieren kann.

Der Funktionsheader sieht wie folgt aus:

# you may add imports only inside the function
# don't change or delete the function definition
def UserFunction(id, eliona):
	# add your code here

Importieren von Modulen

Alle notwendigen Module müssen innerhalb der Funktion importiert werden. Es ist wichtig, dass Module nur innerhalb der Funktion importiert und keine globalen Importe verwendet werden.

Beispiel:

def UserFunction(id, eliona):
    import random
    # Weitere Codezeilen folgen


Methoden des Eliona-Objekts

Das eliona-Objekt stellt eine Reihe von Methoden zur Verfügung, die es Benutzern ermöglichen, mit dem Eliona-System zu interagieren. Hier sind die wichtigsten Methoden zusammen mit ihren Parametern und Beschreibungen:

Methode
Parameter
Beschreibung

GetHeap

gai: str, subtype: str, attribute: str

Ruft den aktuellen Wert eines Attributs oder das gesamte Daten-JSON eines Assets aus dem Heap ab.

SetHeap

gai: str, subtype: str, data: dict, source: str

Sendet Daten an den Calculator, um sie zu verarbeiten und im Heap zu speichern.

GetAssetIDByGAI

gai: str

Gibt die numerische Asset-ID für die angegebene GAI zurück.

GetAll

`ids: list[int

str], subtype: str`

SQLQuery

query: str

Führt eine beliebige SQL-Abfrage aus und gibt die Ergebnisse als Liste von Tupeln zurück.

MakeSource

id: int

Erzeugt einen Quell-String für Heap-Operationen auf Basis der Function-ID.

OpenFile

name: str, mode: str

Öffnet eine Datei im Eliona-Arbeitsverzeichnis (analog zu Python’s open()).

AddAssetTag

gai: str, tag: str

Fügt einem Asset ein Tag hinzu (falls nicht schon vorhanden).

RemoveAssetTag

gai: str, tag: str

Entfernt ein Tag von einem Asset (falls vorhanden).

GetTrendRecords

asset_id: int, subtype: str, attr: str, begin: datetime

Ruft historische Messwerte als Liste von TrendRecord(ts, value) ab dem angegebenen Zeitpunkt ab.

WriteTrendRecords

asset_id: int, subtype: str, attr: str, `recs: TrendRecord

Schreibt einen oder mehrere TrendRecord-Datensätze ins System.

GetAggregate

agg: Aggregate, asset_id: int, subtype: str, attr: str,raster: str, start: datetime,end: datetime = now()

Berechnet aggregierte Werte (Avg, Sum, Cusum) in festem Raster über einen Zeitraum.

GetLastAggregate

agg: Aggregate, asset_id: int, subtype: str, attr: str, raster: str

Liefert das aktuellste kumulierte Aggregate im gewählten Raster (inkl. last_ts).


Beispielskripte

GetHeap

Beschreibung: Ruft den aktuellen Wert eines Attributs oder das gesamte JSON eines Assets aus dem Heap ab.

Parameter:

  • gai: str (erforderlich) – GAI des Assets, z. B. "K86_WP01"

  • subtype: str (erforderlich) – Daten-Subtyp, z. B. "input"

  • attribute: str (erforderlich) – Attributname, z. B. "Aussentemperatur"

Code-Beispiel:

value = eliona.GetHeap("K86_WP01", "input", "Aussentemperatur")

Beispiel-Output:

23.5

SetHeap

Beschreibung: Sendet ein Wörterbuch von Werten an den Calculator, um sie zu verarbeiten und im Heap zu speichern.

Parameter:

  • gai: str (erforderlich)

  • subtype: str (erforderlich)

  • data: dict (erforderlich) – z. B. {"Aussentemperatur": 23.5}

  • source: str (erforderlich) – typischerweise eliona.MakeSource(id)

Code-Beispiel:

data   = {"Aussentemperatur": 23.5}
source = eliona.MakeSource(id)
eliona.SetHeap("K86_WP01", "input", data, source)

GetAssetIDByGAI

Beschreibung: Gibt die numerische Asset-ID für die angegebene GAI zurück.

Parameter:

  • gai: str (erforderlich)

Code-Beispiel:

asset_id = eliona.GetAssetIDByGAI("K86_WP01")

GetAll

Beschreibung: Ruft alle Datenpunkte eines bestimmten Subtyps für eine Liste von Assets ab und gibt diese als Dictionary zurück (GAI → Daten).

Parameter:

  • ids: list[int|str] (erforderlich) – z. B. ["K86_WP01", 1073]

  • subtype: str (erforderlich)

Code-Beispiel:

all_data = eliona.GetAll(["K86_WP01"], "input")

SQLQuery

Beschreibung: Führt eine beliebige SQL-Abfrage aus und gibt die Ergebnisse als Liste von Tupeln zurück.

Parameter:

  • query: str (erforderlich)

Code-Beispiel:

res = eliona.SQLQuery(
    "SELECT data->>'Aussentemperatur' "
    "FROM public.heap "
    "WHERE gai='K86_WP01' AND subtype='input' "
    "ORDER BY timestamp DESC LIMIT 1;"
)

Beispiel-Output:

[('23.5',)]

MakeSource

Beschreibung: Erzeugt einen Quell-String (z. B. "ssr:123") für Heap-Operationen basierend auf der Function-ID.

Parameter:

  • id: int (erforderlich)

Code-Beispiel:

pythonKopierenBearbeitensrc = eliona.MakeSource(id)

OpenFile

Beschreibung: Öffnet eine Datei im Eliona-Arbeitsverzeichnis (analog zu Python’s open()).

Parameter:

  • name: str (erforderlich) – Dateiname, z. B. "log.txt"

  • mode: str (erforderlich) – z. B. "w", "r"

Code-Beispiel:

pythonKopierenBearbeitenf = eliona.OpenFile("aussentemp_log.txt", "w")
f.write("Temperatur: 23.5\n")
f.close()

AddAssetTag

Beschreibung: Fügt einem Asset ein Tag hinzu, wenn es noch nicht zugewiesen ist.

Parameter:

  • gai: str (erforderlich)

  • tag: str (erforderlich)

Code-Beispiel:

eliona.AddAssetTag("K86_WP01", "has-aussentemp")

RemoveAssetTag

Beschreibung: Entfernt ein Tag von einem Asset, falls vorhanden.

Parameter:

  • gai: str (erforderlich)

  • tag: str (erforderlich)

Code-Beispiel:

eliona.RemoveAssetTag("K86_WP01", "has-aussentemp")

GetTrendRecords

Beschreibung: Lädt eine Liste historischer Messwerte (TrendRecord(ts, value)) ab dem angegebenen Start-Zeitpunkt.

Parameter:

  • asset_id: int (erforderlich)

  • subtype: str (erforderlich)

  • attr: str (erforderlich)

  • begin: datetime (erforderlich)

Code-Beispiel:

from datetime import datetime, timedelta

aid   = eliona.GetAssetIDByGAI("K86_WP01")
begin = datetime.now() - timedelta(hours=1)
records = eliona.GetTrendRecords(aid, "input", "Aussentemperatur", begin)

WriteTrendRecords

Beschreibung: Schreibt einen oder mehrere TrendRecord-Datensätze ins System.

Parameter:

  • asset_id: int (erforderlich)

  • subtype: str (erforderlich)

  • attr: str (erforderlich)

  • recs: TrendRecord | list[TrendRecord] (erforderlich)

Code-Beispiel:

from datetime import datetime, timedelta
import eliona_types

aid = eliona.GetAssetIDByGAI("K86_WP01")
now = datetime.now()
r1  = eliona_types.TrendRecord(now, 18.7)
r2  = eliona_types.TrendRecord(now + timedelta(minutes=30), 19.2)
eliona.WriteTrendRecords(aid, "input", "Aussentemperatur", [r1, r2])

GetAggregate

Beschreibung: Berechnet aggregierte Werte (Durchschnitt, Summe, kumulative Summe) in festem Raster über einen Zeitraum.

Parameter:

  • agg: Aggregate (erforderlich) – z. B. eliona_types.Aggregate.Avg

  • asset_id: int (erforderlich)

  • subtype: str (erforderlich)

  • attr: str (erforderlich)

  • raster: str (erforderlich) – ISO 8601-Duration, z. B. "PT1H" für stündlich

  • start: datetime (erforderlich)

  • end: datetime (optional, default: now())

Code-Beispiel:

from datetime import datetime, timedelta
import eliona_types

aid   = eliona.GetAssetIDByGAI("K86_WP01")
end   = datetime.now()
start = end - timedelta(days=1)
aggs  = eliona.GetAggregate(
    eliona_types.Aggregate.Avg,
    aid, "input", "Aussentemperatur",
    "PT1H", start, end
)

Beispiel-Output-Struktur:

[
  TrendAggregate(ts=<datetime>, cnt=<int>, avg=<float>,
                 sum=<float>, first=<float>,
                 min=<float>, max=<float>, last=<float>),
  ...
]

GetLastAggregate

Beschreibung: Gibt das aktuellste kumulierte Aggregate im gewählten Raster zurück (inklusive last_ts).

Parameter:

  • agg: Aggregate (erforderlich)

  • asset_id: int (erforderlich)

  • subtype: str (erforderlich)

  • attr: str (erforderlich)

  • raster: str (erforderlich)

Code-Beispiel:

import eliona_types

aid  = eliona.GetAssetIDByGAI("K86_WP01")
last = eliona.GetLastAggregate(
    eliona_types.Aggregate.Cusum,
    aid, "input", "Aussentemperatur", "P1D"
)

Beispiel-Output-Struktur:

RunningAggregate(
  ts=<datetime>, cnt=<int>, avg=<float>,
  sum=<float>, first=<float>,
  min=<float>, max=<float>, last=<float>,
  last_ts=<datetime>
)

Einfaches Skript zur Manipulation von Daten

Dieses Beispiel zeigt, wie ein Skript einen zufälligen Wert generiert und diesen in den Heap eines Assets schreibt:

def UserFunction(id, eliona):
    import random

    data = {
        "power_val": random.randint(10, 100)
    }

    eliona.SetHeap("TestInactIn", "input", data, eliona.MakeSource(id))

Beschreibung:

  • Das Skript importiert das Modul random.

  • Es wird ein Wörterbuch data erstellt, das einen Schlüssel power_val enthält, dem ein zufälliger Wert zwischen 10 und 100 zugewiesen wird.

  • Der generierte Wert wird mit der Methode SetHeap in den Heap des Assets TestInactIn geschrieben.


Daten abrufen und modifizieren

In diesem Beispiel wird der Wert eines Attributs von einem Asset abgerufen, modifiziert und in einem anderen Asset gespeichert:

def UserFunction(id, eliona):
    from datetime import datetime

    heap = eliona.GetHeap("TestInactIn", "input")

    data = {
        "energy_val": heap["power_val"] * 3
    }

    eliona.SetHeap("TestInactIn", "input", data, eliona.MakeSource(id))

Beschreibung:

  • Das Skript importiert das Modul datetime.

  • Der aktuelle Wert des Attributs power_val wird aus dem Heap des Assets TestInactIn abgerufen.

  • Dieser Wert wird verdreifacht und als energy_val in dasselbe Asset geschrieben.


Erweiterte Funktionen und SQL-Abfragen

Mit der Methode SQLQuery können beliebige SQL-Abfragen direkt aus dem Skript heraus ausgeführt werden:

def UserFunction(id, eliona):
    result = eliona.SQLQuery("SELECT * FROM public.asset WHERE gai = 'TestInactIn';")
    # Weitere Verarbeitung des Ergebnisses

Beschreibung:

  • Die SQL-Abfrage ruft alle Informationen zu dem Asset mit der GAI TestInactIn ab.

  • Das Ergebnis kann anschließend weiterverarbeitet werden.

Last updated

Was this helpful?