Skip to content
John Lifsey edited this page Apr 7, 2026 · 1 revision

SAM (System Access Module) ASCII Protocol

Carrier SYSTXCCSAM01, SYSTXCCRCT01, SYSTXNNRCT01, SYSTXCCRWF01 serial port protocol specification.

Source: Carrier Application Specification SAM01-04XA (09/21)

Compatible Devices

  • SAM Part Numbers: SYSTXCCSAM01, SYSTXCCRCT01, SYSTXNNRCT01, SYSTXCCRWF01
  • Legacy UID/UIZ Controls: Software Version 14 or later
  • Infinity Touch Controls: Software Version 08 or later

Note: The SAM is designed for legacy UID/UIZ wall controls. When used with Infinity Touch systems, some commands return NAK or have different behavior. Differences are noted throughout this document.

Protocol Testing Summary (2026-03-30)

Eight commands were tested via passive bus monitoring with the sam-comparator tool. Key findings:

Finding Detail
ASCII commands trigger bus notification SAM notifies thermostat after accepting ASCII command
Thermostat acknowledges with 3B0E Writes activity flag (0x01) back to SAM
System commands: 3 x 3B0E BLIGHT, MODE -- single burst
Zone commands: ~11 x 3B0E HTSP, CLSP, FAN -- spread bursts of 3
Queued commands: 20-50 x 3B0E Compressed burst when changes overlap
Each burst is exactly 3 writes Triplication for reliability
Direct CarBus writes do NOT trigger flow Only ASCII-initiated changes propagate
0420 was never observed Likely a thermostat register, not SAM

Detailed per-command sequences in the Observed Protocol Behavior section below.

RS-232 Connection

Serial Settings

  • Baud rate: 9600 bps, half-duplex
  • Data bits: 8
  • Parity: None
  • Stop bits: 1
  • Line ending: CRLF (\r\n)

Hardware Configuration

The SAM has a female DB-9 connector configured as DCE (Data Circuit-terminating Equipment):

Pin Signal Description
1 DCD Not Connected
2 RxD Data received at DTE/PC
3 TxD Data transmitted from DTE/PC
4 DTR Not Connected
5 GND Signal Ground
6 DSR Not Connected
7 RTS Not Connected
8 CTS Not Connected
9 RI Not Connected

Use a standard DB-9 extension cable to connect SAM (DCE) to PC (DTE).

Protocol Rules

Message Format

  • All characters converted/parsed as uppercase (host may send upper or lower case)
  • All commands terminated by carriage return and line feed (CR/LF)
  • Maximum message length: 64 characters including CR/LF
  • SAM processes command buffer upon receiving CR/LF

Timeouts

  • Inter-character timeout: 5 seconds - receive buffer reset if exceeded
  • Response timeout: SAM responds within 5 seconds, otherwise returns NAK

Message Hierarchy

Level 1: System (S1 or S2 - up to 2 systems supported)
Level 2: Zone (Z1 thru Z8 - up to 8 zones supported)
Level 3: User settings / Service settings

Command Format

Query Command

S<system><command>?

Set Command

S<system><command>!<value>

Components

  • S - Static prefix
  • <system> - System number (1 or 2)
  • <command> - Command identifier (see tables below)
  • ? - Query indicator
  • ! - Set indicator
  • <value> - Value to set

Response Format

  • Successful query: <command>: <value>
  • Successful set: <command>: ACK
  • Command error: <command>: NAK CMD
  • Value error: <command>: NAK VAL
  • CCN/Timeout error: <command>: NAK

Zone Commands

Command Description Example Query Example Response
Z#RT Room temperature S1Z1RT? S1Z1RT: 72F
Z#RH Room humidity (max 99%) S1Z1RH? S1Z1RH: 45%
Z#FAN Fan setting S1Z1FAN? S1Z1FAN: AUTO
Z#HOLD Hold status S1Z1HOLD? S1Z1HOLD: OFF
Z#UNOCC Unoccupied status S1Z1UNOCC? S1Z1UNOCC: OFF
Z#HTSP Heat setpoint S1Z1HTSP? S1Z1HTSP: 68F
Z#CLSP Cool setpoint S1Z1CLSP? S1Z1CLSP: 76F
Z#RHTG Humidification target (max 99%) S1Z1RHTG? S1Z1RHTG: 35%
Z#OVR Override state ("hold until" timer active) S1Z1OVR? S1Z1OVR: OFF
Z#OTMR Override timer remaining (HH:MM) S1Z1OTMR? S1Z1OTMR: 01:30
Z#NAME Zone name (11 char max) S1Z1NAME? S1Z1NAME: Living Room

Zone number (#) ranges from 1-8.

Touch-Specific Zone Behavior

Command Legacy UID/UIZ Infinity Touch
Z#HOLD Program hold status "Hold permanent" status
Z#UNOCC Unoccupied status AWAY state in "hold permanent"
Z#FAN Fan setting AUTO indicates continuous fan OFF

System Commands

Command Description Example Query Example Response
MODE System mode (+ demand stages) S1MODE? S1MODE: COOL2
OAT Outdoor temperature S1OAT? S1OAT: 85F
HUMID Humidifier output state S1HUMID? S1HUMID: OFF
DAY Day of week S1DAY? S1DAY: TUESDAY
TIME Time of day (12-hour) S1TIME? S1TIME: 02:30 P
ZONE Displayed zone number S1ZONE? S1ZONE: 1
PER Program period S1PER? S1PER: WAKE

Touch-Specific System Behavior

Command Legacy UID/UIZ Infinity Touch
PER? Returns WAKE/DAY/EVE/SLEEP Returns NAK

Accessory Commands

Command Description Example Query Example Response
FILTRLVL Filter life % S1FILTRLVL? S1FILTRLVL: 75%
UVLVL UV lamp life % S1UVLVL? S1UVLVL: 50%
HUMLVL Humidifier pad life % S1HUMLVL? S1HUMLVL: 80%
VENTLVL Ventilator filter life % S1VENTLVL? S1VENTLVL: 60%
FILTRRMD Filter reminder enabled S1FILTRRMD? S1FILTRRMD: ON
UVRMD UV lamp reminder enabled S1UVRMD? S1UVRMD: ON
HUMRMD Humidifier reminder enabled S1HUMRMD? S1HUMRMD: ON
VENTRMD Ventilator reminder enabled S1VENTRMD? S1VENTRMD: ON

Vacation Commands

Command Description Example Query Example Response
VACAT Vacation state S1VACAT? S1VACAT: OFF
VACDAYS Vacation days remaining (max 365) S1VACDAYS? S1VACDAYS: 007
VACMINT Vacation min temp S1VACMINT? S1VACMINT: 60F
VACMAXT Vacation max temp S1VACMAXT? S1VACMAXT: 85F
VACMINH Vacation min humidity S1VACMINH? S1VACMINH: 030%
VACMAXH Vacation max humidity S1VACMAXH? S1VACMAXH: 060%
VACFAN Vacation fan setting S1VACFAN? S1VACFAN: AUTO

Vacation Humidity Values

Setting Legacy UID/UIZ Infinity Touch
VACMINH valid values 0, 10, 15, 20 0 (NONE), 5, 10, 15, 20, 25, 30, 35, 40, 45
VACMAXH valid values 55, 60, 65, 100 (NONE) 50, 55, 60, 65, 100 (NONE)

Configuration Commands

Command Description Example Query Example Response
BLIGHT Backlight setting S1BLIGHT? S1BLIGHT: ON
CFGEM Units (English/Metric) S1CFGEM? S1CFGEM: F
CFGAUTO Auto mode enabled S1CFGAUTO? S1CFGAUTO: ON
CFGTYPE System type S1CFGTYPE? S1CFGTYPE: HEATCOOL
CFGDEAD Heat/cool deadband (0-6) S1CFGDEAD? S1CFGDEAD: 3
CFGCPH Cycles per hour (2-6) S1CFGCPH? S1CFGCPH: 4
CFGFAN Programmable fan S1CFGFAN? S1CFGFAN: ON
CFGPER Periods per day (2 or 4) S1CFGPER? S1CFGPER: 4
CFGPGM Programming enabled S1CFGPGM? S1CFGPGM: ON
DEALER Dealer name (18 char max) S1DEALER? S1DEALER: JOE'S HVAC
DEALERPH Dealer phone (18 char max) S1DEALERPH? S1DEALERPH: 1-800-HVAC

Touch-Specific Configuration Behavior

Command Legacy UID/UIZ Infinity Touch
BLIGHT? ON=continuous backlighting ON=at or above Level 3; OFF=at or below Level 2
CFGAUTO! Sets auto mode Returns NAK
CFGDEAD! Sets deadband Returns NAK
CFGCPH! Sets cycles per hour Returns NAK
CFGFAN? Returns programmable fan setting Always returns ON
CFGFAN! Sets programmable fan Returns NAK
CFGPER? Returns periods per day Returns NAK
CFGPER! Sets periods per day Returns NAK
CFGPGM! Sets programming state Returns NAK
DEALER! Sets dealer name Returns NAK (set via online/USB)
DEALERPH! Sets dealer phone Returns NAK (set via online/USB)

Units Configuration Note

  • Query returns F (Fahrenheit) or C (Celsius)
  • Set command uses E (English) or M (Metric)
  • Example: S1CFGEM? returns F, but S1CFGEM!E sets English

Set Command Examples

Mode

S1MODE!AUTO       -> S1MODE: ACK
S1MODE!HEAT       -> S1MODE: ACK
S1MODE!COOL       -> S1MODE: ACK
S1MODE!OFF        -> S1MODE: ACK
S1MODE!EHEAT      -> S1MODE: ACK (Touch: always returns NAK)

Setpoint with Override Timer

Legacy UID/UIZ:

S1Z1HTSP!68,01:30 -> S1Z1HTSP: ACK
# Sets heat setpoint to 68F with 1h30m override timer
# Default override: 3 hours (heat), 2 hours (cool)

Infinity Touch:

S1Z1HTSP!68,01:30 -> S1Z1HTSP: ACK
# Issues "hold until" in MANUAL activity with specified duration
S1Z1HTSP!68       -> S1Z1HTSP: ACK
# Issues "hold permanent" in MANUAL activity (if not already in MANUAL)
# Deadband may cause cool setpoint to be adjusted automatically

Time

S1TIME!08:10A     -> S1TIME: ACK    # 8:10 AM (leading zero required)
S1TIME! 8:10A     -> S1TIME: NAK VAL  # Error: missing leading zero
S1TIME!09:01P     -> S1TIME: ACK    # 9:01 PM

Day (Legacy Only)

S1DAY!0           -> S1DAY: ACK     # Sunday (Touch: returns NAK)
S1DAY!6           -> S1DAY: ACK     # Saturday

Fan

S1Z1FAN!AUTO      -> S1Z1FAN: ACK   # AUTO sets continuous fan OFF
S1Z1FAN!LOW       -> S1Z1FAN: ACK
S1Z1FAN!MED       -> S1Z1FAN: ACK
S1Z1FAN!HIGH      -> S1Z1FAN: ACK

Hold

S1Z2HOLD!ON       -> S1Z2HOLD: ACK  # Touch: issues "hold permanent"
S1Z2HOLD!OFF      -> S1Z2HOLD: ACK

Unoccupied

S1Z1UNOCC!ON      -> S1Z1UNOCC: ACK  # Touch: sets zone to AWAY state in hold permanent
S1Z1UNOCC!OFF     -> S1Z1UNOCC: ACK  # Touch: sets zone to HOME state in hold permanent

Override Timer

S1Z1OTMR!01:05    -> S1Z1OTMR: ACK   # 1 hour 5 minutes (Touch: truncated to 15-min interval)
S1Z1OTMR!00:00    -> S1Z1OTMR: ACK   # Cancel hold until

Vacation

S1VACDAYS!001     -> S1VACDAYS: ACK  # 1 day (leading zeros for <100)
S1VACDAYS!000     -> S1VACDAYS: ACK  # End vacation
S1VACMINT!06      -> S1VACMINT: ACK  # Min temp 6C (leading zero)

Accessory Reset

S1FILTRLVL!0      -> S1FILTRLVL: ACK  # Reset filter life to 0%
S1UVLVL!0         -> S1UVLVL: ACK     # Reset UV lamp life to 0%
S1HUMLVL!0        -> S1HUMLVL: ACK    # Reset humidifier pad life to 0%
S1VENTLVL!0       -> S1VENTLVL: ACK   # Reset ventilator filter life to 0%

Backlight

S1BLIGHT!ON       -> S1BLIGHT: ACK   # Touch: sets to Level 8 (factory default)
S1BLIGHT!OFF      -> S1BLIGHT: ACK   # Touch: sets to Level 2

Units

S1CFGEM!M         -> S1CFGEM: ACK   # Metric (query returns C)
S1CFGEM!E         -> S1CFGEM: ACK   # English (query returns F)

Zone Name

S1Z1NAME!LivingRoom  -> S1Z1NAME: ACK  # Max 11 characters + NUL

Factory Reset (Legacy Only)

S1CFG!A5A5        -> S1CFG: ACK     # First command
S1CFG!RESET       -> S1CFG: ACK     # Must follow within 10 seconds
# Touch: returns NAK

Programming Schedule Commands (Legacy UID/UIZ Only)

Important: Infinity Touch controls return NAK for all programming commands.

Format

S1Z1PGM<day><period>?          # Query
S1Z1PGM<day><period>!<values>  # Set

Days

  • MON, TUE, WED, THU, FRI, SAT, SUN

Periods

  • WAKE, DAY, EVE, SLEEP

Value Format

TIME(HH:MM A/P),HEAT,COOL,FAN

Example

S1Z1PGMMONWAKE?   -> S1Z1PGMMONWAKE: 06:00A, 68F, 76F, AUTO
S1Z1PGMMONWAKE!06:30A,70,72,AUTO -> S1Z1PGMMONWAKE: ACK

Error Responses

Response Meaning
NAK CMD Command not recognized, not supported, or zone/system not present
NAK VAL Invalid value for command
NAK CCN error or response timeout

Common Error Cases

  • S1Z5RT? -> S1Z5RT: NAK CMD (Zone 5 not present)
  • S1Z5RT! -> S1Z1RT: NAK CMD (Set command not supported for RT)
  • S1Z1MODE? -> S1Z1MODE: NAK CMD (MODE doesn't take zone parameter)
  • S1MODE!AUTO -> S1MODE: NAK VAL (AUTO invalid for heat-only system)
  • S2MODE? -> S2MODE: NAK CMD (System 2 not present)
  • S1MODE:HEAT -> S1MODE:HEAT: NAK CMD (Missing ! for set command)
  • S1DAY!9 -> S1DAY: NAK VAL (Invalid value, valid range 0-6)

Mode Values

Mode Description
HEAT Heating mode
COOL Cooling mode
AUTO Automatic heat/cool
OFF System off
EHEAT Emergency heat (Touch: always returns NAK when set)

Mode may include a number suffix indicating active demand stages:

  • HEAT2 - Heating with 2 stages active
  • COOL1 - Cooling with 1 stage active

Day Values

Value Day
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday

System Type Values

Value Description
HEAT Heat only
COOL Cool only
HEATCOOL Heat and cool

General Notes

  1. All temperatures include unit suffix (F or C) based on system configuration
  2. Time is always 12-hour format with A/P suffix
  3. Leading zeros required for time values < 10 and vacation days < 100
  4. Maximum humidity display is 99%
  5. Zone names max 11 characters
  6. Dealer name/phone max 18 characters
  7. System malfunctions, maintenance reminders, and diagnostics are NOT available via ASCII port
  8. SAM supports up to 2 Infinity systems

Observed Protocol Behavior (Infinity Touch, SYSTXCCSAM01)

These behaviors were observed via passive bus monitoring with the sam-comparator tool. The SAM was connected through a bridged RS485 connection to an Infinity Touch thermostat.

ASCII Command Requirements

The SAM must have an active ABCD bus sync with the thermostat before it will process ASCII commands. Without sync:

  • S1BLIGHT? -> NAK (plain -- CCN timeout)
  • S1BLIGHT!ON -> NAK or NAK CMD

Sync is established after the SAM completes multiple bidirectional register exchanges with the thermostat (observed: 10+ successful read/reply cycles).

Change notification mechanism: After accepting an ASCII zone command (ACK), the SAM writes register 3B03 (sam_zones, 150 bytes) to the thermostat on the ABCD bus. The thermostat acknowledges by writing 3B0E (activity flag, value 0x01) back to the SAM. This SAM->Thermostat 3B03 write is the actual notification -- the thermostat does not discover changes through polling alone.

The SAM is easily overloaded. Sending ASCII commands via blocking calls (e.g., send_with_retries with 15 retries x 8s timeout) starves the ABCD bridge and breaks sync. Commands must be sent non-blocking (fire-and-forget syswrite, response read on next loop iteration) to keep the bridge alive.

BLIGHT Change Protocol Sequence

Observed 2026-03-30. After S1BLIGHT!ON -> S1BLIGHT: ACK:

Time     Direction         Frame                         Notes
-----    ----------        ----------------------        ----------------------
+0.0s    ASCII->SAM        S1BLIGHT!ON                   Command accepted
+0.0s    SAM->ASCII        S1BLIGHT: ACK                 SAM acknowledges
+0.0-    Thermostat->SAM   read 0104 (device_info) x3    Normal polling continues
+1.5s                      -> SAM replies
+3.3s    Thermostat->SAM   write 3B0E (sam_activity) x3  Thermostat acknowledges
                           -> SAM ACKs                    change
+3.3s    Thermostat->SAM   read 030D (sam_status) x3     Status refresh
+4.0s+                     Normal polling resumes

Key findings:

  1. SAM notifies Thermostat via the bus -- after accepting the ASCII command, the SAM propagates the change to the thermostat over the ABCD bus.
  2. Thermostat responds with 3B0E -- the thermostat writes the activity indicator register (3B0E, flag=0x01) back to SAM, confirming receipt.
  3. 3B0E is the change acknowledgment mechanism -- this register is the thermostat's way of confirming it processed a change the SAM sent.
  4. ~3 second round-trip -- from ASCII ACK to 3B0E write takes about 3 seconds.
  5. Three repetitions -- both the 3B0E write and 030D read are repeated 3 times, suggesting a reliability mechanism.
  6. No 0420 sync burst -- BLIGHT does not trigger the sync register.

HTSP (Heat Setpoint) Change Protocol Sequence

Observed 2026-03-30. After S1Z1HTSP!66 (67->66F) -> S1Z1HTSP: ACK:

Time      Event                              Notes
-----     -----------------------------      ------------------------------
+0.0s     ASCII: S1Z1HTSP!66 -> ACK          Setpoint change accepted
+0.7s     Thermostat writes 3B0E x3          First acknowledgment burst
+0.8s     Thermostat reads 0104 x3           Device info query
+3.5s     Thermostat reads 030D x3           Status query
+4.1s     Thermostat writes 3B0E x1          Second acknowledgment
+5.0s     Thermostat reads 0104 x3           Device info query
+7.4s     Thermostat writes 3B0E x6          Third acknowledgment burst
+9.3s     Thermostat writes 3B0E x3          Fourth acknowledgment burst
+13.2s    Thermostat reads 0104 x3           Device info query
+14.5s    Thermostat reads 030D x5           Extended status query
+15.3s    Thermostat writes 3B0E x3          Fifth acknowledgment burst
+17.3s    Thermostat writes 3B0E x3          Sixth acknowledgment burst
+18.0s    Thermostat reads 0104 x3           Device info query
Total:    24 x 3B0E writes over 20 seconds

Key differences from BLIGHT:

  1. Much faster initial response -- 3B0E appears at +0.7s (vs +3.3s for BLIGHT).
  2. Far more 3B0E writes -- 24 total over 20 seconds (vs 3 for BLIGHT).
  3. Burst pattern -- 3B0E writes come in clusters (3, 1, 6, 3, 3, 3) separated by 2-3 seconds, not a single burst.
  4. Extended activity -- the thermostat keeps acknowledging for 17+ seconds, suggesting the setpoint change triggers a prolonged sync process.
  5. No 0420 sync burst -- like BLIGHT, no sync register observed.
  6. Repeated read cycles -- the thermostat does multiple rounds of 0104 + 030D queries interspersed with 3B0E writes.

CLSP (Cool Setpoint) Change Protocol Sequence

Observed 2026-03-30. After S1Z1CLSP!73 (74->73F) -> S1Z1CLSP: ACK:

Note: This test was run immediately after the HTSP test (67->66F). The thermostat may have still been processing the previous setpoint change.

Time      Event                              Notes
-----     -----------------------------      ------------------------------
+0.0s     ASCII: S1Z1CLSP!73 -> ACK          Cool setpoint change accepted
+2.1s     Thermostat reads 0104 x1           Single device info query
+7.5s     Thermostat reads 0104 x1           Single device info query
+11.3s    Thermostat reads 0104 x3           Device info query burst
+19.3s    Thermostat reads 030D x3           Status query
+19.3s    Thermostat writes 3B0E x18         Massive acknowledgment burst
+19.3s    Thermostat reads 0104 x5
+19.3s    Thermostat writes 3B0E x18         Second massive acknowledgment burst
+19.3s    Thermostat reads 0104 x7, 030D x3
+19.3s    Thermostat writes 3B0E x13         Final acknowledgment burst
Total:    49 x 3B0E writes, all at +19.3s

Key observations:

  1. Extreme delay -- all 3B0E writes came at +19.3s (vs +0.7s for HTSP alone).
  2. Compressed burst -- 49 writes in a single massive burst instead of spread over time.
  3. Likely queued -- the thermostat may have queued the CLSP acknowledgment while still processing the HTSP change from the previous test run.
  4. Largest 3B0E count -- 49 writes, double the HTSP count (24), possibly combining acknowledgment for both pending changes.
  5. No 0420 sync burst -- consistent with BLIGHT and HTSP.

MODE Change Protocol Sequence

Observed 2026-03-30. After S1MODE!COOL (from AUTO) -> S1MODE: ACK:

Note: Run immediately after CLSP test. Thermostat likely still processing prior changes.

Time      Event                              Notes
-----     -----------------------------      ------------------------------
+0.0s     ASCII: S1MODE!COOL -> ACK          Mode change accepted
+0.0-7.4s Thermostat reads 0104 x4          Sparse polling
+16.4s    Thermostat writes 3B0E x6          First acknowledgment burst
+16.7-    Thermostat writes 3B0E x5          Continuation
+17.0s
+17.7-    Thermostat writes 3B0E x5          Second burst
+17.9s
+18.9s    Thermostat reads 0104 x3           Device info query
+19.3-    Thermostat writes 3B0E x31         Massive compressed burst
+20.0s      reads 0104 x13, 030D x9
Total:    47 x 3B0E writes, bursts at +16s and +19s

Key observations:

  1. Delayed response -- first 3B0E at +16.4s (likely queued from prior CLSP).
  2. Two-phase burst -- initial 11 writes at +16-18s, then 36 writes at +19-20s.
  3. No new register types -- thermostat only queries 0104 and 030D, same as BLIGHT/HTSP.
  4. No 0420 sync burst -- consistent across all tested commands.
  5. 47 x 3B0E -- similar intensity to CLSP (49), much more than BLIGHT (3).

FAN Change Protocol Sequence

Observed 2026-03-30. After S1Z1FAN!LOW (from OFF) -> S1Z1FAN: ACK:

Note: Run after MODE test. Some queuing likely, but first response at +5.7s is cleaner than CLSP/MODE runs.

Time      Event                              Notes
-----     -----------------------------      ------------------------------
+0.0s     ASCII: S1Z1FAN!LOW -> ACK          Fan mode change accepted
+0.7s     Thermostat reads 0104 x3           Device info query
+3.3s     Thermostat reads 0104 x3           Device info query
+4.5s     Thermostat reads 030D x3           Status query
+5.7s     Thermostat writes 3B0E x3          First acknowledgment burst
+7.7s     Thermostat reads 0104 x3
+10.5s    Thermostat reads 0104 x3
+12.1s    Thermostat reads 030D x3
+16.9s    Thermostat reads 0104 x3
+17.7s    Thermostat writes 3B0E x3          Second acknowledgment burst
+19.3s    Thermostat reads 0104 x3, 030D x7
+20.0s    Thermostat writes 3B0E x19         Compressed burst (likely queued)
Total:    25 x 3B0E writes

Key finding: FAN produces nearly identical 3B0E count (25) to HTSP (24), confirming that acknowledgment intensity correlates with zone vs system level, not the specific command type.

FAN MED Protocol Sequence

Observed 2026-03-30. After S1Z1FAN!MED (from LOW) -> S1Z1FAN: ACK:

Run after FAN LOW had fully settled. This is the cleanest zone-command baseline.

Time      Event                              Notes
-----     -----------------------------      ------------------------------
+0.0s     ASCII: S1Z1FAN!MED -> ACK          Fan mode change accepted
+2.2s     Thermostat reads 0104 x3           Device info query
+12.4s    Thermostat writes 3B0E x3          First acknowledgment burst
+13.2s    Thermostat reads 030D x2           Status query
+16.4s    Thermostat reads 0104 x3
+18.2s    Thermostat writes 3B0E x3          Second acknowledgment burst
+19.4s    Thermostat reads 0104 x10, 030D x3 Compressed reads
+19.9s    Thermostat writes 3B0E x5          Final burst
Total:    11 x 3B0E writes, spread over ~8s

Revised baseline: 11 x 3B0E is likely the true non-queued zone-command count. The higher counts for HTSP (24) and FAN LOW (25) may include residual queuing from prior tests. All non-queued zone commands appear to produce 9-12 x 3B0E.

Command Comparison Summary

Aspect BLIGHT HTSP CLSP MODE FAN LOW FAN MED FAN HIGH FAN AUTO OTMR set OTMR cancel Direct
Level System Zone Zone System Zone Zone Zone Zone Zone Zone Direct
3B0E count 3 24* 49* 47* 25* 11 28* 20* 6 6 0
First 3B0E +3.3s +0.7s +19.3s* +16.4s* +5.7s* +12.4s +8.1s +1.0s -0.7s -0.7s N/A
Clean run? Yes Mostly No No Maybe Yes No No Yes Yes N/A
SAM->stat 3B03 No Yes Yes Yes Yes Yes Yes Yes Yes Yes No
0420 sync No No No No No No No No No No No

Run after prior change; elevated counts and delays likely from queuing.

Baseline (non-queued): zone -> ~11 3B0E, system -> 3 3B0E, queued -> 20-50 compressed. Each acknowledgment burst is typically 3 writes. Spread bursts = clean; compressed = queued.

Direct CarBus writes to SAM registers are accepted but do NOT propagate to the thermostat. The SAM caches the value locally but does not notify the bus. Only changes made through the ASCII port trigger the SAM->Thermostat notification and 3B0E acknowledgment cycle.

Setpoint changes produce a dramatically more intense acknowledgment pattern than configuration changes (24-49 x 3B0E vs 3 x 3B0E), suggesting the thermostat treats setpoint changes as higher-priority events requiring extended confirmation. When setpoint changes are made in quick succession, the thermostat may queue acknowledgments and release them in a compressed burst.

SAM->Thermostat 3B03 Write Notification Mechanism

When the SAM accepts an ASCII zone command, it actively writes register 3B03 (sam_zones) to the thermostat on the ABCD bus. This is how the SAM notifies the thermostat of the change -- it is not passive polling.

The thermostat then responds with 3B0E (activity acknowledgment) to confirm receipt.

The 3B03 payload (150 bytes) contains the full zone configuration. Key byte offsets that change with timed override operations:

Byte Field CLSP!73 OTMR!00:30 OTMR!00:00
2 Override active flag 0x08 0x80 0x80
39 Override timer value 0x00 0x14 0x00

Byte 2 bit 7 (0x80) indicates an override is active. Byte 39 encodes the override timer -- 0x14 (20 decimal) was observed for a 30-minute override; the exact time unit (half-minutes, quarter-hours, etc.) needs further investigation.

OTMR Set Protocol Sequence (OTMR!00:30)

After S1Z1OTMR!00:30 -> ACK (3 attempts, clean run):

Time      Event                              Notes
-------   -----------------------------      ------------------------------
-0.446s   SAM -> Thermostat  write 3B03 x2   SAM pushes zone update
-0.653s   Thermostat -> SAM  write 3B0E x3   Pre-ACK acknowledgment burst
+0.000s   ASCII ACK received
+0.452s   SAM -> Thermostat  read 3C14 x7   State verification queries
+0.895s   Thermostat -> SAM  write 3B0E x3   Post-ACK acknowledgment burst
+1.485s   Thermostat -> SAM  read 030D x5    Status refresh

6 x 3B0E total (two triplicate bursts: before and +0.9s after ACK). 2 x SAM->Thermostat 3B03 writes precede the 3B0E.

OTMR Cancel Protocol Sequence (OTMR!00:00)

After S1Z1OTMR!00:00 -> ACK (25 attempts, unreliable):

Time      Event                              Notes
-------   -----------------------------      ------------------------------
-1.992s   SAM -> Thermostat  write 3B03 x7   SAM pushes zone update
-0.719s   Thermostat -> SAM  write 3B0E x3   Pre-ACK acknowledgment burst
+0.000s   ASCII ACK received
+2.570s   Thermostat -> SAM  read 0104 x4   Normal polling resumes
+3.320s   SAM -> Thermostat  read 3C0C x6   State verification queries
+3.592s   Thermostat -> SAM  write 3B0E x3   Post-ACK acknowledgment burst

6 x 3B0E total (two triplicate bursts: before and +3.6s after ACK). 7 x SAM->Thermostat 3B03 writes precede the 3B0E.

Key finding: OTMR set and cancel produce identical acknowledgment patterns (6 x 3B0E in two triplicate bursts). The thermostat does not distinguish between setting and canceling a timed override at the bus level.

SAM Post-Command Register Queries

After processing each ASCII command, the SAM reads these undocumented thermostat registers to verify the change propagated:

Register Read count Observed after Notes
3C14 228 All commands Most frequently queried
3C0C 159 Most commands Queried in bursts of 6-8
3C0D 151 Most commands Queried after initial acknowledgment
3003 76 OTMR changes Zone state verification
3005 71 OTMR changes Zone state verification

These are NOT in the SAM register space (3B02-3B0E). They appear to be thermostat-internal registers. The SAM always gets exception responses (0x04) when reading them -- the thermostat doesn't serve these addresses. This may be the SAM querying its own cached mirror of thermostat data.

Third-Party Automation

Known compatible home automation systems:

Clone this wiki locally