Übersicht MCP-Server (KI-Schnittstelle)


Das Studio enthält einen integrierten MCP-Server (Model Context Protocol). Damit können KI-Assistenten wie Claude Code, Claude Desktop oder ChatGPT direkt auf ein geöffnetes Projekt zugreifen und es bearbeiten — Seiten anlegen, Widgets platzieren, Funktionsbausteine verbinden, Adressen verwalten und vieles mehr.

Der MCP-Server läuft nur im Studio-Modus (nicht in der App) und lauscht lokal auf einem konfigurierbaren TCP-Port. Er unterstützt zwei HTTP-Transporte:

Für die meisten KI-Clients wird ein mitgeliefertes Python-Proxy-Skript als Brücke verwendet (stdio ↔ HTTP), da nicht alle Clients HTTP-MCP-Server direkt unterstützen.


Der MCP-Server im Studio


Einstellungen

Die MCP-Server-Einstellungen finden Sie unter Extras → Einstellungen → Tab „Allgemein“.

Einstellung Beschreibung
MCP-Server Port TCP-Port des Servers. Standardwert: 7420. Wert 0 = MCP-Server deaktiviert. Änderungen werden erst nach einem Neustart des Studios wirksam.
MCP-Server Debug Schaltet die Debug-Protokollierung ein oder aus. Bei Einstellung An werden alle eingehenden Verbindungen, Methoden- und Werkzeugaufrufe mit qInfo() im Anwendungsprotokoll ausgegeben. Die Einstellung ist sofort wirksam — kein Neustart erforderlich.


Verfügbare Werkzeuge

Der MCP-Server stellt insgesamt 107 Werkzeuge in 17 Gruppen bereit:

  1. Basisoperationen (18)
  2. Widget-Detail & Adressen (5)
  3. Funktionsbaustein-Detail & Update (4)
  4. FB-Verbindungen (3)
  5. Adressverwaltung & IO-Zuweisung (8)
  6. Modbus Master (6)
  7. Hilfe-Abruf (2)
  8. Block Uhr – Schaltzeiten (7)
  9. Bedienelemente – Schaltzeiten, Anwesenheitssimulation & Einstellungen (11)
  10. Verbindungen zur Steuerung (5)
  11. Laufzeit-Steuerung (8)
  12. Steuerungsverbund (5)
  13. Diagnose (3)
  14. Aufzeichnungen (4)
  15. Lua Script (2)
  16. Styles & Bilder (9)
  17. Projekt-Generator & Raumelemente (7)

Gruppe 1: Basisoperationen (18 Werkzeuge)

Werkzeug Beschreibung
get_project_info Dateiname, Version und Zeitstempel des Projekts sowie die Anzahl der Visualisierungs- und Programmseiten abrufen
list_widget_pages Alle Visualisierungsseiten auflisten. Mit include_summary=true werden Widget-Typen je Seite aggregiert (spart nachgelagerte get_widget_page-Aufrufe).
get_widget_page Details einer Visualisierungsseite inkl. aller Widgets abrufen
add_widget_page Neue Visualisierungsseite erstellen (Name, Breite, Höhe, Orientierung). Mit header_footer=true entstehen zugleich Kopf- und Fußzeile wie beim Projekt-Generator; über back_page_guid springt die Kopfzeile auf die übergeordnete Seite zurück.
delete_widget_page Visualisierungsseite löschen
add_widget Widget auf einer Seite platzieren. Standardgröße wird automatisch typ-spezifisch gesetzt (z. B. 144×144 für Block-Widgets, 152×40 für Text-Widgets). w/h nur angeben um davon abzuweichen.
update_widget Position, Größe und Parameter eines Widgets ändern
delete_widget Widget löschen
list_fb_pages Alle Programmseiten (Funktionsbausteinseiten) auflisten. Mit include_summary=true werden FB-Typen je Seite aggregiert (spart nachgelagerte get_fb_page-Aufrufe).
get_fb_page Details einer Programmseite inkl. aller Funktionsbausteine abrufen
add_fb_page Neue Programmseite erstellen
add_function_block Funktionsbaustein auf einer Programmseite platzieren. Unterstützt der Bausteintyp „Variablen generieren“, werden die KNX-Adressen gleich mit erzeugt (abschaltbar mit auto_generate_addresses=false).
delete_function_block Funktionsbaustein löschen
list_addresses KNX-Adresshierarchie abrufen. Bei großen Projekten die Antwort eingrenzen: filter (Suchbegriff im Kommentar), main_group und middle_group.
save_project Projekt auf Festplatte speichern
open_project Projekt von der Festplatte öffnen (Pfad zur .zpro-Datei)
save_project_as Projekt unter neuem Dateinamen speichern (Speichern unter)
new_project Neues Projekt anlegen und öffnen — entspricht Datei → Neu, nur mit dem Dateinamen als Parameter. Erzeugt eine erste Programmseite, zwei Visualisierungsseiten (hoch und quer) und eine Vorgabe-Verbindung (connection_ip, Standard 172.31.1.100). Eine vorhandene Datei wird nur mit overwrite=true überschrieben.

Gruppe 2: Widget-Detail & Adressen (5 Werkzeuge)

Werkzeug Beschreibung
get_widget_detail Vollständige Widget-Daten abrufen: alle Parameter mit Kommentar, Tooltip, Wert und Typ sowie alle IO-Adressen. Die Parameter, die eine Grafik aufnehmen, stehen zusätzlich in image_params – mit der Angabe, ob die Grafik im Projekt vorhanden ist. Beim Bedienelement „Grafik dynamisch“ kommt die Grafikliste als dynamic_images.
set_widget_addresses KNX-Adresse für einen Widget-IO-Slot setzen (Index, Hauptgruppe, Mittelgruppe, Untergruppe)
get_widget_type_info Name und Parameterliste eines Widget-Typs abrufen (statische Information)
list_widget_types Vollständige Liste aller bekannten Widget-Typen mit Dezimalwert, Hex-Wert und Bezeichnung ausgeben. Vor jedem add_widget-Aufruf verwenden, um den korrekten Typ-Wert zu ermitteln.
connect_widget_to_fb Verknüpft ein Block-Widget mit einem Funktionsbaustein. Setzt automatisch den FB-GUID-Parameter am richtigen Param-Index (typ-abhängig: P3 für die meisten Widget_Block_*-Typen, P4/P5/P7/P10/P16 für Ausnahmen). Einfacher als manuelles Setzen über update_widget mit params-Array. sync_label=true: Widget-Beschriftung (Param 0) wird automatisch aus dem FB-Kommentar übernommen — spart nachträgliche update_widget-Aufrufe.

Gruppe 3: Funktionsbaustein-Detail & Update (4 Werkzeuge)

Werkzeug Beschreibung
get_fb_detail Vollständige FB-Daten abrufen: GUID, Typ, Typname, Kommentar, Position, Parameter sowie Eingänge und Ausgänge mit Verbindungsstatus und Adressen
update_fb Position, Kommentar und Parameter eines Funktionsbausteins ändern
get_fb_type_info Name eines FB-Typs anhand seines numerischen Typwerts abrufen
list_fb_types Vollständige Liste aller bekannten FB-Typen mit Dezimalwert, Hex-Wert und Bezeichnung ausgeben. Vor jedem add_function_block-Aufruf verwenden, um den korrekten Typ-Wert zu ermitteln (z. B. Modbus Master = 1917 = 0x077d).

Gruppe 4: FB-Verbindungen (3 Werkzeuge)

Werkzeug Beschreibung
connect_fb_io Ausgang eines Funktionsbausteins mit dem Eingang eines anderen verbinden. Interne Verbindungen benötigen keine KNX-Adresse — sie werden über eine gemeinsame interne Kennung verknüpft.
disconnect_fb_io Verbindung an einem FB-Eingang oder -Ausgang trennen
list_fb_connections Alle internen und externen Verbindungen einer Programmseite auflisten

Gruppe 5: Adressverwaltung & IO-Zuweisung (8 Werkzeuge)

Werkzeug Beschreibung
create_address Neue KNX-Adresse in der Adressliste anlegen (Haupt-, Mittel- und Untergruppe, Kommentar, Datentyp). Fehlende übergeordnete Gruppen werden automatisch erstellt.
update_address Kommentar oder Datentyp einer bestehenden Adresse ändern
delete_address Adresse aus der Adressliste entfernen
assign_fb_io_address KNX-Adresse einem FB-Eingang oder -Ausgang zuweisen. Für mehrere Zuweisungen an einem FB: assign_fb_io_addresses_batch verwenden.
assign_fb_io_addresses_batch Mehrere KNX-Adressen in einem einzigen API-Call zuweisen. assignments-Array mit je io_type, io_index, main, middle, sub. Bis zu 10× schneller als Einzelaufrufe bei typischen Konfigurationsaufgaben (z. B. 4 Adressen je FB → 1 statt 4 Calls). Rückgabe: total, succeeded, errors.
ui_navigate Navigiert die Studio-Anzeige zur angegebenen Seite und synchronisiert Sidebar-Navigation und Tab-Anzeige. Behebt den Bug, dass nach MCP-Aufrufen Seitenanzeige und Navigation auseinanderlaufen können. Erkennt automatisch ob FB-Seite oder Widget-Seite. Rückgabe: found, page_type_detected.
import_knx_addresses KNX-Gruppenadressen aus einer ESF- oder XML-Datei (ETS-Export) importieren. Eingabe: file_path (lokaler Pfad) oder file_content (Dateiinhalt als String — kein Dateizugriff nötig, ideal für Sandbox-Umgebungen). Format wird automatisch erkannt. Optionen: keep_type, keep_comment, import_new_only, connected_addresses, uncertain_1byte/2byte/4byte. Rückgabe: imported, updated, skipped, total.
generate_fb_addresses Erzeugt automatisch KNX-Adressen für einen Funktionsbaustein und weist sie dessen Ein-/Ausgängen zu — entspricht dem Button „Variablen generieren“ im Studio. Funktioniert für alle Block-FBs (Licht, Jalousie, Schalter, Szene, RGBW, …) sowie viele Common- und Heizungs-FBs. conflict_mode: "append" (Standard) = nächste freie Mittelgruppe, "overwrite" = bestehende Adressen überschreiben. Rückgabe: has_generate_variable, addresses_created.

Gruppe 6: Modbus Master (6 Werkzeuge)

Werkzeug Beschreibung
get_modbus_master_config Konfiguration und Register eines Modbus-Master-Bausteins lesen. Unterstützt Paginierung: Parameter offset und limit für große Konfigurationen (>50 Register). Jedes Register enthält datatype (lesbarer Enum: INT16/UINT16/INT32/UINT32/FLOAT32) und word_count (Anzahl 16-bit Worte).
set_modbus_master_config Allgemeine Konfigurationsparameter ändern (Node-ID, Protokoll, IP-Adresse, Port, Timeout …). address_offset wird zu jeder Registeradresse addiert. Konvention: Adressen sind 0-basiert (FC3/FC4 Adresse 0 = Geräte-Adresse 40001/30001). Für 1-basierte Geräte: address_offset=-1.
set_modbus_master_registers Komplette Register-Liste ersetzen. Empfehlung: datatype als String-Enum angeben (INT16/UINT16/INT32/UINT32/FLOAT32) – setzt word_count, signed und interne Typen automatisch. factor akzeptiert Dezimalwerte (z. B. 0.01). Rückgabe enthält warnings-Array mit automatischen Korrekturen.
add_modbus_master_register Ein einzelnes Register hinzufügen. Lesen oder Schreiben wird über function_code festgelegt (3/4 = lesen, 6/16 = schreiben). write_mode bestimmt nur, wann ein Schreib-Register gesendet wird: 0 = bei Änderung, 1 = beim Start und bei Änderung, 2 = zyklisch.
update_modbus_master_register Ein bestehendes Register aktualisieren (nur angegebene Felder werden geändert). Unterstützt ebenfalls datatype-Kurzform und write_mode.
delete_modbus_master_register Ein Register aus der Liste entfernen. Die Ausgangs-IOs werden automatisch angepasst.

Gruppe 7: Hilfe-Abruf (2 Werkzeuge)

Werkzeug Beschreibung
list_help_topics Alle verfügbaren Hilfe-Themen auflisten. Gibt Topic-IDs zurück, die mit get_help abgerufen werden können. Themen sind nach Kategorie gegliedert: program/fb_xxx für Funktionsbausteine, visu/widget_xxx für Widgets, common/variable für Datentypen usw. Optionaler Parameter: language (de oder en).
get_help Hilfe-Seite als Klartext abrufen. Entweder eine topic-ID (z. B. program/fb_modbus_master) angeben, oder über fb_guid / widget_guid einen bereits platzierten Baustein referenzieren – dann wird der zugehörige Hilfetext automatisch über onProcesssHelp() bzw. urlHelpBrowser() ermittelt. Optionaler Parameter: language.

Gruppe 8: Block Uhr – Schaltzeiten (7 Werkzeuge)

Die Block-Uhr-Werkzeuge lesen und schreiben die Schaltzeiten eines Block-Uhr-Funktionsbausteins. Voraussetzung: Ein Widget_Block_Clock muss auf einer Visualisierungsseite mit dem Baustein verbunden sein (fb_guid = GUID des verknüpften Bausteins). Die Schaltzeiten werden ausschließlich in der Runtime gespeichert — die Schaltzeit-Werkzeuge erfordern daher eine Verbindung zur Runtime und holen vor jeder Änderung den aktuellen Stand von dort.

Werkzeug Beschreibung
get_block_clock_schedules Alle Schaltzeiteinträge eines Block-Uhr-FB lesen. Gibt schedules (Liste), count, brightness_active und brightness_inactive zurück. Jeder Eintrag enthält: type (week / date / astro), hour, minute, value, days_sun/mon/tue/wed/thu/fri/sat, day, month, single_shot, brightness (always / day / night), astro_type, astro_offset, switch_mode (value / active).
set_block_clock_schedules Gesamte Schaltzeiten-Liste eines Block-Uhr-FB ersetzen. Alle bisherigen Einträge werden gelöscht. Optional: brightness_active und brightness_inactive setzen (Standard 1000 / 100). Maximum: 128 Einträge.
add_block_clock_schedule Einen neuen Schaltzeitseintrag am Ende der Liste hinzufügen. Pflichtfelder: fb_guid, type, hour, minute, value.
update_block_clock_schedule Einen bestehenden Schaltzeitseintrag anhand seines Index (0-basiert) aktualisieren. Nur angegebene Felder werden geändert.
delete_block_clock_schedule Einen Schaltzeitseintrag anhand seines Index (0-basiert) löschen.
get_block_clock_steps Stufen-Liste eines Block-Uhr-Widgets lesen (Parameter „Stufen“, nur bei Typ = Stufe relevant). Liefert steps als Liste von {value, caption}value ist der Schaltwert (z. B. 1), caption die Beschriftung (z. B. Komfort).
set_block_clock_steps Gesamte Stufen-Liste eines Block-Uhr-Widgets ersetzen. steps ist eine Liste von Objekten mit value und caption, z. B. [{"value":"1","caption":"Komfort"},{"value":"2","caption":"Nacht"}].

Gruppe 9: Bedienelemente – Schaltzeiten, Anwesenheitssimulation & Einstellungen (11 Werkzeuge)

Diese Werkzeuge wirken auf die Einstellungen im Bedienelement (Licht, Dimmer, Jalousie, Schalter, Anwesenheit, Szene, Raumregler, Beregnung und weitere) — nicht auf das eigenständige Uhr-Widget der Gruppe 8. Referenziert wird immer über die fb_guid des Funktionsbausteins. Die Werte liegen nur in der Runtime; alle Werkzeuge erfordern daher eine Verbindung zur Runtime. Im uniPRO Portal erscheint eine Änderung erst mit dem nächsten Zyklus (bis zu 60 Sekunden).

Achtung Wochentage: Hier werden die Tage als Liste days angegeben (1 = Montag … 7 = Sonntag), bei den Block-Uhr-Werkzeugen der Gruppe 8 dagegen über die Felder days_mondays_sun.

Werkzeug Beschreibung
get_block_element_schedules Alle Schaltzeiten eines Bedienelements lesen. Liefert element_type, value_semantics (Bedeutung der Schaltwerte bei diesem Bausteintyp), count, max_count und schedules. Felder eines Eintrags: time (HH:MM), days, values (Rohwerte) oder alternativ action (on/off/dim/mode) mit value, mode und lamella, enabled, type (week/astro/date), astro, astro_offset, date_day, date_month, date_action, single_shot, states (Freigabe je Hausmodus) und brightness_condition (always/day/night).
set_block_element_schedules Komplette Schaltzeiten-Liste eines Bedienelements ersetzen (maximal 32 Einträge). Alle bisherigen Einträge werden gelöscht.
add_block_element_schedule Einen Schaltzeiteintrag am Ende der Liste hinzufügen (maximal 32 Einträge). Nicht angegebene Felder erhalten Standardwerte: alle Wochentage, 00:00, Typ week, aktiv.
update_block_element_schedule Einen bestehenden Schaltzeiteintrag anhand seines Index (0-basiert) ändern. Nur angegebene Felder werden geändert.
delete_block_element_schedule Einen Schaltzeiteintrag anhand seines Index (0-basiert) löschen.
get_block_element_presence Anwesenheitssimulation eines Bedienelements lesen. Schalter, Dimmer, Tunable White und Farblicht liefern active, only_dark, begin, end, count und duration_minutes; die Jalousie active, begin, end, count, position und position_off. active ist ein Objekt {present, absent, vacation}.
set_block_element_presence Anwesenheitssimulation eines Bedienelements ändern. Teil-Updates sind erlaubt: fehlende Felder bleiben unverändert.
get_block_element_settings Einstellungen eines Bedienelements lesen: maintenance_hours (Betriebsstunden-Grenze für die Wartungsmeldung, 0 = inaktiv), brightness_thresholds und state_values — die Werte, die beim Wechsel des Hausmodus geschaltet werden. Beim Raumregler zusätzlich frost (Frostschutztemperatur bei offenem Fenster) und saved_values (die fünf Schnellwahl-Sollwerte). Die Beschattungsautomatik der Jalousie ist nicht enthalten.
set_block_element_settings Einstellungen eines Bedienelements ändern. Teil-Updates sind erlaubt: fehlende Felder bleiben unverändert.
get_irrigation_programs Programme der Block Beregnung lesen: je Programm Name, aktiv, Tagesmodus, Intervall, Saisonfenster, Faktor, Wetterberücksichtigung und die Laufzeit je Zone in Minuten (0 = Zone gehört nicht zum Programm). Dazu die Zonennamen, der Saisonfaktor, die zwölf Monatswerte und das Ende einer laufenden Regenverzögerung. Die Startzeiten liefert get_block_element_schedules.
set_irrigation_programs Programme der Block Beregnung ändern. Teil-Updates sind erlaubt: nur genannte Programme (je Eintrag mit Index) und nur genannte Felder werden geändert. Außerdem lassen sich Zonennamen, Saison- und Monatswerte, Regenverzögerung und Wettermodell setzen. Über manual wird der Handbetrieb ausgelöst — der Befehl wird genau einmal ausgeführt.

Gruppe 10: Verbindungen zur Steuerung (5 Werkzeuge)

Diese Werkzeuge verwalten die im Projekt hinterlegten Verbindungen, über die das Studio (und connect_runtime) die Steuerung erreicht. Nach einer Änderung muss das Projekt gespeichert werden, damit sie erhalten bleibt.

Werkzeug Beschreibung
list_connections Verbindungen des Projekts mit Index, Name, IP-Adresse bzw. VPN-Mail auflisten und angeben, welche ausgewählt ist. Kennwörter werden nicht ausgegeben.
add_connection Verbindung anlegen und auswählen — entspricht dem Verbindungsassistenten. Im örtlichen Netz genügt ip; für eine VPN-Verbindung vpn=true und vpn_email. Ohne password gilt das Standardkennwort der Steuerung.
update_connection Vorhandene Verbindung anhand ihres Index ändern. Nicht genannte Felder bleiben unverändert.
delete_connection Verbindung aus dem Projekt entfernen. Die Auswahl wandert mit, sodass danach weiterhin eine gültige Verbindung ausgewählt ist.
select_connection Auswählen, über welche Verbindung connect_runtime arbeitet — entspricht Online → Verbindung auswählen. Wahlweise über index oder name.

Gruppe 11: Laufzeit-Steuerung (8 Werkzeuge)

Diese Werkzeuge bauen die Verbindung zur Runtime auf, übertragen das Programm und senden Werte direkt an die verbundene Runtime (z. B. Licht schalten, Dimmen, Solltemperatur setzen). Voraussetzung: PT2020-Studio ist über die Netzwerkverbindung mit einer laufenden Runtime verbunden. Die Adressen finden sich im Werkzeug list_addresses (Felder main, middle, sub).

Werkzeug Beschreibung
connect_runtime Verbindung zur Runtime über die ausgewählte Verbindung des Projekts aufbauen (entspricht Verbinden / F11, aber ohne Fortschrittsdialog) oder mit connect=false trennen. Wartet bis zu timeout_seconds (Standard 10) auf das Ergebnis. Rückgabe: connected, connection, target, vpn.
set_play_mode Zwischen Bearbeitungs- und Bedienmodus umschalten — entspricht dem Play-Button (F5). Beim Einschalten wird ein geändertes Programm zur verbundenen Runtime übertragen und gestartet; erst dann laufen neu angelegte Funktionsbausteine. force_transfer=true überträgt Programm und Adressliste auch ohne erkannte Änderung. Ohne Runtime-Verbindung wird nur der Modus umgeschaltet.
get_play_mode Liest, ob der Bedienmodus aktiv ist und ob eine Verbindung zur Runtime besteht.
write_project_to_controller Projekt als Bootprojekt auf die verbundene Steuerung schreiben (entspricht Projekt auf Steuerung schreiben). Nötig für alles, was zu den Projektdaten gehört, z. B. die Steuerungsliste oder die Aufzeichnungen — set_play_mode überträgt nur Programm und Adressliste in den Arbeitsspeicher. Das Projekt auf der Steuerung wird dabei ersetzt.
get_presence_mode Hausmodus der Steuerung lesen: present (Anwesend, 0), absent (Abwesend, 1) oder vacation (Urlaub, 2). Der Hausmodus bestimmt, welche Schaltzeiten auslösen, ob die Anwesenheitssimulation läuft und welche Zustandswerte geschaltet werden. Enthält das Projekt kein Bedienelement, ist available false.
set_presence_mode Hausmodus der Steuerung umschalten — entweder mode (present/absent/vacation) oder value (0/1/2). Wirkt wie eine Bedienung am Bedienelement Anwesenheit. Erfordert eine Verbindung zur Runtime.
set_address_value Sendet einen Wert an eine KNX-Gruppenadresse der verbundenen Runtime. Parameter: main, middle, sub, value (0/1 für Schalten, 0–100 für Dimmen, Gradzahl für Temperatur). Gibt eine Warnung aus wenn die Runtime nicht verbunden ist; der Wert wird dann lokal gespeichert.
get_address_value Liest den zuletzt empfangenen oder gesetzten Wert einer KNX-Gruppenadresse. Liefert value (numerisch), value_str (lesbar), comment und datatype.

Das Werkzeug list_addresses gibt zusätzlich die Felder value und value_str je Adresse aus, sodass der aktuelle Zustand aller Adressen auf einen Blick sichtbar ist.


Gruppe 12: Steuerungsverbund (5 Werkzeuge)

Ein Projekt kann auf mehreren Steuerungen laufen. Die Steuerungsliste und die Zuordnung der Programmseiten gehören zu den Projektdaten und wirken erst nach write_project_to_controller.

Werkzeug Beschreibung
get_controller_list Steuerungsliste des Projekts lesen. Rückgabe: controllers, count, main_index, project_generation.
set_controller_list Steuerungsliste des Projekts ersetzen. Eine leere Liste macht daraus wieder ein gewöhnliches Ein-Steuerungs-Projekt. Genau eine Steuerung trägt is_main — sie führt alle Seiten aus, die keiner bestimmten Steuerung zugeordnet sind; fehlt die Angabe, wird die erste dazu gemacht.
set_fb_page_controller Festlegen, welche Steuerung eine Programmseite ausführt (page_guid, controller_index aus der Steuerungsliste). Eine Seite läuft immer auf genau einer Steuerung. Die aktuelle Zuordnung zeigt list_fb_pages unter controller_index.
get_controller_status Lebendbild des Verbunds von der verbundenen Steuerung abfragen: je Steuerung Zustand (verbunden, nicht erreichbar, Standby …), Sekunden seit der letzten Meldung, Runtime-Version, Projektstand (generation) und Ergebnis der letzten Projektverteilung. Eine kleinere generation heißt, dass die Steuerung beim Einspielen nicht erreichbar war — sie holt das Projekt beim nächsten Verbinden selbst nach.
set_controller_index Eigene Nummer der verbundenen Steuerung setzen oder ohne index nur abfragen. Die Nummer wird auf der Steuerung gespeichert, nicht im Projekt; 0 bedeutet „keine Nummer“ — die Steuerung führt dann nichts aus, sobald das Projekt eine Steuerungsliste enthält. Mit target wird die Nummer einer anderen Steuerung des Verbunds gesetzt; die Anfrage läuft über die verbundene Steuerung.

Gruppe 13: Diagnose (3 Werkzeuge)

Werkzeug Beschreibung
get_diagnostic_messages Diagnosemeldungen der verbundenen Steuerung lesen — dieselben Zeilen wie in der Diagnoseanzeige des Studios. Kanäle: messages, errors, telegrams, knx, modbus_master, modbus_slave, mqtt, mbus, m2020, can. Optionen: max (Standard 100), filter, wait_seconds (bis zu 30 s auf eine passende Zeile warten), clear. Rückgabe: columns, rows, matched, total.
set_diagnostic_capture Diagnosekanal an der Steuerung freigeben oder abschalten. Meldungen und Fehler kommen immer; alle anderen Kanäle sendet die Steuerung erst nach der Freigabe. all behandelt alle Kanäle auf einmal. Üblicher Ablauf: freigeben, Aktion auslösen, get_diagnostic_messages mit wait_seconds lesen, wieder abschalten.
set_debug_level Ausführlichkeit der Meldungen der Steuerung einstellen: 0 = nur wichtige Meldungen, 1 = alle Meldungen. Gilt bis zum Neustart der Steuerung; dauerhaft wird der Wert in pt2020rt.cfg unter debug_level gesetzt.

Gruppe 14: Aufzeichnungen (4 Werkzeuge)

Diese Werkzeuge bearbeiten die Aufzeichnungen des Projekts (Menü Aufzeichnung). Sie gehören zu den Projektdaten und wirken auf der Steuerung erst nach write_project_to_controller.

Werkzeug Beschreibung
get_statistic_recordings Aufzeichnungen auflisten: je Eintrag Name, KNX-Adresse, Gruppe, Auslöser und im Steuerungsverbund die aufzeichnende Steuerung. Ist der Dialog im Studio geöffnet, meldet dialog_open true — Änderungen würden dann beim Schließen überschrieben.
add_statistic_recording Aufzeichnung anlegen. Pflicht ist address (haupt/mittel/unter); ohne name wird die Adresse eingetragen. Auslöser über trigger_type (telegram, change, time, time_and_change) mit trigger_value und Zeitraster; außerdem controller_index, tab (Gruppe) und write_only.
update_statistic_recording Vorhandene Aufzeichnung anhand ihres Index ändern. Nur angegebene Felder werden geändert.
delete_statistic_recording Aufzeichnung aus dem Projekt entfernen. Bereits aufgezeichnete Werte in der Datenbank der Steuerung bleiben erhalten.

Gruppe 15: Lua Script (2 Werkzeuge)

Diese Werkzeuge ermöglichen das Schreiben und Lesen von Lua-Skriptcode für den Lua Interpreter-Funktionsbaustein (Typ 0x0384). Das Werkzeug get_lua_api_reference liefert die vollständige API-Referenz mit Callbacks, IO-Variablen und allen sys_*-Funktionen — so kann der KI-Assistent direkt korrekten Lua-Code erzeugen.

Werkzeug Beschreibung
set_lua_script Schreibt Lua-Quellcode in einen Lua-Interpreter-Baustein. Parameter: fb_guid (GUID des Bausteins), code (Lua-Quelltext), optional inputs (1–64, Anzahl Eingänge), outputs (1–64, Anzahl Ausgänge).
get_lua_api_reference Gibt die vollständige Lua-API-Referenz zurück: Callbacks (onCreate, onInputChanged, onTimerEvent…, onEvent), IO-Variablen (E1E64, A1A64), alle sys_*-Funktionen gegliedert nach Gruppen (Timer, KNX, Persistenz, Netzwerk, PID, System …) sowie ein vollständiges Blink-Beispiel. Kein Parameter erforderlich.

Gruppe 16: Styles & Bilder (9 Werkzeuge)

Das Projekt hat genau 20 feste Style-Slots (Designs der Visualisierung, Index 0–19). Ein neuer Style entsteht, indem ein freier Slot befüllt wird. Farben werden im Format #rrggbb angegeben.

Werkzeug Beschreibung
list_styles Alle 20 Style-Slots auflisten: index, name, active (Slot konfiguriert), is_current (aktuell aktiver Style), icon_theme und Grundfarben.
get_style_detail Alle Einstellungen eines Style-Slots abrufen: Grundfarben, Icon-Theme, Popup-Dialog, Block (mit Kopf- und Fußzeile), Grafik-Rahmen sowie die Seiten-Einstellungen (pages). Die Feldnamen entsprechen den Parametern von update_style.
update_style Style-Slot ändern — nur übergebene Felder werden geschrieben. Neuen Style anlegen: freien Slot mit name und active=1 befuellen. Bildfelder erwarten einen Bilddateinamen (siehe list_style_images), Leerstring = kein Bild. Mit activate=true wird der Style sofort aktiv. Nicht möglich, solange der Style-Editor im Studio geöffnet ist.
update_style_page Seiten-Einstellungen eines Style-Slots ändern (enabled, background_color, image_background, image_overlay). Ohne page_guid werden alle Visualisierungsseiten geändert.
apply_style_template Style-Slot komplett mit einer eingebauten Vorlage befuellen und aktiv setzen, z. B. light, dark, wood, metal, stone_bright, stone_dark, stone_marmor. Danach können einzelne Felder mit update_style angepasst werden.
set_active_style Style-Slot aktivieren (0–19, der Slot muss konfiguriert sein) oder mit -1 auf die Darstellung ohne Style zurückschalten. Die Visualisierung wird sofort neu gezeichnet.
list_style_images Bilddateinamen auflisten, die in Style-Bildfeldern verwendet werden können: project_images (Grafiken des Projekts) und builtin_images (eingebaute Vorlagen-Hintergründe). Die project_images können auch Bedienelementen zugeordnet werden.
add_project_image Bilddatei (png, jpg, gif, svg) in die Projektressourcen übernehmen – vom lokalen Dateisystem (file_path) oder als Base64-Inhalt (data_base64 mit name, höchstens 10 MB). Danach kann sie in Styles und Widgets verwendet werden. Der Dateiname wird bereinigt (Kleinbuchstaben, keine Umlaute oder Sonderzeichen); der zurückgegebene Name ist der gültige.
set_widget_image Einem Bedienelement eine Grafik zuordnen. Die Grafik muss im Projekt vorhanden sein, mit file_path wird sie vorher importiert. Hat das Bedienelement mehrere Grafik-Parameter (z.B. Grafik Ein/Aus), wird der gewünschte mit param_index gewählt. Ein leerer Name entfernt die Grafik. Für „Grafik dynamisch“ wird stattdessen die Liste images mit Wertebereich (from, to) und Grafik übergeben.

Gruppe 17: Projekt-Generator & Raumelemente (7 Werkzeuge)

Diese Werkzeuge nutzen das Regelwerk des Projekt-Generators: Aus den Gruppenadressen wird eine Raumstruktur (Geschoss → Raum → Element → Adresse) abgeleitet, korrigiert und daraus das Projekt erzeugt. Einzelne Raumelemente lassen sich auch direkt anlegen.

Werkzeug Beschreibung
derive_project_structure Raumstruktur aus den Gruppenadressen ableiten und im Projekt sichern — dieselbe Ableitung wie im Assistenten. Das Ergebnis ist ein Vorschlag, der mit set_project_structure korrigiert und mit run_project_generator erzeugt wird. Adressen werden nur mit include_addresses=true geliefert; große Projekte über floor/room filtern oder mit offset/limit blättern.
get_project_structure Die im Projekt gesicherte Raumstruktur lesen. Ist noch keine vorhanden, zuerst derive_project_structure oder set_project_structure aufrufen. Filter und Blättern wie bei derive_project_structure.
set_project_structure Korrigierte Raumstruktur ins Projekt schreiben; es wird nichts erzeugt. Der Baum wird immer vollständig ersetzt — also zuerst mit get_project_structure (include_addresses=true) lesen, ändern und zurückschreiben. Wird etwas beanstandet, bleibt das Projekt unverändert und die Antwort listet alle Fundstellen.
run_project_generator Aus der gesicherten Raumstruktur Funktionsbausteine, Visualisierungsseiten, Widgets und die Navigation erzeugen — derselbe Lauf wie der letzte Schritt des Assistenten. Immer zuerst mit dry_run=true aufrufen: das liefert die Zählung und die bereits vorhandenen Seiten, ohne etwas zu ändern. Der Lauf ist nicht rückgängig zu machen; vorher wird gespeichert (save_before, Standard true). Es werden vorhandene Gruppenadressen verknüpft, aber keine neuen angelegt.
add_block_element Ein vollständiges Raumelement in einem Aufruf anlegen: Funktionsbaustein, interne Variablen, KNX-Adressen an den passenden IOs, Widget auf der Visualisierungsseite und die Verknüpfung. Ersetzt die Kette add_function_blockgenerate_fb_addressesadd_widgetconnect_widget_to_fb. Ohne x/y wird die erste freie Rasterzelle der Seite belegt.
add_block_elements Mehrere Raumelemente in einem Aufruf anlegen — je Element derselbe Ablauf wie add_block_element. Scheitert ein Element, werden die übrigen trotzdem angelegt. Rückgabe: total, succeeded, results, errors.
arrange_widgets Widgets einer Visualisierungsseite neu im Raster anordnen, statt jedes einzeln mit update_widget zu verschieben. Kachelmaß und Spaltenzahl kommen aus dem Seitenraster des Projekt-Generators und können überschrieben werden. Die Widget-Größe bleibt unverändert, solange tile_w/tile_h nicht angegeben sind; Kopf- und Fußzeile werden standardmäßig nicht angetastet.


Einbindung in Claude Code (empfohlen)

Claude Code ist das KI-Werkzeug von Anthropic für die Kommandozeile (Terminal). Die Einbindung erfolgt über das Python-Proxy-Skript und den Befehl claude mcp add.

Voraussetzungen

Proxy-Skript

Das Skript leitet stdio-Nachrichten an den HTTP-MCP-Server des Studios weiter:

import sys, json, urllib.request, urllib.error MCP_URL = "http://localhost:7420/mcp" def send_error(id_, msg): sys.stdout.write(json.dumps({"jsonrpc":"2.0","id":id_,"error":{"code":-32603,"message":msg}})+"\n") sys.stdout.flush() def main(): for line in sys.stdin: line = line.strip() if not line: continue try: id_ = json.loads(line).get("id") except: id_ = None try: req = urllib.request.Request(MCP_URL, data=line.encode(), headers={"Content-Type":"application/json"}) with urllib.request.urlopen(req, timeout=10) as r: body = r.read().decode().strip() if body and body != "{}": sys.stdout.write(body+"\n"); sys.stdout.flush() except urllib.error.URLError as e: send_error(id_, "Studio nicht erreichbar: "+str(e.reason)) except Exception as e: send_error(id_, str(e)) if __name__ == "__main__": main()

Server registrieren

Einmalig in einem Terminal ausführen (ersetzt die manuelle Konfiguration der settings.json):

claude mcp add --scope user uni-pro python "C:/Users/<Benutzer>/uni_pro_mcp_proxy.py"

Verbindung prüfen

  1. Studio starten und Projekt öffnen.
  2. Neues Terminal öffnen, claude starten.
  3. /mcp eingeben — uni-pro sollte als verbunden erscheinen.


Einbindung in Claude Desktop

Claude Desktop ist die Desktop-Anwendung von Anthropic. Die Konfigurationsdatei befindet sich unter:

Folgenden Abschnitt in die Konfigurationsdatei einfügen:

{ "mcpServers": { "uni-pro": { "command": "python", "args": ["C:/Users/<Benutzer>/uni_pro_mcp_proxy.py"] } } }

Claude Desktop anschließend neu starten. Im Chat-Eingabefeld erscheint ein Werkzeug-Symbol — beim Anklicken werden die verfügbaren MCP-Werkzeuge angezeigt.

Hinweis: Studio muss vor Claude Desktop gestartet werden, damit der Proxy beim ersten Verbindungsversuch den HTTP-Server erreichen kann.


Einbindung in ChatGPT Desktop

ChatGPT Desktop (Windows/macOS) unterstützt MCP-Server ebenfalls über das stdio-Proxy-Skript.

  1. Studio starten.
  2. In ChatGPT Desktop: Einstellungen → Verbundene Apps / MCP-Server aufrufen.
  3. Neuen Server hinzufügen:
  4. ChatGPT Desktop neu starten.

Hinweis: Die genaue Konfiguration hängt von der installierten ChatGPT-Desktop-Version ab. Aktuelle Informationen finden Sie in der OpenAI-Dokumentation.


Testen mit curl

Die Verbindung kann ohne KI-Anwendung direkt mit curl getestet werden. Öffnen Sie eine Eingabeaufforderung und führen Sie folgende Befehle aus (Studio muss laufen):

1. Handshake (Verbindung prüfen)

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"0\"}}}"

Erwartete Antwort (gekürzt):

{"jsonrpc":"2.0","id":1,"result":{"serverInfo":{"name":"PT2020-Studio-MCP","version":"1.0"},...}}

2. Werkzeugliste abrufen

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}"

3. Projektinfo abrufen

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"get_project_info\",\"arguments\":{}}}"

Tipp: Unter Windows steht curl ab Windows 10 (Build 1803) in der Eingabeaufforderung zur Verfügung.


Praxisbeispiele

Die folgenden Beispiele zeigen typische Anfragen, die Sie dem KI-Assistenten stellen können. Der Assistent ruft dabei automatisch die passenden MCP-Werkzeuge auf.

Projekt überblicken

„Welche Visualisierungsseiten hat das aktuelle Projekt?“

„Zeige mir alle KNX-Adressen im Projekt.“

„Was ist der Projektname und welche Version wird verwendet?“

Visualisierungsseiten erstellen

„Erstelle eine neue Visualisierungsseite mit dem Namen ‘Hauptmenü’ in der Größe 1024×768 Pixel.“

„Lege drei Seiten an: ‘Erdgeschoss’, ‘Obergeschoss’ und ‘Keller’, jeweils 1280×800 Pixel.“

Widgets platzieren und konfigurieren

„Füge auf der Seite ‘Hauptmenü’ oben links einen Button (Typ 100) mit der Beschriftung ‘Licht ein’ hinzu, 200×80 Pixel groß.“

„Platziere auf der Seite ‘Erdgeschoss’ vier Schalter nebeneinander, je 150×60 Pixel, für die Jalousien im Wohnzimmer.“

„Verschiebe den Button mit ID 42 auf der Seite ‘Hauptmenü’ nach rechts unten (Position 800, 600).“

„Zeige mir alle Parameter und Adressen des Widgets mit ID 15 auf der Seite ‘Erdgeschoss’.“

„Weise dem ersten IO-Slot des Widgets 15 die KNX-Adresse 1/2/10 zu.“

Programmlogik aufbauen und verbinden

„Erstelle eine neue Programmseite namens ‘Lichtsteuerung’ und füge einen AND-Funktionsbaustein sowie einen Timer hinzu.“

„Welche Funktionsbausteine sind auf der Seite ‘Heizung’ vorhanden?“

„Zeige mir alle Parameter und Eingänge des Funktionsbausteins mit der GUID ‘abc-123’.“

„Verbinde den Ausgang 0 des AND-Bausteins mit dem Eingang 0 des Timers auf der Seite ‘Lichtsteuerung’.“

„Welche Verbindungen existieren auf der Programmseite ‘Lichtsteuerung’?“

„Trenne die Verbindung am Eingang 0 des Timers.“

„Setze den Kommentar des Funktionsbausteins ‘abc-123’ auf ‘Prüft Anwesenheit und Helligkeit’.“

KNX-Adressen verwalten

„Lege eine neue KNX-Adresse 1/2/50 mit dem Kommentar ‘Licht Wohnzimmer’ an.“

„Aktualisiere den Kommentar der Adresse 1/2/50 auf ‘Licht Wohnzimmer Haupt’.“

„Lösche die Adresse 1/2/99 aus der Adressliste.“

„Weise dem Ausgang 0 des Funktionsbausteins ‘abc-123’ die KNX-Adresse 1/2/50 zu.“

„Sind alle KNX-Adressen im Projekt zugewiesen? Liste nicht verwendete Adressen auf.“

Strukturanalyse und Refactoring

„Analysiere die Struktur aller Visualisierungsseiten und erstelle eine Übersicht der verwendeten Widget-Typen.“

„Prüfe alle Funktionsbausteine auf der Seite ‘Heizung’ auf nicht verbundene Eingänge und Ausgänge.“

„Kopiere die Struktur der Seite ‘Erdgeschoss’ und erstelle daraus eine neue Seite ‘Obergeschoss’ mit denselben Widget-Positionen.“

Projekt speichern

„Speichere das Projekt.“

„Führe alle Änderungen durch und speichere das Projekt anschließend.“


Fehlerbehebung