Configure Azure Device Registry Assets

The azure-native:deviceregistry:Asset resource, part of the Pulumi Azure Native provider, defines industrial assets in Azure Device Registry: their connection profiles, data collection points, and event subscriptions. This guide focuses on two capabilities: dataset and event configuration for telemetry collection, and external asset ID correlation with inventory systems.

Assets depend on asset endpoint profiles for connectivity, Azure Arc custom locations for deployment, and resource groups for organization. The examples are intentionally small. Combine them with your own endpoint profiles, custom locations, and OPC UA server configuration.

Define an asset with datasets and events

Industrial IoT deployments model physical equipment as digital assets that collect telemetry through datasets and respond to state changes through events.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const asset = new azure_native.deviceregistry.Asset("asset", {
    assetEndpointProfileRef: "myAssetEndpointProfile",
    assetName: "my-asset",
    datasets: [{
        dataPoints: [
            {
                dataPointConfiguration: "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                dataSource: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                name: "dataPoint1",
                observabilityMode: azure_native.deviceregistry.DataPointObservabilityMode.Counter,
            },
            {
                dataPointConfiguration: "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                dataSource: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                name: "dataPoint2",
                observabilityMode: azure_native.deviceregistry.DataPointObservabilityMode.None,
            },
        ],
        datasetConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        name: "dataset1",
        topic: {
            path: "/path/dataset1",
            retain: azure_native.deviceregistry.TopicRetainType.Keep,
        },
    }],
    defaultDatasetsConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    defaultEventsConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    defaultTopic: {
        path: "/path/defaultTopic",
        retain: azure_native.deviceregistry.TopicRetainType.Keep,
    },
    description: "This is a sample Asset",
    discoveredAssetRefs: [
        "discoveredAsset1",
        "discoveredAsset2",
    ],
    displayName: "AssetDisplayName",
    documentationUri: "https://www.example.com/manual",
    enabled: true,
    events: [
        {
            eventConfiguration: "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
            eventNotifier: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
            name: "event1",
            observabilityMode: azure_native.deviceregistry.EventObservabilityMode.None,
            topic: {
                path: "/path/event1",
                retain: azure_native.deviceregistry.TopicRetainType.Keep,
            },
        },
        {
            eventConfiguration: "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
            eventNotifier: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
            name: "event2",
            observabilityMode: azure_native.deviceregistry.EventObservabilityMode.Log,
        },
    ],
    extendedLocation: {
        name: "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
        type: "CustomLocation",
    },
    externalAssetId: "8ZBA6LRHU0A458969",
    hardwareRevision: "1.0",
    location: "West Europe",
    manufacturer: "Contoso",
    manufacturerUri: "https://www.contoso.com/manufacturerUri",
    model: "ContosoModel",
    productCode: "SA34VDG",
    resourceGroupName: "myResourceGroup",
    serialNumber: "64-103816-519918-8",
    softwareRevision: "2.0",
    tags: {
        site: "building-1",
    },
});
import pulumi
import pulumi_azure_native as azure_native

asset = azure_native.deviceregistry.Asset("asset",
    asset_endpoint_profile_ref="myAssetEndpointProfile",
    asset_name="my-asset",
    datasets=[{
        "data_points": [
            {
                "data_point_configuration": "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                "data_source": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                "name": "dataPoint1",
                "observability_mode": azure_native.deviceregistry.DataPointObservabilityMode.COUNTER,
            },
            {
                "data_point_configuration": "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                "data_source": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                "name": "dataPoint2",
                "observability_mode": azure_native.deviceregistry.DataPointObservabilityMode.NONE,
            },
        ],
        "dataset_configuration": "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        "name": "dataset1",
        "topic": {
            "path": "/path/dataset1",
            "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
        },
    }],
    default_datasets_configuration="{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    default_events_configuration="{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    default_topic={
        "path": "/path/defaultTopic",
        "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
    },
    description="This is a sample Asset",
    discovered_asset_refs=[
        "discoveredAsset1",
        "discoveredAsset2",
    ],
    display_name="AssetDisplayName",
    documentation_uri="https://www.example.com/manual",
    enabled=True,
    events=[
        {
            "event_configuration": "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
            "event_notifier": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
            "name": "event1",
            "observability_mode": azure_native.deviceregistry.EventObservabilityMode.NONE,
            "topic": {
                "path": "/path/event1",
                "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
            },
        },
        {
            "event_configuration": "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
            "event_notifier": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
            "name": "event2",
            "observability_mode": azure_native.deviceregistry.EventObservabilityMode.LOG,
        },
    ],
    extended_location={
        "name": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
        "type": "CustomLocation",
    },
    external_asset_id="8ZBA6LRHU0A458969",
    hardware_revision="1.0",
    location="West Europe",
    manufacturer="Contoso",
    manufacturer_uri="https://www.contoso.com/manufacturerUri",
    model="ContosoModel",
    product_code="SA34VDG",
    resource_group_name="myResourceGroup",
    serial_number="64-103816-519918-8",
    software_revision="2.0",
    tags={
        "site": "building-1",
    })
package main

import (
	deviceregistry "github.com/pulumi/pulumi-azure-native-sdk/deviceregistry/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := deviceregistry.NewAsset(ctx, "asset", &deviceregistry.AssetArgs{
			AssetEndpointProfileRef: pulumi.String("myAssetEndpointProfile"),
			AssetName:               pulumi.String("my-asset"),
			Datasets: deviceregistry.DatasetArray{
				&deviceregistry.DatasetArgs{
					DataPoints: deviceregistry.DataPointArray{
						&deviceregistry.DataPointArgs{
							DataPointConfiguration: pulumi.String("{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}"),
							DataSource:             pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1"),
							Name:                   pulumi.String("dataPoint1"),
							ObservabilityMode:      pulumi.String(deviceregistry.DataPointObservabilityModeCounter),
						},
						&deviceregistry.DataPointArgs{
							DataPointConfiguration: pulumi.String("{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}"),
							DataSource:             pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2"),
							Name:                   pulumi.String("dataPoint2"),
							ObservabilityMode:      pulumi.String(deviceregistry.DataPointObservabilityModeNone),
						},
					},
					DatasetConfiguration: pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
					Name:                 pulumi.String("dataset1"),
					Topic: &deviceregistry.TopicArgs{
						Path:   pulumi.String("/path/dataset1"),
						Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
					},
				},
			},
			DefaultDatasetsConfiguration: pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
			DefaultEventsConfiguration:   pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
			DefaultTopic: &deviceregistry.TopicArgs{
				Path:   pulumi.String("/path/defaultTopic"),
				Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
			},
			Description: pulumi.String("This is a sample Asset"),
			DiscoveredAssetRefs: pulumi.StringArray{
				pulumi.String("discoveredAsset1"),
				pulumi.String("discoveredAsset2"),
			},
			DisplayName:      pulumi.String("AssetDisplayName"),
			DocumentationUri: pulumi.String("https://www.example.com/manual"),
			Enabled:          pulumi.Bool(true),
			Events: deviceregistry.EventArray{
				&deviceregistry.EventArgs{
					EventConfiguration: pulumi.String("{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}"),
					EventNotifier:      pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3"),
					Name:               pulumi.String("event1"),
					ObservabilityMode:  pulumi.String(deviceregistry.EventObservabilityModeNone),
					Topic: &deviceregistry.TopicArgs{
						Path:   pulumi.String("/path/event1"),
						Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
					},
				},
				&deviceregistry.EventArgs{
					EventConfiguration: pulumi.String("{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}"),
					EventNotifier:      pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4"),
					Name:               pulumi.String("event2"),
					ObservabilityMode:  pulumi.String(deviceregistry.EventObservabilityModeLog),
				},
			},
			ExtendedLocation: &deviceregistry.ExtendedLocationArgs{
				Name: pulumi.String("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1"),
				Type: pulumi.String("CustomLocation"),
			},
			ExternalAssetId:   pulumi.String("8ZBA6LRHU0A458969"),
			HardwareRevision:  pulumi.String("1.0"),
			Location:          pulumi.String("West Europe"),
			Manufacturer:      pulumi.String("Contoso"),
			ManufacturerUri:   pulumi.String("https://www.contoso.com/manufacturerUri"),
			Model:             pulumi.String("ContosoModel"),
			ProductCode:       pulumi.String("SA34VDG"),
			ResourceGroupName: pulumi.String("myResourceGroup"),
			SerialNumber:      pulumi.String("64-103816-519918-8"),
			SoftwareRevision:  pulumi.String("2.0"),
			Tags: pulumi.StringMap{
				"site": pulumi.String("building-1"),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var asset = new AzureNative.DeviceRegistry.Asset("asset", new()
    {
        AssetEndpointProfileRef = "myAssetEndpointProfile",
        AssetName = "my-asset",
        Datasets = new[]
        {
            new AzureNative.DeviceRegistry.Inputs.DatasetArgs
            {
                DataPoints = new[]
                {
                    new AzureNative.DeviceRegistry.Inputs.DataPointArgs
                    {
                        DataPointConfiguration = "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                        DataSource = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                        Name = "dataPoint1",
                        ObservabilityMode = AzureNative.DeviceRegistry.DataPointObservabilityMode.Counter,
                    },
                    new AzureNative.DeviceRegistry.Inputs.DataPointArgs
                    {
                        DataPointConfiguration = "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                        DataSource = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                        Name = "dataPoint2",
                        ObservabilityMode = AzureNative.DeviceRegistry.DataPointObservabilityMode.None,
                    },
                },
                DatasetConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
                Name = "dataset1",
                Topic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
                {
                    Path = "/path/dataset1",
                    Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
                },
            },
        },
        DefaultDatasetsConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        DefaultEventsConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        DefaultTopic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
        {
            Path = "/path/defaultTopic",
            Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
        },
        Description = "This is a sample Asset",
        DiscoveredAssetRefs = new[]
        {
            "discoveredAsset1",
            "discoveredAsset2",
        },
        DisplayName = "AssetDisplayName",
        DocumentationUri = "https://www.example.com/manual",
        Enabled = true,
        Events = new[]
        {
            new AzureNative.DeviceRegistry.Inputs.EventArgs
            {
                EventConfiguration = "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
                EventNotifier = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
                Name = "event1",
                ObservabilityMode = AzureNative.DeviceRegistry.EventObservabilityMode.None,
                Topic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
                {
                    Path = "/path/event1",
                    Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
                },
            },
            new AzureNative.DeviceRegistry.Inputs.EventArgs
            {
                EventConfiguration = "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
                EventNotifier = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
                Name = "event2",
                ObservabilityMode = AzureNative.DeviceRegistry.EventObservabilityMode.Log,
            },
        },
        ExtendedLocation = new AzureNative.DeviceRegistry.Inputs.ExtendedLocationArgs
        {
            Name = "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
            Type = "CustomLocation",
        },
        ExternalAssetId = "8ZBA6LRHU0A458969",
        HardwareRevision = "1.0",
        Location = "West Europe",
        Manufacturer = "Contoso",
        ManufacturerUri = "https://www.contoso.com/manufacturerUri",
        Model = "ContosoModel",
        ProductCode = "SA34VDG",
        ResourceGroupName = "myResourceGroup",
        SerialNumber = "64-103816-519918-8",
        SoftwareRevision = "2.0",
        Tags = 
        {
            { "site", "building-1" },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.deviceregistry.Asset;
import com.pulumi.azurenative.deviceregistry.AssetArgs;
import com.pulumi.azurenative.deviceregistry.inputs.DatasetArgs;
import com.pulumi.azurenative.deviceregistry.inputs.TopicArgs;
import com.pulumi.azurenative.deviceregistry.inputs.EventArgs;
import com.pulumi.azurenative.deviceregistry.inputs.ExtendedLocationArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var asset = new Asset("asset", AssetArgs.builder()
            .assetEndpointProfileRef("myAssetEndpointProfile")
            .assetName("my-asset")
            .datasets(DatasetArgs.builder()
                .dataPoints(                
                    DataPointArgs.builder()
                        .dataPointConfiguration("{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}")
                        .dataSource("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1")
                        .name("dataPoint1")
                        .observabilityMode("Counter")
                        .build(),
                    DataPointArgs.builder()
                        .dataPointConfiguration("{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}")
                        .dataSource("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2")
                        .name("dataPoint2")
                        .observabilityMode("None")
                        .build())
                .datasetConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
                .name("dataset1")
                .topic(TopicArgs.builder()
                    .path("/path/dataset1")
                    .retain("Keep")
                    .build())
                .build())
            .defaultDatasetsConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
            .defaultEventsConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
            .defaultTopic(TopicArgs.builder()
                .path("/path/defaultTopic")
                .retain("Keep")
                .build())
            .description("This is a sample Asset")
            .discoveredAssetRefs(            
                "discoveredAsset1",
                "discoveredAsset2")
            .displayName("AssetDisplayName")
            .documentationUri("https://www.example.com/manual")
            .enabled(true)
            .events(            
                EventArgs.builder()
                    .eventConfiguration("{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}")
                    .eventNotifier("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3")
                    .name("event1")
                    .observabilityMode("None")
                    .topic(TopicArgs.builder()
                        .path("/path/event1")
                        .retain("Keep")
                        .build())
                    .build(),
                EventArgs.builder()
                    .eventConfiguration("{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}")
                    .eventNotifier("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4")
                    .name("event2")
                    .observabilityMode("Log")
                    .build())
            .extendedLocation(ExtendedLocationArgs.builder()
                .name("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1")
                .type("CustomLocation")
                .build())
            .externalAssetId("8ZBA6LRHU0A458969")
            .hardwareRevision("1.0")
            .location("West Europe")
            .manufacturer("Contoso")
            .manufacturerUri("https://www.contoso.com/manufacturerUri")
            .model("ContosoModel")
            .productCode("SA34VDG")
            .resourceGroupName("myResourceGroup")
            .serialNumber("64-103816-519918-8")
            .softwareRevision("2.0")
            .tags(Map.of("site", "building-1"))
            .build());

    }
}
resources:
  asset:
    type: azure-native:deviceregistry:Asset
    properties:
      assetEndpointProfileRef: myAssetEndpointProfile
      assetName: my-asset
      datasets:
        - dataPoints:
            - dataPointConfiguration: '{"publishingInterval":8,"samplingInterval":8,"queueSize":4}'
              dataSource: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1
              name: dataPoint1
              observabilityMode: Counter
            - dataPointConfiguration: '{"publishingInterval":4,"samplingInterval":4,"queueSize":7}'
              dataSource: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2
              name: dataPoint2
              observabilityMode: None
          datasetConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
          name: dataset1
          topic:
            path: /path/dataset1
            retain: Keep
      defaultDatasetsConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
      defaultEventsConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
      defaultTopic:
        path: /path/defaultTopic
        retain: Keep
      description: This is a sample Asset
      discoveredAssetRefs:
        - discoveredAsset1
        - discoveredAsset2
      displayName: AssetDisplayName
      documentationUri: https://www.example.com/manual
      enabled: true
      events:
        - eventConfiguration: '{"publishingInterval":7,"samplingInterval":1,"queueSize":8}'
          eventNotifier: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3
          name: event1
          observabilityMode: None
          topic:
            path: /path/event1
            retain: Keep
        - eventConfiguration: '{"publishingInterval":7,"samplingInterval":8,"queueSize":4}'
          eventNotifier: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4
          name: event2
          observabilityMode: Log
      extendedLocation:
        name: /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1
        type: CustomLocation
      externalAssetId: 8ZBA6LRHU0A458969
      hardwareRevision: '1.0'
      location: West Europe
      manufacturer: Contoso
      manufacturerUri: https://www.contoso.com/manufacturerUri
      model: ContosoModel
      productCode: SA34VDG
      resourceGroupName: myResourceGroup
      serialNumber: 64-103816-519918-8
      softwareRevision: '2.0'
      tags:
        site: building-1

The asset connects to an OPC UA server through the assetEndpointProfileRef. Datasets group related data points; each dataPoint specifies a dataSource (OPC UA node identifier) and observabilityMode (how the data is exposed for monitoring). Events work similarly: each event has an eventNotifier that points to an OPC UA event source. The dataPointConfiguration and eventConfiguration properties contain JSON strings with protocol-specific settings like publishingInterval and samplingInterval, which control how frequently the connector polls the server and publishes data.

Organizations with existing asset management systems maintain references between Azure assets and external inventory databases.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const asset = new azure_native.deviceregistry.Asset("asset", {
    assetEndpointProfileRef: "myAssetEndpointProfile",
    assetName: "my-asset",
    datasets: [{
        dataPoints: [
            {
                dataPointConfiguration: "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                dataSource: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                name: "dataPoint1",
                observabilityMode: azure_native.deviceregistry.DataPointObservabilityMode.Counter,
            },
            {
                dataPointConfiguration: "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                dataSource: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                name: "dataPoint2",
                observabilityMode: azure_native.deviceregistry.DataPointObservabilityMode.None,
            },
        ],
        datasetConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        name: "dataset1",
        topic: {
            path: "/path/dataset1",
            retain: azure_native.deviceregistry.TopicRetainType.Keep,
        },
    }],
    defaultDatasetsConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    defaultEventsConfiguration: "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    defaultTopic: {
        path: "/path/defaultTopic",
        retain: azure_native.deviceregistry.TopicRetainType.Keep,
    },
    description: "This is a sample Asset",
    displayName: "AssetDisplayName",
    documentationUri: "https://www.example.com/manual",
    enabled: true,
    events: [
        {
            eventConfiguration: "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
            eventNotifier: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
            name: "event1",
            observabilityMode: azure_native.deviceregistry.EventObservabilityMode.None,
            topic: {
                path: "/path/event1",
                retain: azure_native.deviceregistry.TopicRetainType.Keep,
            },
        },
        {
            eventConfiguration: "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
            eventNotifier: "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
            name: "event2",
            observabilityMode: azure_native.deviceregistry.EventObservabilityMode.Log,
        },
    ],
    extendedLocation: {
        name: "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
        type: "CustomLocation",
    },
    externalAssetId: "8ZBA6LRHU0A458969",
    hardwareRevision: "1.0",
    location: "West Europe",
    manufacturer: "Contoso",
    manufacturerUri: "https://www.contoso.com/manufacturerUri",
    model: "ContosoModel",
    productCode: "SA34VDG",
    resourceGroupName: "myResourceGroup",
    serialNumber: "64-103816-519918-8",
    softwareRevision: "2.0",
    tags: {
        site: "building-1",
    },
});
import pulumi
import pulumi_azure_native as azure_native

asset = azure_native.deviceregistry.Asset("asset",
    asset_endpoint_profile_ref="myAssetEndpointProfile",
    asset_name="my-asset",
    datasets=[{
        "data_points": [
            {
                "data_point_configuration": "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                "data_source": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                "name": "dataPoint1",
                "observability_mode": azure_native.deviceregistry.DataPointObservabilityMode.COUNTER,
            },
            {
                "data_point_configuration": "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                "data_source": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                "name": "dataPoint2",
                "observability_mode": azure_native.deviceregistry.DataPointObservabilityMode.NONE,
            },
        ],
        "dataset_configuration": "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        "name": "dataset1",
        "topic": {
            "path": "/path/dataset1",
            "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
        },
    }],
    default_datasets_configuration="{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    default_events_configuration="{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
    default_topic={
        "path": "/path/defaultTopic",
        "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
    },
    description="This is a sample Asset",
    display_name="AssetDisplayName",
    documentation_uri="https://www.example.com/manual",
    enabled=True,
    events=[
        {
            "event_configuration": "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
            "event_notifier": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
            "name": "event1",
            "observability_mode": azure_native.deviceregistry.EventObservabilityMode.NONE,
            "topic": {
                "path": "/path/event1",
                "retain": azure_native.deviceregistry.TopicRetainType.KEEP,
            },
        },
        {
            "event_configuration": "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
            "event_notifier": "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
            "name": "event2",
            "observability_mode": azure_native.deviceregistry.EventObservabilityMode.LOG,
        },
    ],
    extended_location={
        "name": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
        "type": "CustomLocation",
    },
    external_asset_id="8ZBA6LRHU0A458969",
    hardware_revision="1.0",
    location="West Europe",
    manufacturer="Contoso",
    manufacturer_uri="https://www.contoso.com/manufacturerUri",
    model="ContosoModel",
    product_code="SA34VDG",
    resource_group_name="myResourceGroup",
    serial_number="64-103816-519918-8",
    software_revision="2.0",
    tags={
        "site": "building-1",
    })
package main

import (
	deviceregistry "github.com/pulumi/pulumi-azure-native-sdk/deviceregistry/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := deviceregistry.NewAsset(ctx, "asset", &deviceregistry.AssetArgs{
			AssetEndpointProfileRef: pulumi.String("myAssetEndpointProfile"),
			AssetName:               pulumi.String("my-asset"),
			Datasets: deviceregistry.DatasetArray{
				&deviceregistry.DatasetArgs{
					DataPoints: deviceregistry.DataPointArray{
						&deviceregistry.DataPointArgs{
							DataPointConfiguration: pulumi.String("{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}"),
							DataSource:             pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1"),
							Name:                   pulumi.String("dataPoint1"),
							ObservabilityMode:      pulumi.String(deviceregistry.DataPointObservabilityModeCounter),
						},
						&deviceregistry.DataPointArgs{
							DataPointConfiguration: pulumi.String("{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}"),
							DataSource:             pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2"),
							Name:                   pulumi.String("dataPoint2"),
							ObservabilityMode:      pulumi.String(deviceregistry.DataPointObservabilityModeNone),
						},
					},
					DatasetConfiguration: pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
					Name:                 pulumi.String("dataset1"),
					Topic: &deviceregistry.TopicArgs{
						Path:   pulumi.String("/path/dataset1"),
						Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
					},
				},
			},
			DefaultDatasetsConfiguration: pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
			DefaultEventsConfiguration:   pulumi.String("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}"),
			DefaultTopic: &deviceregistry.TopicArgs{
				Path:   pulumi.String("/path/defaultTopic"),
				Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
			},
			Description:      pulumi.String("This is a sample Asset"),
			DisplayName:      pulumi.String("AssetDisplayName"),
			DocumentationUri: pulumi.String("https://www.example.com/manual"),
			Enabled:          pulumi.Bool(true),
			Events: deviceregistry.EventArray{
				&deviceregistry.EventArgs{
					EventConfiguration: pulumi.String("{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}"),
					EventNotifier:      pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3"),
					Name:               pulumi.String("event1"),
					ObservabilityMode:  pulumi.String(deviceregistry.EventObservabilityModeNone),
					Topic: &deviceregistry.TopicArgs{
						Path:   pulumi.String("/path/event1"),
						Retain: pulumi.String(deviceregistry.TopicRetainTypeKeep),
					},
				},
				&deviceregistry.EventArgs{
					EventConfiguration: pulumi.String("{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}"),
					EventNotifier:      pulumi.String("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4"),
					Name:               pulumi.String("event2"),
					ObservabilityMode:  pulumi.String(deviceregistry.EventObservabilityModeLog),
				},
			},
			ExtendedLocation: &deviceregistry.ExtendedLocationArgs{
				Name: pulumi.String("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1"),
				Type: pulumi.String("CustomLocation"),
			},
			ExternalAssetId:   pulumi.String("8ZBA6LRHU0A458969"),
			HardwareRevision:  pulumi.String("1.0"),
			Location:          pulumi.String("West Europe"),
			Manufacturer:      pulumi.String("Contoso"),
			ManufacturerUri:   pulumi.String("https://www.contoso.com/manufacturerUri"),
			Model:             pulumi.String("ContosoModel"),
			ProductCode:       pulumi.String("SA34VDG"),
			ResourceGroupName: pulumi.String("myResourceGroup"),
			SerialNumber:      pulumi.String("64-103816-519918-8"),
			SoftwareRevision:  pulumi.String("2.0"),
			Tags: pulumi.StringMap{
				"site": pulumi.String("building-1"),
			},
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;

return await Deployment.RunAsync(() => 
{
    var asset = new AzureNative.DeviceRegistry.Asset("asset", new()
    {
        AssetEndpointProfileRef = "myAssetEndpointProfile",
        AssetName = "my-asset",
        Datasets = new[]
        {
            new AzureNative.DeviceRegistry.Inputs.DatasetArgs
            {
                DataPoints = new[]
                {
                    new AzureNative.DeviceRegistry.Inputs.DataPointArgs
                    {
                        DataPointConfiguration = "{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}",
                        DataSource = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1",
                        Name = "dataPoint1",
                        ObservabilityMode = AzureNative.DeviceRegistry.DataPointObservabilityMode.Counter,
                    },
                    new AzureNative.DeviceRegistry.Inputs.DataPointArgs
                    {
                        DataPointConfiguration = "{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}",
                        DataSource = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2",
                        Name = "dataPoint2",
                        ObservabilityMode = AzureNative.DeviceRegistry.DataPointObservabilityMode.None,
                    },
                },
                DatasetConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
                Name = "dataset1",
                Topic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
                {
                    Path = "/path/dataset1",
                    Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
                },
            },
        },
        DefaultDatasetsConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        DefaultEventsConfiguration = "{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}",
        DefaultTopic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
        {
            Path = "/path/defaultTopic",
            Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
        },
        Description = "This is a sample Asset",
        DisplayName = "AssetDisplayName",
        DocumentationUri = "https://www.example.com/manual",
        Enabled = true,
        Events = new[]
        {
            new AzureNative.DeviceRegistry.Inputs.EventArgs
            {
                EventConfiguration = "{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}",
                EventNotifier = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3",
                Name = "event1",
                ObservabilityMode = AzureNative.DeviceRegistry.EventObservabilityMode.None,
                Topic = new AzureNative.DeviceRegistry.Inputs.TopicArgs
                {
                    Path = "/path/event1",
                    Retain = AzureNative.DeviceRegistry.TopicRetainType.Keep,
                },
            },
            new AzureNative.DeviceRegistry.Inputs.EventArgs
            {
                EventConfiguration = "{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}",
                EventNotifier = "nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4",
                Name = "event2",
                ObservabilityMode = AzureNative.DeviceRegistry.EventObservabilityMode.Log,
            },
        },
        ExtendedLocation = new AzureNative.DeviceRegistry.Inputs.ExtendedLocationArgs
        {
            Name = "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1",
            Type = "CustomLocation",
        },
        ExternalAssetId = "8ZBA6LRHU0A458969",
        HardwareRevision = "1.0",
        Location = "West Europe",
        Manufacturer = "Contoso",
        ManufacturerUri = "https://www.contoso.com/manufacturerUri",
        Model = "ContosoModel",
        ProductCode = "SA34VDG",
        ResourceGroupName = "myResourceGroup",
        SerialNumber = "64-103816-519918-8",
        SoftwareRevision = "2.0",
        Tags = 
        {
            { "site", "building-1" },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.deviceregistry.Asset;
import com.pulumi.azurenative.deviceregistry.AssetArgs;
import com.pulumi.azurenative.deviceregistry.inputs.DatasetArgs;
import com.pulumi.azurenative.deviceregistry.inputs.TopicArgs;
import com.pulumi.azurenative.deviceregistry.inputs.EventArgs;
import com.pulumi.azurenative.deviceregistry.inputs.ExtendedLocationArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var asset = new Asset("asset", AssetArgs.builder()
            .assetEndpointProfileRef("myAssetEndpointProfile")
            .assetName("my-asset")
            .datasets(DatasetArgs.builder()
                .dataPoints(                
                    DataPointArgs.builder()
                        .dataPointConfiguration("{\"publishingInterval\":8,\"samplingInterval\":8,\"queueSize\":4}")
                        .dataSource("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1")
                        .name("dataPoint1")
                        .observabilityMode("Counter")
                        .build(),
                    DataPointArgs.builder()
                        .dataPointConfiguration("{\"publishingInterval\":4,\"samplingInterval\":4,\"queueSize\":7}")
                        .dataSource("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2")
                        .name("dataPoint2")
                        .observabilityMode("None")
                        .build())
                .datasetConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
                .name("dataset1")
                .topic(TopicArgs.builder()
                    .path("/path/dataset1")
                    .retain("Keep")
                    .build())
                .build())
            .defaultDatasetsConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
            .defaultEventsConfiguration("{\"publishingInterval\":10,\"samplingInterval\":15,\"queueSize\":20}")
            .defaultTopic(TopicArgs.builder()
                .path("/path/defaultTopic")
                .retain("Keep")
                .build())
            .description("This is a sample Asset")
            .displayName("AssetDisplayName")
            .documentationUri("https://www.example.com/manual")
            .enabled(true)
            .events(            
                EventArgs.builder()
                    .eventConfiguration("{\"publishingInterval\":7,\"samplingInterval\":1,\"queueSize\":8}")
                    .eventNotifier("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3")
                    .name("event1")
                    .observabilityMode("None")
                    .topic(TopicArgs.builder()
                        .path("/path/event1")
                        .retain("Keep")
                        .build())
                    .build(),
                EventArgs.builder()
                    .eventConfiguration("{\"publishingInterval\":7,\"samplingInterval\":8,\"queueSize\":4}")
                    .eventNotifier("nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4")
                    .name("event2")
                    .observabilityMode("Log")
                    .build())
            .extendedLocation(ExtendedLocationArgs.builder()
                .name("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1")
                .type("CustomLocation")
                .build())
            .externalAssetId("8ZBA6LRHU0A458969")
            .hardwareRevision("1.0")
            .location("West Europe")
            .manufacturer("Contoso")
            .manufacturerUri("https://www.contoso.com/manufacturerUri")
            .model("ContosoModel")
            .productCode("SA34VDG")
            .resourceGroupName("myResourceGroup")
            .serialNumber("64-103816-519918-8")
            .softwareRevision("2.0")
            .tags(Map.of("site", "building-1"))
            .build());

    }
}
resources:
  asset:
    type: azure-native:deviceregistry:Asset
    properties:
      assetEndpointProfileRef: myAssetEndpointProfile
      assetName: my-asset
      datasets:
        - dataPoints:
            - dataPointConfiguration: '{"publishingInterval":8,"samplingInterval":8,"queueSize":4}'
              dataSource: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1
              name: dataPoint1
              observabilityMode: Counter
            - dataPointConfiguration: '{"publishingInterval":4,"samplingInterval":4,"queueSize":7}'
              dataSource: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2
              name: dataPoint2
              observabilityMode: None
          datasetConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
          name: dataset1
          topic:
            path: /path/dataset1
            retain: Keep
      defaultDatasetsConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
      defaultEventsConfiguration: '{"publishingInterval":10,"samplingInterval":15,"queueSize":20}'
      defaultTopic:
        path: /path/defaultTopic
        retain: Keep
      description: This is a sample Asset
      displayName: AssetDisplayName
      documentationUri: https://www.example.com/manual
      enabled: true
      events:
        - eventConfiguration: '{"publishingInterval":7,"samplingInterval":1,"queueSize":8}'
          eventNotifier: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt3
          name: event1
          observabilityMode: None
          topic:
            path: /path/event1
            retain: Keep
        - eventConfiguration: '{"publishingInterval":7,"samplingInterval":8,"queueSize":4}'
          eventNotifier: nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt4
          name: event2
          observabilityMode: Log
      extendedLocation:
        name: /subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myResourceGroup/providers/microsoft.extendedlocation/customlocations/location1
        type: CustomLocation
      externalAssetId: 8ZBA6LRHU0A458969
      hardwareRevision: '1.0'
      location: West Europe
      manufacturer: Contoso
      manufacturerUri: https://www.contoso.com/manufacturerUri
      model: ContosoModel
      productCode: SA34VDG
      resourceGroupName: myResourceGroup
      serialNumber: 64-103816-519918-8
      softwareRevision: '2.0'
      tags:
        site: building-1

The externalAssetId property stores your organization’s asset identifier, enabling correlation between Device Registry and external CMDB or ERP systems. This is immutable after creation, ensuring stable cross-system references.

Beyond these examples

These snippets focus on specific asset-level features: dataset and event configuration, external asset correlation, and OPC UA data point mapping. They’re intentionally minimal rather than full industrial IoT solutions.

The examples reference pre-existing infrastructure such as asset endpoint profiles (connection information), Azure Arc custom locations, and resource groups and subscriptions. They focus on configuring the asset rather than provisioning the surrounding infrastructure.

To keep things focused, common asset patterns are omitted, including:

  • Custom attributes for asset metadata (attributes)
  • Discovery flow integration (discoveredAssetRefs usage patterns)
  • Topic configuration and MQTT routing (topic paths and retention)
  • Per-dataset and per-event configuration overrides
  • Status monitoring and provisioning state handling

These omissions are intentional: the goal is to illustrate how each asset feature is wired, not provide drop-in IoT modules. See the Asset resource reference for all available configuration options.

Let's configure Azure Device Registry Assets

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Resource Configuration & Requirements
What's required to create an asset?
Three properties are required: assetEndpointProfileRef (reference to endpoint profile), extendedLocation (with name and type), and location (geo-location).
What properties can't I change after creating an asset?
Seven properties are immutable: assetEndpointProfileRef, extendedLocation, location, assetName, discoveredAssetRefs, externalAssetId, and resourceGroupName. Changing these requires resource replacement.
Is displayName required?
No, displayName is optional. The example “Create_Asset_Without_DisplayName” demonstrates creating an asset without this property.
Data Points & Events Configuration
How do I configure data points in datasets?
Each data point requires dataPointConfiguration (JSON string with publishingInterval, samplingInterval, queueSize), dataSource (OPC UA node identifier), name, and observabilityMode.
What's the format for configuration JSON strings?
Configuration JSON strings contain connector-specific settings like {"publishingInterval":10,"samplingInterval":15,"queueSize":20}. Use defaultDatasetsConfiguration and defaultEventsConfiguration for defaults that individual items can override.
What observability modes are available?
Data points support Counter and None modes. Events support None and Log modes.
How do topics work for datasets and events?
Configure defaultTopic with path and retain settings for all datasets/events. Individual datasets and events can override with their own topic configuration.
Asset Identification
What's the difference between discoveredAssetRefs and externalAssetId?
discoveredAssetRefs references discovered assets from the discovery flow, while externalAssetId is a customer-provided identifier. Both are immutable and optional; use the one that fits your workflow.
API Versions & Migration
How do I use a different API version?
Generate a local SDK package using pulumi package add azure-native deviceregistry [ApiVersion]. Available versions include 2023-11-01-preview, 2024-09-01-preview, 2025-07-01-preview, 2025-10-01, and 2025-11-01-preview.
What changed from Azure Native provider v2.x?
Version 2.x used API version 2023-11-01-preview, while current versions use 2024-11-01 by default.

Using a different cloud?

Explore integration guides for other cloud providers: