Daikin BRP WiFi (EMEA / APAC)
GEM controls Daikin residential split-system air conditioners sold outside North America via the local HTTP API exposed by the BRP-series WiFi adapters (BRP069A4x, BRP069B4x, BRP072A4x, BRP072C4x, BRP15, BRP16) and the built-in WiFi modules on newer units. Each indoor unit is one GEM device with one zone — mode, setpoint, fan speed, and swing direction are written atomically, and indoor / outdoor temperature plus humidity are polled.
This is not the right driver for North American Daikin One+ / Skyport thermostats — use the daikin_skyport driver for those. The two product lines speak entirely different protocols and are not interchangeable.
Prerequisites
- Indoor unit with a BRP-series WiFi adapter or built-in WiFi commissioned via the Daikin Mobile Controller / Daikin Online Controller app at least once.
- LAN-reachable IP for the adapter (DHCP reservation is strongly recommended — the adapter has no DDNS).
- (Optional) A registration UUID from the Daikin app if the firmware enforces it. Older firmware accepts unauthenticated requests; newer revisions require the UUID in an
X-Daikin-uuid header.
Setup
- Add a device with driver
daikin_brp.
- Set
ip to the adapter's LAN address.
- (Optional) Set
uuid if your unit's firmware requires registration. Generate it under the Daikin app's settings.
- Save and connect. The connect path hits
/common/basic_info and surfaces the unit name in the boot log.
- Add one zone. The zone
address is unused by the protocol but GEM macros reference zones by address, so pick something stable like unit or living_room.
- Run
get_status to confirm both control and sensor info are returning sensible values.
Attribute Reference
Device
| Name | Type | Required | Default | Notes |
|---|
ip | string | yes | — | Adapter IP. Surrounding spaces are ignored. |
port | int | no | 80 | HTTP port. Most BRP adapters do not support HTTPS. A blank or non-numeric value means the protocol's default (80, or 443 for https). |
uuid | string | no | — | X-Daikin-uuid header for firmware that requires registration. Encrypted at rest. |
status_interval | int | no | 30000 | Polling cadence (ms). A zero, negative or unparseable value means 30000. |
request_timeout | int | no | 10000 | Per-request timeout (ms), inherited from the HTTP transport. A zero, negative or unparseable value means 10000 rather than no timeout. |
Zone (state published by the driver)
| Attribute | Type | Source |
|---|
state | string | on / off from pow. |
mode | string | auto, cool, heat, dry, fan from mode. |
setpoint | real | Target temperature in °C from stemp. |
fan_speed | string | auto, silent, low, medium_low, medium, medium_high, high from f_rate. |
fan_direction | string | stop, vertical, horizontal, both from f_dir. |
indoor_temp | real | Indoor coil temperature in °C from /aircon/get_sensor_info htemp. |
outdoor_temp | real | Outdoor coil temperature in °C from otemp. Valid only when the outdoor unit is online. |
humidity | real | Indoor humidity from hhum (only on units with humidity sensors). |
Commands
| Command | Args | Description |
|---|
on / off | — | Toggle pow. |
set_temp | temp | Set the cooling/heating setpoint. Resolution is 0.5 °C. |
set_mode | mode | One of auto, cool, heat, dry, fan. Implicitly powers on. |
set_fan_speed | fan_speed | One of auto, silent, low, medium_low, medium, medium_high, high. |
set_fan_direction | fan_direction | One of stop, vertical, horizontal, both. |
set_state | pow, mode, temp, fan_speed, fan_direction | Atomic multi-field write. Unspecified or blank fields preserve current values. pow accepts on / 1 / true in any case; any other non-blank value powers off. |
get_status | — | Refresh control + sensor info and republish zone attributes. Answers an error (with both readings attached) when the control read fails. |
Known Limitations
/aircon/set_control_info is atomic: every parameter (pow, mode, stemp, shum, f_rate, f_dir) must be supplied on every write or the unit ignores the request. The driver merges new values onto the last control state it read — refreshed on every poll, and read fresh when nothing has been read yet. Polling cadence determines how stale that baseline can be: a change made at the remote or in the Daikin app inside the poll window can be undone by the next GEM write. Writes are sent one at a time, so commands issued together each build on the one before.
- When switching out of fan or dry mode, where the unit reports no numeric setpoint (
-- or M), the driver sends the setpoint and humidity the unit remembers for the new mode (dt<mode> / dh<mode> from the control reading) instead of echoing the placeholder. A numeric setpoint is always echoed unchanged. This behaviour has not been verified against hardware.
- Setpoint resolution is 0.5 °C. Heat-mode minimum and cool-mode maximum are unit-dependent (commonly 10 °C / 32 °C).
- Mode codes overlap (
0, 1, and 7 all surface as auto depending on firmware). The driver writes mode=1 for auto.
- The
shum (humidity setpoint) field is unit-dependent and ignored on most splits. The driver echoes the current value rather than forcing zero so it doesn't fight units that do honor it.
- Only one indoor unit per device — the protocol is not multi-zone. Sky Air / VRV cassette systems with multiple indoor heads need one GEM device per unit.
Troubleshooting
- Adapter unreachable — the driver keeps polling an adapter it cannot reach, including one that was down when GEM started, and doubles the wait after each failed poll up to five minutes (or
status_interval, if longer). It returns to the normal cadence as soon as a poll succeeds.
http 403 / http 404 errors — the adapter answered with an error page rather than a ret= reply. A 403 on newer firmware usually means the uuid attribute is missing or wrong.
- Connect timeouts — confirm the adapter responds to
curl http://<ip>/common/basic_info from the GEM host. The reply should be a comma-separated ret=OK,type=aircon,... string.
ret=PARAM NG on writes — the atomic write didn't include all fields, or one of the values is out of range. Read get_status first and compare to what you sent.
- All writes succeed but the unit doesn't react — newer firmware silently drops writes from un-registered clients. Set the
uuid attribute to the registered UUID from the Daikin app.
- Outdoor temperature always 0 or implausible —
otemp is only valid when the outdoor unit is online and has been running. Cold-start values may be stale for the first few minutes.