Summary

RS-485 transmitter in Somfy's SDN (SOMFY Digital Network) product line. Source doc covers the full SDN protocol: half-duplex master/slave bus, 4800-8-O-1, bit-inverted framing, 11-byte fixed header + variable data + checksum. Device family = NodeType 05h (RS485 RTS transmitter).

Transport

protocols:
  - serial
serial:
  baud_rate: 4800
  data_bits: 8
  parity: odd
  stop_bits: 1
  flow_control: none
  electrical: rs485  # UNRESOLVED: source says "RS485" but never states the exact electrical spec
  bit_inversion: true  # source: "all data bits need to be inverted before transmission"
auth:
  type: none  # inferred: no auth procedure in source

Traits

- queryable       # inferred: GET_xxx queries return POST_xxx status
- routable        # inferred: CTRL_MOVETO + intermediate positions
- levelable       # inferred: SET_MOTOR_ROLLING_SPEED (DC motor speed)
- powerable       # UNRESOLVED: no explicit power on/off commands in source

Actions

# SDN framing: Byte 1 = MSG, Byte 2 = ACK/LEN, Byte 3 = NodeType (src/dst),
# Bytes 4-6 = SOURCE@, Bytes 7-9 = DEST@ (LSB first), Bytes 10..n-1 = DATA,
# Byte n = CHECKSUM (sum of all prior bytes). All bytes bit-inverted on wire.
# `command` here carries the MSG opcode; full frame assembly requires
# addressing + DATA + checksum per §5.

# --- Device Management ---
- id: get_node_address
  label: Get Node Address
  kind: query
  command: "40"  # MSG byte GET_NODE_ADDR, DATA length 0
  params: []

- id: set_group_address
  label: Set Group Address
  kind: action
  command: "51"  # MSG byte SET_GROUP_ADDR, DATA length 4
  params:
    - name: group_index
      type: integer
      description: Entry in group table (0-15)
    - name: group_id
      type: integer
      description: Associated group address (24-bit NodeID)

- id: get_group_address
  label: Get Group Address
  kind: query
  command: "41"  # MSG byte GET_GROUP_ADDR, DATA length 1
  params:
    - name: group_index
      type: integer
      description: Entry in group table (0-15)

# --- Ack / Errors ---
- id: ack
  label: Acknowledge
  kind: event
  command: "7F"  # MSG byte ACK, sent when ACK bit set in request
  params: []

- id: nack
  label: Negative Acknowledge
  kind: event
  command: "6F"  # MSG byte NACK, DATA length 1
  params:
    - name: error_code
      type: integer
      description: "01h=data out of range, 10h=unknown msg, 11h=length error, FFh=busy"

# --- Device Information ---
- id: get_firmware_version
  label: Get Firmware Version
  kind: query
  command: "74"  # MSG byte GET_NODE_APP_VERSION, DATA length 0
  params: []

- id: set_node_label
  label: Set Node Label
  kind: action
  command: "55"  # MSG byte SET_NODE_LABEL, DATA length 16 (pad with spaces)
  params:
    - name: label
      type: string
      description: Up to 16 ASCII chars, space-padded

- id: get_node_label
  label: Get Node Label
  kind: query
  command: "45"  # MSG byte GET_NODE_LABEL, DATA length 0
  params: []

# --- Device Configuration: HMI ---
- id: set_local_ui
  label: Set Local UI Lock State
  kind: action
  command: "17"  # MSG byte SET_LOCAL_UI, DATA length 3
  params:
    - name: function
      type: integer
      description: "00h=enable/unlock, 01h=disable/lock"
    - name: ui_index
      type: integer
      description: "00h=all, 01h=DCT, 02h=local stimuli, 03h=local radio, 04h=touch motion, 05h=LEDs"
    - name: priority
      type: integer
      description: 0-255, higher wins

- id: get_local_ui
  label: Get Local UI Lock State
  kind: query
  command: "27"  # MSG byte GET_LOCAL_UI, DATA length 1
  params:
    - name: ui_index
      type: integer
      description: 01h to UI_MAX

# --- Device Configuration: Intermediate Positions ---
- id: set_motor_ip
  label: Set Motor Intermediate Position
  kind: action
  command: "15"  # MSG byte SET_MOTOR_IP, DATA length 4
  params:
    - name: function
      type: integer
      description: "00h=delete IP, 01h=set at current pos, 03h=set at % pos, 04h=divide range into N IPs"
    - name: ip_index
      type: integer
      description: IP index 1-16 (ignored for function 04h)
    - name: value
      type: integer
      description: 16-bit, depends on function (% for 03h, IP count for 04h, ignored for 00h/01h)

- id: get_motor_ip
  label: Get Motor Intermediate Position
  kind: query
  command: "25"  # MSG byte GET_MOTOR_IP, DATA length 1
  params:
    - name: ip_index
      type: integer
      description: IP index 1-16

# --- Device Configuration: Speed (DC motors) ---
- id: set_motor_rolling_speed
  label: Set Motor Rolling Speed
  kind: action
  command: "13"  # MSG byte SET_MOTOR_ROLLING_SPEED, DATA length 3
  params:
    - name: up_speed
      type: integer
      description: UP speed (rpm), per motor datasheet
    - name: down_speed
      type: integer
      description: DOWN speed (rpm), per motor datasheet
    - name: slow_speed
      type: integer
      description: Adjustment speed (rpm), per motor datasheet

- id: get_motor_rolling_speed
  label: Get Motor Rolling Speed
  kind: query
  command: "23"  # MSG byte GET_MOTOR_ROLLING_SPEED, DATA length 0
  params: []

# --- Device Configuration: Network Lock ---
- id: set_network_lock
  label: Set Network Lock
  kind: action
  command: "16"  # MSG byte SET_NETWORK_LOCK, DATA length 2
  params:
    - name: function
      type: integer
      description: "00h=unlock, 01h=lock, 03h=save on power cycle, 04h=do not save on power cycle"
    - name: priority
      type: integer
      description: 0-255, higher wins (ignored for 03h/04h)

- id: get_network_lock
  label: Get Network Lock Status
  kind: query
  command: "26"  # MSG byte GET_NETWORK_LOCK, DATA length 0
  params: []

# --- Device Control ---
- id: ctrl_moveto
  label: Move To Position
  kind: action
  command: "03"  # MSG byte CTRL_MOVETO, DATA length 4
  params:
    - name: function
      type: integer
      description: "00h=DOWN limit, 01h=UP limit, 02h=IP (position=ip index 0-15), 04h=% (position=0-100)"
    - name: position
      type: integer
      description: 16-bit; meaning depends on function (see function)
    - name: reserved
      type: integer
      description: Reserved byte

- id: ctrl_stop
  label: Stop Motor
  kind: action
  command: "02"  # MSG byte CTRL_STOP, DATA length 1 (reserved byte)
  params:
    - name: reserved
      type: integer
      description: Reserved byte

# --- Device Status ---
- id: get_motor_position
  label: Get Motor Position
  kind: query
  command: "0C"  # MSG byte GET_MOTOR_POSITION, DATA length 0
  params: []

- id: get_motor_status
  label: Get Motor Status
  kind: query
  command: "0E"  # MSG byte GET_MOTOR_STATUS, DATA length 0
  params: []

Feedbacks

- id: post_node_address
  type: integer
  description: "MSG 60h, reply to GET_NODE_ADDR; address in message header"
- id: post_group_address
  type: object
  description: "MSG 61h, reply to GET_GROUP_ADDR; DATA = GroupIndex + GroupID"
- id: post_node_app_version
  type: object
  description: "MSG 75h; App_Reference (24-bit), App_IndexLetter (ASCII A-Z), App_IndexNumber, Reserved"
- id: post_node_label
  type: string
  description: "MSG 65h; 16-char label (space-padded)"
- id: post_local_ui
  type: object
  description: "MSG 37h; Status, Source_Addr, Priority"
- id: post_motor_ip
  type: object
  description: "MSG 35h; IP_index, Reserved, IP_position_percentage (FFh=unset)"
- id: post_motor_rolling_speed
  type: object
  description: "MSG 33h; UP_Speed, DOWN_Speed, Slow_Speed"
- id: post_network_lock
  type: object
  description: "MSG 36h; Status, Source_Addr, Priority, Saved"
- id: post_motor_position
  type: object
  description: "MSG 0Dh; Position_pulse, Position_percentage, Reserved, IP (FFh=no match)"
- id: post_motor_status
  type: object
  description: "MSG 0Fh; Status (00h stopped / 01h running / 02h blocked / 03h locked), Direction, Source, Cause"

Variables

- id: motor_ip
  type: integer
  description: Intermediate position 1-16, settable 0-100%
- id: motor_rolling_speed
  type: object
  description: UP/DOWN/Slow speed (rpm); ranges per motor datasheet
- id: network_lock
  type: object
  description: Status (locked/unlocked), priority, persistence flag
- id: node_label
  type: string
  description: 16-char ASCII identifier

Events

- id: ack
  description: "MSG 7Fh; sent when ACK bit=1 in request and message processed"
- id: nack
  description: "MSG 6Fh; DATA = ErrorCode (01h, 10h, 11h, FFh)"
- id: post_node_address_pushbutton
  description: UNRESOLVED: source notes some devices can send their address via pushbutton without MASTER request; transport not specified

Macros

# UNRESOLVED: source describes no multi-step sequences

Safety

confirmation_required_for: []
interlocks:
  - network_lock  # source: SET_NETWORK_LOCK / CTRL_NETWORK_LOCK blocks other CTRL messages unless priority matches
# UNRESOLVED: thermal protection, obstacle detection, run-time limit behavior described in Cause codes
# but no explicit safety procedure / recovery sequence is documented.

Notes

  • User-supplied known protocol "RS-232C" contradicts source — source doc is RS-485 (SDN bus). Source wins.
  • All data bits bit-inverted on wire (backward compat): 58h → A7h on the bus.
  • LSB first for all multi-byte fields (SOURCE@, DEST@, Position, Value, GroupID).
  • Bus is half-duplex; master must wait Treq=10ms before new request; slave reply within Trep 5-255ms (randomized).
  • Master should request ACKs and implement retry on NACK or timeout (recommended in §3.6).
  • Speed/IP/lock default behavior: factory default is "all UI enabled" + "network lock not saved on power cycle".
  • Speed range (UP/DOWN/Slow) varies per motor — refer to device datasheet, not generic.
  • This spec covers the SDN protocol family; the 6300554 specifically is the "RS485 RTS transmitter" (NodeType 05h), but the protocol doc enumerates all NodeTypes 02h/05h-09h, so the action set may include commands a transmitter does not itself implement.

Provenance

source_domains:
  - service.somfy.com
source_urls:
  - https://service.somfy.com/downloads/bui_v4/sdn-integration-guide--preliminary.pdf
retrieved_at: 2026-06-02T06:13:57.229Z
last_checked_at: 2026-06-02T22:14:47.577Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:14:47.577Z
matched_actions: 20
action_count: 20
confidence: medium
summary: "All 20 spec actions traced to source (dip-safe re-verify). (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "model 6300554 firmware/range; user-supplied known protocol was RS-232C, source doc explicitly describes RS-485 — source wins."
- "source says \"RS485\" but never states the exact electrical spec"
- "no explicit power on/off commands in source"
- "source notes some devices can send their address via pushbutton without MASTER request; transport not specified"
- "source describes no multi-step sequences"
- "thermal protection, obstacle detection, run-time limit behavior described in Cause codes"
- "model 6300554 specific feature set, firmware compat range, max bus length, max node count per bus."

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