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:
POST http://localhost:7420/mcpGET http://localhost:7420/sseFü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.
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. |
Der MCP-Server stellt insgesamt 107 Werkzeuge in 17 Gruppen bereit:
| 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. |
| 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. |
| 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). |
| 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 |
| 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. |
| 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. |
| 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. |
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"}]. |
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_mon … days_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. |
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. |
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.
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. |
| 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. |
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. |
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 (E1–E64,
A1–A64), alle sys_*-Funktionen
gegliedert nach Gruppen (Timer, KNX, Persistenz, Netzwerk, PID, System …)
sowie ein vollständiges Blink-Beispiel. Kein Parameter erforderlich. |
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. |
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_block →
generate_fb_addresses → add_widget →
connect_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. |
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.
uni_pro_mcp_proxy.py im gewünschten
Verzeichnis ablegen (z.B. C:\Users\<Benutzer>\)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()
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"
claude starten./mcp eingeben — uni-pro sollte als verbunden erscheinen.
Claude Desktop ist die Desktop-Anwendung von Anthropic. Die Konfigurationsdatei befindet sich unter:
%APPDATA%\Claude\claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.jsonFolgenden 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.
ChatGPT Desktop (Windows/macOS) unterstützt MCP-Server ebenfalls über das stdio-Proxy-Skript.
pythonC:/Users/<Benutzer>/uni_pro_mcp_proxy.pyuni-proHinweis: Die genaue Konfiguration hängt von der installierten ChatGPT-Desktop-Version ab. Aktuelle Informationen finden Sie in der OpenAI-Dokumentation.
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):
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"},...}}
curl -X POST http://localhost:7420/mcp ^
-H "Content-Type: application/json" ^
-d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}"
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.
Die folgenden Beispiele zeigen typische Anfragen, die Sie dem KI-Assistenten stellen können. Der Assistent ruft dabei automatisch die passenden MCP-Werkzeuge auf.
„Welche Visualisierungsseiten hat das aktuelle Projekt?“
„Zeige mir alle KNX-Adressen im Projekt.“
„Was ist der Projektname und welche Version wird verwendet?“
„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.“
„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.“
„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’.“
„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.“
„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.“
„Speichere das Projekt.“
„Führe alle Änderungen durch und speichere das Projekt anschließend.“
claude mcp add müssen
Sie nur einmalig ausführen.MCP_URL = "http://localhost:7421/mcp").localhost
(127.0.0.1) — keine Firewall-Regeln nötig.