Build Digital Twins DTDL v3 model configs with properties, telemetry, relationships, commands, components, and event routes.
Build Digital Twins DTDL v3 model configs with properties, telemetry, relationships, commands, components, event routes, and endpoints.
Required Fields
instanceNamemodelsmodels[0].@idmodels[0].@typemodels[0].contentsOutput will appear here...The builder validates that instanceName, models, and the first model's @id/@type/contents all resolve before accepting the JSON as a valid combined DTDL model, event route, and endpoint configuration; it can't validate the DTDL syntax against the full v3 specification or verify that referenced relationship target model IDs (like dtmi:contoso:Floor;1) actually exist among the other defined models, those are only confirmed when the models are actually uploaded to a live Digital Twins instance.
Build Azure Digital Twins DTDL v3 models defining Interfaces with Property, Telemetry, Relationship, Component, and Command elements, where a Relationship (like hasFloor from Building to Floor) can itself carry properties (isAccessible), letting the graph structure itself hold relationship-specific metadata rather than only modeling entities as isolated nodes. eventRoutes with a filter expression scoping which twin update events actually route to a given endpoint (like the example's temperature-specific filter on $body.temperature != null routing only to the time-series-destined endpoint) is what keeps a high-frequency telemetry stream from being indiscriminately fanned out to every configured endpoint regardless of whether that endpoint's downstream consumer actually needs that specific event type.
Model a Relationship versus a Component based on genuine independent existence, not convenience, getting this distinction backward (modeling an inseparable sub-system as a full separate twin via Relationship, or trying to force two independently-meaningful entities into one Component) makes the resulting twin graph harder to query and reason about correctly.
Use eventRoute filters deliberately to scope high-frequency telemetry to only the endpoints that actually need that specific event type, an unfiltered route fanning every twin update to every endpoint regardless of relevance wastes downstream processing and can obscure genuinely important events in volume.
Take advantage of Relationship-level properties (like isAccessible) for metadata that's genuinely about the connection itself, not about either endpoint independently, modeling this kind of relationship-specific context as a property on one of the endpoint twins instead loses the connection-specific meaning.
A Relationship connects two independently-existing twins (a Building and a Floor are each their own twin instance, connected by a hasFloor relationship), while a Component models a sub-part that doesn't exist as an independent twin of its own, it's always part of its parent (the HVAC system in the example exists only as a component of a Floor, not as a separately-instantiated twin). Choose Relationship when the two things genuinely have independent lifecycles and identities; choose Component when one is truly an inseparable part of the other.
Yes, as the hasFloor relationship's isAccessible property demonstrates, a Relationship in DTDL can define its own Property elements, letting metadata specific to that particular connection (not to either endpoint twin individually) be modeled directly on the relationship itself, this is a genuinely useful modeling capability distinct from just connecting two twins with no additional context.
Only routing, the filter on an eventRoute scopes which already-generated twin update events get forwarded to that specific endpoint, it doesn't change what telemetry or property updates the twins themselves generate or how frequently. This distinction matters for understanding where to control event volume, filtering at the eventRoute level controls downstream fan-out, not the underlying event generation rate itself.
Was this tool helpful?
Disclaimer: This tool runs entirely in your browser. No data is sent to our servers. Always verify outputs before using them in production. AWS, Azure, and GCP are trademarks of their respective owners.