Open Source – Dokumentation und Auswertung von Schraubdaten: Anbindung von Open Protocol Schraubern

Wenn es um die Überwachung von Verschraubungen geht, bietet der Markt eine Vielzahl von Schraubsystemen. Es gibt viele Aspekte zu berücksichtigen, von den Spezifikationen der Schrauben, bis hin zu den Anziehdrehmomenten und anderen technischen Parametern. Diverse Hersteller (Atlas Copco, Ingersoll Rand, DEPRAG, etc.) bieten zusätzliche Systeme zur Datenerfassung und Analyse. In den wenigsten Fällen besteht eine Offenheit gegenüber der Anbindung von Geräten der Mitbewerber. Im schlechtesten Fall müssen also unterschiedliche Softwarelösungen beschafft und betrieben werden, um Rückverfolgbarkeit bezüglich Schraubdaten (Drehmomente, Drehwinkel) realisieren zu können.
Unabhängig von der gewählten Hardware beschreibt dieser Beitrag die Möglichkeit, mithilfe kostenloser Open Source Software-Lösungen ein Schraubdatendokumentations- und analysesystem aufzubauen. Das Werkzeug der Wahl ist Node-RED:
Node-RED ist im Grunde eine Art digitales Werkzeug, mit dem man auf einfache Weise Programme erstellen kann, ohne dass man ein Computergenie sein muss. Man kann es sich wie ein Baukastensystem vorstellen, in dem man verschiedene Teile zusammenfügt, um genau das zu erreichen, was man braucht.
Für die Überwachung von Verschraubungen bedeutet das, dass man mit Node-RED Daten von verschiedenen Schraubsystemen und Sensoren sammeln, analysieren und darstellen kann. Das Ganze passiert auf einer intuitiven, grafischen Oberfläche.
Das Coole an Node-RED ist, dass es flexibel ist und mit vielen verschiedenen Geräten und Datenformaten zusammenarbeiten kann. Das heißt, egal welche Schraubsysteme oder Sensoren man hat, man kann sie wahrscheinlich in Node-RED integrieren.
Und das Beste ist, dass Node-RED kostenlos und Open Source ist. Das bedeutet, dass man es an die eigenen Bedürfnisse anpassen kann und nicht an einen bestimmten Anbieter gebunden ist. Man kann also sein eigenes maßgeschneidertes System zur Dokumentation und Analyse von Schraubdaten aufbauen, ganz ohne große Kosten oder technisches Expertenwissen.
Anbindung der Schraubsteuerung
Die gewählte Schraubsteuerung bietet die Möglichkeit, via TCP/IP zu kommunizieren. Diverser Hersteller haben sich auf ein gemeinsames Protokoll geeignet, das Open Protocol.
Das Open Protocol ist eine Vereinbarung zwischen verschiedenen Herstellern von Schraubsystemen, die es ermöglicht, dass ihre Geräte miteinander kommunizieren können. Es handelt sich um einen offenen Standard, der es den verschiedenen Systemen erlaubt, über das Netzwerk zu kommunizieren.
Dank des Open Protocols können die Schraubsteuerungen verschiedener Hersteller miteinander verbunden werden, was die Integration in ein übergeordnetes Überwachungssystem wie Node-RED erleichtert. Dadurch wird es möglich, Daten von verschiedenen Schraubsystemen zu sammeln, zu analysieren und zu verarbeiten, unabhängig davon, welchen Hersteller die jeweiligen Systeme haben. Einzelne Hersteller wandeln das Open Protocol teilweise ab, weshalb es hier verschiedene Revisionen und Arten auf dem Markt gibt.
Der Aufbau für diesen Blogbeitrag sieht wie folgt aus. Node-RED verbindet sich mit der Schraubtechnik und übernimmt die Kommunikation. Der Flow kümmert sich darum, dass die ausgelesenen Messwerte in einer Datenbank gespeichert werden. Zusätzlich wird Node-RED dazu verwendet, die Daten in einer ansprechenden Form aufzubereiten und in einem Dashboard darzustellen.

Bei Schraubsteuerungen unterscheidet man oft zwischen P-Sets (Parametereinstellungen) und Jobs.
P-Sets beziehen sich auf die verschiedenen Parameter und Einstellungen, die für einen bestimmten Schraubvorgang benötigt werden. Das können Dinge wie das Anziehdrehmoment, die Drehwinkelbegrenzung, die Drehrichtung und andere spezifische Einstellungen sein, die für eine bestimmte Anwendung erforderlich sind. P-Sets werden oft vordefiniert und können je nach Bedarf ausgewählt und angewendet werden.
Jobs hingegen beziehen sich auf die konkreten Schraubvorgänge, die durchgeführt werden müssen. Ein Job umfasst normalerweise eine Reihe von Schrauboperationen, die in einer bestimmten Reihenfolge durchgeführt werden müssen. Zum Beispiel könnte ein Job die Montage eines Bauteils mit mehreren Schrauben umfassen, wobei jede Schraube ein bestimmtes P-Set und eine spezifische Anzugsreihenfolge erfordert. Jobs werden oft erstellt, um wiederkehrende Arbeitsabläufe zu automatisieren und die Effizienz in der Fertigung zu verbessern.
Im ersten Teil möchten wir alle Schraubdaten (Jobs, Drehmomente und Drehwinkel) von Verschraubungen aus der Steuerung auslesen. Dafür muss die Node-Palette node-red-contrib-open-protocol ausgewählt und installiert werden. Mithilfe der Nodes kann ein entsprechendes Gerät in Node-RED angelegt werden:

Für den ersten Test bedienen wir uns zunächst am Standard-Beispiel aus der Open Protocol Bibliothek. Es wird eine Subscription mit der MID 0061 aufgebaut (Data Upload Reply). Dieses Telegramm legt das Abonnement für die Zusammenfassungsergebnisse fest.

Der Verbindungsstatus sollte sowohl in Node-RED als auch in der jeweiligen Schraubsteuerung ersichtlich sein. Hier am Beispiel der Steuerung von dem Hersteller Ingersoll Rand:

Über das Display der Schraubsteuerung wählen wir zunächst einen Job aus. Dieser Job besteht aus einer Rotation von 90°.

Das empfangene Datenobjekt in Node-RED ist (gekürzt) nachfolgend dargestellt:
{
"prevailTorqueCompensateValue": 0,
"_tighteningErrorStatus2": 0,
"parameterSetName": "Drehen",
"torqueValuesUnit": "Nm",
"resultType": "Tightening",
"_torqueValuesUnit": 1,
"_resultType": 1,
"cellID": 0,
"channelID": 0,
"torqueControllerName": "INSIGHTqcx",
"numberVIN": " ",
"jobID": 4,
"parameterSetID": 3,
"strategy": "Angle control / torque monitoring",
"batchSize": 1,
"batchCounter": 1,
"tighteningStatus": "OK",
"batchStatus": "OK",
"torqueStatus": "OK",
"angleStatus": "OK",
"rundownAngleStatus": "OK",
"currentMonitoringStatus": "OK",
"selftapStatus": "OK",
"torqueMinLimit": 0,
"torqueMaxLimit": 1,
"torqueFinalTarget": 0,
"torque": 0.04,
"angleMin": 81,
"angleMax": 99,
"finalAngleTarget": 90,
"angle": 92,
"rundownAngleMin": 0,
"rundownAngleMax": 0,
"rundownAngle": 0,
"currentMonitoringMin": 0,
"currentMonitoringMax": 0,
"currentMonitoringValue": 0,
"selftapMin": 0,
"selftapMax": 0,
"selftapTorque": 0,
"prevailTorqueMonitoringMin": 0,
"prevailTorqueMonitoringMax": 0,
"prevailTorque": 0,
"tighteningID": 431,
"jobSequenceNumber": 3,
"syncTighteningID": 0,
"toolSerialNumber": "SP09A27551,
"timeStamp": "2024-05-06:13:52:07",
"timeLastChange": "2024-05-06:13:48:59",
"_strategy": 4,
"_strategyOptions": 7,
"_torqueStatus": 1,
"_angleStatus": 1,
"_rundownAngleStatus": 1,
"_currentMonitoringStatus": 1,
"_selftapStatus": 1,
"_prevailTorqueMonitoringStatus": 1,
"_prevailTorqueCompensateStatus": 1,
"_tighteningErrorStatus": 0,
"_tighteningStatus": 1,
"_batchStatus": 1
}
Die Schraubergebnisse enthalten in diesem Fall die Zusammenfassungsergebnisse des Jobs. Diese Schraubwerte gilt es nun zu speichern, damit eine spätere Auswertung der Verschraubungen erfolgen kann. Für die Schraubdatendokumentation wird ein PostgreSQL Server verwendet. PostgreSQL ist ein fortschrittliches, objektrelationales Datenbankverwaltungssystem (ORDBMS), das auf jahrzehntelanger Entwicklung und einer lebhaften Open-Source-Community basiert. Es bietet eine solide Datenintegrität, Transaktionsunterstützung, erweiterte Funktionen wie JSON-Unterstützung und Geodatenverarbeitung sowie eine breite Palette von Erweiterungen. PostgreSQL wird häufig in Anwendungen eingesetzt, die hohe Ansprüche an Datenkonsistenz und Leistung stellen, wie z. B. E-Commerce, Finanzwesen und Analytik.
Für die initiale Administration der Datenbank wird adminer verwendet. Adminer ist ein Open-Source-Datenbankverwaltungswerkzeug, das als Alternative zu anderen Datenbankverwaltungssystemen wie phpMyAdmin und phpPgAdmin entwickelt wurde. Es bietet eine benutzerfreundliche webbasierte Benutzeroberfläche zum Verwalten von verschiedenen Datenbanken wie MySQL, PostgreSQL, SQLite, MS SQL, Oracle und mehr. Adminer ist leichtgewichtig, einfach zu installieren und bietet den Benutzern die Möglichkeit, Datenbanken, Tabellen, Abfragen und Benutzer mit einer intuitiven Benutzeroberfläche zu verwalten. Die initiale Schraubdatenbank wird mithilfe von Adminer erstellt und initialisiert:

Entgegen der Hauptintention relationaler Datenbank speichern wir in der ersten Iteration die Daten zunächst in einer Tabelle tighening_data, die wir mit folgendem Skript (gekürzt) erstellen:
CREATE TABLE tightening_data (
prevail_torque_compensate_value NUMERIC,
tightening_error_status2 INTEGER[],
customer_tightening_error_code VARCHAR(4),
identifier_part2 VARCHAR,
identifier_part3 VARCHAR,
identifier_part4 VARCHAR,
parameter_set_name VARCHAR(255),
torque_values_unit VARCHAR(10),
result_type VARCHAR(20),
torque_values_unit_id INTEGER,
result_type_id INTEGER,
cell_id INTEGER,
channel_id INTEGER,
torque_controller_name VARCHAR(50),
number_vin VARCHAR(30),
job_id INTEGER,
parameter_set_id INTEGER,
strategy VARCHAR(50),
strategy_options VARCHAR(50)[],
...
...
...
selftap_status_id INTEGER,
prevail_torque_monitoring_status_id INTEGER,
prevail_torque_compensate_status_id INTEGER,
tightening_error_status_id INTEGER,
tightening_status_id INTEGER,
batch_status_id INTEGER
);
Zum Lesen und Schreiben aus PostgreSQL Datenbanken wird die Node-Palette node-red-contrib-postgresql installiert. Der angepasste Flow sieht nun wie folgt aus:

Der Flow baut eine Subscription zum angegeben Open Protocol Schrauber auf. Die Ergebnisdaten jeder Verschraubung, die mit diesem Schrauber durchgeführt wird, werden ausgelesen und an das Template gesendet. Das Template beinhaltet das ein INSERT-Statement mit entsprechenden Platzhaltern für die Werte aus dem empfangen Datenobjekt (siehe oben). Nachdem diese Platzhalter übersetzt worden sind, wird das fertige Skript an die PostgreSQL-Datenbank gesendet und die Werte in der Datenbank gespeichert. Nach einigen Verschraubungen füllen sich die Tabellen und es kann ausgewertet werden.
Glücklicherweise kann die Auswertung ebenfalls mit Node-RED erfolgen. Eine Vielzahl von Nodes zur Erstellung von Schraubdatenauswertungen sind bereits vorhanden: node-red-dashboard (node) – Node-RED (nodered.org). Ein weiterer Flow kümmert sich nun um die Bereitstellung der Auswertungsdaten.

Die Auswertung bestimmt in diesem Fall aus einem ein Dropdown, in dem nach Jobs gefiltert werden kann. Sobald gefiltert wird, wird eine weitere Query ausgeführt, die eine Tabelle befüllt.

Die Analyse- und Dokumentationsmöglichkeiten haben in diesem Fall keine Grenzen und sie können beliebig erweitert werden.
Abschließend lässt sich festhalten, dass die Überwachung von Verschraubungen ein komplexes Unterfangen ist, das eine Vielzahl von Aspekten umfasst, von den Spezifikationen der Schrauben bis hin zur Analyse der Schraubdaten. Während der Markt eine breite Palette von Schraubsystemen und Analysewerkzeugen bietet, kann die Offenheit und Flexibilität kostenloser Open-Source-Software wie Node-RED eine überlegene Lösung bieten.
Durch die Integration verschiedener Schraubsysteme über das Open Protocol und die Verwendung von Node-RED zur Datenerfassung, Analyse und Darstellung können Hersteller unabhängig von ihren individuellen Hardwareanforderungen ein maßgeschneidertes Schraubdatendokumentations- und Analysesystem aufbauen. Die Nutzung von PostgreSQL zur Datenbankverwaltung und Adminer zur Datenbankadministration bietet eine solide Grundlage für die langfristige Speicherung und Verwaltung der Schraubdaten.
Mit Node-RED stehen Herstellern auch leistungsstarke Werkzeuge zur Verfügung, um Schraubdaten effektiv zu analysieren und zu visualisieren, wodurch die Möglichkeiten zur Optimierung von Fertigungsprozessen und zur Fehlerbehebung erheblich erweitert werden. Letztendlich bietet die Kombination aus offenen Standards, kostenloser Open-Source-Software und leistungsfähigen Analysetools einen Weg zu einer effizienteren und transparenteren Überwachung von Verschraubungen in der Fertigungsindustrie.
Der gesamte Flow kann hier kopiert werden:
[{"id":"818a83c355d8ca68","type":"tab","label":"Schraubdaten","disabled":false,"info":"","env":[]},{"id":"d5f60435.9b81d8","type":"op node","z":"818a83c355d8ca68","name":"","config":"5ed3e639.0e2408","midGroup":"61","customMid":"","revision":"6","customRevision":"","autoSubscribe":true,"forwardErrors":true,"outputs":2,"x":570,"y":160,"wires":[["c70150f8.9321a"],["276df28e.7ae56e","14917a20db333e2a"]]},{"id":"c70150f8.9321a","type":"debug","z":"818a83c355d8ca68","name":"Feedback","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","statusVal":"","statusType":"auto","x":820,"y":120,"wires":[]},{"id":"328519f.9dd84e6","type":"inject","z":"818a83c355d8ca68","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":170,"y":120,"wires":[["46be0529.ea666c"]]},{"id":"46be0529.ea666c","type":"change","z":"818a83c355d8ca68","name":"Subscribe","rules":[{"t":"set","p":"subscribe","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":320,"y":120,"wires":[["d5f60435.9b81d8"]]},{"id":"276df28e.7ae56e","type":"debug","z":"818a83c355d8ca68","name":"Data","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","statusVal":"","statusType":"auto","x":810,"y":160,"wires":[]},{"id":"bd75d590.9bab18","type":"change","z":"818a83c355d8ca68","name":"Unsubscribe","rules":[{"t":"set","p":"subscribe","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":200,"wires":[["d5f60435.9b81d8"]]},{"id":"66c9b977.3aa4e8","type":"inject","z":"818a83c355d8ca68","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":170,"y":200,"wires":[["bd75d590.9bab18"]]},{"id":"14917a20db333e2a","type":"template","z":"818a83c355d8ca68","name":"","field":"query","fieldType":"msg","format":"sql","syntax":"mustache","template":"INSERT INTO tightening_data (\n parameter_set_name,\n torque_values_unit,\n result_type,\n _torque_values_unit,\n _result_type,\n cell_id,\n channel_id,\n torque_controller_name,\n number_vin,\n job_id,\n parameter_set_id,\n strategy,\n batch_size,\n batch_counter,\n tightening_status,\n batch_status,\n torque_status,\n angle_status,\n rundown_angle_status,\n current_monitoring_status,\n selftap_status,\n prevail_torque_monitoring_status,\n prevail_torque_compensate_status,\n torque_min_limit,\n torque_max_limit,\n torque_final_target,\n torque,\n angle_min,\n angle_max,\n final_angle_target,\n angle,\n rundown_angle_min,\n rundown_angle_max,\n rundown_angle,\n current_monitoring_min,\n current_monitoring_max,\n current_monitoring_value,\n selftap_min,\n selftap_max,\n selftap_torque,\n prevail_torque_monitoring_min,\n prevail_torque_monitoring_max,\n prevail_torque,\n tightening_id,\n job_sequence_number,\n sync_tightening_id,\n tool_serial_number,\n time_stamp,\n time_last_change,\n _strategy,\n _strategy_options,\n _torque_status,\n _angle_status,\n _rundown_angle_status,\n _current_monitoring_status,\n _selftap_status,\n _prevail_torque_monitoring_status,\n _prevail_torque_compensate_status,\n _tightening_error_status,\n _tightening_status,\n _batch_status\n) VALUES (\n '{{{payload.parameterSetName}}}',\n '{{{payload.torqueValuesUnit}}}',\n '{{{payload.resultType}}}',\n {{payload._torqueValuesUnit}},\n {{payload._resultType}},\n {{payload.cellID}},\n {{payload.channelID}},\n '{{{payload.torqueControllerName}}}',\n '{{{payload.numberVIN}}}',\n {{payload.jobID}},\n {{payload.parameterSetID}},\n '{{{payload.strategy}}}',\n {{payload.batchSize}},\n {{payload.batchCounter}},\n '{{{payload.tighteningStatus}}}',\n '{{{payload.batchStatus}}}',\n '{{{payload.torqueStatus}}}',\n '{{{payload.angleStatus}}}',\n '{{{payload.rundownAngleStatus}}}',\n '{{{payload.currentMonitoringStatus}}}',\n '{{{payload.selftapStatus}}}',\n '{{{payload.prevailTorqueMonitoringStatus}}}',\n '{{{payload.prevailTorqueCompensateStatus}}}',\n {{payload.torqueMinLimit}},\n {{payload.torqueMaxLimit}},\n {{payload.torqueFinalTarget}},\n {{payload.torque}},\n {{payload.angleMin}},\n {{payload.angleMax}},\n {{payload.finalAngleTarget}},\n {{payload.angle}},\n {{payload.rundownAngleMin}},\n {{payload.rundownAngleMax}},\n {{payload.rundownAngle}},\n {{payload.currentMonitoringMin}},\n {{payload.currentMonitoringMax}},\n {{payload.currentMonitoringValue}},\n {{payload.selftapMin}},\n {{payload.selftapMax}},\n {{payload.selftapTorque}},\n {{payload.prevailTorqueMonitoringMin}},\n {{payload.prevailTorqueMonitoringMax}},\n {{payload.prevailTorque}},\n {{payload.tighteningID}},\n {{payload.jobSequenceNumber}},\n {{payload.syncTighteningID}},\n '{{{payload.toolSerialNumber}}}',\n '{{{payload.timeStamp}}}',\n '{{{payload.timeLastChange}}}',\n {{payload._strategy}},\n {{payload._strategyOptions}},\n {{payload._torqueStatus}},\n {{payload._angleStatus}},\n {{payload._rundownAngleStatus}},\n {{payload._currentMonitoringStatus}},\n {{payload._selftapStatus}},\n {{payload._prevailTorqueMonitoringStatus}},\n {{payload._prevailTorqueCompensateStatus}},\n {{payload._tighteningErrorStatus}},\n {{payload._tighteningStatus}},\n {{payload._batchStatus}}\n);\n","output":"str","x":820,"y":200,"wires":[["f406fceadee2f73b"]]},{"id":"04d922e4eee2e1b0","type":"debug","z":"818a83c355d8ca68","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1140,"y":200,"wires":[]},{"id":"f406fceadee2f73b","type":"postgresql","z":"818a83c355d8ca68","name":"","query":"","postgreSQLConfig":"228e7a250d1053fe","split":false,"rowsPerMsg":1,"outputs":1,"x":990,"y":200,"wires":[["04d922e4eee2e1b0"]]},{"id":"f69ac248e46fd5cb","type":"ui_dropdown","z":"818a83c355d8ca68","name":"","label":"Job-IDs","tooltip":"","place":"Select option","group":"feb1d6d7a6ae6397","order":0,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"","value":"","type":"str"}],"payload":"","topic":"topic","topicType":"msg","className":"","x":840,"y":300,"wires":[["14936e637825d28c","4fbca7b52ef5d28f"]]},{"id":"66380757cba46fa9","type":"postgresql","z":"818a83c355d8ca68","name":"","query":"","postgreSQLConfig":"228e7a250d1053fe","split":false,"rowsPerMsg":1,"outputs":1,"x":470,"y":300,"wires":[["9a0fec83e4404dc2"]]},{"id":"14936e637825d28c","type":"template","z":"818a83c355d8ca68","name":"","field":"query","fieldType":"msg","format":"sql","syntax":"mustache","template":"SELECT distinct(job_id) FROM tightening_data","output":"str","x":300,"y":300,"wires":[["66380757cba46fa9"]]},{"id":"9a0fec83e4404dc2","type":"function","z":"818a83c355d8ca68","name":"simple convert","func":"msg.options = msg.payload.map(obj => obj.job_id);\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":300,"wires":[["f69ac248e46fd5cb"]]},{"id":"ca1917c1e577837d","type":"ui_table","z":"818a83c355d8ca68","group":"c1a09580554f1b24","name":"","order":0,"width":"23","height":"6","columns":[],"outputs":0,"cts":false,"x":850,"y":400,"wires":[]},{"id":"4fbca7b52ef5d28f","type":"template","z":"818a83c355d8ca68","name":"","field":"query","fieldType":"msg","format":"sql","syntax":"mustache","template":"SELECT\ntime_stamp as Time,\njob_id as JobID,\nangle_min as WinkelUntergrenze,\nangle_max as WinkelObergrenze,\nfinal_angle_target as WinkelZiel,\nangle as Winkel,\ntorque_min_limit as DrehmomentUntergrenze,\ntorque_max_limit as DrehmomentObergrenze,\ntorque_final_target as DrehmomentZiel,\ntorque as Drehmoment\nfrom tightening_data\nwhere job_id = '{{payload}}'\n","output":"str","x":520,"y":400,"wires":[["39232dcb488884dd"]]},{"id":"39232dcb488884dd","type":"postgresql","z":"818a83c355d8ca68","name":"","query":"","postgreSQLConfig":"228e7a250d1053fe","split":false,"rowsPerMsg":1,"outputs":1,"x":690,"y":400,"wires":[["ca1917c1e577837d"]]},{"id":"4c4cb462cc4f8f52","type":"ui_spacer","z":"818a83c355d8ca68","name":"spacer","group":"c1a09580554f1b24","order":2,"width":1,"height":1},{"id":"5ed3e639.0e2408","type":"op config","name":"Controller One","controllerIP":"192.168.178.1","controllerPort":"4545","keepAlive":"10000","timeout":"3000","retries":"3","disablemidparsing":"","rawData":false,"generic":false,"linkLayer":"auto"},{"id":"228e7a250d1053fe","type":"postgreSQLConfig","name":"postgreSQL","host":"postgresdb","hostFieldType":"str","port":"5432","portFieldType":"num","database":"schraubdaten","databaseFieldType":"str","ssl":"false","sslFieldType":"bool","applicationName":"schraubdaten","applicationNameType":"str","max":"10","maxFieldType":"num","idle":"1000","idleFieldType":"num","connectionTimeout":"10000","connectionTimeoutFieldType":"num","user":"postgres","userFieldType":"str","password":"example","passwordFieldType":"str"},{"id":"feb1d6d7a6ae6397","type":"ui_group","name":"Filter","tab":"a4f7cd58054d462c","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"c1a09580554f1b24","type":"ui_group","name":"Standard","tab":"a4f7cd58054d462c","order":2,"disp":true,"width":"27","collapse":false,"className":""},{"id":"a4f7cd58054d462c","type":"ui_tab","name":"Schraubdaten - Allgemein","icon":"dashboard","disabled":false,"hidden":false}]