UNPKG

homebridge-fujitsu-airstage

Version:

A Homebridge plugin to control devices that use the Fujitsu Airstage API.

2,373 lines 95.6 kB
'use strict';

const assert = require('node:assert');
const { mock, test } = require('node:test');
const airstage = require('./../../../src/airstage');

const clientWithCelsius = new airstage.lan.Client(
    [
        {
            hostname: '1.2.3.4',
            macAddress: '39:FF:BB:9D:6E:BA',
            displayName: 'Air Conditioner'
        },
        {
            hostname: '2.3.4.5',
            macAddress: '96:65:8F:1B:F6:01',
            displayName: 'Heat Pump'
        }
    ],
    'C'
);
const clientWithFahrenheit = new airstage.lan.Client(
    [
        {
            hostname: '1.2.3.4',
            macAddress: '39:FF:BB:9D:6E:BA',
            displayName: 'Air Conditioner'
        },
        {
            hostname: '2.3.4.5',
            macAddress: '96:65:8F:1B:F6:01',
            displayName: 'Heat Pump'
        }
    ],
    'F'
);
const clientWithInvalidTemperatureScale = new airstage.lan.Client(
    [
        {
            hostname: '1.2.3.4',
            macAddress: '39:FF:BB:9D:6E:BA',
            displayName: 'Air Conditioner'
        },
        {
            hostname: '2.3.4.5',
            macAddress: '96:65:8F:1B:F6:01',
            displayName: 'Heat Pump'
        }
    ],
    'K'
);

test('airstage.lan.Client#getTemperatureScale with success', (context, done) => {
    clientWithFahrenheit.getTemperatureScale((error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'F');

        done();
    });
});

test('airstage.cloud.Client#getTemperatureScale with error', (context, done) => {
    const expectedError = 'Invalid temperature scale: K';

    clientWithInvalidTemperatureScale.getTemperatureScale((error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setTemperatureScale with success', (context, done) => {
    clientWithFahrenheit.setTemperatureScale('F', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'F');

        done();
    });
});

test('airstage.cloud.Client#setTemperatureScale with error', (context, done) => {
    const expectedError = 'Invalid temperature scale: K';

    clientWithInvalidTemperatureScale.setTemperatureScale('K', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getName with success', (context, done) => {
    clientWithFahrenheit.getName('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'Air Conditioner');

        done();
    });
});

test('airstage.lan.Client#getName with error', (context, done) => {
    const expectedError = 'Could not determine name for device ID: ASDF';

    clientWithFahrenheit.getName('ASDF', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getModel calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_model': 'AZ123'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getModel('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'AZ123');

        done();
    });
});

test('airstage.lan.Client#getModel calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getModel('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getPowerState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_onoff': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getPowerState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getPowerState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getPowerState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setPowerState calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_onoff': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_onoff'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setPowerState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#setPowerState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_onoff'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setPowerState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getOperationMode calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_op_mode': '0'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getOperationMode('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'AUTO');

        done();
    });
});

test('airstage.lan.Client#getOperationMode calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getOperationMode('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setOperationMode with "COOL" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_op_mode': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_op_mode'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setOperationMode('39FFBB9D6EBA', 'COOL', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'COOL');

        done();
    });
});

test('airstage.lan.Client#setOperationMode with "DRY" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_op_mode': '2'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_op_mode'], '2');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setOperationMode('39FFBB9D6EBA', 'DRY', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'DRY');

        clientWithFahrenheit.getDevice('39FFBB9D6EBA', (error, result) => {
            assert.strictEqual(error, null);
            assert.strictEqual(Object.keys(result.parameters).length, 2);
            assert.strictEqual(result.parameters['iu_fan_spd'], '0');
            assert.strictEqual(result.parameters['iu_op_mode'], '2');

            done();
        });
    });
});

test('airstage.lan.Client#setOperationMode calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_op_mode'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setOperationMode('39FFBB9D6EBA', 'COOL', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getIndoorTemperature calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_indoor_tmp': '7200'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getIndoorTemperature('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 72);

        done();
    });
});

test('airstage.lan.Client#getIndoorTemperature calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getIndoorTemperature('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getTargetTemperature calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_set_tmp': '220'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getTargetTemperature('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 72);

        done();
    });
});

test('airstage.lan.Client#getTargetTemperature calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getTargetTemperature('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setTargetTemperature with "F" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_set_tmp': '220'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_set_tmp'], '220');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setTargetTemperature('39FFBB9D6EBA', 72, 'F', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 72);

        done();
    });
});

test('airstage.lan.Client#setTargetTemperature with "C" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_set_tmp': '220'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithCelsius._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithCelsius._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_set_tmp'], '220');
    });
    clientWithCelsius.resetDeviceCache('39FFBB9D6EBA');

    clientWithCelsius.setTargetTemperature('39FFBB9D6EBA', 22, 'C', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 22);

        done();
    });
});

test('airstage.lan.Client#setTargetTemperature calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_set_tmp'], '220');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setTargetTemperature('39FFBB9D6EBA', 72, 'F', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getTemperatureDelta calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_indoor_tmp': '7400',
            'iu_set_tmp': '220'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getTemperatureDelta('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 4);

        done();
    });
});

test('airstage.lan.Client#getTemperatureDelta calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getTemperatureDelta('39FFBB9D6EBA', 'F', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getFanSpeed calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_fan_spd': '11'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getFanSpeed('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'HIGH');

        done();
    });
});

test('airstage.lan.Client#getFanSpeed calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getFanSpeed('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setFanSpeed calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_fan_spd': '11'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_fan_spd'], '11');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setFanSpeed('39FFBB9D6EBA', 'HIGH', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'HIGH');

        done();
    });
});

test('airstage.lan.Client#setFanSpeed calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_fan_spd'], '11');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setFanSpeed('39FFBB9D6EBA', 'HIGH', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getAirflowVerticalDirection calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_dir_vrt': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getAirflowVerticalDirection('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 1);

        done();
    });
});

test('airstage.lan.Client#getAirflowVerticalDirection calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getAirflowVerticalDirection('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalDirection with 0 calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_dir_vrt': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_dir_vrt'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalDirection('39FFBB9D6EBA', 0, (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 1);

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalDirection with 1 calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_dir_vrt': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_dir_vrt'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalDirection('39FFBB9D6EBA', 1, (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 1);

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalDirection with 5 calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_dir_vrt': '4'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_dir_vrt'], '4');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalDirection('39FFBB9D6EBA', 5, (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 4);

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalDirection calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_dir_vrt'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalDirection('39FFBB9D6EBA', 1, (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getAirflowVerticalSwingState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_swg_vrt': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getAirflowVerticalSwingState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getAirflowVerticalSwingState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getAirflowVerticalSwingState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalSwingState calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_af_swg_vrt': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_swg_vrt'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalSwingState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#setAirflowVerticalSwingState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_af_swg_vrt'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setAirflowVerticalSwingState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getPowerfulState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_powerful': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getPowerfulState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getPowerfulState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getPowerfulState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setPowerfulState calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_powerful': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_powerful'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setPowerfulState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#setPowerfulState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_powerful'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setPowerfulState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getEconomyState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_economy': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getEconomyState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getEconomyState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getEconomyState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setEconomyState calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_economy': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_economy'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setEconomyState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#setEconomyState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_economy'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setEconomyState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getEnergySavingFanState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_fan_ctrl': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getEnergySavingFanState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getEnergySavingFanState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getEnergySavingFanState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setEnergySavingFanState calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_fan_ctrl': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_fan_ctrl'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setEnergySavingFanState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#setEnergySavingFanState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_fan_ctrl'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setEnergySavingFanState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getMinimumHeatState calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_min_heat': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getMinimumHeatState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        done();
    });
});

test('airstage.lan.Client#getMinimumHeatState calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getMinimumHeatState('39FFBB9D6EBA', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setMinimumHeatState with "ON" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_min_heat': '1'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_min_heat'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setMinimumHeatState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'ON');

        clientWithFahrenheit.getDevice('39FFBB9D6EBA', (error, result) => {
            assert.strictEqual(error, null);
            assert.strictEqual(Object.keys(result.parameters).length, 5);
            assert.strictEqual(result.parameters['iu_min_heat'], '1');
            assert.strictEqual(result.parameters['iu_onoff'], '1');
            assert.strictEqual(result.parameters['iu_fan_spd'], '0');
            assert.strictEqual(result.parameters['iu_op_mode'], '4');
            assert.strictEqual(result.parameters['iu_set_tmp'], '100');

            done();
        });
    });
});

test('airstage.lan.Client#setMinimumHeatState with "OFF" calls _apiClient.postSetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_min_heat': '0'
        },
        'write_res': 'ack',
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '02',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_min_heat'], '0');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setMinimumHeatState('39FFBB9D6EBA', 'OFF', (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(result, 'OFF');

        clientWithFahrenheit.getDevice('39FFBB9D6EBA', (error, result) => {
            assert.strictEqual(error, null);
            assert.strictEqual(Object.keys(result.parameters).length, 2);
            assert.strictEqual(result.parameters['iu_min_heat'], '0');
            assert.strictEqual(result.parameters['iu_onoff'], '0');

            done();
        });
    });
});

test('airstage.lan.Client#setMinimumHeatState calls _apiClient.postSetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postSetParam',
        (hostname, deviceId, deviceSubId, value, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postSetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(Object.keys(mockedMethod.calls[0].arguments[3]).length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[3]['iu_min_heat'], '1');
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.setMinimumHeatState('39FFBB9D6EBA', 'ON', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getParameter with null parameter calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Parameter not available: iu_min_heat';
    const expectedResponse = {
        'value': {
            'iu_min_heat': null
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getParameter('39FFBB9D6EBA', 'iu_min_heat', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getParameter with undefined parameter calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Parameter not available: foo';
    const expectedResponse = {
        'value': {
            'iu_min_heat': '1'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 2);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache('39FFBB9D6EBA');

    clientWithFahrenheit.getParameter('39FFBB9D6EBA', 'foo', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#setParameter with unknown device ID returns error', (context, done) => {
    const expectedError = 'No hostname for device ID: foo';

    clientWithFahrenheit.setParameter('foo', 'iu_min_heat', '1', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getDevice with unknown device ID returns error', (context, done) => {
    const expectedError = 'No hostname for device ID: foo';

    clientWithFahrenheit.getDevice('foo', (error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});

test('airstage.lan.Client#getDevices with cache hit returns devices', (context, done) => {
    clientWithFahrenheit.resetDeviceCache();
    clientWithFahrenheit._setDeviceParameterCache('39FFBB9D6EBA', {'parameters': [{'name': 'iu_min_heat', 'value': '1'}]});
    clientWithFahrenheit._setDeviceParameterCache('96658F1BF601', {'parameters': [{'name': 'iu_min_heat', 'value': '0'}]});

    clientWithFahrenheit.getDevices(0, (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(Object.keys(result).length, 1);
        assert.strictEqual(Object.keys(result.parameters).length, 2);
        assert.strictEqual(Object.keys(result.parameters['39FFBB9D6EBA']).length, 1);
        assert.strictEqual(result.parameters['39FFBB9D6EBA']['iu_min_heat'], '1');
        assert.strictEqual(Object.keys(result.parameters['96658F1BF601']).length, 1);
        assert.strictEqual(result.parameters['96658F1BF601']['iu_min_heat'], '0');

        done();
    });
});

test('airstage.lan.Client#getDevices without cache hit calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_model': 'AZ123'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 4);
        assert.strictEqual(mockedMethod.calls[3].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[3].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[3].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[3].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[3].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[2].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[2].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[2].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[2].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[2].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '2.3.4.5');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '96658F1BF601');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '2.3.4.5');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '96658F1BF601');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache();

    clientWithFahrenheit.getDevices(0, (error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(Object.keys(result).length, 1);
        assert.strictEqual(Object.keys(result.parameters).length, 2);
        assert.strictEqual(Object.keys(result.parameters['39FFBB9D6EBA']).length, 1);
        assert.strictEqual(result.parameters['39FFBB9D6EBA']['iu_model'], 'AZ123');
        assert.strictEqual(Object.keys(result.parameters['96658F1BF601']).length, 1);
        assert.strictEqual(result.parameters['96658F1BF601']['iu_model'], 'AZ123');

        done();
    });
});

test('airstage.lan.Client#refreshDeviceCache calls _apiClient.postGetParam with success', (context, done) => {
    const expectedResponse = {
        'value': {
            'iu_model': 'AZ123'
        },
        'read_res': 'ack',
        'device_id': '39FFBB9D6EBA',
        'device_sub_id': 0,
        'req_id': '',
        'modified_by': '',
        'set_level': '03',
        'cause': '',
        'result': 'OK',
        'error': ''
    };
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': null, 'response': expectedResponse});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 4);
        assert.strictEqual(mockedMethod.calls[3].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[3].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[3].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[3].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[3].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[2].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[2].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[2].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[2].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[2].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
        assert.strictEqual(mockedMethod.calls[1].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[1].arguments[0], '2.3.4.5');
        assert.strictEqual(mockedMethod.calls[1].arguments[1], '96658F1BF601');
        assert.strictEqual(mockedMethod.calls[1].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[1].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
        assert.strictEqual(mockedMethod.calls[0].arguments.length, 5);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '2.3.4.5');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '96658F1BF601');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_ONLY_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache();

    clientWithFahrenheit.refreshDeviceCache((error, result) => {
        assert.strictEqual(error, null);
        assert.strictEqual(Object.keys(result).length, 1);
        assert.strictEqual(Object.keys(result.parameters).length, 2);
        assert.strictEqual(Object.keys(result.parameters['39FFBB9D6EBA']).length, 1);
        assert.strictEqual(result.parameters['39FFBB9D6EBA']['iu_model'], 'AZ123');
        assert.strictEqual(Object.keys(result.parameters['96658F1BF601']).length, 1);
        assert.strictEqual(result.parameters['96658F1BF601']['iu_model'], 'AZ123');

        done();
    });
});

test('airstage.lan.Client#refreshDeviceCache calls _apiClient.postGetParam with error', (context, done) => {
    const expectedError = 'Error';
    context.mock.method(
        clientWithFahrenheit._apiClient,
        'postGetParam',
        (hostname, deviceId, deviceSubId, list, callback) => {
            callback({'error': expectedError, 'response': null});
        }
    );
    context.after(() => {
        const mockedMethod = clientWithFahrenheit._apiClient.postGetParam.mock;

        assert.strictEqual(mockedMethod.calls.length, 1);
        assert.strictEqual(mockedMethod.calls[0].arguments[0], '1.2.3.4');
        assert.strictEqual(mockedMethod.calls[0].arguments[1], '39FFBB9D6EBA');
        assert.strictEqual(mockedMethod.calls[0].arguments[2], '0');
        assert.strictEqual(mockedMethod.calls[0].arguments[3], airstage.constants.PARAMETER_NAMES_BESIDES_MODEL);
    });
    clientWithFahrenheit.resetDeviceCache();

    clientWithFahrenheit.refreshDeviceCache((error, result) => {
        assert.strictEqual(error, expectedError);
        assert.strictEqual(result, null);

        done();
    });
});