Real-time Websocket

Specifications for interaction with PlaceOS realtime websocket

The real-time WebSocket works in conjunction with the PlaceOS API. The PlaceOS API can list systems and zones that are then used with the WebSocket.

PlaceOS exposes the endpoint wss://<app_domain>/api/engine/v2/systems/control to allow for real-time communication. The endpoint requires a valid API token.

API tokens are sent in the header of the request.

X-API-Key: <token>

The /websocket endpoint is used to provide real-time interaction with modules running on Engine. It provides an interface to build efficient, responsive user interfaces, monitoring systems and other extensions which require live, two-way or asynchronous interaction.

Heartbeat

The client can periodically send a raw string as an application layer keep-alive.

ping

the server will respond

pong

Commands

Command messages are the basis for interacting with the real-time API. All commands take the form of a JSON payload, and will return a JSON response.

Attribute

Type

Description

id

number or string

A unique ID to associated with the command. This is returned as part of the response. Generally an incrementing counter, however any string or numerical value may be used.

cmd

string

The command type. One of bind, unbind, exec, debug, orignore.

sys

string

The system ID that the command targets.

mod

string

The name of the module that the command targets.

name

string

Method, or status variable name to be interacted with.

5 commands available for the user to perform over the API. These are:

Bind

bind command allows the user to bind to status variable values on a given driver module.

Example of a bind command:

{
  
  "id": 1, # Any number
  "cmd": "bind", # ID of the PlaceOS system
  "sys": "sys-1234", # Name of the PlaceOS module
  "mod": "Bookings",
  "index": 1, # Non-zeroed index of the module in the system. i.e. 1st index is 1
  "name": "bookings" # Name of the variable to bind to
}

After a successful bind you will receive a success response from the server. The ID of the response will match the ID of the message.

{
    "id": 1,
    "type": "success",
    "meta": {
        "sys": "sys-1234",
        "mod": "Bookings",
        "index": 1,
        "name": "bookings"
    }
}

After binding to a status variable the WebSocket will post the current value and any changes to the value until the unbind command is issued.

Example of the value change notification:

{
    "id": 18,
    "type": "notify",
    "value": "[]", # Stringified JSON
    "meta": {
        "sys": "sys-1234",
        "mod": "Bookings",
        "index": 1,
        "name": "bookings"
    }
}

Unbind

unbind command terminates an existing binding for the given driver module.

Example of a unbind command:

{
  "id": 2, # Any number
  "cmd": "unbind",
  "sys": "sys-1234", # ID of the PlaceOS system
  "mod": "Bookings", # Name of the PlaceOS module
  "index": 1, # Non-zeroed index of the module in the system. i.e. 1st index is 1
  "name": "bookings" # Name of the variable to bind to
}

After a successful unbind you will receive a success response from the server. The ID of the response will match the ID of the message.

{
    "id": 2,
    "type": "success",
    "meta": {
        "sys": "sys-1234",
        "mod": "Bookings",
        "index": 1,
        "name": "bookings"
    }
}

Execute

The exec command allows you to call available methods on the target driver.

{
  "id": 3, # Any number
  "cmd": "exec",
  "sys": "sys-1234", # ID of the PlaceOS system
  "mod": "Bookings", # Name of the PlaceOS module
  "index": 1, # Non-zeroed index of the module in the system. i.e. 1st index is 1
  "name": "make_booking", # Name of the method to call
  "args": [1631058815] # List of arguments to pass into the function
}

After a successful execution you will receive a success response from the server. The ID of the response will match the ID of the message. The value return is the value returned by the called method.

{
    "id": 3,
    "type": "success",
    "meta": {
        "sys": "sys-1234",
        "mod": "Bookings",
        "index": 1,
        "name": "bookings"
    },
    "value": {}
}

Debug

This lowers the drivers log level to debug and forwards messages to the connection.

{
    "id": 4,
    "cmd": "debug",
    "sys": "sys-Z6XXA-Kc_v",
    "mod": "Bookings",
    "index": 1,
    "name": "debug"
}

Responds with the module ID that uniquely identifies the code being monitored

{
    "id": 4,
    "type": "success",
    "mod_id": "mod-Z6XXB1doL4",
    "meta": {
        "sys": "sys-Z6XXA-Kc_v",
        "mod": "Bookings",
        "index": 1
    }
}

Log messages are then sent to the browser

{
    "type": "debug",
    "mod": "mod-Z6XXB1doL4",
    "klass": "::Some::Display",
    "level": "debug",
    "msg": "input changed to HDMI"
}

Ignore

The ignore command cancels any debug subscriptions and the log level is restored (if no other connections are debugging).

{
    "id": 5,
    "cmd": "ignore",
    "sys": "sys-Z6XXA-Kc_v",
    "mod": "mod-Z6XXB1doL4",
    "index": null,
    "name": "ignore"
}

responds

{
    "id": 5,
    "type": "success"
}

Errors

Name

Code

Description

parse error

0

invalid JSON sent to the server

bad request

1

request was missing required fields

access denied

2

you don’t have permission to access this system, the access attempt is logged

request failed

3

an error was raised or a promise rejected when processing the request

unknown command

4

the command type unknown, the connection is logged as suspicious

system not found

5

the system does not exist

module not found

6

the module does not exist in the system

unexpected failure

7

a framework level error occurred (this should never happen)

Last updated