// ED-range (Ethernet Remote IO) — complete reference template, all keys explained. // // Values shown are the FACTORY DEFAULTS where the firmware defines one // (verified against Brainboxes.ED.Firmware @ master = release 8.33.0); // otherwise a typical value captured from a live device, marked "typical". // // Template semantics: a null field or omitted section means "don't touch". // This file is documentation — the CLI's `template apply` parses strict JSON, // so strip the comments (or copy the shape) before feeding it to the tool. // Ranges cited are what the DEVICE FIRMWARE enforces; bb-eco may guard more // tightly where noted. { // ---- Envelope (metadata; suppressed from `bb-eco config` output) ---- "version": 1, // Template schema version. Only 1 exists. "family": "ED", // "ED" | "ES" | "BB" | null (any). Apply refuses a family mismatch. "compatibleModels": ["ED-038"], // Optional allow-list; null = any model of the family. "description": "Reference template — every ED key with defaults and ranges", "createdAt": "2026-08-13T00:00:00Z", // ---- identity: READ-ONLY snapshot (export artifact) ---- // Never applied by TemplateApplicator, never compared by DriftDetector. // Shown here for completeness; safe to delete from a reusable template. "identity": { "mac": "00:0A:4F:05:F3:62", // Device MAC. Read-only. "ip": "192.168.2.96", // IP at export time. Read-only. "model": "ED-038", // Model number. Read-only. "modelVariant": null, // Hardware variant suffix, if any. Read-only. "firmwareVersion": "8.33", // Read-only. "firmwareType": "T", // TIVA chip class marker. Read-only. "firmwareDate": "11/12/2023" // Read-only. }, // ---- network (network.cgi; applied LAST — can drop the connection) ---- "network": { "dhcp": true, // true = DHCP, false = static. Static requires // staticIp+subnet+gateway (device wants all 12 octets together; // the applicator fills omissions from current config). "staticIp": null, // Dotted quad. Octets are masked & 0xFF by the device, // NOT validated — nonsense like 999 is silently truncated. "subnet": "255.255.255.0", // Dotted quad. No contiguity check by the device. "gateway": "0.0.0.0", // Dotted quad. 0.0.0.0 = no gateway. "dns": null, // READ-ONLY in practice: optional network.cgi param on ED, // but bb-eco never writes it. "webPort": 80, // HTTP port, 1–65535. Change drops the connection (device reset). "upnp": true // SSDP/UPnP announcements on/off (0/1 on the wire). }, // ---- device (dev.cgi) ---- "device": { "name": "ED-038", // devname. HARD LIMIT 10 CHARS on ED (DEV_NAME_LEN=10): // an overlong value is neither truncated nor rejected — the // CGI handler never answers and the HTTP stack wedges. // bb-eco refuses >10 before sending. Factory default = model name. "location": "", // loc. Same 10-char limit. Must travel WITH devname (the // firmware only parses loc inside the devname branch) — the // applicator always sends the pair. Factory default: empty. "checkConnectivity": false // READ-ONLY on current ED firmware. }, // security: null = don't touch. "security": null, // ---- io (proto.cgi + io.cgi; ED only) ---- // !! proto.cgi RESETS THE DEVICE when anything changed (m_bResetDevice in the // firmware handler) — expect a reboot after applying protocol settings. "io": { "protocol": "ASCII", // IO protocol: "ASCII" | "Modbus" (wire currpro: 1 | 2). "dconAddress": 1, // DCON unit address, 1–255. Factory: 1. "dconTcpPort": 9500, // ASCII/DCON TCP port, 1–65535. Factory: 9500. "maxConnections": 8, // Concurrent ASCII connections, 1–16. Factory: 8. "maxConnectionsPerDevice": 8, // Per-client connection cap, 1–16. READ-ONLY via templates // (exported but not written back). "idleTimeout": 0, // ASCII idle disconnect, seconds, 0–65535. 0 = never. "counterUpdate": 0, // Counter update direction, 0 | 1 (digital models). "counterMode": 0, // Counter mode, 0 | 1 (digital models). "checksum": 0, // DCON checksum enable, 0 | 1. "modbusTcpPort": 502, // Modbus TCP port, 1–65535. Factory: 502. "modbusSlaveId": 255, // READ-ONLY: the device's reported Modbus address setting // (255 = accept all). Not written by templates. "modbusIdleTimeout": 0, // Modbus idle disconnect, seconds, 0–65535. 0 = never. "gatewayBaudRate": 9600, // REAL baud of the DCON gateway serial port. Legal values: // 1200, 2400, 4800, 9600 (factory), 19200, 38400, 57600, 115200 // (converted to the wire code dbaud 3–10 internally; templates // exported before 2026-08 carry the raw code — still accepted). // null / absent on devices without a configured gateway (they // report dbaud=0). NOTE: digital IO models (ED-038/008/204/004/ // 504/500) PIN this value in firmware — writes answer Success // but the original is kept (no gateway serial port exists). "commandTimeout": 200, // DCON gateway command timeout, ms, 0–50000 (the firmware's own // error message wrongly claims 0–5000). Factory: 200. "powerOnValues": null, // READ-ONLY aggregate reported by the device (hex string). "safeValues": null, // READ-ONLY aggregate reported by the device. "eStopValues": null, // READ-ONLY aggregate reported by the device. "eStopLine": null, // READ-ONLY. "eStopDirection": null, // READ-ONLY. "lines": [ { "index": 0, // 0-based line number. Identity — cannot be changed. "name": "DI0", // ≤10 chars (same firmware limit + wedge hazard as devname). // ONLY configurable on analog models — digital EDs answer // Success but keep factory names; bb-eco reports that honestly. "lineType": "digitalInput", // READ-ONLY hardware fact: digitalInput | digitalOutput | // analogInput | analogOutput. "enabled": null, // Analog lines only (wire ioAEn{n}: 0/1). Digital lines // cannot be disabled, so this stays null for them. "unit": null, // READ-ONLY display unit reported by the device. "sensorType": null, // Analog models: sensor/FSR selection written as the ioAFsr{n} // code — legal names/codes are model-specific, see // SensorCodeMap.cs (e.g. thermocouple types, ±10V, 4–20mA). "wiring": null // RTD models: "2-wire" | "3-wire" | "4-wire" // (wire ioARTDConnType{n}). null elsewhere. } // ...one entry per line. io.cgi is ALL-OR-NOTHING: the applicator // read-modify-writes every line, so a template may list only the lines // it changes. ] }, // serialPorts: not applicable to ED IO models (null = don't touch). "serialPorts": null }