# Ignition 8.3 SDK UA Device - activating and deactivating items

**URL:** <https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618>\
**Category:** Module Development\
**Tags:** sdk, ignition83\
**Created:** [May 20, 2026, 9:59am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618 "2026-05-20T09:59:01Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![michael.haedrich](https://avatars.discourse-cdn.com/v4/letter/m/e47c2d/32.png) [@michael.haedrich](https://forum.inductiveautomation.com/u/michael.haedrich)\
**Post date:** [May 20, 2026, 9:59am UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/1 "2026-05-20T09:59:01Z")

</div>

In order to manage the set of items to be acquired in a UA Device I am trying to use the hooks:

> ```python
> @Override
> public void onDataItemsCreated(List dataItems) {
> subscriptionModel.onDataItemsCreated(dataItems);
> }
> @Override
> public void onDataItemsModified(List dataItems) {
> subscriptionModel.onDataItemsModified(dataItems);
> }
> @Override
> public void onDataItemsDeleted(List dataItems) {
> subscriptionModel.onDataItemsDeleted(dataItems);
> }
> 
> ```

But these methods never fire in the debugger when referencing/displaying the datapoints in the application. So I tried to use these hooks:

> `/\*\*
> 
> - Called when a new item (tag) is added to this device.  
> \*/  
> @Override  
> public void onDeviceItemAdded(DeviceItem item) {  
> logger.info("Item added for data acquisition: {}", item.getNodeId());  
> super.onDeviceItemAdded(item);  
> }`
> 
> `/\*\*
> 
> - Called when an item becomes active (Ignition client starts subscribing to it).  
> \*/  
> @Override  
> public void onDeviceItemActivated(DeviceItem item) {  
> logger.info("Item activated: {}", item.getNodeId());  
> // You could start polling or reading hardware here.  
> super.onDeviceItemActivated(item);  
> }`
> 
> `/\*\*
> 
> - Called when the item is deactivated (no subscribers).  
> \*/  
> @Override  
> public void onDeviceItemDeactivated(DeviceItem item) {  
> logger.info("Item deactivated: {}", item.getNodeId());  
> super.onDeviceItemDeactivated(item);  
> }`

But the corresonding references don't resolve in the POM:

> `<dependency>`  
> ` <groupId>com.inductiveautomation.ignition</groupId>`  
> ` <artifactId>opc-ua</artifactId>`  
> ` <version>8.3.4</version>`  
> ` <scope>provided</scope>`  
> ` </dependency>`  
> ` <!-- XOPC Driver API (DeviceItem, DriverContext, etc.) -->`  
> ` <dependency>`  
> ` <groupId>com.inductiveautomation.ignition</groupId>`  
> ` <artifactId>xopc-driver-api</artifactId>`  
> ` <version>8.3.6</version>`  
> ` <scope>provided</scope>`  
> ` </dependency>`

Which is the correct way to be informed of items being requested for data updates?

Please advise

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 20, 2026, 12:10pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/2 "2026-05-20T12:10:05Z")

</div>

> [@michael.haedrich](#):
>
> onDeviceItemActivated

> [@michael.haedrich](#):
>
> onDeviceItemDeactivated

Where did you get these method names? They are not part of the `Device` interface. AI hallucinations?

Did you add your driver's address space to the root? And implement the browse operations?

Your device startup should have operations like this:

```python
    context.getServer().getAddressSpaceManager().register(nodeManager);
    nodeManager.addNode(deviceFolder);
    deviceFolder.addReference(new Reference(deviceFolder.getNodeId(),
            NodeIds.Organizes,
            context.getRootNodeId().expanded(),
            false));
    onDataItemsCreated(context.getSubscriptionModel().getDataItems(name));

```

That final call pulls in subscription items that already exist for your device (in the server's subscription model) before your device gets started.

---

<div class="post-metadata">

**Author:** ![michael.haedrich](https://avatars.discourse-cdn.com/v4/letter/m/e47c2d/32.png) [@michael.haedrich](https://forum.inductiveautomation.com/u/michael.haedrich)\
**Post date:** [May 20, 2026, 12:37pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/3 "2026-05-20T12:37:59Z")

</div>

Hello Phil, thanks for the reply. Yes I certainly added the browse address space on startup. But I certainly don't want to acquire data for all items unconditionally (these could be several 100k items). I need to have a hook were the device gets informed which items are actually requested in the application, which would be a dynamically changing subset. Please advise

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 20, 2026, 12:44pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/4 "2026-05-20T12:44:41Z")

</div>

> [@michael.haedrich](#):
>
> don't want to acquire data for all items unconditionally

That call just retrieves the items for **your** device. Tags, on startup, are likely to request their OPC items for your device before your device gets started. So you would miss the method calls at that point. That's why your device startup needs to ask the subscription manager for the items that are already requested.

> [@michael.haedrich](#):
>
> dynamically changing subset

Explain.

Data items are created/deleted only for **subscriptions**. Polling and explicit OPC reads do not create monitored items.

---

<div class="post-metadata">

**Author:** ![michael.haedrich](https://avatars.discourse-cdn.com/v4/letter/m/e47c2d/32.png) [@michael.haedrich](https://forum.inductiveautomation.com/u/michael.haedrich)\
**Post date:** [May 20, 2026, 2:02pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/5 "2026-05-20T14:02:54Z")

</div>

I understand: the call onDataItemsCreated in device startup provides the items already activated before startup. But I created the scenario that after startup I added items in Perspective and the method onDataItemsCreated or onDataItemsModified did not break in the debugger. So just to confirm, these are the correct callbacks for the device to manage the activation and deactivation of subscribed items (plus onDataItemDeleted)?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [May 20, 2026, 3:51pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/6 "2026-05-20T15:51:07Z")

</div>

Yes

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 20, 2026, 4:43pm UTC](https://forum.inductiveautomation.com/t/ignition-8-3-sdk-ua-device-activating-and-deactivating-items/115618/7 "2026-05-20T16:43:50Z")

</div>

> [@michael.haedrich](#):
>
> added items in Perspective

What does this mean? Perspective itself doesn't manipulate OPC subscriptions, unless you are using leased tag groups.

Create a tag in Ignition's tag browser, using a tag group that isn't set to polling, to create a subscription in your driver.
