homebridge-izone-airconditioner
Version:
Homebridge plugin for the iZone airconditioner controller.
140 lines (139 loc) • 4.92 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MODES = void 0;
exports["default"] = _default;
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
var _urijs = _interopRequireDefault(require("urijs"));
var _fp = require("lodash/fp");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
var MODES = exports.MODES = {
cool: 'cool',
heat: 'heat',
vent: 'vent',
dry: 'dry',
auto: 'auto'
};
function _default(rawUrl) {
var fetch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _nodeFetch["default"];
var parsedUrl = (0, _urijs["default"])(rawUrl);
var protocol = parsedUrl.protocol();
if (protocol !== 'http' && protocol !== 'https') throw 'Not a valid URL';
var url = parsedUrl.toString();
var postJson = buildPostJson(fetch);
var readFloatAttribute = buildReadFloatAttribute(fetch);
var readStringAttribute = buildReadStringAttribute(fetch);
var readOnOffAttribute = buildReadOnOffAttribute(fetch);
var getTemps = function getTemps(zones) {
return zones.map(function (zone) {
return parseFloat(zone.Temp);
});
};
return {
setPower: function setPower(value) {
return postJson("".concat(url, "SystemON"), {
SystemON: value ? 'on' : 'off'
});
},
getPower: function getPower() {
return readOnOffAttribute("".concat(url, "SystemSettings"), 'SysOn');
},
getUnitSetpoint: function getUnitSetpoint() {
return readFloatAttribute("".concat(url, "SystemSettings"), 'Setpoint');
},
setUnitSetpoint: function setUnitSetpoint(value) {
return postJson("".concat(url, "UnitSetpoint"), {
UnitSetpoint: value.toString()
});
},
setMode: function setMode(value) {
return postJson("".concat(url, "SystemMODE"), {
SystemMODE: value
});
},
getMode: function getMode() {
return readStringAttribute("".concat(url, "SystemSettings"), 'SysMode');
},
setFanSpeed: function setFanSpeed(value) {
return postJson("".concat(url, "SystemFAN"), {
SystemFAN: value
});
},
getFanSpeed: function getFanSpeed() {
return readStringAttribute("".concat(url, "SystemSettings"), 'SysFan');
},
getActualTemperature: function getActualTemperature() {
return Promise.all([readFloatAttribute("".concat(url, "SystemSettings"), 'Temp'), getJson(fetch, "".concat(url, "Zones1_4")).then(getTemps), getJson(fetch, "".concat(url, "Zones5_8")).then(getTemps), getJson(fetch, "".concat(url, "Zones9_12")).then(getTemps)]).then(function () {
for (var _len = arguments.length, temperatures = new Array(_len), _key = 0; _key < _len; _key++) {
temperatures[_key] = arguments[_key];
}
return getAverageTemperature(temperatures);
});
},
getPowerAndMode: function getPowerAndMode() {
return Promise.all([readOnOffAttribute("".concat(url, "SystemSettings"), 'SysOn'), readStringAttribute("".concat(url, "SystemSettings"), 'SysMode')]);
}
};
}
function checkStatus(res) {
if (res.ok) {
// res.status >= 200 && res.status < 300
return res;
} else {
throw "API ERROR: ".concat(res.statusText);
}
}
var getJson = function getJson(fetch, url) {
return fetch(url).then(checkStatus).then(function (res) {
return res.json();
});
};
var readAttribute = function readAttribute(fetch, url, attribute) {
return getJson(fetch, url).then(function (data) {
return data[attribute];
});
};
var buildReadFloatAttribute = function buildReadFloatAttribute(fetch) {
return function (url, attribute) {
return readAttribute(fetch, url, attribute).then(function (value) {
return parseFloat(value);
});
};
};
var buildReadStringAttribute = function buildReadStringAttribute(fetch) {
return function (url, attribute) {
return readAttribute(fetch, url, attribute).then(function (value) {
return value.toString();
});
};
};
var buildReadOnOffAttribute = function buildReadOnOffAttribute(fetch) {
return function (url, attribute) {
return readAttribute(fetch, url, attribute).then(function (value) {
return value === 'on';
});
};
};
var buildPostJson = function buildPostJson(fetch) {
return function (url, body) {
return fetch(url, {
method: 'post',
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json'
}
}).then(checkStatus).then(function (_res) {
return true;
});
};
};
var extractTemperatures = (0, _fp.flow)(_fp.flattenDeep, (0, _fp.reject)(function (val) {
return val == 0;
}));
var getAverageTemperature = function getAverageTemperature(rawTemperatures) {
var temperatures = extractTemperatures(rawTemperatures);
if (temperatures.length === 0) return 0;
return (0, _fp.sum)(temperatures) / temperatures.length;
};
//# sourceMappingURL=api.js.map
;