Eine AWS IoT TwinMaker Alternative ist sinnvoll, wenn Sie interaktive 3D Digital Twins möchten, aber offene Formate, Standardprotokolle und die Freiheit bevorzugen, überall zu laufen. Dieser Leitfaden vergleicht die realistischen Alternativen, von anderen Plattformen bis zu vollständig offenen Web-Stacks, und zeigt dann die Kerntechnik: Live-MQTT-Daten im Browser an Knoten eines glTF-Modells binden. Am Ende haben Sie ein funktionierendes Muster, das Sie zu einem vollständigen 3D-Zwilling ausbauen können.
Allgemeine Hintergründe zu Zwillingen finden Sie im Leitfaden zur Digital-Twin-Technologie.
Was TwinMaker bündelt
AWS IoT TwinMaker kombiniert mehrere Bausteine, die ein 3D-Zwilling braucht:
- Entitäten und Komponenten, die Ihre Assets modellieren und mit Datenquellen verknüpfen.
- Konnektoren zu anderen AWS-Datendiensten für Zeitreihendaten, Video und Dokumente.
- Einen Scene Composer, um 3D-Modelle zu platzieren und datengesteuerte Tags und Farbregeln anzuhängen.
- Visualisierung über ein Grafana-Plugin oder ein Application Kit für eigene Web-Apps.
Wenn Ihre Daten bereits in diesen AWS-Diensten liegen, ist das bequem. Der Preis dafür ist, dass Zwilling, Szenen und Daten-Bindings in dienstspezifischen Konzepten ausgedrückt sind. Ein Umzug in eine andere Cloud oder in ein On-Premises-Werksnetz bedeutet, sie neu aufzubauen. Auch Plattform-Roadmaps ändern sich mit der Zeit; prüfen Sie daher den aktuellen Status eines verwalteten Zwillingsdienstes, bevor Sie ein langlebiges Projekt darauf festlegen.
Was ein portabler 3D-Zwilling braucht
Lässt man die Markennamen weg, hat jeder 3D-Zwilling dieselben fünf Schichten:
| Schicht | Aufgabe | Portable Optionen |
|---|---|---|
| Geometrie | Das 3D-Modell des Werks oder der Maschine | glTF/GLB, exportiert aus CAD oder Blender |
| Rendering | Die Szene im Browser darstellen und bedienen | Three.js, Babylon.js, CesiumJS für Geodaten |
| Live-Daten | Aktuelle Werte an die Szene liefern | MQTT über Secure WebSocket |
| Binding | Datenfelder auf Knoten, Farben, Beschriftungen, Animationen abbilden | Eine kleine JSON-Mapping-Datei plus Ihr Code |
| Historie | Trends, Wiedergabe, Analysen | Zeitreihendatenbank plus Grafana oder eigene Diagramme |
Für jede Schicht gibt es ausgereifte offene Optionen, und jede lässt sich austauschen, ohne die anderen anzufassen. Diese Unabhängigkeit ist die eigentliche Antwort auf Lock-in.
Die Live-Datenschicht wird besonders robust, wenn sie als Unified Namespace (UNS) organisiert ist. Dabei wird die ISA-95-Anlagenhierarchie (Enterprise → Site → Area → Line → Cell) zur Topic-Struktur auf dem MQTT-Broker, etwa acme/werk-stuttgart/haertung/linie-1/ofen-1/state. Der 3D-Zwilling ist dann nur ein weiterer Konsument dieses Namespace, neben MES, Historian und Dashboards, und Ihre Bindings verweisen auf Orte in der Anlage statt auf dienstspezifische Entitäten. Wie Sparkplug B dazu passt, erklärt der Beitrag zu Sparkplug B und Unified Namespace.
Die Alternativen im Vergleich
| Ansatz | 3D-Erstellung | Datenpfad | Lock-in | Aufwand |
|---|---|---|---|---|
| Andere Cloud-Zwillingsdienste | Szeneneditor des Anbieters | IoT- und Datendienste des Anbieters | Hoch | Niedrig bis mittel |
| Game Engines (Unity, Unreal) | Vollständiger Engine-Editor | Plugins oder eigene MQTT-Clients | Mittel (Engine-Lizenzen, Runtimes) | Mittel bis hoch |
| Three.js + MQTT | Code, glTF aus beliebigem Tool | MQTT über WSS direkt im Browser | Niedrig | Mittel |
| Babylon.js + MQTT | Code plus Babylon-Tooling | MQTT über WSS | Niedrig | Mittel |
| Grafana + Panels + per MQTT gespeiste Datenbank | Begrenztes 3D, starke Diagramme | Telegraf oder ein Subscriber schreibt in eine Datenbank | Niedrig | Niedrig |
Game Engines glänzen bei fotorealistischen Schulungen und VR; siehe den Leitfaden zum Unity Digital Twin. Für Betriebs-Dashboards, die jeder im Browser öffnen kann, passen Web-Bibliotheken meist besser. Der Leitfaden zum webbasierten 3D Digital Twin vergleicht Three.js und Babylon.js ausführlicher.
MQTT-Daten an ein glTF-Modell binden
Das Herzstück jedes TwinMaker-Ersatzes ist die Binding-Schicht: „Wenn sich dieses Topic ändert, aktualisiere jenen 3D-Knoten.“ Halten Sie das Binding in Daten statt in Code, damit auch Nicht-Entwickler es pflegen können.
Hier ist eine Mapping-Datei. Jeder Eintrag verknüpft ein Topic und ein Payload-Feld mit einem benannten Knoten in der glTF-Szene und legt fest, was mit dem Wert geschehen soll:
[
{ "topic": "furnace1/state", "field": "temp_c", "node": "Furnace_Body",
"action": "color", "ranges": [[0, 600, "#4caf50"], [600, 900, "#ff9800"], [900, 2000, "#f44336"]] },
{ "topic": "conveyor1/state", "field": "running", "node": "Conveyor_Belt",
"action": "visible-flag" },
{ "topic": "tank3/state", "field": "level_pct", "node": "Tank3_Liquid",
"action": "scale-y", "max": 100 }
]
Und das Browser-Modul, das sie anwendet. Installieren Sie three und mqtt mit npm und bündeln Sie mit Vite oder einem ähnlichen Tool. Das Modell plant.glb muss Knoten mit den im Mapping verwendeten Namen enthalten.
import * as THREE from "three";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import mqtt from "mqtt";
import bindings from "./bindings.json";
const PREFIX = "connectmq/demo/tm-alt-2h7/site1";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 0.1, 500);
camera.position.set(20, 15, 20);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);
new OrbitControls(camera, renderer.domElement);
scene.add(new THREE.HemisphereLight(0xffffff, 0x404040, 3));
const nodes = {};
new GLTFLoader().load("/plant.glb", (gltf) => {
scene.add(gltf.scene);
for (const b of bindings) {
const obj = gltf.scene.getObjectByName(b.node);
if (!obj) { console.warn("Missing node", b.node); continue; }
obj.traverse((o) => { if (o.isMesh) o.material = o.material.clone(); });
nodes[b.node] = obj;
}
});
function apply(b, value) {
const obj = nodes[b.node];
if (!obj) return;
if (b.action === "color") {
const hit = b.ranges.find(([lo, hi]) => value >= lo && value < hi);
if (hit) obj.traverse((o) => o.isMesh && o.material.color.set(hit[2]));
} else if (b.action === "visible-flag") {
obj.traverse((o) => o.isMesh && o.material.emissive?.set(value ? 0x224422 : 0x000000));
} else if (b.action === "scale-y") {
obj.scale.y = Math.max(0.01, value / b.max);
}
}
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
clientId: "tm-alt-2h7-view-" + Math.random().toString(16).slice(2, 8),
protocolVersion: 5,
});
client.on("connect", () => client.subscribe(`${PREFIX}/+/state`));
client.on("message", (topic, payload) => {
const rel = topic.slice(PREFIX.length + 1);
const data = JSON.parse(payload.toString());
for (const b of bindings) if (b.topic === rel && b.field in data) apply(b, data[b.field]);
});
renderer.setAnimationLoop(() => renderer.render(scene, camera));
Testen Sie es, indem Sie retained Zustände auf dem öffentlichen MQTT-Broker veröffentlichen, der für Tests und nicht für Produktionsdaten gedacht ist. Das Präfix site1/<asset> steht dabei vereinfacht für die UNS-Hierarchie:
mosquitto_pub -h broker.connectmq.com -p 1883 -i tm-alt-2h7-pub -r \
-t "connectmq/demo/tm-alt-2h7/site1/furnace1/state" -m '{"temp_c":935}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i tm-alt-2h7-pub2 -r \
-t "connectmq/demo/tm-alt-2h7/site1/tank3/state" -m '{"level_pct":62}'
Weil die Zustände retained sind, zeigt die Szene im Moment des Ladens die richtigen Farben und Füllstände und aktualisiert sich dann live. Das ist dasselbe Erlebnis, das ein verwalteter Scene Composer bietet, gebaut aus offenen Bausteinen. Der Leitfaden zum Binden von IoT-Daten an ein 3D-Modell behandelt weitere Aktionen wie Animationen, Beschriftungen und blinkende Alarme, und die Three.js-Dokumentation ist die Referenz für die Rendering-Seite.
Stolperfallen beim Abschied von einem verwalteten Zwillingsdienst
- Knotennamen driften. Ein erneuter Export eines CAD-Modells kann Knoten umbenennen und Bindings stillschweigend brechen. Protokollieren Sie fehlende Knoten beim Laden, wie es der Code oben tut, und halten Sie Namen in Ihrer Export-Pipeline stabil.
- Geteilte Materialien. In glTF teilen sich oft viele Meshes ein Material, sodass das Einfärben eines Knotens alle einfärbt. Klonen Sie Materialien für gebundene Knoten.
- Schwere Modelle. CAD-Exporte können riesig sein. Dezimieren Sie die Geometrie, führen Sie statische Meshes zusammen und verwenden Sie komprimiertes glTF, um die Ladezeiten im Rahmen zu halten.
- Historie ist separat. Live-MQTT-Daten treiben die Szene an, aber Trends und Wiedergabe brauchen eine Datenbank. Lassen Sie einen Writer-Dienst oder Telegraf dieselben Topics abonnieren.
- Zugangsdaten im Browser. Alles, was an einen Browser ausgeliefert wird, kann dessen Nutzer lesen. Geben Sie Viewern lesend ausgerichtete Zugangsdaten, getrennt von denen der veröffentlichenden Gateways.
- Fehlender Zustand beim ersten Laden. Veröffentlichen Gateways nur Änderungen, bleibt eine frisch geöffnete Szene leer, bis sich etwas ändert. Veröffentlichen Sie vollständige Zustandsnachrichten mit dem Retain-Flag, damit jeder Viewer mit dem aktuellen Bild startet.
- Jede Nachricht rendern. Hochfrequente Telemetrie kann mehr Szenen-Updates auslösen, als der Bildschirm darstellen kann. Speichern Sie beim Eintreffen der Nachrichten die neuesten Werte und wenden Sie sie stattdessen einmal pro Animationsframe an.
Ein Migrationspfad in vier Schritten
Wenn Sie einen bestehenden verwalteten Zwilling ersetzen, statt neu anzufangen, gehen Sie in kleinen, umkehrbaren Schritten vor:
- Exportieren Sie Ihre 3D-Assets nach glTF und bestätigen Sie die Knotennamen, die Sie für Bindings brauchen.
- Lassen Sie Gateways parallel zum bestehenden Datenpfad an einen MQTT-Broker veröffentlichen, idealerweise gleich in eine UNS-Topic-Struktur nach ISA-95.
- Bauen Sie die Szenen-Bindings als Mapping-Datei neu auf und vergleichen Sie den neuen Viewer direkt mit dem alten.
- Verlagern Sie die Historie in eine Zeitreihendatenbank, die aus denselben Topics gespeist wird, und legen Sie dann den alten Pfad still.
Die Datenschicht hosten
Die Live-Datenschicht ist der einzige Baustein, der ständig verfügbar und sowohl vom Werk als auch vom Browser aus erreichbar sein muss. Ein verwalteter MQTT-Broker mit Secure-WebSocket-Unterstützung löst das, ohne im Werk Ports zu öffnen: Gateways verbinden sich ausgehend über TLS, Browser über WSS.
ConnectMQ bietet genau das: TLS auf 8883 für Gateways, Secure WebSocket auf 8084 unter dem Pfad /mqtt für Browser, MQTT-5-Unterstützung und ein Portal mit Live-Topic-Explorer. ConnectMQ betreibt außerdem eine öffentliche 3D-Digital-Twin-Webdemo – eine Fabrik mit CNC-Maschine, Roboterarm, Ofen, Tank, Förderband und Pumpe, live über WSS aktualisiert –, die auf genau diesem Muster aus Browser und MQTT aufbaut. Für die Produktion ersetzen Sie den öffentlichen Endpunkt durch die Zugangsdaten Ihres privaten Brokers aus dem Portal: YOUR_USERNAME, YOUR_PASSWORD und YOUR_CLIENT_ID.
Bauen Sie Ihren 3D-Zwilling auf ConnectMQ
Offene Web-3D-Bibliotheken plus ein Standard-MQTT-Broker ergeben einen interaktiven Zwilling, den Sie vollständig kontrollieren. Starten Sie mit einem kostenlosen ConnectMQ-Serverless-Broker, ohne Kreditkarte, und verbinden Sie noch heute Ihre erste glTF-Szene mit Live-Daten.
Häufig gestellte Fragen
Was ist eine gute AWS IoT TwinMaker Alternative für 3D?
Für browserbasierte Betriebszwillinge sind Three.js oder Babylon.js mit glTF-Modellen und MQTT über Secure WebSocket eine flexible, portable Wahl. Game Engines wie Unity eignen sich für fotorealistische oder VR-Anwendungen.
Kann ich meine 3D-Modelle aus TwinMaker wiederverwenden?
In der Regel ja, wenn sie im glTF- oder GLB-Format vorliegen. Daten-Bindings und Tag-Platzierungen müssen Sie neu erstellen; am einfachsten geht das, wenn Sie sie wie oben gezeigt in einer Mapping-Datei halten.
Verbinden sich Browser direkt mit MQTT?
Ja. MQTT.js verbindet sich über WebSocket oder Secure WebSocket, sodass eine Webseite Topics ohne Backend-Relay abonnieren kann. Verwenden Sie in der Produktion TLS und separate Zugangsdaten für Viewer.
Wohin kommen historische Daten ohne TwinMaker?
Verwenden Sie eine Zeitreihendatenbank, die von einem MQTT-Subscriber wie Telegraf oder einem kleinen Skript gespeist wird, und visualisieren Sie sie in Grafana oder in Diagrammen auf Ihrer Zwillingsseite.



