As of now, two types of interactions with the Qolsys IQ Panel 2+ seem possible:
- actions, which are commands that we are sending to the panel to expect a reaction, and
- events which are information that the panel share with us
There is also an ACK
response that is given by the panel in reponse to
anything being sent to it, to indicate that it properly received the request;
note that receiving an ACK
response does not mean that the panel will do
anything with what we sent, nor that the command was valid.
This document cannot be expected to be an exhaustive review of the Qolsys Panel's Control4 interface. However, it contains all of the information that is currently available to me. If you know of other command types, other actions, other events, or even other parameters as part of the actions and events, please make a pull request.
All actions seem to be sharing a common part of their payload, and specific
other values. Every action type (e.g. INFO
) seem to have a field to
indicate a subtype of that action (e.g. info_type
).
All actions require a token
to work, which is provided from the Qolsys
Panel.
The INFO
action type is principally used to query for the summary of the
state of the panel at the current time, which includes information about all
the partitions and sensors. An INFO
action will generally be followed by
an INFO
event as response from the panel.
{
"action": "INFO",
"info_type": "SUMMARY",
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
The ARMING
action type allows to handle everything about arming and
disarming the Qolsys Panel. The arming_type
field will be used to
indicate if we want to arm or disarm the panel, and in the former case,
if we want to arm in the stay or away modes.
This action requires to provide a partition_id
, which is the ID of
the partition on which we want to act.
There is no extra parameter when using ARM_STAY
as arming_type
.
{
"action": "ARMING",
"arming_type": "ARM_STAY",
"partition_id": 0,
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
When using ARM_AWAY
as arming_type
, we can use the delay
parameter
to specify how long to leave as exit delay, between the moment the panel
enters the arming mode, and the moment the panel is fully armed. If that
parameter is not provided, it will simply use the default value configured
in the panel. If the delay
is set to 0
, the panel will immediately
be armed, without an arming period.
We can also use a bypass
parameter, to specify whether to bypass the
sensors "open" when arming. If set to "true"
, the sensors will be
bypassed and the alarm will be armed. If set to "false"
, any sensor
"open" at the time of arming will prevent the system from being armed.
{
"action": "ARMING",
"arming_type": "ARM_AWAY",
"partition_id": 0,
"delay": 10,
"bypass": "false",
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
When using DISARM
as arming_type
, the extra parameter usercode
is required, and must contain a valid disarm code for the panel.
{
"action": "ARMING",
"arming_type": "DISARM",
"partition_id": 0,
"usercode": "4242",
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
The ALARM
action type allows to trigger the alarm of the panel.
The alarm_type
field will be used to indicate which type of alarm is
being triggered.
This action requires to provide a partition_id
, which is the ID of
the partition on which we want to act.
There is no extra parameter when using POLICE
as alarm_type
.
This alarm type is for a police emergency.
{
"action": "ALARM",
"alarm_type": "POLICE",
"partition_id": 0,
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
There is no extra parameter when using FIRE
as alarm_type
.
This alarm type is for a fire, CO or smoke emergency.
{
"action": "ALARM",
"alarm_type": "FIRE",
"partition_id": 0,
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
There is no extra parameter when using AUXILIARY
as alarm_type
.
This alarm type is for a medical emergency.
{
"action": "ALARM",
"alarm_type": "AUXILIARY",
"partition_id": 0,
"token": "<token>",
"nonce": "qolsys",
"source": "C4",
"version": 0
}
Events represent what is happening in the panel or the linked sensors, either through our control (we sent an action to request that event) or outside of our control.
The common field to all events is the request_id
, which represents a
UUID-formatted identifiant of the request.
The INFO
event type gives information about the state of the system, either
following an INFO
action type (requesting the alarm system to provide the
information) or simply because of a change in state of the system (e.g. someone
manually changing a parameter in the alarm system).
{
"event": "INFO",
"info_type": "SUMMARY",
"partition_list": [
{
"partition_id": 0,
"name": "partition1",
"status": "DISARM",
"secure_arm": false,
"zone_list": [
{
"id": "xxx-yyyy",
"type": "Door_Window",
"name": "Door NNN",
"group": "entryexitdelay",
"status": "Closed",
"state": "0",
"zone_id": 42,
"zone_physical_type": 1,
"zone_alarm_type": 3,
"zone_type": 1,
"partition_id": 0
},
...
]
}
],
"nonce": "qolsys",
"requestID": "<request_id>"
}
The status
field contains the current status of the alarm, which are:
DISARM
when the alarm is disarmedARM_STAY
when the alarm is armed in stay mode (no motion sensors, just the door and window sensors)ARM_AWAY
when the alarm is armed in away modeENTRY_DELAY
when the alarm is pending to be triggered, but we have time to disarm with the codeALARM
when the alarm is triggeredEXIT_DELAY
when the alarm is arming, giving time to leave the place before being armed (in theSUMMARY
message, this will take the shape ofARM-AWAY-EXIT-DELAY
orARM-STAY-EXIT-DELAY
depending on which arming type will be enabled after the delay)
The zone_list
field contains a list of sensors, for which the possible type
values are:
Door_Window
for door/window sensorsMotion
for motion sensorsPanel Motion
for the motion sensor using the panel's cameraGlass Break
for the glass break detectionPanel Glass Break
for the glass break detection through the panel's microphoneBluetooth
for the bluetooth devices linked to the panelSmokeDetector
for the smoke detectorsCODetector
for the CO detectorsWater
for the water leaks detectorsFreeze
for freeze sensorsHeat
for heat sensorsTilt
for tilt sensors (garage doors)
{
"event": "INFO",
"info_type": "SECURE_ARM",
"partition_id": 0,
"value": true,
"version": 1,
"requestID": "<request_id>"
}
The value
can be true
or false
, depending if Secure Arm has respectively been
enabled or disabled. When Secure Arm is enabled, the alarm system requires a valid
code to arm the alarm system.
The ZONE_EVENT
event type has two subtypes. Both will provide a version
field as well as a zone
field, the latter containing an object with updated
information on a sensor. The zone_event_type
field will indicate the type of
ZONE_EVENT
that happened.
This event happens when a sensor changes state (e.g. a door has been opened or closed), and gives us information about the zone (i.e. sensor) and its new status (open vs. closed).
{
"event": "ZONE_EVENT",
"zone_event_type": "ZONE_ACTIVE",
"version": 1,
"zone": {
"status": "Open",
"zone_id": 42
},
"requestID": "<request_id>"
}
The ZONE_ACTIVE
zone event type is also used by the panel to indicate that
a sensor has been tampered with, or has been restored. The following behaviors
have been identified:
Open
andClosed
have two layers for any given sensor:- An
Open
sensor beingOpen
throughZONE_ACTIVE
is now tampered - A tampered sensor being
Closed
throughZONE_ACTIVE
is no more tampered
- An
- Receiving two
ZONE_ACTIVE
for the same tampered sensor in the same second, the firstOpen
and the secondClosed
, means the sensor is no more tampered, and the nextZONE_ACTIVE
message indicates the current status of the sensor (whether it is currentlyOpen
orClosed
)
This event happens when a sensor was altered and is back in service, but also seem to happen regularly as to inform that the sensors are still in a given state, if they have not had any event in a while.
{
"event": "ZONE_EVENT",
"zone_event_type": "ZONE_UPDATE",
"zone": {
"id": "xxx-yyyy",
"type": "Motion",
"name": "Motion MMM",
"group": "awayinstantmotion",
"status": "Closed",
"state": "0",
"zone_id": 1337,
"zone_physical_type": 2,
"zone_alarm_type": 3,
"zone_type": 2,
"partition_id": 0
},
"version": 1,
"requestID": "<request_id>"
}
This event happens when a sensor is added.
{
"event": "ZONE_EVENT",
"zone_event_type":" ZONE_ADD",
"zone": {
"id":" xxx-yyyy",
"type": "Door_Window",
"name": "Door NNN",
"group": "entryexitdelay",
"status": "Closed",
"state": "0",
"zone_id": 5,
"zone_physical_type": 1,
"zone_alarm_type": 3,
"zone_type": 1,
"partition_id": 0
},
"version": 1,
"requestID": "<request_id>"
}
The ARMING
event type happens when a change occurs in arming state
for one of the partitions of the panel.
{
"event": "ARMING",
"arming_type": "DISARM",
"partition_id": 0,
"version": 1,
"requestID": "<request_id>"
}
The arming_type
correspond to the different valid status
mentionned
above when talking about the INFO
event, except for the ALARM
status, which is not an ARMING
state and thus wouldn't appear here.
The ALARM
event type happens when an alarm is triggered on the panel.
{
"event": "ALARM",
"alarm_type": "",
"partition_id": 0,
"version": 1,
"requestID": "<request_id>"
}
The alarm_type
can be one of POLICE
, FIRE
or AUXILIARY
. It can also be
empty, which is the case when the alarm is triggered by a sensor being Open
while the alarm is armed.
The ERROR
event type happens when an error happens following a command
sent to the panel through the Control4 interface. This means that any
operation done directly on the panel (like typing a disarm code physically)
will not lead to any of those messages.
{
"event": "ERROR",
"partition_id": 0,
"error_type": "DISARM_FAILED",
"description": "Invalid usercode",
"version": 1,
"requestID": "<request_id>"
}
The error_type
corresponds to the type of the error. At the moment, we have
only observed the following ones:
usercode
which happened when trying to arm/disarm the alarm while the keypad was locked (using partitions), or if the 6-digit usercodes are not enabled on a panel version that requires itDISARM_FAILED
which happened when trying to arm/disarm the alarm with an invalid usercode
The description
gives a human-readable version of the error_type
, which
contains a bit more information than the error_type
itself.