matlab-build-industrial-hmi
Build industrial-grade SCADA/HMI dashboards in MATLAB following industrial-HMI conventions (ISA-101-aligned): gray-field philosophy, alarms at source, write safeguards, fixed-range trends, drill-down layout.
Install / Use
npx skills add matlab/matlab-agentic-toolkit --skill matlab-build-industrial-hmiInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
OperationsSupported Platforms
Our assessment of matlab-build-industrial-hmi
matlab-build-industrial-hmi scores 86/100 on our quality scale, 404th of 740 Operations skills we index.
Its SKILL.md is 22 KB long, well organised into 16 sections and no code examples: a thorough specification that gives an agent plenty to work with.
With 1,098 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 18 days ago, so matlab-build-industrial-hmi is actively maintained.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 88/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
matlab-build-industrial-hmi compared with similar skills
All 4 of these similar skills score higher than matlab-build-industrial-hmi; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| matlab-build-industrial-hmi (this skill)by matlab | 86 | 1.1k | 18d ago | SKILL.md |
| algorithmic-artby anthropics | 100 | 177.9k | 11d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 11d ago | SKILL.md |
| designby nextlevelbuilder | 100 | 130.2k | 12d ago | SKILL.md |
| ui-ux-pro-maxby nextlevelbuilder | 100 | 130.2k | 12d ago | SKILL.md |
Frequently asked questions
- How do I install matlab-build-industrial-hmi?
- Run
npx skills add matlab/matlab-agentic-toolkit --skill matlab-build-industrial-hmi. The install tabs above show the steps for each supported agent. - Which AI agents does matlab-build-industrial-hmi work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is matlab-build-industrial-hmi safe to use?
- It declares no license and scores 88/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is matlab-build-industrial-hmi still maintained?
- The repository was last updated 18 days ago, so matlab-build-industrial-hmi is actively maintained.
Skill content
View source on GitHubname: matlab-build-industrial-hmi description: > Build industrial-grade SCADA/HMI dashboards in MATLAB following industrial-HMI conventions (ISA-101-aligned): gray-field philosophy, alarms at source, write safeguards, fixed-range trends, drill-down layout. Produces a real App Designer app (.mlapp, or plain-text .m+.xml on R2026b+) by handing serialization to the matlab-build-app skill when available, and falls back to a programmatic .m app otherwise. Use when wrapping OPC UA / Modbus / MQTT / OSI PI / PI AF monitoring scripts into a live operator app, building plant overviews, designing operator dashboards, or any time a user asks for a "SCADA dashboard", "HMI", "plant dashboard", "operator screen", or "industrial monitoring app" in MATLAB. Trigger on: SCADA, HMI, industrial dashboard, plant overview, operator screen, uigauge, uilamp, alarm banner, gray-field, ISA-101, OPC UA dashboard, setpoint, write safeguards, alarm visualization, OSIsoft PI, AVEVA PI, PI Server, PI Data Archive, PI AF, PI Asset Framework, piclient, afclient. license: https://www.mathworks.com/content/dam/mathworks/license/pmrl/license.md metadata: author: MathWorks version: "1.1"
Industrial HMI Builder
Build operator-facing SCADA/HMI dashboards in MATLAB App Designer that follow industrial-HMI conventions: gray-field color philosophy, alarms shown at the data source, write safeguards on every setpoint, fixed-range trends with threshold lines, and a drill-down layout (plant overview → area → detail).
When to Use
- A user asks to "wrap this OPC UA / Modbus / MQTT / OSI PI / PI AF script into a SCADA dashboard / HMI / operator screen" — including scripts generated by the OPC UA Explorer or Modbus Explorer apps (
opcuageneratedScript.mlx,modbusgeneratedScript.mlx) - Building a plant overview, area screen, or detail screen for industrial monitoring
- Adding alarm visualization, setpoint writes, or live trends to an existing App Designer app
- Reviewing or refactoring an HMI that uses gauges, lamps, or trend axes for process data
- Any prompt mentioning ISA-101, gray-field, alarm banner, write confirm, setpoint, or "operator dashboard"
When NOT to Use
- General App Designer mechanics (
uigridlayout, callback wiring, lifecycle,matlab.apps.AppBasescaffolding) and serialization to a real App Designer file — this skill delegates those tomatlab-build-app. Seereferences/app-designer-handoff.md. Two things stay here and must not be routed away: gray-field theming (never hand color/dark-mode tomatlab-apply-theme) and HMI trends (never hand them tomatlab-build-chart). - Discovering OPC UA servers on a network, finding endpoint URLs, or browsing namespaces for the first time — use
matlab-use-opcua-client. - Non-process domains (consumer apps, lab utilities, scientific GUIs) — the conventions here are tailored to plant operators monitoring physical processes.
Must-Follow Rules
Widget & Layout
-
Gray-field background
[0.78 0.78 0.78]; panels[0.86 0.86 0.86]; 80%+ of the screen neutral. Color is reserved for exception. Seereferences/color-and-layout-rules.md. -
Construct EVERY HMI
uifigurewith both'Color'and'Theme', 'light'. On a dark-themed MATLAB desktop, child widgets (uigauge, uiaxes, uitable, uieditfield) inherit dark defaults even when the figure colour is set explicitly — gauge bodies and axes go near-black, text becomes unreadable.Theme='light'blocks the inheritance; the explicit gray-fieldColorkeeps the result gray rather than the bright white that'light'would otherwise produce. Neither alone is enough.app.UIFigure = uifigure( ... 'Color', [0.78 0.78 0.78], ... 'Theme', 'light');See
references/color-and-layout-rules.mdfor the full rationale andreferences/common-mistakes.mdentry 24 for the visible failure mode if either argument is omitted. -
Quantity caps per screen: ≤ 6 gauges, ≤ 4 trend axes, ≤ 12 numeric readouts. Beyond that, use a
uitable. -
Connection state is BLUE
[0.4 0.6 1.0]. Green[0 0.6 0]is reserved for "operator must verify yes this is actively OK" — not for "comms up" or "running". -
Command buttons/controls are neutral gray. Never a green Start / red Stop — buttons are always-visible chrome and carry no status, so coloring them spends the alarm colors and steals contrast from real alarms. Differentiate by label; show run/stopped state on a separate lamp. (Red E-Stop is the one convention-based exception.) See
references/color-and-layout-rules.md. -
Like-typed analogs in one panel use like widgets. Don't show one temperature as a gauge and another as a numeric label.
-
NEVER produce a dark background for an industrial HMI, regardless of the user request. ISA-101 has no dark variant; a dark field destroys color-as-exception (alarm reds and ambers stop popping against a near-black background, and operators desensitize). Always render gray-field (
[0.78 0.78 0.78]) and reply with a one-sentence justification when the user asks for dark mode. This is not a default — it is a hard constraint.
Alarms & Trends
- Alarms at source AND in a banner. Keyed
ScaleColors/ScaleColorLimitson every linear gauge with thresholds (semicircular/circular/ninetydegree gauges don't support color bands — use linear when alarm bands are needed); persistent top-row banner listing active alarms, color-coded by highest severity; latched state with Acknowledge button. The normal band inScaleColorsis neutral gray[0.5 0.5 0.5]— never green. Seereferences/alarm-patterns.md. - Never
uialert/uiconfirm/msgboxfor live process alarms — alarm-fatigue anti-pattern (ISA-18.2). If a popup is unavoidable, fire once on the rising edge with a non-blockingCloseFcnand an Acknowledge button. - Fixed trend
YLimmatching the node's spec range — never auto-scale by default. Provide a per-trend toggle for exploration. Seereferences/trend-config-reference.md. - 5-minute rolling window is the default:
animatedline('MaximumNumPoints', 300)at 1 s update. Buffer formula =WindowSeconds / UpdatePeriodSeconds. - Threshold lines drawn once at construction with
yline(amber dashed for warn, red dashed for alarm, blue dotted for setpoint).
Writes
- Every
writeValue()confirms.uiconfirmshowing node + old + new + units; default option is Cancel, not Apply. - Visual feedback after write. Background flash green on success, red on failure (revert UI on failure). Operator must never be uncertain whether the write took effect.
- Range label adjacent to every writable field.
Limitson the spinner enforces the bound; theuilabelmakes it visible. - E-Stop and other safety-critical actuation confirm both engage and release — accidental touchscreen clicks are the threat. See
references/write-safeguards-reference.md. - Disable write controls when the system can't accept them (disconnected, E-Stop active) rather than letting writes fail mid-call.
Protocol Selection
- OPC UA:
subscribe()is the default at any node count and update rate, including 1 Hz with a small node set. Reservetimerfor non-node UI work (clock displays, alarm flashing, idle dimming). - R2026a OPC UA contract:
subscribe(client, nodes, cb)invokescb(sub, notification); data lives atnotification.Data.Value/notification.Data.Timestamp; the originating node isnotification.Node(struct withName,Identifier,NamespaceIndex). Don't referencesrc.Name— that worked in older releases whensrcwas the node, but errors in R2026a. - Two callback shapes — match the source. When you write the
subscribecall, use the 2-argcb(sub, notification)above. When you paste an OPC UA Explorer–generateddataChangeCallback, it is 3-arg vectorized —cb(subObj, notification, ~)— andnotificationis a struct array (one entry per node changed this cycle): iteratenotification(i).Node.Name/notification(i).Data.Value; never treat it as scalar. Writing a 2-arg@(src, evt)for an Explorer script throws "Too many input arguments"; treatingnotificationas scalar reads only the first node. Seereferences/protocol-cheatsheet.md§OPC UA andreferences/common-mistakes.md#17. - Modbus has no
subscribe()— use a pollingtimerwithBusyMode='drop',ExecutionMode='fixedSpacing'. The 6-argwrite()order iswrite(m, target, addr, val, serverId, 'precision')—serverIdBEFORE'precision'. - MQTT
subscribe(c, topic, Callback=@cb)— the callback is a name-value pair, not positional. Decodemessage(a string) per the broker's payload schema (str2double,jsondecode). - OSI / AVEVA PI Data Archive: use
piclient(Industrial Communication Toolbox, R2022a+). Never callNET.addAssembly('OSIsoft.AFSDK')or writeOSIsoft.AF.PI.PIServers/OSIsoft.AF.PISystemscode in MATLAB — the toolbox client wraps the AFSDK and returns native MATLAB types (timetable,table,datetime); rolling your own .NET interop loses type coercion, throws on permission errors that the toolbox handles, runs slowly because batched reads are bypassed, and breaks the integrated browser app. PI has nosubscribe()— drive trends with a polling timer (same shape as Modbus). Writes viawrite(piClient, tag, value, TimeInstance=datetime("now"))are R2024a+. - PI Asset Framework: use
afclient(Industrial Communication Toolbox, R2026a+). Browse withgetRootElements/getChildren/findElementByName/findElementByPath/findElementByTemplate; read withAttribute.read(current → table) andAttribute.readHistory(archive → timetable). The AF hierarchy maps directly onto Level 1 → Level 2 → Level 3 drill-down screens. AF current-value writes are not exposed by the toolbox — there is noAttribute.write; route writes through the underlyingAttribute.PITagand the PI client. - Identify writable attributes from
Attribute.WriteAccessandHasTimeSeriesData, the same way OPC UA usesAccessLevelCurrent. Don't infer writability from the name. - Use the server's actual tag / attribute names from
tags(c).Nameorattribute.Name/attribute.Path. Never invent labels — the HMI must mirror the source script's identifiers so operators can cross-reference with the OPC UA Explorer / OSI PI viewer / AF browser.
See references/protocol-cheatsheet.md for OPC UA / Modbus / MQTT API shapes and references/pi-af-cheatsheet.md for PI Data Archive and PI AF; see references/common-mistakes.md for the silent-failure modes.
App Designer Language
- Initialize typed
structproperties:Foo struct = struct(). A bareFoo structdeclaration becomes0×0 structandapp.Foo.Bar = 1errors with "A dot name structure assignment is illegal when the structure is empty." classdeffirst. Afunctionblock beforeclassdefin the same file is a parse error. Drop the wrapper; the file's first non-comment statement must beclassdef, name matching filename.- No
function … endin inline evaluation. Function definitions are legal only inside code files, never in a command-window / inline context. When you sanity-check helper logic (severity bands, alarm math) throughevaluate_matlab_code, the transcript is a command-window context — a pastedfunction … endblock errors with"Function definitions are not supported in this context."Verify by exercising the helper from its file, or inline the arithmetic directly. - Subscription cleanup:
opc.ua.Subscriptionhas no publicdelete. Drop the handle (app.Subscription = opc.ua.Subscription.empty;) anddisconnect(client)— that releases all subscriptions on that client. - Subscribe per widget, never rebuild a single global subscription on each add — each
subscribe()accumulates a channel listener; rebuild
Truncated for display — read the full file on GitHub.
Related Skills
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
pptx
177.9kUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an em…
design
130.2kComprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini, Atlas Cloud, or MuAPI AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social/ads/web/print), icon design (15 styles, SVG…
ui-ux-pro-max
130.2kUI/UX design intelligence for web, mobile, and desktop. This skill should be used when designing, building, reviewing, or fixing interfaces, including pages, components, design systems, accessibility, interaction, responsive layout, typography, color, charts, and stack-specific UI implementation.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
