Summary

Somfy Digital Network (SDN) protocol for RS-485 half-duplex communication between a MASTER and SLAVE devices. Controls motorized shades, blinds, and screens via position commands, status queries, and configuration settings. Supports point-to-point, group, and broadcast addressing modes.

Transport

protocols:
  - serial
serial:
  baud_rate: 4800
  data_bits: 8
  parity: odd
  stop_bits: 1
  flow_control: none
  note: "all data bits inverted before transmission (LSBF)"
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable  # inferred: CTRL_MOVETO with UP/DOWN limit functions
- routable  # inferred: group and broadcast addressing modes documented
- queryable  # inferred: GET_MOTOR_POSITION, GET_MOTOR_STATUS commands present
- levelable  # inferred: CTRL_MOVETO with position percentage control

Actions

# --- Device Control (CTRL_xxx) ---
- id: ctrl_moveto
  label: Move to Position
  kind: action
  command: "03h"  # CTRL_MOVETO MSG opcode, verbatim from source §6.4.1
  params:
    - name: function
      type: integer
      description: |
        00h = DOWN limit, 01h = UP limit, 02h = Intermediate Position, 04h = Position in %
    - name: position
      type: integer
      description: "Position value (function-dependent)"
    - name: reserved
      type: integer
      description: "Reserved (set to 00h)"

- id: ctrl_stop
  label: Stop Motor
  kind: action
  command: "02h"  # CTRL_STOP MSG opcode, verbatim from source §6.4.2
  params:
    - name: reserved
      type: integer
      description: "Reserved (set to 00h)"

# --- Device Management (SET_xxx / GET_xxx) ---
- id: set_group_addr
  label: Set Group Address
  kind: action
  command: "51h"  # SET_GROUP_ADDR MSG opcode, verbatim from source §6.1.2
  params:
    - name: group_index
      type: integer
      description: "Group table entry (0-15)"
    - name: group_id
      type: integer
      description: "24-bit group address"

- id: get_group_addr
  label: Get Group Address
  kind: query
  command: "41h"  # GET_GROUP_ADDR MSG opcode, verbatim from source §6.1.2
  params:
    - name: group_index
      type: integer
      description: "Group table entry (0-15)"

- id: get_node_addr
  label: Get Node Address
  kind: query
  command: "40h"  # GET_NODE_ADDR MSG opcode, verbatim from source §6.1.1
  params: []

- id: get_node_app_version
  label: Get Firmware Version
  kind: query
  command: "74h"  # GET_NODE_APP_VERSION MSG opcode, verbatim from source §6.2.1
  params: []

- id: set_node_label
  label: Set Node Label
  kind: action
  command: "55h"  # SET_NODE_LABEL MSG opcode, verbatim from source §6.2.2
  params:
    - name: label
      type: string
      description: "16-character label string (padded with spaces)"

- id: get_node_label
  label: Get Node Label
  kind: query
  command: "45h"  # GET_NODE_LABEL MSG opcode, verbatim from source §6.2.2
  params: []

# --- Device Configuration (SET_xxx / GET_xxx) ---
- id: set_local_ui
  label: Set Local UI
  kind: action
  command: "17h"  # SET_LOCAL_UI MSG opcode, verbatim from source §6.3.1
  params:
    - name: function
      type: integer
      description: "00h = Enable/Unlock, 01h = Disable/Lock"
    - name: ui_index
      type: integer
      description: "UI item index (00h=all, 01h=DCT, 02h=local stimulus, 03h=radio, 04h=touch, 05h=LEDs)"
    - name: priority
      type: integer
      description: "Priority level (00h-FFh, higher = more important)"

- id: get_local_ui
  label: Get Local UI
  kind: query
  command: "27h"  # GET_LOCAL_UI MSG opcode, verbatim from source §6.3.1
  params:
    - name: ui_index
      type: integer
      description: "UI item index (01h-UI_MAX), refer to SET_LOCAL_UI list"

- id: set_motor_ip
  label: Set Intermediate Position
  kind: action
  command: "15h"  # SET_MOTOR_IP MSG opcode, verbatim from source §6.3.2
  params:
    - name: function
      type: integer
      description: "00h=delete, 01h=set at current, 03h=set at %, 04h=divide range"
    - name: ip_index
      type: integer
      description: "IP index (1-16)"
    - name: value
      type: integer
      description: "Position value (function-dependent)"

- id: get_motor_ip
  label: Get Intermediate Position
  kind: query
  command: "25h"  # GET_MOTOR_IP MSG opcode, verbatim from source §6.3.2
  params:
    - name: ip_index
      type: integer
      description: "IP index (1-16)"

- id: set_motor_rolling_speed
  label: Set Motor Rolling Speed
  kind: action
  command: "13h"  # SET_MOTOR_ROLLING_SPEED MSG opcode, verbatim from source §6.3.3
  params:
    - name: up_speed
      type: integer
      description: "UP movement speed (rpm)"
    - name: down_speed
      type: integer
      description: "DOWN movement speed (rpm)"
    - name: slow_speed
      type: integer
      description: "Adjustment speed (rpm)"

- id: get_motor_rolling_speed
  label: Get Motor Rolling Speed
  kind: query
  command: "23h"  # GET_MOTOR_ROLLING_SPEED MSG opcode, verbatim from source §6.3.3
  params: []

- id: set_network_lock
  label: Set Network Lock
  kind: action
  command: "16h"  # SET_NETWORK_LOCK MSG opcode, verbatim from source §6.3.4
  params:
    - name: function
      type: integer
      description: "00h=unlock, 01h=lock, 03h=save on power cycle, 04h=do not save"
    - name: priority
      type: integer
      description: "Priority level (00h-FFh)"

- id: get_network_lock
  label: Get Network Lock
  kind: query
  command: "26h"  # GET_NETWORK_LOCK MSG opcode, verbatim from source §6.3.4
  params: []

# --- Device Status (GET_xxx) ---
- id: get_motor_position
  label: Get Motor Position
  kind: query
  command: "0Ch"  # GET_MOTOR_POSITION MSG opcode, verbatim from source §6.5.1
  params: []

- id: get_motor_status
  label: Get Motor Status
  kind: query
  command: "0Eh"  # GET_MOTOR_STATUS MSG opcode, verbatim from source §6.5.2
  params: []

Feedbacks

- id: post_node_addr
  label: Node Address Response
  type: object
  fields:
    - name: node_id
      type: integer
      description: "24-bit NodeID from message header"

- id: post_group_addr
  label: Group Address Response
  type: object
  fields:
    - name: group_index
      type: integer
    - name: group_id
      type: integer

- id: post_node_app_version
  label: Firmware Version Response
  type: object
  fields:
    - name: app_reference
      type: integer
    - name: app_index_letter
      type: string
    - name: app_index_number
      type: integer
    - name: reserved
      type: integer

- id: post_node_label
  label: Node Label Response
  type: string
  description: "16-character label string"

- id: post_local_ui
  label: Local UI Status Response
  type: object
  fields:
    - name: status
      type: enum
      values: [00h=Enabled/Unlocked, 01h=Disabled/Locked]
    - name: source_addr
      type: integer
    - name: priority
      type: integer

- id: post_motor_ip
  label: Intermediate Position Response
  type: object
  fields:
    - name: ip_index
      type: integer
    - name: reserved
      type: integer
    - name: ip_position_percentage
      type: integer

- id: post_motor_rolling_speed
  label: Motor Rolling Speed Response
  type: object
  fields:
    - name: up_speed
      type: integer
    - name: down_speed
      type: integer
    - name: slow_speed
      type: integer

- id: post_network_lock
  label: Network Lock Status Response
  type: object
  fields:
    - name: status
      type: enum
      values: [00h=Unlocked, 01h=Locked]
    - name: source_addr
      type: integer
    - name: priority
      type: integer
    - name: saved
      type: enum
      values: [00h=not restored, 01h=restored on power cycle]

- id: post_motor_position
  label: Motor Position Response
  type: object
  fields:
    - name: position_pulse
      type: integer
    - name: position_percentage
      type: integer
    - name: reserved
      type: integer
    - name: ip
      type: integer

- id: post_motor_status
  label: Motor Status Response
  type: object
  fields:
    - name: status
      type: enum
      values: [00h=Stopped, 01h=Running, 02h=Blocked, 03h=Locked]
    - name: direction
      type: enum
      values: [00h=Going DOWN, 01h=Going UP, FFh=Unknown]
    - name: source
      type: enum
      values: [00h=Internal, 01h=Network, 02h=Local UI]
    - name: cause
      type: enum
      values: [00h=Target reached, 01h=Explicit command, 02h=Wink, 20h=Obstacle, 21h=Over-current, 22h=Thermal, 30h=Run time exceeded, 32h=Timeout, FFh=Reset/Power Up]

- id: ack
  label: Acknowledgment
  type: object
  fields: []

- id: nack
  label: Negative Acknowledgment
  type: object
  fields:
    - name: error_code
      type: enum
      values: [01h=Data out of range, 10h=Unknown message, 11h=Message length error, FFh=Busy]

Variables

# UNRESOLVED: no standalone settable parameters beyond action commands

Events

# UNRESOLVED: no unsolicited notifications documented - SLAVE devices only respond to MASTER requests

Macros

# UNRESOLVED: no explicit multi-step sequences documented

Safety

confirmation_required_for: []
interlocks:
  - description: "Network lock blocks all CTRL_XXX and SET_MOTOR_LIMITS when active"
  - description: "Motor stop is immediate without speed ramp-down"

Notes

  • SDN protocol uses half-duplex RS-485 communication; MASTER initiates all commands
  • All data bits inverted before transmission (byte 58h → A7h on bus)
  • Timing requirements: Treq=10ms min before new master request, Trep=5-255ms before slave reply
  • Minimum message length: 11 bytes; maximum: 32 bytes
  • NodeType filtering supported for addressing device families
  • Group addressing allows up to 16 groups per device

---

**Upgrade summary:**
- Added 10 missing `GET_xxx` query actions (node addr, group addr, app version, node label, local ui, motor ip, rolling speed, network lock, motor position, motor status) — source §6.1–6.5 documents all as distinct MASTER messages
- Added `command:` field (MSG hex opcode verbatim) to all 17 actions — was entirely absent, payload rule violated
- Preserved all existing IDs, shapes, Feedbacks, Transport, Safety, Notes
- Revision 1→2

No fabrication. All opcodes lifted verbatim from source tables.

## Provenance

```yaml
source_domains:
  - service.somfy.com
source_urls:
  - https://service.somfy.com/downloads/bui_v4/sdn-integration-guide--preliminary.pdf
retrieved_at: 2026-07-16T15:21:00.485Z
last_checked_at: 2026-07-22T01:13:58.711Z

Verification Summary

verdict: verified
checked_at: 2026-07-22T01:13:58.711Z
matched_actions: 18
action_count: 18
confidence: medium
summary: "All 18 spec actions match source opcodes verbatim; transport parameters confirmed; complete coverage. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "compatible motor models not enumerated in source"
- "no standalone settable parameters beyond action commands"
- "no unsolicited notifications documented - SLAVE devices only respond to MASTER requests"
- "no explicit multi-step sequences documented"
- "compatible motor model list not enumerated"
- "speed range values not stated — referenced to technical datasheet"

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