The TTI Connector supports the Azure IoT Hub Device Provisioning Service(DPS) which is required (it is possible to provision individual devices but this intended for small deployments or testing) for Azure IoT Central applications. The TTI Connector implementation also supports Azure IoT Central Digital Twin Definition Language (DTDL V2) for “automagic” device provisioning.
The first step was to configure and Azure IoT Central enrollment group (ensure “Automatically connect devices in this group” is on for “zero touch” provisioning) and copy the IDScope and Group Enrollment key to the TTI Connector configuration


I then created an Azure IoT Central template for my RAK3172 breakout board based.Net Core powered test device.



{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7;1",
"@type": "Interface",
"contents": [
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:temperature_0;1",
"@type": [
"Telemetry",
"Temperature"
],
"displayName": {
"en": "Temperature"
},
"name": "temperature_0",
"schema": "double",
"unit": "degreeCelsius"
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:relative_humidity_0;1",
"@type": [
"Telemetry",
"RelativeHumidity"
],
"displayName": {
"en": "Humidity"
},
"name": "relative_humidity_0",
"schema": "double",
"unit": "percent"
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:value_0;1",
"@type": "Command",
"displayName": {
"en": "Temperature OOB alert minimum"
},
"name": "value_0",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "Minimum"
},
"name": "value_0",
"schema": "double"
},
"durable": true
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:value_1;1",
"@type": "Command",
"displayName": {
"en": "Temperature OOB alert maximum"
},
"name": "value_1",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "Maximum"
},
"name": "value_1",
"schema": "double"
},
"durable": true
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:TemperatureOOBAlertMinimumAndMaximum;1",
"@type": "Command",
"displayName": {
"en": "Temperature OOB alert minimum and maximum"
},
"name": "TemperatureOOBAlertMinimumAndMaximum",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "Alert Temperature"
},
"name": "AlertTemperature",
"schema": {
"@type": "Object",
"displayName": {
"en": "Object"
},
"fields": [
{
"displayName": {
"en": "minimum"
},
"name": "value_0",
"schema": "double"
},
{
"displayName": {
"en": "maximum"
},
"name": "value_1",
"schema": "double"
}
]
}
},
"durable": true
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:value_2;1",
"@type": "Command",
"displayName": {
"en": "Fan"
},
"name": "value_2",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "On"
},
"name": "value_3",
"schema": {
"@type": "Enum",
"displayName": {
"en": "Enum"
},
"enumValues": [
{
"displayName": {
"en": "On"
},
"enumValue": 1,
"name": "On"
},
{
"displayName": {
"en": "Off"
},
"enumValue": 0,
"name": "Off"
}
],
"valueSchema": "integer"
}
},
"durable": true
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:LightsGoOn;1",
"@type": "Command",
"displayName": {
"en": "LightsGoOn"
},
"name": "LightsGoOn",
"durable": true
},
{
"@id": "dtmi:ttnv3connectorclient:RASK3172Breakout1c7:LightsGoOff;1",
"@type": "Command",
"displayName": {
"en": "LightsGoOff"
},
"name": "LightsGoOff",
"durable": true
}
],
"displayName": {
"en": "RASK3172 Breakout"
},
"@context": [
"dtmi:iotcentral:context;2",
"dtmi:dtdl:context;2"
]
}

The Device Template @Id can also be set for a TTI application using an optional dtdlmodelid which is specified the the TTI Connector configuration.
