Control split-system heat pumps and air conditioners via IR blaster from Home Assistant. Protocols ported from the arduino-heatpumpir library.
| Brand | Models |
|---|---|
| AUX | AUX |
| Airway | AIRWAY |
| Ballu | Ballu |
| BGH | AUD |
| Carrier | NQV, MCA |
| Daikin | ARC433B50, ARC417, ARC480 |
| Electrolux | YAL |
| Fuego | Fuego |
| Fujitsu | AWYZ (AR-PZ2) |
| Gree | Generic, YAN, YAA, YAC, YT |
| Hisense | AUD |
| Hitachi | — |
| Hyundai | — |
| IVT | AY-XP12FR-N |
| Midea | Ultimate Pro Plus |
| Mitsubishi Electric | FD, FE, MSY, FA, KJ, MSC, SEZ |
| Mitsubishi Heavy | ZJ, ZEA, ZM, FDTC |
| Nibe | — |
| Olimpia Splendid | Maestro |
| Panasonic | DKE, EKE, JKE, NKE, LKE, CKP |
| Philco | PHS32 |
| Samsung | AQV, FJM |
| Sharp | AY-ZP40KR |
| Toshiba | Standard, Daiseikai |
- Home Assistant 2024.1 or later
- The
infraredintegration enabled in Home Assistant (provides the IR blaster entity) - An IR blaster device supported by HA (e.g. Broadlink RM, ESPHome with IR transmitter)
- In HACS, go to Integrations → click the three-dot menu → Custom repositories
- Add
https://github.com/feiming/homeassistant-heatpumpand select category Integration - Click Download on the Heatpump Infrared card
- Restart Home Assistant
- Copy the
custom_components/heatpump_infrareddirectory into your HA config folder:
<config>/
└── custom_components/
└── heatpump_infrared/
├── __init__.py
├── climate.py
├── config_flow.py
├── const.py
├── manifest.json
├── strings.json
├── translations/
├── brand/
└── ir/
- Restart Home Assistant.
- Go to Settings → Devices & Services → Add Integration
- Search for Heatpump Infrared
- Select your heat pump brand and model from the dropdown
- Select the IR blaster entity that will send the commands
- Click Submit — a climate entity appears immediately
IR blasters are one-way — there's no confirmation the unit actually received or acted on a command. To get some visual feedback, you can point the climate entity at an external temperature sensor near the unit:
- Go to Settings → Devices & Services, find the Heatpump Infrared entry, and click Configure
- Select a temperature sensor entity (e.g. from a smart plug, thermostat, or standalone sensor)
- Its reading is shown as the climate entity's current temperature, so you can watch the room respond after sending a command
With a sensor configured, the entity also derives an hvac_action (heating/cooling/idle) by comparing that reading to the target temperature — this is a heuristic, not a real measurement, but it drives the thermostat card's active/idle indicator. Without a sensor, hvac_action is left unset.
Leave the field blank to disable this (the default).
By default the sensor is display-only: the unit still regulates the room against its own internal sensor, which is often in a bad spot (behind the unit, up near the ceiling), so the room never quite lands on your target. With a feedback sensor configured you can pick a Control strategy in the same Configure dialog to close the loop against the sensor you actually care about:
| Strategy | Behaviour |
|---|---|
| Display only (default) | Never overrides the unit. |
| Offset compensation | Keeps the unit running but gradually biases the setpoint it's given. If the room stays short of your target, the integration nudges the setpoint by 1 °C every adjustment interval (up to max offset) so the unit works harder; when the room overshoots, it winds the bias back. Best for everyday use — smooth, no on/off cycling. |
| Switch the unit off | When the sensor passes the target, sends a power-off command; when the room drifts back past the deadband, powers it on again on the same mode. |
| Change the setpoint | When the sensor passes the target, parks the unit's setpoint at its minimum (heating) or maximum (cooling); restores the real setpoint when the room drifts back. In heat_cool mode this falls back to power-off, since a single setpoint has no "off" direction. |
Settings:
- Deadband (default 0.5 °C) — how far past the target the room must move before the integration reacts. For the stop/setpoint strategies this is the hysteresis that prevents short-cycling.
- Max offset (default 3 °C) — the largest bias Offset compensation will apply, in either direction.
- Adjustment interval (default 10 min) — how long Offset compensation waits between nudges, so the room has time to respond. The learned bias is shown as the
control_offsetattribute and survives restarts.
An outdoor temperature sensor does not help here — the gap being corrected is between the room and the unit's internal sensor, which outdoor temperature tells you nothing about.
The integration creates a standard climate entity. Use it from the UI, automations, or scripts exactly like any other climate entity:
service: climate.set_temperature
target:
entity_id: climate.living_room_heatpump
data:
temperature: 22
hvac_mode: heatSupported HVAC modes depend on the model but generally include: off, heat, cool, dry, fan_only.
Commands have no effect
- Confirm the IR blaster entity is working (test it from Developer Tools → Services with
remote.send_command) - Point the blaster directly at the unit's IR receiver
- Make sure you selected the correct model — some brands have multiple protocol variants (e.g. Daikin ARC433 vs ARC417 vs ARC480)
My model is not listed
- Open an issue with the brand/model name and, if possible, a link to the remote control part number
- The protocols are ported from arduino-heatpumpir; if your model is there but missing here, PRs are welcome
# Install test dependencies
pip install -r requirements-test.txt
# Run the test suite (no Home Assistant install required)
pytestTests cover all 47 models: correct command generation, timing alternation, 38 kHz modulation, and protocol-specific frame structure.
IR protocols ported from ToniA/arduino-heatpumpir (GPL-2.0).
GPL-2.0, inherited from the upstream arduino-heatpumpir project. See LICENSE.