# Devices

> The device page: its header and verbs, the Device card, the Connection card with the fields each driver shows, credentials and certificates, the Tags grid with mass edit, copying a device, and how duplicates and name collisions are handled.

A **device** is one piece of equipment the station talks to over a driver: how it is reached, and the tags read from it. Select a device row in the Communication column, or press Open on a device row of a driver's, line's or folder's table, to open its page. View connector reads it; Configure connector edits it. Serial lines have their own page, [Serial lines](connector-lines).

## Creating a device {#creating-a-device}

| Gesture | Result |
| --- | --- |
| **New…** > **New device** > **Under `<Driver>`** | A device at the driver's own level. |
| **Add device** on the Devices table of a driver's page | The same. |
| **New device** on a folder's Devices table, or its right-click menu | A device filed in that folder. |
| **Add device** on a serial line's Devices card or right-click menu | A Modbus RTU device on that line, under the first free unit id. |
| **Add device** on a discovery result | A device with the endpoint the scan found and the tags you ticked; see [Discovery](connector-discovery). |
| **Pair device** on the Matter driver | A commissioned Matter node; see [Discovery](connector-discovery#pairing-a-matter-device). |
| **Copy device** on a device | A copy of the selected device, tags included. |

A new device is named "New device" (then "New device 2", and so on), enabled, with a 1000 ms poll interval and unit id 1, and the page opens on it: "Added device 'New device'. Edit its details on the right." A device is refused under a driver the package does not carry, and under Matter, where a device only comes from pairing or discovery ("Use Pair device to add a new Matter node, or Discover to add one already commissioned.").

Connection is never a blocking step: the embedded server onboards the device and connects in a background retry loop, so an unreachable device costs nothing. Its tags read as gaps until the connection lands, and the page shows the last connection error meanwhile.

## The header {#the-header}

The name, the line "One piece of equipment this station talks to: how it is reached, and the tags read from it." and a pill with the **Base URI**, the exact address the embedded server connects to, assembled live from the Connection card (for example `modbus+tcp://192.168.0.10:502/1`, `opc.tcp://plc:4840`, `simulated://CompressedAir`). Under it, one of three notices:

- **Driver not included in this package**: "This device needs the IEC 61850 driver, which this installation does not include, so it stays offline. Its settings are kept and it can be deleted; nothing else here changes what it reads."
- **Waiting for certificate approval** (OPC UA): "This equipment presented a certificate this station has never approved, so nothing is read from it yet. Check the fingerprint with whoever commissioned the equipment, then approve it under Settings, Equipment access." with a **Review certificate** button that opens [Equipment access](settings-opcua-equipment) on that certificate.
- Otherwise the device's last error text in red, when there is one (see [Enabling and health](connector-health#last-error)).

## The command bar {#the-command-bar}

| Command | What it does | Greyed when (situation) | Not drawn when (role) |
| --- | --- | --- | --- |
| **Reconnect** | Closes this device's connection and opens it again, touching no other device. The feed waits for the driver and then says what happened: "Reconnected 'Furnace'.", or "Couldn't reconnect 'Furnace':" with the cause. Nothing is reloaded, and a device that only answers later still comes back on its own. | A scan or a pairing is running, a run holds the station, the runtime is stopped. | Without Configure connector. |
| **Enable** | Lets the device take part in acquisition. | Already enabled, or the station refuses mutations. | Without Configure connector. |
| **Disable** | Stops all communication with the device and withdraws its tags from the live address space; every tag keeps its own Enabled switch. | Already disabled, or the station refuses mutations. | Without Configure connector. |
| **Copy device** | Creates a copy and opens it (below). | The package does not carry the driver ("Driver not included in this package."), or the station refuses mutations. | Without Configure connector. |
| **Delete device** (danger ink, on the right) | Asks "Delete 'Furnace'? This also deletes all its tags. This cannot be undone.", then deletes and selects the parent (the line or the driver). | The station refuses mutations. | Without Configure connector. |

The right-click menu adds **Add tag** and **Move to** (see [Device folders](connector-folders#moving-a-device)).

## The Device card {#the-device-card}

| Field | What it is | Values / default | Effect |
| --- | --- | --- | --- |
| **Name** | The friendly name; the last segment of the device's wire identity and address. | Required; unique within the driver, case-insensitively. | Typing previews what the rename carries ("Checking references…", then how many references follow, or "The effective address does not change; no references need updating."); Enter or leaving the field commits, and every reference to the old addresses is rewritten in the same operation: "Device renamed and 3 references updated." A blank name is refused: "Device name is required." |
| **Driver** | The protocol the device speaks. | Read-only. | Fixed at creation; see [Drivers](drivers). |
| **Poll interval (ms)** | How often the station reads the device's tags, unless a tag overrides it. | 1000; a value of zero or less is saved as 1000. | Hidden for drivers that poll at a fixed 1 s or receive pushed data (Mitsubishi MC, BACnet, IEC 61850, OCPP, LoRaWAN). |

## The Connection card {#the-connection-card}

The card appears for every driver that declares connection fields and shows only the fields that driver reads. Each driver's page explains its fields in depth; this is the full inventory as the panel draws it.

| Field | Shown for | What it is |
| --- | --- | --- |
| **Host** | Modbus TCP, OPC UA, Siemens S7, Rockwell, Beckhoff, Mitsubishi, BACnet, IEC 61850, Redfish, AVEVA PI, HTTP | Host name or IP address; blank means localhost. An IPv6 literal is bracketed for you in the Base URI. |
| **Port** | Modbus TCP, OPC UA, Beckhoff, Mitsubishi, BACnet, IEC 61850, Redfish, AVEVA PI, HTTP | TCP port; zero takes the driver's default (502, 4840, 851, 5007, 47808, 102, 443, 443, 80). |
| **Unit ID** | Modbus TCP, Modbus RTU | The Modbus unit id: 0 to 255 on TCP; 1 to 247 on a serial line, unique per line ("Unit ID must be between 1 and 247."). |
| **Minimum transaction interval (ms)** | Modbus TCP | Silence after one completed attempt before the endpoint starts the next, 0 to 1000, default 0 ("Compatibility aid, 0-1000 ms. Zero adds no artificial delay."). Enabled devices sharing a host and port use the largest value among them, and the card says so when another device raises it: "Effective 200 ms · another enabled Device on 192.168.0.10:502 raises the endpoint maximum." |
| **Serial line · fixed** | Modbus RTU | The line's name and its tuple, read-only; changed on the line's own page. "Missing line" or "No physical line assigned" means the device has lost its line and cannot be saved: "A Modbus RTU line is required." |
| **Rack / Slot** | Siemens S7 | Two numbers; the Base URI reads `s7://host:rack:slot`. |
| **Slot** | Rockwell EtherNet/IP | One number, the chassis position the controller is seated in; a CIP route carries no rack, and the Base URI reads `eip://host:slot`. |
| **Local IP (AMS)** | Beckhoff ADS | This station's IP on the AMS route; both AMS net ids are derived as `<ip>.1.1`. Blank uses the Host. |
| **Device Id** | BACnet | The BACnet device instance. |
| **Server / Key** | LoRaWAN | The application key. |
| **Identifier** | OCPP, LoRaWAN | The charge point id, or the DevEUI (a spelling with colons or dashes is normalized to the bare hexadecimal). Blank falls back to the sanitized device name. |
| **Resource path** | OPC UA, AVEVA PI, HTTP | A path appended to the authority: the OPC UA server path, the PI Web API service root (default `piwebapi`), or the prefix every HTTP tag path is joined to. |
| **Transport** | AVEVA PI | The checkbox **Send over plain HTTP**. Off means HTTPS, with the note "HTTPS. The bearer token or password stays encrypted on the way to the PI Web API."; on, the note turns to a warning that the token or password is sent unencrypted on every request, for a PI Web API that answers on no other transport. |
| **Username**, **Password** | OPC UA, Redfish, AVEVA PI | Per-device credentials; an empty username means an anonymous connection ("Empty = anonymous. Stored per device; the password is protected at rest."). |
| **Bearer token** | AVEVA PI | A token that wins over the username and password when set; **Show token** reveals it. |

A Matter device shows a different Connection card: **Node ID · read only**, the 64-bit node id the pairing assigned (or "Needs re-pairing" when the stored identity cannot be read), and **State**, the device's health word. Nothing on it is editable. A Simulated device has no Connection card at all.

### Credentials and certificates {#credentials-and-certificates}

Passwords and bearer tokens are protected at rest with per-user Windows data protection, so the configuration database never holds the clear value. That protection is bound to the Windows account and machine that entered the secret: on another account the field comes back empty with the note "Cannot be read on this Windows account: it only opens on the machine and the Windows account that entered it. Enter it again here." Credentials are handed to the driver directly; they never appear in the Base URI or the journal, and they are redacted from the error messages the action feed shows.

An OPC UA device presents its equipment certificate before a session opens. One this station has never approved does not fail silently: the device reads "Waiting for certificate approval" in the tree and on the page, and the banner's button opens [Equipment access](settings-opcua-equipment) on the certificate to approve or block it. Revoking an approval later closes the sessions running on it. Details are on the [OPC UA](driver-opc-ua) page.

## The Commands card {#the-commands-card}

Three drivers reach equipment that is asked to do things as well as read: **HTTP**, **Redfish** and **AVEVA PI**. Their device page carries a **Commands** card between the Connection and Tags cards, headed "What this equipment can be asked to do. Each command names the path the request is sent to, under the device address." Everyone sees the list; declaring, editing and issuing need Configure connector, and a role without the bit is drawn neither the fields nor the verbs.

**Add command** adds a row named "Command 1" (numbered after what is already there). Each row carries:

| Column | What it is |
| --- | --- |
| **Name** | What the command is called. It is also the method name on the device in this station's own OPC UA address space, so it is unique within the device. |
| **Path** | Where the request goes, under the device's own address: the path the equipment's documentation names, for example `redfish/v1/Systems/1/Actions/ComputerSystem.Reset`. A command with no path is never put on the device. |
| **Takes** | The name of the one value the command takes, as the equipment names it (`ResetType`), or empty for a command that takes nothing. |
| **On** | Whether the command is offered at all. An off command is neither created on the device nor issued, which is how one is parked without losing what it addresses. |
| **Value** | What this press sends, for a command that takes a value. It belongs to the press, not to the device, so it is never saved. |

The trailing cluster carries the two verbs that act on that row alone: **Run**, which sends it and reports what the equipment answered ("'Reset' answered: accepted"), and **Delete**. Run says why it is refused rather than vanishing: a command with no path ("This command has no path yet, so there is nothing to send."), one that is off, one still waiting to be saved into the runtime, a device that is not connected, and the station's own engineering or run boundary. Other drivers do not carry the card at all: a charge point and a Matter node take commands too, but theirs are fixed by the protocol and come from the driver, not from what you type here.

## The Tags card {#the-tags-card}

The card is headed **Tags**, then "Address format · `<hint>`" saying how this driver addresses a tag ("Free-form tag name (e.g. sim/temperature).", "Register number + quantity (typed fields).", "Node id, e.g. ns=2;s=Temperature."), and for Configure connector the instruction "Tick rows, then edit a cell to apply it to all of them. The ticks clear once it is applied." and the **Add tag** button. Add tag creates "Tag 5" (numbered after the count) as Float, or the driver's first supported type, Read only, and selects it; the feed reads "Added tag to 'Furnace'." or, when the new tag still needs something, "Added tag to 'Furnace'. Fill in its details on the right."

### The grid {#the-grid}

Rows are grouped by data type, in this order: **Numeric**, **Boolean**, **Text & other**, each group headed with its count. The columns follow the tag page's card order; a cell that does not apply to a row (a numeric field on a Boolean tag) is drawn empty and disabled.

| Column | Group | What it edits |
| --- | --- | --- |
| tick | | Selects the row for a mass edit. Drawn for Configure connector only. |
| **Name** | General | The tag's name, with the same rename preview and reference rewrite as the page. Never replicated. |
| **Type** | General | The data type; changing it snaps the row's signal kind, Modbus register class, limit action and NaN policy as described on [Tags](connector-tags#the-general-card). |
| **Access** | General | Read only, Write only, Read and write (Read only alone for OCPP, Matter and LoRaWAN). |
| **Unit** | General | The engineering unit. |
| **Poll (ms)** | General | The per-tag override; 0 means the device default. Hidden for fixed-rate and push drivers. |
| **Address** | Source | The free-text address, for the drivers that take one. Never replicated. |
| **Signal** | Source | The simulated signal kind, with a picture of the shape beside each name. Simulated devices only. |
| **Raw** | Source | The latest raw reading, read-only. |
| **Scale ×**, **Scale +**, **Scaled** | Conversion | The Scale stage's factor and offset, and its result. |
| **Cal on**, **Cal ×**, **Cal +**, **Calibrated** | Conversion | The Calibration stage: its switch, its factor and offset, and its result. |
| **Limits on**, **Min**, **Max**, **Limit**, **Limited** | Conversion | The Limits stage: its switch, its bounds, its action, and its result. |
| **Dec on**, **Dec** | Conversion | The Decimals stage: its switch, and its places, 0 to 15. |
| **Invert** | Conversion | The Boolean negation. |
| **Sub start**, **Sub len** | Conversion | The String substring window. |
| **Value** | Live value | The engineering value, read-only. |
| actions | | **Open**; then for Configure connector **Enable**, **Disable** and **Delete**, the last with a confirmation. |

The three stage switches are columns like the fields they govern, and they mass-edit with them: ticking rows, typing the coefficients and turning the stage on changes what those rows read in the same edit, without opening each point. What the grid still does not carry are the invalid-reading policies, the two-point assistants, the write field and the cross-references: those are on the tag page. A Calibrate-only role reads the grid but edits nothing in it, the Cal cells and the Cal on switch included; its calibration edits go through the tag page.

### Mass edit {#mass-edit}

Tick the rows to change, then edit a cell of any row: the new value is applied to that row and to every ticked row, and the ticks are spent. While rows are ticked a strip above the grid says "3 rows selected. Editing a cell applies it to all of them and clears the ticks." with a **Clear selection** button. The ticks belong to the device: coming back to it later finds them cleared. Three rules keep a mixed selection honest: Name and Address never replicate; the Type cell snaps each row's dependent fields as it lands; and a value a row cannot take is refused for that row and kept as it was, which is how a String row survives being handed a numeric signal kind, and an integer row a NaN limit action.

## Copy device {#copy-device}

Copy device creates a device of your own from the selected one: the same connection fields and credentials, every tag cloned under a fresh identity with its whole pipeline, its enabled state and poll interval. The copy takes the source's name while it is free on the driver, then "Furnace (2)", "Furnace (3)", and lands at the driver's own level whatever folder the source was in; a Modbus RTU copy stays on the same line under the next free unit id. The page opens on the copy: "Copied 'Furnace' to 'Furnace (2)'. The copy is yours to edit."

## Duplicates and collisions {#duplicates-and-collisions}

Device names are unique within a driver, ignoring case: the create verbs step aside with a numeric suffix, and a rename onto a taken name is refused when committed. Two enabled devices under one driver whose names normalize to the same technical segment (`Line A` and `Line-A`) are both withheld from polling rather than one winning, and their tags read nothing until one is renamed or disabled. The technical identity is limited to 128 characters: "Technical device identity cannot exceed 128 characters." Two Modbus TCP devices may share a host and port with different unit ids and then share the endpoint's transaction pacing. Two Matter devices may name the same node id: discovery offers to open the existing one instead, but does not forbid the second.

## What the device page does not do {#what-the-device-page-does-not-do}

The driver cannot be changed, the folder is not edited here, and the line of a Modbus RTU device cannot be reassigned. Enabling a device does not enable its tags, and disabling a device does not flip theirs. There is no per-device import or export, and no connection test other than enabling the device and reading its health and Last error.
