kubi 2.0 User Guideby iPresence

For developers: Bluetooth spec

kubi 2.0 communicates with an iPad or other device over Bluetooth Low Energy (BLE). This page publishes the specification for controlling kubi 2.0's head and reading its status from your own app or service.

The specification is subject to change without notice. Check this page for the latest version.

kubi 2.0 GATT services
// Device name: kubi + MAC address
Generic Access        0x1800
Device Information    0x180A
Custom Control        2a001800-…-1d9ff2d5c442
  ├ Pan  goal position  0x9145
  ├ Tilt goal position  0x9146
  └ 2-byte reg. write  0x9142
Custom Status         0xE001
  ├ Battery voltage    0xE101
  ├ Servo error        0xE102
  └ Battery status     0xE105
See the tables below for full UUIDs.

Advertising and device info

Advertising Data

ItemValueDescription
AD Type 0x01 (Flags)0x06LE General Discoverable / BR/EDR Not Supported

Scan Response Data

ItemValueDescription
AD Type 0x09 (Complete Local Name)kubi24587CEFC55E (example)"kubi" + MAC address

Generic Access (0x1800) and Device Information (0x180A)

CharacteristicPropertyValue
0x2A00 Device NameRead"kubi" + MAC address
0x2A01 AppearanceReadGeneric Remote Control
0x2A25 Serial Number StringReadLast 6 digits of the MAC address
0x2A24 Model Number StringReadiPre-K
0x2A29 Manufacturer Name StringReadiPresence Co., Ltd.
0x2A27 Hardware Revision StringReadHardware revision (string)
0x2A26 Firmware Revision StringReadFirmware revision (string)

Head control (Custom Control service)

Service UUID: 2a001800-2803-2801-2800-1d9ff2d5c442. Characteristic UUIDs take the form 0000XXXX-0000-1000-8000-00805f9b34fb (XXXX in the table).

UUIDPropertyLengthDescription
9141Write5byteWrite to a 1-byte register (unused)
9142Write5byteWrite to a 2-byte register (velocity and acceleration)
9143Write5byteRead a 1-byte register (unused)
9144Write2byteRequest to read a 2-byte register
9145Read, Write2byteGoal position for the pan servo
9146Read, Write5byteGoal position for the tilt servo
9147Read, Notify5byteValue read from a register (notified when read)
9149Read, Notify9byteResponse to the previous command (unused)

Goal position (9145: pan / 9146: tilt)

Format
2 bytes, MSB then LSB. Example: 0x02 0x00 (0x0200)
Value range
0 (0x0000) to 1023 (0x03FF)
Movable range
Pan (left/right): 0 (0x0000) to 1023 (0x03FF) / Tilt (up/down): 432 (0x01B0) to 620 (0x026C)
Conversion to angle
value × 0.29 ≈ angle [°]. Example: 0x0200 (512) × 0.29 ≈ 150°

Reading the current position (9144 → 9147)

Read request (9144)
2 bytes: ID and Address. ID: 0x01 pan / 0x02 tilt. Address: 0x24 only.
Notified value (9147)
5 bytes: ID, Address (0x24), Length (0x02), LSB, MSB. Example: 0x01 0x24 0x02 0x00 0x02 means the current pan position is 0x0200 (≈150°).

Velocity and acceleration (9142: write to a 2-byte register)

Write ID, Address, LSB, MSB in that order. ID: 0x01 pan / 0x02 tilt. Only Address 0x20 (velocity) and 0x6C (acceleration) are supported.

ItemAddressExampleRangeDefaultGuaranteed rangeConversion
Profile Velocity0x200x01 0x20 0x4E 0x000–102378 (0x004E)78–156value × 0.111 ≈ rpm (78 ≈ 9 rpm)
Profile Acceleration0x6C0x01 0x6C 0x03 0x000–327673 (0x0003)3–6value × 214.577 ≈ rpm² (3 ≈ 644 rpm²)
Velocity and acceleration take effect when the goal position is updated

After changing them, write the goal position (9145 / 9146). Do not use values outside the guaranteed range.

Reading status (Custom Status service)

Service UUID: 0000e001-0000-1000-8000-00805f9b34fb

UUIDPropertyLengthDescription
0000e101-…Read2byteBattery voltage [mV]. LSB then MSB. Example: 0x74 0x0E = 0x0E74 = 3,700mV
0000e102-…Read, Write, Notify2byteServo error (notified when it occurs). See the table below
0000e103-…Read2byteID of the servo with the error (0x01 pan / 0x02 tilt)
0000e104-…Read, Write3byteIndicator color (R, G, B, each 0–255)
0000e105-…Read, Notify1byteBattery status (notified on change). See the table below
0000e10a-…Read, Notify1bytePower button state (0x00: released / 0x01: pressed; notified on change)

"…" in the UUIDs stands for -0000-1000-8000-00805f9b34fb.

Servo error (e102)

BitErrorDescription
5Overload ErrorA load above maximum output continues
4Electrical Shock ErrorAn electrical fault in the circuit, or not enough power to drive the motor
2Overheating ErrorThe internal temperature exceeded the set operating temperature
0Input Voltage ErrorThe input voltage exceeded the set operating voltage

Bits 7, 6, 3 and 1 are not used.

Battery status (e105)

ValueStatus
1Normal
3System Reset
5Low Battery
7System Reset / Low Battery
9Charging
11System Reset / Charging
13Low Battery / Charging
15System Reset / Low Battery / Charging

Development inquiries

iPresence is looking for companies and developers who want to build kubi 2.0's movement into their own AI agents or services, as AI development partners. Contact us about integrating with existing systems or aligning technical requirements.

Ask about development