I have a MSZ-FH09NA minisplit head. The OEM remote supports a number of vane controls which are missing from esphome’s Mitsubishi IR transmitter module:
- Horizonal vane can be set to point left, center left, center, center right, right, or Swing.
- Two separate vertical vanes, one on the left and one on the right, can be independently controlled. As with other Mitsubishi units, each one can be set to auto, swing, or five different fixed positions.
- The “i-see” presence sensor can be set to blow air on the occupant, blow air away from the occupant, or ignore the occupant.
Presently, the only vane options in esphome are Swing and Auto. Both options cause hot air to be blown directly in my face. Additionally, esphome can only control the right vertical vane; it doesn’t set any of the necessary bits to control the left one. Ideally I would like to be able to choose fixed vane positions from HA.
I set up an IR sniffer, wrote a protocol decoder, and started mapping out the commands sent by the OEM remote. The hard part, I think, will be plumbing up the necessary APIs to get these vendor-specific functions. There was some previous discussion at Vane control for Climate integrations - #5 by akhand but it seemed inconclusive.
Some options might include:
- Make the Mitsubishi vane controls a “first class citizen” in the HA climate module, somehow agreeing on what format to use across manufacturers and designing something that everyone agrees is sufficiently future proof.
- Or, esphome can offer mappings to override default behavior. Maybe an optional, off-by-default setting that tells it to send left + right vane controls. Maybe an option that maps Swing or Auto to a fixed vane position.
- Or, esphome can offer a way to send arbitrary Mitsubishi-formatted commands. For instance, when I have to use an unsupported NEC protocol variant, I do:
button:
- platform: template
name: "tv-remote-on"
on_press:
- remote_transmitter.transmit_raw:
carrier_frequency: 38000
code: [4500, -4500, 560, -1690, 560, -1690, 560, -1690, 560, -560, 560, -560, 560, -560, 560, -560, 560, -560, 560, -1690, 560, -1690, 560, -1690, 560, -560, 560, -560, 560, -560, 560, -560, 560, -560, 560, -1690, 560, -560, 560, -560, 560, -1690, 560, -1690, 560, -560, 560, -560, 560, -1690, 560, -560, 560, -1690, 560, -1690, 560, -560, 560, -560, 560, -1690, 560, -1690, 560, -560, 560]
repeat:
times: 3
wait_time: 20ms
Maybe, if I want to send an arbitrary Mitsubishi command, I could ask the Mitsubishi IR transmitter module to do something like:
# Automatically fill in header and checksum for the raw command:
# 23 cb 26 01 00 20 48 08 40 40 62 00 00 00 91 00 00 f8
code: [ 0x20, 0x48, 0x08, 0x40, 0x40, 0x62, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00 ]
The missing commands I mapped out are:
Horizontal vane control:
swing horizontal vane:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 40 62 00 00 00 91 00 00 78
left:
HEX: 23 cb 26 01 00 20 48 08 10 40 62 00 00 00 91 00 00 c8
^^
center left:
HEX: 23 cb 26 01 00 20 48 08 20 40 62 00 00 00 91 00 00 d8
^^
center:
HEX: 23 cb 26 01 00 20 48 08 30 80 62 00 00 00 91 00 00 28
^^ ^^
center right:
HEX: 23 cb 26 01 00 20 48 08 40 40 62 00 00 00 91 00 00 f8
^^
right:
HEX: 23 cb 26 01 00 20 48 08 50 40 62 00 00 00 91 00 00 08
^^
i-See operation:
swing horizontal vane, i-see disabled:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 40 62 00 00 00 91 00 00 78
indirect mode:
HEX: 23 cb 26 01 00 20 48 08 00 40 62 00 00 00 91 02 00 ba
^^ ^^
direct mode:
HEX: 23 cb 26 01 00 20 48 08 00 40 62 00 00 00 91 03 00 bb
^^
Right vertical vane:
wide vane sweep, l/r vane auto, fan high:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 84 61 00 00 00 91 00 00 bb
change right vane to highest fixed position:
HEX: 23 cb 26 01 00 20 48 08 c0 4c 61 00 00 00 91 00 00 83
^^
1000 0100 -> 0100 1100
then lower:
HEX: 23 cb 26 01 00 20 48 08 c0 54 61 00 00 00 91 00 00 8b
^^
0100 1100 -> 0101 0100
HEX: 23 cb 26 01 00 20 48 08 c0 5c 61 00 00 00 91 00 00 93
^^
0100 0100 -> 0100 1100
HEX: 23 cb 26 01 00 20 48 08 c0 64 61 00 00 00 91 00 00 9b
^^
0100 1100 -> 0110 0100
HEX: 23 cb 26 01 00 20 48 08 c0 6c 61 00 00 00 91 00 00 a3
then swing:
HEX: 23 cb 26 01 00 20 48 08 c0 7c 61 00 00 00 91 00 00 b3
^^
back to auto:
HEX: 23 cb 26 01 00 20 48 08 c0 84 61 00 00 00 91 00 00 bb
Left vertical vane:
swing mode: both, fan high (from remote):
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 7c 60 00 00 00 91 00 38 ea
change left vane to Auto:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 bc 60 00 00 00 91 00 00 f2
^^ ^^
0111 -> 1011
change left vane to highest fixed position:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 7c 60 00 00 00 91 00 08 ba
^^ ^^
change left vane to next lower position:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 48 08 c0 7c 60 00 00 00 91 00 10 c2
^^
then as it goes lower, substitute 18, 20, 28
then left vane swing:
HEX: 23 cb 26 01 00 20 48 08 c0 7c 60 00 00 00 91 00 38 ea
^^
One other data point:
I have another head without the fancy vanes (MSZ-GS12NA). Using the OEM GS remote with the FH, I see similar issues to using esphome. i.e. it only controls the rightmost vane. The GS remote is missing the L/R vane controls, horizontal vane control, and i-See control.
I had originally suspected that Mitsubishi built some sort of backward compatibility into their remotes, such that a less-capable remote would “do the right thing” on an FH unit and control both vertical vanes. The GS and FH remotes set some different bits in bytes 0x0e and 0x06. But this doesn’t seem to be used for compatibility, hinting that we will probably need the user to explicitly tell esphome which features to use on their head.
The GS commands looked like:
vane auto:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 08 00 30 80 74 00 00 00 81 00 00 e2
1,2,3,4,5:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
HEX: 23 cb 26 01 00 20 08 00 30 48 74 00 00 00 81 00 00 aa
^^
HEX: 23 cb 26 01 00 20 08 00 30 50 74 00 00 00 81 00 00 b2
HEX: 23 cb 26 01 00 20 08 00 30 58 74 00 00 00 81 00 00 ba
HEX: 23 cb 26 01 00 20 08 00 30 60 74 00 00 00 81 00 00 c2
HEX: 23 cb 26 01 00 20 08 00 30 68 74 00 00 00 81 00 00 ca
swing:
HEX: 23 cb 26 01 00 20 08 00 30 78 74 00 00 00 81 00 00 da
BTW, the (not quite complete but good enough) reference I used for initially understanding the protocol was Reverse engineering the Mitsubishi AC Infrared protocol
I also found HVAC-IR-Control/python/hvac_ircontrol/mitsubishi.py at 4b6b7944b28ce78247f19744c272a36935bbb305 · r45635/HVAC-IR-Control · GitHub which agrees with my findings on the horizontal vane control, but disagrees on other controls like i-see. Possibly there are several subtly different versions of the protocol.
