Summary

Somfy SDN Series devices communicate over an asynchronous RS485 bus using addressed binary messages. Source documents device management, configuration, movement control, status queries, acknowledgments, timing, collision handling, and checksum behavior.

Transport

protocols:
  - serial
serial:
  baud_rate: 4800
  data_bits: 8
  parity: odd
  stop_bits: 1
  character_coding: NRZ
  bit_order: least_significant_bit_first
  data_inversion: true
auth:
  type: UNRESOLVED  # source does not state this (was inferred none: no auth procedure in source)

Traits

- routable  # inferred from point-to-point, group, and broadcast addressing
- queryable  # inferred from GET_* status and configuration messages
- levelable  # inferred from position percentage control

Actions

- id: get_node_addr
  label: Get Node ID
  kind: query
  command: "MSG=40h GET_NODE_ADDR"
  params: []

- id: set_group_addr
  label: Set Group Address
  kind: action
  command: "MSG=51h SET_GROUP_ADDR"
  params:
    - name: group_index
      type: integer
      description: Group table entry, 0 through 15
    - name: group_id
      type: integer
      description: 24-bit group address

- id: get_group_addr
  label: Get Group Address
  kind: query
  command: "MSG=41h GET_GROUP_ADDR"
  params:
    - name: group_index
      type: integer
      description: Group table entry, 0 through 15

- id: ack
  label: Acknowledge
  kind: feedback
  command: "MSG=7Fh ACK"
  params: []

- id: nack
  label: Negative Acknowledge
  kind: feedback
  command: "MSG=6Fh NACK"
  params:
    - name: error_code
      type: integer
      description: 01h data out of range, 10h unknown message, 11h message length error, FFh busy

- id: get_node_app_version
  label: Get Firmware Revision
  kind: query
  command: "MSG=74h GET_NODE_APP_VERSION"
  params: []

- id: set_node_label
  label: Set User-defined Text Label
  kind: action
  command: "MSG=55h SET_NODE_LABEL"
  params:
    - name: label
      type: string
      description: 16-character label; pad shorter values with spaces

- id: get_node_label
  label: Get User-defined Text Label
  kind: query
  command: "MSG=45h GET_NODE_LABEL"
  params: []

- id: set_local_ui
  label: Set Local UI State
  kind: action
  command: "MSG=17h SET_LOCAL_UI"
  params:
    - name: function
      type: integer
      description: 00h enable/unlock, 01h disable/lock
    - name: ui_index
      type: integer
      description: 00h all local controls and feedbacks; 01h DCT input; 02h local stimuli; 03h local radio access; 04h Touch Motion; 05h LEDs
    - name: priority
      type: integer
      description: Priority 00h through FFh

- id: get_local_ui
  label: Get Local UI State
  kind: query
  command: "MSG=27h GET_LOCAL_UI"
  params:
    - name: ui_index
      type: integer
      description: UI index

- id: set_motor_ip
  label: Set Intermediate Position
  kind: action
  command: "MSG=15h SET_MOTOR_IP"
  params:
    - name: function
      type: integer
      description: 00h delete, 01h current position, 03h specified percentage, 04h divide full range
    - name: ip_index
      type: integer
      description: Intermediate-position index, 1 through 16
    - name: value
      type: integer
      description: Function-dependent 16-bit value

- id: get_motor_ip
  label: Get Intermediate Position
  kind: query
  command: "MSG=25h GET_MOTOR_IP"
  params:
    - name: ip_index
      type: integer
      description: Intermediate-position index, 1 through 16

- id: set_motor_rolling_speed
  label: Set Motor Rolling Speed
  kind: action
  command: "MSG=13h SET_MOTOR_ROLLING_SPEED"
  params:
    - name: up_speed
      type: integer
      description: Speed during upward movement; range depends on motor technical datasheet
    - name: down_speed
      type: integer
      description: Speed during downward movement; range depends on motor technical datasheet
    - name: slow_speed
      type: integer
      description: Speed for adjustment movements; range depends on motor technical datasheet

- id: get_motor_rolling_speed
  label: Get Motor Rolling Speed
  kind: query
  command: "MSG=23h GET_MOTOR_ROLLING_SPEED"
  params: []

- id: set_network_lock
  label: Set Network Lock
  kind: action
  command: "MSG=16h SET_NETWORK_LOCK"
  params:
    - name: function
      type: integer
      description: 00h unlock, 01h lock at current position, 03h save across power cycle, 04h do not save across power cycle
    - name: priority
      type: integer
      description: Priority 00h through FFh

- id: get_network_lock
  label: Get Network Lock
  kind: query
  command: "MSG=26h GET_NETWORK_LOCK"
  params: []

- id: move_to_position
  label: Move to Position
  kind: action
  command: "MSG=03h CTRL_MOVETO"
  params:
    - name: function
      type: integer
      description: 00h down limit, 01h up limit, 02h intermediate position, 04h percentage of full travel range
    - name: position
      type: integer
      description: Function-dependent position or intermediate-position index

- id: stop
  label: Stop
  kind: action
  command: "MSG=02h CTRL_STOP"
  params: []

- id: get_motor_position
  label: Get Motor Position
  kind: query
  command: "MSG=0Ch GET_MOTOR_POSITION"
  params: []

- id: get_motor_status
  label: Get Motor Status
  kind: query
  command: "MSG=0Eh GET_MOTOR_STATUS"
  params: []

Feedbacks

- id: node_addr
  type: object
  description: Device NodeID included in POST_NODE_ADDR message header

- id: group_addr
  type: object
  description: Group index and associated 24-bit GroupID

- id: firmware_revision
  type: object
  description: Firmware part number, major revision letter, and revision number

- id: node_label
  type: string
  description: 16-character user-defined device label

- id: local_ui_state
  type: object
  description: UI index, enabled/disabled status, source address, and priority

- id: motor_ip
  type: object
  description: Intermediate-position index and percentage; FFh indicates position not set

- id: motor_rolling_speed
  type: object
  description: Up, down, and slow motor speeds

- id: network_lock_state
  type: object
  description: Lock status, source address, priority, and saved state

- id: motor_position
  type: object
  description: Position pulses, percentage, reserved byte, and intermediate-position index

- id: motor_status
  type: object
  description: Status, direction, source, and cause

- id: motor_status_values
  type: enum
  values:
    - stopped
    - running
    - blocked
    - locked

- id: motor_direction_values
  type: enum
  values:
    - down
    - up
    - unknown

- id: motor_status_cause_values
  type: enum
  values:
    - target_reached
    - explicit_command
    - wink
    - obstacle_detection
    - over_current_protection
    - thermal_protection
    - run_time_exceeded
    - timeout_exceeded
    - reset_or_power_up

Variables

- id: group_index
  type: integer
  range: [0, 15]

- id: group_id
  type: integer
  description: 24-bit group address

- id: label
  type: string
  length: 16

- id: ui_priority
  type: integer
  range: [0, 255]

- id: intermediate_position_percentage
  type: integer
  range: [0, 100]

- id: motor_speed
  type: integer
  description: Device-specific speed value; exact range unresolved
  # UNRESOLVED: motor-specific speed range requires technical datasheet

Events

<!-- UNRESOLVED: unsolicited event messages not distinguished from POST responses in source -->

Macros

<!-- UNRESOLVED: no explicit multi-step macros documented in source -->

Safety

confirmation_required_for: []
interlocks:
  - condition: network_locked
    effect: Movement and limit-changing messages are rejected unless CTRL_NETWORK_LOCK priority is equal to or higher than lock priority
  - condition: obstacle_detected
    effect: Motor status reports blocked state and obstacle-detection cause
  - condition: over_current_protection
    effect: Motor status reports over-current-protection cause
  - condition: thermal_protection
    effect: Motor status reports blocked state and thermal-protection cause

Notes

SDN messages use an 11-byte minimum and 32-byte maximum frame. Frames contain message identifier, acknowledgment/length byte, node type, source and destination addresses, data, and checksum. Source and destination addresses are 24-bit LSBF values.

Checksum is calculated by adding the complement of every byte from Byte 1 through Byte n-2. All data bits must be inverted before transmission. Bus timing requires at least 10 ms inactivity before a master request, 3 ms bus-free timeout, and 5–255 ms slave reply delay.

Avoid requesting feedback or acknowledgments in group or broadcast addressing modes because RS485 collisions may prevent replies.

Provenance

source_domains:
  - service.somfy.com
source_urls:
  - https://service.somfy.com/downloads/bui_v4/sdn-integration-guide--preliminary.pdf
retrieved_at: 2026-07-21T23:50:47.917Z
last_checked_at: 2026-10-01T12:00:27.743Z

Verification Summary

verdict: verified
checked_at: 2026-10-01T12:00:27.743Z
matched_actions: 20
action_count: 20
confidence: medium
summary: "All 20 spec action mnemonics and hex codes appear verbatim in the source, shapes agree, and transport parameters are documented. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "motor-specific speed range requires technical datasheet"
- "unsolicited event messages not distinguished from POST responses in source"
- "no explicit multi-step macros documented in source"
- "exact binary frame payload encoding for each command requires message-header values, addresses, length/ACK bits, data bytes, and checksum calculation; source provides message identifiers and data structures but not complete per-command byte-frame examples."
- "protocol version not stated in source"
- "firmware compatibility range not stated in source"

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