We are currently reverse-engineering our HAC systems (Heating+Air-Conditioning but no Ventilations. Mitsubishi Heavy Industries FDTCA.) one-wire bus protocol since our HAC units do not heat correctly anymore. We assume faulty control-units and temp-sensors. Our distributor and installer can not provide new control-units and we have not found any aftermarket solutions that support the FDTCA.
Things we have learned so far:
- 12V Bus
- One-Wire Multi-Drop
- Master-Slave-Slave
- Periodic communication: Control panel sends x bits, outdoor-unit sends x bits, indoor-unit sends x bits
- Does not seem to be a ping-pong communication but rather just a dump of values by every unit, initiated by the dump of the control panel (master)
- Seems to communicate at somewhere between 1000baud and 1500baud.
- Driven with an LM2904
- The CPU of the control panel seems to be a proprietary NEC processor (NEC 606 0720KP010)
This is a screenshot of one interval of the communication. The first packet is send by the control panel, the second and third either by the indoor- or the outdoor-unit. If we disconnect the bus from the control panel, it deliberately sends data and increases the interval of its dump seemingly because it does not receive a dump from the other units.
(Data of this trace available as 60M CSV.)
We already tried some default UART configurations (i.E. 9600baud, 8N1, 9N1, etc) but had no luck decoding the data. We are a bit clueless on how we should proceed reverse-engineering the encoding. One non-educated guess was that it could be something like an ISO 9141 inspired encoding.
We do not need any help in decoding the "payload", but rather make sense of the actual encoding on the wire. Any hints or info about protocols/encodings that match the 12V, 1-Wire and 9 to 11kbaud spec would be much appreciated.
Update: I hooked up our last spare panel in one of our working HAC system for an Master-Panel, Slave-Panel, Outdoor-Unit, Indoor-Unit system. Now there are 5 frames on the bus. Then I observed the frames behind the op-amp where TX and RX are two separate wires on the Slave-Panel. This panel sends the second frame on the bus. Its payload is very similar with the first frame and only differs by its last 2 bytes and the 2nd one. The last 2 bytes seem to be some kind of checksum, the first two byte seem to be some kind of device-id or addressing. The slave panel alters its payload to be identical to the payload of the first frame. As soon as the first frame changes, the 2nd frame (the one send by the slave) mirrors the changes.
Next I quickly hacked together a decoder (1 = low, 0 = high) which decodes the data on the bus to a simple binary representation. The following code-block is a dump of 3 rounds of 5 frames:
B: 11011001 10010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101010
B: 11011001 01010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101100
B: 11011111 10010000 11100011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00100110
B: 11011111 01010110 11100011 10100101 01011100 10101110 00101111 11111000 00010101 10101011 11111111 01111110 00001111 00000001 00000000 10100000 00010110 11111010 10111111 10010000 00001010 01000101
B: 10011011 10010000 00100011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101011 10000001 00010000 00100000 00010100 01011000
B: 11011001 10010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101010
B: 11011001 01010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101100
B: 11011111 10010000 11100011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00100110
B: 11011111 01010110 11100011 10100101 01011100 10101110 00101101 11111000 00110101 10101011 11111111 01111110 00001111 00000001 00000000 10100000 00010110 11111010 10111111 10010000 00001010 01000101
B: 11101011 11010000 11100011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101011 10000001 00010000 00100000 00010111 10100100
B: 11011001 10010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101010
B: 11011001 01010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00101100
B: 11011111 10010000 11100011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101000 00000101 00000000 10100000 00010111 00100110
B: 11011111 01010110 11100011 10100101 01011100 10101110 00111111 11111000 00010101 10101011 11111111 01111110 00001111 00000001 00000000 10100000 00010110 11111010 10111111 10010000 00001010 01000101
B: 11101011 11010000 01101011 10100101 01011100 10101110 00101101 10110000 00100000 00010100 00000010 11111000 01010000 00001010 00000111 01000000 00101011 10000001 00010000 00100000 00010111 10000110
I ruled out any "start-bit" or "stop-bits": There are no repeating patterns in 1's or 0's. Only the first bit of a frame seems to be a stable 1.
I observed byte 6 and 7 to be related to the temperature, byte 8 and 9 to the fanspeed and byte 5 for the louver (one bit for automatic, 2 additional bits for the manual mode).
The bits are shown exactly like they are ordered on the bus. I mapped out all selectable temperatures (16-30°C) in a table:
°C Byte 6 Byte 7
16 10101110 11101101
17 10101100 11101001
18 10101111 01101101
19 10101101 01101001
20 10101110 01101001
21 10101100 01101101
22 10101111 10101101
23 10101101 10101001
24 10101110 10101001
25 10101100 10101101
26 10101111 00101001
27 10101101 00101101
28 10101110 00101101
29 10101100 00101001
30 10101111 11001101
But I had no luck in parsing them to something that makes sense. Only the last two bits of byte 6 and the 6 first bits of byte 7 seem to be related to the temperature, but regardless on how I join them together and read them as LSB or MSB, they result in no meaningful numbers. Only the louver-bits seem to have a meaningful pattern.
Technically I could do some "replay-attacks" on the bus as a slave to control the devices, but for this I would have to figure out the checksum in the last two bytes.
start: edit by virolino
I hacked the temperatures table a little bit. I removed the non-changing bits, and grouped the temperatures, and I extended the table according to the pattern I noticed.
°C 1 2 3 4
00 10 11 01 11
01 00 11 01 10
02 11 01 01 11
03 01 01 01 10
04 10 01 01 10
05 00 01 01 11
06 11 10 01 11
07 01 10 01 10
08 10 10 01 10
09 00 10 01 11
10 11 00 01 10
11 01 00 01 11
12 10 00 01 11
13 00 00 01 10
14 11 11 10 10
15 01 11 10 11
16 10 11 10 11
17 00 11 10 10
18 11 01 10 11
19 01 01 10 10
20 10 01 10 10
21 00 01 10 11
22 11 10 10 11
23 01 10 10 10
24 10 10 10 10
25 00 10 10 11
26 11 00 10 10
27 01 00 10 11
28 10 00 10 11
29 00 00 10 10
30 11 11 00 11
31 01 11 00 10
32 10 11 00 10
33 00 11 00 11
Sequence 11 01 10 00 seems to be the key. It changes for every temperature on column 1, it is constant for 4 temperatures on column 2 and is constant for 16 temperatures on column 3. There are 2 endings on column 4: 11 10 10 11 (twice) and 10 11 11 10 (twice) and then it repeats. Except that for temperature 30, column 4 breaks the rule :(
Another rule break: col. 3 of temperature 30 is 00 instead of 11 :(
So it seems that col. 3 is a kind of MSB, col 2 is a mid-SB and col. 1 is a LSB.