--- name: dataminer-xml-authoring description: 'DPML XML authoring for DataMiner connectors: protocol structure, parameters, groups, timers, triggers, actions, tables (array parameters), alarming, trending, UI pages/layout, display keys, DVEs, commands/responses, and Measurement sections. Use when creating or editing protocol.xml content.' argument-hint: 'Describe the XML change: e.g. "add SNMP table with 5 columns", "create HTTP polling session", "configure alarming thresholds", "add DVE child element"' license: LicenseRef-Skyline-Agent-Marketplace metadata: updated: 2026-10-05 version: 2.41 --- ## Changelog | Version | Date | Changes | |---------|------|---------| | 2.41 | 2026-10-05 | Added authoring rules and checklist item for discrete parameters with numeric backends for pre-known values. | | 2.40 | 2026-10-02 | Clarified SNMP write setup, scalar multipleGet grouping, action priority, and timer-driven startup polling. | | 2.39 | 2026-09-27 | Aligned packaged resource references and execution contracts. | | 2.38 | 2026-09-11 | Corrected HTTP authentication to require Header@key, removed hard-coded secret patterns, and added secret/certificate safeguards. | | 2.37 | 2026-09-11 | Corrected the Protocol namespace and OID type list, made Alarm support and duplicate-description suffixes conditional, and reconciled high-churn `volatile` requirements with incompatible table features. | | 2.36 | 2026-09-11 | Corrected the full parameter-schema reference to point to its owning `dataminer-protocol-xml-reference` skill. | | 2.35 | 2026-08-13 | Corrected VendorOID guidance: the value must be a Skyline-assigned connector OID matching the DataMiner schema, not the device vendor's IANA enterprise or sysObjectID OID. | | 2.34 | 2026-08-13 | Consolidated naming guidance into scoped mechanical rules, removed an unsafe whole-file `` grep, and clarified that descriptive camelCase table names are valid. | | 2.33 | 2026-08-13 | **MIB table name derivation trap.** Added `tx21BucInfoTable`→`tx21BucInfo`, `tx21BucAlarmTable`→`tx21BucAlarm`, `tx21BucSensorTable`→`tx21BucSensor` examples across SKILL.md, table-naming reference, table-authoring-gates reference, pre-completion checklist, and `dataminer-xml-author` agent Step 3b. Clarified that the DataMiner table `` must be derived from the lowercase-first OBJECT-TYPE descriptor, not from the uppercase-first SEQUENCE type name (`Tx21BucInfoEntry`). | | 2.32 | 2026-08-13 | **Five NamingConventions/XmlStructure fixes from eval findings (bucInfo-table columns, multi-word compound prefix).** (1) Added `BucInfoIndex`→`bucInfoIndex`, `BucInfoModelNumber`→`bucInfoModelNumber`, `BucInfoSerialNumber`→`bucInfoSerialNumber`, `BucInfoFirmwareVersion`→`bucInfoFirmwareVersion`, `BucInfoPowerWatts`→`bucInfoPowerWatts`, `BucInfoFrequencyBand`→`bucInfoFrequencyBand`, `BucInfoRFRange`→`bucInfoRFRange`, `BucInfoIFRange`→`bucInfoIFRange`, `BucInfoLOFrequency`→`bucInfoLOFrequency` to the camelCase conversion table — covers the multi-word compound prefix trap. (2) Extended inline authoring gate callout: when the table `` is itself a multi-word camelCase string (e.g. `bucInfo`), the column prefix must equal that exact string verbatim — `BucInfo` is wrong even though each word looks correctly cased. (3) Added Before/After: Multi-Word Compound Prefix Trap example block to `references/table-authoring-gates.md` using a `bucInfo` table. (4) Strengthened VendorOID routing rule to explicitly name `VendorOID` as the concrete XmlStructure WARN example and clarified that when the vendor OID is unknown, the agent must look it up at IANA or ask the user — not leave Skyline's OID as a placeholder. | | 2.31 | 2026-08-13 | **Four NamingConventions fixes from eval findings (interfaces-table column descriptions).** (1) Extended routing rule: NamingConventions findings now explicitly cover `` suffix violations ("`Description 'X' should end with '(Y)'"`) in addition to `` casing violations — both are blocking and require `dataminer-xml-author` invocation immediately. (2) Extended inline authoring gate to cover `` suffix: every table column `` MUST end with `(TableDescription)` — apply at write time, not post-scan. (3) Added `InterfaceKey`→`interfaceKey`, `InterfaceName`→`interfaceName`, `InterfaceType`→`interfaceType`, `InterfaceSpeed`→`interfaceSpeed`, `InterfaceStatus`→`interfaceStatus` to the camelCase conversion table (singular "Interface" prefix trap). (4) Added Before/After: Description Suffix Trap example block to `references/table-authoring-gates.md` using an `interfaces` table. | | 2.30 | 2026-08-13 | **Three NamingConventions fixes from eval findings (device-table columns).** (1) Added `DeviceKey`→`deviceKey`, `DeviceName`→`deviceName`, `DeviceStatus`→`deviceStatus`, `DeviceSpeed`→`deviceSpeed` rows to the camelCase conversion table — covers the common single-word table prefix trap. (2) Strengthened routing rule: NamingConventions findings BLOCK task completion — the orchestrator must invoke `dataminer-xml-author` immediately, not as an optional post-step, and must not return results until all findings are resolved. (3) Added Before/After: Short Single-Word Prefix Trap example block to `references/table-authoring-gates.md` using a `device` table. | | 2.29 | 2026-08-12 | **Four NamingConventions fixes from eval findings.** (1) Added NamingConventions WARN/FAIL to agent routing rule — `dataminer-xml-author` must now be invoked for both XmlStructure WARNs and NamingConventions WARNs or FAILs on parameter/table column `` casing. (2) Extended inline authoring gate callout to explicitly cover table column `` elements — prefix must match table `` verbatim including casing. (3) Added four table column examples to camelCase conversion table (`InterfacesName`, `InterfacesIpAddress`, `InterfacesLinkState`, `InterfacesTxPackets`). (4) Added per-column self-check rule + Before/After: PascalCase Prefix Trap example block to `references/table-authoring-gates.md`. | | 2.28 | 2026-08-12 | Added VendorOID and optional Trigger/Action completeness guidance plus routing for XmlStructure findings. | | 2.27 | 2026-07-17 | Added connector XML comment hygiene and removed explanatory comments from copyable XML examples; copyright and justified `SuppressValidator` comments remain allowed. | | 2.26 | 2026-06-27 | **File size reduction for auto-improve compatibility.** Moved `## Parameters`, `## Groups`, `## Timers`, `## Triggers`, `## Actions`, `## Commands & Responses`, TABLE GENERATION GATE detailed rules (0–12), Table Column Pre-Completion Checklist, Table Measurement/Rules/Data Handling/instance/Multi-PID sections, and the global Pre-Completion Checklist to dedicated reference files (`references/parameters.md`, `references/groups-timers-triggers-actions.md`, `references/commands-responses.md`, `references/table-authoring-gates.md`, `references/pre-completion-checklist.md`). Archived changelog v2.8–v2.20 to `references/CHANGELOG.md`. Replaced each moved section with a compact summary + cross-reference. Updated Reference Files table with new reference rows. Reduced SKILL.md from 109 KB to ≤40 KB to allow auto-improve AI passes. | | 2.25 | 2026-06-26 | **Eight targeted fixes from eval findings.** (1) Fixed Connection-Type-Specific Sections table: `auto` is required for ALL connection types — not SNMP-only. (2) Added HTTP-specific params to camelCase conversion table and extended 100–999-range callout to cover HTTP response/status-code params. (3) Added `Uptime`→`uptime` and `ApiKeyHeader`→`apiKeyHeader` to conversion table; added PID 1–10 HTTP-infrastructure callout. (4) Added "Unrecommended characters" rule: `` values MUST contain only alphanumerics. (5) Added Before/After example for HTTP response params (PIDs 99–100, 199–200). (6) Added before/after block to Table Column Naming Convention showing singular-vs-plural prefix trap. (7) Added `key` attribute to HTTP Sessions XML example + mandatory `key` rule. (8) Added HTTP Session `key` attribute item to Pre-Completion Checklist. | | 2.24 | 2026-06-26 | **Schema-file consolidation (single schema owner).** Retired the six duplicate `protocol-*` schema reference files — `dataminer-protocol-xml-reference` is now the sole schema authority. Migrated timer/trigger/action worked patterns → `references/execution-patterns.md`; `` semantics table → `references/authoring-best-practices.md`. | | 2.23 | 2026-06-26 | Added inline camelCase authoring gate rule directly before the naming convention table. Added prominent callout box identifying PID 100–999 system-info scalars as the #1 NamingConventions WARN source. Added before/after XML snippet showing PIDs 100–102 wrong and correct names. | | 2.22 | 2026-06-26 | Unified all `` elements to camelCase: table `` and column `` now use camelCase — PascalCase is no longer used anywhere in connector XML naming. | | 2.21 | 2026-06-26 | Added `SystemUptime` → `systemUptime` to camelCase conversion table; added empty-Range-vs-missing-Range distinction to both the scalar Range checklist item and the Table Column Pre-Completion Checklist Range row. | > **Older entries (v2.8–v2.20)**: `dataminer-xml-authoring/references/CHANGELOG.md` # DataMiner DPML XML Authoring Covers all aspects of writing and modifying `protocol.xml` content. Load `dataminer-connector-core` alongside this skill for naming conventions and ID management. > **Paired agent**: `dataminer-xml-author` — owns workflow and validation steps. This skill owns XML templates, examples, and element reference. Keep shared constraints (alarm tags, naming rules) in sync. > > **Agent routing on validation findings**: > - When the **XmlStructure** check returns WARN findings, the `dataminer-xml-author` agent MUST be invoked to correct the `protocol.xml` before the task is considered complete. Do not close a task with open XmlStructure WARNs. `` must use a Skyline-assigned connector OID matching `1.3.6.1.4.1.8813.2.`; it is not the device vendor's IANA enterprise or sysObjectID OID. If the assigned value is unknown, ask the user rather than inventing one or leaving a placeholder. > - When the **NamingConventions** check returns WARN or FAIL findings on parameter or table column `` elements, or on genuinely duplicated table column `` values that require disambiguation, the `dataminer-xml-author` agent MUST be invoked **immediately** to fix the violations in `protocol.xml`. A parenthetical table suffix is not required for a unique description. **This is a blocking requirement**: the orchestrator must not return results or mark the task complete until all NamingConventions findings are resolved. Treating it as an optional post-step or deferring it causes the agent-routing gap detected in eval. Do not close a task with open NamingConventions WARNs or FAILs. A quick-reference version is linked from `dataminer-protocol-xml-reference`. Load its guard rails explicitly; automatic attachment depends on the client and installation. ## Reference Files Load these references when needed: | Topic | Reference File | |-------|---------------| | **Protocol XML schema — ALL sections** (tags, attributes, enum values, fixed values, parent/child placement, cardinality for Params, Tables, Groups, Timers, Triggers, Actions, HTTP, SNMP, PortSettings, QActions, metadata, …) | **`dataminer-protocol-xml-reference`** — the sole schema authority. Load it and its `references/protocol-*.md` files. See **Schema Lookups** below. | | Timer / trigger / action worked patterns (timeout, response, chained, conditional, multi-param, staggered poll, QAction-via-trigger) | `dataminer-xml-authoring/references/execution-patterns.md` | | Alarm thresholds, units, ranges, trending, UI conventions, MIB enum conversion, measurement type selection, measurement `options` semantics | `dataminer-xml-authoring/references/authoring-best-practices.md` | | Table relations, foreign keys, relation ordering, alarm bubble-up | `dataminer-xml-authoring/references/table-relations.md` | | SNMP MIB table/column naming translation examples | `dataminer-xml-authoring/references/table-naming.md` | | SNMP trap reception, bindings, alarm generation | `dataminer-xml-authoring/references/snmp-traps.md` | | SNMP writes: setting single parameters | `dataminer-xml-authoring/references/snmp-writes-single.md` | | SNMP writes: altering table cells | `dataminer-xml-authoring/references/snmp-writes-table-cell.md` | | HTTP authentication: API key, Basic Auth, Bearer/OAuth2 | `dataminer-xml-authoring/references/http-auth-patterns.md` | | WebSocket connections | `dataminer-xml-authoring/references/websocket-connections.md` | | Serial and Smart-Serial connections | `dataminer-xml-authoring/references/serial-connections.md` | | Rate calculation parameters, naming, and wiring | `dataminer-xml-authoring/references/rate-calculation-xml.md` | | Advanced: redundant polling, inter-element communication | `dataminer-xml-authoring/references/advanced-connectivity.md` | | DVE export, EPM/Topology, Tree Control, Matrix, View/Logger Tables, Multithreaded Timers, Mediation, Charts | `dataminer-xml-authoring/references/specialized-features.md` | | DCF interfaces, connections, properties, tables, API | `dataminer-dcf` | | **Full `` XML examples, attribute tables, valid children, schema verification, position uniqueness, Read/Write pair XML** | `dataminer-xml-authoring/references/parameters.md` | | **Groups, Timers, Triggers & Actions — full XML examples, group types, ping group, timer design rules, trigger times** | `dataminer-xml-authoring/references/groups-timers-triggers-actions.md` | | **Serial Commands & Responses — full XML patterns** | `dataminer-xml-authoring/references/commands-responses.md` | | **TABLE GENERATION GATE detailed rules 0–12, Table Column Naming Convention detail, Table Column Pre-Completion Checklist, Table Rules, Data Handling, `instance` option, Multi-PID NamingFormat** | `dataminer-xml-authoring/references/table-authoring-gates.md` | | **Pre-Completion Checklist — full item-by-item checklist for every authoring task** | `dataminer-xml-authoring/references/pre-completion-checklist.md` | | Archived changelog (v2.8–v2.20) | `dataminer-xml-authoring/references/CHANGELOG.md` | ### Schema Lookups (Cross-Reference) This skill owns **authoring** content — templates, worked examples, gates, and pedagogy. It does **not** carry protocol XML schema reference files. For the closed-world **schema authority** — exact tag/attribute/enum lists, fixed values, parent/child placement, cardinality — load `dataminer-protocol-xml-reference` and consult its `references/protocol-*.md` files. That skill is the single source of truth for schema facts; there is no longer a competing copy in this skill to conflict with it. For the ownership matrix across the XML skills and their guard rails, see the **Authority Matrix** in `dataminer-protocol-validator-prevention`. --- ## XML Formatting > **HARD RULE: Use tab characters (`\t`) for indentation — NEVER spaces. One tab per nesting level. Every child element is indented one level deeper than its parent. This applies to all generated XML: skeletons, parameter snippets, incremental additions, and inline edits — no exceptions.** - The skeleton and examples below use spaces for readability in this markdown source. When generating actual `protocol.xml` content, always output tab-indented XML. ## XML Comment Hygiene Actual connector `protocol.xml` output must not contain explanatory or documentation comments. Do not add TODO, FIXME, debug, workaround, or design-note comments. Copyright comments are allowed. `SuppressValidator` comments are allowed only when they directly wrap the affected element and include a specific reason for a genuinely non-applicable validator finding. Put explanations in ``, ``, surrounding Markdown, or C# documentation comments. Do not copy comments from Markdown examples into generated XML. Apply this rule to full files, snippets, incremental edits, cloned files, and final formatting passes. --- ## Connector XML Skeleton ```xml Vendor Device Name Vendor Device Name DataMiner Driver 1.0.0.1 DMS-DRV-1234 Skyline Communications Vendor Inc 1.3.6.1.4.1.8813.2.12345 1 Switch snmpv2 auto true 10.4.0.0 - 14003 ... ... ... ... ... ... ... ... ... ... Main Branch YYYY-MM-DD Author Name Skyline Communications Initial version ``` > **⚠ VendorOID — use the Skyline-assigned connector OID:** > `` must match the DataMiner schema pattern `1.3.6.1.4.1.8813.2.`. Do not substitute the device vendor's IANA enterprise or sysObjectID OID. > - ❌ `1.3.6.1.4.1.8813` — bare Skyline root > - ❌ `1.3.6.1.4.1.9.1.516` — device vendor OID, outside the schema pattern > - ✅ `1.3.6.1.4.1.8813.2.12345` — example shape; use the actually assigned value > > If the assigned connector OID is unknown, ask the user rather than inventing a value. > **⚠ `` and ``:** > Include and populate these sections when the connector implements corresponding execution logic. When no such logic exists, omission and empty sections are both schema-valid; follow the existing connector convention. --- ## Connection-Type-Specific Sections Not all XML sections apply to every connection type. Use this table to determine which sections to include: | Section | SNMP | HTTP | Serial | Smart-Serial | WebSocket | Virtual | |---------|------|------|--------|-------------|-----------|---------| | `` | Yes | Yes | Yes | Yes | Yes | Yes | | `` | No | **No** | Yes | Yes | Yes | No | | `` | No | **No** | Yes | Yes | Yes | No | | `` | No | **No** | Yes | Yes | Yes | No | | `` | No | **Yes** | No | No | **Yes** (via HTTP connection) | No | | `` (protocol-level) | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | | `` | Yes | Yes | Yes | Yes | Yes | Yes | | `` | Empty* | Empty* | Empty* | Empty* | Empty* | Empty* | | `` | Empty* | Empty* | Empty* | Empty* | Empty* | Empty* | | `` | Yes | Yes | Yes | Yes | Yes | Yes | | `` | Yes | Yes | Yes | Yes | Yes | Yes | | `` | Yes | Yes | Yes | Yes | Yes | No | \* `` / ``: Include empty `` / `` elements when no execution logic is needed; populate them only when triggers or actions are required. > **Critical**: HTTP connectors must NOT include ``, ``, or `` sections. HTTP uses `` sessions instead. Including serial-only sections in an HTTP connector will cause confusion and validator warnings. > > **Note**: WebSocket uses an HTTP connection with `true` in `CommunicationOptions`. It uses Commands/Responses/Pairs for message framing, plus optionally `` sessions for custom handshakes. ### PortSettings Reference by Connection Type The `` element customizes the DataMiner Cube Element Creation Wizard. Always configure relevant defaults and disable non-applicable port types: - **SNMP (`snmp`, `snmpv2`, `snmpv3`)**: Bus address is not used (disable it), IP port defaults to 161, and serial port is disabled. ```xml true 161 true ``` - **HTTP / REST / HTTPS (`http`)**: Bus address defaults to `bypassProxy` for direct API calls, IP port defaults to 80 (or 443 for HTTPS), Type defaults to `ip`, and UDP and serial ports are disabled. ```xml bypassProxy 80 ip true true ``` - **Serial (`serial`)**: Type defaults to `serial` (or `ip` for terminal server), Bus address disabled (unless RS-485 multi-drop, where it defaults to `1`), standard serial framing defaults (Baudrate 9600, Databits 8, Stopbits 1, Parity No, Flowcontrol No), IP port default, and UDP disabled. ```xml serial true 9600 8 1 No No 4001 true ``` - **Smart Serial (`smart-serial`)**: Type defaults to `ip`, Bus address disabled, IP port defaults to listener port (e.g. 50000), and serial port is disabled. ```xml ip true 50000 true ``` - **SSH (`serial` with SSH)**: Type defaults to `ip`, Bus address disabled, IP port defaults to 22, and UDP/serial disabled. ```xml ip true 22 true true ``` - **Virtual (`virtual`)**: No communication ports needed. Omit `` or supply ``. --- ## Parameters Parameters are the fundamental data units. **Full XML examples, attribute tables, valid children list, schema verification rule, position uniqueness rule, and Read/Write pair XML**: `dataminer-xml-authoring/references/parameters.md`. **Parameter types**: `read` (device value), `write` (sends to device), `array` (table), `dummy` (internal trigger-only — MUST have ``; NEVER for HTTP response intermediates — those are `type="read"` with `RTDisplay=false`), `bus`, `fixed`, `group`. **NEVER use `read write`** — write-capable parameters are always two separate `` elements. ### Standalone Parameter Naming Convention > **⚠ INLINE AUTHORING GATE — apply at the moment you write each `` and ``, not during a post-generation scan:** > Before committing any `` value, confirm its first character is **lowercase**. PascalCase names look plausible and are invisible in a quick visual review — they surface as NamingConventions WARN or FAIL findings after submission. > > **PIDs 100–999 (system-info scalars such as `SystemName`, `SystemDescription`, `SystemUptime`) are a common source of NamingConventions WARN findings.** Before finalising, inspect the `` children of `` elements and correct uppercase-first values. Do not scan unrelated protocol-level `` elements. > > **This rule applies equally to table column `` elements.** The prefix derived from the table `` must keep its own casing — a table named `interfaces` produces column prefix `interfaces` (lowercase `i`), **not** `Interfaces`. Example: table `interfaces` → columns `interfacesName`, `interfacesIpAddress`, `interfacesLinkState`. Writing `InterfacesName` is a NamingConventions WARN or FAIL even though it starts with the correct prefix word. > > **Multi-word compound table names follow the same rule.** If the table `` is itself a multi-word camelCase string (e.g. `bucInfo`), the column prefix must equal that exact string verbatim — `BucInfoIndex` is wrong even though each individual word looks correctly cased. The first character of the whole prefix must be lowercase: `bucInfoIndex`, `bucInfoModelNumber`, `bucInfoFirmwareVersion`. When 10+ columns share the same table, one capitalisation mistake propagates to every column at once. > > **Disambiguate duplicate table-column descriptions.** When columns in different tables use the same description, append the table description or a clear abbreviation in parentheses, for example `Name (Interfaces)` and `Name (Devices)`. A suffix is not required when the description is already unambiguous. **All `/` elements** — standalone params AND table/column params — MUST use **camelCase**: first character **lowercase**, subsequent words title-cased. **NEVER** start any parameter name with an uppercase letter. | Wrong ❌ | Correct ✅ | Notes | |---|---|---| | `Hostname` | `hostname` | Single word: all lowercase | | `SoftwareVersion` | `softwareVersion` | Multi-word: first word lowercase | | `SystemDescription` | `systemDescription` | PID 100–999 prime source | | `SystemName` | `systemName` | PID 100–999 prime source | | `SystemUptime` | `systemUptime` | PID 100–999 prime source | | `AdminStatus` | `adminStatus` | | | `FirmwareVersion` | `firmwareVersion` | PID 1–10 common | | `IpAddress` | `ipAddress` | Acronym as first word: fully lowercase | | `SerialNumber` | `serialNumber` | | | `DeviceModel` | `deviceModel` | | | `ApiKeyHeader` | `apiKeyHeader` | HTTP infrastructure params | | `SystemInfoStatusCode` | `systemInfoStatusCode` | HTTP response/status params | | `InterfacesStatusCode` | `interfacesStatusCode` | HTTP response/status params | | `InterfacesName` | `interfacesName` | Table column: prefix must be camelCase | | `InterfacesIpAddress` | `interfacesIpAddress` | Table column: acronym prefix stays lowercase | | `InterfacesLinkState` | `interfacesLinkState` | Table column: PascalCase prefix is wrong | | `InterfacesTxPackets` | `interfacesTxPackets` | Table column: abbreviations follow camelCase | | `DeviceKey` | `deviceKey` | Table column: single-word prefix trap | | `DeviceName` | `deviceName` | Table column: single-word prefix trap | | `DeviceStatus` | `deviceStatus` | Table column: single-word prefix trap | | `DeviceSpeed` | `deviceSpeed` | Table column: single-word prefix trap | | `InterfaceKey` | `interfaceKey` | Table column: singular "Interface" prefix trap | | `InterfaceName` | `interfaceName` | Table column: singular "Interface" prefix trap | | `InterfaceType` | `interfaceType` | Table column: singular "Interface" prefix trap | | `InterfaceSpeed` | `interfaceSpeed` | Table column: singular "Interface" prefix trap | | `InterfaceStatus` | `interfaceStatus` | Table column: singular "Interface" prefix trap | | `BucInfoIndex` | `bucInfoIndex` | Table column: multi-word compound prefix trap | | `BucInfoModelNumber` | `bucInfoModelNumber` | Table column: multi-word compound prefix trap | | `BucInfoSerialNumber` | `bucInfoSerialNumber` | Table column: multi-word compound prefix trap | | `BucInfoFirmwareVersion` | `bucInfoFirmwareVersion` | Table column: multi-word compound prefix trap | | `BucInfoPowerWatts` | `bucInfoPowerWatts` | Table column: multi-word compound prefix trap | | `BucInfoFrequencyBand` | `bucInfoFrequencyBand` | Table column: multi-word compound prefix trap | | `BucInfoRFRange` | `bucInfoRFRange` | Table column: multi-word compound prefix trap | > **Quick check**: inspect only `` values. Other protocol sections also contain `` elements and may legitimately use different casing. > > **`` values MUST contain only alphanumeric characters** — no spaces, hyphens, or underscores. ### `` Valid Values Only `complete`, `auto`, `composed`, `wildcard`. **NEVER** use SNMP data type names (`octetstring`, `timeticks`, `integer`, etc.), SNMP operation names, or direction names (`read`, `write`) as the `type` attribute of `` — all cause **XSD ERROR**. SNMP data types belong in a separate `` child element. Full patterns: `dataminer-xml-authoring/references/parameters.md`. ### Read/Write Parameter Pairs Two separate `` elements — one `read`, one `write`. DataMiner links them as a single control when: 1. `` is **identical** on both (exact match — different names = two separate unlinked controls) 2. `` is **identical** on both 3. `` are **identical** on both Write ID = read ID + **50** (preferred) or **+100** (max). **NEVER** use offset > 100 (❌ read 103 → write 1103). Write param appears **immediately after** read param in XML. All params ordered by ascending ID. > **Full XML examples and Read/Write Pair Pre-Completion Checklist**: `dataminer-xml-authoring/references/parameters.md` --- --- ## SNMP Writes (Set Operations) SNMP write parameters send SET requests to the remote device when the user changes their value. DataMiner uses an **optimistic update**: the corresponding read parameter is immediately set to the new value, even before the SET reaches the device. Because the SET can fail, **always ensure a verification GET** follows the write to restore the correct value if needed. **Recommended default for every supplied single-parameter write**: Use the `snmpSetAndGet="true"` attribute on the **`` opening tag** of the write parameter — it handles both the SET and the verification GET automatically with no extra triggers or actions. Verify that each write parameter has an explicit SET behavior; do not invent writable OIDs or device capabilities. **NEVER place this attribute on ``, ``, or any child element** — it is only valid on `` itself: ``. Alternative options include `options="snmpSet"` (fire-and-forget SET, add your own verification trigger), `options="snmpSetWithWait"` (blocking SET), and `options="snmpSetAndGetWithWait"` (blocking SET + GET). > **Full patterns and decision tables**: > - Single parameters: `dataminer-xml-authoring/references/snmp-writes-single.md` > - Table cells: `dataminer-xml-authoring/references/snmp-writes-table-cell.md` --- ## Groups Groups define what to poll together in a single communication cycle. **Full XML examples, group types table, ping group pattern**: `dataminer-xml-authoring/references/groups-timers-triggers-actions.md`. **Key rules:** - SNMP scalar groups use `poll` with scalar read `` entries. Set `multipleGet="true"` on `` when the group contains two or more scalar reads; omit it for a singleton group and for table groups. Keep each group to at most 10 SNMP parameter references, and put each SNMP table in its own group. Count the direct `` entries when finishing a group; split 11 reads into groups of 10 and 1, and omit `multipleGet` on the singleton. Decide independently for each group; never copy `multipleGet` from one group's `` to another. - **CRITICAL — multipleGet on groups CANNOT be used for groups with table parameters in it.** Never set `multipleGet="true"` on a table polling group. `multipleGet` is strictly for groups with 2+ scalar read parameters. Table retrieval methods (`multipleGetBulk`, `multipleGetNext`) are configured on the table parameter's `` tag, never on the group. - HTTP sessions: `poll` + `` — **NEVER** `poll action` for HTTP. - **CRITICAL — SNMP ping group**: The **first ``** in `` must be `poll`. An `After Startup` (`poll action`) group placed first causes MAJOR "Ping group for 'snmpv2' connection is not a 'snmpv2' poll group" **and RTEs at runtime**. Always assign `id="1"` to the scalar poll group. - Use the `connection` attribute to target a specific connection. --- ## Timers Timers schedule when groups are polled. **Full XML examples and design rules**: `dataminer-xml-authoring/references/groups-timers-triggers-actions.md`. Default speeds: alarm/status = **10s**, config = **1min**, static = **1hr**. Default interval: **75ms**. Timers start with the element and are the normal polling path; do not queue timer-scheduled groups again from after-startup logic (the after-startup chain can still be used for one-time initialization). Use `initial="true"` on `