====== S-RMS API ====== The API is a REST API with a bearer token authorization. The API specification can be found [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/api/data_api/index_s_access_api_v_1_0.html|here]]. ===== Adding an access code ===== An access code can be added with a POST to /api/v1/room/{access_code_controller_id}/code The response is a HTTP 202 Accepted. The access_code_controller_id path parameter is the ID of the controller to add the code to (eg.: access_code_controller_01, access_code_controller_02). The POST data is a JSON containing the necessary data for a valid access code. { "code": 123, // The access code in decimal representation "label": "Guest 1", // The code label or description (can be empty) "code_type": 1, // The code type "valid_from": "2022-10-24T07:33:21.674Z", // Start time of code validity in the UTC timezone (can be null for no start limit) "valid_to": "2022-10-30T07:33:21.674Z", // End time of code validity in the UTC timezone (can be null for no end limit) "access": [ // List of access points to grant the access to { "access_point": 1, // Access point ID "remaining_passes": 3 // Number of passes for the access point (can be null for unlimited passes) }, { "access_point": 2, // Access point ID "remaining_passes": null // Number of passes for the access point (can be null for unlimited passes) } ] } A valid code must contain at least one access point with the remaining number of passes greater than 0 and must not be expired. ===== Removing an access code ===== An access code can be removed with a DELETE to /api/v1/room/{access_code_controller_id}/code/{code} The response is a HTTP 204. The access_code_controller_id path parameter is the ID of the controller to remove the code from (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to remove. ===== Updating an access code ===== An access code can be updated with a PUT to /api/v1/room/{access_code_controller_id}/code/{code} The response is a HTTP 202 Accepted. The access_code_controller_id path parameter is the ID of the controller to update the code on (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to update. The PUT data is a JSON containing the necessary data for a valid access code. { "code": 123, // The access code in decimal representation "label": "Guest 1", // The code label or description (can be empty) "code_type": 1, // The code type "valid_from": "2022-10-24T07:33:21.674Z", // Start time of code validity in the UTC timezone (can be null for no start limit) "valid_to": "2022-10-30T07:33:21.674Z", // End time of code validity in the UTC timezone (can be null for no end limit) "access": [ // List of access points to grant the access to { "access_point": 1, // Access point ID "remaining_passes": 3 // Number of passes for the access point (can be null for unlimited passes) }, { "access_point": 2, // Access point ID "remaining_passes": null // Number of passes for the access point (can be null for unlimited passes) } ] } A valid code must contain at least one access point with the remaining number of passes greater than 0 and must not be expired. If no access points are specified then the access points of the access code are **not modified**. ==== Updating only one access point of a code ==== === Removing an access point === An access point of an access code can be removed with a DELETE to /api/v1/room/{access_code_controller_id}/code/{code}/access_point/{ap_id} The response is a HTTP 204. The access_code_controller_id path parameter is the ID of the controller to update the code on (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to update. The ap_id path parameter is the ID of the access point to remove. === Adding or updating an access point === An access point of an access code can be added/updated with a PUT to /api/v1/room/{access_code_controller_id}/code/{code}/access_point/{ap_id} The response is a HTTP 202. The access_code_controller_id path parameter is the ID of the controller to update the code on (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to update. The ap_id path parameter is the ID of the access point to remove. The PUT data is a JSON containing the necessary data for a valid access point. { "access_point": 1, // Access point ID "remaining_passes": 3 // Number of passes for the access point (can be null for unlimited passes) } ===== Reading an access code ===== An access code can be read with a GET to /api/v1/room/{access_code_controller_id}/code/{code} The access_code_controller_id path parameter is the ID of the controller to update the code on (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to update. The response is a JSON containing code data. { "code": 123, // The access code in decimal representation "label": "Guest 1", // The code label or description (can be empty) "code_type": 1, // The code type "valid_from": "2022-10-24T07:33:21.674Z", // Start time of code validity in the UTC timezone (can be null for no start limit) "valid_to": "2022-10-30T07:33:21.674Z", // End time of code validity in the UTC timezone (can be null for no end limit) "access": [ // List of access points to grant the access to { "access_point": 1, // Access point ID "remaining_passes": 3 // Number of passes for the access point (can be null for unlimited passes) }, { "access_point": 2, // Access point ID "remaining_passes": null // Number of passes for the access point (can be null for unlimited passes) } ] } ==== Reading code data of a specified access point ==== Access point data of an access code can be read with a GET to /api/v1/room/{access_code_controller_id}/code/{code}/access_point/{ap_id} The access_code_controller_id path parameter is the ID of the controller to read the code from (eg.: access_code_controller_01, access_code_controller_02). The code path parameter is the decimal representation of the code to read. The ap_id path parameter is the ID of the access point to read. The response is a JSON with the access point data. { "access_point": 1, // Access point ID "remaining_passes": 3 // Number of passes for the access point (can be null for unlimited passes) } ===== Reading/Setting room devices data ===== Each room is split into logical //things// that represent controllable devices in the room. The different types of things are: * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/light-1_0.html|light]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/dimmable_light-1_0.html|dimmable light]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/scene-1_0.html|scene]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/blinds-1_0.html|blinds]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/dnd_mur-1_0.html|DND/MUR]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/sos_alert-1_0.html|SOS]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/fire_alert-1_0.html|fire alert]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/door-1_0.html|door]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/hvac-1_0.html|HVAC]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/hvac_setpoints-1_0.html|HVAC setpoints]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/ventilation-1_0.html|bathroom ventilation]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/room_presence-1_0.html|room presence]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/room_power_supply-1_0.html|room power supply]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/room-1_0.html|room]] * [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/wake_up-1_0.html|wake up]] The parent of all these things is the [[https://tmpxems.smipcloud.com/res_db/realms/xems/doc/edge/things/s_rms/com/robotina/s_rms/iot_things/room_controller-1_0.html|room controller]]. ==== Reading room device data ==== Geting the room device state is done with a GET to /api/v1/things/rt/{thing_id} The thing_id path parameter is the ID of the device to read the state from (eg.: room_01_light_1, room_02_hvac). The response is a JSON with the device state. === Light state === { "id": "room_01_light_1", "type": "com.robotina.s_rms.iot_things.light-1_0", "vars": { "light": "0" } } === Dimmable light state === { "id": "room_01_dimmable_light_1", "type": "com.robotina.s_rms.iot_things.dimmable_light-1_0", "vars": { "dimmer": "0", "dimmer_level": "0" } } === Scene state === { "id": "room_01_scene_1", "type": "com.robotina.s_rms.iot_things.scene-1_0", "vars": { "scene_status": "1" } } === Blinds state === { "id": "room_01_scene_1", "type": "com.robotina.s_rms.iot_things.scene-1_0", "vars": { "scene_status": "1" } } === DND/MUR state === { "id": "room_01_dnd_mur", "type": "com.robotina.s_rms.iot_things.dnd_mur-1_0", "vars": { "mur_status": "1", "dnd_status": "0" } } === SOS state === { "id": "room_01_sos", "type": "com.robotina.s_rms.iot_things.sos_alert-1_0", "vars": { "sos_status": "0" } } === Fire alert state === { "id": "room_01_fire_alert", "type": "com.robotina.s_rms.iot_things.fire_alert-1_0", "vars": { "fire_alert_status": "0" } } === Door state === { "id": "room_01_door", "type": "com.robotina.s_rms.iot_things.door-1_0", "vars": { "door_status": "0", "door_open_code_type": "0", "door_bell": "0", "door_bell_status": "0", "door_bell_preset": "1000", "access_lock": "0" } } === HVAC state === { "id": "room_01_hvac", "type": "com.robotina.s_rms.iot_things.hvac-1_0", "vars": { "hvac_room_mode": "2", "hvac_room_status": "6", "hvac_room_measured": "23.1", "hvac_room_fan": "0", "hvac_room_setpoint": "23.8", "hvac_room_fan_mode": "2" } } === HVAC setpoints state === { "id": "room_01_hvac_setpoints", "type": "com.robotina.s_rms.iot_things.hvac_setpoints-1_0", "vars": { "hvac_room_setpoint_cool_idle": "30.0", "hvac_room_setpoint_heat_idle": "10.0", "hvac_room_fan_idle": "1", "hvac_room_setpoint_cool_book": "25.0", "hvac_room_setpoint_heat_book": "18.0", "hvac_room_fan_book": "2", "hvac_room_setpoint_guest": "23.8", "hvac_room_fan_guest": "2", "hvac_room_setpoint_cool_max": "30.0", "hvac_room_setpoint_cool_min": "18.0", "hvac_room_setpoint_heat_max": "25.0", "hvac_room_setpoint_heat_min": "10.0", "hvac_room_offset_cool_night": "2.0", "hvac_room_offset_heat_night": "-2.0", "hvac_room_fan_night": "1", "def_hvac_room_setpoint_cool_idle": "30.0", "def_hvac_room_setpoint_heat_idle": "10.0", "def_hvac_room_fan_idle": "1", "def_hvac_room_setpoint_cool_book": "25.0", "def_hvac_room_setpoint_heat_book": "18.0", "def_hvac_room_fan_book": "2", "def_hvac_room_setpoint_guest": "22.4", "def_hvac_room_fan_guest": "1", "def_hvac_room_setpoint_cool_max": "30.0", "def_hvac_room_setpoint_cool_min": "18.0", "def_hvac_room_setpoint_heat_max": "25.0", "def_hvac_room_setpoint_heat_min": "10.0", "def_hvac_room_offset_cool_night": "2.0", "def_hvac_room_offset_heat_night": "-2.0", "def_hvac_room_fan_night": "1" } } === Bathroom ventilation state === { "id": "room_01_ventilation", "type": "com.robotina.s_rms.iot_things.ventilation-1_0", "vars": { "ventilation_status": "0", "ventilation_timeout": "30" } } === Room presence state === { "id": "room_01_presence", "type": "com.robotina.s_rms.iot_things.room_presence-1_0", "vars": { "presence_status": "1", "presence_state": "1", "presence_type": "0", "presence_pir_sensor": "0", "presence_door_sensor": "0", "presence_aux_sensor": "0", "presence_long_preset": "900", "presence_short_preset": "5" } } === Room power supply state === { "id": "room_01_power_supply", "type": "com.robotina.s_rms.iot_things.room_power_supply-1_0", "vars": { "power_booked": "1", "power_presence": "1" } } === Room state === { "id": "room_01", "type": "com.robotina.s_rms.iot_things.room-1_0", "vars": { "room_number": "102", "room_status": "0", "booked_state": "1", "booked_on_code": "1" } } === Wake up state === { "id": "room_01_wake_up", "type": "com.robotina.s_rms.iot_things.wake_up-1_0", "vars": { "wakeup_status": "0", "wakeup_enabled": "0", "wakeup_time_hour": "8", "wakeup_time_min": "0", "wakeup_scene_enabled": "0" } } ==== Setting room device state ==== For writable device variables the state can be changed with a POST to /api/v1/things/rt/{thing_id} The thing_id path parameter is the ID of the device to read the state to (eg.: room_01_light_1, room_02_hvac). The POST data is a JSON containing **only** the variables to change. { "vars": { "variable_to_change_1": "new_value_1", "variable_to_change_2": "new_value_2" } } The variable structure is the same as the response for reading device states. The response is the updated device state (same as in a read request).