Much of the work in figuring these messages out was done by Thaniel over at BimmerForums, I just filled in the blanks and documented them in a way that makes sense to my project. There’s probably correct terminology for these messages however my interest is not in the context of the vehicle as a whole, I’m only interested in controlling the cluster itself.

CAN Bus

0x316 – RPM
{ 0x05, 0x62, 0xFF, RPM, 0x65, 0x12, 0x00, 0x62 }
RPM = 25 per 1000 RPM

0x545 – Various warning LEDs
{ L1, 0x00, 0x00, L2, 0xAB, 0x00, 0x00, 0x00 }
L1 = Bits [ ?, ?, ?, EML, Cruise Control, ?, Check Engine, ? ]
L2 = Bits [ ?, ?, ?, ?, Overheat, ?, Oil Level, ? ]

0x329 – Coolant Temperature
{ 0x00, CT, 0x8C, 0x08, 0x00, 0xFE, 0x00, 0x00 }
CT = Coolant Temperature, I haven’t got a mapping for this yet, however 0xAB appears to put the needle half way

0x153 – Unknown
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
I’m not sure what else this controls however sending all zeros turns off the traction control LED and the red (!) LED allowing external control of the parking brake light.

K Bus

K Bus messages take the format of: <SRC> <LEN> <DEST> <~DATA~> <CHK>. The Checksum is a XOR of all previous bytes and the length does not include the first two bytes.

Cluster Lights
{ 0xD0, 0x08, 0xBF, 0x5B, L1, 0x00, 0x00, L2, 0x00, CHK}
L1 = Bits [ Double Rate, Right Indicator, Left Indicator, Rear Fogs, Front Fogs, Full Beam, ?, ? ]
L2 = Bits [ Car Image,  ?, L Sidelight, R Sidelight, Rr L Sidelight, Rr R Sidelight, ?, ? ]

Door Status
{ 0x00, 0x05, 0xBF, 0x7A, D1, D2, CHK }
D1 = Bits [ ?, ?, ?, ?, RrL, RrR, FrL, FrR ]
D2 = Bits [ ?, ?, Boot, ?, ?, ?, ?, ? ]