> For the complete documentation index, see [llms.txt](https://docs.videc.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.videc.de/june5-3.7/web-api/web-api-client-code-beispiele/python-code-beispiele.md).

# Python Code-Beispiele

Die folgenden Code-Beispiele sind mit *Python* gescriptet.

<details>

<summary>01 Authentifizierung</summary>

{% code overflow="wrap" lineNumbers="true" %}

```python
# Zum Testen kann der Portalserver unter https://portal.videc.info verwendet werden

# Um den Fiddler zwischenzuschalten, kann folgende Adresse verwendet werden:
# http://localhost.fiddler:20000/api/v3.6/         oder
# http://rechner-name.fiddler:20000/api/v3.6/

# Dieses Skript authentifiziert sich gegen die JUNE5 API und ruft lediglich ein paar Informationen ab
# Falls "requests" nicht installiert ist: pip install requests

import requests

MyUser = 'admin'
MyPwd = 'admin'
MyBase = "https://portal.videc.info/api/v3.6/"

# Session erstellen
sess = requests.Session()

# Version abrufen
MyVersion = sess.get(f"{MyBase}System/GetVersion").json()
print(f"Folgende JUNE5 Version wird verwendet: {MyVersion}")
print()

# Authentifizierung
Body = {
    'Logon': 'admin',
    'Password': 'admin',
    'LoginType': 0
}

response = sess.post(f"{MyBase}auth/authenticate", data=Body)
MyJUNE5 = response.json()

print()
print(f"001 - Token String    = {MyJUNE5['Token']}")
print()
print(f"002 - Token Identity  = {MyJUNE5['IdentityToken']}")
print()
print(f"003 - Client Uid               = {MyJUNE5['IdentityToken']['ClientUid']}")
print()
print(f"004 - DataSource Read          = {MyJUNE5['IdentityToken']['DataSourceRead']}")
print()
print(f"005 - DataSource Read / Hidden = {MyJUNE5['IdentityToken']['DataSourceRead']['Hidden']}")

print()
print("End")
```

{% endcode %}

</details>

<details>

<summary>02 Authentifizierung und Abrufen der Objektliste</summary>

{% code lineNumbers="true" %}

```python
# Dieses Python Skript authentifiziert sich gegen die JUNE5 API und ruft die Objektliste ab

# Hier: Abruf der Objekte vom Typ "Messgröße Auto" (Code 16)
# Alle Objekte oder nur bestimmte Objekttypen können abgefragt werden
# Zu jedem Objekt können weitere Informationen abgefragt werden.

# SV = Standard View

import requests

# Basis Daten definieren, Konfiguration
MyUser = 'admin'
MyPwd = 'admin'
MyBase = "https://portal.videc.info/api/v3.6/"

# 1. Login und Token holen
MyAuthUrl = f"{MyBase}/auth/authenticate"
payload = {'Logon': MyUser, 'Password': MyPwd}

response = requests.post(MyAuthUrl, data=payload)
response.raise_for_status()  # (Fehler werfen, falls Login fehlschlägt)
MyJ5Auth = response.json()
token = MyJ5Auth.get('Token')

# 2. Daten aus GetList holen
list_url = f"{MyBase}/ViewModel/GetList?viewModelStrongName=SV"
headers = {'June5-Token': token}

data_response = requests.get(list_url, headers=headers)
data_response.raise_for_status()
my_data = data_response.json()

# 3. Daten verarbeiten und filtern
print(f"{'Created':<25} {'DataSourceKey':<40} {'UID':<40} {'UidCreated'}")
print("-" * 120)

for item in my_data:
    # Filter: Nur Objekte vom Typ 16 (z.B. Messgrößen Typ Auto)
    if item.get('ObjectModelType') == 16:
        # Zugriff auf verschachtelte Attribute
        created = item.get('ObjectPermission', {}).get('Created', 'N/A')
        ds_key = (item.get('DataSourceKey') or '').ljust(40)
        uid = item.get('Uid', 'N/A')
        uid_created = item.get('Object', {}).get('UidCreated', 'N/A')

        print(f"{created:<25} {ds_key} {uid:<40} {uid_created}")

print()
print("End")

'''
Verfügbare Spalten
ShortAndLongName           // Kurz und Langname
LongAndShortName           // Lang und Kurzname
ClientUid                  // Mandanten ID
Uid
Name
DataSourceKey              // Eindeutiger "harter" Schlüssel
ParentUid                  // Bei Hierarchien das obere Element (Elternteil)
Object
ObjectModelType            // Siehe unten
ObjectModelItemUid
Items
ItemCount
HierarchyLevel
RootViewUid
DataSourceType             // Siehe unten
SortIndex
ObjectPermission           // Zugriffsrechte



ObjectModelType                 Hex              Dez

None                         0x00000000      0
Custom                         0x00000001      1
Root                         0x00000002      2
Group                         0x00000004      4
DataSource                 0x00000008      8
ProcessVariable                 0x00000010      16
ProcessVariableCalculated     0x00000020      32
ProcessVariableManual         0x00000040      64
Report                         0x00000080      128
Chart                         0x00000100      256
Spare01                         0x00000200      512
View                         0x00000400      1024
DataKindInformation         0x00000800      2048
UrlObject                 0x00001000      4096
PieChart                 0x00002000      8192
CarpetChart                   0x00004000      16384
FrequencyChart                 0x00008000      32768
SankeyChart                 0x00010000      65536
ReportFilter                 0x00020000      131072
DashBoard                 0x00040000      262144
SingleValueObject         0x00080000      524288
GaugeChart                 0x00100000      1048576
TableObject                 0x00200000      2097152
Alarm                         0x00400000      4194304
AlarmTable                 0x00800000      8388608
ReportWidget                 0x01000000      16777216

AggregateQuery                 0x08000000      134217728
TrafficLight                 0x02000000      33554432
ManualValueTable         0x04000000      67108864

// Batch
Batch                         0x10000000      268435456
UnitBatchDefinition         0x20000000      536870912
BatchObject                 0x40000000      1073741824
UnitBatch                 0x80000000      2147483648

// WebReporting
WebReport                 0x1000000000      68719476736
MapMonitor                 0x100000000      4294967296
MapMonitorDynamicTrace         0x200000000      8589934592
MapMonitorStaticTrace         0x400000000      17179869184
MapMonitorStaticPoint         0x800000000       34359738368




DataSourceType = Quellen Typ
None = 0
June5 = 1
Acron = 2
June5Connector = 3
June5BatchConnector = 4
OpcUa = 10
OsiPi = 20
Ge = 30
WinCC = 40
SqlOleDb = 50
Phd = 60
Heb = 70

'''
```

{% endcode %}

</details>

<details>

<summary>03 Authentifizierung und Abrufen von Messwerten für eine Messgröße</summary>

{% code overflow="wrap" lineNumbers="true" %}

```python
# Dieses Python Skript authentifiziert sich gegen die JUNE5 API und ruft
# für eine Variable die Messwertzeitreihen eines definierten Zeitbereiches ab

import requests
import json
import time


# Basisdaten definieren
MyUser = 'admin'
MyPassword = 'admin'
MyBase = "https://portal.videc.info/api/v3.6/"

# Login und Token holen
print("Login")
response = requests.post(
    f"{MyBase}auth/authenticate",
    data={"Logon": MyUser, "Password": MyPassword}
)
MyJUNE5 = response.json()
print(MyJUNE5['Token'])
print()

print("Warte 2 Sekunden")
time.sleep(2)
print()

# Request Payload definieren
ReqPay = {
    'Parameters': [
        {
            'DataSourceKey': 'J5001DE.TA',
            'From': '2025-01-01T00:00:00.000',
            'To': '2025-01-02T01:00:00.000',
            'DataKind': '0',    # 0=Pro, 1=Int1, 2=Int2, ...,20=Day, 50=Week, 51=Month, 52=Year, 300=Manual
            'ValueKind': '0',   # 0=VAL, 5=PMIN, 6=PMAX...
            'Resolution': '0',  # -1, 2000

            # Optionale Parameter:
            # 'ObjectModelStrongName': 'string',
            # 'ObjectModelItemUid': "00000000-0000-0000-0000-000000000000",
            # 'Handle': "00000000-0000-0000-0000-000000000000",
            # 'OrderBy': "true",
            # 'IgnoreNullValues': 'true'
        }
    ]
}

# JSON erstellen
JSON = json.dumps(ReqPay, indent=2)
print("So sieht das JSON Objekt (PayLoad der Anfrage) aus")
print(JSON)
print()

# Abfrage einer Variablen
response = requests.post(
    f"{MyBase}ViewModel/GetProcessVariableListValuesByDataSourceKey",
    headers={
        "June5-Token": MyJUNE5['Token'],
        "Content-Type": "application/json"
    },
    data=JSON
)

# Die gesamte Antwort liegt nun als JSON Objekt vor und kann weiterverarbeitet oder ausgegeben werden
# print(response.json())


MyLists = response.json()
MyObjectList  = MyLists['ObjectList']


print("Hier kommen die Werte:")
for item in MyObjectList:
    for value in item['Values']:
        print(value['Timestamp'], ';', value['Value'])

print()
print("End")
```

{% endcode %}

</details>

<details>

<summary>04 Authentifizierung und Abrufen von Messwerten für mehrere Messgrößen</summary>

{% code overflow="wrap" lineNumbers="true" %}

```python
# Dieses Skript authentifiziert sich gegen die JUNE5 API und ruft die Messwertzeitreihen mehrerer Messgrößen ab
# Hinweis: Der Zeitbereich kann für jede Messgröße unterschiedlich sein

import requests
import time
import json

# Basisdaten definieren
MyUser = 'admin'
MyPwd = 'admin'
MyBase = "https://portal.videc.info/api/v3.6/"

# 1. Login und Token holen
print(f"Login mit: {MyUser}\n")
MyAuthUrl = f"{MyBase}/auth/authenticate"
payload = {"Logon": MyUser, "Password": MyPwd}

response = requests.post(MyAuthUrl, data=payload)
response.raise_for_status()  # Fehler werfen, falls Request fehlschlägt
MyJ5Data = response.json()
token = MyJ5Data.get("Token")
print(f"Token: {token}\n")

# 2. Warten
print(f"Warte 2 Sekunden\n")
time.sleep(2)

# 3. Request Payload definieren (Dictionary in Python)
req_pay = {
    "Parameters": [
        {
            "DataSourceKey": 'J5001DE.TA',
            "From": '2025-01-01T00:00:00.000',
            "To": '2025-01-04T00:00:00.000',
            "DataKind": '0',
            "ValueKind": '0',
            "Resolution": '2000',
            "IgnoreNullValues": 'true'
        },
        {
            "DataSourceKey": 'J5001DE.LD',
            "From": '2025-02-01T00:00:00.000',
            "To": '2025-02-04T00:00:00.000',
            "DataKind": '0',
            "ValueKind": '0',
            "Resolution": '2000'
        }
    ]
}

print(f"So sieht das JSON Objekt der Anfrage aus: \n")
print(json.dumps(req_pay, indent=4))
print()

# 4. Abfrage ausführen
data_url = f"{MyBase}/ViewModel/GetProcessVariableListValuesByDataSourceKey"
headers = {
    "June5-Token": token,
    "Content-Type": "application/json"
}

data_response = requests.post(data_url, headers=headers, json=req_pay)
data_response.raise_for_status()
my_data = data_response.json()

# 5. Ausgabe aller Variablen und Daten
print(f"Ausgabe aller Variablen und den Daten TimeStamp, Value\n")

object_list = my_data.get("ObjectList", [])
total_count = 0

for var in object_list:
    # String-Verkettung (f-Strings ab Python 3.6)
    header = f"{var.get('DataSourceKey')} ({var.get('Name')}) [{var.get('ProcessUnit')}]"
    print(header)

    values = var.get("Values", [])
    for item in values:
        print(f"{item.get('Timestamp')};{item.get('Value')}")
        total_count += 1
    print()

print(f"Anzahl der Werte aller Variablen\n")
print(total_count)
```

{% endcode %}

</details>

<details>

<summary>05 Authentifizierung und Abrufen der Informationen der registrierten Benutzer</summary>

{% code overflow="wrap" lineNumbers="true" %}

```python
# Dieses Python Skript authentifiziert sich gegen die JUNE5 API und
# ruft die Benutzer ab

import requests

# Basisdaten definieren, Konfiguration
MyUser = "admin"
MyPwd = "admin"
MyBase = "https://portal.videc.info/api/v3.6/"

sess = requests.Session()

# Step 1: Login und Token holen
print("Step 1: Login")
r = sess.post(
    f"{MyBase}auth/authenticate",
    data={"Logon": MyUser, "Password": MyPwd, "LoginType": 0},
    timeout=30,
)
r.raise_for_status()
MyJUNE5 = r.json()

Token = MyJUNE5.get("Token")
if not Token:
    raise RuntimeError("Kein Token erhalten (Login fehlgeschlagen oder Response unerwartet)")

print("Token:", Token)
print()

# Step 2: Benutzerliste holen
print("Step 2: Benutzerliste holen")
r = sess.get(
    f"{MyBase}UserAdministration/GetUsers",
    params={"userType": "0"},
    headers={"June5-Token": Token},
    timeout=30,
)
r.raise_for_status()
MyData = r.json()
print()

# Step 3: Ausgabe
print("Step 3: Ausgabe")
print()
print("Anzahl Benutzer:", len(MyData))
print()
print("Logonname; LastName; Firstname; IsEnabled")

for u in MyData:
    print(f"{u.get('Logon')}; {u.get('LastName')}; {u.get('Firstname')}; {u.get('IsEnabled')}"
    )

# Weitere wichtige Felder sind 'Uid' und 'UidCreated' um zu ermitteln wer welches Objekt angelegt oder verändert hat.

print()
print("End")
```

{% endcode %}

</details>

<details>

<summary>06 Authentifizierung und Abrufen eines PDF acron Reports</summary>

{% code overflow="wrap" lineNumbers="true" %}

```python
# Dieses Python Skript authentifiziert sich gegen die JUNE5 API und
# ruft ein PDF Bericht ab
#
# Ablauf:
#   Step 1: Login und Token holen
#   Step 2: Messgrößenliste ermitteln, aber nur Berichtsobjekte (ObjectModelType 128) via GetListPaged (OData)
#   Step 3: Mit einer Report-UID den PDF Stream holen (PrintReportExt) und als Datei speichern
#
# Hinweise:
#   - OData Query-Parameter heißen: $filter, $top, $skip, $orderby
#   - In PowerShell wurde "$" escaped; in Python geben wir die Parameter direkt als keys an
#   - Zusätzlich zum Header-Token wird der Token auch als Query-Parameter june5Token übergeben (wie im PS)

import requests

# Basisdaten definieren
MyUser = "admin"
MyPwd = "admin"
MyBase = "https://portal.videc.info/api/v3.6/"

sess = requests.Session()

# Step 1: Login und Token holen
print("Step 1: Login mit Token")
r = sess.post(
    f"{MyBase}auth/authenticate",
    data={"Logon": MyUser, "Password": MyPwd, "LoginType": 0},
    timeout=30,
)
r.raise_for_status()
MyJUNE5 = r.json()

Token = MyJUNE5.get("Token")
if not Token:
    raise RuntimeError("Kein Token erhalten (Login fehlgeschlagen oder Response unerwartet)")

print("Token:", Token)
print()

headers = {"June5-Token": Token}

# Step 2: GetListPaged -> nur Reports (ObjectModelType 128)
print("Step 2: Messgrößenliste ermitteln, allerdings nur Berichtsobjekte vom Typ 128")
params = {
    "$filter": "ObjectModelType eq Videc.June5.Entities.ObjectModelType'128'",
    "$top": "500",
    "$skip": "0",
    "$orderby": "DataSourceKey asc, Name asc",
}

r = sess.get(
    f"{MyBase}ViewModel/GetListPaged",
    params=params,
    headers=headers,
    timeout=60,
)
r.raise_for_status()
MyData = r.json()

items = MyData.get("Items") or []
print("Gefundene Report-Items:", len(items))
if not items:
    raise RuntimeError("Keine Report-Items gefunden (Items ist leer)")

# UID des ersten Reports (wie im PowerShell Beispiel)
MyPDFReportUID = items[0].get("ObjectModelItemUid")
if not MyPDFReportUID:
    raise RuntimeError("Erstes Item hat keine ObjectModelItemUid")

print("Report UID (erstes Item):", MyPDFReportUID)
print()

# Step 3: PrintReportExt -> PDF Stream holen und als Datei schreiben
print("Step 3: PDF Stream holen und als Datei schreiben")

# Bei PrintReportExt müssen alle Parameter angegeben werden (analog PS)
params = {
    "june5Token": Token,
    "uid": MyPDFReportUID,
    "from": "2022-05-01T00:00:00.000",
    "to": "2022-06-01T00:00:00.000",
    "widthIntervall": "60",
    "filterName": "",
    "isPlantFilter": "true",
}

r = sess.get(
    f"{MyBase}ViewModel/PrintReportExt",
    params=params,
    headers=headers,
    timeout=60,
)
r.raise_for_status()

out_file = "MyReport2.pdf"
with open(out_file, "wb") as f:
    f.write(r.content)

print("PDF gespeichert:", out_file)
print()
print("End")
```

{% endcode %}

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.videc.de/june5-3.7/web-api/web-api-client-code-beispiele/python-code-beispiele.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
