Home Automation blog

Skip to Content

Daikin Airbase BRP15B61 in NodeRed

Posted by Chris

Date posted:

I recently bought the Daikin Airbase BRP15B61 slave unit to allow wireless control of my Daikin ducted reverse cycle air conditioning unit. You're supposed to use their offical iOS/Android Airbase app to interface with the wireless controller, but I wanted control via homeKit/Home app. Luckily the airbase has an exposed HTTP API server that can be interfaced with via NodeRed.

Diagram of Daikin Airbase BRP15B61 and Daikin BRC1E61

I found some information about the api and how people are using it other ways. The API is pretty limited and not all features/values are compatible with every unit.

API endpoints

Using the HTTP request node, create GET requests using the IP address of your Airbase. Ticking "Append msg.payload as query string parameters".

Eg: http://xxx.xxx.xxx.xxx/skyfi/aircon/get_sensor_info

/skyfi/aircon/get_sensor_info

Fetch temperature sensor values

Variable Returned values Description
htemp -, 0-9 Air temperature of unit located within ceiling. My master controller displays the inside house temperature but this appears not to be accessible via the API.
otemp -, 0-9 Outside temperature. I don't receive a temperature value for this, just the dash symbol.

/skyfi/aircon/get_control_info

Fetch power, mode and other status values

Variable Returned values Description
stemp -, 0-9 Current set temperature in °C
pow 0, 1 Power status
0: off
1: on
mode 0-9 Operation mode status
0: fan
1: heat
2: cool
6: dry
f_rate 0-9 Fan speed status
3: low
4: medium
5: high
f_dir 0-9 Vent direction status0: all wings stopped
1: vertical wings motion
2: horizontal wings motion
3: vertical and horizontal wings motion

/skyfi/aircon/set_control_info

Set power, mode, fan speed, etc. These must be passed in as params as part of the URL.

Required variable Accepted values Description

pow

0, 1

Set power
0: off
1: on

mode

0-9

Set operation mode
0: fan
1: heat
2: cool
6: dry

stemp 0-9 Set desired temperature in °C
f_rate 0-9 Set fan speed

3: low
4: medium
5: high

f_dir 0-9

Set vent direction
0: all wings stopped
1: vertical wings motion
2: horizontal wings motion
3: vertical and horizontal wings motion

The above variables are the minimum required variables for a successful request. This requires you to store and retrieve each of the above so that if you only want to adjust a single variable, you don't override an unwanted change.

NodeRed flow of air conditioner

Headers function

msg.headers = {};
msg.headers['Host'] = 'xxx.xxx.xxx.xxx'; // IP address of your Airbase
msg.payload = "";
return msg;

Set manual function

Fetches and updates cache with incoming value. Then passses all required values to API

// Fetch cache
let aircon = global.get('aircon') || {};

// Override cache with incoming value
let power = msg.payload.hasOwnProperty('power')? msg.payload.power : aircon['power'];
let mode = msg.payload.hasOwnProperty('mode')? msg.payload.mode : aircon['mode'];
let temp = msg.payload.hasOwnProperty('target_temp')? msg.payload.target_temp : aircon['target_temp'];
let direction = msg.payload.hasOwnProperty('direction')? msg.payload.direction : aircon['direction'];
let fan = msg.payload.hasOwnProperty('fan')? msg.payload.fan : aircon['fan'];


// Update cache
aircon['power'] = power;
aircon['mode'] = mode;
aircon['target_temp'] = temp;
aircon['direction'] = direction;
aircon['fan'] = fan;

global.set('aircon', aircon);


// Render status
let modes = {
    0: 'Fan',
    1: 'Heat',
    2: 'Cool',
    6: 'Dry',
}

let colour = 'grey';
if (power && mode == 1)
{
    colour = 'red';
}
else if (power && mode == 2)
{
    colour = 'blue';
}

let desc = temp + '℃';
desc += ', ' + modes[mode];
desc += fan == 5 ? ', High fan' : ', Low fan';

node.status({fill: colour, shape:"dot", text: desc});


// Send vars to aircon
msg.payload = {
    "pow": power,
    "mode": mode,
    "stemp": temp,
    "f_rate": fan,
    "f_dir": direction
};

msg.headers = {};
msg.headers['Host'] = 'xxx.xxx.xxx.xxx'; // IP address of your Airbase
return msg;

Format output function

// Scrape raw values
let temp = String(msg.payload).match(/stemp=([0-9]+)/);
temp = parseInt(temp[1]);

let power = String(msg.payload).match(/pow=([0-9]+)/);
power = parseInt(power[1]);

let mode = String(msg.payload).match(/mode=([0-9]+)/);
mode = parseInt(mode[1]);

let fan = String(msg.payload).match(/f_rate=([A-Z0-9]+)/);
fan = parseInt(fan[1]);

let f_dir = String(msg.payload).match(/f_dir=([0-9]+)/);
f_dir = parseInt(f_dir[1]);


// Update cache
let aircon = global.get('aircon') || {};

aircon['target_temp'] = temp;
aircon['mode'] = mode;
aircon['power'] = power;
aircon['fan'] = fan;
aircon['direction'] = f_dir;

global.set('aircon', aircon);


// Render status
let modes = {
    0: 'Fan',
    1: 'Heat',
    2: 'Cool',
    6: 'Dry',
}

let colour = 'grey';
if (power && mode == 1)
{
    colour = 'red';
}
else if (power && mode == 2)
{
    colour = 'blue';
}

let desc = temp + '℃';
desc += ', ' + modes[mode];
desc += fan == 5 ? ', High fan' : ', Low fan';

node.status({fill: colour, shape: "dot", text: desc});


msg.payload = aircon;
return msg;

Power On - Inject node (JSON)

{"power": 1}

View similar posts categorised as: Node RED HomeKit