Summary

Dynalite Patpa lighting control device speaking the DyNet protocol over RS-485 serial (9600 bps, 8 data bits, 1 stop bit, no parity). Spec covers basic DyNet logical-message opcodes: preset recall/program, channel ramp/fade, level and preset reporting, panic, control-panel lockout, daylight harvesting, occupancy detection, user preferences, and area linking.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  # UNRESOLVED: flow control not stated in source
auth:
  type: none  # inferred: no auth procedure in source

Traits

# - levelable       (ramp/fade to level, ramp on/off, fade to preset - opcodes 68/69/6B/71/72/73/74/75/79/5F)
# - queryable       (request channel level 61, request preset 63, request user preference 49)
traits:
  - levelable
  - queryable

Actions

# DyNet logical frame: 8 bytes - [1C sync] [area] [data1] [opcode] [data2] [data3] [join] [checksum]
# Join byte usually FF. Checksum = negative 8-bit two's-complement sum of bytes 0-6
# (source: "Checksum = Negative 8 bit 2s Complement sum of bytes 1-7"; verified against
# all source examples: sum of all 8 bytes ≡ 0x00 mod 256).
# Timing: idle between bytes <1ms; delay between packets >10ms.

- id: select_preset
  label: Select Current Preset
  kind: action
  command: "1C {area} {fade_lo} {preset} {fade_hi} {bank} {join} {checksum}"
  # source example: 1C 01 20 03 00 00 FF C1 (Select Preset 4, Area 1)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: preset
      type: string
      description: "Preset opcode byte: 00=P1, 01=P2, 02=P3, 03=P4, 0A=P5, 0B=P6, 0C=P7, 0D=P8"
    - name: bank
      type: integer
      description: "Preset bank: 00=P1-P8, 01=P9-P16, 02=P17-P24, etc."
    - name: fade_lo
      type: integer
      description: "Fade rate low byte (source: 'usually 100'; example uses 0x20)"
    - name: fade_hi
      type: integer
      description: "Fade rate high byte (source: usually 0)"

- id: select_preset_linear
  label: Select Current Preset (Linear)
  kind: action
  command: "1C {area} {preset} 65 {fade_lo} {fade_hi} {join} {checksum}"
  # source example: 1C 01 03 65 64 00 FF 18 (Preset 4, Area 1, 2s fade)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: preset
      type: integer
      description: "Preset (0 origin)"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: preset_offset
  label: Preset Offset
  kind: action
  command: "1C {area} {offset_plus_80} 64 00 00 {join} {checksum}"
  # source example: 1C 01 8F 64 00 00 FF F1 (offset 15, Area 1)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: offset_plus_80
      type: integer
      description: "Offset value plus bit 8 set (offset + 0x80) to distinguish Preset Offset from Swap Bank"

- id: reset_preset
  label: Reset Preset
  kind: action
  command: "1C {area} {fade_lo} 0F {fade_hi} 00 {join} {checksum}"
  # source example: 1C 01 FA 0F 00 00 FF DB (Area 1, 5s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: ramp_off
  label: Ramp Channel/Area to Off
  kind: action
  command: "1C {area} {channel} 68 00 {ramp_rate} {join} {checksum}"
  # source example: 1C 01 03 68 00 32 FF 47 (Channel 4, Area 1, 5s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: ramp_rate
      type: integer
      description: "Ramp rate in 100 ms steps (time to fade 0 to 100%)"

- id: ramp_on
  label: Ramp Channel/Area to On
  kind: action
  command: "1C {area} {channel} 69 00 {ramp_rate} {join} {checksum}"
  # source example: 1C 01 03 69 00 32 FF 46 (Channel 4, Area 1, 5s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: ramp_rate
      type: integer
      description: "Ramp rate in 100 ms steps (time to fade 0 to 100%)"

- id: fade_to_preset
  label: Fade Channel/Area to Preset
  kind: action
  command: "1C {area} {channel} 6B {preset} {fade_time} {join} {checksum}"
  # source example: 1C 01 03 6B 03 64 FF 0F (Area 1 Ch 4, Preset 4, 2.00s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: preset
      type: integer
      description: "Preset (0 origin)"
    - name: fade_time
      type: integer
      description: "Fade time in 20 ms steps"

- id: ramp_to_level_100ms
  label: Ramp Channel/Area to a Level (0.1s to 25.5s)
  kind: action
  command: "1C {area} {channel} 71 {level} {ramp_rate} {join} {checksum}"
  # source example: 1C 02 02 71 82 32 FF BC (Area 2 Ch 3, 50%, 5s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: level
      type: integer
      description: "Channel level (01 = 100%, FF = 0%)"
    - name: ramp_rate
      type: integer
      description: "Ramp rate in 100 ms steps"

- id: fade_to_level_secs
  label: Fade Channel/Area to a Level (1s to 255s)
  kind: action
  command: "1C {area} {channel} 72 {level} {fade_rate} {join} {checksum}"
  # source example: 1C 02 02 72 82 32 FF BB (Area 2 Ch 3, 50%, 50s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: level
      type: integer
      description: "Channel level (01 = 100%, FF = 0%)"
    - name: fade_rate
      type: integer
      description: "Fade rate in 1 s steps"

- id: fade_to_level_mins
  label: Fade Channel/Area to a Level (1min to 22min)
  kind: action
  command: "1C {area} {channel} 73 {level} {fade_rate} {join} {checksum}"
  # source example: 1C 02 02 73 82 0F FF DD (Area 2 Ch 3, 50%, 15 min)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: level
      type: integer
      description: "Channel level (01 = 100%, FF = 0%)"
    - name: fade_rate
      type: integer
      description: "Fade rate in 1 min steps, max 22 minutes"

- id: fade_off
  label: Fade Channel/Area to Off
  kind: action
  command: "1C {area} {channel} 74 {fade_lo} {fade_hi} {join} {checksum}"
  # source example: 1C 04 FF 74 64 00 FF 0A (Area 4 all channels, 2.00s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: fade_on
  label: Fade Channel/Area to On
  kind: action
  command: "1C {area} {channel} 75 {fade_lo} {fade_hi} {join} {checksum}"
  # source example: 1C 04 FF 75 64 00 FF 09 (Area 4 all channels, 2.00s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: stop_fade
  label: Stop Fade Channel/Area
  kind: action
  command: "1C {area} {channel} 76 00 00 {join} {checksum}"
  # source example: 1C 04 05 76 00 00 FF 66 (Area 4 Channel 6)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"

- id: fade_area_to_level
  label: Fade Area to a Level
  kind: action
  command: "1C {area} {level} 79 {fade_lo} {fade_hi} {join} {checksum}"
  # source example: 1C 04 82 79 64 00 FF 82 (Area 4, 50%, 2s)
  # note: source byte table labels byte 2 "Channel" but the example uses it as level (82 = 50%)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: level
      type: integer
      description: "Level (01 = 100%, FF = 0%); example uses 82 = 50%"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: area_off
  label: Set to Off
  kind: action
  command: "1C {area} {fade_lo} 04 {fade_hi} 00 {join} {checksum}"
  # source example: 1C 03 0A 04 00 00 FF D4 (turn Area 3 off)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: fade_lo
      type: integer
      description: "Fade rate low byte (source: 'usually 100'; example uses 0x0A)"
    - name: fade_hi
      type: integer
      description: "Fade rate high byte (source: usually 0)"

- id: ramp_level_lit_channels
  label: Ramp Channel/Area to a Level except channels preset to 0% or don't care
  kind: action
  command: "1C {area} {channel} 5F {level} {ramp_rate} {join} {checksum}"
  # source example: 1C 04 FF 5F 01 32 FF 50 (Area 4, toward 100%, 5.00s)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: level
      type: integer
      description: "Level (01 = 100%, FF = 0%)"
    - name: ramp_rate
      type: integer
      description: "Ramp rate in 100 ms steps"

- id: request_channel_level
  label: Request Channel Level
  kind: query
  command: "1C {area} {channel} 61 00 00 {join} {checksum}"
  # source example: 1C 02 04 61 00 00 FF 7E (Channel 5, Area 2)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin)"

- id: request_preset
  label: Request Preset
  kind: query
  command: "1C {area} 00 63 00 00 {join} {checksum}"
  # source example: 1C 04 00 63 00 00 FF 7E (current preset of Area 4)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: program_current_preset
  label: Program Current Preset
  kind: action
  command: "1C {area} 00 08 00 00 {join} {checksum}"
  # source example: 1C 04 00 08 00 00 FF D9 (save Area 4 levels to current preset)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: program_defined_preset
  label: Program Defined Preset
  kind: action
  command: "1C {area} {preset} 09 00 00 {join} {checksum}"
  # source example: 1C 04 00 09 00 00 FF D8 (save Area 4 levels to Preset 1)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: preset
      type: integer
      description: "Preset (0 origin)"

- id: save_current_preset
  label: Save Current Preset
  kind: action
  command: "1C {area} 00 66 00 00 {join} {checksum}"
  # source example: 1C 01 00 66 00 00 FF 7E (saves current preset number)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: restore_saved_preset
  label: Restore Saved Preset
  kind: action
  command: "1C {area} {fade_lo} 67 {fade_hi} 00 {join} {checksum}"
  # source example: 1C 01 FA 67 00 00 FF 83 (Area 1)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: fade_lo
      type: integer
      description: "Fade time low byte; 16-bit fade time in 20 ms steps"
    - name: fade_hi
      type: integer
      description: "Fade time high byte; 16-bit fade time in 20 ms steps"

- id: panic
  label: Panic (locks panels and selects panic preset)
  kind: action
  command: "1C {area} F0 17 00 00 {join} {checksum}"
  # source example: 1C 02 F0 17 00 00 FF DC (Area 2)
  # note: source byte table says byte 2 = 0 (unused) but the example uses F0
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: unpanic
  label: Un-Panic (unlocks panels and restores previous preset)
  kind: action
  command: "1C {area} F0 18 00 00 {join} {checksum}"
  # source example: 1C 02 F0 18 00 00 FF DB (Area 2)
  # note: source byte table says byte 2 = 0 (unused) but the example uses F0
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: set_dmx_mode
  label: Set DMX Mode
  kind: action
  command: "1C {area} {mode} 10 00 00 {join} {checksum}"
  # source example: 1C 01 03 10 00 00 FF D1 (Area 1, DyNet only)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: mode
      type: integer
      description: "00 = DMX if present, 01 = Local Override, 02 = HTP, 03 = DyNet"

- id: disable_control_panels
  label: Disable Control Panels
  kind: action
  command: "1C {area} 00 15 00 00 {join} {checksum}"
  # source example: 1C 06 00 15 00 00 FF CA (lock all panels in Area 6)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: enable_control_panels
  label: Enable Control Panels
  kind: action
  command: "1C {area} 00 16 00 00 {join} {checksum}"
  # source example: 1C 06 00 16 00 00 FF C9 (unlock all panels in Area 6)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"

- id: light_level_compensation_all_presets
  label: Suspend/Resume Light Level Compensation (All Presets)
  kind: action
  command: "1C {area} {channel} 11 00 {suspend_resume} {join} {checksum}"
  # source example: 1C 02 FF 11 00 01 FF D2 (Area 2 all channels, resume)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: suspend_resume
      type: integer
      description: "0 = suspend, 1 = resume"

- id: suspend_light_level_compensation_current_preset
  label: Suspend Light Level Compensation (Current Preset)
  kind: action
  command: "1C {area} {channel} 1A 00 00 {join} {checksum}"
  # source example: 1C 02 FF 1A 00 00 FF CA (Area 2 all channels)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"

- id: resume_light_level_compensation_current_preset
  label: Resume Light Level Compensation (Current Preset)
  kind: action
  command: "1C {area} {channel} 1B 00 00 {join} {checksum}"
  # source example: 1C 02 FF 1B 00 00 FF C9 (Area 2 all channels)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"

- id: occupancy_detection_all_presets
  label: Suspend/Resume Occupancy Detection (All Presets)
  kind: action
  command: "1C {area} {channel} 31 00 {suspend_resume} {join} {checksum}"
  # source example: 1C 01 FF 31 00 01 FF B3 (Area 1 all channels, resume)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"
    - name: suspend_resume
      type: integer
      description: "0 = suspend, 1 = resume"

- id: disable_occupancy_detection_current_preset
  label: Disable Occupancy Detection (Current Preset)
  kind: action
  command: "1C {area} {channel} 3A 00 00 {join} {checksum}"
  # source example: 1C 01 FF 3A 00 00 FF AB (Area 1 all channels)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"

- id: enable_occupancy_detection_current_preset
  label: Enable Occupancy Detection (Current Preset)
  kind: action
  command: "1C {area} {channel} 3B 00 00 {join} {checksum}"
  # source example: 1C 01 FF 3B 00 00 FF AA (Area 1 all channels)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: channel
      type: integer
      description: "Channel (0 origin, FF = all channels in the area)"

- id: set_user_preference
  label: Set User Preference
  kind: action
  command: "1C {area} {preference} 48 {data_hi} {data_lo} {join} {checksum}"
  # source example: 1C 01 01 48 82 32 FF E7 (Area 1, indicator LED 50%, 1.00s fade)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: preference
      type: integer
      description: "Preference id, see Notes table (01=indicator LED ... 0D=temp setpoint fixed point)"
    - name: data_hi
      type: integer
      description: "Data high byte (meaning depends on preference, see Notes)"
    - name: data_lo
      type: integer
      description: "Data low byte (meaning depends on preference, see Notes)"

- id: request_user_preference
  label: Request User Preference
  kind: query
  command: "1C {area} {preference} 49 00 00 {join} {checksum}"
  # source example: 1C 01 06 49 00 00 FF 95 (Area 1, actual temperature)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: preference
      type: integer
      description: "Preference id, see Notes table"

- id: set_join_level
  label: Set Join Level
  kind: action
  command: "1C {area} {join_level} 14 00 00 {join} {checksum}"
  # source example: 1C 01 06 14 00 00 FF CA (Area 1, join level 6)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: join_level
      type: integer
      description: "Join level"

- id: set_rmask
  label: Set RMask
  kind: action
  command: "1C {area} {rmask} 40 00 00 {join} {checksum}"
  # source example: 1C 01 03 40 00 00 FF A1 (Area 1, RMask level 3)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: rmask
      type: integer
      description: "RMask level"

- id: set_area_links
  label: Set Area Links
  kind: action
  command: "1C {area} {areas_1_8} 20 {areas_9_16} {areas_17_24} {join} {checksum}"
  # source example: 1C 04 80 20 00 00 FF 41 (link Areas 4 & 5, base area = 3)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: areas_1_8
      type: integer
      description: "Bitmap for the 24 areas directly above the BLA; bit 7 = 1st area, bit 0 = 8th area"
    - name: areas_9_16
      type: integer
      description: "Bitmap; bit 7 = 9th area, bit 0 = 16th area"
    - name: areas_17_24
      type: integer
      description: "Bitmap; bit 7 = 17th area, bit 0 = 24th area"

- id: clear_area_links
  label: Clear Area Links
  kind: action
  command: "1C {area} {areas_1_8} 21 {areas_9_16} {areas_17_24} {join} {checksum}"
  # source example: 1C 04 80 21 00 00 FF 40 (separate Areas 4 & 5, base area = 3)
  params:
    - name: area
      type: integer
      description: "Area number (hex byte)"
    - name: areas_1_8
      type: integer
      description: "Bitmap of areas to unlink; bit 7 = 1st area, bit 0 = 8th area"
    - name: areas_9_16
      type: integer
      description: "Bitmap; bit 7 = 9th area, bit 0 = 16th area"
    - name: areas_17_24
      type: integer
      description: "Bitmap; bit 7 = 17th area, bit 0 = 24th area"

Feedbacks

# Report messages sent by the dimmer (logical opcode frame, 1C sync).

- id: channel_level_report
  label: Report Channel Level (reply from dimmer)
  type: object
  opcode: "60"
  # source example: 1C 02 04 60 70 70 FF 9F (Ch 5 Area 2, target 57%, current 57%)
  fields:
    - name: area
      description: "Area number"
    - name: channel
      description: "Channel (0 origin)"
    - name: target_level
      description: "Target level (01 = 100%, FF = 0%)"
    - name: current_level
      description: "Current level (01 = 100%, FF = 0%)"

- id: preset_report
  label: Report Preset (reply from dimmer)
  type: object
  opcode: "62"
  # source example: 1C 04 05 62 00 00 FF 7A (Area 4 currently in Preset 6)
  fields:
    - name: area
      description: "Area number"
    - name: preset
      description: "Preset (0 origin)"

- id: user_preference_report
  label: Report User Preference
  type: object
  opcode: "4A"
  # source example: 1C 01 06 4A 00 58 FF 3C (Area 1, actual temperature 22C)
  fields:
    - name: area
      description: "Area number"
    - name: preference
      description: "Preference id, see Notes table"
    - name: data_hi
      description: "Data high byte (meaning depends on preference)"
    - name: data_lo
      description: "Data low byte (meaning depends on preference)"

Variables

- id: channel_level
  label: Channel Level
  type: integer
  min: 1
  max: 255
  description: "Per area/channel lighting level; 01 = 100%, FF = 0%. Written via ramp/fade opcodes 71/72/73/5F; read via request_channel_level (61) / channel_level_report (60)."

# User preference values (indicator LED brightness 0x01, backlight 0x02, display brightness 0x03,
# contrast 0x04, sounder volume 0x05, temperature setpoint 0x07/0x0D, lux setpoint 0x0A,
# no-motion timeout 0x0B) are settable via set_user_preference (opcode 48).

Events

# UNRESOLVED: no unsolicited events documented in source; report messages (60/62/4A)
# are described as replies from the dimmer.

Macros

# UNRESOLVED: no multi-step sequences documented in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings or interlock procedures.
# Note: Panic (opcode 17) locks all control panels in an area and selects the panic preset;
# Un-Panic (opcode 18) unlocks and restores the previous preset.

Notes

  • Interface: RS-485, 9600 bps, 8 data bits, 1 start bit, 1 stop bit, no parity. Idle between bytes must be <1 ms; delay between packets must be >10 ms.
  • Two frame formats exist. Logical: [1C sync][area][data1][opcode][data2][data3][join][checksum]. Physical: [5C sync][device code][box number][opcode][data1][data2][data3][checksum]. Only the logical format has opcode examples in this source; physical-format opcodes are UNRESOLVED.
  • Checksum = negative 8-bit two's-complement sum of bytes 0-6 (all 8 bytes sum to 0x00 mod 256). Verified consistent with every worked example in the source.
  • Byte-2 anomalies: Panic/Un-Panic byte tables say "0 (Unused)" but examples use F0; Fade Area to a Level (opcode 79) byte table says "Channel" but the example (82 = 50%) uses it as the level. Examples followed verbatim.
  • Preset Select uses the opcode byte itself for the preset value (0=P1 ... D=P8) with the bank in byte 5 (0=P1-P8, 1=P9-P16, 2=P17-P24, etc.).
  • Area Linking: the Base Link Area (BLA) acts as an Area 0 for all channels with that BLA defined — useful as global control for a block of areas. Set/Clear Area Links use 3 bitmap bytes covering the 24 areas directly above the BLA.
  • User preference ids: 0x01 indicator LED brightness, 0x02 backlight LED brightness, 0x03 display brightness, 0x04 display contrast, 0x05 sounder volume (Data Hi = 01=100%/FF=0%, Data Lo = fade in 20 ms steps for these), 0x06 actual temperature (16-bit two's complement, 0.25 °C steps), 0x07 user temperature setpoint (0.25 °C steps), 0x08 display brightness scaled, 0x09 AC plant capability (bit 0 hot water, bit 1 cold water), 0x0A closed-loop light control setpoint in lux (0x0000-0xFFFF), 0x0B no-motion timeout in seconds (0x0000/0xFFFF = revert to configured), 0x0C actual temperature signed fixed point -127.99 to 127.99 °C (Data Hi MSB sign, 7 LSB integer; Data Lo fraction 0-99), 0x0D setpoint as per 0x0C.

Provenance

source_domains:
  - docs.dynalite.com
source_urls:
  - https://docs.dynalite.com/system-builder/latest/quick_start/dynet_opcodes.html
retrieved_at: 2026-09-05T02:05:22.909Z
last_checked_at: 2026-09-05T22:16:16.356Z

Verification Summary

verdict: verified
checked_at: 2026-09-05T22:16:16.356Z
matched_actions: 39
action_count: 39
confidence: medium
summary: "All 39 spec action units match source opcodes 03/65/64/0F/68/69/6B/71/72/73/74/75/76/79/04/5F/61/63/08/09/66/67/17/18/10/15/16/11/1A/1B/31/3A/3B/48/49/14/40/20/21; Feedbacks 60/62/4A also covered. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "model name \"Patpa\" does not appear anywhere in the source text — source is a generic \"Basic DyNet Opcodes\" reference. Firmware, hardware variant, and voltage/power specs not stated."
- "flow control not stated in source"
- "no unsolicited events documented in source; report messages (60/62/4A)"
- "no multi-step sequences documented in source."
- "source contains no safety warnings or interlock procedures."
- "model name \"Patpa\" not present in source — source is a generic DyNet opcode reference; confirm actual product before publishing."
- "physical message format (5C sync) documented but without opcode examples."
- "no voltage, current, or power specifications in source."
- "flow control not stated in source."

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