# Generated by scripts/generate_openapi.py — do not edit by hand.
# Source: docs/reference/neohub-api-rev-3.02.md (IMI Heatmiser NeoHub API Rev 3.02)
openapi: 3.1.0
info:
  title: IMI Heatmiser NeoHub API
  version: 3.02
  summary: WebSocket JSON command API for IMI Heatmiser neoHub systems
  description: |
    Unofficial OpenAPI representation of the IMI Heatmiser neoHub API (Rev 3.02 / document header Rev 3.01, released 01/03/2023).
    
    ## Transport
    
    - **Primary:** Secure WebSocket `wss://{host}:4243` with API token auth (Neo App → Settings → Api Access → Tokens).
    - Ignore TLS certificate verification (local self-signed cert).
    - **Discovery:** UDP broadcast `hubseek` to port `19790`.
    - **Legacy:** TCP port `4242` (often disabled on firmware 2153+).
    
    ## Message envelope
    
    Every command is wrapped as:
    
    ```json
    {
      "message_type": "hm_get_command_queue",
      "message": "{\"token\":\"…\",\"COMMANDS\":[{\"COMMAND\":\"{'GET_LIVE_DATA': 0}\",\"COMMANDID\":1}]}"
    }
    ```
    
    The outer frame and nested `message` string are [RFC 8259](https://www.rfc-editor.org/rfc/rfc8259)
    JSON (double-quoted strings). The `COMMAND` **value** is not: Heatmiser requires
    single-quoted pseudo-JSON such as `{'GET_LIVE_DATA': 0}`. RFC 8259 §7 defines JSON
    strings with U+0022 quotation marks; `{"GET_LIVE_DATA":0}` is valid JSON but the
    NeoHub rejects it inside `COMMAND` with `Invalid Json`.
    
    Responses use `message_type: hm_set_command_response` with a stringified JSON `response` field.
    
    ## Related links
    
    - [neoHub smart control](https://www.heatmiser.com/neohub-smart-control/)
    - [IMI Heatmiser Developer Portal](https://dev.heatmiser.com/)
    - [Official NeoHub API PDF](https://dev.heatmiser.com/uploads/short-url/b2K3JopBdu4sjcRz8WC0VYdca3R.pdf)
    
    The original IMI Heatmiser documentation is proprietary; this OpenAPI file is a community mapping for tooling and the heatmiser-neohub client library.
  license:
    name: Documentation derived from proprietary IMI Heatmiser materials
    url: "https://www.heatmiser.com/"
  contact:
    name: IMI Heatmiser Developer Portal
    url: "https://dev.heatmiser.com/"
servers:
  - url: "wss://{host}:4243"
    description: NeoHub WebSocket (TLS verify disabled)
    variables:
      host:
        default: 192.168.0.19
        description: NeoHub IP or hostname on the LAN
tags:
  - name: transport
    description: Connection and framing
  - name: system
    description: Hub system / caches
  - name: devices
    description: "Zones, pairing, accessories"
  - name: zones
    description: Per-zone thermostat controls
  - name: profiles
    description: Comfort and timer profiles
  - name: global
    description: Away / holiday / global lists
  - name: hold
    description: Temporary temperature holds
  - name: timeclock
    description: Timers and neoPlug
  - name: cooling
    description: neoStat HC heating/cooling
  - name: time
    description: "Clock, NTP, DST, timezone"
  - name: engineers
    description: Engineers / feature settings
  - name: groups
    description: Command groups
  - name: recipes
    description: Stored command recipes
  - name: stats
    description: Runtime and temperature logs
  - name: deprecated
    description: Deprecated — avoid in new designs
paths:
  /ws:
    get:
      operationId: connectWebSocket
      tags:
        - transport
      summary: Open persistent WSS connection
      description: |
        Connect to `wss://{host}:4243`. Disable TLS certificate verification (hub uses a locally generated cert). After connect, send `WsRequest` frames and receive `WsResponse` frames.
        
        This path is documentary: OpenAPI cannot execute WebSocket handshakes in Swagger UI.
      parameters:
        - name: host
          in: query
          required: true
          schema:
            type: string
            example: 192.168.0.19
      responses:
        101:
          description: Switching Protocols (WebSocket established)
  /commands/AUTO_MODE_OFF:
    post:
      operationId: command_AUTO_MODE_OFF
      tags:
        - cooling
      summary: Disable automatic fan speed control (neoStat HC)
      deprecated: false
      description: |
        Send NeoHub command `AUTO_MODE_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"AUTO_MODE_OFF": "HCtest"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - AUTO_MODE_OFF
              additionalProperties: false
              properties:
                AUTO_MODE_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              AUTO_MODE_OFF: HCtest
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/AWAY_OFF:
    post:
      operationId: command_AWAY_OFF
      tags:
        - global
      summary: Cancel away mode
      deprecated: false
      description: |
        Send NeoHub command `AWAY_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"AWAY_OFF": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - AWAY_OFF
              additionalProperties: false
              properties:
                AWAY_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              AWAY_OFF: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/AWAY_ON:
    post:
      operationId: command_AWAY_ON
      tags:
        - global
      summary: Enable away mode
      deprecated: false
      description: |
        Send NeoHub command `AWAY_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"AWAY_ON": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - AWAY_ON
              additionalProperties: false
              properties:
                AWAY_ON:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              AWAY_ON: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/BOOST_OFF:
    post:
      operationId: command_BOOST_OFF
      tags:
        - timeclock
      summary: Boost timeclock off for a duration
      deprecated: false
      description: |
        Send NeoHub command `BOOST_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"BOOST_OFF": [{"hours": 1, "minutes": 10}, ["clock"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - BOOST_OFF
              additionalProperties: false
              properties:
                BOOST_OFF:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: object
                      required:
                        - hours
                        - minutes
                      properties:
                        hours:
                          type: integer
                        minutes:
                          type: integer
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              BOOST_OFF:
                - hours: 1
                  minutes: 10
                - - clock
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/BOOST_ON:
    post:
      operationId: command_BOOST_ON
      tags:
        - timeclock
      summary: Boost timeclock on for a duration
      deprecated: false
      description: |
        Send NeoHub command `BOOST_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"BOOST_ON": [{"hours": 1, "minutes": 10}, ["clock"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - BOOST_ON
              additionalProperties: false
              properties:
                BOOST_ON:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: object
                      required:
                        - hours
                        - minutes
                      properties:
                        hours:
                          type: integer
                        minutes:
                          type: integer
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              BOOST_ON:
                - hours: 1
                  minutes: 10
                - - clock
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CANCEL_HGROUP:
    post:
      operationId: command_CANCEL_HGROUP
      tags:
        - hold
      summary: Cancel holds for a named hold group id
      deprecated: false
      description: |
        Send NeoHub command `CANCEL_HGROUP` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CANCEL_HGROUP": "Box"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CANCEL_HGROUP
              additionalProperties: false
              properties:
                CANCEL_HGROUP:
                  type: string
            example:
              CANCEL_HGROUP: Box
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CANCEL_HOLD_ALL:
    post:
      operationId: command_CANCEL_HOLD_ALL
      tags:
        - hold
      summary: Cancel all hold commands
      deprecated: false
      description: |
        Send NeoHub command `CANCEL_HOLD_ALL` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CANCEL_HOLD_ALL": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CANCEL_HOLD_ALL
              additionalProperties: false
              properties:
                CANCEL_HOLD_ALL:
                  type: integer
                  const: 0
            example:
              CANCEL_HOLD_ALL: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CANCEL_HOLIDAY:
    post:
      operationId: command_CANCEL_HOLIDAY
      tags:
        - global
      summary: Cancel holiday mode
      deprecated: false
      description: |
        Send NeoHub command `CANCEL_HOLIDAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CANCEL_HOLIDAY": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CANCEL_HOLIDAY
              additionalProperties: false
              properties:
                CANCEL_HOLIDAY:
                  type: integer
                  const: 0
            example:
              CANCEL_HOLIDAY: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CLEAR_CURRENT_PROFILE:
    post:
      operationId: command_CLEAR_CURRENT_PROFILE
      tags:
        - profiles
      summary: Clear active profile id (set to 0) without changing levels
      deprecated: false
      description: |
        Send NeoHub command `CLEAR_CURRENT_PROFILE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CLEAR_CURRENT_PROFILE": "kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CLEAR_CURRENT_PROFILE
              additionalProperties: false
              properties:
                CLEAR_CURRENT_PROFILE:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              CLEAR_CURRENT_PROFILE: kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CLEAR_DEVICE_LIST:
    post:
      operationId: command_CLEAR_DEVICE_LIST
      tags:
        - devices
      summary: Clear and disconnect all devices linked to a zone
      deprecated: false
      description: |
        Send NeoHub command `CLEAR_DEVICE_LIST` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CLEAR_DEVICE_LIST": "Kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CLEAR_DEVICE_LIST
              additionalProperties: false
              properties:
                CLEAR_DEVICE_LIST:
                  type: string
            example:
              CLEAR_DEVICE_LIST: Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CLEAR_PROFILE:
    post:
      operationId: command_CLEAR_PROFILE
      tags:
        - profiles
      summary: Delete a named profile
      deprecated: true
      description: |
        Send NeoHub command `CLEAR_PROFILE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CLEAR_PROFILE": "winter"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CLEAR_PROFILE
              additionalProperties: false
              properties:
                CLEAR_PROFILE:
                  type: string
            example:
              CLEAR_PROFILE: winter
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CLEAR_PROFILE_ID:
    post:
      operationId: command_CLEAR_PROFILE_ID
      tags:
        - profiles
      summary: Delete a profile by numeric id
      deprecated: false
      description: |
        Send NeoHub command `CLEAR_PROFILE_ID` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CLEAR_PROFILE_ID": 2}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CLEAR_PROFILE_ID
              additionalProperties: false
              properties:
                CLEAR_PROFILE_ID:
                  type: number
            example:
              CLEAR_PROFILE_ID: 2
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/CREATE_GROUP:
    post:
      operationId: command_CREATE_GROUP
      tags:
        - groups
      summary: Create a command group of zones
      deprecated: false
      description: |
        Send NeoHub command `CREATE_GROUP` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"CREATE_GROUP": [["lounge", "bed1"], "bob"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - CREATE_GROUP
              additionalProperties: false
              properties:
                CREATE_GROUP:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: array
                      items:
                        type: string
                    - type: string
                      description: Group name
            example:
              CREATE_GROUP:
                - - lounge
                  - bed1
                - bob
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DELETE_GROUP:
    post:
      operationId: command_DELETE_GROUP
      tags:
        - groups
      summary: Delete a command group
      deprecated: false
      description: |
        Send NeoHub command `DELETE_GROUP` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DELETE_GROUP": "bob"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DELETE_GROUP
              additionalProperties: false
              properties:
                DELETE_GROUP:
                  type: string
            example:
              DELETE_GROUP: bob
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DELETE_RECIPE:
    post:
      operationId: command_DELETE_RECIPE
      tags:
        - recipes
      summary: Delete a recipe by name
      deprecated: false
      description: |
        Send NeoHub command `DELETE_RECIPE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DELETE_RECIPE": "test4"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DELETE_RECIPE
              additionalProperties: false
              properties:
                DELETE_RECIPE:
                  type: string
            example:
              DELETE_RECIPE: test4
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DETACH_DEVICE:
    post:
      operationId: command_DETACH_DEVICE
      tags:
        - devices
      summary: Detach a device from a zone
      deprecated: false
      description: |
        Send NeoHub command `DETACH_DEVICE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DETACH_DEVICE": ["Kitchen", "neoplug"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DETACH_DEVICE
              additionalProperties: false
              properties:
                DETACH_DEVICE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: string
                      description: Zone name
                    - type: string
                      description: Device name
            example:
              DETACH_DEVICE:
                - Kitchen
                - neoplug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DEVICES_SN:
    post:
      operationId: command_DEVICES_SN
      tags:
        - devices
      summary: Return serial numbers for attached devices
      deprecated: false
      description: |
        Send NeoHub command `DEVICES_SN` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DEVICES_SN": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DEVICES_SN
              additionalProperties: false
              properties:
                DEVICES_SN:
                  type: integer
                  const: 0
            example:
              DEVICES_SN: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DST_OFF:
    post:
      operationId: command_DST_OFF
      tags:
        - time
      summary: Disable automatic daylight saving
      deprecated: false
      description: |
        Send NeoHub command `DST_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DST_OFF": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DST_OFF
              additionalProperties: false
              properties:
                DST_OFF:
                  type: integer
                  const: 0
            example:
              DST_OFF: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/DST_ON:
    post:
      operationId: command_DST_ON
      tags:
        - time
      summary: Enable automatic daylight saving (0 or zone code)
      deprecated: false
      description: |
        Send NeoHub command `DST_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"DST_ON": "UK"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - DST_ON
              additionalProperties: false
              properties:
                DST_ON:
                  oneOf:
                    - type: integer
                      const: 0
                    - type: string
                      enum:
                        - UK
                        - EU
                        - NZ
            example:
              DST_ON: UK
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/ENGINEERS_DATA:
    post:
      operationId: command_ENGINEERS_DATA
      tags:
        - deprecated
      summary: Deprecated engineers dump
      deprecated: true
      description: |
        Send NeoHub command `ENGINEERS_DATA` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"ENGINEERS_DATA": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - ENGINEERS_DATA
              additionalProperties: false
              properties:
                ENGINEERS_DATA:
                  type: integer
                  const: 0
            example:
              ENGINEERS_DATA: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/FIRMWARE:
    post:
      operationId: command_FIRMWARE
      tags:
        - system
      summary: Return neoHub firmware version
      deprecated: false
      description: |
        Send NeoHub command `FIRMWARE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"FIRMWARE": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - FIRMWARE
              additionalProperties: false
              properties:
                FIRMWARE:
                  type: integer
                  const: 0
            example:
              FIRMWARE: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/FROST_OFF:
    post:
      operationId: command_FROST_OFF
      tags:
        - zones
      summary: Cancel standby / frost protection
      deprecated: false
      description: |
        Send NeoHub command `FROST_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"FROST_OFF": ["bed1", "lounge"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - FROST_OFF
              additionalProperties: false
              properties:
                FROST_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              FROST_OFF:
                - bed1
                - lounge
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/FROST_ON:
    post:
      operationId: command_FROST_ON
      tags:
        - zones
      summary: Put zone(s) into standby / frost protection
      deprecated: false
      description: |
        Send NeoHub command `FROST_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"FROST_ON": ["bed1", "lounge"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - FROST_ON
              additionalProperties: false
              properties:
                FROST_ON:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              FROST_ON:
                - bed1
                - lounge
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_DEVICE_LIST:
    post:
      operationId: command_GET_DEVICE_LIST
      tags:
        - devices
      summary: List devices linked to a zone
      deprecated: false
      description: |
        Send NeoHub command `GET_DEVICE_LIST` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_DEVICE_LIST": "Kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_DEVICE_LIST
              additionalProperties: false
              properties:
                GET_DEVICE_LIST:
                  type: string
            example:
              GET_DEVICE_LIST: Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_DEVICES:
    post:
      operationId: command_GET_DEVICES
      tags:
        - devices
      summary: List non-neoStat devices
      deprecated: false
      description: |
        Send NeoHub command `GET_DEVICES` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_DEVICES": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_DEVICES
              additionalProperties: false
              properties:
                GET_DEVICES:
                  type: integer
                  const: 0
            example:
              GET_DEVICES: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_ENGINEERS:
    post:
      operationId: command_GET_ENGINEERS
      tags:
        - system
      summary: Engineers / feature settings cache
      deprecated: false
      description: |
        Send NeoHub command `GET_ENGINEERS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_ENGINEERS": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_ENGINEERS
              additionalProperties: false
              properties:
                GET_ENGINEERS:
                  type: integer
                  const: 0
            example:
              GET_ENGINEERS: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_GROUPS:
    post:
      operationId: command_GET_GROUPS
      tags:
        - groups
      summary: List command groups
      deprecated: false
      description: |
        Send NeoHub command `GET_GROUPS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_GROUPS": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_GROUPS
              additionalProperties: false
              properties:
                GET_GROUPS:
                  type: integer
                  const: 0
            example:
              GET_GROUPS: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_HOLD:
    post:
      operationId: command_GET_HOLD
      tags:
        - hold
      summary: List active holds set by the app
      deprecated: false
      description: |
        Send NeoHub command `GET_HOLD` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_HOLD": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_HOLD
              additionalProperties: false
              properties:
                GET_HOLD:
                  type: integer
                  const: 0
            example:
              GET_HOLD: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_HOLIDAY:
    post:
      operationId: command_GET_HOLIDAY
      tags:
        - global
      summary: Get holiday start/end
      deprecated: false
      description: |
        Send NeoHub command `GET_HOLIDAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_HOLIDAY": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_HOLIDAY
              additionalProperties: false
              properties:
                GET_HOLIDAY:
                  type: integer
                  const: 0
            example:
              GET_HOLIDAY: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_HOURSRUN:
    post:
      operationId: command_GET_HOURSRUN
      tags:
        - stats
      summary: Hours the output was on per day
      deprecated: false
      description: |
        Send NeoHub command `GET_HOURSRUN` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_HOURSRUN": "Kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_HOURSRUN
              additionalProperties: false
              properties:
                GET_HOURSRUN:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              GET_HOURSRUN: Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_LIVE_DATA:
    post:
      operationId: command_GET_LIVE_DATA
      tags:
        - system
      summary: Live status and cache timestamps
      deprecated: false
      description: |
        Send NeoHub command `GET_LIVE_DATA` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_LIVE_DATA": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_LIVE_DATA
              additionalProperties: false
              properties:
                GET_LIVE_DATA:
                  type: integer
                  const: 0
            example:
              GET_LIVE_DATA: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LiveData"
  /commands/GET_PROFILE:
    post:
      operationId: command_GET_PROFILE
      tags:
        - profiles
      summary: Get a named profile
      deprecated: true
      description: |
        Send NeoHub command `GET_PROFILE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_PROFILE": "kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_PROFILE
              additionalProperties: false
              properties:
                GET_PROFILE:
                  type: string
            example:
              GET_PROFILE: kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_PROFILE_0:
    post:
      operationId: command_GET_PROFILE_0
      tags:
        - profiles
      summary: Read profile 0 comfort levels from a device
      deprecated: false
      description: |
        Send NeoHub command `GET_PROFILE_0` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_PROFILE_0": "Bathroom"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_PROFILE_0
              additionalProperties: false
              properties:
                GET_PROFILE_0:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              GET_PROFILE_0: Bathroom
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_PROFILE_NAMES:
    post:
      operationId: command_GET_PROFILE_NAMES
      tags:
        - profiles
      summary: List profile names
      deprecated: true
      description: |
        Send NeoHub command `GET_PROFILE_NAMES` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_PROFILE_NAMES": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_PROFILE_NAMES
              additionalProperties: false
              properties:
                GET_PROFILE_NAMES:
                  type: integer
                  const: 0
            example:
              GET_PROFILE_NAMES: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_PROFILE_TIMERS:
    post:
      operationId: command_GET_PROFILE_TIMERS
      tags:
        - profiles
      summary: All timeclock profiles
      deprecated: false
      description: |
        Send NeoHub command `GET_PROFILE_TIMERS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_PROFILE_TIMERS": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_PROFILE_TIMERS
              additionalProperties: false
              properties:
                GET_PROFILE_TIMERS:
                  type: integer
                  const: 0
            example:
              GET_PROFILE_TIMERS: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_PROFILES:
    post:
      operationId: command_GET_PROFILES
      tags:
        - profiles
      summary: All thermostat profiles
      deprecated: false
      description: |
        Send NeoHub command `GET_PROFILES` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_PROFILES": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_PROFILES
              additionalProperties: false
              properties:
                GET_PROFILES:
                  type: integer
                  const: 0
            example:
              GET_PROFILES: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_RECIPES:
    post:
      operationId: command_GET_RECIPES
      tags:
        - recipes
      summary: List stored recipes
      deprecated: false
      description: |
        Send NeoHub command `GET_RECIPES` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_RECIPES": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_RECIPES
              additionalProperties: false
              properties:
                GET_RECIPES:
                  type: integer
                  const: 0
            example:
              GET_RECIPES: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_SYSTEM:
    post:
      operationId: command_GET_SYSTEM
      tags:
        - system
      summary: System-wide settings cache
      deprecated: false
      description: |
        Send NeoHub command `GET_SYSTEM` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_SYSTEM": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_SYSTEM
              additionalProperties: false
              properties:
                GET_SYSTEM:
                  type: integer
                  const: 0
            example:
              GET_SYSTEM: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SystemInfo"
  /commands/GET_TEMPLOG:
    post:
      operationId: command_GET_TEMPLOG
      tags:
        - stats
      summary: Historical temperatures (15-minute samples)
      deprecated: false
      description: |
        Send NeoHub command `GET_TEMPLOG` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_TEMPLOG": ["Kitchen"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_TEMPLOG
              additionalProperties: false
              properties:
                GET_TEMPLOG:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              GET_TEMPLOG:
                - Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_TIMER_0:
    post:
      operationId: command_GET_TIMER_0
      tags:
        - profiles
      summary: Read profile 0 timer levels from a timeclock
      deprecated: false
      description: |
        Send NeoHub command `GET_TIMER_0` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_TIMER_0": "Timer"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_TIMER_0
              additionalProperties: false
              properties:
                GET_TIMER_0:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              GET_TIMER_0: Timer
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GET_ZONES:
    post:
      operationId: command_GET_ZONES
      tags:
        - devices
      summary: Zone name to device id map
      deprecated: false
      description: |
        Send NeoHub command `GET_ZONES` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GET_ZONES": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GET_ZONES
              additionalProperties: false
              properties:
                GET_ZONES:
                  type: integer
                  const: 0
            example:
              GET_ZONES: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GLOBAL_DEV_LIST:
    post:
      operationId: command_GLOBAL_DEV_LIST
      tags:
        - global
      summary: Devices affected by AWAY
      deprecated: false
      description: |
        Send NeoHub command `GLOBAL_DEV_LIST` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GLOBAL_DEV_LIST": ["lounge"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GLOBAL_DEV_LIST
              additionalProperties: false
              properties:
                GLOBAL_DEV_LIST:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              GLOBAL_DEV_LIST:
                - lounge
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/GLOBAL_SYSTEM_TYPE:
    post:
      operationId: command_GLOBAL_SYSTEM_TYPE
      tags:
        - cooling
      summary: Set global heat/cool system type
      deprecated: false
      description: |
        Send NeoHub command `GLOBAL_SYSTEM_TYPE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"GLOBAL_SYSTEM_TYPE": "HeatOrCool"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - GLOBAL_SYSTEM_TYPE
              additionalProperties: false
              properties:
                GLOBAL_SYSTEM_TYPE:
                  type: string
            example:
              GLOBAL_SYSTEM_TYPE: HeatOrCool
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/HOLD:
    post:
      operationId: command_HOLD
      tags:
        - hold
      summary: Hold heating and/or cooling temperature
      deprecated: false
      description: |
        Send NeoHub command `HOLD` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"HOLD": [{"temp": 16, "hours": 2, "minutes": 30, "id": "Box"}, ["Kitchen"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - HOLD
              additionalProperties: false
              properties:
                HOLD:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: object
                      properties:
                        temp:
                          type: number
                        cool:
                          type: number
                        hours:
                          type: integer
                        minutes:
                          type: integer
                        id:
                          type: string
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              HOLD:
                - temp: 16
                  hours: 2
                  minutes: 30
                  id: Box
                - - Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/HOLIDAY:
    post:
      operationId: command_HOLIDAY
      tags:
        - global
      summary: Enable holiday between start and end timestamps
      deprecated: false
      description: |
        Send NeoHub command `HOLIDAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"HOLIDAY": ["14450001062016", "14450002062016"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - HOLIDAY
              additionalProperties: false
              properties:
                HOLIDAY:
                  type: array
                  minItems: 2
                  maxItems: 2
                  items:
                    type: string
                    pattern: "^[0-9]{14}$"
                    description: HHMMSSDDMMYYYY
            example:
              HOLIDAY:
                - 14450001062016
                - 14450002062016
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/IDENTIFY:
    post:
      operationId: command_IDENTIFY
      tags:
        - system
      summary: Flash neoHub link LED
      deprecated: false
      description: |
        Send NeoHub command `IDENTIFY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"IDENTIFY": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - IDENTIFY
              additionalProperties: false
              properties:
                IDENTIFY:
                  type: integer
                  const: 0
            example:
              IDENTIFY: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/IDENTIFY_DEV:
    post:
      operationId: command_IDENTIFY_DEV
      tags:
        - zones
      summary: Flash neoStat LCD backlight
      deprecated: false
      description: |
        Send NeoHub command `IDENTIFY_DEV` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"IDENTIFY_DEV": "test"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - IDENTIFY_DEV
              additionalProperties: false
              properties:
                IDENTIFY_DEV:
                  type: string
            example:
              IDENTIFY_DEV: test
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/INFO:
    post:
      operationId: command_INFO
      tags:
        - deprecated
      summary: Deprecated live info dump
      deprecated: true
      description: |
        Send NeoHub command `INFO` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"INFO": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - INFO
              additionalProperties: false
              properties:
                INFO:
                  type: integer
                  const: 0
            example:
              INFO: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/LINK_DEVICE:
    post:
      operationId: command_LINK_DEVICE
      tags:
        - devices
      summary: Link a device to a zone
      deprecated: false
      description: |
        Send NeoHub command `LINK_DEVICE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"LINK_DEVICE": ["Kitchen", "neoplug"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - LINK_DEVICE
              additionalProperties: false
              properties:
                LINK_DEVICE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: string
                      description: Zone name
                    - type: string
                      description: Device name
            example:
              LINK_DEVICE:
                - Kitchen
                - neoplug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/LOCK:
    post:
      operationId: command_LOCK
      tags:
        - zones
      summary: PIN-lock thermostat(s)
      deprecated: false
      description: |
        Send NeoHub command `LOCK` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"LOCK": [[1, 2, 3, 4], ["Bathroom", "kitchen"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - LOCK
              additionalProperties: false
              properties:
                LOCK:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: array
                      minItems: 4
                      maxItems: 4
                      items:
                        type: integer
                        minimum: 0
                        maximum: 9
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              LOCK:
                - - 1
                  - 2
                  - 3
                  - 4
                - - Bathroom
                  - kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/MANUAL_DST:
    post:
      operationId: command_MANUAL_DST
      tags:
        - time
      summary: Manual daylight saving offset (0 or 1 hour)
      deprecated: false
      description: |
        Send NeoHub command `MANUAL_DST` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"MANUAL_DST": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - MANUAL_DST
              additionalProperties: false
              properties:
                MANUAL_DST:
                  type: number
            example:
              MANUAL_DST: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/MANUAL_OFF:
    post:
      operationId: command_MANUAL_OFF
      tags:
        - timeclock
      summary: Reinstate neoPlug schedule
      deprecated: false
      description: |
        Send NeoHub command `MANUAL_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"MANUAL_OFF": "plug"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - MANUAL_OFF
              additionalProperties: false
              properties:
                MANUAL_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              MANUAL_OFF: plug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/MANUAL_ON:
    post:
      operationId: command_MANUAL_ON
      tags:
        - timeclock
      summary: Disable neoPlug schedule (manual mode)
      deprecated: false
      description: |
        Send NeoHub command `MANUAL_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"MANUAL_ON": "plug"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - MANUAL_ON
              additionalProperties: false
              properties:
                MANUAL_ON:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              MANUAL_ON: plug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/NTP_OFF:
    post:
      operationId: command_NTP_OFF
      tags:
        - time
      summary: Disconnect from network time server
      deprecated: false
      description: |
        Send NeoHub command `NTP_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"NTP_OFF": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - NTP_OFF
              additionalProperties: false
              properties:
                NTP_OFF:
                  type: integer
                  const: 0
            example:
              NTP_OFF: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/NTP_ON:
    post:
      operationId: command_NTP_ON
      tags:
        - time
      summary: Reconnect to network time server
      deprecated: false
      description: |
        Send NeoHub command `NTP_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"NTP_ON": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - NTP_ON
              additionalProperties: false
              properties:
                NTP_ON:
                  type: integer
                  const: 0
            example:
              NTP_ON: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/PERMIT_JOIN:
    post:
      operationId: command_PERMIT_JOIN
      tags:
        - devices
      summary: Open pairing window for a device or repeater
      deprecated: false
      description: |
        Send NeoHub command `PERMIT_JOIN` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"PERMIT_JOIN": [120, "kitchen"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - PERMIT_JOIN
              additionalProperties: false
              properties:
                PERMIT_JOIN:
                  oneOf:
                    - type: array
                      prefixItems:
                        - type: integer
                          description: Seconds
                        - type: string
                          description: Zone name
                      minItems: 2
                      maxItems: 2
                    - type: array
                      prefixItems:
                        - type: string
                          const: repeater
                        - type: integer
                          description: Seconds
                      minItems: 2
                      maxItems: 2
            example:
              PERMIT_JOIN:
                - 120
                - kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/PROFILE_TITLE:
    post:
      operationId: command_PROFILE_TITLE
      tags:
        - profiles
      summary: Rename a profile
      deprecated: false
      description: |
        Send NeoHub command `PROFILE_TITLE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"PROFILE_TITLE": ["Summer", "Winter"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - PROFILE_TITLE
              additionalProperties: false
              properties:
                PROFILE_TITLE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  items:
                    type: string
            example:
              PROFILE_TITLE:
                - Summer
                - Winter
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/READ_COMFORT_LEVELS:
    post:
      operationId: command_READ_COMFORT_LEVELS
      tags:
        - deprecated
      summary: Deprecated comfort level read
      deprecated: true
      description: |
        Send NeoHub command `READ_COMFORT_LEVELS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"READ_COMFORT_LEVELS": "kitchen"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - READ_COMFORT_LEVELS
              additionalProperties: false
              properties:
                READ_COMFORT_LEVELS:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              READ_COMFORT_LEVELS: kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/READ_DCB:
    post:
      operationId: command_READ_DCB
      tags:
        - deprecated
      summary: Deprecated DCB read
      deprecated: true
      description: |
        Send NeoHub command `READ_DCB` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"READ_DCB": 100}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - READ_DCB
              additionalProperties: false
              properties:
                READ_DCB:
                  type: number
            example:
              READ_DCB: 100
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/READ_TIMECLOCK:
    post:
      operationId: command_READ_TIMECLOCK
      tags:
        - timeclock
      summary: Read timeclock on/off periods
      deprecated: false
      description: |
        Send NeoHub command `READ_TIMECLOCK` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"READ_TIMECLOCK": "Hot water"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - READ_TIMECLOCK
              additionalProperties: false
              properties:
                READ_TIMECLOCK:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              READ_TIMECLOCK: Hot water
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/REMOVE_REPEATER:
    post:
      operationId: command_REMOVE_REPEATER
      tags:
        - devices
      summary: Remove a repeater
      deprecated: false
      description: |
        Send NeoHub command `REMOVE_REPEATER` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"REMOVE_REPEATER": "repeaternode12345"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - REMOVE_REPEATER
              additionalProperties: false
              properties:
                REMOVE_REPEATER:
                  type: string
            example:
              REMOVE_REPEATER: repeaternode12345
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/REMOVE_ZONE:
    post:
      operationId: command_REMOVE_ZONE
      tags:
        - devices
      summary: Remove a zone/device from the network
      deprecated: false
      description: |
        Send NeoHub command `REMOVE_ZONE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"REMOVE_ZONE": "test"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - REMOVE_ZONE
              additionalProperties: false
              properties:
                REMOVE_ZONE:
                  type: string
            example:
              REMOVE_ZONE: test
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/RESET:
    post:
      operationId: command_RESET
      tags:
        - system
      summary: Soft-reboot the neoHub (firmware 2027+)
      deprecated: false
      description: |
        Send NeoHub command `RESET` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"RESET": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - RESET
              additionalProperties: false
              properties:
                RESET:
                  type: integer
                  const: 0
            example:
              RESET: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/RUN_PROFILE:
    post:
      operationId: command_RUN_PROFILE
      tags:
        - profiles
      summary: Run a profile by name
      deprecated: true
      description: |
        Send NeoHub command `RUN_PROFILE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"RUN_PROFILE": "winter"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - RUN_PROFILE
              additionalProperties: false
              properties:
                RUN_PROFILE:
                  type: string
            example:
              RUN_PROFILE: winter
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/RUN_PROFILE_ID:
    post:
      operationId: command_RUN_PROFILE_ID
      tags:
        - profiles
      summary: Push a profile id to devices
      deprecated: false
      description: |
        Send NeoHub command `RUN_PROFILE_ID` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"RUN_PROFILE_ID": [25, "Kitchen", "Lounge"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - RUN_PROFILE_ID
              additionalProperties: false
              properties:
                RUN_PROFILE_ID:
                  type: array
                  minItems: 2
                  prefixItems:
                    - type: integer
                      description: Profile id
                  items:
                    oneOf:
                      - type: integer
                      - type: string
            example:
              RUN_PROFILE_ID:
                - 25
                - Kitchen
                - Lounge
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/RUN_RECIPE:
    post:
      operationId: command_RUN_RECIPE
      tags:
        - recipes
      summary: Run a stored recipe
      deprecated: false
      description: |
        Send NeoHub command `RUN_RECIPE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"RUN_RECIPE": ["test2"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - RUN_RECIPE
              additionalProperties: false
              properties:
                RUN_RECIPE:
                  type: array
                  minItems: 1
                  prefixItems:
                    - type: string
                      description: Recipe name
                  items: true
            example:
              RUN_RECIPE:
                - test2
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_CHANNEL:
    post:
      operationId: command_SET_CHANNEL
      tags:
        - system
      summary: Set ZigBee channel
      deprecated: false
      description: |
        Send NeoHub command `SET_CHANNEL` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_CHANNEL": 11}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_CHANNEL
              additionalProperties: false
              properties:
                SET_CHANNEL:
                  type: number
            example:
              SET_CHANNEL: 11
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_CLOSE_DELAY:
    post:
      operationId: command_SET_CLOSE_DELAY
      tags:
        - devices
      summary: Global window-switch close delay (seconds)
      deprecated: false
      description: |
        Send NeoHub command `SET_CLOSE_DELAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_CLOSE_DELAY": 10}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_CLOSE_DELAY
              additionalProperties: false
              properties:
                SET_CLOSE_DELAY:
                  type: number
            example:
              SET_CLOSE_DELAY: 10
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_COMFORT_LEVELS:
    post:
      operationId: command_SET_COMFORT_LEVELS
      tags:
        - deprecated
      summary: Deprecated comfort level write
      deprecated: true
      description: |
        Send NeoHub command `SET_COMFORT_LEVELS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_COMFORT_LEVELS": {}}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_COMFORT_LEVELS
              additionalProperties: false
              properties:
                SET_COMFORT_LEVELS:
                  type: object
                  additionalProperties: true
            example:
              SET_COMFORT_LEVELS: {}
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_COOL_TEMP:
    post:
      operationId: command_SET_COOL_TEMP
      tags:
        - cooling
      summary: Set cooling setpoint
      deprecated: false
      description: |
        Send NeoHub command `SET_COOL_TEMP` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_COOL_TEMP": [27.5, "HCtest"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_COOL_TEMP
              additionalProperties: false
              properties:
                SET_COOL_TEMP:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_COOL_TEMP:
                - 27.5
                - HCtest
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_DATE:
    post:
      operationId: command_SET_DATE
      tags:
        - time
      summary: Set calendar date (disables NTP)
      deprecated: false
      description: |
        Send NeoHub command `SET_DATE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_DATE": [2018, 12, 9]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_DATE
              additionalProperties: false
              properties:
                SET_DATE:
                  type: array
                  minItems: 3
                  maxItems: 3
                  prefixItems:
                    - type: integer
                    - type: integer
                      minimum: 1
                      maximum: 12
                    - type: integer
                      minimum: 1
                      maximum: 31
            example:
              SET_DATE:
                - 2018
                - 12
                - 9
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_DELAY:
    post:
      operationId: command_SET_DELAY
      tags:
        - engineers
      summary: Output delay in minutes
      deprecated: false
      description: |
        Send NeoHub command `SET_DELAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_DELAY": [5, "test"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_DELAY
              additionalProperties: false
              properties:
                SET_DELAY:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_DELAY:
                - 5
                - test
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_DIFF:
    post:
      operationId: command_SET_DIFF
      tags:
        - engineers
      summary: Switching differential
      deprecated: false
      description: |
        Send NeoHub command `SET_DIFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_DIFF": [2, ["test"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_DIFF
              additionalProperties: false
              properties:
                SET_DIFF:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_DIFF:
                - 2
                - - test
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_FAILSAFE:
    post:
      operationId: command_SET_FAILSAFE
      tags:
        - engineers
      summary: Enable/disable neoAir RF failsafe
      deprecated: false
      description: |
        Send NeoHub command `SET_FAILSAFE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_FAILSAFE": [true, "neoair"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_FAILSAFE
              additionalProperties: false
              properties:
                SET_FAILSAFE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: boolean
                    - type: string
            example:
              SET_FAILSAFE:
                - true
                - neoair
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_FAN_SPEED:
    post:
      operationId: command_SET_FAN_SPEED
      tags:
        - cooling
      summary: Set fan speed (neoStat HC)
      deprecated: false
      description: |
        Send NeoHub command `SET_FAN_SPEED` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_FAN_SPEED": ["HIGH", ["HCtest"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_FAN_SPEED
              additionalProperties: false
              properties:
                SET_FAN_SPEED:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: string
                      enum:
                        - HIGH
                        - MED
                        - LOW
                        - OFF
                        - AUTO
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_FAN_SPEED:
                - HIGH
                - - HCtest
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_FLOOR:
    post:
      operationId: command_SET_FLOOR
      tags:
        - engineers
      summary: Floor temperature limit
      deprecated: false
      description: |
        Send NeoHub command `SET_FLOOR` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_FLOOR": [28, "floor1"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_FLOOR
              additionalProperties: false
              properties:
                SET_FLOOR:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_FLOOR:
                - 28
                - floor1
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_FORMAT:
    post:
      operationId: command_SET_FORMAT
      tags:
        - system
      summary: Program format (global)
      deprecated: false
      description: |
        Send NeoHub command `SET_FORMAT` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_FORMAT": "7DAY"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_FORMAT
              additionalProperties: false
              properties:
                SET_FORMAT:
                  type: string
            example:
              SET_FORMAT: 7DAY
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_FROST:
    post:
      operationId: command_SET_FROST
      tags:
        - engineers
      summary: Frost protection temperature
      deprecated: false
      description: |
        Send NeoHub command `SET_FROST` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_FROST": [9, "test"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_FROST
              additionalProperties: false
              properties:
                SET_FROST:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_FROST:
                - 9
                - test
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_GLOBAL_HC_MODE:
    post:
      operationId: command_SET_GLOBAL_HC_MODE
      tags:
        - cooling
      summary: Global heating/cooling/auto mode
      deprecated: false
      description: |
        Send NeoHub command `SET_GLOBAL_HC_MODE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_GLOBAL_HC_MODE": "heating"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_GLOBAL_HC_MODE
              additionalProperties: false
              properties:
                SET_GLOBAL_HC_MODE:
                  type: string
            example:
              SET_GLOBAL_HC_MODE: heating
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_HC_MODE:
    post:
      operationId: command_SET_HC_MODE
      tags:
        - cooling
      summary: Per-device HC mode
      deprecated: false
      description: |
        Send NeoHub command `SET_HC_MODE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_HC_MODE": ["COOLING", ["Device1"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_HC_MODE
              additionalProperties: false
              properties:
                SET_HC_MODE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: string
                      enum:
                        - HEATING
                        - COOLING
                        - AUTO
                        - VENT
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_HC_MODE:
                - COOLING
                - - Device1
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_LEVEL_4:
    post:
      operationId: command_SET_LEVEL_4
      tags:
        - system
      summary: Use 4 comfort levels per day
      deprecated: false
      description: |
        Send NeoHub command `SET_LEVEL_4` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_LEVEL_4": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_LEVEL_4
              additionalProperties: false
              properties:
                SET_LEVEL_4:
                  type: integer
                  const: 0
            example:
              SET_LEVEL_4: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_LEVEL_6:
    post:
      operationId: command_SET_LEVEL_6
      tags:
        - system
      summary: Use 6 comfort levels per day
      deprecated: false
      description: |
        Send NeoHub command `SET_LEVEL_6` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_LEVEL_6": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_LEVEL_6
              additionalProperties: false
              properties:
                SET_LEVEL_6:
                  type: integer
                  const: 0
            example:
              SET_LEVEL_6: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_OPEN_DELAY:
    post:
      operationId: command_SET_OPEN_DELAY
      tags:
        - devices
      summary: Global window-switch open delay (seconds)
      deprecated: false
      description: |
        Send NeoHub command `SET_OPEN_DELAY` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_OPEN_DELAY": 10}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_OPEN_DELAY
              additionalProperties: false
              properties:
                SET_OPEN_DELAY:
                  type: number
            example:
              SET_OPEN_DELAY: 10
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_PREHEAT:
    post:
      operationId: command_SET_PREHEAT
      tags:
        - engineers
      summary: Maximum preheat hours
      deprecated: false
      description: |
        Send NeoHub command `SET_PREHEAT` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_PREHEAT": [3, "Bathroom"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_PREHEAT
              additionalProperties: false
              properties:
                SET_PREHEAT:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_PREHEAT:
                - 3
                - Bathroom
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_RF_MODE:
    post:
      operationId: command_SET_RF_MODE
      tags:
        - devices
      summary: Wireless sensor mode (mix/remote/self)
      deprecated: false
      description: |
        Send NeoHub command `SET_RF_MODE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_RF_MODE": ["mix", "Kitchen"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_RF_MODE
              additionalProperties: false
              properties:
                SET_RF_MODE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: string
                      enum:
                        - mix
                        - remote
                        - self
                        - MIX
                        - REMOTE
                        - SELF
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_RF_MODE:
                - mix
                - Kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_TEMP:
    post:
      operationId: command_SET_TEMP
      tags:
        - zones
      summary: Temporary heating setpoint
      deprecated: false
      description: |
        Send NeoHub command `SET_TEMP` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_TEMP": [21.5, "Zone 3"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_TEMP
              additionalProperties: false
              properties:
                SET_TEMP:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_TEMP:
                - 21.5
                - Zone 3
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_TEMP_FORMAT:
    post:
      operationId: command_SET_TEMP_FORMAT
      tags:
        - system
      summary: Celsius or Fahrenheit (global)
      deprecated: false
      description: |
        Send NeoHub command `SET_TEMP_FORMAT` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_TEMP_FORMAT": "C"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_TEMP_FORMAT
              additionalProperties: false
              properties:
                SET_TEMP_FORMAT:
                  type: string
            example:
              SET_TEMP_FORMAT: C
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_TIME:
    post:
      operationId: command_SET_TIME
      tags:
        - time
      summary: Set clock time (disables NTP)
      deprecated: false
      description: |
        Send NeoHub command `SET_TIME` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_TIME": [14, 25]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_TIME
              additionalProperties: false
              properties:
                SET_TIME:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: integer
                      minimum: 0
                      maximum: 23
                    - type: integer
                      minimum: 0
                      maximum: 59
            example:
              SET_TIME:
                - 14
                - 25
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SET_TIMECLOCK:
    post:
      operationId: command_SET_TIMECLOCK
      tags:
        - timeclock
      summary: Write timeclock periods
      deprecated: false
      description: |
        Send NeoHub command `SET_TIMECLOCK` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SET_TIMECLOCK": [{}, "Hot water"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SET_TIMECLOCK
              additionalProperties: false
              properties:
                SET_TIMECLOCK:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: object
                      additionalProperties: true
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              SET_TIMECLOCK:
                - {}
                - Hot water
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STATISTICS:
    post:
      operationId: command_STATISTICS
      tags:
        - deprecated
      summary: Deprecated statistics
      deprecated: true
      description: |
        Send NeoHub command `STATISTICS` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STATISTICS": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STATISTICS
              additionalProperties: false
              properties:
                STATISTICS:
                  type: integer
                  const: 0
            example:
              STATISTICS: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STORE_PROFILE:
    post:
      operationId: command_STORE_PROFILE
      tags:
        - profiles
      summary: Store a named thermostat profile (not neoStat HC)
      deprecated: false
      description: |
        Send NeoHub command `STORE_PROFILE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STORE_PROFILE": {"info": {}, "name": "my profile"}}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STORE_PROFILE
              additionalProperties: false
              properties:
                STORE_PROFILE:
                  type: object
                  additionalProperties: true
            example:
              STORE_PROFILE:
                info: {}
                name: my profile
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STORE_PROFILE2:
    post:
      operationId: command_STORE_PROFILE2
      tags:
        - profiles
      summary: Store profile and return new ID
      deprecated: false
      description: |
        Send NeoHub command `STORE_PROFILE2` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STORE_PROFILE2": {"info": {}, "name": "my profile"}}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STORE_PROFILE2
              additionalProperties: false
              properties:
                STORE_PROFILE2:
                  type: object
                  additionalProperties: true
            example:
              STORE_PROFILE2:
                info: {}
                name: my profile
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STORE_PROFILE_0:
    post:
      operationId: command_STORE_PROFILE_0
      tags:
        - profiles
      summary: Store comfort levels directly to device(s)
      deprecated: false
      description: |
        Send NeoHub command `STORE_PROFILE_0` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STORE_PROFILE_0": [{}, "bedroom1"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STORE_PROFILE_0
              additionalProperties: false
              properties:
                STORE_PROFILE_0:
                  type: object
                  additionalProperties: true
            example:
              STORE_PROFILE_0:
                - {}
                - bedroom1
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STORE_PROFILE_TIMER_0:
    post:
      operationId: command_STORE_PROFILE_TIMER_0
      tags:
        - profiles
      summary: Store timer levels directly to timeclock
      deprecated: false
      description: |
        Send NeoHub command `STORE_PROFILE_TIMER_0` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STORE_PROFILE_TIMER_0": [{}, "Office"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STORE_PROFILE_TIMER_0
              additionalProperties: false
              properties:
                STORE_PROFILE_TIMER_0:
                  type: object
                  additionalProperties: true
            example:
              STORE_PROFILE_TIMER_0:
                - {}
                - Office
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/STORE_RECIPE:
    post:
      operationId: command_STORE_RECIPE
      tags:
        - recipes
      summary: Store a named recipe
      deprecated: false
      description: |
        Send NeoHub command `STORE_RECIPE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"STORE_RECIPE": ["test4", [], ["kitchen"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - STORE_RECIPE
              additionalProperties: false
              properties:
                STORE_RECIPE:
                  type: object
                  additionalProperties: true
            example:
              STORE_RECIPE:
                - test4
                - []
                - - kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SUMMER_OFF:
    post:
      operationId: command_SUMMER_OFF
      tags:
        - zones
      summary: Cancel summer/frost for thermostats
      deprecated: false
      description: |
        Send NeoHub command `SUMMER_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SUMMER_OFF": ["Bathroom"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SUMMER_OFF
              additionalProperties: false
              properties:
                SUMMER_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              SUMMER_OFF:
                - Bathroom
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/SUMMER_ON:
    post:
      operationId: command_SUMMER_ON
      tags:
        - zones
      summary: Summer frost for thermostats only
      deprecated: false
      description: |
        Send NeoHub command `SUMMER_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"SUMMER_ON": ["lounge", "bed1"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SUMMER_ON
              additionalProperties: false
              properties:
                SUMMER_ON:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              SUMMER_ON:
                - lounge
                - bed1
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/TIME_ZONE:
    post:
      operationId: command_TIME_ZONE
      tags:
        - time
      summary: Timezone offset from GMT
      deprecated: false
      description: |
        Send NeoHub command `TIME_ZONE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"TIME_ZONE": 0}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - TIME_ZONE
              additionalProperties: false
              properties:
                TIME_ZONE:
                  type: number
            example:
              TIME_ZONE: 0
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/TIMER_HOLD_OFF:
    post:
      operationId: command_TIMER_HOLD_OFF
      tags:
        - timeclock
      summary: Override timeclock off for N minutes
      deprecated: false
      description: |
        Send NeoHub command `TIMER_HOLD_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"TIMER_HOLD_OFF": [15, "clock"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - TIMER_HOLD_OFF
              additionalProperties: false
              properties:
                TIMER_HOLD_OFF:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: integer
                      description: Minutes (0 cancels)
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              TIMER_HOLD_OFF:
                - 15
                - clock
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/TIMER_HOLD_ON:
    post:
      operationId: command_TIMER_HOLD_ON
      tags:
        - timeclock
      summary: Override timeclock on for N minutes
      deprecated: false
      description: |
        Send NeoHub command `TIMER_HOLD_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"TIMER_HOLD_ON": [15, "clock"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - TIMER_HOLD_ON
              additionalProperties: false
              properties:
                TIMER_HOLD_ON:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: integer
                      description: Minutes (0 cancels)
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              TIMER_HOLD_ON:
                - 15
                - clock
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/TIMER_OFF:
    post:
      operationId: command_TIMER_OFF
      tags:
        - timeclock
      summary: Turn neoPlug/timeclock output off
      deprecated: false
      description: |
        Send NeoHub command `TIMER_OFF` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"TIMER_OFF": "plug"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - TIMER_OFF
              additionalProperties: false
              properties:
                TIMER_OFF:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              TIMER_OFF: plug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/TIMER_ON:
    post:
      operationId: command_TIMER_ON
      tags:
        - timeclock
      summary: Turn neoPlug/timeclock output on
      deprecated: false
      description: |
        Send NeoHub command `TIMER_ON` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"TIMER_ON": "plug"}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - TIMER_ON
              additionalProperties: false
              properties:
                TIMER_ON:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              TIMER_ON: plug
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/UNLOCK:
    post:
      operationId: command_UNLOCK
      tags:
        - zones
      summary: Unlock PIN-locked thermostat(s)
      deprecated: false
      description: |
        Send NeoHub command `UNLOCK` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"UNLOCK": ["Bathroom", "kitchen"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - UNLOCK
              additionalProperties: false
              properties:
                UNLOCK:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              UNLOCK:
                - Bathroom
                - kitchen
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/USER_LIMIT:
    post:
      operationId: command_USER_LIMIT
      tags:
        - zones
      summary: Limit on-device setpoint adjustments
      deprecated: false
      description: |
        Send NeoHub command `USER_LIMIT` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"USER_LIMIT": [5, ["bed1", "lounge"]]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - USER_LIMIT
              additionalProperties: false
              properties:
                USER_LIMIT:
                  type: array
                  minItems: 2
                  maxItems: 2
                  prefixItems:
                    - type: number
                    - oneOf:
                        - type: string
                          description: Single zone/device/group name
                        - type: integer
                          description: Device id
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: integer
                          description: List of zone/device/group names or ids
                        - type: integer
                          const: 0
                          description: Affect all devices (where supported)
            example:
              USER_LIMIT:
                - 5
                - - bed1
                  - lounge
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/VIEW_ROC:
    post:
      operationId: command_VIEW_ROC
      tags:
        - stats
      summary: View rate-of-change (minutes per degree)
      deprecated: false
      description: |
        Send NeoHub command `VIEW_ROC` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"VIEW_ROC": ["Bathroom1"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - VIEW_ROC
              additionalProperties: false
              properties:
                VIEW_ROC:
                  oneOf:
                    - type: string
                      description: Single zone/device/group name
                    - type: integer
                      description: Device id
                    - type: array
                      items:
                        oneOf:
                          - type: string
                          - type: integer
                      description: List of zone/device/group names or ids
                    - type: integer
                      const: 0
                      description: Affect all devices (where supported)
            example:
              VIEW_ROC:
                - Bathroom1
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
  /commands/ZONE_TITLE:
    post:
      operationId: command_ZONE_TITLE
      tags:
        - devices
      summary: Rename a zone
      deprecated: false
      description: |
        Send NeoHub command `ZONE_TITLE` over the authenticated WSS envelope. The logical HTTP mapping exists only for documentation.
        
        **Logical command object:** `{"ZONE_TITLE": ["HCtest", "HCtest2"]}`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - ZONE_TITLE
              additionalProperties: false
              properties:
                ZONE_TITLE:
                  type: array
                  minItems: 2
                  maxItems: 2
                  items:
                    type: string
            example:
              ZONE_TITLE:
                - HCtest
                - HCtest2
      responses:
        200:
          description: "Hub reply after unwrapping `WsResponse.response` (payload shape varies by command)."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CommandResult"
components:
  securitySchemes:
    NeoHubToken:
      type: apiKey
      in: header
      name: X-NeoHub-Token
      description: "Logical representation of the token embedded in the WSS `message` JSON (`token` field). Not an HTTP header on the wire."
  schemas:
    WsRequest:
      type: object
      required:
        - message_type
        - message
      properties:
        message_type:
          type: string
          const: hm_get_command_queue
        message:
          type: string
          description: "JSON string containing {token, COMMANDS:[{COMMAND, COMMANDID}]}. Outer/nested framing is RFC 8259 JSON; each COMMAND value is Heatmiser single-quoted form (e.g. {'GET_LIVE_DATA': 0}), not double-quoted JSON."
      example:
        message_type: hm_get_command_queue
        message: "{\"token\":\"YOUR_TOKEN\",\"COMMANDS\":[{\"COMMAND\":\"{'GET_LIVE_DATA': 0}\",\"COMMANDID\":1}]}"
    WsResponse:
      type: object
      properties:
        command_id:
          type: integer
        device_id:
          type: string
        message_type:
          type: string
          const: hm_set_command_response
        response:
          type: string
          description: JSON-encoded command result
      example:
        command_id: 1
        device_id: "D8:80:39:AD:0D:F0"
        message_type: hm_set_command_response
        response: "{\"firmware version\":\"2153\"}"
    CommandResult:
      description: Parsed contents of WsResponse.response
      oneOf:
        - type: object
          additionalProperties: true
        - type: array
        - type: string
        - type: number
        - type: boolean
    HubseekResponse:
      type: object
      properties:
        ip:
          type: string
          example: 192.168.0.19
        device_id:
          type: string
          example: "D8:80:39:AD:0D:F0"
    DeviceLive:
      type: object
      properties:
        ZONE_NAME:
          type: string
        DEVICE_ID:
          type: integer
        ACTUAL_TEMP:
          type: string
        SET_TEMP:
          type: string
        COOL_TEMP:
          type: number
        HEAT_ON:
          type: boolean
        COOL_ON:
          type: boolean
        HEAT_MODE:
          type: boolean
        COOL_MODE:
          type: boolean
        STANDBY:
          type: boolean
        AWAY:
          type: boolean
        HOLIDAY:
          type: boolean
        OFFLINE:
          type: boolean
        LOW_BATTERY:
          type: boolean
        LOCK:
          type: boolean
        WINDOW_OPEN:
          type: boolean
        HOLD_ON:
          type: boolean
        HOLD_TEMP:
          type: number
        HOLD_TIME:
          type: string
        THERMOSTAT:
          type: boolean
        TIMECLOCK:
          type: boolean
        TIMER_ON:
          type: boolean
        ACTIVE_PROFILE:
          type: integer
        ACTIVE_LEVEL:
          type: integer
        HC_MODE:
          type: string
        FAN_SPEED:
          type: string
        FAN_CONTROL:
          type: string
        CURRENT_FLOOR_TEMPERATURE:
          type: number
        FLOOR_LIMIT:
          type: boolean
        WRITE_COUNT:
          type: integer
        RECENT_TEMPS:
          type: array
          items:
            type: string
    LiveData:
      type: object
      properties:
        HUB_TIME:
          type: integer
        HUB_AWAY:
          type: boolean
        HUB_HOLIDAY:
          type: boolean
        HOLIDAY_END:
          type: integer
        GLOBAL_SYSTEM_TYPE:
          type: string
        CLOSE_DELAY:
          type: integer
        OPEN_DELAY:
          type: integer
        COOL_INPUT:
          type: boolean
        TIMESTAMP_SYSTEM:
          type: integer
        TIMESTAMP_DEVICE_LISTS:
          type: integer
        TIMESTAMP_ENGINEERS:
          type: integer
        TIMESTAMP_PROFILE_0:
          type: integer
        TIMESTAMP_PROFILE_COMFORT_LEVELS:
          type: integer
        TIMESTAMP_PROFILE_TIMERS:
          type: integer
        TIMESTAMP_PROFILE_TIMERS_0:
          type: integer
        devices:
          type: array
          items:
            $ref: "#/components/schemas/DeviceLive"
    SystemInfo:
      type: object
      properties:
        DEVICE_ID:
          type: string
        HUB_VERSION:
          type: integer
        HUB_TYPE:
          type: integer
          description: "1=G1, 2=G2 HomeKit, 3=neoAir Hub / Mini"
        CORF:
          type: string
          enum:
            - C
            - F
        FORMAT:
          type: integer
        ALT_TIMER_FORMAT:
          type: integer
        HEATING_LEVELS:
          type: integer
        HEATORCOOL:
          type: string
        TIME_ZONE:
          type: number
        UTC:
          type: integer
        TIMESTAMP:
          type: integer
        NTP_ON:
          type: string
        DST_AUTO:
          type: boolean
        DST_ON:
          type: boolean
        PARTITION:
          type: string
        TIMEZONESTR:
          type: string
security:
  - NeoHubToken: []
