Real-time Websocket
Real-time Websocket
Section titled “Real-time Websocket”{% hint style=“success” %} 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. {% endhint %}
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
Section titled “Heartbeat”The client can periodically send a raw string as an application layer keep-alive.
ping
the server will respond
pong
Commands
Section titled “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
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
Section titled “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
Section titled “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": {}}
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
Section titled “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
Section titled “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) |