Summary

Bi-directional control of Rollease Acmeda ARC motorized window treatments via the Automate Pulse Hub. The hub exposes an RS-485 2-wire UART interface using simple ASCII command strings framed with ! start and ; end characters, addressed to a 3-byte hub and (optionally) a 3-byte motor address. Note: user-supplied "RS-232C" hint conflicts with source — source documents RS-485 2-wire; an RS-232↔RS-485 converter is mentioned for controllers with only RS-232.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
# Source: RS-485 2-wire physical layer, async UART framing. 232>485 converter needed for RS-232-only controllers.
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable       # inferred: open/up, close/down, stop, factory reset commands
- routable        # inferred: position routing via m, b, f commands
- queryable       # inferred: N?, r?, f?, pSc?, pVc?, v?, pP? query commands
- levelable       # inferred: percentage position control (m, b commands)

Actions

# Hub-level commands
- id: query_hub_address
  label: Query Pulse Hub Address (broadcast)
  kind: query
  command: "!000V;"
  params: []
  notes: Global address 000. Every hub on the bus replies with its own address (e.g. !XXXV;).

- id: modify_hub_address
  label: Modify Pulse Hub Address
  kind: action
  command: "!XXXG{ZZZ};"
  params:
    - name: XXX
      type: string
      description: Current 3-byte hub address (001-ZZZ)
    - name: ZZZ
      type: string
      description: New 3-byte hub address (001-ZZZ)
  notes: Returns !XXXA; - hub flashes 6 times.

- id: test_hub
  label: Test Pulse Hub
  kind: action
  command: "!XXXT;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address (001-ZZZ)
  notes: Hub flashes to confirm presence.

- id: reset_hub
  label: Module Reset (Hub)
  kind: action
  command: "!XXXD000*;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
  notes: Resets all data of the addressed Pulse Hub.

# Pairing
- id: pair_auto_address
  label: Pair Motor (auto-assign address)
  kind: action
  command: "!XXXD000&;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
  notes: Hub generates a random 3-byte ASCII address for the paired motor.

- id: pair_specific_address
  label: Pair Motor (specific address)
  kind: action
  command: "!XXXD000&{YYY};"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte ASCII motor address to assign (001-ZZZ)

- id: unpair_motor
  label: Unpair Motor
  kind: action
  command: "!XXXD{YYY}#;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address to unpair
  notes: Requires motor feedback. Hub returns !XXXDYYYA; on success.

- id: modify_motor_address
  label: Modify Motor Address
  kind: action
  command: "!XXXD{YYY}@{ZZZ};"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: Current 3-byte motor address
    - name: ZZZ
      type: string
      description: New 3-byte motor address

- id: delete_motor_address
  label: Delete Motor Address
  kind: action
  command: "!XXXD{YYY}$;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address to delete

# Operations
- id: open_up
  label: Open / Up
  kind: action
  command: "!XXXD{YYY}o;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: close_down
  label: Close / Down
  kind: action
  command: "!XXXD{YYY}c;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: stop
  label: Stop
  kind: action
  command: "!XXXD{YYY}s;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: jog_open_up
  label: Jog Open / Up
  kind: action
  command: "!XXXD{YYY}oA;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: jog_close_down
  label: Jog Close / Down
  kind: action
  command: "!XXXD{YYY}cA;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: move_by_percentage
  label: Move by Percentage
  kind: action
  command: "!XXXD{YYY}m{DDD};"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
    - name: DDD
      type: string
      description: 3-digit travel percentage (000-100)
  notes: Absolute travel percentage.

- id: rotate_angle_by_percentage
  label: Rotate Angle by Percentage
  kind: action
  command: "!XXXD{YYY}b{DDD};"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
    - name: DDD
      type: string
      description: 3-digit rotation percentage (0-180 degrees)
  notes: Slat/tilt rotation.

- id: move_to_preferred_limit
  label: Move to Preferred Limit (3rd Position)
  kind: action
  command: "!XXXD{YYY}f;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Hub returns NULL uplink if no 3rd position set, otherwise stop position.

# Queries
- id: query_motor_parameters
  label: Request Motor Parameters
  kind: query
  command: "!XXXD{YYY}N?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Hub replies with 8-digit motor parameter string.

- id: query_current_position
  label: Request Current Position (running)
  kind: query
  command: "!XXXD{YYY}r?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Returns !XXXDYYY U; if no top/bottom limits, else !XXXDYYY rDD1bDD2; with travel% and rotation 0-180.

- id: query_preferred_position
  label: Request 3rd Position (preferred limit)
  kind: query
  command: "!XXXD{YYY}f?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Returns !XXXDYYY U; if no 3rd position set, else position.

- id: query_motor_speed
  label: Request Motor Speed
  kind: query
  command: "!XXXD{YYY}pSc?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Hub replies !XXXDYYY pScDDD; with speed in rpm.

- id: query_motor_voltage
  label: Request Motor Voltage
  kind: query
  command: "!XXXD{YYY}pVc?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Hub replies !XXXDYYY pVcDDD; with voltage in V.

- id: query_motor_version
  label: Request Motor Version
  kind: query
  command: "!XXXD{YYY}v?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: Hub replies !XXXDYYY vA DD; - T = type (A=AC, C=curtain, D=DC, S=socket, L=lighting), VV = version.

- id: query_position_limits
  label: Request Position Limit Setting
  kind: query
  command: "!XXXD{YYY}pP?;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: HH=00 none, HH=01 upper+lower, HH=03 upper+lower+3rd.

# Parameters - limit setting
- id: set_upper_limit
  label: Set Current Position as Upper Limit
  kind: action
  command: "!XXXD{YYY}pEoH;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: set_lower_limit
  label: Set Current Position as Lower Limit
  kind: action
  command: "!XXXD{YYY}pEcH;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: adjust_upper_limit
  label: Adjust Upper Limit
  kind: action
  command: "!XXXD{YYY}pEoA;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: adjust_lower_limit
  label: Adjust Lower Limit
  kind: action
  command: "!XXXD{YYY}pEcA;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: cancel_all_limits
  label: Cancel All Limits
  kind: action
  command: "!XXXD{YYY}pEaC;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: set_favorite_position
  label: Set Current Position as Favorite (3rd) Position
  kind: action
  command: "!XXXD{YYY}pEmH;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: cancel_favorite_position
  label: Cancel Favorite (3rd) Position
  kind: action
  command: "!XXXD{YYY}pEmC;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: modify_position_limit_setting
  label: Modify Position Limit Setting
  kind: action
  command: "!XXXD{YYY}pP{HH};"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
    - name: HH
      type: string
      description: "00 = no limits; 01 = upper+lower; 03 = upper+lower+3rd"

# Speed / gain parameters
- id: increase_continuous_speed
  label: Increase Continuous Running Speed by One Level
  kind: action
  command: "!XXXD{YYY}pGc+;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: decrease_continuous_speed
  label: Decrease Continuous Running Speed by One Level
  kind: action
  command: "!XXXD{YYY}pGc-;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: increase_jog_speed
  label: Increase Jogging Speed by One Level
  kind: action
  command: "!XXXD{YYY}pGd+;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: decrease_jog_speed
  label: Decrease Jogging Speed by One Level
  kind: action
  command: "!XXXD{YYY}pGd-;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: increase_angle_coefficient
  label: Increase Angle Coefficient by One
  kind: action
  command: "!XXXD{YYY}pGa+;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: decrease_angle_coefficient
  label: Decrease Angle Coefficient by One
  kind: action
  command: "!XXXD{YYY}pGa-;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: increase_jog_distance
  label: Increase Jog Distance by One Unit
  kind: action
  command: "!XXXD{YYY}pGr+;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

- id: decrease_jog_distance
  label: Decrease Jog Distance by One Unit
  kind: action
  command: "!XXXD{YYY}pGr-;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

# Motor running mode
- id: set_running_mode_pM01
  label: Set Motor Running Mode pM01
  kind: action
  command: "!XXXD{YYY}pM01;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: "Source: switch motor mode between jog and continuous running."

- id: set_running_mode_pM02
  label: Set Motor Running Mode pM02
  kind: action
  command: "!XXXD{YYY}pM02;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: "Source: motor rotation direction change."

- id: set_running_mode_pM04
  label: Set Motor Running Mode pM04
  kind: action
  command: "!XXXD{YYY}pM04;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: "Source: motor angle direction change."

- id: set_running_mode_pM08
  label: Set Motor Running Mode pM08
  kind: action
  command: "!XXXD{YYY}pM08;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: "Source: slow-start and slow-stop mode."

- id: set_running_mode_pM10
  label: Set Motor Running Mode pM10
  kind: action
  command: "!XXXD{YYY}pM10;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address
  notes: "Source: full-speed start-up mode."

- id: factory_reset
  label: Reset to Factory Default Mode
  kind: action
  command: "!XXXD{YYY}pR*;"
  params:
    - name: XXX
      type: string
      description: 3-byte hub address
    - name: YYY
      type: string
      description: 3-byte motor address

Feedbacks

- id: motor_position
  type: object
  description: "Returned by r/< uplink events and r? query. Shape: { travel_pct: integer 0-100, rotation_deg: integer 0-180 }."
- id: limit_setting_state
  type: enum
  values: [none, upper_lower, upper_lower_third]
  description: "pP? reply. HH=00 none, HH=01 upper+lower, HH=03 upper+lower+3rd."
- id: motor_speed_rpm
  type: integer
  unit: rpm
  description: "pSc? reply, 3-digit value."
- id: motor_voltage
  type: integer
  unit: V
  description: "pVc? reply, 3-digit value."
- id: motor_version
  type: string
  description: "v? reply. T=type (A=AC, C=curtain, D=DC, S=socket, L=lighting), VV=version."
- id: motor_parameters
  type: string
  description: "N? reply, 8-digit parameter string."
- id: stroke_unavailable
  type: enum
  values: [no_stroke, no_position_feedback]
  description: "Uplink !XXXDYYYU; - no top/bottom limits set, no position feedback, or no preset."
- id: hub_ack
  type: string
  description: "Generic hub ack !XXXA; (test, address change)."

Variables

# All settable parameters in source appear as discrete command rows; no continuous settable variables documented.

Events

- id: movement_start
  description: "!XXXDYYY<DD1bDD2; - movement start. DD1=travel%, DD2=rotation 0-180."
- id: movement_stop
  description: "!XXXDYYY rDD1bDD2; - movement end. DD1=travel%, DD2=rotation 0-180."
- id: jog_start
  description: "Jog variant of movement_start."
- id: jog_stop
  description: "Jog variant of movement_stop."
- id: no_movement
  description: "!XXXDYYY U; - movement command rejected (no stroke, no preset, etc)."
- id: pair_result
  description: "!XXXDYYYA; - successful pair / unpair / delete."
- id: address_changed
  description: "!XXXDZZZA; - hub address change confirmation."
- id: hub_test_flash
  description: "!XXXA; + 6 flashes - test command acknowledged."
- id: global_version_burst
  description: "!XXXV; repeated - every hub replies to global V? query."

Macros

# No multi-step sequences described explicitly in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements.

Notes

  • Source protocol is RS-485 2-wire UART (9600 8N1). User-supplied "RS-232C" hint conflicts with source — spec uses serial and notes the RS-485 physical layer; an RS-232↔RS-485 converter is mentioned for RS-232-only controllers.
  • Default Pulse Hub address is 245; global address 000 reserved for broadcast.
  • Motor addresses are 3-byte ASCII ranging 001-ZZZ (digits 0-9 and letters A-Z).
  • Each command string framed with ! (start) and ; (end) ASCII characters.
  • Hub forwards downlink ASCII to the addressed ARC motor over 433 MHz RF and returns motor's uplink reply; controller only talks to hub over serial.
  • Hub manages traffic but buffer overflow possible when many hubs reply to global commands in short window.
  • Pairing / unpairing / address-modify / delete all require motor feedback; controller must wait for hub's uplink reply.
  • Source has typos ("contiuous", "messgae", "charaacter") — preserved where they appear in protocol mnemonics only in notes; command payloads copied verbatim from command tables.

Provenance

source_domains:
  - rolleaseacmeda.com
  - avoutlet.com
source_urls:
  - https://www.rolleaseacmeda.com/docs/default-source/us/smart-home-integration/serial-protocol/Serial_Protocol_PRGM_GL_v1_3pdf.pdf
  - https://www.avoutlet.com/images/product/additional/r/pulse-serial-instructions.pdf
retrieved_at: 2026-06-01T22:33:22.885Z
last_checked_at: 2026-06-02T08:29:14.974Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T08:29:14.974Z
matched_actions: 46
action_count: 46
confidence: medium
summary: "All 46 spec actions map 1-to-1 to verbatim command tokens in the source tables; transport parameters match exactly; source catalogue also has exactly 46 distinct tokens. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "spec covers a single hub/motor pair; one RS-485 line supports up to 32 Pulse Hubs, each hub up to 15 motors."
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
- "firmware version compatibility not stated in source"
- "flow control not stated; defaulted to none."
- "safety interlocks and confirmation requirements not stated."
- "pairing/addressing interaction timing and retries not specified."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0