Summary
Somfy SDN protocol for RS485 half-duplex master-slave communication. Controls motorized shades, blinds, and awnings through motor movement, configuration, status, addressing, locking, and local-interface commands. Data bits use inverted NRZ encoding.
Transport
protocols:
- serial
serial:
baud_rate: 4800
data_bits: 8
parity: odd
stop_bits: 1
flow_control: none # UNRESOLVED: flow control not stated in source
encoding: NRZ
bit_inversion: true
auth:
type: none # inferred: no authentication procedure in source
Traits
- powerable # inferred from motor control commands
- queryable # inferred from GET_* commands returning device state
- levelable # inferred from position and rolling-speed controls
- routable # inferred from group and node addressing controls
Actions
- id: ctrl_moveto
label: Move to Position
kind: action
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 per Function
- name: Reserved
type: integer
- id: ctrl_stop
label: Stop Motor
kind: action
params:
- name: Reserved
type: integer
- id: ctrl_network_lock
label: Control Network Lock
kind: action
params:
- name: Function
type: integer
description: 00h = Unlock, 01h = Lock, 03h = Save lock on power cycle, 04h = Do not save on power cycle
- name: Priority
type: integer
description: Priority level (0-FFh)
- id: get_motor_position
label: Get Motor Position
kind: query
params: []
- id: get_motor_status
label: Get Motor Status
kind: query
params: []
- id: set_group_addr
label: Set Group Address
kind: action
params:
- name: GroupIndex
type: integer
description: Entry in group table (0-15)
- name: GroupID
type: integer
description: 24-bit group address
- id: get_group_addr
label: Get Group Address
kind: query
params:
- name: GroupIndex
type: integer
description: Entry in group table (0-15)
- id: set_node_label
label: Set Node Label
kind: action
params:
- name: Label
type: string
description: 16-character label, padded with spaces
- id: get_node_label
label: Get Node Label
kind: query
params: []
- id: set_local_ui
label: Set Local UI
kind: action
params:
- name: Function
type: integer
description: 00h = Enable/Unlock, 01h = Disable/Lock
- name: UI_Index
type: integer
description: 00h = All, 01h = DCT input, 02h = Local stimulus, 03h = Local Radio, 04h = Touch Motion, 05h = LEDs
- name: Priority
type: integer
description: Priority level (0-FFh, higher = more priority)
- id: get_local_ui
label: Get Local UI
kind: query
params:
- name: UI_Index
type: integer
description: UI index (01h to UI_MAX)
- id: set_motor_ip
label: Set Intermediate Position
kind: action
params:
- name: Function
type: integer
description: 00h = Delete IP, 01h = Set at current position, 03h = Set at specified %, 04h = Divide full range
- name: IP_Index
type: integer
description: IP index (1-16)
- name: Value
type: integer
description: Position value per Function
- id: get_motor_ip
label: Get Intermediate Position
kind: query
params:
- name: IP_Index
type: integer
description: IP index (1-16)
- id: set_motor_rolling_speed
label: Set Motor Rolling Speed
kind: action
params:
- name: UP_Speed
type: integer
description: Speed during UP movement (rpm)
- name: DOWN_Speed
type: integer
description: Speed during DOWN movement (rpm)
- name: Slow_Speed
type: integer
description: Speed for adjustment movements (rpm)
- id: get_motor_rolling_speed
label: Get Motor Rolling Speed
kind: query
params: []
- id: set_network_lock
label: Set Network Lock
kind: action
params:
- name: Function
type: integer
description: 00h = Unlock, 01h = Lock, 03h = Save lock on power cycle, 04h = Do not save on power cycle
- name: Priority
type: integer
description: Priority level (0-FFh)
- id: get_network_lock
label: Get Network Lock
kind: query
params: []
- id: get_node_addr
label: Get Node Address
kind: query
params: []
- id: get_node_app_version
label: Get Node App Version
kind: query
params: []
- id: set_motor_limits
label: Set Motor Limits
kind: action
params: []
- id: set_tilt_limits
label: Set Tilt Limits
kind: action
params: []
Feedbacks
- id: ack
label: Acknowledgment
type: action
description: Sent when ACK bit is set in request; indicates execution started, not necessarily completion
- id: nack
label: Negative Acknowledgment
type: action
params:
- name: ErrorCode
type: integer
description: 01h = Data out of range, 10h = Unknown message, 11h = Message length error, FFh = Busy
- id: post_node_addr
label: Node Address Response
type: action
description: Address included in message header; no DATA
- id: post_group_addr
label: Group Address Response
type: action
params:
- name: GroupIndex
type: integer
- name: GroupID
type: integer
- id: post_node_label
label: Node Label Response
type: action
params:
- name: Label
type: string
- id: post_local_ui
label: Local UI Status Response
type: action
params:
- name: Status
type: integer
description: 00h = Enabled/Unlocked, 01h = Disabled/Locked
- name: Source_Addr
type: integer
description: NodeID of device that sent lock command
- name: Priority
type: integer
- id: post_motor_ip
label: Motor Intermediate Position Response
type: action
params:
- name: IP_index
type: integer
- name: Reserved
type: integer
- name: IP_position_percentage
type: integer
description: Position 0-100; FFh if IP not set
- id: post_motor_rolling_speed
label: Motor Rolling Speed Response
type: action
params:
- 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: action
params:
- name: Status
type: integer
description: 00h = Unlocked, 01h = Locked
- name: Source_Addr
type: integer
- name: Priority
type: integer
- name: Saved
type: integer
description: 00h = Not saved on power cycle, 01h = Saved on power cycle
- id: post_motor_position
label: Motor Position Response
type: action
params:
- name: Position_pulse
type: integer
- name: Position_percentage
type: integer
- name: Reserved
type: integer
- name: IP
type: integer
description: 01h-IP_MAX; FFh if not at an IP
- id: post_motor_status
label: Motor Status Response
type: action
params:
- name: Status
type: integer
description: 00h = Stopped, 01h = Running, 02h = Blocked, 03h = Locked
- name: Direction
type: integer
description: 00h = Going DOWN, 01h = Going UP, FFh = Unknown
- name: Source
type: integer
description: 00h = Internal, 01h = Network, 02h = Local UI
- name: Cause
type: integer
description: 00h = Target reached, 01h = Explicit command, 02h = Wink, 20h = Obstacle, 21h = Over-current, 22h = Thermal, 30h = Run time exceeded, 32h = Timeout exceeded, FFh = Reset/Power Up
- id: post_node_app_version
label: Node App Version Response
type: action
params:
- name: App_Reference
type: integer
description: 24-bit firmware part number
- name: App_IndexLetter
type: integer
description: ASCII firmware major revision (41h-5Ah)
- name: App_IndexNumber
type: integer
- name: Reserved
type: integer
Variables
# UNRESOLVED: configuration represented through SET_* and GET_* command pairs
Events
# UNRESOLVED: unsolicited event notifications not stated in source
Macros
# UNRESOLVED: explicit multi-step macro sequences not stated in source
Safety
confirmation_required_for: []
interlocks:
- description: Network lock prevents movement commands when locked; only CTRL_NETWORK_LOCK with equal or higher priority unlocks
details:
- Lock blocks CTRL_XXX functions and SET_MOTOR_LIMITS/SET_TILT_LIMITS
- NACK(NODE_IS_LOCKED) returned for rejected commands
- Power-on behavior configurable through SET_NETWORK_LOCK function 03h/04h
- description: Collision avoidance recommended
details:
- Avoid requesting ACK in group or broadcast mode
- Status requests do not use ACK; status report itself is feedback
# UNRESOLVED: voltage/current limits and power-on sequencing requirements not stated in source
Notes
RS485 specifics:
- Half-duplex master-slave; master initiates all communication
- LSBF (Least Significant Bit First) for address fields
- All data bits inverted before transmission using NRZ encoding
- Bus free timeout (Tfree) = 3ms typical
- Trep = 5-255ms, slave randomized
- Treq = 10ms minimum master idle time before new request
- Message bundle ends through bus inactivity; no sync byte defined
- Minimum message length = 11 bytes
- Maximum message length = 32 bytes
Addressing:
- Point-to-point: SRC = NodeID, DST = NodeID
- Group: SRC = GroupID, DST = 000000h
- Broadcast: SRC = NodeID, DST = FFFFFFh
- NodeType filtering available through DEST NodeType field
Checksum:
- Simple byte-sum complement of Byte 1 through Byte n-2
- Complement stored as final byte
Error codes:
- 01h = Data out of range
- 10h = Unknown MSG
- 11h = Message length error
- FFh = Busy
Provenance
source_domains:
- service.somfy.com
source_urls:
- https://service.somfy.com/downloads/bui_v4/sdn-integration-guide--preliminary.pdf
retrieved_at: 2026-07-25T00:08:01.448Z
last_checked_at: 2026-08-05T08:43:32.447Z
Verification Summary
verdict: verified
checked_at: 2026-08-05T08:43:32.447Z
matched_actions: 21
action_count: 21
confidence: medium
summary: "All 21 spec actions map 1:1 to source commands (SET_/GET_/CTRL_/POST_); transport fields verbatim; no extras. (8 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "voltage/current/power specifications not stated in source"
- "flow control not stated in source"
- "configuration represented through SET_* and GET_* command pairs"
- "unsolicited event notifications not stated in source"
- "explicit multi-step macro sequences not stated in source"
- "voltage/current limits and power-on sequencing requirements not stated in source"
- "command payload byte layouts not stated in source"
- "firmware compatibility ranges not stated in source"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0