SUB 0x1C MONITORING STATUS RESPONSE — FINAL FIELD LOCATIONS
============================================================

Source: raw_s3_20260408_015927.bin (2ndtry capture)
Frames analyzed: 
  - IDLE (OFF):       Frame 90 at file offset 4115 (58-byte response)
  - MONITORING (ON):  Frame 106 at file offset 4922 (12-byte response)

================================================================================
IDLE/OFF RESPONSE (58 bytes) — COMPLETE FIELD MAP
================================================================================

HEX DUMP:
  00: 2c 00 00 00 00 00 00 00 00 00 00 00 00 08 10 04
  10: 07 ea 00 01 3b 2d 00 00 00 00 00 00 01 01 07 cb
  20: 00 06 00 00 01 01 07 cb 00 15 00 00 00 00 10 02
  30: a8 00 0e ff f2 00 0e 9e 52 ef

CONFIRMED FIELDS:
─────────────────────────────────────────────────────────────────

[00]                    MONITOR_MODE
                        Value: 0x2c (44 decimal)
                        Meaning: Device is IDLE (not monitoring)
                        When ON: 0x00

[0d]                    DAY
                        Value: 0x08 (8 decimal)
                        Range: 1–31
                        Date: 8th

[0e]                    HOUR
                        Value: 0x10 (16 decimal)
                        Range: 0–23
                        Interpretation: 4:00 PM (16:00)

[0f]                    MONTH
                        Value: 0x04 (4 decimal)
                        Range: 1–12
                        Meaning: April

[10:12]                 YEAR (uint16 BE)
                        Value: 0x07ea
                        Decimal: 2026
                        Full date: 2026-04-08

[12]                    MINUTE
                        Value: 0x00 (0 decimal)
                        Range: 0–59
                        Note: May have different encoding in other captures

[13]                    SECOND
                        Value: 0x01 (1 decimal)
                        Range: 0–59
                        Note: Unusually low; likely indicates sampling at minute turn-over

[2f:31]                 BATTERY_VOLTAGE (uint16 BE, ÷100)
                        Raw bytes: 0x02a8
                        Raw decimal: 680
                        Voltage: 680 ÷ 100 = 6.80 V
                        ✓ CONFIRMED: Expected ~6.8V
                        Alternative encodings tested and ruled out:
                          - BE/1000: 0.68V (too low)
                          - BE/10: 68V (too high)
                          - float32 BE/LE: no match
                          - Fixed-point variations: no match

[31:35]                 MEMORY_TOTAL (uint32 BE, in bytes)
                        Raw bytes: 0x000efff2
                        Decimal: 983,026 bytes
                        Kilobytes: 983,026 ÷ 1024 = 960.0 KB
                        ✓ CONFIRMED: Expected ~960 KB

[35:39]                 MEMORY_FREE (uint32 BE, in bytes)
                        Raw bytes: 0x000e9e52
                        Decimal: 958,034 bytes
                        Kilobytes: 958,034 ÷ 1024 = 935.6 KB
                        ✓ CONFIRMED: Expected ~936 KB
                        Sanity check: 935.6 / 960.0 = 97.5% (plausible)

UNIDENTIFIED REGIONS:
─────────────────────────────────────────────────────────────────

[01:0d]                 PADDING/RESERVED (12 bytes)
                        All zeros: 00 00 00 00 00 00 00 00 00 00 00 00

[14:16]                 UNKNOWN (2 bytes)
                        Value: 0x3b2d (59, 45)
                        Possibly event countdown or state field

[16:2f]                 CONFIGURATION SNAPSHOT (25 bytes)
                        Contains repeating patterns suggesting sub-structures:
                          - Possibly trigger levels
                          - Possibly calibration data
                          - Possibly alarm settings

[39]                    TRAILER (1 byte)
                        Value: 0xef (239)
                        Purpose unknown

================================================================================
MONITORING/ON RESPONSE (12 bytes) — CONDENSED FORMAT
================================================================================

HEX DUMP:
  00: 00 00 00 00 2c 00 00 00 00 00 00 1f

INTERPRETATION:
─────────────────────────────────────────────────────────────────

When the unit is actively monitoring, the response shrinks to 12 bytes.
Response layout appears different from idle format.

[04]                    POSSIBLE MONITOR_MODE (shifted position?)
                        Value: 0x2c
                        Note: In idle response this was at [00]

[0b]                    TRAILER (1 byte)
                        Value: 0x1f (31 decimal)
                        Different from idle trailer (0xef at [39])

All other bytes: 0x00 padding

HYPOTHESIS:
  When monitoring, the device suppresses detailed fields and returns only:
  - Monitor mode status (position may shift)
  - A condensed state indicator

================================================================================
TIME FIELD SUMMARY (3 INTERPRETATIONS)
================================================================================

OBSERVED BYTES:
  [0d] = 0x08 (day)
  [0e] = 0x10 (hour)
  [0f] = 0x04 (month)
  [10:12] = 0x07ea (year)
  [12] = 0x00 (minute)
  [13] = 0x01 (second)

INTERPRETATION #1 (MOST LIKELY):
  2026-04-08 16:00:01

INTERPRETATION #2 (IF BYTES ARE SWAPPED):
  Could be 2026-04-08 04:10:?? (but less likely)

INTERPRETATION #3 (IF TIME IS ELSEWHERE):
  Bytes at [14:16] = 0x3b2d could indicate 59 seconds, 45 ???
  But structure is unclear

CONFIDENCE: MEDIUM
  The date part (day/month/year) is confirmed at 2026-04-08.
  The hour=16 (4 PM) seems reasonable.
  Minute=00 and second=01 seem offset but may reflect the sample time.

================================================================================
VOLTAGE ENCODING VERIFICATION
================================================================================

Test: uint16 BE ÷ 100
  Raw bytes: 0x02a8
  As BE uint16: 680
  After ÷100: 6.80 V
  Expected: ~6.8V ✓ MATCH

Eliminated alternatives:
  ÷1000:     0.68V ✗ (too low)
  ÷10:       68V ✗ (too high)
  float32 BE: no 6.8V match ✗
  float32 LE: no 6.8V match ✗
  Fixed-point 8.8: no match ✗
  Fixed-point 16.0: no match ✗

CONCLUSION: uint16 BE ÷ 100 is correct encoding.

================================================================================
MEMORY ENCODING VERIFICATION
================================================================================

Test: uint32 BE (bytes), convert to KB
  
  Memory Total:
    Raw bytes: 0x000efff2
    As BE uint32: 983,026
    In KB: 983,026 ÷ 1024 = 960.0 KB
    Spec: ~960 KB ✓ MATCH

  Memory Free:
    Raw bytes: 0x000e9e52
    As BE uint32: 958,034
    In KB: 958,034 ÷ 1024 = 935.6 KB
    Spec: ~936 KB ✓ MATCH

  Sanity check: free (935.6) < total (960.0) ✓
  Usage: (960.0 - 935.6) / 960.0 = 2.5% (plausible)

CONCLUSION: uint32 BE (in bytes), divide by 1024 for KB.

================================================================================
PYTHON PARSING REFERENCE
================================================================================

    from struct import unpack
    
    data = bytes.fromhex("2c00000000000000000000000008100407ea00013b2d...")
    
    monitor_mode = data[0x00]
    day = data[0x0d]
    hour = data[0x0e]
    month = data[0x0f]
    year = unpack('>H', data[0x10:0x12])[0]
    minute = data[0x12]
    second = data[0x13]
    
    voltage_v = unpack('>H', data[0x2f:0x31])[0] / 100.0
    memory_total_kb = unpack('>I', data[0x31:0x35])[0] / 1024.0
    memory_free_kb = unpack('>I', data[0x35:0x39])[0] / 1024.0
    
    print(f"Monitor: {['ON', 'OFF'][monitor_mode == 0x2c]}")
    print(f"Date: {year:04d}-{month:02d}-{day:02d}")
    print(f"Time: {hour:02d}:{minute:02d}:{second:02d}")
    print(f"Battery: {voltage_v:.2f} V")
    print(f"Memory: {memory_total_kb:.1f} KB total, {memory_free_kb:.1f} KB free")

================================================================================
