FMU Validator¶
The FMU validator runs a Functional Mock-up Unit co-simulation on the submission and exposes the FMU's output variables as values you can write CEL rules against.
It's the right tool for accepting and gating dynamic models — controls algorithms, HVAC plant components, electric-vehicle charging logic, anything packaged as an FMU — where the question isn't "is the file structurally valid?" but "does the model behave correctly when driven with a known input profile?"
Pro / Enterprise
FMU is a container-based advanced validator. It unlocks when your Validibot deployment is licensed for Pro or Enterprise. See Self-Hosted Editions or Cloud Edition.
What you'll need¶
- A Validibot deployment licensed for an edition that includes the FMU validator.
- A workflow whose allowed file types include FMU (
.fmu) and whatever format you use for the driver (typically JSON or YAML). - An FMU package to test against.
- A driver definition: the inputs to feed the FMU, the simulation time range and step, and which outputs you care about.
How an FMU step works¶
When a submission reaches the step, Validibot:
- Reads the FMU's
modelDescription.xmland lists declared input and output variables. These appear as step inputs (i.<variable>) for rules and inspection. - Resolves the driver — combining the static driver definition on the step with any per-submission overrides — into a concrete simulation plan.
- Dispatches the FMU + driver to an isolated FMU runtime container.
- Captures the requested output series as
step outputs (
o.<variable>, typically as series you can aggregate with helpers likemean(),max(),percentile(),duration()). - Runs your assertions against
i.*,o.*,p.*, ands.*.
Setting up an FMU step¶
- Open the workflow editor and click Add step.
- Pick FMU from the validator library. If it's greyed out, check that your deployment's license includes it and the workflow's allowed file types include FMU.
- Give the step a name like "Controls behaviour check" and a short description.
- Define the driver:
- Simulation start time, stop time, and communication step.
- Input variables to set, and either constant values, a tabular profile, or references to submission fields.
- Output variables to capture for assertions.
- (Optional) Tighten runtime guards — wall-clock timeout, memory ceiling.
- Click Save step.
- Add step assertions against the captured outputs.
Outputs as series¶
Many FMU outputs are time series — the value of a temperature, voltage, or set point over the simulation horizon. Validibot's CEL helpers are designed for that shape:
# Mean room temperature stays within a comfort band
mean(o.room_temp_C) >= 20.0 && mean(o.room_temp_C) <= 24.0
# 95th-percentile peak never exceeds the limit
percentile(o.peak_power_w, 0.95) <= 7500.0
# Spend no more than 100 samples outside the comfort band
duration(o.room_temp_C, v < 19.0 || v > 25.0) <= 100
# Maximum control error is small
max(o.tracking_error) < 0.5
If you'd rather assert on a single scalar, helpers like mean(),
max(), min(), sum(), percentile(), and round() get you
there — see the CEL Expressions page
for the full list.
When to gate on inputs vs. outputs¶
Like the EnergyPlus validator, the FMU validator separates input-stage and output-stage assertions:
- Input-stage assertions run before the co-simulation. Use them
to bail out fast on structurally wrong FMUs ("this FMU must declare
variable
room_temp_C", "FMI version must be 2.0 or 3.0"). - Output-stage assertions run on the captured series. Use them for behavioural rules.
A failed input-stage assertion saves you the simulation cost.
Tips¶
- Pin the driver in the step, not the submission. A driver baked into the workflow step is reproducible — every submission runs against the same inputs. If you let submitters supply their own driver, two submissions become hard to compare.
- Capture only the outputs you assert against. Capturing every variable is tempting but slows the run and bloats artifacts.
- Promote thresholds to signals. If your comfort band, peak
limit, or tracking-error tolerance is referenced in multiple
assertions, define it once as a workflow signal (
s.peak_limit_w) and reference it everywhere. - Chain a cheap structural check first. A Basic step that validates the FMU's declared inputs and outputs match what your driver expects catches obvious mismatches before the co-simulation fires up.
Where to next¶
- Data Namespaces — how
i.*ando.*fit together for a multi-stage validator. - CEL Expressions — operators and
the series-friendly helpers (
mean,percentile,duration). - EnergyPlus Validator — the sibling advanced validator for building-energy simulations.