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.
Link assets to external inventory systems
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 FREEFrequently Asked Questions
Resource Configuration & Requirements
assetEndpointProfileRef (reference to endpoint profile), extendedLocation (with name and type), and location (geo-location).assetEndpointProfileRef, extendedLocation, location, assetName, discoveredAssetRefs, externalAssetId, and resourceGroupName. Changing these requires resource replacement.displayName is optional. The example “Create_Asset_Without_DisplayName” demonstrates creating an asset without this property.Data Points & Events Configuration
dataPointConfiguration (JSON string with publishingInterval, samplingInterval, queueSize), dataSource (OPC UA node identifier), name, and observabilityMode.{"publishingInterval":10,"samplingInterval":15,"queueSize":20}. Use defaultDatasetsConfiguration and defaultEventsConfiguration for defaults that individual items can override.Counter and None modes. Events support None and Log modes.defaultTopic with path and retain settings for all datasets/events. Individual datasets and events can override with their own topic configuration.Asset Identification
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
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.Using a different cloud?
Explore integration guides for other cloud providers: