Control Pane
The Control pane is a SCADA-style operator console for issuing commands and monitoring live values. It supports 8 widget types arranged in a grid layout with optional tabbed sections. Every button press is captured by TAI for interaction mining.
Widget Types
| Widget | Behavior |
|---|---|
| Button | Momentary push — fires a command on click, resets immediately |
| Toggle | Latching on/off switch — maintains state between clicks |
| Slider | Linear range input with configurable min/max and step |
| Gauge | 240-degree arc indicator for analog values with threshold zones |
| Dial | Full circular input for rotational values |
| StatusLight | Colored indicator dot with glow effect — driven by thresholds |
| ValueDisplay | Large numeric readout for key metrics with unit label |
| Separator | Visual section divider for organizing widget groups |
WidgetSpec Properties
type: WidgetType— One of the 8 widget types abovelabel: String— Display name shown above the widgetvalue_binding: String— Entity field path for live data pushcolumn_span: u8— Grid columns to occupy (auto-wraps)min / max: f64— Range bounds for Slider, Gauge, and Dialunit: String— Unit suffix (e.g., "rpm", "PSI")thresholds: Vec<Threshold>— Color breakpoints for Gauge and StatusLightcolor_accent: ColorPreset— One of 7 presets (cyan, green, amber, red, violet, blue, white)
Layout
- Grid Packing: Widgets fill columns left-to-right;
column_spancontrols width - Tabbed Layout: Optional
TabSpecgroups widgets into named tabs - Live Data: Values arrive via
push_value; unbound widgets show demo fallback values
Keyboard Shortcuts
Navigation
Tab
Cycle focus between widgets Shift + Tab
Cycle focus backward Enter
Activate focused widget Esc
Release widget focus Tabs
Ctrl + 1
Switch to tab 1 Ctrl + 2
Switch to tab 2 Ctrl + 3 + – + 9
Switch to tabs 3–9 YAML Configuration
yaml ControlConfig auto-generated
| Field | Type | Default | Description |
|---|---|---|---|
| title | String | "Control Panel" | |
| columns | usize | 4 | |
| widgets | Vec<WidgetSpec> | [] | Flat widget list (used when no tabs are defined). |
| tabs | Vec<TabSpec> | [] | Tab-grouped widgets — when present, the pane renders a tab strip and shows only the active tab's widgets. |
| data_source | String | — | ID of the data source (defined in top-level `data_sources`) that drives this pane's bus and simulation backend. |
yaml WidgetSpec auto-generated
| Field | Type | Default | Description |
|---|---|---|---|
| id | String | "new()" | |
| widget_type | ControlWidgetType | — | |
| label | String | "new()" | |
| value_binding | String | — | |
| column_span | usize | 1 | |
| min | f64 | — | |
| max | f64 | — | |
| unit | String | — | |
| accent | WidgetAccent | — | |
| thresholds | Vec<ThresholdSpec> | [] | |
| command | String | — | Legacy string command (backward compatible). |
| off_command | String | — | Legacy off-command for Toggle widgets. |
| default_value | f64 | — | |
| bus_command | BusCommandSpec | — | Structured bus command that routes through the ControlBus for reliability. |
| bus_off_command | BusCommandSpec | — | Separate bus command for when a Toggle turns off. |
Example YAML
control:
title: "HVAC Control Panel"
columns: 4
data_source: hvac_sdk
tabs:
- label: "Zone A"
widgets:
- id: temp_setpoint
widget_type: slider
label: "Temp Setpoint"
min: 16.0
max: 30.0
unit: "°C"
value_binding: zone_a.setpoint
- id: fan_toggle
widget_type: toggle
label: "Fan Override"
accent: warning
- id: zone_temp
widget_type: gauge
label: "Zone Temp"
min: 10.0
max: 40.0
unit: "°C"
value_binding: zone_a.temperature
- label: "Zone B"
widgets:
- id: status
widget_type: status_light
label: "Compressor"
value_binding: zone_b.compressor_ok
accent: success Questions?
Reach out for help with integration, deployment, or custom domain codecs.