> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/dsx-exchange/llms.txt.
> For full documentation content, see https://docs.nvidia.com/dsx-exchange/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/dsx-exchange/_mcp/server.

# BMS Event Bus 1.0.0

Telemetry and control event catalog for the Building Management System (BMS)
over MQTT. Provides real-time point values and point metadata for all supported
object and point types.

## How to use this spec

Each monitored point follows a **Value / Metadata** pattern:

* **Value** messages carry the live reading (`value`, `timestamp`, `quality`).

  Subscribe to a value channel to receive real-time telemetry. Values are published whenever they change and republished every 100 seconds when they do not change.

* **Metadata** messages describe the point (units, identifiers, relationships).

  **Always receive metadata before interpreting values.** Metadata is retained and published once at startup. It is subsequently published every 100 seconds.

## Topic structure

| Publisher   | Topic Type | Pattern                                                         |
| :---------- | :--------- | :-------------------------------------------------------------- |
| BMS         | Value      | `BMS/v1/PUB/Value/{objectType}/{pointType}/{tagPath}`           |
| BMS         | Metadata   | `BMS/v1/PUB/Metadata/{objectType}/{pointType}/{tagPath}`        |
| Integration | Value      | `BMS/v1/{integration}/Value/{objectType}/{pointType}/{tagPath}` |

The `{tagPath}` is a vendor-defined hierarchical path and may contain multiple `/` segments. Each `{tagPath}` must be unique for each point and is usually derived from the BMS system based on the BMS point name.

Use `#` to subscribe to all topics under a given hierarchy (multi-level wildcard).

Use `+` to match exactly one topic level (single-level wildcard).

## Publisher rules

* **BMS** publishes all metadata — including for points whose values are written by integrations.

* **BMS** publishes its own point values on `BMS/v1/PUB/Value/...`.

* **Integrations** are any system (MQTT Client) external to the BMS. Whenever they need to directly send messages to the BMS, they publish values on `BMS/v1/{integration}/Value/...`. Integrations do **not** publish metadata.

## Integration publishing contract

> **This rule applies globally to every integration-published point across all
> objectTypes.**

BMS publishes metadata for every monitored point — including points whose *values* are written by external integrations. For such points the metadata payload contains an `integration` field identifying which integration owns that point's value.

| Metadata field | Type   | Meaning                                                                  |
| :------------- | :----- | :----------------------------------------------------------------------- |
| `integration`  | string | Identifier of the integration that must publish the value for this point |

### Topic derivation rule

The value topic is derived **methodically** from the respective metadata topic (published by BMS) that carried the `integration` field. DSX Exchange Access Control Lists will typically be created so that MQTT Clients are provided access to publish and subscribe to specific namespaces that align with the `[Publisher]`:

BMS/v1/**\[Publisher]/\[TopicType]**/\{objectType}/\{pointType}/\{tagPath}

| Segment   | Metadata topic                       | Value topic                              |
| :-------- | :----------------------------------- | :--------------------------------------- |
| Publisher | `PUB`                                | value of `integration` field in metadata |
| TopicType | `Metadata`                           | `Value`                                  |
| Remainder | `{objectType}/{pointType}/{tagPath}` | `{objectType}/{pointType}/{tagPath}`     |

In other words, the Publisher integration will derive the following value topic to publish based on the corresponding BMS metadata:

```text
BMS/v1/PUB/Metadata/{objectType}/{pointType}/{tagPath}
        ↓  replace PUB → {integration},  Metadata → Value
BMS/v1/{integration}/Value/{objectType}/{pointType}/{tagPath}
```

### Contract

When an integration receives a BMS metadata message and the `integration` field **matches its own identifier**, the integration **MUST**:

1. Note the full metadata topic it arrived on.
2. Derive the value topic by substituting `PUB` → own identifier and `Metadata` → `Value`, keeping `{objectType}/{pointType}/{tagPath}` unchanged.
3. Publish value messages to that derived topic.

Integrations **MUST NOT**:

* Publish values for points whose metadata `integration` field does not match their own identifier.

* Publish metadata (BMS is the sole metadata publisher).

### Example flow

```text
BMS publishes metadata →
  Topic:   BMS/v1/PUB/Metadata/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
  Payload: { ..., "integration": "MEPAI", ... }

Integration "MEPAI" receives the metadata, recognises its identifier,
derives its value topic →
  BMS/v1/PUB/Metadata/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
          ↓ PUB→MEPAI, Metadata→Value
  BMS/v1/MEPAI/Value/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
```

MEPAI publishes its setpoint reading to that derived topic.

The same contract governs all other integration-published points, including `Rack/RackLeakDetectTray`, `Rack/RackLiquidIsolationRequest`, `Rack/RackElectricalIsolationRequest`, `System/HeartbeatTimestampIntegration`, `System/HeartbeatEchoIntegration`, `CDU/LiquidTemperatureSpRequest`, and any future integration-owned pointTypes.

## Metadata types and concepts

* **objectType**: Object Types are restricted to specific strings in accordance with this AsyncAPI. They typically represent BMS equipment or devices.

  * **System**: A System can be the BMS or an Integration to the BMS. Heartbeat points and system-to-system communication point types are typically defined inside of a System object type. System Heartbeat point types are expected to operate as follows. An integration may choose to use the Echo points or not.

    All four heartbeat pointTypes require `objectName` and `objectId` in metadata to identify which System the heartbeat belongs to. By convention, an integration's `objectId` matches the same string used as its `integration` metadata field on its other points (so MEPAI1's System object has `objectId: "MEPAI1"`).

    * **HeartbeatTimestampBms** — Publisher: BMS. The BMS publishes its own timestamp every 10 seconds. One instance globally. `objectId` identifies the BMS (e.g., `"BMS"`). `integration` field: not used.

    * **HeartbeatTimestampIntegration** — Publisher: Integration. Each integration publishes its own timestamp every 10 seconds, one per integration. `objectId` identifies the integration publishing (e.g., `"MEPAI1"`). `integration` field: required (drives topic).

    * **HeartbeatEchoBms** — Publisher: BMS. The BMS reads each integration's `HeartbeatTimestampIntegration` value and re-publishes it on this point type, allowing each integration to confirm round-trip. One instance per connected integration. `objectId` identifies the integration whose timestamp is being echoed (e.g., `"MEPAI1"`). `integration` field: not used.

    * **HeartbeatEchoIntegration** — Publisher: Integration. Each integration reads the BMS's `HeartbeatTimestampBms` value and re-publishes it on this point type, allowing the BMS to confirm round-trip with that integration. One per connected integration. `objectId` identifies the BMS being echoed (e.g., `"BMS"`). `integration` field: required (drives topic).

    Naming convention: the `Bms`/`Integration` suffix indicates the publisher of the point. The party whose timestamp is being echoed is encoded in `objectId`, not in the point name.

  * **Rack**: A Rack is a special object type and has specific point types that can only be used with a Rack object type. Many integrations and MQTT Clients will only ingest data from the Rack object type. Other integrations will consider Rack data as the most important or interesting data in the AI Factory. Mechanical and Electrical design (and therefore BMS Data) at the rack is also more standardized than mechanical and electrical systems as you move out of the white space and to the gray space of the AI Factory. For these reasons, the point types associated with a Rack object type are generally more specific than any other object type, making ingesting and understanding rack data more straight-forward.

  * **PowerMeter**: A PowerMeter is a special object type and has specific point types that can only be used with a PowerMeter object type. PowerMeter point types contain the metadata needed to understand electrical power path. This data is used by integrations / MQTT Clients for power management strategies.

  * **Electrical Equipment**: This is a general category, and several object types exist in this AsyncAPI for electrical equipment. Electrical equipment point types typically use metadata to associate the object / equipment with a power meter to show where the equipment lands in the power path.

  * **Mechanical Equipment**: This is a general category, and several object types exist in this AsyncAPI for mechanical equipment.

  * **GenericObject**: This object type is reserved and should not be used unless no other object type is applicable.

* **pointType**: Point Types are restricted to specific strings in accordance with this AsyncAPI. Point types are also restricted to specific object types. Some point types apply to multiple object types while others are restricted to specific object types.

* **engUnit**: Engineering Units describe the units of measure for the point / topic. If engineering units are used, then state text does not apply.

* **stateText**: State Text describes what a binary or integer value means. Each binary or integer value will have a state text identified. If state text is used, then engineering units do not apply.

* **rackLocationName**: This is the human readable name given to a rack location.

* **rackLocationId**: This is the unique identifier for a rack location. It can be the same as the rackLocationName if human readable and unique. This must allow the IT side integrations and OT side BMS to associate a point with the same physical rack (same identifier on both systems).

* **objectName**: This is the human readable name given to the object.

* **objectId**: This is the unique identifier for an object. It can be the same as the objectName if human readable and unique.

* **associateId**: This will list the objectId of an associated object. The intent is for this object to be considered part of the other object, especially for `servesId` metadata. Commonly used to prevent parallel power paths (parallel "serves" relationships) when electrical equipment objects need to be associated with power meters. Also applicable to mechanical equipment object types to prevent liquid and air flow parallel paths where not intended.

* **servesId**: This will list the objectId of the object that is served by this object. Creates a one-way relationship. Typically used to indicate electrical power path or liquid/air fluid flow path towards the rack.

* **processArea**: This is used to provide more information on the point location or purpose. In general, process area metadata should be used, in conjunction with other metadata, to make points unique and allow integrations / MQTT Clients to clearly understand what a point represents in the AI factory. Example: for a CDU object type and LiquidTemperature point type, the process area metadata could include `"Secondary"` and `"Supply"`. This would make it clear that the temperature sensor was located on the secondary side of the CDU and on the supply line.

* **phase**: This is used to identify which phase, of a 3-phase electrical system, the point is associated with.

* **isSetpoint**: This can be set to `true` (unquoted, lowercase) to indicate that a point is a setpoint rather than a sensor reading. A setpoint is a target or ideal value that a system is trying to maintain a process variable at.

* **scope**: Scope is used for System heartbeat points. If the BMS has multiple MQTT Clients connected to DSX Exchange, each could be publishing different data to the MQTT Broker. In this case each MQTT Client should have separate heartbeat points. Scope can be used in this case to identify what MQTT Topics / Namespace the heartbeat point is associated with — and thereby what topics are impacted when a heartbeat is lost.

* **integration**: Integration metadata is used to indicate which integration a point is associated with. It also indicates the namespace `[Publisher]` an integration is required to write the corresponding value back to.

## Raw AsyncAPI Spec

````yaml
# Copyright 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

asyncapi: 3.1.0

info:
  title: BMS Event Bus
  version: 1.0.0
  description: |
    Telemetry and control event catalog for the Building Management System (BMS)
    over MQTT. Provides real-time point values and point metadata for all supported
    object and point types.

    ## How to use this spec

    Each monitored point follows a **Value / Metadata** pattern:

    - **Value** messages carry the live reading (`value`, `timestamp`, `quality`).

      Subscribe to a value channel to receive real-time telemetry. Values are published whenever they change and republished every 100 seconds when they do not change.

    - **Metadata** messages describe the point (units, identifiers, relationships).

      **Always receive metadata before interpreting values.** Metadata is retained and published once at startup. It is subsequently published every 100 seconds.

    ## Topic structure

    | Publisher   | Topic Type | Pattern                                                          |
    | :---------- | :--------- | :--------------------------------------------------------------- |
    | BMS         | Value      | `BMS/v1/PUB/Value/{objectType}/{pointType}/{tagPath}`            |
    | BMS         | Metadata   | `BMS/v1/PUB/Metadata/{objectType}/{pointType}/{tagPath}`         |
    | Integration | Value      | `BMS/v1/{integration}/Value/{objectType}/{pointType}/{tagPath}`  |

    The `{tagPath}` is a vendor-defined hierarchical path and may contain multiple `/` segments. Each `{tagPath}` must be unique for each point and is usually derived from the BMS system based on the BMS point name.

    Use `#` to subscribe to all topics under a given hierarchy (multi-level wildcard).

    Use `+` to match exactly one topic level (single-level wildcard).

    ## Publisher rules

    - **BMS** publishes all metadata — including for points whose values are written by integrations.

    - **BMS** publishes its own point values on `BMS/v1/PUB/Value/...`.

    - **Integrations** are any system (MQTT Client) external to the BMS. Whenever they need to directly send messages to the BMS, they publish values on `BMS/v1/{integration}/Value/...`. Integrations do **not** publish metadata.

    ## Integration publishing contract

    > **This rule applies globally to every integration-published point across all
    > objectTypes.**

    BMS publishes metadata for every monitored point — including points whose _values_ are written by external integrations. For such points the metadata payload contains an `integration` field identifying which integration owns that point's value.

    | Metadata field | Type | Meaning |
    | :------------- | :--- | :------ |
    | `integration` | string | Identifier of the integration that must publish the value for this point |

    ### Topic derivation rule

    The value topic is derived **methodically** from the respective metadata topic (published by BMS) that carried the `integration` field. DSX Exchange Access Control Lists will typically be created so that MQTT Clients are provided access to publish and subscribe to specific namespaces that align with the `[Publisher]`:

     BMS/v1/**[Publisher]/[TopicType]**/{objectType}/{pointType}/{tagPath}

    | Segment | Metadata topic | Value topic |
    | :------ | :------------- | :---------- |
    | Publisher | `PUB` | value of `integration` field in metadata |
    | TopicType | `Metadata` | `Value` |
    | Remainder | `{objectType}/{pointType}/{tagPath}` | `{objectType}/{pointType}/{tagPath}` |

    In other words, the Publisher integration will derive the following value topic to publish based on the corresponding BMS metadata:

    ```text
    BMS/v1/PUB/Metadata/\{objectType\}/\{pointType\}/\{tagPath\}
            ↓  replace PUB → \{integration\},  Metadata → Value
    BMS/v1/\{integration\}/Value/\{objectType\}/\{pointType\}/\{tagPath\}
    ```

    ### Contract

    When an integration receives a BMS metadata message and the `integration` field **matches its own identifier**, the integration **MUST**:

    1. Note the full metadata topic it arrived on.
    2. Derive the value topic by substituting `PUB` → own identifier and `Metadata` → `Value`, keeping `{objectType}/{pointType}/{tagPath}` unchanged.
    3. Publish value messages to that derived topic.

    Integrations **MUST NOT**:

    - Publish values for points whose metadata `integration` field does not match their own identifier.

    - Publish metadata (BMS is the sole metadata publisher).

    ### Example flow

    ```text
    BMS publishes metadata →
      Topic:   BMS/v1/PUB/Metadata/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
      Payload: \{ ..., "integration": "MEPAI", ... \}

    Integration "MEPAI" receives the metadata, recognises its identifier,
    derives its value topic →
      BMS/v1/PUB/Metadata/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
              ↓ PUB→MEPAI, Metadata→Value
      BMS/v1/MEPAI/Value/CDU/LiquidTemperatureSpRequest/site1/row3/cdu5
    ```

    MEPAI publishes its setpoint reading to that derived topic.

    The same contract governs all other integration-published points, including `Rack/RackLeakDetectTray`, `Rack/RackLiquidIsolationRequest`, `Rack/RackElectricalIsolationRequest`, `System/HeartbeatTimestampIntegration`, `System/HeartbeatEchoIntegration`, `CDU/LiquidTemperatureSpRequest`, and any future integration-owned pointTypes.

    ## Metadata types and concepts

    - **objectType**: Object Types are restricted to specific strings in accordance with this AsyncAPI. They typically represent BMS equipment or devices.

      - **System**: A System can be the BMS or an Integration to the BMS. Heartbeat points and system-to-system communication point types are typically defined inside of a System object type. System Heartbeat point types are expected to operate as follows. An integration may choose to use the Echo points or not.

        All four heartbeat pointTypes require `objectName` and `objectId` in metadata to identify which System the heartbeat belongs to. By convention, an integration's `objectId` matches the same string used as its `integration` metadata field on its other points (so MEPAI1's System object has `objectId: "MEPAI1"`).

        - **HeartbeatTimestampBms** — Publisher: BMS. The BMS publishes its own timestamp every 10 seconds. One instance globally. `objectId` identifies the BMS (e.g., `"BMS"`). `integration` field: not used.

        - **HeartbeatTimestampIntegration** — Publisher: Integration. Each integration publishes its own timestamp every 10 seconds, one per integration. `objectId` identifies the integration publishing (e.g., `"MEPAI1"`). `integration` field: required (drives topic).

        - **HeartbeatEchoBms** — Publisher: BMS. The BMS reads each integration's `HeartbeatTimestampIntegration` value and re-publishes it on this point type, allowing each integration to confirm round-trip. One instance per connected integration. `objectId` identifies the integration whose timestamp is being echoed (e.g., `"MEPAI1"`). `integration` field: not used.

        - **HeartbeatEchoIntegration** — Publisher: Integration. Each integration reads the BMS's `HeartbeatTimestampBms` value and re-publishes it on this point type, allowing the BMS to confirm round-trip with that integration. One per connected integration. `objectId` identifies the BMS being echoed (e.g., `"BMS"`). `integration` field: required (drives topic).

        Naming convention: the `Bms`/`Integration` suffix indicates the publisher of the point. The party whose timestamp is being echoed is encoded in `objectId`, not in the point name.

      - **Rack**: A Rack is a special object type and has specific point types that can only be used with a Rack object type. Many integrations and MQTT Clients will only ingest data from the Rack object type. Other integrations will consider Rack data as the most important or interesting data in the AI Factory. Mechanical and Electrical design (and therefore BMS Data) at the rack is also more standardized than mechanical and electrical systems as you move out of the white space and to the gray space of the AI Factory. For these reasons, the point types associated with a Rack object type are generally more specific than any other object type, making ingesting and understanding rack data more straight-forward.

      - **PowerMeter**: A PowerMeter is a special object type and has specific point types that can only be used with a PowerMeter object type. PowerMeter point types contain the metadata needed to understand electrical power path. This data is used by integrations / MQTT Clients for power management strategies.

      - **Electrical Equipment**: This is a general category, and several object types exist in this AsyncAPI for electrical equipment. Electrical equipment point types typically use metadata to associate the object / equipment with a power meter to show where the equipment lands in the power path.

      - **Mechanical Equipment**: This is a general category, and several object types exist in this AsyncAPI for mechanical equipment.

      - **GenericObject**: This object type is reserved and should not be used unless no other object type is applicable.

    - **pointType**: Point Types are restricted to specific strings in accordance with this AsyncAPI. Point types are also restricted to specific object types. Some point types apply to multiple object types while others are restricted to specific object types.

    - **engUnit**: Engineering Units describe the units of measure for the point / topic. If engineering units are used, then state text does not apply.

    - **stateText**: State Text describes what a binary or integer value means. Each binary or integer value will have a state text identified. If state text is used, then engineering units do not apply.

    - **rackLocationName**: This is the human readable name given to a rack location.

    - **rackLocationId**: This is the unique identifier for a rack location. It can be the same as the rackLocationName if human readable and unique. This must allow the IT side integrations and OT side BMS to associate a point with the same physical rack (same identifier on both systems).

    - **objectName**: This is the human readable name given to the object.

    - **objectId**: This is the unique identifier for an object. It can be the same as the objectName if human readable and unique.

    - **associateId**: This will list the objectId of an associated object. The intent is for this object to be considered part of the other object, especially for `servesId` metadata. Commonly used to prevent parallel power paths (parallel "serves" relationships) when electrical equipment objects need to be associated with power meters. Also applicable to mechanical equipment object types to prevent liquid and air flow parallel paths where not intended.

    - **servesId**: This will list the objectId of the object that is served by this object. Creates a one-way relationship. Typically used to indicate electrical power path or liquid/air fluid flow path towards the rack.

    - **processArea**: This is used to provide more information on the point location or purpose. In general, process area metadata should be used, in conjunction with other metadata, to make points unique and allow integrations / MQTT Clients to clearly understand what a point represents in the AI factory. Example: for a CDU object type and LiquidTemperature point type, the process area metadata could include `"Secondary"` and `"Supply"`. This would make it clear that the temperature sensor was located on the secondary side of the CDU and on the supply line.

    - **phase**: This is used to identify which phase, of a 3-phase electrical system, the point is associated with.

    - **isSetpoint**: This can be set to `true` (unquoted, lowercase) to indicate that a point is a setpoint rather than a sensor reading. A setpoint is a target or ideal value that a system is trying to maintain a process variable at.

    - **scope**: Scope is used for System heartbeat points. If the BMS has multiple MQTT Clients connected to DSX Exchange, each could be publishing different data to the MQTT Broker. In this case each MQTT Client should have separate heartbeat points. Scope can be used in this case to identify what MQTT Topics / Namespace the heartbeat point is associated with — and thereby what topics are impacted when a heartbeat is lost.

    - **integration**: Integration metadata is used to indicate which integration a point is associated with. It also indicates the namespace `[Publisher]` an integration is required to write the corresponding value back to.

# =============================================================================
# Servers
# =============================================================================

# servers:
#   production:
#     host: broker.example.com
#     protocol: mqtt
#     description: MQTT broker for BMS telemetry and control

# =============================================================================
# Channels
# =============================================================================

channels:

  # ---------------------------------------------------------------------------
  # Rack
  # ---------------------------------------------------------------------------

  rackBmsValue:
    address: 'BMS/v1/PUB/Value/Rack/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for all Rack monitoring points.

      **MQTT wildcard examples**

      - All rack values: `BMS/v1/PUB/Value/Rack/#`
    parameters:
      pointType:
        enum:
          - RackLiquidSupplyTemperature
          - RackLiquidReturnTemperature
          - RackLiquidFlow
          - RackLiquidDifferentialPressure
          - RackLiquidDifferentialPressureSp
          - RackControlValvePosition
          - RackPower
          - RackLeakDetect
          - RackLeakSensorFault
          - RackLiquidIsolationStatus
          - RackElectricalIsolationStatus
        description: BMS-published Rack point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  rackMetadata:
    address: 'BMS/v1/PUB/Metadata/Rack/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for all Rack points.
      Includes integration-owned points which carries the `integration` field.

      **MQTT wildcard examples**

      - All rack metadata: `BMS/v1/PUB/Metadata/Rack/#`
    parameters:
      pointType:
        enum:
          - RackLiquidSupplyTemperature
          - RackLiquidReturnTemperature
          - RackLiquidFlow
          - RackLiquidDifferentialPressure
          - RackLiquidDifferentialPressureSp
          - RackControlValvePosition
          - RackPower
          - RackLeakDetect
          - RackLeakSensorFault
          - RackLeakDetectTray
          - RackLiquidIsolationStatus
          - RackElectricalIsolationStatus
          - RackLiquidIsolationRequest
          - RackElectricalIsolationRequest
        description: Rack point type.
      tagPath:
        description: Must match the tagPath of the corresponding value topic exactly.
    messages:
      rackLiquidSupplyTemperature:
        $ref: '#/components/messages/RackLiquidSupplyTemperatureMsg'
      rackLiquidReturnTemperature:
        $ref: '#/components/messages/RackLiquidReturnTemperatureMsg'
      rackLiquidFlow:
        $ref: '#/components/messages/RackLiquidFlowMsg'
      rackLiquidDifferentialPressure:
        $ref: '#/components/messages/RackLiquidDifferentialPressureMsg'
      rackLiquidDifferentialPressureSp:
        $ref: '#/components/messages/RackLiquidDifferentialPressureSpMsg'
      rackControlValvePosition:
        $ref: '#/components/messages/RackControlValvePositionMsg'
      rackPower:
        $ref: '#/components/messages/RackPowerMsg'
      rackLeakDetect:
        $ref: '#/components/messages/RackLeakDetectMsg'
      rackLeakSensorFault:
        $ref: '#/components/messages/RackLeakSensorFaultMsg'
      rackLeakDetectTray:
        $ref: '#/components/messages/RackLeakDetectTrayMsg'
      rackLiquidIsolationStatus:
        $ref: '#/components/messages/RackLiquidIsolationStatusMsg'
      rackElectricalIsolationStatus:
        $ref: '#/components/messages/RackElectricalIsolationStatusMsg'
      rackLiquidIsolationRequest:
        $ref: '#/components/messages/RackLiquidIsolationRequestMsg'
      rackElectricalIsolationRequest:
        $ref: '#/components/messages/RackElectricalIsolationRequestMsg'

  rackIntegrationValue:
    address: 'BMS/v1/{integration}/Value/Rack/{pointType}/{tagPath}'
    description: |
      Values published by integrations for Rack control points.

      **MQTT wildcard examples**

      - All integration rack values: `BMS/v1/+/Value/Rack/#`
    parameters:
      integration:
        description: Integration identifier.
      pointType:
        enum:
          - RackLeakDetectTray
          - RackLiquidIsolationRequest
          - RackElectricalIsolationRequest
        description: Integration-published Rack point type.
      tagPath:
        description: Must match the tagPath from the corresponding BMS metadata exactly.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  # ---------------------------------------------------------------------------
  # PowerMeter
  # ---------------------------------------------------------------------------

  powerMeterValue:
    address: 'BMS/v1/PUB/Value/PowerMeter/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for all PowerMeter points.

      **MQTT wildcard examples**

      - All power meter values: `BMS/v1/PUB/Value/PowerMeter/#`
    parameters:
      pointType:
        enum:
          - Voltage
          - PowerFactor
          - Frequency
          - ApparentPower
          - ActivePower
          - Current
          - CurrentLimit
          - PhaseCurrent
          - GenericPoint
        description: PowerMeter point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  powerMeterMetadata:
    address: 'BMS/v1/PUB/Metadata/PowerMeter/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for all PowerMeter points.

      **MQTT wildcard examples**

      - All power meter metadata: `BMS/v1/PUB/Metadata/PowerMeter/#`
    parameters:
      pointType:
        enum:
          - Voltage
          - PowerFactor
          - Frequency
          - ApparentPower
          - ActivePower
          - Current
          - CurrentLimit
          - PhaseCurrent
          - GenericPoint
        description: PowerMeter point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      voltage:
        $ref: '#/components/messages/PowerMeterVoltageMsg'
      powerFactor:
        $ref: '#/components/messages/PowerMeterPowerFactorMsg'
      frequency:
        $ref: '#/components/messages/PowerMeterFrequencyMsg'
      apparentPower:
        $ref: '#/components/messages/PowerMeterApparentPowerMsg'
      activePower:
        $ref: '#/components/messages/PowerMeterActivePowerMsg'
      current:
        $ref: '#/components/messages/PowerMeterCurrentMsg'
      currentLimit:
        $ref: '#/components/messages/PowerMeterCurrentLimitMsg'
      genericPoint:
        $ref: '#/components/messages/GenericPowerMeterPointMsg'
      phaseCurrent:
        $ref: '#/components/messages/PowerMeterPhaseCurrentMsg'

  # ---------------------------------------------------------------------------
  # BESS
  # ---------------------------------------------------------------------------

  bessValue:
    address: 'BMS/v1/PUB/Value/BESS/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for BESS points.
      Extensible: additional vendor-specific pointTypes may be present.

      **MQTT wildcard examples**

      - All BESS values: `BMS/v1/PUB/Value/BESS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published BESS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  bessMetadata:
    address: 'BMS/v1/PUB/Metadata/BESS/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for BESS points.

      **MQTT wildcard examples**

      - All BESS metadata: `BMS/v1/PUB/Metadata/BESS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BESS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/BESSStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/BESSAvailableMsg'

  # ---------------------------------------------------------------------------
  # UPS
  # ---------------------------------------------------------------------------

  upsValue:
    address: 'BMS/v1/PUB/Value/UPS/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for UPS points.
      Extensible: additional vendor-specific pointTypes may be present.

      **MQTT wildcard examples**

      - All UPS values: `BMS/v1/PUB/Value/UPS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published UPS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  upsMetadata:
    address: 'BMS/v1/PUB/Metadata/UPS/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for UPS points.

      **MQTT wildcard examples**

      - All UPS metadata: `BMS/v1/PUB/Metadata/UPS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: UPS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/UPSStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/UPSAvailableMsg'

  # ---------------------------------------------------------------------------
  # ATS
  # ---------------------------------------------------------------------------

  atsValue:
    address: 'BMS/v1/PUB/Value/ATS/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for ATS points.
      Extensible: additional vendor-specific pointTypes may be present.

      **MQTT wildcard examples**

      - All ATS values: `BMS/v1/PUB/Value/ATS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published ATS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  atsMetadata:
    address: 'BMS/v1/PUB/Metadata/ATS/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for ATS points.

      **MQTT wildcard examples**

      - All ATS metadata: `BMS/v1/PUB/Metadata/ATS/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: ATS point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/ATSStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/ATSAvailableMsg'

  # ---------------------------------------------------------------------------
  # Generator
  # ---------------------------------------------------------------------------

  generatorValue:
    address: 'BMS/v1/PUB/Value/Generator/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Generator points.
      Extensible: additional vendor-specific pointTypes may be present.

      **MQTT wildcard examples**

      - All Generator values: `BMS/v1/PUB/Value/Generator/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published Generator point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  generatorMetadata:
    address: 'BMS/v1/PUB/Metadata/Generator/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Generator points.

      **MQTT wildcard examples**

      - All Generator metadata: `BMS/v1/PUB/Metadata/Generator/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: Generator point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/GeneratorStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/GeneratorAvailableMsg'

  # ---------------------------------------------------------------------------
  # Shunt
  # ---------------------------------------------------------------------------

  shuntValue:
    address: 'BMS/v1/PUB/Value/Shunt/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Shunt points.

      **MQTT wildcard examples**

      - All Shunt values: `BMS/v1/PUB/Value/Shunt/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published Shunt point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  shuntMetadata:
    address: 'BMS/v1/PUB/Metadata/Shunt/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Shunt points.

      **MQTT wildcard examples**

      - All Shunt metadata: `BMS/v1/PUB/Metadata/Shunt/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: Shunt point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/ShuntStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/ShuntAvailableMsg'

  # ---------------------------------------------------------------------------
  # Breaker
  # ---------------------------------------------------------------------------

  breakerValue:
    address: 'BMS/v1/PUB/Value/Breaker/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Breaker points.

      **MQTT wildcard examples**

      - All Breaker values: `BMS/v1/PUB/Value/Breaker/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: BMS-published Breaker point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  breakerMetadata:
    address: 'BMS/v1/PUB/Metadata/Breaker/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Breaker points.

      **MQTT wildcard examples**

      - All Breaker metadata: `BMS/v1/PUB/Metadata/Breaker/#`
    parameters:
      pointType:
        enum:
          - Status
          - Available
          - GenericPoint
        description: Breaker point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      status:
        $ref: '#/components/messages/BreakerStatusMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      available:
        $ref: '#/components/messages/BreakerAvailableMsg'

  # ---------------------------------------------------------------------------
  # CDU
  # ---------------------------------------------------------------------------

  cduValue:
    address: 'BMS/v1/PUB/Value/CDU/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for CDU points.

      **MQTT wildcard examples**

      - All CDU values: `BMS/v1/PUB/Value/CDU/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published CDU point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  cduMetadata:
    address: 'BMS/v1/PUB/Metadata/CDU/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for CDU points.
      Includes integration-owned points which carries the `integration` field.

      **MQTT wildcard examples**

      - All CDU metadata: `BMS/v1/PUB/Metadata/CDU/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - LiquidTemperatureSpRequest
          - GenericPoint
        description: CDU point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/CDULiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/CDULiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/CDULiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/CDULiquidPressureMsg'
      status:
        $ref: '#/components/messages/CDUStatusMsg'
      available:
        $ref: '#/components/messages/CDUAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/CDUValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/CDUPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/CDUFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/CDUDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/CDUAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/CDUAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/CDUAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/CDUAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/CDUAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/CDULeakDetectMsg'
      liquidTemperatureSpRequest:
        $ref: '#/components/messages/LiquidTemperatureSpRequestMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  cduIntegrationValue:
    address: 'BMS/v1/{integration}/Value/CDU/{pointType}/{tagPath}'
    description: |
      Values published by integrations for CDU control points.
      Subscribe to `cduMetadata` first and read `integration` for the exact topic.

      **MQTT wildcard examples**

      - All integration CDU values: `BMS/v1/+/Value/CDU/#`
    parameters:
      integration:
        description: Integration identifier.
      pointType:
        enum:
          - LiquidTemperatureSpRequest
        description: Integration-published CDU point type.
      tagPath:
        description: Must match the tagPath from the corresponding BMS metadata exactly.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  # ---------------------------------------------------------------------------
  # CoolingTower
  # ---------------------------------------------------------------------------

  coolingTowerValue:
    address: 'BMS/v1/PUB/Value/CoolingTower/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for CoolingTower points.

      **MQTT wildcard examples**

      - All CoolingTower values: `BMS/v1/PUB/Value/CoolingTower/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published CoolingTower point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  coolingTowerMetadata:
    address: 'BMS/v1/PUB/Metadata/CoolingTower/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for CoolingTower points.

      **MQTT wildcard examples**

      - All CoolingTower metadata: `BMS/v1/PUB/Metadata/CoolingTower/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: CoolingTower point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/CoolingTowerLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/CoolingTowerLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/CoolingTowerLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/CoolingTowerLiquidPressureMsg'
      status:
        $ref: '#/components/messages/CoolingTowerStatusMsg'
      available:
        $ref: '#/components/messages/CoolingTowerAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/CoolingTowerValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/CoolingTowerPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/CoolingTowerFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/CoolingTowerDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/CoolingTowerAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/CoolingTowerAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/CoolingTowerAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/CoolingTowerAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/CoolingTowerAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/CoolingTowerLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # HX
  # ---------------------------------------------------------------------------

  hxValue:
    address: 'BMS/v1/PUB/Value/HX/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for HX points.

      **MQTT wildcard examples**

      - All HX values: `BMS/v1/PUB/Value/HX/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published HX point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  hxMetadata:
    address: 'BMS/v1/PUB/Metadata/HX/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for HX points.

      **MQTT wildcard examples**

      - All HX metadata: `BMS/v1/PUB/Metadata/HX/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: HX point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/HXLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/HXLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/HXLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/HXLiquidPressureMsg'
      status:
        $ref: '#/components/messages/HXStatusMsg'
      available:
        $ref: '#/components/messages/HXAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/HXValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/HXPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/HXFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/HXDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/HXAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/HXAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/HXAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/HXAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/HXAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/HXLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # CRAH
  # ---------------------------------------------------------------------------

  crahValue:
    address: 'BMS/v1/PUB/Value/CRAH/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for CRAH points.

      **MQTT wildcard examples**

      - All CRAH values: `BMS/v1/PUB/Value/CRAH/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published CRAH point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  crahMetadata:
    address: 'BMS/v1/PUB/Metadata/CRAH/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for CRAH points.

      **MQTT wildcard examples**

      - All CRAH metadata: `BMS/v1/PUB/Metadata/CRAH/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: CRAH point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/CRAHLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/CRAHLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/CRAHLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/CRAHLiquidPressureMsg'
      status:
        $ref: '#/components/messages/CRAHStatusMsg'
      available:
        $ref: '#/components/messages/CRAHAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/CRAHValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/CRAHPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/CRAHFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/CRAHDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/CRAHAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/CRAHAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/CRAHAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/CRAHAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/CRAHAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/CRAHLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # CRAC
  # ---------------------------------------------------------------------------

  cracValue:
    address: 'BMS/v1/PUB/Value/CRAC/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for CRAC points.

      **MQTT wildcard examples**

      - All CRAC values: `BMS/v1/PUB/Value/CRAC/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published CRAC point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  cracMetadata:
    address: 'BMS/v1/PUB/Metadata/CRAC/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for CRAC points.

      **MQTT wildcard examples**

      - All CRAC metadata: `BMS/v1/PUB/Metadata/CRAC/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: CRAC point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/CRACLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/CRACLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/CRACLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/CRACLiquidPressureMsg'
      status:
        $ref: '#/components/messages/CRACStatusMsg'
      available:
        $ref: '#/components/messages/CRACAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/CRACValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/CRACPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/CRACFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/CRACDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/CRACAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/CRACAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/CRACAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/CRACAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/CRACAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/CRACLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # AHU
  # ---------------------------------------------------------------------------

  ahuValue:
    address: 'BMS/v1/PUB/Value/AHU/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for AHU points.

      **MQTT wildcard examples**

      - All AHU values: `BMS/v1/PUB/Value/AHU/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published AHU point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  ahuMetadata:
    address: 'BMS/v1/PUB/Metadata/AHU/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for AHU points.

      **MQTT wildcard examples**

      - All AHU metadata: `BMS/v1/PUB/Metadata/AHU/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: AHU point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/AHULiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/AHULiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/AHULiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/AHULiquidPressureMsg'
      status:
        $ref: '#/components/messages/AHUStatusMsg'
      available:
        $ref: '#/components/messages/AHUAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/AHUValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/AHUPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/AHUFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/AHUDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/AHUAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/AHUAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/AHUAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/AHUAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/AHUAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/AHULeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Chiller
  # ---------------------------------------------------------------------------

  chillerValue:
    address: 'BMS/v1/PUB/Value/Chiller/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Chiller points.

      **MQTT wildcard examples**

      - All Chiller values: `BMS/v1/PUB/Value/Chiller/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published Chiller point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  chillerMetadata:
    address: 'BMS/v1/PUB/Metadata/Chiller/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Chiller points.

      **MQTT wildcard examples**

      - All Chiller metadata: `BMS/v1/PUB/Metadata/Chiller/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: Chiller point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/ChillerLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/ChillerLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/ChillerLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/ChillerLiquidPressureMsg'
      status:
        $ref: '#/components/messages/ChillerStatusMsg'
      available:
        $ref: '#/components/messages/ChillerAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/ChillerValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/ChillerPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/ChillerFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/ChillerDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/ChillerAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/ChillerAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/ChillerAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/ChillerAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/ChillerAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/ChillerLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Valve
  # ---------------------------------------------------------------------------

  valveValue:
    address: 'BMS/v1/PUB/Value/Valve/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Valve points.

      **MQTT wildcard examples**

      - All Valve values: `BMS/v1/PUB/Value/Valve/#`
    parameters:
      pointType:
        enum:
          - ValvePosition
          - Available
          - GenericPoint
        description: BMS-published Valve point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  valveMetadata:
    address: 'BMS/v1/PUB/Metadata/Valve/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Valve points.

      **MQTT wildcard examples**

      - All Valve metadata: `BMS/v1/PUB/Metadata/Valve/#`
    parameters:
      pointType:
        enum:
          - ValvePosition
          - Available
          - GenericPoint
        description: Valve point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valvePosition:
        $ref: '#/components/messages/ValveValvePositionMsg'
      available:
        $ref: '#/components/messages/ValveAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Pump
  # ---------------------------------------------------------------------------

  pumpValue:
    address: 'BMS/v1/PUB/Value/Pump/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Pump points.

      **MQTT wildcard examples**

      - All Pump values: `BMS/v1/PUB/Value/Pump/#`
    parameters:
      pointType:
        enum:
          - PumpSpeed
          - Available
          - GenericPoint
        description: BMS-published Pump point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  pumpMetadata:
    address: 'BMS/v1/PUB/Metadata/Pump/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Pump points.

      **MQTT wildcard examples**

      - All Pump metadata: `BMS/v1/PUB/Metadata/Pump/#`
    parameters:
      pointType:
        enum:
          - PumpSpeed
          - Available
          - GenericPoint
        description: Pump point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      pumpSpeed:
        $ref: '#/components/messages/PumpPumpSpeedMsg'
      available:
        $ref: '#/components/messages/PumpAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Fan
  # ---------------------------------------------------------------------------

  fanValue:
    address: 'BMS/v1/PUB/Value/Fan/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Fan points.

      **MQTT wildcard examples**

      - All Fan values: `BMS/v1/PUB/Value/Fan/#`
    parameters:
      pointType:
        enum:
          - FanSpeed
          - Available
          - GenericPoint
        description: BMS-published Fan point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  fanMetadata:
    address: 'BMS/v1/PUB/Metadata/Fan/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Fan points.

      **MQTT wildcard examples**

      - All Fan metadata: `BMS/v1/PUB/Metadata/Fan/#`
    parameters:
      pointType:
        enum:
          - FanSpeed
          - Available
          - GenericPoint
        description: Fan point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      fanSpeed:
        $ref: '#/components/messages/FanFanSpeedMsg'
      available:
        $ref: '#/components/messages/FanAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Damper
  # ---------------------------------------------------------------------------

  damperValue:
    address: 'BMS/v1/PUB/Value/Damper/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Damper points.

      **MQTT wildcard examples**

      - All Damper values: `BMS/v1/PUB/Value/Damper/#`
    parameters:
      pointType:
        enum:
          - DamperPosition
          - Available
          - GenericPoint
        description: BMS-published Damper point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  damperMetadata:
    address: 'BMS/v1/PUB/Metadata/Damper/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Damper points.

      **MQTT wildcard examples**

      - All Damper metadata: `BMS/v1/PUB/Metadata/Damper/#`
    parameters:
      pointType:
        enum:
          - DamperPosition
          - Available
          - GenericPoint
        description: Damper point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      damperPosition:
        $ref: '#/components/messages/DamperDamperPositionMsg'
      available:
        $ref: '#/components/messages/DamperAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # Sensor
  # ---------------------------------------------------------------------------

  sensorValue:
    address: 'BMS/v1/PUB/Value/Sensor/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Sensor points.

      **MQTT wildcard examples**

      - All Sensor values: `BMS/v1/PUB/Value/Sensor/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - Sound
          - Available
          - GenericPoint
        description: BMS-published Sensor point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  sensorMetadata:
    address: 'BMS/v1/PUB/Metadata/Sensor/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Sensor points.

      **MQTT wildcard examples**

      - All Sensor metadata: `BMS/v1/PUB/Metadata/Sensor/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - Sound
          - Available
          - GenericPoint
        description: Sensor point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/SensorLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/SensorLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/SensorLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/SensorLiquidPressureMsg'
      airTemperature:
        $ref: '#/components/messages/SensorAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/SensorAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/SensorAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/SensorAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/SensorAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/SensorLeakDetectMsg'
      available:
        $ref: '#/components/messages/SensorAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'
      sound:
        $ref: '#/components/messages/SensorSoundMsg'

  # ---------------------------------------------------------------------------
  # Tank
  # ---------------------------------------------------------------------------

  tankValue:
    address: 'BMS/v1/PUB/Value/Tank/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for Tank points.
      Supports both liquid and air tanks.

      **MQTT wildcard examples**

      - All Tank values: `BMS/v1/PUB/Value/Tank/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: BMS-published Tank point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  tankMetadata:
    address: 'BMS/v1/PUB/Metadata/Tank/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for Tank points.
      Includes integration-owned points which carries the `integration` field.

      **MQTT wildcard examples**

      - All Tank metadata: `BMS/v1/PUB/Metadata/Tank/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - GenericPoint
        description: Tank point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/TankLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/TankLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/TankLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/TankLiquidPressureMsg'
      status:
        $ref: '#/components/messages/TankStatusMsg'
      available:
        $ref: '#/components/messages/TankAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/TankValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/TankPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/TankFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/TankDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/TankAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/TankAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/TankAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/TankAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/TankAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/TankLeakDetectMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  # ---------------------------------------------------------------------------
  # GenericObject
  # ---------------------------------------------------------------------------

  genericObjectValue:
    address: 'BMS/v1/PUB/Value/GenericObject/{pointType}/{tagPath}'
    description: |
      Real-time values published by the BMS for GenericObject points.
      Use for any equipment type not covered by a named objectType.

      **MQTT wildcard examples**

      - All GenericObject values: `BMS/v1/PUB/Value/GenericObject/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - Sound
          - GenericPoint
        description: BMS-published GenericObject point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  genericObjectMetadata:
    address: 'BMS/v1/PUB/Metadata/GenericObject/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for GenericObject points.
      Includes integration-owned points which carries the `integration` field.

      **MQTT wildcard examples**

      - All GenericObject metadata: `BMS/v1/PUB/Metadata/GenericObject/#`
    parameters:
      pointType:
        enum:
          - LiquidTemperature
          - LiquidDifferentialPressure
          - LiquidFlow
          - LiquidPressure
          - Status
          - Available
          - ValvePosition
          - PumpSpeed
          - FanSpeed
          - DamperPosition
          - AirTemperature
          - AirDifferentialPressure
          - AirRelativeHumidity
          - AirFlow
          - AirPressure
          - LeakDetect
          - LiquidTemperatureSpRequest
          - Sound
          - GenericPoint
        description: GenericObject point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      liquidTemperature:
        $ref: '#/components/messages/GenericObjectLiquidTemperatureMsg'
      liquidDifferentialPressure:
        $ref: '#/components/messages/GenericObjectLiquidDifferentialPressureMsg'
      liquidFlow:
        $ref: '#/components/messages/GenericObjectLiquidFlowMsg'
      liquidPressure:
        $ref: '#/components/messages/GenericObjectLiquidPressureMsg'
      status:
        $ref: '#/components/messages/GenericObjectStatusMsg'
      available:
        $ref: '#/components/messages/GenericObjectAvailableMsg'
      valvePosition:
        $ref: '#/components/messages/GenericObjectValvePositionMsg'
      pumpSpeed:
        $ref: '#/components/messages/GenericObjectPumpSpeedMsg'
      fanSpeed:
        $ref: '#/components/messages/GenericObjectFanSpeedMsg'
      damperPosition:
        $ref: '#/components/messages/GenericObjectDamperPositionMsg'
      airTemperature:
        $ref: '#/components/messages/GenericObjectAirTemperatureMsg'
      airDifferentialPressure:
        $ref: '#/components/messages/GenericObjectAirDifferentialPressureMsg'
      airRelativeHumidity:
        $ref: '#/components/messages/GenericObjectAirRelativeHumidityMsg'
      airFlow:
        $ref: '#/components/messages/GenericObjectAirFlowMsg'
      airPressure:
        $ref: '#/components/messages/GenericObjectAirPressureMsg'
      leakDetect:
        $ref: '#/components/messages/GenericObjectLeakDetectMsg'
      liquidTemperatureSpRequest:
        $ref: '#/components/messages/GenericObjectLiquidTemperatureSpRequestMsg'
      sound:
        $ref: '#/components/messages/GenericObjectSoundMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  genericObjectIntegrationValue:
    address: 'BMS/v1/{integration}/Value/GenericObject/{pointType}/{tagPath}'
    description: |
      Values published by integrations for GenericObject control points.
      Subscribe to `genericObjectMetadata` first and read `integration` for the exact topic.

      **MQTT wildcard examples**

      - All integration GenericObject values: `BMS/v1/+/Value/GenericObject/#`
    parameters:
      integration:
        description: Integration identifier.
      pointType:
        enum:
          - LiquidTemperatureSpRequest
        description: Integration-published GenericObject point type.
      tagPath:
        description: Must match the tagPath from the corresponding BMS metadata exactly.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  # ---------------------------------------------------------------------------
  # System
  # ---------------------------------------------------------------------------

  systemBmsValue:
    address: 'BMS/v1/PUB/Value/System/{pointType}/{tagPath}'
    description: |
      BMS-published System values.

      **MQTT wildcard examples**

      - All System values: `BMS/v1/PUB/Value/System/#`
    parameters:
      pointType:
        enum:
          - HeartbeatTimestampBms
          - HeartbeatEchoBms
          - Status
          - Available
          - GenericPoint
        description: BMS-published System point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

  systemMetadata:
    address: 'BMS/v1/PUB/Metadata/System/{pointType}/{tagPath}'
    description: |
      BMS-published metadata for all System point types.

      **MQTT wildcard examples**

      - All System metadata: `BMS/v1/PUB/Metadata/System/#`
    parameters:
      pointType:
        enum:
          - HeartbeatTimestampBms
          - HeartbeatEchoBms
          - HeartbeatTimestampIntegration
          - HeartbeatEchoIntegration
          - Status
          - Available
          - GenericPoint
        description: System point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      heartbeatTimestampBms:
        $ref: '#/components/messages/SystemHeartbeatTimestampBmsMsg'
      heartbeatEchoBms:
        $ref: '#/components/messages/SystemHeartbeatEchoBmsMsg'
      heartbeatTimestampIntegration:
        $ref: '#/components/messages/SystemHeartbeatTimestampIntegrationMsg'
      heartbeatEchoIntegration:
        $ref: '#/components/messages/SystemHeartbeatEchoIntegrationMsg'
      status:
        $ref: '#/components/messages/SystemStatusMsg'
      available:
        $ref: '#/components/messages/SystemAvailableMsg'
      genericPoint:
        $ref: '#/components/messages/GenericEquipmentPointMsg'

  systemIntegrationValue:
    address: 'BMS/v1/{integration}/Value/System/{pointType}/{tagPath}'
    description: |
      Values published by integrations for Heartbeat points.

      **MQTT wildcard examples**

      - All integration heartbeat values: `BMS/v1/+/Value/System/#`
    parameters:
      integration:
        description: Integration identifier.
      pointType:
        enum:
          - HeartbeatTimestampIntegration
          - HeartbeatEchoIntegration
        description: Integration-published System point type.
      tagPath:
        description: Vendor-defined hierarchical tag path.
    messages:
      valueMessage:
        $ref: '#/components/messages/ValueMessage'

# =============================================================================
# Operations
# =============================================================================

operations:

  receiveRackValue:
    action: receive
    channel:
      $ref: '#/channels/rackBmsValue'
    messages:
      - $ref: '#/channels/rackBmsValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for all Rack points.

  receiveRackMetadata:
    action: receive
    channel:
      $ref: '#/channels/rackMetadata'
    messages:
      - $ref: '#/channels/rackMetadata/messages/rackLiquidSupplyTemperature'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidReturnTemperature'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidFlow'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidDifferentialPressure'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidDifferentialPressureSp'
      - $ref: '#/channels/rackMetadata/messages/rackControlValvePosition'
      - $ref: '#/channels/rackMetadata/messages/rackPower'
      - $ref: '#/channels/rackMetadata/messages/rackLeakDetect'
      - $ref: '#/channels/rackMetadata/messages/rackLeakSensorFault'
      - $ref: '#/channels/rackMetadata/messages/rackLeakDetectTray'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidIsolationStatus'
      - $ref: '#/channels/rackMetadata/messages/rackElectricalIsolationStatus'
      - $ref: '#/channels/rackMetadata/messages/rackLiquidIsolationRequest'
      - $ref: '#/channels/rackMetadata/messages/rackElectricalIsolationRequest'
    description: Subscribe to BMS-published metadata for all Rack point types.

  publishRackIntegrationValue:
    action: send
    channel:
      $ref: '#/channels/rackIntegrationValue'
    messages:
      - $ref: '#/channels/rackIntegrationValue/messages/valueMessage'
    description: Publish integration values for Rack control points.

  receivePowerMeterValue:
    action: receive
    channel:
      $ref: '#/channels/powerMeterValue'
    messages:
      - $ref: '#/channels/powerMeterValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for all PowerMeter points.

  receivePowerMeterMetadata:
    action: receive
    channel:
      $ref: '#/channels/powerMeterMetadata'
    messages:
      - $ref: '#/channels/powerMeterMetadata/messages/voltage'
      - $ref: '#/channels/powerMeterMetadata/messages/powerFactor'
      - $ref: '#/channels/powerMeterMetadata/messages/frequency'
      - $ref: '#/channels/powerMeterMetadata/messages/apparentPower'
      - $ref: '#/channels/powerMeterMetadata/messages/activePower'
      - $ref: '#/channels/powerMeterMetadata/messages/current'
      - $ref: '#/channels/powerMeterMetadata/messages/currentLimit'
      - $ref: '#/channels/powerMeterMetadata/messages/phaseCurrent'
      - $ref: '#/channels/powerMeterMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for all PowerMeter points.

  receiveBESSValue:
    action: receive
    channel:
      $ref: '#/channels/bessValue'
    messages:
      - $ref: '#/channels/bessValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for BESS points.

  receiveBESSMetadata:
    action: receive
    channel:
      $ref: '#/channels/bessMetadata'
    messages:
      - $ref: '#/channels/bessMetadata/messages/status'
      - $ref: '#/channels/bessMetadata/messages/available'
      - $ref: '#/channels/bessMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for BESS points.

  receiveUPSValue:
    action: receive
    channel:
      $ref: '#/channels/upsValue'
    messages:
      - $ref: '#/channels/upsValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for UPS points.

  receiveUPSMetadata:
    action: receive
    channel:
      $ref: '#/channels/upsMetadata'
    messages:
      - $ref: '#/channels/upsMetadata/messages/status'
      - $ref: '#/channels/upsMetadata/messages/available'
      - $ref: '#/channels/upsMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for UPS points.

  receiveATSValue:
    action: receive
    channel:
      $ref: '#/channels/atsValue'
    messages:
      - $ref: '#/channels/atsValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for ATS points.

  receiveATSMetadata:
    action: receive
    channel:
      $ref: '#/channels/atsMetadata'
    messages:
      - $ref: '#/channels/atsMetadata/messages/status'
      - $ref: '#/channels/atsMetadata/messages/available'
      - $ref: '#/channels/atsMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for ATS points.

  receiveGeneratorValue:
    action: receive
    channel:
      $ref: '#/channels/generatorValue'
    messages:
      - $ref: '#/channels/generatorValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Generator points.

  receiveGeneratorMetadata:
    action: receive
    channel:
      $ref: '#/channels/generatorMetadata'
    messages:
      - $ref: '#/channels/generatorMetadata/messages/status'
      - $ref: '#/channels/generatorMetadata/messages/available'
      - $ref: '#/channels/generatorMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Generator points.

  receiveShuntValue:
    action: receive
    channel:
      $ref: '#/channels/shuntValue'
    messages:
      - $ref: '#/channels/shuntValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Shunt points.

  receiveShuntMetadata:
    action: receive
    channel:
      $ref: '#/channels/shuntMetadata'
    messages:
      - $ref: '#/channels/shuntMetadata/messages/status'
      - $ref: '#/channels/shuntMetadata/messages/available'
      - $ref: '#/channels/shuntMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Shunt points.

  receiveBreakerValue:
    action: receive
    channel:
      $ref: '#/channels/breakerValue'
    messages:
      - $ref: '#/channels/breakerValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Breaker points.

  receiveBreakerMetadata:
    action: receive
    channel:
      $ref: '#/channels/breakerMetadata'
    messages:
      - $ref: '#/channels/breakerMetadata/messages/status'
      - $ref: '#/channels/breakerMetadata/messages/available'
      - $ref: '#/channels/breakerMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Breaker points.

  receiveCDUValue:
    action: receive
    channel:
      $ref: '#/channels/cduValue'
    messages:
      - $ref: '#/channels/cduValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for CDU points.

  receiveCDUMetadata:
    action: receive
    channel:
      $ref: '#/channels/cduMetadata'
    messages:
      - $ref: '#/channels/cduMetadata/messages/liquidTemperature'
      - $ref: '#/channels/cduMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/cduMetadata/messages/liquidFlow'
      - $ref: '#/channels/cduMetadata/messages/liquidPressure'
      - $ref: '#/channels/cduMetadata/messages/status'
      - $ref: '#/channels/cduMetadata/messages/available'
      - $ref: '#/channels/cduMetadata/messages/valvePosition'
      - $ref: '#/channels/cduMetadata/messages/pumpSpeed'
      - $ref: '#/channels/cduMetadata/messages/fanSpeed'
      - $ref: '#/channels/cduMetadata/messages/damperPosition'
      - $ref: '#/channels/cduMetadata/messages/airTemperature'
      - $ref: '#/channels/cduMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/cduMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/cduMetadata/messages/airFlow'
      - $ref: '#/channels/cduMetadata/messages/airPressure'
      - $ref: '#/channels/cduMetadata/messages/leakDetect'
      - $ref: '#/channels/cduMetadata/messages/liquidTemperatureSpRequest'
      - $ref: '#/channels/cduMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for CDU points.

  publishCDUIntegrationValue:
    action: send
    channel:
      $ref: '#/channels/cduIntegrationValue'
    messages:
      - $ref: '#/channels/cduIntegrationValue/messages/valueMessage'
    description: Publish integration values for CDU control points.

  receiveCoolingTowerValue:
    action: receive
    channel:
      $ref: '#/channels/coolingTowerValue'
    messages:
      - $ref: '#/channels/coolingTowerValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for CoolingTower points.

  receiveCoolingTowerMetadata:
    action: receive
    channel:
      $ref: '#/channels/coolingTowerMetadata'
    messages:
      - $ref: '#/channels/coolingTowerMetadata/messages/liquidTemperature'
      - $ref: '#/channels/coolingTowerMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/coolingTowerMetadata/messages/liquidFlow'
      - $ref: '#/channels/coolingTowerMetadata/messages/liquidPressure'
      - $ref: '#/channels/coolingTowerMetadata/messages/status'
      - $ref: '#/channels/coolingTowerMetadata/messages/available'
      - $ref: '#/channels/coolingTowerMetadata/messages/valvePosition'
      - $ref: '#/channels/coolingTowerMetadata/messages/pumpSpeed'
      - $ref: '#/channels/coolingTowerMetadata/messages/fanSpeed'
      - $ref: '#/channels/coolingTowerMetadata/messages/damperPosition'
      - $ref: '#/channels/coolingTowerMetadata/messages/airTemperature'
      - $ref: '#/channels/coolingTowerMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/coolingTowerMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/coolingTowerMetadata/messages/airFlow'
      - $ref: '#/channels/coolingTowerMetadata/messages/airPressure'
      - $ref: '#/channels/coolingTowerMetadata/messages/leakDetect'
      - $ref: '#/channels/coolingTowerMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for CoolingTower points.

  receiveHXValue:
    action: receive
    channel:
      $ref: '#/channels/hxValue'
    messages:
      - $ref: '#/channels/hxValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for HX points.

  receiveHXMetadata:
    action: receive
    channel:
      $ref: '#/channels/hxMetadata'
    messages:
      - $ref: '#/channels/hxMetadata/messages/liquidTemperature'
      - $ref: '#/channels/hxMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/hxMetadata/messages/liquidFlow'
      - $ref: '#/channels/hxMetadata/messages/liquidPressure'
      - $ref: '#/channels/hxMetadata/messages/status'
      - $ref: '#/channels/hxMetadata/messages/available'
      - $ref: '#/channels/hxMetadata/messages/valvePosition'
      - $ref: '#/channels/hxMetadata/messages/pumpSpeed'
      - $ref: '#/channels/hxMetadata/messages/fanSpeed'
      - $ref: '#/channels/hxMetadata/messages/damperPosition'
      - $ref: '#/channels/hxMetadata/messages/airTemperature'
      - $ref: '#/channels/hxMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/hxMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/hxMetadata/messages/airFlow'
      - $ref: '#/channels/hxMetadata/messages/airPressure'
      - $ref: '#/channels/hxMetadata/messages/leakDetect'
      - $ref: '#/channels/hxMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for HX points.

  receiveCRAHValue:
    action: receive
    channel:
      $ref: '#/channels/crahValue'
    messages:
      - $ref: '#/channels/crahValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for CRAH points.

  receiveCRAHMetadata:
    action: receive
    channel:
      $ref: '#/channels/crahMetadata'
    messages:
      - $ref: '#/channels/crahMetadata/messages/liquidTemperature'
      - $ref: '#/channels/crahMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/crahMetadata/messages/liquidFlow'
      - $ref: '#/channels/crahMetadata/messages/liquidPressure'
      - $ref: '#/channels/crahMetadata/messages/status'
      - $ref: '#/channels/crahMetadata/messages/available'
      - $ref: '#/channels/crahMetadata/messages/valvePosition'
      - $ref: '#/channels/crahMetadata/messages/pumpSpeed'
      - $ref: '#/channels/crahMetadata/messages/fanSpeed'
      - $ref: '#/channels/crahMetadata/messages/damperPosition'
      - $ref: '#/channels/crahMetadata/messages/airTemperature'
      - $ref: '#/channels/crahMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/crahMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/crahMetadata/messages/airFlow'
      - $ref: '#/channels/crahMetadata/messages/airPressure'
      - $ref: '#/channels/crahMetadata/messages/leakDetect'
      - $ref: '#/channels/crahMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for CRAH points.

  receiveCRACValue:
    action: receive
    channel:
      $ref: '#/channels/cracValue'
    messages:
      - $ref: '#/channels/cracValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for CRAC points.

  receiveCRACMetadata:
    action: receive
    channel:
      $ref: '#/channels/cracMetadata'
    messages:
      - $ref: '#/channels/cracMetadata/messages/liquidTemperature'
      - $ref: '#/channels/cracMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/cracMetadata/messages/liquidFlow'
      - $ref: '#/channels/cracMetadata/messages/liquidPressure'
      - $ref: '#/channels/cracMetadata/messages/status'
      - $ref: '#/channels/cracMetadata/messages/available'
      - $ref: '#/channels/cracMetadata/messages/valvePosition'
      - $ref: '#/channels/cracMetadata/messages/pumpSpeed'
      - $ref: '#/channels/cracMetadata/messages/fanSpeed'
      - $ref: '#/channels/cracMetadata/messages/damperPosition'
      - $ref: '#/channels/cracMetadata/messages/airTemperature'
      - $ref: '#/channels/cracMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/cracMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/cracMetadata/messages/airFlow'
      - $ref: '#/channels/cracMetadata/messages/airPressure'
      - $ref: '#/channels/cracMetadata/messages/leakDetect'
      - $ref: '#/channels/cracMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for CRAC points.

  receiveAHUValue:
    action: receive
    channel:
      $ref: '#/channels/ahuValue'
    messages:
      - $ref: '#/channels/ahuValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for AHU points.

  receiveAHUMetadata:
    action: receive
    channel:
      $ref: '#/channels/ahuMetadata'
    messages:
      - $ref: '#/channels/ahuMetadata/messages/liquidTemperature'
      - $ref: '#/channels/ahuMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/ahuMetadata/messages/liquidFlow'
      - $ref: '#/channels/ahuMetadata/messages/liquidPressure'
      - $ref: '#/channels/ahuMetadata/messages/status'
      - $ref: '#/channels/ahuMetadata/messages/available'
      - $ref: '#/channels/ahuMetadata/messages/valvePosition'
      - $ref: '#/channels/ahuMetadata/messages/pumpSpeed'
      - $ref: '#/channels/ahuMetadata/messages/fanSpeed'
      - $ref: '#/channels/ahuMetadata/messages/damperPosition'
      - $ref: '#/channels/ahuMetadata/messages/airTemperature'
      - $ref: '#/channels/ahuMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/ahuMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/ahuMetadata/messages/airFlow'
      - $ref: '#/channels/ahuMetadata/messages/airPressure'
      - $ref: '#/channels/ahuMetadata/messages/leakDetect'
      - $ref: '#/channels/ahuMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for AHU points.

  receiveChillerValue:
    action: receive
    channel:
      $ref: '#/channels/chillerValue'
    messages:
      - $ref: '#/channels/chillerValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Chiller points.

  receiveChillerMetadata:
    action: receive
    channel:
      $ref: '#/channels/chillerMetadata'
    messages:
      - $ref: '#/channels/chillerMetadata/messages/liquidTemperature'
      - $ref: '#/channels/chillerMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/chillerMetadata/messages/liquidFlow'
      - $ref: '#/channels/chillerMetadata/messages/liquidPressure'
      - $ref: '#/channels/chillerMetadata/messages/status'
      - $ref: '#/channels/chillerMetadata/messages/available'
      - $ref: '#/channels/chillerMetadata/messages/valvePosition'
      - $ref: '#/channels/chillerMetadata/messages/pumpSpeed'
      - $ref: '#/channels/chillerMetadata/messages/fanSpeed'
      - $ref: '#/channels/chillerMetadata/messages/damperPosition'
      - $ref: '#/channels/chillerMetadata/messages/airTemperature'
      - $ref: '#/channels/chillerMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/chillerMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/chillerMetadata/messages/airFlow'
      - $ref: '#/channels/chillerMetadata/messages/airPressure'
      - $ref: '#/channels/chillerMetadata/messages/leakDetect'
      - $ref: '#/channels/chillerMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Chiller points.

  receiveValveValue:
    action: receive
    channel:
      $ref: '#/channels/valveValue'
    messages:
      - $ref: '#/channels/valveValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Valve points.

  receiveValveMetadata:
    action: receive
    channel:
      $ref: '#/channels/valveMetadata'
    messages:
      - $ref: '#/channels/valveMetadata/messages/valvePosition'
      - $ref: '#/channels/valveMetadata/messages/available'
      - $ref: '#/channels/valveMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Valve points.

  receivePumpValue:
    action: receive
    channel:
      $ref: '#/channels/pumpValue'
    messages:
      - $ref: '#/channels/pumpValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Pump points.

  receivePumpMetadata:
    action: receive
    channel:
      $ref: '#/channels/pumpMetadata'
    messages:
      - $ref: '#/channels/pumpMetadata/messages/pumpSpeed'
      - $ref: '#/channels/pumpMetadata/messages/available'
      - $ref: '#/channels/pumpMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Pump points.

  receiveFanValue:
    action: receive
    channel:
      $ref: '#/channels/fanValue'
    messages:
      - $ref: '#/channels/fanValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Fan points.

  receiveFanMetadata:
    action: receive
    channel:
      $ref: '#/channels/fanMetadata'
    messages:
      - $ref: '#/channels/fanMetadata/messages/fanSpeed'
      - $ref: '#/channels/fanMetadata/messages/available'
      - $ref: '#/channels/fanMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Fan points.

  receiveDamperValue:
    action: receive
    channel:
      $ref: '#/channels/damperValue'
    messages:
      - $ref: '#/channels/damperValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Damper points.

  receiveDamperMetadata:
    action: receive
    channel:
      $ref: '#/channels/damperMetadata'
    messages:
      - $ref: '#/channels/damperMetadata/messages/damperPosition'
      - $ref: '#/channels/damperMetadata/messages/available'
      - $ref: '#/channels/damperMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Damper points.

  receiveSensorValue:
    action: receive
    channel:
      $ref: '#/channels/sensorValue'
    messages:
      - $ref: '#/channels/sensorValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Sensor points.

  receiveSensorMetadata:
    action: receive
    channel:
      $ref: '#/channels/sensorMetadata'
    messages:
      - $ref: '#/channels/sensorMetadata/messages/liquidTemperature'
      - $ref: '#/channels/sensorMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/sensorMetadata/messages/liquidFlow'
      - $ref: '#/channels/sensorMetadata/messages/liquidPressure'
      - $ref: '#/channels/sensorMetadata/messages/airTemperature'
      - $ref: '#/channels/sensorMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/sensorMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/sensorMetadata/messages/airFlow'
      - $ref: '#/channels/sensorMetadata/messages/airPressure'
      - $ref: '#/channels/sensorMetadata/messages/leakDetect'
      - $ref: '#/channels/sensorMetadata/messages/available'
      - $ref: '#/channels/sensorMetadata/messages/sound'
      - $ref: '#/channels/sensorMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Sensor points.

  receiveTankValue:
    action: receive
    channel:
      $ref: '#/channels/tankValue'
    messages:
      - $ref: '#/channels/tankValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for Tank points.

  receiveTankMetadata:
    action: receive
    channel:
      $ref: '#/channels/tankMetadata'
    messages:
      - $ref: '#/channels/tankMetadata/messages/liquidTemperature'
      - $ref: '#/channels/tankMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/tankMetadata/messages/liquidFlow'
      - $ref: '#/channels/tankMetadata/messages/liquidPressure'
      - $ref: '#/channels/tankMetadata/messages/status'
      - $ref: '#/channels/tankMetadata/messages/available'
      - $ref: '#/channels/tankMetadata/messages/valvePosition'
      - $ref: '#/channels/tankMetadata/messages/pumpSpeed'
      - $ref: '#/channels/tankMetadata/messages/fanSpeed'
      - $ref: '#/channels/tankMetadata/messages/damperPosition'
      - $ref: '#/channels/tankMetadata/messages/airTemperature'
      - $ref: '#/channels/tankMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/tankMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/tankMetadata/messages/airFlow'
      - $ref: '#/channels/tankMetadata/messages/airPressure'
      - $ref: '#/channels/tankMetadata/messages/leakDetect'
      - $ref: '#/channels/tankMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for Tank points.

  receiveGenericObjectValue:
    action: receive
    channel:
      $ref: '#/channels/genericObjectValue'
    messages:
      - $ref: '#/channels/genericObjectValue/messages/valueMessage'
    description: Subscribe to real-time BMS-published values for GenericObject points.

  receiveGenericObjectMetadata:
    action: receive
    channel:
      $ref: '#/channels/genericObjectMetadata'
    messages:
      - $ref: '#/channels/genericObjectMetadata/messages/liquidTemperature'
      - $ref: '#/channels/genericObjectMetadata/messages/liquidDifferentialPressure'
      - $ref: '#/channels/genericObjectMetadata/messages/liquidFlow'
      - $ref: '#/channels/genericObjectMetadata/messages/liquidPressure'
      - $ref: '#/channels/genericObjectMetadata/messages/status'
      - $ref: '#/channels/genericObjectMetadata/messages/available'
      - $ref: '#/channels/genericObjectMetadata/messages/valvePosition'
      - $ref: '#/channels/genericObjectMetadata/messages/pumpSpeed'
      - $ref: '#/channels/genericObjectMetadata/messages/fanSpeed'
      - $ref: '#/channels/genericObjectMetadata/messages/damperPosition'
      - $ref: '#/channels/genericObjectMetadata/messages/airTemperature'
      - $ref: '#/channels/genericObjectMetadata/messages/airDifferentialPressure'
      - $ref: '#/channels/genericObjectMetadata/messages/airRelativeHumidity'
      - $ref: '#/channels/genericObjectMetadata/messages/airFlow'
      - $ref: '#/channels/genericObjectMetadata/messages/airPressure'
      - $ref: '#/channels/genericObjectMetadata/messages/leakDetect'
      - $ref: '#/channels/genericObjectMetadata/messages/liquidTemperatureSpRequest'
      - $ref: '#/channels/genericObjectMetadata/messages/sound'
      - $ref: '#/channels/genericObjectMetadata/messages/genericPoint'
    description: Subscribe to BMS-published metadata for GenericObject points.

  publishGenericObjectIntegrationValue:
    action: send
    channel:
      $ref: '#/channels/genericObjectIntegrationValue'
    messages:
      - $ref: '#/channels/genericObjectIntegrationValue/messages/valueMessage'
    description: Publish integration values for GenericObject control points.

  receiveSystemBmsValue:
    action: receive
    channel:
      $ref: '#/channels/systemBmsValue'
    messages:
      - $ref: '#/channels/systemBmsValue/messages/valueMessage'
    description: Subscribe to BMS System values (heartbeat timestamps, status, etc.).

  receiveSystemMetadata:
    action: receive
    channel:
      $ref: '#/channels/systemMetadata'
    messages:
      - $ref: '#/channels/systemMetadata/messages/heartbeatTimestampBms'
      - $ref: '#/channels/systemMetadata/messages/heartbeatEchoBms'
      - $ref: '#/channels/systemMetadata/messages/heartbeatTimestampIntegration'
      - $ref: '#/channels/systemMetadata/messages/heartbeatEchoIntegration'
    description: Subscribe to System metadata for all System point types.

  publishSystemIntegrationValue:
    action: send
    channel:
      $ref: '#/channels/systemIntegrationValue'
    messages:
      - $ref: '#/channels/systemIntegrationValue/messages/valueMessage'
    description: Publish integration System values to topics derived from BMS metadata.

# =============================================================================
# Components
# =============================================================================

components:

  messages:

    ValueMessage:
      name: ValueMessage
      title: Point Value
      description: |
        Live value message. Payload envelope is identical for all point types.
        The semantic meaning of `value` is determined by the corresponding
        metadata message.
      payload:
        type: object
        required:
          - value
          - timestamp
          - quality
        properties:
          value:
            oneOf:
              - type: number
              - type: 'null'
            description: >
              Live reading for the point (float). May be null when the BMS
              has no valid reading available.
            examples:
              - 22.96215
              - 0.239
              - null
              - 1

          timestamp:
            type: integer
            description: Unix timestamp in epoch milliseconds (source event time).
            examples:
              - 1743620423000
          quality:
            type: integer
            description: >
              `1` = good quality. Any other integer indicates value is not trustworthy
            examples:
              - 1
              - 0
        additionalProperties: false

    # Rack
    RackLiquidSupplyTemperatureMsg:
      name: RackLiquidSupplyTemperatureMsg
      title: Rack RackLiquidSupplyTemperature Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidSupplyTemperatureMetadata'
    RackLiquidReturnTemperatureMsg:
      name: RackLiquidReturnTemperatureMsg
      title: Rack RackLiquidReturnTemperature Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidReturnTemperatureMetadata'
    RackLiquidFlowMsg:
      name: RackLiquidFlowMsg
      title: Rack RackLiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidFlowMetadata'
    RackLiquidDifferentialPressureMsg:
      name: RackLiquidDifferentialPressureMsg
      title: Rack RackLiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidDifferentialPressureMetadata'
    RackControlValvePositionMsg:
      name: RackControlValvePositionMsg
      title: Rack RackControlValvePosition Metadata
      payload:
        $ref: '#/components/schemas/RackControlValvePositionMetadata'
    RackPowerMsg:
      name: RackPowerMsg
      title: Rack RackPower Metadata
      payload:
        $ref: '#/components/schemas/RackPowerMetadata'
    RackLeakDetectMsg:
      name: RackLeakDetectMsg
      title: Rack RackLeakDetect Metadata
      payload:
        $ref: '#/components/schemas/RackLeakDetectMetadata'
    RackLeakSensorFaultMsg:
      name: RackLeakSensorFaultMsg
      title: Rack RackLeakSensorFault Metadata
      payload:
        $ref: '#/components/schemas/RackLeakSensorFaultMetadata'
    RackLiquidIsolationStatusMsg:
      name: RackLiquidIsolationStatusMsg
      title: Rack RackLiquidIsolationStatus Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidIsolationStatusMetadata'
    RackElectricalIsolationStatusMsg:
      name: RackElectricalIsolationStatusMsg
      title: Rack RackElectricalIsolationStatus Metadata
      payload:
        $ref: '#/components/schemas/RackElectricalIsolationStatusMetadata'
    RackLeakDetectTrayMsg:
      name: RackLeakDetectTrayMsg
      title: Rack RackLeakDetectTray Metadata
      payload:
        $ref: '#/components/schemas/RackLeakDetectTrayMetadata'
    RackLiquidIsolationRequestMsg:
      name: RackLiquidIsolationRequestMsg
      title: Rack RackLiquidIsolationRequest Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidIsolationRequestMetadata'
    RackElectricalIsolationRequestMsg:
      name: RackElectricalIsolationRequestMsg
      title: Rack RackElectricalIsolationRequest Metadata
      payload:
        $ref: '#/components/schemas/RackElectricalIsolationRequestMetadata'

    # PowerMeter
    PowerMeterVoltageMsg:
      name: PowerMeterVoltageMsg
      title: PowerMeter Voltage Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterVoltageMetadata'
    PowerMeterPowerFactorMsg:
      name: PowerMeterPowerFactorMsg
      title: PowerMeter PowerFactor Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterPowerFactorMetadata'
    PowerMeterFrequencyMsg:
      name: PowerMeterFrequencyMsg
      title: PowerMeter Frequency Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterFrequencyMetadata'
    PowerMeterApparentPowerMsg:
      name: PowerMeterApparentPowerMsg
      title: PowerMeter ApparentPower Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterApparentPowerMetadata'
    PowerMeterActivePowerMsg:
      name: PowerMeterActivePowerMsg
      title: PowerMeter ActivePower Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterActivePowerMetadata'
    PowerMeterCurrentMsg:
      name: PowerMeterCurrentMsg
      title: PowerMeter Current Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterCurrentMetadata'
    PowerMeterCurrentLimitMsg:
      name: PowerMeterCurrentLimitMsg
      title: PowerMeter CurrentLimit Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterCurrentLimitMetadata'
    PowerMeterPhaseCurrentMsg:
      name: PowerMeterPhaseCurrentMsg
      title: PowerMeter PhaseCurrent Metadata
      payload:
        $ref: '#/components/schemas/PowerMeterPhaseCurrentMetadata'

    # Generic Equipment
    LiquidTemperatureMsg:
      name: LiquidTemperatureMsg
      title: LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/LiquidTemperatureMetadata'
    LiquidDifferentialPressureMsg:
      name: LiquidDifferentialPressureMsg
      title: LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/LiquidDifferentialPressureMetadata'
    LiquidFlowMsg:
      name: LiquidFlowMsg
      title: LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/LiquidFlowMetadata'
    LiquidPressureMsg:
      name: LiquidPressureMsg
      title: LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/LiquidPressureMetadata'
    StatusMsg:
      name: StatusMsg
      title: Status Metadata
      payload:
        $ref: '#/components/schemas/StatusMetadata'
    AvailableMsg:
      name: AvailableMsg
      title: Available Metadata
      payload:
        $ref: '#/components/schemas/AvailableMetadata'
    ValvePositionMsg:
      name: ValvePositionMsg
      title: ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/ValvePositionMetadata'
    PumpSpeedMsg:
      name: PumpSpeedMsg
      title: PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/PumpSpeedMetadata'
    FanSpeedMsg:
      name: FanSpeedMsg
      title: FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/FanSpeedMetadata'
    DamperPositionMsg:
      name: DamperPositionMsg
      title: DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/DamperPositionMetadata'
    AirTemperatureMsg:
      name: AirTemperatureMsg
      title: AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/AirTemperatureMetadata'
    AirDifferentialPressureMsg:
      name: AirDifferentialPressureMsg
      title: AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/AirDifferentialPressureMetadata'
    AirFlowMsg:
      name: AirFlowMsg
      title: AirFlow Metadata
      payload:
        $ref: '#/components/schemas/AirFlowMetadata'
    AirPressureMsg:
      name: AirPressureMsg
      title: AirPressure Metadata
      payload:
        $ref: '#/components/schemas/AirPressureMetadata'
    LiquidTemperatureSpRequestMsg:
      name: LiquidTemperatureSpRequestMsg
      title: CDU LiquidTemperatureSpRequest Metadata
      payload:
        $ref: '#/components/schemas/LiquidTemperatureSpRequestMetadata'
    SoundMsg:
      name: SoundMsg
      title: Sound Metadata
      payload:
        $ref: '#/components/schemas/SoundMetadata'

    # System
    SystemHeartbeatTimestampBmsMsg:
      name: SystemHeartbeatTimestampBmsMsg
      title: HeartbeatTimestampBms Metadata
      payload:
        $ref: '#/components/schemas/SystemHeartbeatTimestampBmsMetadata'
    SystemHeartbeatEchoBmsMsg:
      name: SystemHeartbeatEchoBmsMsg
      title: HeartbeatEchoBms Metadata
      payload:
        $ref: '#/components/schemas/SystemHeartbeatEchoBmsMetadata'
    SystemHeartbeatTimestampIntegrationMsg:
      name: SystemHeartbeatTimestampIntegrationMsg
      title: HeartbeatTimestampIntegration Metadata
      payload:
        $ref: '#/components/schemas/SystemHeartbeatTimestampIntegrationMetadata'
    SystemHeartbeatEchoIntegrationMsg:
      name: SystemHeartbeatEchoIntegrationMsg
      title: HeartbeatEchoIntegration Metadata
      payload:
        $ref: '#/components/schemas/SystemHeartbeatEchoIntegrationMetadata'
    SystemStatusMsg:
      name: SystemStatusMsg
      title: System Status Metadata
      payload:
        $ref: '#/components/schemas/SystemStatusMetadata'
    SystemAvailableMsg:
      name: SystemAvailableMsg
      title: System Available Metadata
      payload:
        $ref: '#/components/schemas/SystemAvailableMetadata'

    # Generic Equipment
    # --- Per-objectType messages (objectType constraint) ---

    BESSStatusMsg:
      name: BESSStatusMsg
      title: BESS Status Metadata
      payload:
        $ref: '#/components/schemas/BESSStatusMetadata'

    BESSAvailableMsg:
      name: BESSAvailableMsg
      title: BESS Available Metadata
      payload:
        $ref: '#/components/schemas/BESSAvailableMetadata'

    UPSStatusMsg:
      name: UPSStatusMsg
      title: UPS Status Metadata
      payload:
        $ref: '#/components/schemas/UPSStatusMetadata'

    UPSAvailableMsg:
      name: UPSAvailableMsg
      title: UPS Available Metadata
      payload:
        $ref: '#/components/schemas/UPSAvailableMetadata'

    ATSStatusMsg:
      name: ATSStatusMsg
      title: ATS Status Metadata
      payload:
        $ref: '#/components/schemas/ATSStatusMetadata'

    ATSAvailableMsg:
      name: ATSAvailableMsg
      title: ATS Available Metadata
      payload:
        $ref: '#/components/schemas/ATSAvailableMetadata'

    GeneratorStatusMsg:
      name: GeneratorStatusMsg
      title: Generator Status Metadata
      payload:
        $ref: '#/components/schemas/GeneratorStatusMetadata'

    GeneratorAvailableMsg:
      name: GeneratorAvailableMsg
      title: Generator Available Metadata
      payload:
        $ref: '#/components/schemas/GeneratorAvailableMetadata'

    ShuntStatusMsg:
      name: ShuntStatusMsg
      title: Shunt Status Metadata
      payload:
        $ref: '#/components/schemas/ShuntStatusMetadata'

    ShuntAvailableMsg:
      name: ShuntAvailableMsg
      title: Shunt Available Metadata
      payload:
        $ref: '#/components/schemas/ShuntAvailableMetadata'

    BreakerStatusMsg:
      name: BreakerStatusMsg
      title: Breaker Status Metadata
      payload:
        $ref: '#/components/schemas/BreakerStatusMetadata'

    BreakerAvailableMsg:
      name: BreakerAvailableMsg
      title: Breaker Available Metadata
      payload:
        $ref: '#/components/schemas/BreakerAvailableMetadata'

    ValveValvePositionMsg:
      name: ValveValvePositionMsg
      title: Valve ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/ValveValvePositionMetadata'

    PumpPumpSpeedMsg:
      name: PumpPumpSpeedMsg
      title: Pump PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/PumpPumpSpeedMetadata'

    FanFanSpeedMsg:
      name: FanFanSpeedMsg
      title: Fan FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/FanFanSpeedMetadata'

    DamperDamperPositionMsg:
      name: DamperDamperPositionMsg
      title: Damper DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/DamperDamperPositionMetadata'

    SensorLiquidTemperatureMsg:
      name: SensorLiquidTemperatureMsg
      title: Sensor LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/SensorLiquidTemperatureMetadata'

    SensorLiquidDifferentialPressureMsg:
      name: SensorLiquidDifferentialPressureMsg
      title: Sensor LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/SensorLiquidDifferentialPressureMetadata'

    SensorLiquidFlowMsg:
      name: SensorLiquidFlowMsg
      title: Sensor LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/SensorLiquidFlowMetadata'

    SensorLiquidPressureMsg:
      name: SensorLiquidPressureMsg
      title: Sensor LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/SensorLiquidPressureMetadata'

    SensorAirTemperatureMsg:
      name: SensorAirTemperatureMsg
      title: Sensor AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/SensorAirTemperatureMetadata'

    SensorAirDifferentialPressureMsg:
      name: SensorAirDifferentialPressureMsg
      title: Sensor AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/SensorAirDifferentialPressureMetadata'

    SensorAirFlowMsg:
      name: SensorAirFlowMsg
      title: Sensor AirFlow Metadata
      payload:
        $ref: '#/components/schemas/SensorAirFlowMetadata'

    SensorAirPressureMsg:
      name: SensorAirPressureMsg
      title: Sensor AirPressure Metadata
      payload:
        $ref: '#/components/schemas/SensorAirPressureMetadata'

    SensorSoundMsg:
      name: SensorSoundMsg
      title: Sensor Sound Metadata
      payload:
        $ref: '#/components/schemas/SensorSoundMetadata'

    ValveAvailableMsg:
      name: ValveAvailableMsg
      title: Valve Available Metadata
      payload:
        $ref: '#/components/schemas/ValveAvailableMetadata'

    PumpAvailableMsg:
      name: PumpAvailableMsg
      title: Pump Available Metadata
      payload:
        $ref: '#/components/schemas/PumpAvailableMetadata'

    FanAvailableMsg:
      name: FanAvailableMsg
      title: Fan Available Metadata
      payload:
        $ref: '#/components/schemas/FanAvailableMetadata'

    DamperAvailableMsg:
      name: DamperAvailableMsg
      title: Damper Available Metadata
      payload:
        $ref: '#/components/schemas/DamperAvailableMetadata'

    SensorAvailableMsg:
      name: SensorAvailableMsg
      title: Sensor Available Metadata
      payload:
        $ref: '#/components/schemas/SensorAvailableMetadata'

    CDULeakDetectMsg:
      name: CDULeakDetectMsg
      title: CDU LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/CDULeakDetectMetadata'

    CoolingTowerLeakDetectMsg:
      name: CoolingTowerLeakDetectMsg
      title: CoolingTower LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerLeakDetectMetadata'

    HXLeakDetectMsg:
      name: HXLeakDetectMsg
      title: HX LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/HXLeakDetectMetadata'

    CRAHLeakDetectMsg:
      name: CRAHLeakDetectMsg
      title: CRAH LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/CRAHLeakDetectMetadata'

    CRACLeakDetectMsg:
      name: CRACLeakDetectMsg
      title: CRAC LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/CRACLeakDetectMetadata'

    AHULeakDetectMsg:
      name: AHULeakDetectMsg
      title: AHU LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/AHULeakDetectMetadata'

    ChillerLeakDetectMsg:
      name: ChillerLeakDetectMsg
      title: Chiller LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/ChillerLeakDetectMetadata'

    TankLeakDetectMsg:
      name: TankLeakDetectMsg
      title: Tank LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/TankLeakDetectMetadata'

    SensorLeakDetectMsg:
      name: SensorLeakDetectMsg
      title: Sensor LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/SensorLeakDetectMetadata'

    GenericObjectLeakDetectMsg:
      name: GenericObjectLeakDetectMsg
      title: GenericObject LeakDetect Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLeakDetectMetadata'

    CDUAirRelativeHumidityMsg:
      name: CDUAirRelativeHumidityMsg
      title: CDU AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/CDUAirRelativeHumidityMetadata'

    CoolingTowerAirRelativeHumidityMsg:
      name: CoolingTowerAirRelativeHumidityMsg
      title: CoolingTower AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAirRelativeHumidityMetadata'

    HXAirRelativeHumidityMsg:
      name: HXAirRelativeHumidityMsg
      title: HX AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/HXAirRelativeHumidityMetadata'

    CRAHAirRelativeHumidityMsg:
      name: CRAHAirRelativeHumidityMsg
      title: CRAH AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/CRAHAirRelativeHumidityMetadata'

    CRACAirRelativeHumidityMsg:
      name: CRACAirRelativeHumidityMsg
      title: CRAC AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/CRACAirRelativeHumidityMetadata'

    AHUAirRelativeHumidityMsg:
      name: AHUAirRelativeHumidityMsg
      title: AHU AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/AHUAirRelativeHumidityMetadata'

    ChillerAirRelativeHumidityMsg:
      name: ChillerAirRelativeHumidityMsg
      title: Chiller AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/ChillerAirRelativeHumidityMetadata'

    TankAirRelativeHumidityMsg:
      name: TankAirRelativeHumidityMsg
      title: Tank AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/TankAirRelativeHumidityMetadata'

    SensorAirRelativeHumidityMsg:
      name: SensorAirRelativeHumidityMsg
      title: Sensor AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/SensorAirRelativeHumidityMetadata'

    GenericObjectAirRelativeHumidityMsg:
      name: GenericObjectAirRelativeHumidityMsg
      title: GenericObject AirRelativeHumidity Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAirRelativeHumidityMetadata'

    RackLiquidDifferentialPressureSpMsg:
      name: RackLiquidDifferentialPressureSpMsg
      title: Rack RackLiquidDifferentialPressureSp Metadata
      payload:
        $ref: '#/components/schemas/RackLiquidDifferentialPressureSpMetadata'

    CDULiquidTemperatureMsg:
      name: CDULiquidTemperatureMsg
      title: CDU LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/CDULiquidTemperatureMetadata'

    CDULiquidDifferentialPressureMsg:
      name: CDULiquidDifferentialPressureMsg
      title: CDU LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CDULiquidDifferentialPressureMetadata'

    CDULiquidFlowMsg:
      name: CDULiquidFlowMsg
      title: CDU LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/CDULiquidFlowMetadata'

    CDULiquidPressureMsg:
      name: CDULiquidPressureMsg
      title: CDU LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/CDULiquidPressureMetadata'

    CDUStatusMsg:
      name: CDUStatusMsg
      title: CDU Status Metadata
      payload:
        $ref: '#/components/schemas/CDUStatusMetadata'

    CDUAvailableMsg:
      name: CDUAvailableMsg
      title: CDU Available Metadata
      payload:
        $ref: '#/components/schemas/CDUAvailableMetadata'

    CDUValvePositionMsg:
      name: CDUValvePositionMsg
      title: CDU ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/CDUValvePositionMetadata'

    CDUPumpSpeedMsg:
      name: CDUPumpSpeedMsg
      title: CDU PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/CDUPumpSpeedMetadata'

    CDUFanSpeedMsg:
      name: CDUFanSpeedMsg
      title: CDU FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/CDUFanSpeedMetadata'

    CDUDamperPositionMsg:
      name: CDUDamperPositionMsg
      title: CDU DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/CDUDamperPositionMetadata'

    CDUAirTemperatureMsg:
      name: CDUAirTemperatureMsg
      title: CDU AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/CDUAirTemperatureMetadata'

    CDUAirDifferentialPressureMsg:
      name: CDUAirDifferentialPressureMsg
      title: CDU AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CDUAirDifferentialPressureMetadata'

    CDUAirFlowMsg:
      name: CDUAirFlowMsg
      title: CDU AirFlow Metadata
      payload:
        $ref: '#/components/schemas/CDUAirFlowMetadata'

    CDUAirPressureMsg:
      name: CDUAirPressureMsg
      title: CDU AirPressure Metadata
      payload:
        $ref: '#/components/schemas/CDUAirPressureMetadata'

    CoolingTowerLiquidTemperatureMsg:
      name: CoolingTowerLiquidTemperatureMsg
      title: CoolingTower LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerLiquidTemperatureMetadata'

    CoolingTowerLiquidDifferentialPressureMsg:
      name: CoolingTowerLiquidDifferentialPressureMsg
      title: CoolingTower LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerLiquidDifferentialPressureMetadata'

    CoolingTowerLiquidFlowMsg:
      name: CoolingTowerLiquidFlowMsg
      title: CoolingTower LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerLiquidFlowMetadata'

    CoolingTowerLiquidPressureMsg:
      name: CoolingTowerLiquidPressureMsg
      title: CoolingTower LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerLiquidPressureMetadata'

    CoolingTowerStatusMsg:
      name: CoolingTowerStatusMsg
      title: CoolingTower Status Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerStatusMetadata'

    CoolingTowerAvailableMsg:
      name: CoolingTowerAvailableMsg
      title: CoolingTower Available Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAvailableMetadata'

    CoolingTowerValvePositionMsg:
      name: CoolingTowerValvePositionMsg
      title: CoolingTower ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerValvePositionMetadata'

    CoolingTowerPumpSpeedMsg:
      name: CoolingTowerPumpSpeedMsg
      title: CoolingTower PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerPumpSpeedMetadata'

    CoolingTowerFanSpeedMsg:
      name: CoolingTowerFanSpeedMsg
      title: CoolingTower FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerFanSpeedMetadata'

    CoolingTowerDamperPositionMsg:
      name: CoolingTowerDamperPositionMsg
      title: CoolingTower DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerDamperPositionMetadata'

    CoolingTowerAirTemperatureMsg:
      name: CoolingTowerAirTemperatureMsg
      title: CoolingTower AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAirTemperatureMetadata'

    CoolingTowerAirDifferentialPressureMsg:
      name: CoolingTowerAirDifferentialPressureMsg
      title: CoolingTower AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAirDifferentialPressureMetadata'

    CoolingTowerAirFlowMsg:
      name: CoolingTowerAirFlowMsg
      title: CoolingTower AirFlow Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAirFlowMetadata'

    CoolingTowerAirPressureMsg:
      name: CoolingTowerAirPressureMsg
      title: CoolingTower AirPressure Metadata
      payload:
        $ref: '#/components/schemas/CoolingTowerAirPressureMetadata'

    HXLiquidTemperatureMsg:
      name: HXLiquidTemperatureMsg
      title: HX LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/HXLiquidTemperatureMetadata'

    HXLiquidDifferentialPressureMsg:
      name: HXLiquidDifferentialPressureMsg
      title: HX LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/HXLiquidDifferentialPressureMetadata'

    HXLiquidFlowMsg:
      name: HXLiquidFlowMsg
      title: HX LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/HXLiquidFlowMetadata'

    HXLiquidPressureMsg:
      name: HXLiquidPressureMsg
      title: HX LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/HXLiquidPressureMetadata'

    HXStatusMsg:
      name: HXStatusMsg
      title: HX Status Metadata
      payload:
        $ref: '#/components/schemas/HXStatusMetadata'

    HXAvailableMsg:
      name: HXAvailableMsg
      title: HX Available Metadata
      payload:
        $ref: '#/components/schemas/HXAvailableMetadata'

    HXValvePositionMsg:
      name: HXValvePositionMsg
      title: HX ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/HXValvePositionMetadata'

    HXPumpSpeedMsg:
      name: HXPumpSpeedMsg
      title: HX PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/HXPumpSpeedMetadata'

    HXFanSpeedMsg:
      name: HXFanSpeedMsg
      title: HX FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/HXFanSpeedMetadata'

    HXDamperPositionMsg:
      name: HXDamperPositionMsg
      title: HX DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/HXDamperPositionMetadata'

    HXAirTemperatureMsg:
      name: HXAirTemperatureMsg
      title: HX AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/HXAirTemperatureMetadata'

    HXAirDifferentialPressureMsg:
      name: HXAirDifferentialPressureMsg
      title: HX AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/HXAirDifferentialPressureMetadata'

    HXAirFlowMsg:
      name: HXAirFlowMsg
      title: HX AirFlow Metadata
      payload:
        $ref: '#/components/schemas/HXAirFlowMetadata'

    HXAirPressureMsg:
      name: HXAirPressureMsg
      title: HX AirPressure Metadata
      payload:
        $ref: '#/components/schemas/HXAirPressureMetadata'

    CRAHLiquidTemperatureMsg:
      name: CRAHLiquidTemperatureMsg
      title: CRAH LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/CRAHLiquidTemperatureMetadata'

    CRAHLiquidDifferentialPressureMsg:
      name: CRAHLiquidDifferentialPressureMsg
      title: CRAH LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CRAHLiquidDifferentialPressureMetadata'

    CRAHLiquidFlowMsg:
      name: CRAHLiquidFlowMsg
      title: CRAH LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/CRAHLiquidFlowMetadata'

    CRAHLiquidPressureMsg:
      name: CRAHLiquidPressureMsg
      title: CRAH LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/CRAHLiquidPressureMetadata'

    CRAHStatusMsg:
      name: CRAHStatusMsg
      title: CRAH Status Metadata
      payload:
        $ref: '#/components/schemas/CRAHStatusMetadata'

    CRAHAvailableMsg:
      name: CRAHAvailableMsg
      title: CRAH Available Metadata
      payload:
        $ref: '#/components/schemas/CRAHAvailableMetadata'

    CRAHValvePositionMsg:
      name: CRAHValvePositionMsg
      title: CRAH ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/CRAHValvePositionMetadata'

    CRAHPumpSpeedMsg:
      name: CRAHPumpSpeedMsg
      title: CRAH PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/CRAHPumpSpeedMetadata'

    CRAHFanSpeedMsg:
      name: CRAHFanSpeedMsg
      title: CRAH FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/CRAHFanSpeedMetadata'

    CRAHDamperPositionMsg:
      name: CRAHDamperPositionMsg
      title: CRAH DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/CRAHDamperPositionMetadata'

    CRAHAirTemperatureMsg:
      name: CRAHAirTemperatureMsg
      title: CRAH AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/CRAHAirTemperatureMetadata'

    CRAHAirDifferentialPressureMsg:
      name: CRAHAirDifferentialPressureMsg
      title: CRAH AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CRAHAirDifferentialPressureMetadata'

    CRAHAirFlowMsg:
      name: CRAHAirFlowMsg
      title: CRAH AirFlow Metadata
      payload:
        $ref: '#/components/schemas/CRAHAirFlowMetadata'

    CRAHAirPressureMsg:
      name: CRAHAirPressureMsg
      title: CRAH AirPressure Metadata
      payload:
        $ref: '#/components/schemas/CRAHAirPressureMetadata'

    CRACLiquidTemperatureMsg:
      name: CRACLiquidTemperatureMsg
      title: CRAC LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/CRACLiquidTemperatureMetadata'

    CRACLiquidDifferentialPressureMsg:
      name: CRACLiquidDifferentialPressureMsg
      title: CRAC LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CRACLiquidDifferentialPressureMetadata'

    CRACLiquidFlowMsg:
      name: CRACLiquidFlowMsg
      title: CRAC LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/CRACLiquidFlowMetadata'

    CRACLiquidPressureMsg:
      name: CRACLiquidPressureMsg
      title: CRAC LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/CRACLiquidPressureMetadata'

    CRACStatusMsg:
      name: CRACStatusMsg
      title: CRAC Status Metadata
      payload:
        $ref: '#/components/schemas/CRACStatusMetadata'

    CRACAvailableMsg:
      name: CRACAvailableMsg
      title: CRAC Available Metadata
      payload:
        $ref: '#/components/schemas/CRACAvailableMetadata'

    CRACValvePositionMsg:
      name: CRACValvePositionMsg
      title: CRAC ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/CRACValvePositionMetadata'

    CRACPumpSpeedMsg:
      name: CRACPumpSpeedMsg
      title: CRAC PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/CRACPumpSpeedMetadata'

    CRACFanSpeedMsg:
      name: CRACFanSpeedMsg
      title: CRAC FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/CRACFanSpeedMetadata'

    CRACDamperPositionMsg:
      name: CRACDamperPositionMsg
      title: CRAC DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/CRACDamperPositionMetadata'

    CRACAirTemperatureMsg:
      name: CRACAirTemperatureMsg
      title: CRAC AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/CRACAirTemperatureMetadata'

    CRACAirDifferentialPressureMsg:
      name: CRACAirDifferentialPressureMsg
      title: CRAC AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/CRACAirDifferentialPressureMetadata'

    CRACAirFlowMsg:
      name: CRACAirFlowMsg
      title: CRAC AirFlow Metadata
      payload:
        $ref: '#/components/schemas/CRACAirFlowMetadata'

    CRACAirPressureMsg:
      name: CRACAirPressureMsg
      title: CRAC AirPressure Metadata
      payload:
        $ref: '#/components/schemas/CRACAirPressureMetadata'

    AHULiquidTemperatureMsg:
      name: AHULiquidTemperatureMsg
      title: AHU LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/AHULiquidTemperatureMetadata'

    AHULiquidDifferentialPressureMsg:
      name: AHULiquidDifferentialPressureMsg
      title: AHU LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/AHULiquidDifferentialPressureMetadata'

    AHULiquidFlowMsg:
      name: AHULiquidFlowMsg
      title: AHU LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/AHULiquidFlowMetadata'

    AHULiquidPressureMsg:
      name: AHULiquidPressureMsg
      title: AHU LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/AHULiquidPressureMetadata'

    AHUStatusMsg:
      name: AHUStatusMsg
      title: AHU Status Metadata
      payload:
        $ref: '#/components/schemas/AHUStatusMetadata'

    AHUAvailableMsg:
      name: AHUAvailableMsg
      title: AHU Available Metadata
      payload:
        $ref: '#/components/schemas/AHUAvailableMetadata'

    AHUValvePositionMsg:
      name: AHUValvePositionMsg
      title: AHU ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/AHUValvePositionMetadata'

    AHUPumpSpeedMsg:
      name: AHUPumpSpeedMsg
      title: AHU PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/AHUPumpSpeedMetadata'

    AHUFanSpeedMsg:
      name: AHUFanSpeedMsg
      title: AHU FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/AHUFanSpeedMetadata'

    AHUDamperPositionMsg:
      name: AHUDamperPositionMsg
      title: AHU DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/AHUDamperPositionMetadata'

    AHUAirTemperatureMsg:
      name: AHUAirTemperatureMsg
      title: AHU AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/AHUAirTemperatureMetadata'

    AHUAirDifferentialPressureMsg:
      name: AHUAirDifferentialPressureMsg
      title: AHU AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/AHUAirDifferentialPressureMetadata'

    AHUAirFlowMsg:
      name: AHUAirFlowMsg
      title: AHU AirFlow Metadata
      payload:
        $ref: '#/components/schemas/AHUAirFlowMetadata'

    AHUAirPressureMsg:
      name: AHUAirPressureMsg
      title: AHU AirPressure Metadata
      payload:
        $ref: '#/components/schemas/AHUAirPressureMetadata'

    ChillerLiquidTemperatureMsg:
      name: ChillerLiquidTemperatureMsg
      title: Chiller LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/ChillerLiquidTemperatureMetadata'

    ChillerLiquidDifferentialPressureMsg:
      name: ChillerLiquidDifferentialPressureMsg
      title: Chiller LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/ChillerLiquidDifferentialPressureMetadata'

    ChillerLiquidFlowMsg:
      name: ChillerLiquidFlowMsg
      title: Chiller LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/ChillerLiquidFlowMetadata'

    ChillerLiquidPressureMsg:
      name: ChillerLiquidPressureMsg
      title: Chiller LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/ChillerLiquidPressureMetadata'

    ChillerStatusMsg:
      name: ChillerStatusMsg
      title: Chiller Status Metadata
      payload:
        $ref: '#/components/schemas/ChillerStatusMetadata'

    ChillerAvailableMsg:
      name: ChillerAvailableMsg
      title: Chiller Available Metadata
      payload:
        $ref: '#/components/schemas/ChillerAvailableMetadata'

    ChillerValvePositionMsg:
      name: ChillerValvePositionMsg
      title: Chiller ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/ChillerValvePositionMetadata'

    ChillerPumpSpeedMsg:
      name: ChillerPumpSpeedMsg
      title: Chiller PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/ChillerPumpSpeedMetadata'

    ChillerFanSpeedMsg:
      name: ChillerFanSpeedMsg
      title: Chiller FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/ChillerFanSpeedMetadata'

    ChillerDamperPositionMsg:
      name: ChillerDamperPositionMsg
      title: Chiller DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/ChillerDamperPositionMetadata'

    ChillerAirTemperatureMsg:
      name: ChillerAirTemperatureMsg
      title: Chiller AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/ChillerAirTemperatureMetadata'

    ChillerAirDifferentialPressureMsg:
      name: ChillerAirDifferentialPressureMsg
      title: Chiller AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/ChillerAirDifferentialPressureMetadata'

    ChillerAirFlowMsg:
      name: ChillerAirFlowMsg
      title: Chiller AirFlow Metadata
      payload:
        $ref: '#/components/schemas/ChillerAirFlowMetadata'

    ChillerAirPressureMsg:
      name: ChillerAirPressureMsg
      title: Chiller AirPressure Metadata
      payload:
        $ref: '#/components/schemas/ChillerAirPressureMetadata'
    GenericEquipmentPointMsg:
      name: GenericEquipmentPointMsg
      title: GenericEquipment GenericPoint Metadata
      payload:
        $ref: '#/components/schemas/GenericEquipmentPointMetadata'

    # Generic PowerMeter
    GenericPowerMeterPointMsg:
      name: GenericPowerMeterPointMsg
      title: PowerMeter GenericPoint Metadata
      payload:
        $ref: '#/components/schemas/GenericPowerMeterPointMetadata'

    # Tank
    TankLiquidTemperatureMsg:
      name: TankLiquidTemperatureMsg
      title: Tank LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/TankLiquidTemperatureMetadata'

    TankLiquidDifferentialPressureMsg:
      name: TankLiquidDifferentialPressureMsg
      title: Tank LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/TankLiquidDifferentialPressureMetadata'

    TankLiquidFlowMsg:
      name: TankLiquidFlowMsg
      title: Tank LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/TankLiquidFlowMetadata'

    TankLiquidPressureMsg:
      name: TankLiquidPressureMsg
      title: Tank LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/TankLiquidPressureMetadata'

    TankStatusMsg:
      name: TankStatusMsg
      title: Tank Status Metadata
      payload:
        $ref: '#/components/schemas/TankStatusMetadata'

    TankAvailableMsg:
      name: TankAvailableMsg
      title: Tank Available Metadata
      payload:
        $ref: '#/components/schemas/TankAvailableMetadata'

    TankValvePositionMsg:
      name: TankValvePositionMsg
      title: Tank ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/TankValvePositionMetadata'

    TankPumpSpeedMsg:
      name: TankPumpSpeedMsg
      title: Tank PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/TankPumpSpeedMetadata'

    TankFanSpeedMsg:
      name: TankFanSpeedMsg
      title: Tank FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/TankFanSpeedMetadata'

    TankDamperPositionMsg:
      name: TankDamperPositionMsg
      title: Tank DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/TankDamperPositionMetadata'

    TankAirTemperatureMsg:
      name: TankAirTemperatureMsg
      title: Tank AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/TankAirTemperatureMetadata'

    TankAirDifferentialPressureMsg:
      name: TankAirDifferentialPressureMsg
      title: Tank AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/TankAirDifferentialPressureMetadata'

    TankAirFlowMsg:
      name: TankAirFlowMsg
      title: Tank AirFlow Metadata
      payload:
        $ref: '#/components/schemas/TankAirFlowMetadata'

    TankAirPressureMsg:
      name: TankAirPressureMsg
      title: Tank AirPressure Metadata
      payload:
        $ref: '#/components/schemas/TankAirPressureMetadata'

    # GenericObject
    GenericObjectLiquidTemperatureMsg:
      name: GenericObjectLiquidTemperatureMsg
      title: GenericObject LiquidTemperature Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLiquidTemperatureMetadata'

    GenericObjectLiquidDifferentialPressureMsg:
      name: GenericObjectLiquidDifferentialPressureMsg
      title: GenericObject LiquidDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLiquidDifferentialPressureMetadata'

    GenericObjectLiquidFlowMsg:
      name: GenericObjectLiquidFlowMsg
      title: GenericObject LiquidFlow Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLiquidFlowMetadata'

    GenericObjectLiquidPressureMsg:
      name: GenericObjectLiquidPressureMsg
      title: GenericObject LiquidPressure Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLiquidPressureMetadata'

    GenericObjectStatusMsg:
      name: GenericObjectStatusMsg
      title: GenericObject Status Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectStatusMetadata'

    GenericObjectAvailableMsg:
      name: GenericObjectAvailableMsg
      title: GenericObject Available Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAvailableMetadata'

    GenericObjectValvePositionMsg:
      name: GenericObjectValvePositionMsg
      title: GenericObject ValvePosition Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectValvePositionMetadata'

    GenericObjectPumpSpeedMsg:
      name: GenericObjectPumpSpeedMsg
      title: GenericObject PumpSpeed Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectPumpSpeedMetadata'

    GenericObjectFanSpeedMsg:
      name: GenericObjectFanSpeedMsg
      title: GenericObject FanSpeed Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectFanSpeedMetadata'

    GenericObjectDamperPositionMsg:
      name: GenericObjectDamperPositionMsg
      title: GenericObject DamperPosition Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectDamperPositionMetadata'

    GenericObjectAirTemperatureMsg:
      name: GenericObjectAirTemperatureMsg
      title: GenericObject AirTemperature Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAirTemperatureMetadata'

    GenericObjectAirDifferentialPressureMsg:
      name: GenericObjectAirDifferentialPressureMsg
      title: GenericObject AirDifferentialPressure Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAirDifferentialPressureMetadata'

    GenericObjectAirFlowMsg:
      name: GenericObjectAirFlowMsg
      title: GenericObject AirFlow Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAirFlowMetadata'

    GenericObjectAirPressureMsg:
      name: GenericObjectAirPressureMsg
      title: GenericObject AirPressure Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectAirPressureMetadata'

    GenericObjectLiquidTemperatureSpRequestMsg:
      name: GenericObjectLiquidTemperatureSpRequestMsg
      title: GenericObject LiquidTemperatureSpRequest Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectLiquidTemperatureSpRequestMetadata'

    GenericObjectSoundMsg:
      name: GenericObjectSoundMsg
      title: GenericObject Sound Metadata
      payload:
        $ref: '#/components/schemas/GenericObjectSoundMetadata'

  schemas:

    # =========================================================================
    # SECTION 1 — Primitive building-block schemas
    #
    # Every field in an allOf/oneOf is a named $ref — no anonymous schemas.
    # Naming convention:
    #   *Identifiers  — the object-identity fields added by a base schema
    #   *Fields       — the pointType-specific fields (pointType enum + engUnit)
    #   *Mode         — a oneOf variant for identifier selection (named-object or associate)
    #   *CommonFields — optional fields shared across a category
    # =========================================================================

    # -------------------------------------------------------------------------
    # 1a. Shared primitives
    # -------------------------------------------------------------------------

    MetadataBase:
      type: object
      description: Minimum fields present on every metadata message.
      required:
        - objectType
        - pointType
      properties:
        objectType:
          type: string
          description: Canonical object type. Matches the objectType MQTT topic segment.
        pointType:
          type: string
          description: Canonical point type. Matches the pointType MQTT topic segment.

    IntegrationPublisherFields:
      type: object
      description: >
        Fields added to metadata for integration-published points. Integrations
        MUST publish values to the exact topic corresponding to `integration` — do not construct it
        independently.
      required:
        - integration
      properties:
        integration:
          type: string
          description: Integration identifier responsible for publishing this value.

    StateTextField:
      type: object
      description: Required for state/status/alarm points that carry no engineering unit.
      required:
        - stateText
      properties:
        stateText:
          type: array
          description: >
            State label mapping. Each entry maps a numeric state value to its
            human-readable label (e.g., `[{value: 0, text: "Off"}, {value: 1, text: "On"}]`).
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false

    EquipmentPointEngUnit:
      type: object
      description: Requires a non-empty engUnit string (mutually exclusive with stateText).
      required:
        - engUnit
      properties:
        engUnit:
          type: string
          description: Engineering unit for the measurement.

    EquipmentMeasurementModeBase:
      description: >
        Base for equipment measurement metadata. Two independent XOR constraints apply:
        - Identifier: named-object mode (objectName + objectId required,
          associateId prohibited) XOR associate mode (associateId required, no objectName/objectId).
        - Measurement: engUnit required XOR stateText required.
        These two constraints are fully independent — all four combinations are valid.
        Combines MetadataBase, EquipmentCommonFields, and both independent oneOf constraints.
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/EquipmentCommonFields'
        - oneOf:
            - $ref: '#/components/schemas/EquipmentNamedObjectMode'
            - $ref: '#/components/schemas/EquipmentAssociateMode'
        - oneOf:
            - $ref: '#/components/schemas/EquipmentPointEngUnit'
            - $ref: '#/components/schemas/StateTextField'

    # -------------------------------------------------------------------------
    # 1b. Rack identifier fragment
    # -------------------------------------------------------------------------

    rackLocationIdentifiers:
      type: object
      description: Rack-specific identifier fields added to all Rack metadata messages.
      required:
        - rackLocationName
        - rackLocationId
      properties:
        rackLocationName:
          type: string
          description: Human-readable rack name as defined by the BMS.
        rackLocationId:
          type: string
          description: Stable unique identifier for the rack.

    # -------------------------------------------------------------------------
    # 1c. PowerMeter identifier fragment
    # -------------------------------------------------------------------------

    PowerMeterIdentifiers:
      type: object
      description: PowerMeter-specific identifier fields added to all PowerMeter metadata messages.
      required:
        - objectName
        - objectId
        - servesId
      properties:
        objectName:
          type: string
          description: Human-readable name of the electrical device.
        objectId:
          type: string
          description: Stable unique identifier for the electrical device.
        servesId:
          type: array
          items:
            type: string
          description: List of objectIds of entities served by this power meter.

    # -------------------------------------------------------------------------
    # 1d. Generic Equipment identifier fragments
    # -------------------------------------------------------------------------

    EquipmentCommonFields:
      type: object
      description: >
        Optional fields common to all generic equipment metadata, regardless
        of identifier mode.
      properties:
        processArea:
          type: array
          items:
            type: string
          description: >
            List of process areas or sub-system locations within the
            equipment

    EquipmentNamedObjectMode:
      type: object
      description: |
        **Object Mode**: use when the object is identified directly
        by name and ID.

        - `objectName` and `objectId` are **required**.
        - `servesId` is **optional** in Named-object mode.
        - `associateId` must **not** be present.

        Incompatible with `EquipmentAssociateMode` — validators enforce this via
        the parent `oneOf`.
      required:
        - objectName
        - objectId
      properties:
        objectName:
          type: string
          description: Human-readable equipment name.
        objectId:
          type: string
          description: Stable unique identifier for the equipment.
        servesId:
          type: array
          items:
            type: string
          description: >
            Optional list of objectIds of entities this equipment serves. Only valid in Named-object mode.
            Only valid in Named-object mode — must not appear in Associate mode.
      not:
        properties:
          associateId:
            type: string
        required:
          - associateId

    EquipmentAssociateMode:
      type: object
      description: |
        *Associate Mode*: use when the object is referenced via an
        association identifier.

        - `associateId` is **required**.
        - `objectName`, `objectId`, and `servesId` must **not** be present.

        Incompatible with `EquipmentNamedObjectMode` — validators enforce this
        via the parent `oneOf`.
      required:
        - associateId
      properties:
        associateId:
          type: string
          description: Identifier of the associated entity.
      not:
        anyOf:
          - properties:
              objectName:
                type: string
            required:
              - objectName
          - properties:
              objectId:
                type: string
            required:
              - objectId
          - properties:
              servesId:
                type: array
                items:
                  type: string
            required:
              - servesId

    EquipmentIntegrationIdentifierFields:
      type: object
      description: >
        Extends EquipmentIntegrationMetadataBase: adds `integration` for integration-published equipment points.
      required:
        - integration
      properties:
        integration:
          type: string
          description: Integration responsible for publishing this value.

    # -------------------------------------------------------------------------
    # 1e. System identifier fragments
    # -------------------------------------------------------------------------

    SystemIntegrationIdentifiers:
      type: object
      description: >
        Required `integration` field for integration-published System
        metadata messages.
      required:
        - integration
      properties:
        integration:
          type: string
          description: Integration identifier.

    # =========================================================================
    # SECTION 2 — Composed base schemas
    #
    # Each allOf element is a named $ref — no anonymous schemas.
    # =========================================================================

    RackMetadataBase:
      description: >
        Composed base for all BMS-published Rack metadata messages.
        Combines MetadataBase with rackLocationIdentifiers.
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/rackLocationIdentifiers'

    RackIntegrationMetadataBase:
      description: >
        Composed base for Integration-published Rack metadata messages.
        Extends RackMetadataBase with IntegrationPublisherFields.
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/IntegrationPublisherFields'

    PowerMeterMetadataBase:
      description: >
        Composed base for all PowerMeter metadata messages.
        Combines MetadataBase with PowerMeterIdentifiers.
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/PowerMeterIdentifiers'

    EquipmentMetadataBase:
      description: |
        Composed base for all generic equipment metadata.

        Combines MetadataBase + EquipmentCommonFields + exactly one identifier
        mode from the `oneOf`:
        - **ObjectMode**: objectName + objectId required,
          servesId optional, associateId prohibited.
        - **Associate Mode**: associateId required, all name/id/serves
          fields prohibited.
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/EquipmentCommonFields'
        - oneOf:
            - $ref: '#/components/schemas/EquipmentNamedObjectMode'
            - $ref: '#/components/schemas/EquipmentAssociateMode'

    EquipmentIntegrationMetadataBase:
      description: >
        Extends EquipmentMetadataBase for integration-published equipment points.
        Adds EquipmentIntegrationIdentifierFields (integration required).
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/EquipmentIntegrationIdentifierFields'

    SystemIntegrationMetadataBase:
      description: >
        Composed base for Integration-published System metadata messages.
        Combines MetadataBase with SystemIntegrationIdentifiers.
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/SystemIntegrationIdentifiers'

    # =========================================================================
    # SECTION 3 — PointType enum schemas (for code generation / validation)
    # =========================================================================

    RackBmsPointType:
      type: string
      description: Valid pointType values for BMS-published Rack points.
      enum:
        - RackLiquidSupplyTemperature
        - RackLiquidReturnTemperature
        - RackLiquidFlow
        - RackLiquidDifferentialPressure
        - RackLiquidDifferentialPressureSp
        - RackControlValvePosition
        - RackPower
        - RackLeakDetect
        - RackLeakSensorFault
        - RackLiquidIsolationStatus
        - RackElectricalIsolationStatus

    RackIntegrationPointType:
      type: string
      description: Valid pointType values for Integration-published Rack points.
      enum:
        - RackLeakDetectTray
        - RackLiquidIsolationRequest
        - RackElectricalIsolationRequest

    PowerMeterPointType:
      type: string
      description: Valid pointType values for PowerMeter points (all BMS-published).
      enum:
        - Voltage
        - PowerFactor
        - Frequency
        - ApparentPower
        - ActivePower
        - Current
        - CurrentLimit
        - PhaseCurrent

    EquipmentBmsPointType:
      type: string
      description: Valid pointType values for BMS-published generic equipment points.
      enum:
        - LiquidTemperature
        - LiquidDifferentialPressure
        - LiquidFlow
        - LiquidPressure
        - Status
        - Available
        - ValvePosition
        - PumpSpeed
        - FanSpeed
        - DamperPosition
        - AirTemperature
        - AirDifferentialPressure
        - AirFlow
        - AirPressure
        - Sound
        - GenericPoint

    EquipmentIntegrationPointType:
      type: string
      description: Valid pointType values for Integration-published generic equipment points.
      enum:
        - LiquidTemperatureSpRequest

    EquipmentObjectType:
      type: string
      description: Valid objectType values for generic equipment channels.
      enum:
        - CDU
        - CoolingTower
        - HX
        - CRAH
        - CRAC
        - AHU
        - Chiller
        - BESS
        - UPS
        - ATS
        - Generator
        - Shunt
        - Breaker
        - Valve
        - Pump
        - Fan
        - Damper
        - Sensor
        - Tank
        - GenericObject

    SystemBmsPointType:
      type: string
      description: Valid pointType values for BMS-published System points.
      enum:
        - HeartbeatTimestampBms
        - HeartbeatEchoBms
        - Status
        - Available
        - GenericPoint

    SystemIntegrationPointType:
      type: string
      description: Valid pointType values for Integration-published System points.
      enum:
        - HeartbeatTimestampIntegration
        - HeartbeatEchoIntegration

    # =========================================================================
    # SECTION 4 — Per-pointType field fragments
    #
    # Each fragment captures only what differs per pointType:
    # a pointType enum constraint and (where applicable) an engUnit enum.
    # These are referenced as the second allOf element in each *Metadata schema.
    # =========================================================================

    # --- Rack fields ---------------------------------------------------------

    RackLiquidSupplyTemperatureFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackLiquidSupplyTemperature]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: [C]

    RackLiquidReturnTemperatureFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackLiquidReturnTemperature]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: [C]

    RackLiquidFlowFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackLiquidFlow]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: [LPM]

    RackLiquidDifferentialPressureFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackLiquidDifferentialPressure]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: [kPa]

    RackControlValvePositionFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackControlValvePosition]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: ['%']

    RackPowerFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackPower]
        objectType:
            type: string
            enum: [Rack]
        engUnit:
          type: string
          enum: [kW]

    RackLeakDetectFields:
      type: object
      description: '0 = No Leak, 1 = Leak. No engUnit.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackLeakDetect]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for leak detection.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoLeak"
              - value: 1
                text: "Leak"

    RackLeakSensorFaultFields:
      type: object
      description: '0 = No Fault, 1 = Fault. No engUnit.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackLeakSensorFault]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for leak sensor fault status.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoFault"
              - value: 1
                text: "Fault"

    RackLiquidIsolationStatusFields:
      type: object
      description: '0=NotIsolated, 1=Isolated. No engUnit.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackLiquidIsolationStatus]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for liquid isolation status.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NotIsolated"
              - value: 1
                text: "Isolated"

    RackElectricalIsolationStatusFields:
      type: object
      description: '0 = NotIsolated, 1 = Isolated. No engUnit.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackElectricalIsolationStatus]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for electrical isolation status.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NotIsolated"
              - value: 1
                text: "Isolated"

    RackLeakDetectTrayFields:
      type: object
      description: '0 = No Leak, 1 = Leak (tray sensor). No engUnit. Integration-published value.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackLeakDetectTray]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for tray leak detection.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoLeak"
              - value: 1
                text: "Leak"

    RackLiquidIsolationRequestFields:
      type: object
      description: '0 = Not Requested, 1 = Requested, -1 = Unknown. Integration-published value.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackLiquidIsolationRequest]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for liquid isolation request.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoIsolationRequested"
              - value: 1
                text: "IsolationRequested"

    RackElectricalIsolationRequestFields:
      type: object
      description: '0 = Not Requested, 1 = Requested. Integration-published value.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [RackElectricalIsolationRequest]
        objectType:
            type: string
            enum: [Rack]
        stateText:
          type: array
          description: >
            State label mapping for electrical isolation request.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoIsolationRequested"
              - value: 1
                text: "IsolationRequested"

    # --- PowerMeter fields ---------------------------------------------------

    VoltageFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [Voltage]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [V]

    PowerFactorFields:
      type: object
      description: Dimensionless 0–1. engUnit not required.
      properties:
        pointType:
          type: string
          enum: [PowerFactor]
        objectType:
          type: string
          enum: [PowerMeter]

    FrequencyFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [Frequency]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [Hz]

    ApparentPowerFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [ApparentPower]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [kVA]

    ActivePowerFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [ActivePower]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [kW]

    CurrentFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [Current]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [A]

    CurrentLimitFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [CurrentLimit]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [A]

    PhaseCurrentFields:
      type: object
      description: >
        PhaseCurrent additionally requires `phase` to identify which electrical
        phase. Accepts letter form (A, B, C) or numeric form (1, 2, 3); both
        are valid representations of the same three-phase system.
        3 metadata messages per meter, one per phase.
      required:
        - engUnit
        - phase
      properties:
        pointType:
          type: string
          enum: [PhaseCurrent]
        objectType:
          type: string
          enum: [PowerMeter]
        engUnit:
          type: string
          #enum: [A]
        phase:
          type: string
          enum: [A, B, C, "1", "2", "3"]
          description: >
            Electrical phase identifier. Letter form (A/B/C) and numeric form
            (1/2/3) are both accepted to align with publisher conventions.

    # --- Generic Equipment fields --------------------------------------------
    # engUnit enums reflect common industry standards.
    # Verify with BMS configuration for site-specific values.

    LiquidTemperatureFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [LiquidTemperature]
        engUnit:
          type: string
          enum: [C]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    LiquidDifferentialPressureFields:
      type: object
      description: >
        Measurement fields for LiquidDifferentialPressure. Typical engUnit: kPa.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [LiquidDifferentialPressure]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    LiquidFlowFields:
      type: object
      description: >
        Measurement fields for LiquidFlow. Typical engUnit: LPM.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [LiquidFlow]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    LiquidPressureFields:
      type: object
      description: >
        Measurement fields for LiquidPressure. Typical engUnit: kPa.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [LiquidPressure]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    StatusFields:
      type: object
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [Status]
        integration:
          type: string
          description: >
            Optional integration identifier. When present, this integration
            is responsible for publishing the value for this point.
        stateText:
          type: array
          description: >
            State label mapping for operating status (values vary by equipment vendor).
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NotOperating"
              - value: 1
                text: "Operating"

    AvailableFields:
      type: object
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [Available]
        integration:
          type: string
          description: >
            Optional integration identifier. When present, this integration
            is responsible for publishing the value for this point.
        stateText:
          type: array
          description: >
            State label mapping for availability status (values vary by equipment vendor).
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NotAvailable"
              - value: 1
                text: "Available"

    ValvePositionFields:
      type: object
      description: >
        Measurement fields for ValvePosition. Typical engUnit: %.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [ValvePosition]

    PumpSpeedFields:
      type: object
      description: >
        Measurement fields for PumpSpeed. Typical engUnit: RPM.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [PumpSpeed]

    FanSpeedFields:
      type: object
      description: >
        Measurement fields for FanSpeed. Typical engUnit: RPM.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [FanSpeed]

    DamperPositionFields:
      type: object
      description: >
        Measurement fields for DamperPosition. Typical engUnit: %.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [DamperPosition]

    AirTemperatureFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [AirTemperature]
        engUnit:
          type: string
          enum: [C]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    AirDifferentialPressureFields:
      type: object
      description: >
        Measurement fields for AirDifferentialPressure. Typical engUnit: Pa.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [AirDifferentialPressure]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    AirFlowFields:
      type: object
      description: >
        Measurement fields for AirFlow. Typical engUnit: CFM.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [AirFlow]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    AirPressureFields:
      type: object
      description: >
        Measurement fields for AirPressure. Typical engUnit: Pa.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [AirPressure]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).
    LeakDetectFields:
      type: object
      description: '0 = No Leak, 1 = Leak. No engUnit.'
      required:
        - stateText
      properties:
        pointType:
          type: string
          enum: [LeakDetect]
        stateText:
          type: array
          description: >
            State label mapping for leak detection.
          items:
            type: object
            required: [value, text]
            properties:
              value:
                type: integer
                description: Numeric state value.
              text:
                type: string
                description: Human-readable label for this state.
            additionalProperties: false
          examples:
            -
              - value: 0
                text: "NoLeak"
              - value: 1
                text: "Leak"

    AirRelativeHumidityFields:
      type: object
      description: >
        Measurement fields for AirRelativeHumidity. Typical engUnit: %RH.
        The identifier (named-object XOR associate) and measurement (engUnit XOR stateText)
        constraints are independent and enforced by EquipmentMeasurementModeBase.
      properties:
        pointType:
          type: string
          enum: [AirRelativeHumidity]
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).

    LiquidTemperatureSpRequestFields:
      type: object
      description: >
        Setpoint request written by an integration (e.g., MEPAI) to a CDU.
        BMS publishes metadata; the integration publishes the value to respective value topic namespace identified by `integration`
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [LiquidTemperatureSpRequest]
        objectType:
          type: string
          enum: [CDU]
        engUnit:
          type: string
          enum: [C]

    GenericObjectLiquidTemperatureSpRequestFields:
      type: object
      description: >
        Setpoint request for a GenericObject. BMS publishes metadata;
        the integration publishes the value to the derived topic.
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [LiquidTemperatureSpRequest]
        objectType:
          type: string
          enum: [GenericObject]
        engUnit:
          type: string
          enum: [C]

    SoundFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [Sound]
        engUnit:
          type: string
          # enum: [dB]

    # --- System / Heartbeat point-type fields --------------------------------

    HeartbeatTimestampBmsFields:
      type: object
      description: >
        BMS-published heartbeat timestamp. The BMS publishes its own
        timestamp every 10 s; one instance globally, consumed by all
        connected integrations. `objectName` and `objectId` identify the
        BMS itself (the publisher). The `integration` field is NOT used
        on this point — `integration` is reserved for value-publisher
        identity, and the BMS is the publisher here. `scope` optionally
        identifies which MQTT topics this heartbeat covers.
      required:
        - objectName
        - objectId
      properties:
        pointType:
          type: string
          enum: [HeartbeatTimestampBms]
        objectName:
          type: string
          description: Human-readable name of the BMS publishing this heartbeat.
        objectId:
          type: string
          description: >
            Stable identifier for the BMS publishing this heartbeat
            (e.g., `"BMS"`). One instance per BMS.
        scope:
          type: string
          description: Identifies which MQTT topics this heartbeat covers.

    HeartbeatEchoBmsFields:
      type: object
      description: >
        BMS echoes back the timestamp received from a specific integration.
        Published by the BMS (one instance per connected integration). The
        integration whose timestamp is being echoed is identified by
        `objectName` and `objectId` — by convention, `objectId` matches
        the same string used as that integration's `integration`
        metadata value on its other points (e.g., `objectId: "MEPAI1"`).
        The `integration` field is intentionally NOT present on this
        point: `integration` denotes the value-publisher elsewhere in
        the spec, and the BMS is the publisher here. The integration
        being echoed is encoded in `objectId`, not in `integration`.
        `scope` optionally identifies which BMS MQTT-client/topic
        namespace this echo is associated with — used when the BMS
        runs multiple MQTT clients connected to DSX Exchange.
      required:
        - objectName
        - objectId
      properties:
        pointType:
          type: string
          enum: [HeartbeatEchoBms]
        objectName:
          type: string
          description: >
            Human-readable name of the integration whose timestamp is
            being echoed.
        objectId:
          type: string
          description: >
            Stable identifier of the integration whose timestamp is
            being echoed (e.g., `"MEPAI1"`). Matches that integration's
            `integration` metadata value on its other points.
        scope:
          type: string
          description: >
            Optional. Identifies which BMS MQTT-client/topic namespace
            this echo is associated with.

    HeartbeatTimestampIntegrationFields:
      type: object
      description: >
        Integration-published heartbeat timestamp. Each connected
        integration publishes its own timestamp every 10 s; one instance
        per integration. `objectName` and `objectId` identify the
        integration publishing this heartbeat. By convention, `objectId`
        matches the same string used as this integration's `integration`
        metadata value on its other points (e.g., `objectId: "MEPAI1"` with
        `integration: "MEPAI1"`). The `integration` field is required via
        the integration metadata base and drives the value topic.
      required:
        - objectName
        - objectId
      properties:
        pointType:
          type: string
          enum: [HeartbeatTimestampIntegration]
        objectName:
          type: string
          description: >
            Human-readable name of the integration publishing this
            heartbeat.
        objectId:
          type: string
          description: >
            Stable identifier of the integration publishing this
            heartbeat (e.g., `"MEPAI1"`). By convention, matches the
            `integration` metadata value used by this integration on
            its other points.

    HeartbeatEchoIntegrationFields:
      type: object
      description: >
        Integration echoes the BMS timestamp. Each integration publishes
        its own echo of the BMS timestamp, allowing the BMS to confirm
        round-trip with that specific integration (one instance per
        connected integration). The BMS whose timestamp is being echoed
        is identified by `objectName` and `objectId`
        (e.g., `objectId: "BMS"`). The `integration` field is required via
        the integration metadata base and drives the value topic.
      required:
        - objectName
        - objectId
      properties:
        pointType:
          type: string
          enum: [HeartbeatEchoIntegration]
        objectName:
          type: string
          description: >
            Human-readable name of the BMS whose timestamp is being echoed.
        objectId:
          type: string
          description: >
            Stable identifier of the BMS whose timestamp is being
            echoed (e.g., `"BMS"`).

    # =========================================================================
    # SECTION 5 — Fully composed per-pointType metadata schemas
    #
    # Each schema = base $ref + fields $ref, both named.
    # No anonymous schemas anywhere in the allOf arrays.
    # =========================================================================

    # --- Rack — BMS published ------------------------------------------------

    RackLiquidSupplyTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidSupplyTemperatureFields'
      unevaluatedProperties: false

    RackLiquidReturnTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidReturnTemperatureFields'
      unevaluatedProperties: false

    RackLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidFlowFields'
      unevaluatedProperties: false

    RackLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidDifferentialPressureFields'
      unevaluatedProperties: false

    RackLiquidDifferentialPressureSpFields:
      type: object
      required: [engUnit]
      properties:
        pointType:
          type: string
          enum: [RackLiquidDifferentialPressureSp]
        objectType:
          type: string
          enum: [Rack]
        engUnit:
          type: string
          enum: [kPa]
        isSetpoint:
          type: boolean
          description: >
            Optional inclusion. Indicates this point is a target value written to control equipment behavior.

    RackLiquidDifferentialPressureSpMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidDifferentialPressureSpFields'
      unevaluatedProperties: false

    RackControlValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackControlValvePositionFields'
      unevaluatedProperties: false

    RackPowerMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackPowerFields'
      unevaluatedProperties: false

    RackLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLeakDetectFields'
      unevaluatedProperties: false

    RackLeakSensorFaultMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLeakSensorFaultFields'
      unevaluatedProperties: false

    RackLiquidIsolationStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackLiquidIsolationStatusFields'
      unevaluatedProperties: false

    RackElectricalIsolationStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/RackMetadataBase'
        - $ref: '#/components/schemas/RackElectricalIsolationStatusFields'
      unevaluatedProperties: false

    # --- Rack — Integration published ----------------------------------------

    RackLeakDetectTrayMetadata:
      allOf:
        - $ref: '#/components/schemas/RackIntegrationMetadataBase'
        - $ref: '#/components/schemas/RackLeakDetectTrayFields'
      unevaluatedProperties: false

    RackLiquidIsolationRequestMetadata:
      allOf:
        - $ref: '#/components/schemas/RackIntegrationMetadataBase'
        - $ref: '#/components/schemas/RackLiquidIsolationRequestFields'
      unevaluatedProperties: false

    RackElectricalIsolationRequestMetadata:
      allOf:
        - $ref: '#/components/schemas/RackIntegrationMetadataBase'
        - $ref: '#/components/schemas/RackElectricalIsolationRequestFields'
      unevaluatedProperties: false

    # --- PowerMeter ----------------------------------------------------------

    PowerMeterVoltageMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/VoltageFields'
      unevaluatedProperties: false

    PowerMeterPowerFactorMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/PowerFactorFields'
      unevaluatedProperties: false

    PowerMeterFrequencyMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/FrequencyFields'
      unevaluatedProperties: false

    PowerMeterApparentPowerMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/ApparentPowerFields'
      unevaluatedProperties: false

    PowerMeterActivePowerMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/ActivePowerFields'
      unevaluatedProperties: false

    PowerMeterCurrentMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/CurrentFields'
      unevaluatedProperties: false

    PowerMeterCurrentLimitMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/CurrentLimitFields'
      unevaluatedProperties: false

    PowerMeterPhaseCurrentMetadata:
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/PhaseCurrentFields'
      unevaluatedProperties: false

    # --- Generic Equipment — BMS published -----------------------------------

    LiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
      unevaluatedProperties: false

    LiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
      unevaluatedProperties: false

    LiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
      unevaluatedProperties: false

    LiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
      unevaluatedProperties: false

    StatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
      unevaluatedProperties: false

    AvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
      unevaluatedProperties: false

    ValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
      unevaluatedProperties: false

    PumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
      unevaluatedProperties: false

    FanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
      unevaluatedProperties: false

    DamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
      unevaluatedProperties: false

    AirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
      unevaluatedProperties: false

    AirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
      unevaluatedProperties: false

    AirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
      unevaluatedProperties: false

    AirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
      unevaluatedProperties: false

    SoundMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/SoundFields'
      unevaluatedProperties: false

    # --- Generic Equipment — Integration published ---------------------------

    LiquidTemperatureSpRequestMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentIntegrationMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureSpRequestFields'
      unevaluatedProperties: false

    # --- System --------------------------------------------------------------

    SystemHeartbeatTimestampBmsMetadata:
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/HeartbeatTimestampBmsFields'
      unevaluatedProperties: false

    SystemHeartbeatEchoBmsMetadata:
      allOf:
        - $ref: '#/components/schemas/MetadataBase'
        - $ref: '#/components/schemas/HeartbeatEchoBmsFields'
      unevaluatedProperties: false

    SystemHeartbeatTimestampIntegrationMetadata:
      allOf:
        - $ref: '#/components/schemas/SystemIntegrationMetadataBase'
        - $ref: '#/components/schemas/HeartbeatTimestampIntegrationFields'
      unevaluatedProperties: false

    SystemHeartbeatEchoIntegrationMetadata:
      allOf:
        - $ref: '#/components/schemas/SystemIntegrationMetadataBase'
        - $ref: '#/components/schemas/HeartbeatEchoIntegrationFields'
      unevaluatedProperties: false

    SystemObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [System]

    SystemStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/SystemObjectTypeFields'
      unevaluatedProperties: false

    SystemAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/SystemObjectTypeFields'
      unevaluatedProperties: false

    # --- Per-objectType objectType field fragments -------------------------
    BESSObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [BESS]

    UPSObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [UPS]

    ATSObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [ATS]

    GeneratorObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Generator]

    ShuntObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Shunt]

    BreakerObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Breaker]

    CDUObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [CDU]

    CoolingTowerObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [CoolingTower]

    HXObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [HX]

    CRAHObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [CRAH]

    CRACObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [CRAC]

    AHUObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [AHU]

    ChillerObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Chiller]

    ValveObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Valve]

    PumpObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Pump]

    FanObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Fan]

    DamperObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Damper]

    SensorObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Sensor]

    TankObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [Tank]

    GenericObjectObjectTypeFields:
      type: object
      properties:
        objectType:
          type: string
          enum: [GenericObject]

    # =========================================================================
    # Per-objectType metadata schemas (objectType constraint for examples)
    # =========================================================================

    BESSStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/BESSObjectTypeFields'
      unevaluatedProperties: false

    BESSAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/BESSObjectTypeFields'
      unevaluatedProperties: false

    UPSStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/UPSObjectTypeFields'
      unevaluatedProperties: false

    UPSAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/UPSObjectTypeFields'
      unevaluatedProperties: false

    ATSStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/ATSObjectTypeFields'
      unevaluatedProperties: false

    ATSAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/ATSObjectTypeFields'
      unevaluatedProperties: false

    GeneratorStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/GeneratorObjectTypeFields'
      unevaluatedProperties: false

    GeneratorAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/GeneratorObjectTypeFields'
      unevaluatedProperties: false

    ShuntStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/ShuntObjectTypeFields'
      unevaluatedProperties: false

    ShuntAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/ShuntObjectTypeFields'
      unevaluatedProperties: false

    BreakerStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/BreakerObjectTypeFields'
      unevaluatedProperties: false

    BreakerAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/BreakerObjectTypeFields'
      unevaluatedProperties: false

    ValveValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/ValveObjectTypeFields'
      unevaluatedProperties: false

    PumpPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/PumpObjectTypeFields'
      unevaluatedProperties: false

    FanFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/FanObjectTypeFields'
      unevaluatedProperties: false

    DamperDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/DamperObjectTypeFields'
      unevaluatedProperties: false

    ValveAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/ValveObjectTypeFields'
      unevaluatedProperties: false

    PumpAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/PumpObjectTypeFields'
      unevaluatedProperties: false

    FanAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/FanObjectTypeFields'
      unevaluatedProperties: false

    DamperAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/DamperObjectTypeFields'
      unevaluatedProperties: false

    SensorAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorSoundMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/SoundFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    SensorAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/SensorObjectTypeFields'
      unevaluatedProperties: false

    CDULiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDULiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDULiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDULiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDULeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CDUAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/CDUObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    CoolingTowerAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/CoolingTowerObjectTypeFields'
      unevaluatedProperties: false

    HXLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    HXAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/HXObjectTypeFields'
      unevaluatedProperties: false

    CRAHLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRAHAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/CRAHObjectTypeFields'
      unevaluatedProperties: false

    CRACLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    CRACAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/CRACObjectTypeFields'
      unevaluatedProperties: false

    AHULiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHULiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHULiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHULiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHULeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    AHUAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/AHUObjectTypeFields'
      unevaluatedProperties: false

    ChillerLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    ChillerAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/ChillerObjectTypeFields'
      unevaluatedProperties: false

    # --- Tank — BMS published ------------------------------------------------

    TankLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    TankAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/TankObjectTypeFields'
      unevaluatedProperties: false

    # --- Tank — Integration published ----------------------------------------

    # --- GenericObject — BMS published ----------------------------------------

    GenericObjectLiquidTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LiquidTemperatureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectLiquidDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidDifferentialPressureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectLiquidFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidFlowFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectLiquidPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/LiquidPressureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectStatusMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/StatusFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAvailableMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AvailableFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectValvePositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/ValvePositionFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectPumpSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/PumpSpeedFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectFanSpeedMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/FanSpeedFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectDamperPositionMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/DamperPositionFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAirTemperatureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/AirTemperatureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAirDifferentialPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirDifferentialPressureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAirFlowMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirFlowFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAirPressureMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirPressureFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectSoundMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/SoundFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectLeakDetectMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/LeakDetectFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    GenericObjectAirRelativeHumidityMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentMeasurementModeBase'
        - $ref: '#/components/schemas/AirRelativeHumidityFields'
        - $ref: '#/components/schemas/GenericObjectObjectTypeFields'
      unevaluatedProperties: false

    # --- GenericObject — Integration published --------------------------------

    GenericObjectLiquidTemperatureSpRequestMetadata:
      allOf:
        - $ref: '#/components/schemas/EquipmentIntegrationMetadataBase'
        - $ref: '#/components/schemas/GenericObjectLiquidTemperatureSpRequestFields'
      unevaluatedProperties: false

    # =========================================================================
    # GenericPoint — field fragment and composed schemas
    # =========================================================================

    GenericPointFields:
      type: object
      description: >
        Field fragment for a vendor-specific or unmapped GenericPoint.
        `processArea` is required.

        `engUnit` and `stateText` are both optional but **mutually exclusive** —
        include at most one. See the two variants below.
      required:
        - processArea
      properties:
        pointType:
          type: string
          enum: [GenericPoint]
        processArea:
          type: array
          items:
            type: string
          description: >
            Required for GenericPoint. Describes the measurement context.
        phase:
          type: string
          enum: [A, B, C, "1", "2", "3"]
          description: >
            Optional electrical phase identifier. Use for phase-specific
            generic measurements on power-capable equipment. Letter form
            (A/B/C) and numeric form (1/2/3) are both accepted.
        integration:
          type: string
          description: >
            Optional integration identifier. When present, this integration
            is responsible for publishing the value for this point.
            The value topic is derived using the standard topic derivation rule.
        isSetpoint:
          type: boolean
          description: >
            Optional. When true, indicates this point is a setpoint (a target
            value written to control equipment behavior).
      anyOf:
        - title: Measurement
          description: >
            Continuous measurement with a known engineering unit.
            When `engUnit` is present, `stateText` must be absent.
          properties:
            engUnit:
              type: string
              description: >
                Engineering unit for the measurement.
          not:
            required: [stateText]
        - title: State
          description: >
            Binary or enumerated state point.
            When `stateText` is present, `engUnit` must be absent.
          properties:
            stateText:
              type: array
              description: >
                State label mapping. Each entry maps a numeric state value to its
                human-readable label (e.g., `[{value: 0, text: "Off"}, {value: 1, text: "On"}]`).
              items:
                type: object
                required: [value, text]
                properties:
                  value:
                    type: integer
                    description: Numeric state value.
                  text:
                    type: string
                    description: Human-readable label for this state.
                additionalProperties: false
          not:
            required: [engUnit]

    GenericEquipmentPointMetadata:
      description: |
        Metadata for a GenericPoint on any generic equipment objectType.

        Follows the standard equipment identifier modes:
        - **Named-object mode**: objectName + objectId required; servesId
          optional; associateId prohibited.
        - **Associate mode**: associateId required; objectName/objectId/servesId
          prohibited.

        Unlike typed points, `engUnit` and `stateText` are both optional.
        `processArea` is required.
      allOf:
        - $ref: '#/components/schemas/EquipmentMetadataBase'
        - $ref: '#/components/schemas/GenericPointFields'
      unevaluatedProperties: false

    GenericPowerMeterPointMetadata:
      description: |
        Metadata for a GenericPoint on PowerMeter equipment.
        Inherits the standard PowerMeter identifiers
        (objectName, objectId, servesId all required).
        `processArea` is required. `engUnit`, `stateText`, `phase`, and
        `integration` are optional.
      allOf:
        - $ref: '#/components/schemas/PowerMeterMetadataBase'
        - $ref: '#/components/schemas/GenericPointFields'
      unevaluatedProperties: false
````