- Change menu action type from "firstchildview" to "firstchild" to fix runtime exception - Remove null handleSaveApply/handleSave/handleReset so form.Map default save works - Update Gandi API link from defunct account.gandi.net to admin.gandi.net PAT page Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
152 lines
4.5 KiB
JavaScript
152 lines
4.5 KiB
JavaScript
'use strict';
|
|
'require view';
|
|
'require form';
|
|
'require ui';
|
|
'require uci';
|
|
|
|
return view.extend({
|
|
load: function() {
|
|
return L.resolveDefault(uci.load('device-intel'), {});
|
|
},
|
|
|
|
render: function() {
|
|
var m, s, o;
|
|
|
|
m = new form.Map('device-intel', _('Device Intelligence Settings'),
|
|
_('Configure aggregation, display, classification, and emulator modules.'));
|
|
|
|
// ── Main Settings ──
|
|
s = m.section(form.NamedSection, 'main', 'device-intel', _('General'));
|
|
|
|
o = s.option(form.Flag, 'enabled', _('Enable Device Intelligence'));
|
|
o.default = '1';
|
|
o.rmempty = false;
|
|
|
|
o = s.option(form.Value, 'cache_ttl', _('Cache TTL (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '30';
|
|
o.placeholder = '30';
|
|
o.description = _('How long to cache aggregated device data before refreshing.');
|
|
|
|
o = s.option(form.Flag, 'auto_classify', _('Auto-classify'));
|
|
o.default = '1';
|
|
o.description = _('Automatically classify devices using heuristic rules.');
|
|
|
|
o = s.option(form.Value, 'classify_interval', _('Classify Interval (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '300';
|
|
o.placeholder = '300';
|
|
o.depends('auto_classify', '1');
|
|
|
|
o = s.option(form.Value, 'mesh_query_timeout', _('Mesh Query Timeout (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '3';
|
|
o.placeholder = '3';
|
|
|
|
// ── Display Settings ──
|
|
s = m.section(form.NamedSection, 'display', 'display', _('Display'));
|
|
|
|
o = s.option(form.ListValue, 'default_view', _('Default View'));
|
|
o.value('grid', _('Grid'));
|
|
o.value('table', _('Table'));
|
|
o.default = 'grid';
|
|
|
|
o = s.option(form.ListValue, 'group_by', _('Group By'));
|
|
o.value('type', _('Device Type'));
|
|
o.value('zone', _('NAC Zone'));
|
|
o.value('node', _('Source Node'));
|
|
o.value('status', _('Online Status'));
|
|
o.default = 'type';
|
|
|
|
o = s.option(form.Flag, 'show_offline', _('Show Offline Devices'));
|
|
o.default = '1';
|
|
|
|
o = s.option(form.Flag, 'show_mesh_peers', _('Show Mesh Peers'));
|
|
o.default = '1';
|
|
|
|
o = s.option(form.Flag, 'auto_refresh', _('Auto-refresh'));
|
|
o.default = '1';
|
|
|
|
o = s.option(form.Value, 'refresh_interval', _('Refresh Interval (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '15';
|
|
o.placeholder = '15';
|
|
o.depends('auto_refresh', '1');
|
|
|
|
// ── USB Emulator ──
|
|
s = m.section(form.NamedSection, 'usb', 'emulator', _('USB Emulator'));
|
|
|
|
o = s.option(form.Flag, 'enabled', _('Enable'));
|
|
o.default = '1';
|
|
|
|
o = s.option(form.Value, 'scan_interval', _('Scan Interval (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '120';
|
|
o.placeholder = '120';
|
|
|
|
o = s.option(form.Flag, 'track_storage', _('Track Storage Devices'));
|
|
o.default = '1';
|
|
o.description = _('Detect USB mass storage devices and mount points.');
|
|
|
|
o = s.option(form.Flag, 'track_serial', _('Track Serial Devices'));
|
|
o.default = '1';
|
|
o.description = _('Detect USB serial adapters (Zigbee/Z-Wave dongles).');
|
|
|
|
// ── MQTT Emulator ──
|
|
s = m.section(form.NamedSection, 'mqtt', 'emulator', _('MQTT Emulator'));
|
|
|
|
o = s.option(form.Flag, 'enabled', _('Enable'));
|
|
o.default = '0';
|
|
|
|
o = s.option(form.Value, 'broker_host', _('Broker Host'));
|
|
o.default = '127.0.0.1';
|
|
o.placeholder = '127.0.0.1';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.Value, 'broker_port', _('Broker Port'));
|
|
o.datatype = 'port';
|
|
o.default = '1883';
|
|
o.placeholder = '1883';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.Value, 'discovery_topic', _('Discovery Topic'));
|
|
o.default = '$SYS/#';
|
|
o.placeholder = '$SYS/#';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.Value, 'scan_interval', _('Scan Interval (seconds)'));
|
|
o.datatype = 'uinteger';
|
|
o.default = '60';
|
|
o.depends('enabled', '1');
|
|
|
|
// ── Zigbee Emulator ──
|
|
s = m.section(form.NamedSection, 'zigbee', 'emulator', _('Zigbee Emulator'));
|
|
|
|
o = s.option(form.Flag, 'enabled', _('Enable'));
|
|
o.default = '0';
|
|
|
|
o = s.option(form.Value, 'coordinator', _('Coordinator Device'));
|
|
o.default = '/dev/ttyUSB0';
|
|
o.placeholder = '/dev/ttyUSB0';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.ListValue, 'adapter', _('Bridge Adapter'));
|
|
o.value('zigbee2mqtt', 'Zigbee2MQTT');
|
|
o.value('deconz', 'deCONZ');
|
|
o.default = 'zigbee2mqtt';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.Value, 'api_port', _('Bridge API Port'));
|
|
o.datatype = 'port';
|
|
o.default = '8099';
|
|
o.placeholder = '8099';
|
|
o.depends('enabled', '1');
|
|
|
|
o = s.option(form.Value, 'bridge_topic', _('Bridge MQTT Topic'));
|
|
o.default = 'zigbee2mqtt/bridge/devices';
|
|
o.depends({ 'enabled': '1', 'adapter': 'zigbee2mqtt' });
|
|
|
|
return m.render();
|
|
}
|
|
});
|