Step 16: Visual Design Tools
Create reusable graphics, device faceplates, and system schematics with the visual builders.
In the previous step, you learned to build dashboards with the Layout Editor. Now you'll discover ControlBird's three specialized visual builders for creating reusable graphics that bring your devices to life.
Three Builders, Three Purposes
ControlBird provides three visual design tools, each optimized for a different use case:
Model Builder
Reusable Visual Components
Create template graphics with parameters. Like a "class" in programming - define once, instantiate many times with different values.
Faceplate Builder
Single-Device Detail Views
Create detailed control panels for one device type. Uses indirection - the same faceplate works for any instance of that device type.
Schematic Builder
Multi-Device Spatial Layouts
Create overview displays showing multiple devices in their physical arrangement. Each device is directly bound to a specific entity.
Choosing the Right Tool
Here's a decision guide to help you pick the right builder:
Model Builder: Reusable Components
The Model Builder creates visual templates with parameters. Think of models as reusable building blocks - you define the appearance and behavior once, then use them throughout your system with different parameter values.
Key Concepts
targetEntity, showLabel, and size. ${paramName} syntax. Creating a Simple Model
Let's create a "Status Indicator" model that shows green when a device is online and red when offline:
- Open Model Builder from the ControlBird menu
- Click + New Model
- Name it "Status Indicator"
- Add a parameter:
targetEntity(type: EntityReference) - Draw a circle shape on the canvas
- Add a notification channel watching
${targetEntity}.Status - Write a callback that sets circle color based on value
- Save and test with different entities
In the callback, read the incoming status value and choose a fill color for the circle: green when the device is online, red when offline, and a neutral gray otherwise. The Model Builder applies the new color the moment the watched field changes, so the indicator stays in sync with the device in real time.
Faceplate Builder: Device Control Panels
The Faceplate Builder creates detailed interfaces for a single device type. Faceplates use indirection - they don't bind to a specific entity, but rather to "the entity being viewed." This means one faceplate design works for all instances of that device type.
How Indirection Works
Watches fields like "Status", "Value", "Name" without specifying which entity
User opens faceplate for "Pump-A" - context entity is set
Faceplate shows Pump-A's actual Status, Value, and Name
When to Use Faceplates
- Device detail popups - Right-click a device to see full controls
- Operator control panels - Detailed view for monitoring one device
- Diagnostic displays - Show all fields and history for troubleshooting
Faceplate vs Dashboard
Faceplates show one device in detail. Dashboards (Layout Editor) show multiple devices at once. Use faceplates for "drill-down" views opened from dashboards or schematics.
Schematic Builder: System Overviews
The Schematic Builder creates spatial layouts showing multiple devices in their physical arrangement. Unlike faceplates, schematics use direct entity references - each device placement explicitly points to a specific entity path.
Key Features
Position models or faceplates at specific locations on the canvas
Link to other schematics for hierarchical navigation
Draw static elements like floor plans, pipes, and labels
Show/hide details based on zoom - overview vs detail views
Creating a Schematic
- Open Schematic Builder from the ControlBird menu
- Click + New Schematic and name it
- Draw background shapes (floor plan, equipment outlines)
- Add device placements from the library panel
- For each placement, set:
- Visual: Which Model or Faceplate to display
- Target Entity: The specific entity path (e.g.,
/Root/Stations/Central/Pump1) - Position: Where on the canvas
- Add navigation buttons to link to sub-schematics
- Save and test in preview mode
How They Work Together
The three builders are designed to complement each other in a layered architecture:
A typical workflow:
- Create Models for basic visual elements (gauges, icons, status indicators)
- Build Faceplates that combine models into device control panels
- Design Schematics that place models and faceplates on spatial layouts
- Use in Dashboards by embedding schematics or faceplates in Layout Editor
Best Practices
Create reusable models for common elements. A good library speeds up all future work.
Use standard sizes for models so they align nicely in schematics and dashboards.
Use triggerOnChange: true for config fields to reduce unnecessary updates.
Put background shapes on lower z-index, devices on top. Use panes for complex layouts.
Troubleshooting
Model shows "undefined" for parameter values
- Check parameter binding: Ensure the parameter is bound when instantiating the model
- Check syntax: Use
${paramName}not$paramName - Check default value: Set a sensible default in the parameter definition
Faceplate notifications not firing
- Check field name: Field names are case-sensitive
- Check context entity: Faceplate must be opened with a valid entity context
- Check callback syntax: Ensure the callback function is valid JavaScript
Schematic device placements not showing
- Check entity path: The target entity path must exist and be accessible
- Check visual entity: The Model or Faceplate must be saved and accessible
- Check zoom level: Device may be hidden at current zoom (minZoom/maxZoom)
When should I use a Model inside a Faceplate vs inside a Schematic?
In a Faceplate: The model inherits the faceplate's context entity. Use ${targetEntity} parameter bound to the context.
In a Schematic: Each model placement has its own explicit target entity. The parameter is bound to that specific entity path.