mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-16 21:02:51 +08:00
a7c776e8d4
# Description Aligns the WoT implementation with the normative changes in the OPC UA WoT specification drafts that the stack had not picked up, and fixes the defects that alignment surfaced. The driving artifact is [OPCF-Members/spec-drafts#19](https://github.com/OPCF-Members/spec-drafts/pull/19), *"bind a projected node to an already-loaded type, by name or by NodeId"*, which landed on the spec `main` after this repository last tracked it. ## 1. Bind a projected node to an existing type (Binding §5.2.1) §5.2.1 lets a document state that the node it projects is an instance of a type that **already exists** — one a companion model defines and the Server has loaded, or one a sibling document of the same conversion defines — so a converter binds to that type instead of defining a second type of the same shape. The converter hardcoded `HasTypeDefinition` to `BaseObjectType`, so a document that named its type projected an **untyped** node: a client browsing for the companion type would not find it, and nothing said why. Both forms are now implemented, resolved against the §5.1.5 **local context** — the other documents being converted together first, a loaded AddressSpace as the fallback. `IWotNodeResolver` supplies that context (is a namespace held; what does a qualified BrowseName match; what does an ExpandedNodeId identify), `WotCompositeNodeResolver` composes implementations in the specified order, and `NullWotNodeResolver` is the default that holds nothing. The converter needed no new async surface: the binding is resolved in a pre-resolve pass, exactly as Thing references already are, and the synchronous core consumes the result. The §5.2.1 table is honoured: a unique name binds; the link settles an ambiguous name; a name that resolves to nothing while the link resolves is **invalid** (that is a mistake in the name, not a shorthand for the identifier); two forms resolving to different Nodes are invalid; a resolved type of the wrong NodeClass is invalid. A binding naming a type the local context does not hold **fails** rather than falling back to `BaseObjectType` — a silently mistyped node is worse than a reported failure. A compact name is told from ordinary `@type` annotation **by namespace**, not by whether the lookup succeeds, so `saref:TemperatureSensor` on a Server that has never heard of SAREF stays the annotation it always was. The definitive form — a `ua:HasTypeDefinition` link whose `href` is the ExpandedNodeId of the type. An ExpandedNodeId matches exactly one Node or none, so it needs no lookup. A Node has exactly one `HasTypeDefinition`, so: - two such links → `AmbiguousTypeBinding` (6019), and the root keeps the default rather than being bound to a guess; - a link with no usable identifier → `InvalidTypeBinding` (6020); - no binding at all → the `BaseObjectType` default is unchanged. ## 2. Drop the six vocabulary terms `#19` removed `#19` deleted `uav:capability`, `uav:componentModel`, `uav:reference`, `uav:congruentType`, `uav:congruentTypeName` and `uav:nameNamespace` from the context, the JSON Schema and the ontology. A link now names its ReferenceType directly in `rel`, so the three link relations become `ua:HasInterface`, `ua:HasComponent` and `ua:NonHierarchicalReferences`, and the congruent-type pair is superseded by the §5.2.1 type binding. Their validation and mapping are removed; they are now ordinary residue like any other unrecognised term. ### A real gap this uncovered The converter knew **eight** ReferenceTypes by name and had neither `NonHierarchicalReferences` (`i=32`) nor `HasInterface` (`i=17603`) — so the two relations that *replace* `uav:reference` and `uav:capability` could not resolve at all. That includes example 02, which this repository vendors as a golden asset and which `#19` rewrote to use them. Both are now in the map. `uav:congruentType` was also the only term that redirected one reference to another while resolving a link target, so `ResolveTargetNodeIdAsync` no longer needs a loop. It resolves once and reports an unresolved target; the resolution context is still entered and the bytes still counted, so the per-conversion document, depth and byte bounds are unchanged. ## 3. Reject an out-of-range event severity instead of clamping it `uav:severity` had grown in this implementation without being a specification term. Rather than drop it, it is proposed upstream in [OPCF-Members/spec-drafts#21](https://github.com/OPCF-Members/spec-drafts/pull/21), which defines it with an explicit rule: the value **shall** be in the OPC 10000-5 range 1..1000, and a consumer **shall not** silently clamp it. The implementation clamped, so a document asking for severity 5000 was accepted and published as 1000 — the mistake was hidden while what the author asked for was changed. An affordance carrying an out-of-range severity is now skipped, with the reason logged, and its half-built event type and `GeneratesEvent` reference are removed. ### Defect found while making that change The occurrence-time path read `ValidateSeverity(severity) ?? tag.Severity`. Because `ValidateSeverity(null)` returns the 500 default, it **never** fell back to the affordance's authored severity: an occurrence reported without a severity published 500 rather than the authored 900. Build-time validation and the occurrence-time choice are now separate methods. ## 4. Vendored examples and honest coverage claims Examples 21 and 22 were missing from the vendored golden assets. Converting example 22 is now the end-to-end check for §5.2.1 — the specification's own example rather than a fixture written to match the implementation. `docs/WotBindings.md` claimed ten of the eleven conformance units and silently omitted **WoT-ConditionMapping**, and said "twenty worked examples". The count is corrected, and WoT-ConditionMapping is now **covered** — see §5 below. ## 5. Alarms and Conditions (Binding §13) The last unclaimed conformance unit. A projected Condition event now derives from the ConditionType it names rather than from `BaseEventType`; falling back would lose the Condition state model entirely, leaving a Client unable to tell an alarm from an ordinary event. The two forms follow the hint-plus-pin pattern of §5.3: `uav:conditionTypeId` is definitive and wins, `uav:conditionType` is a readable hint resolved for the four ConditionTypes §13.1 scopes. An unpinned name outside that set is reported rather than guessed. Four conformance rules are enforced, each because breaking it yields a document a consumer can read but cannot act on: | Rule | Section | Diagnostic | | --- | --- | --- | | A Condition event declares `EventId` in its `data` | 13.3 | `ConditionEventIdMissing` | | `uav:conditionAction` is inside its closed set | 13.2 | `InvalidConditionAction` | | `uav:actsOn` names a Condition event in the same document | 13.4 | `InvalidConditionTarget` | | `Acknowledge`/`Confirm`/`AddComment` declare an `EventId` input | 13.4 | `ConditionActionInputMissing` | `Enable` and `Disable` act on the Condition instance rather than one occurrence and are deliberately exempt from the last rule, pinned by a negative test. Shelving, suppression, dialog conditions and `ConditionRefresh` stay out of scope, as §13.1 scopes the mapping. ## 6. The sibling half of the §5.1.5 local context `SnapshotWotNodeResolver` indexes the registry snapshot a conversion runs over and is wired into `WotNodeSetDocumentConverter`, so a document naming a type another document in the same registry projects resolves with no AddressSpace at all. Only Thing Models are indexed: a Thing Model projects a `UAObjectType` and is a valid target, a Thing Description projects an instance and never is. Identity comes from the new public `WotNodeSetConverter.TryDescribeProjectedType`, which applies exactly the rules the conversion uses, so an index entry and the projected node cannot drift apart. Ambiguity is preserved rather than resolved: two siblings sharing a qualified name yield both matches so the caller can report it. ## Deliberately not in this PR - **The AddressSpace-backed `IWotNodeResolver`.** The abstraction, the composite, the null default and the sibling-document implementation ship here; the AddressSpace-backed half needs a cached type-hierarchy walk behind a server `OperationContext` and follows separately. Until it exists a host gets the sibling context plus the null fallback, which reports a binding as unresolved rather than mistyping it. - **Two §5.2.1 obligations that need the address space**: not duplicating a mandatory instance declaration of the resolved type, and rejecting disagreement with an instantiated Thing Model. - **Connectivity §7.3 parent resolution.** Each is tracked; none is faked here. ## Related Issues There is no tracking issue: this came out of a spec-versus-implementation audit rather than a reported defect, and the driving artifacts are the two upstream spec PRs linked above. Happy to open one if maintainers prefer — the §5.2.1 follow-up in particular is worth an ADR, since the local-context resolver is a new injectable provider spanning two assemblies. ## Checklist - [x] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [x] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce (new) build or analyzer warnings. - [x] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received. ### Verification detail | | net10.0 | net48 | |---|---|---| | `Opc.Ua.Types.Tests` | 8573 / 8573 | 8555 / 8555 | | `Opc.Ua.WotCon.Tests` | 1075 / 1075 | 1075 / 1075 | Full `UA.slnx` build: **0 errors, 0 warnings** across all target frameworks, re-verified after `master` was merged into the branch. Every new test was mutation-verified: the type-binding tests against three mutations (revert to the hardcoded default, drop the ambiguity check, accept an empty `href`), the severity tests against reinstating the clamp, and the ReferenceType additions against removing them from the map. Each mutation failed the suite before the change was kept. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9e6a5abf-3299-4cd1-9855-010fedbf0ad8
1 line
15 KiB
Plaintext
1 line
15 KiB
Plaintext
('real','ROOT/Events','Object','ns=2;i=1019'),('real','ROOT/Maintenance','Object','ns=2;i=1011'),('real','ROOT/Operational','Object','ns=2;i=1053'),('real','ROOT/Identification','Object','ns=2;i=1005'),('real','ROOT/OpenUsdRepresentation','Object','ns=4;i=1003'),('real','ROOT/BayPosition','Variable','i=63'),('real','ROOT/AlarmActive','Variable','i=63'),('real','ROOT/ShaftAngle','Variable','i=63'),('real','ROOT/FluidSurfacePosition','Variable','i=63'),('real','ROOT/SpeedSetpoint','Variable','i=63'),('real','ROOT/Impeller','Object','i=58'),('real','ROOT/Bearing','Object','i=58'),('real','ROOT/Diagnostics','Object','ns=5;i=1005'),('real','ROOT/Events','Object','ns=2;i=1019'),('real','ROOT_Events/SupervisionProcessFluid','Object','ns=2;i=1015'),('real','ROOT_Events/SupervisionPumpOperation','Object','ns=2;i=1016'),('real','ROOT_Events/OverTempAlarm','Object','i=9906'),('real','ROOT_Maintenance/GeneralMaintenance','Object','ns=5;i=1005'),('real','ROOT_Operational/Measurements','Object','ns=2;i=1054'),('real','ROOT_Identification/ArticleNumber','Variable','i=68'),('real','ROOT_Identification/CountryOfOrigin','Variable','i=68'),('real','ROOT_Identification/DayOfConstruction','Variable','i=68'),('real','ROOT_Identification/FabricationNumber','Variable','i=68'),('real','ROOT_Identification/OrderProductCode','Variable','i=68'),('real','ROOT_Identification/Supplier','Variable','i=68'),('real','ROOT_Identification/TypeOfProduct','Variable','i=68'),('real','ROOT_Identification/Location','Variable','i=68'),('real','ROOT_Identification/AssetId','Variable','i=68'),('real','ROOT_Identification/ComponentName','Variable','i=68'),('real','ROOT_Identification/DeviceClass','Variable','i=68'),('real','ROOT_Identification/HardwareRevision','Variable','i=68'),('real','ROOT_Identification/Manufacturer','Variable','i=68'),('real','ROOT_Identification/ManufacturerUri','Variable','i=68'),('real','ROOT_Identification/Model','Variable','i=68'),('real','ROOT_Identification/MonthOfConstruction','Variable','i=68'),('real','ROOT_Identification/ProductCode','Variable','i=68'),('real','ROOT_Identification/ProductInstanceUri','Variable','i=68'),('real','ROOT_Identification/SerialNumber','Variable','i=68'),('real','ROOT_Identification/SoftwareRevision','Variable','i=68'),('real','ROOT_Identification/YearOfConstruction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation/Stage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation/PrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation/BayLayout','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/ShaftSpin','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/MotorFanSpin','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/BearingTempColor','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/BearingTempNeedle','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/DischargePressureNeedle','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/SuctionLevelRise','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/EfficiencyReadout','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/FluidTempColor','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/MassFlowReadout','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/NumberOfStartsReadout','Object','ns=4;i=1007'),('real','ROOT_OpenUsdRepresentation/AlarmRingVisibility','Object','ns=4;i=1008'),('real','ROOT_OpenUsdRepresentation/CavitationHalo','Object','ns=4;i=1008'),('real','ROOT_OpenUsdRepresentation/OverheatHalo','Object','ns=4;i=1008'),('real','ROOT_OpenUsdRepresentation/SpeedSetpointCommand','Object','ns=4;i=1011'),('real','ROOT_OpenUsdRepresentation/ImpellerComponent','Object','ns=4;i=1005'),('real','ROOT_OpenUsdRepresentation/BearingComponent','Object','ns=4;i=1005'),('real','ROOT_Impeller/OpenUsdRepresentation','Object','ns=4;i=1003'),('real','ROOT_Bearing/OpenUsdRepresentation','Object','ns=4;i=1003'),('real','ROOT_Diagnostics/LastError','Variable','i=68'),('real','ROOT_Diagnostics/ErrorCount','Variable','i=68'),('real','ROOT_Diagnostics/LastSelfTest','Variable','i=68'),('real','ROOT_Events_SupervisionProcessFluid/Cavitation','Variable','i=2373'),('real','ROOT_Events_SupervisionPumpOperation/MotorOverheat','Variable','i=2373'),('real','ROOT_Events_OverTempAlarm/ActiveState','Variable','i=8995'),('real','ROOT_Events_OverTempAlarm/InputNode','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/SuppressedOrShelved','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/AckedState','Variable','i=8995'),('real','ROOT_Events_OverTempAlarm/Acknowledge','Method','i=9111'),('real','ROOT_Events_OverTempAlarm/ConditionName','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/BranchId','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/Retain','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/EnabledState','Variable','i=8995'),('real','ROOT_Events_OverTempAlarm/Quality','Variable','i=9002'),('real','ROOT_Events_OverTempAlarm/LastSeverity','Variable','i=9002'),('real','ROOT_Events_OverTempAlarm/Comment','Variable','i=9002'),('real','ROOT_Events_OverTempAlarm/ClientUserId','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/Disable','Method','i=9028'),('real','ROOT_Events_OverTempAlarm/Enable','Method','i=9027'),('real','ROOT_Events_OverTempAlarm/AddComment','Method','i=9029'),('real','ROOT_Events_OverTempAlarm/EventId','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/EventType','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/SourceNode','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/SourceName','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/Time','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/ReceiveTime','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/Message','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/Severity','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/ConditionClassId','Variable','i=68'),('real','ROOT_Events_OverTempAlarm/ConditionClassName','Variable','i=68'),('real','ROOT_Maintenance_GeneralMaintenance/MaintenancePlan','Variable','i=68'),('real','ROOT_Operational_Measurements/BearingTemperature','Variable','i=15318'),('real','ROOT_Operational_Measurements/DifferentialPressure','Variable','i=15318'),('real','ROOT_Operational_Measurements/FluidTemperature','Variable','i=15318'),('real','ROOT_Operational_Measurements/Level','Variable','i=15318'),('real','ROOT_Operational_Measurements/MassFlow','Variable','i=15318'),('real','ROOT_Operational_Measurements/NumberOfStarts','Variable','i=15318'),('real','ROOT_Operational_Measurements/PumpEfficiency','Variable','i=15318'),('real','ROOT_Operational_Measurements/PumpPowerInput','Variable','i=15318'),('real','ROOT_OpenUsdRepresentation_BayLayout/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BayLayout/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_ShaftSpin/SourceSemanticId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_MotorFanSpin/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/Offset','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempColor/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/Offset','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_BearingTempNeedle/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_DischargePressureNeedle/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_SuctionLevelRise/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/RenderTargetKind','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/Scale','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/BadQualityAction','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_EfficiencyReadout/SignalRole','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/BindingDefinitionId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/Enabled','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/SourceNodeId','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/TargetStage','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/TargetPrimPath','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/TargetPropertyName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/TargetUsdTypeName','Variable','i=68'),('real','ROOT_OpenUsdRepresentation_FluidTempColor/RenderTargetKind','Variable','i=68') |