Via the companion-MCU route (CAN bus), apps bind the CAN system service and use its interface to command the HVAC and read decoded vehicle values. The most useful discovered signals:
| What | How (discovered signal) |
|---|---|
| A/C on/off | sendCmd(103, 0/1) |
| Driver temperature | sendCmd(107, code) |
| Fan speed | sendCmd(100, speed) |
| Front defrost | sendCmd(104, …) |
| Seat heating | sendCmd(110…112, …) |
| State of charge (%) | getInt(3335) |
| Pack A / Pack B SoC | getInt(3457) / getInt(3460) |
| HV voltage / current | getInt(3455) / getInt(3456) |
| Range (km) | getInt(3461) |
| Charge-cable connected | getInt(3337) |
| Speed | getInt(3454) × 0.05625 km/h |
| Traffic-sign state | getInt(3505) (3 = sign recognized, 4 = over-speed warning) |
There is no precondition / remote-climate command and no “time-to-full” value on the head-unit side. A/C control here is live HVAC — only effective while the HV bus is powered (ignition on). Parked pre-conditioning is a VCU/TBox function, not something the head unit can do.
“Time to full” therefore has to be estimated from SoC, pack capacity (~63 kWh) and live HV power (voltage × current), which are readable over CAN.