Listening to the P1/P2 bus should be quite safe. But still, be aware that the bus is powered (15V DC), so avoid short circuits. P1P2 bus uses a master/slave protocol. Communication is asynchronous: master sends a "request" data packet and waits for "response" data packet from a slave (or timeout) before sending new packet. There can only be one master. The master is the main controller (Daikin user interface attached to the unit), all other devices on the bus act as slaves: the heat pump itself and external controllers. Each data packet consists of:
- Header
- 1 byte indicating direction of the communication: request from master (0x00), response from slave (0x40) or other (0x80)
- 1 byte slave address: 0x00 heat pump
- 1 byte packet type: the packet type indicates what kind of data is transmitted in the payload. For example, packet type 0x11 (response from the heat pump) contains temperature values (leaving and returning water, outdoor and indoor temperature etc.)
- Payload
- Up to cca 30 bytes of payload data. Payload length and content are determined by the header. For example, packet with header 0x400011 (= response from heat pump, packet type 0x11) always has 18 byte payload. First and second bytes of the payload in this particular packet always hold the leaving water temperature. Content (and length) of thepayload may vary depending on the heat pump model.
- Checksum
- 1 byte CRC checksum
There is a large number of packet types observed on the P1P2 bus, each of them with specific payload. For more details about the P1P2 protocol (what we learned so far through reverse engineering) and for a full overview of the packet types identified (empirically observed on the tested heat pumps), please visit https://github.com/Arnold-n/P1P2Serial.
Data packet is forwarded as-it-is (Header + Payload) as raw HEX.
Daikin P1P2 protocol payload data format for Daikin Altherma Hybrid (perhaps all EHYHB(H/X) models) and Daikin Altherma LT (perhaps all EHV(H/X) models). Big thanks go to Arnold Niessen for his development of the P1P2 adapter and the P1P2Serial library. Most of the information in these tables is based on his observation of the P1P2 protocol. This document is based on reverse engineering and assumptions, so there may be mistakes and misunderstandings.
This document describes payload data of few selected readable packet types (packet types 0x10 - 0x16 and 0xB8) exchanged between the main controller (requests) and the heat pump (responses). For a more complete overview see Arnold's documentation here: https://github.com/Arnold-n/P1P2Serial/tree/master/doc
The following data-types were observed or suspected in the payload data:
Data type | Definition |
---|---|
flag8 | byte composed of 8 single-bit flags |
c8 | ASCII character byte |
s8 | signed 8-bit integer -128 .. 127 |
u8 | unsigned 8-bit integer 0 .. 255 |
u6 | unsigned 6-bit integer 0 .. 63 |
u2 | unsigned 2-bit integer 0 .. 3 or 00 .. 11 |
s16 | signed 16-bit integer -32768..32767 |
u16 | unsigned 16-bit integer 0 .. 65535 |
u24 | unsigned 24-bit integer |
u32 | unsigned 32-bit integer |
u16hex | unsigned 16-bit integer output as hex 0x0000-0xFFFF |
u24hex | unsigned 24-bit integer |
u32hex | unsigned 32-bit integer |
f8.8 (code: f8_8) | signed fixed point value : 1 sign bit, 7 integer bit, 8 fractional bits (two’s compliment, see explanation below) |
f8/8 (code: f8s8) | Daikin-style fixed point value: 1st byte is value before comma, and 2nd byte is first digit after comma (see explanation below) |
s-abs4 | Daikin-style temperature deviation: bit 4 is sign bit, bits 0-3 is absolute value of deviation |
sfp7 | signed floating point value: 1 sign bit, 4 mantissa bits, 2 exponent bits (used for field settings) |
u8div10 | unsigned 8-bit integer 0 .. 255, to be divided by 10 |
u16div10 | unsigned 16-bit integer 0 .. 65535, to be divided by 10 |
t8 | schedule moment in 10 minute increments from midnight (0=0:00, 143=23:50) |
d24 | day in format YY MM DD |
Explanation of f8.8 format: a temperature of 21.5°C in f8.8 format is represented by the 2-byte value in 1/256th of a unit as 1580 hex (1580hex = 5504dec, dividing by 256 gives 21.5). A temperature of -5.25°C in f8.8 format is represented by the 2-byte value FAC0 hex (FAC0hex = - (10000hex-FACOhex) = - 0540hex = - 1344dec, dividing by 256 gives -5.25).
Explanation of f8/8 format: a temperature of 21.5°C in f8/8 format is represented by the byte value of 21 (0x15) followed by the byte value of 5 (0x05). So far this format was only detected for the setpoint temperature, which is usually not negative, so we don't know how negative numbers are stored in this format.
Packet types 10-16 are part of the regular communication pattern between main controller and heat pump.
Header: 000010
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0:0 | 0/1 | Heat pump (off/on) | bit |
0:other | 0 | ? | bit |
1:7 | 0/1 | Heat pump (off/on) | bit |
1:0 | 0/1 | 1=Heating mode | bit |
1:1 | 0/1 | 1=Cooling mode | bit |
1:0 | 1 | Operating mode gas? | bit |
1:other | 0 | Operating mode? | bit |
2:1 | 0/1 | DHW tank power (off/on) | bit |
2:0 | 0/1 | DHW (off/on) | bit |
2:other | 0 | ? | bit |
3 | 00 | ? | |
4 | 00 | ? | |
5 | 00 | ? | |
6 | 00 | ? | |
7-8 | 13 05 | Target room temperature | f8.8 |
9:6 | 0/1 | ? | bit |
9:5 | 0/1 | Heating/Cooling automatic mode | bit |
9:others | 0 | ? | bit |
10:2 | 0/1 | Quiet mode (off/on) | bit |
10:others | 0 | ? | bit |
11 | 00 | ? | |
12:3 | 1 | ? | bit |
12:others | 0 | ? | bit |
13 | 00 | ? | |
14 | 00 | ? | |
15 | 0F | ? | flag8/bits? |
16 | 00 | ? | |
17:6 | 0/1 | operation (off/on) | bit |
17:1 | 0/1 | booster (off/on) | bit |
17:others | 0 | ? | bit |
18 | 3C | DHW target temperature | u8 / f8.8? |
19 | 00 | fractional part byte 18? |
Header: 400010
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0:0 | 0/1 | Heating power (off/on) | bit |
0:other | 0 | ? | bit |
1:7 | 0/1 | Operating mode gas? | bit |
1:0 | 0 | Operating mode? | bit |
1:other | 0 | Operating mode? | bit |
2:7 | 0/1 | DHW tank power (off/on) | bit |
2:6 | 0/1 | Additional zone (off/on) | bit |
2:5 | 0/1 | Main zone (off/on) | bit |
2:4 | 0/1 | ? | bit |
2:3 | 0 | ? | bit |
2:2 | 0 | ? | bit |
2:1 | 0/1 | cooling (off/on) | bit |
2:0 | 0/1 | heating (off/on) | bit |
3:4 | 0/1 | DHW boost (off/on) | bit |
3:0 | 0/1 | DHW (off/on) | bit |
3:others | 0 | ? | bit |
4 | 3C | DHW target temperature | u8 / f8.8? |
5 | 00 | +fractional part? | |
6 | 0F | ? | u8 / flag8? |
7 | 00 | ? | |
8 | 14 | Target room temperature | u8 / f8.8? |
9 | 00 | ? | |
10 | 1A | ? | |
11:2 | 0/1 | Quiet mode (off/on) | bit |
11:1 | 0/1 | ?? (end of disinfection) | bit |
11:0 | 0/1 | Disinfection mode (off/on) | bit |
11 | 0 | ? | bit |
12 | 00 | Error code part 1 | u8 |
13 | 00 | Error code part 2 | u8 |
14 | 00 | Error subcode | u8 |
15-17 | 00 | ? | |
17:1 | 0/1 | Defrost operation | bit |
18:3 | 0/1 | Circ.pump (off/on) | bit |
18:1 | 0/1 | Backup Heater step 1 DHW (off/on) | bit |
18:0 | 0/1 | Compressor (off/on) | bit |
18:other | 0 | ? | bit |
19:2 | 0/1 | DHW mode | bit |
19:1 | 0/1 | gasboiler active1 (off/on) | bit |
19:other | 0 | ? | bit |
Error codes: tbd, HJ-11 is coded as 024D2C, 89-2 is coded as 08B908, 89-3 is coded as 08B90C.
Header: 000011
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | XX YY | Actual room temperature | f8.8 |
2 | 00 | ? | |
3 | 00 | ? | |
4 | 00 | ? | |
5 | 00 | ? | |
6 | 00 | ? | |
7 | 00 | ? |
Header: 400011
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | XX YY | LWT temperature | f8.8 |
2-3 | XX YY | DHW temperature tank (if present) | f8.8 |
4-5 | XX YY | Outside temperature (raw; in 0.5 degree resolution) | f8.8 |
6-7 | XX YY | RWT | f8.8 |
8-9 | XX YY | Mid-way temperature heat pump - gas boiler | f8.8 |
10-11 | XX YY | Refrigerant temperature | f8.8 |
12-13 | XX YY | Actual room temperature | f8.8 |
14-15 | XX YY | External outside temperature sensor (if connected); otherwise Outside temperature 2 derived from external unit sensor, but stabilized; does not change during defrosts; perhaps averaged over time | f8.8 |
16-19 | 00 | ? |
Header: 000012
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0:1 | 0/1 | pulse at start each new hour | bit |
0:other | 0 | ? | bit |
1 | 00-06 | day of week (0=Monday, 6=Sunday) | u8 |
2 | 00-17 | time - hours | u8 |
3 | 00-3B | time - minutes | u8 |
4 | 13-16 | date - year (16 = 2022) | u8 |
5 | 01-0C | date - month | u8 |
6 | 01-1F | date - day of month | u8 |
7-11 | 00 | ? | |
12:6 | 0/1 | restart process indicator ? | bit |
12:5 | 0/1 | restart process indicator ? | bit |
12:0 | 0/1 | restart process indicator ? | bit |
12:other | 0 | ? | bit |
13:2 | 0/1 | once 0, then 1 | bit |
13:other | 0 | ? | bit |
14 | 00 | ? |
Byte 12 has following pattern upon restart: 1x 00; 1x 01; then 41. A single value of 61 triggers an immediate heat pump restart.
Header: 400012
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0 | 40 | ? | |
1 | 40 | ? | |
2-9 | 00 | ? | |
10:4 | 0/1 | kWh preference input | bit |
10:other | 0 | bit | |
11 | 00/7F | once 00, then 7F | u8 |
12 | operating mode | flag8 | |
12:7 | 0/1 | DHW active2 | bit |
12:6 | 0/1 | gas? (depends on DHW on/off and heating on/off) | bit |
12:0 | 0/1 | heat pump? | bit |
12:other | 0 | ? | bit |
13:2 | 1 | ? | bit |
13:other | 0 | ? | bit |
14-19 | 00 | ? |
Header: 000013
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | 00 | ? | |
2:4 | 0/1 | ? | bit |
2:5,3-0 | 0 | ? | bit |
2:7-6 | 00/01/10/11 | modus ABS / WD / ABS+prog / WD+dev | bit2 |
Header: 400013
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0 | 3C | DHW target temperature (one packet delayed/from/via boiler?/ 0 in first packet after restart) | u8 / f8.8 ? |
1 | 00 | +fractional part? | |
2 | 01 | ? | |
3 | 40/D0 | ? | |
3:5-0 | 0 | ? | bit |
3:7-6 | 00/01/10/11 | modus ABS / WD / ABS+prog / WD+dev | bit2 |
4-7 | 00 | ? | |
8-9 | **FFFC/FFFD/**0000-010E | flow (in 0.1 l/min) (EHV/EHYHB only. Zero on EJHA) | s16div10 (negative if pump stops, probably bad calibration) |
10-11 | xxxx | software version inner unit | u16 |
12-13 | xxxx | software version outer unit | u16 |
EHV only: 14 | 00 | ? | u8 |
EHV only: 15 | 00 | ? | u8 |
The DHW target temperature is one packet delayed - perhaps this is due to communication with the Intergas gas boiler and confirms the actual gas boiler setting?
Header: 000014
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | 27 00 | LWT setpoint Heating Main zone | f8.8 or f8/8? |
2-3 | 12 00 | LWT setpoint Cooling Main zone | f8.8 or f8/8? |
4-5 | 27 00 | LWT setpoint Heating Add zone | f8.8 or f8/8? |
6-7 | 12 00 | LWT setpoint Cooling Add zone | f8.8 or f8/8? |
8 | 00-0A,10-1A | LWT deviation Heating Main zone | s-abs4 |
9 | 00-0A,10-1A | LWT deviation Cooling Main zone | s-abs4 |
10 | 00-0A,10-1A | LWT deviation Heating Add zone | s-abs4 |
11 | 00-0A,10-1A | LWT deviation Cooling Add zone | s-abs4 |
12 | 00/37 | first package 37 instead of 00 | u8 |
13-14 | 00 | ? |
Header: 400014
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0-14 | XX | echo of 000014-{00-14} | |
15-16 | 1C-24 00-09 | Target LWT Main zone in 0.1 degree (based on outside temperature in 0.5 degree resolution) | f8/8? |
17-18 | 1C-24 00-09 | Target LWT Add zone in 0.1 degree (based on outside temperature in 0.5 degree resolution) | f8/8? |
Header: 000015
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | ? | |
1-2 | 01/09/0A/0B 54/F4/C4/D6/F0 | schedule-induced operating mode? | flag8,flag8? |
3 | 00 | ? | |
4 | 03 | ? | |
5 | 20/52 | ? |
Header: 400015
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | 00 | Refrigerant temperature? | f8.8? |
2-3 | FD-FF,00-08 00/80 | Refrigerant temperature (in 0.5C) | f8.8 |
4-5 | 00 | Refrigerant temperature? | f8.8? |
EHV only: 6 | 00-19 | parameter number | u8/u16 |
EHV only: 7 | 00 | (part of parameter or value?) | |
EHV only: 8 | XX | ? | s16div10_LE? |
EHV is the only model for which we have seen use of the <parameter,value> mechanism in the basic packet types. The following parameters have been observed in this packet type on EHV model only:
Parameter number | Parameter Value | Description |
---|---|---|
EHV: 05 | 96 | 15.0 degree? |
EHV: 08 | 73,78,7D | 11.5, 12.0, 12.5 ? |
EHV: 0A | C3,C8 | 19.5, 20.0 |
EHV: 0C | 6E,73,78 | 11.0, 11.5, 12.0 |
EHV: 0E | B9,BE | 18.5, 19.0 |
EHV: 0F | 68,6B | 10.4, 10.7 |
EHV: 10 | 05 | 0.5 |
EHV: 19 | 01 | 0.1 |
EHV: others | 00 | ? |
These parameters are likely s16div10.
Only observed on EHV* and EJHA* heat pumps.
Header: 000016
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0-1 | 00 | ? | |
2-3 | 32 14 | room temperature? | f8.8? |
4-15 | 00 | ? |
Header: 400016
Byte(:bit) | Hex value observed | Description | Data type |
---|---|---|---|
0 | Current in 0.1 A | u8div10 | |
1 | Power input in 0.1 kW | u8div10 | |
0-7 | 00 | ? | |
6 | Heating/cooling output in 0.1 kW | u8div10 | |
7 | DHW output in 0.1 kW | u8div10 | |
8 | E6 | ? |
Used for name of product?
Header: 0000A1
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | ? | |
1-15 | 30 | ASCII '0' | c8 |
16-17 | 00 | ASCII '\0' | c8 |
Header: 4000A1
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | ? | |
1-15 | 00 | ASCII '\0' (missing) name outside unit | c8 |
16-17 | 00 | ASCII '\0' | c8 |
Product name.
Header: 0000B1
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | ? | |
1-15 | 30 | ASCII '0' | c8 |
16-17 | 00 | ASCII '\0' | c8 |
Header: 4000B1
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | ? | |
1-12 | XX | ASCII "EHYHBH08AAV3" name inside unit | c8 |
13-17 | 00 | ASCII '\0' | c8 |
Counters for energy consumed and operating hours. The main controller specifies which data type it would like to receive. The heat pump responds with the requested data type counters. A B8 package is only transmitted by the main controller after a manual menu request for these counters. P1P2Monitor can insert B8 requests to poll these counters, but this violates the rule that an auxiliary controller should not act as main controller. But if timed carefully, it works.
Header: 0000B8
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | XX | data type requested 00: energy consumed 01: energy produced 02: pump and compressor hours 03: backup heater hours 04: compressor starts 05: boiler hours and starts |
u8 |
Header: 4000B8
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 00 | data type 00 : energy consumed (kWh) | u8 |
1-3 | XX XX XX | by backup heater for heating | u24 |
4-6 | XX XX XX | by backup heater for DHW | u24 |
7-9 | 00 XX XX | by compressor for heating | u24 |
10-12 | XX XX XX | by compressor for cooling | u24 |
13-15 | XX XX XX | by compressor for DHW | u24 |
16-18 | XX XX XX | total | u24 |
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 01 | data type 01 : energy produced (kWh) | u8 |
1-3 | XX XX XX | for heating | u24 |
4-6 | XX XX XX | for cooling | u24 |
7-9 | XX XX XX | for DHW | u24 |
10-12 | XX XX XX | total | u24 |
On EJHA* all counters for type 01 are always zero.
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 02 | data type 02 : operating hours | u8 |
1-3 | XX XX XX | pump hours | u24 |
4-6 | XX XX XX | compressor for heating | u24 |
7-9 | XX XX XX | compressor for cooling | u24 |
10-12 | XX XX XX | compressor for DHW | u24 |
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 03 | data type 03 : operating hours | u8 |
1-3 | XX XX XX | backup heater1 for heating | u24 |
4-6 | XX XX XX | backup heater1 for DHW | u24 |
7-9 | XX XX XX | backup heater2 for heating | u24 |
10-12 | XX XX XX | backup heater2 for DHW | u24 |
13-15 | XX XX XX | ? | u24 |
17-18 | XX XX XX | ? | u24 |
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 04 | data type 04 | u8 |
1-3 | XX XX XX | ? | u24 |
4-6 | XX XX XX | ? | u24 |
7-9 | XX XX XX | ? | u24 |
10-12 | XX XX XX | number of compressor starts | u24 |
Byte nr | Hex value observed | Description | Data type |
---|---|---|---|
0 | 05 | data type 05 : gas boiler in hybrid model | u8 |
1-3 | XX XX XX | boiler operating hours for heating | u24 |
4-6 | XX XX XX | boiler operating hours for DHW | u24 |
7-9 | XX XX XX | gas usage for heating (unit tbd) | u24 |
10-12 | XX XX XX | gas usage for heating (unit tbd) | u24 |
13-15 | XX XX XX | number of boiler starts | u24 |
16-18 | XX XX XX | gas usage total (unit tbd) | u24 |
Internal gas metering seems only supported on newer models, not on the AAV3.