Formatting only

This commit is contained in:
Arne 2019-09-19 09:37:16 +02:00
parent a3b64b7c53
commit 5139929bce

398
index.js
View File

@ -6,20 +6,23 @@ var inherits = require('util').inherits,
Service, Service,
Characteristic; Characteristic;
module.exports = function (homebridge) { module.exports = function (homebridge)
{
Service = homebridge.hap.Service; Service = homebridge.hap.Service;
Characteristic = homebridge.hap.Characteristic; Characteristic = homebridge.hap.Characteristic;
homebridge.registerPlatform("homebridge-neato", "NeatoVacuumRobot", NeatoVacuumRobotPlatform); homebridge.registerPlatform("homebridge-neato", "NeatoVacuumRobot", NeatoVacuumRobotPlatform);
}; };
function NeatoVacuumRobotPlatform(log, config) { function NeatoVacuumRobotPlatform(log, config)
{
this.log = log; this.log = log;
this.serial = "1-3-3-7"; this.serial = "1-3-3-7";
this.email = config['email']; this.email = config['email'];
this.password = config['password']; this.password = config['password'];
this.hiddenServices = ('disabled' in config ? config['disabled'] : ''); this.hiddenServices = ('disabled' in config ? config['disabled'] : '');
if ('refresh' in config && config['refresh'] !== 'auto') { if ('refresh' in config && config['refresh'] !== 'auto')
{
// parse config parameter // parse config parameter
this.refresh = parseInt(config['refresh']); this.refresh = parseInt(config['refresh']);
// must be integer and positive // must be integer and positive
@ -28,28 +31,38 @@ function NeatoVacuumRobotPlatform(log, config) {
this.refresh = (this.refresh > 0 && this.refresh < 60) ? 60 : this.refresh; this.refresh = (this.refresh > 0 && this.refresh < 60) ? 60 : this.refresh;
} }
// default auto // default auto
else { else
{
this.refresh = 'auto'; this.refresh = 'auto';
} }
debug("Refresh is set to: " + this.refresh); debug("Refresh is set to: " + this.refresh);
} }
NeatoVacuumRobotPlatform.prototype = { NeatoVacuumRobotPlatform.prototype = {
accessories: function (callback) { accessories: function (callback)
{
let accessories = []; let accessories = [];
let that = this; let that = this;
that.boundaryNames = []; that.boundaryNames = [];
this.getRobots(function () { this.getRobots(function ()
if (that.robots) { {
that.robots.forEach((robot, i) => { if (that.robots)
{
that.robots.forEach((robot, i) =>
{
that.log("Found robot #" + (i + 1) + " named \"" + robot.name + "\" with serial \"" + robot._serial + "\""); that.log("Found robot #" + (i + 1) + " named \"" + robot.name + "\" with serial \"" + robot._serial + "\"");
let robotAccessory = new NeatoVacuumRobotAccessory(robot, that); let robotAccessory = new NeatoVacuumRobotAccessory(robot, that);
accessories.push(robotAccessory); accessories.push(robotAccessory);
if (robot.maps) { if (robot.maps)
robot.maps.forEach((map) => { {
if (map.boundaries) { robot.maps.forEach((map) =>
map.boundaries.forEach((boundary) => { {
if (boundary.type === "polygon") { if (map.boundaries)
{
map.boundaries.forEach((boundary) =>
{
if (boundary.type === "polygon")
{
accessories.push(new NeatoVacuumRobotAccessory(robot, that, boundary)) accessories.push(new NeatoVacuumRobotAccessory(robot, that, boundary))
} }
}) })
@ -62,33 +75,48 @@ NeatoVacuumRobotPlatform.prototype = {
}); });
}, },
getRobots: function (callback) { getRobots: function (callback)
{
debug("Loading your robots"); debug("Loading your robots");
let client = new botvac.Client(); let client = new botvac.Client();
let that = this; let that = this;
client.authorize(this.email, this.password, false, (error) => { client.authorize(this.email, this.password, false, (error) =>
if (error) { {
if (error)
{
that.log(error); that.log(error);
that.log.error("Can't log on to neato cloud. Please check your internet connection and your credentials. Try again later if the neato servers have issues."); that.log.error("Can't log on to neato cloud. Please check your internet connection and your credentials. Try again later if the neato servers have issues.");
callback(); callback();
} else { }
client.getRobots((error, robots) => { else
if (error) { {
client.getRobots((error, robots) =>
{
if (error)
{
that.log(error); that.log(error);
that.log.error("Successful login but can't connect to your neato robot."); that.log.error("Successful login but can't connect to your neato robot.");
callback(); callback();
} else { }
if (robots.length === 0) { else
{
if (robots.length === 0)
{
that.log.error("Successful login but no robots associated with your account."); that.log.error("Successful login but no robots associated with your account.");
that.robots = []; that.robots = [];
callback(); callback();
} else { }
else
{
debug("Found " + robots.length + " robots"); debug("Found " + robots.length + " robots");
let updatedRobotCount = 0; let updatedRobotCount = 0;
that.robots = robots; that.robots = robots;
that.robots.forEach((robot) => { that.robots.forEach((robot) =>
robot.getPersistentMaps((error, result) => { {
if (error) { robot.getPersistentMaps((error, result) =>
{
if (error)
{
that.log("Error updating persistent maps: " + error + ": " + result); that.log("Error updating persistent maps: " + error + ": " + result);
callback(); callback();
return; return;
@ -99,17 +127,24 @@ NeatoVacuumRobotPlatform.prototype = {
{ {
callback(); callback();
} }
robot.maps.forEach((map) => { robot.maps.forEach((map) =>
robot.getMapBoundaries(map.id, (error, result) => { {
if (error) { robot.getMapBoundaries(map.id, (error, result) =>
{
if (error)
{
this.log("error getting boundaries: " + error + ": " + result) this.log("error getting boundaries: " + error + ": " + result)
} else { }
else
{
map.boundaries = result.boundaries; map.boundaries = result.boundaries;
} }
processedMapCount++; processedMapCount++;
if (processedMapCount == robot.maps.length) { if (processedMapCount == robot.maps.length)
{
updatedRobotCount++; updatedRobotCount++;
if (updatedRobotCount === that.robots.length) { if (updatedRobotCount === that.robots.length)
{
callback(); callback();
} }
} }
@ -125,24 +160,32 @@ NeatoVacuumRobotPlatform.prototype = {
} }
}; };
function NeatoVacuumRobotAccessory(robot, platform, boundary) { function NeatoVacuumRobotAccessory(robot, platform, boundary)
{
this.platform = platform; this.platform = platform;
this.boundary = boundary; this.boundary = boundary;
this.log = platform.log; this.log = platform.log;
this.refresh = platform.refresh; this.refresh = platform.refresh;
this.hiddenServices = platform.hiddenServices; this.hiddenServices = platform.hiddenServices;
this.robot = robot; this.robot = robot;
if (!this.boundary) { if (!this.boundary)
{
this.name = robot.name; this.name = robot.name;
} else { }
else
{
// if boundary name already exists // if boundary name already exists
if (platform.boundaryNames.includes(this.boundary.name)) { if (platform.boundaryNames.includes(this.boundary.name))
{
let lastChar = this.boundary.name.slice(-1); let lastChar = this.boundary.name.slice(-1);
// boundary name already contains a count number // boundary name already contains a count number
if (!isNaN(lastChar)) { if (!isNaN(lastChar))
{
// Increment existing count number // Increment existing count number
this.boundary.name = this.boundary.name.slice(0, -1) + (parseInt(lastChar) + 1); this.boundary.name = this.boundary.name.slice(0, -1) + (parseInt(lastChar) + 1);
} else { }
else
{
// Add a new count number // Add a new count number
this.boundary.name = this.boundary.name + " 2"; this.boundary.name = this.boundary.name + " 2";
} }
@ -154,7 +197,8 @@ function NeatoVacuumRobotAccessory(robot, platform, boundary) {
this.vacuumRobotBatteryService = new Service.BatteryService("Battery", "battery"); this.vacuumRobotBatteryService = new Service.BatteryService("Battery", "battery");
if (!this.boundary) { if (!this.boundary)
{
this.vacuumRobotCleanService = new Service.Switch("Clean", "clean"); this.vacuumRobotCleanService = new Service.Switch("Clean", "clean");
this.vacuumRobotGoToDockService = new Service.Switch(this.name + " Go to Dock", "goToDock"); this.vacuumRobotGoToDockService = new Service.Switch(this.name + " Go to Dock", "goToDock");
this.vacuumRobotDockStateService = new Service.OccupancySensor(this.name + " Dock", "dockState"); this.vacuumRobotDockStateService = new Service.OccupancySensor(this.name + " Dock", "dockState");
@ -162,10 +206,13 @@ function NeatoVacuumRobotAccessory(robot, platform, boundary) {
this.vacuumRobotNoGoLinesService = new Service.Switch(this.name + " NoGo Lines", "noGoLines"); this.vacuumRobotNoGoLinesService = new Service.Switch(this.name + " NoGo Lines", "noGoLines");
this.vacuumRobotExtraCareService = new Service.Switch(this.name + " Extra Care", "extraCare"); this.vacuumRobotExtraCareService = new Service.Switch(this.name + " Extra Care", "extraCare");
this.vacuumRobotScheduleService = new Service.Switch(this.name + " Schedule", "schedule"); this.vacuumRobotScheduleService = new Service.Switch(this.name + " Schedule", "schedule");
} else { }
else
{
const splitName = boundary.name.split(' '); const splitName = boundary.name.split(' ');
let serviceName = "Clean the " + boundary.name; let serviceName = "Clean the " + boundary.name;
if (splitName.length >= 2 && splitName[splitName.length - 2].match(/[']s$/g)) { if (splitName.length >= 2 && splitName[splitName.length - 2].match(/[']s$/g))
{
serviceName = "Clean " + boundary.name; serviceName = "Clean " + boundary.name;
} }
this.vacuumRobotCleanBoundaryService = this.vacuumRobotCleanBoundaryService =
@ -178,9 +225,11 @@ function NeatoVacuumRobotAccessory(robot, platform, boundary) {
NeatoVacuumRobotAccessory.prototype = { NeatoVacuumRobotAccessory.prototype = {
identify: function (callback) { identify: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
// hide serial and secret in log // hide serial and secret in log
let _serial = that.robot._serial; let _serial = that.robot._serial;
let _secret = that.robot._secret; let _secret = that.robot._secret;
@ -192,16 +241,20 @@ NeatoVacuumRobotAccessory.prototype = {
}); });
}, },
getServices: function () { getServices: function ()
{
this.informationService = new Service.AccessoryInformation(); this.informationService = new Service.AccessoryInformation();
this.informationService this.informationService
.setCharacteristic(Characteristic.Manufacturer, "Neato Robotics") .setCharacteristic(Characteristic.Manufacturer, "Neato Robotics")
.setCharacteristic(Characteristic.Model, "Coming soon") .setCharacteristic(Characteristic.Model, "Coming soon")
.setCharacteristic(Characteristic.SerialNumber, this.robot._serial); .setCharacteristic(Characteristic.SerialNumber, this.robot._serial);
if (!this.boundary) { if (!this.boundary)
{
this.informationService this.informationService
.setCharacteristic(Characteristic.Name, this.robot.name) .setCharacteristic(Characteristic.Name, this.robot.name)
} else { }
else
{
this.informationService this.informationService
.setCharacteristic(Characteristic.Name, this.robot.name + ' - ' + this.boundary.name) .setCharacteristic(Characteristic.Name, this.robot.name + ' - ' + this.boundary.name)
} }
@ -211,7 +264,8 @@ NeatoVacuumRobotAccessory.prototype = {
this.services = [this.informationService, this.vacuumRobotBatteryService]; this.services = [this.informationService, this.vacuumRobotBatteryService];
if (!this.boundary) { if (!this.boundary)
{
this.vacuumRobotCleanService.getCharacteristic(Characteristic.On).on('set', this.setClean.bind(this)); this.vacuumRobotCleanService.getCharacteristic(Characteristic.On).on('set', this.setClean.bind(this));
this.vacuumRobotCleanService.getCharacteristic(Characteristic.On).on('get', this.getClean.bind(this)); this.vacuumRobotCleanService.getCharacteristic(Characteristic.On).on('get', this.getClean.bind(this));
@ -248,11 +302,14 @@ NeatoVacuumRobotAccessory.prototype = {
this.services.push(this.vacuumRobotScheduleService); this.services.push(this.vacuumRobotScheduleService);
} }
if (this.boundary) { if (this.boundary)
this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).on('set', (on, serviceCallback) => { {
this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).on('set', (on, serviceCallback) =>
{
this.setCleanBoundary(this.boundary.id, on, serviceCallback) this.setCleanBoundary(this.boundary.id, on, serviceCallback)
}); });
this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).on('get', (serviceCallback) => { this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).on('get', (serviceCallback) =>
{
this.getCleanBoundary(this.boundary.id, serviceCallback); this.getCleanBoundary(this.boundary.id, serviceCallback);
}); });
this.services.push(this.vacuumRobotCleanBoundaryService); this.services.push(this.vacuumRobotCleanBoundaryService);
@ -261,27 +318,40 @@ NeatoVacuumRobotAccessory.prototype = {
return this.services; return this.services;
}, },
setCleanBoundary: function (boundaryId, on, callback) { setCleanBoundary: function (boundaryId, on, callback)
this.updateRobot((error, result) => { {
if (on) { this.updateRobot((error, result) =>
if (this.robot.canStart) { {
if (on)
{
if (this.robot.canStart)
{
this.log("Starting to clean: " + boundaryId); this.log("Starting to clean: " + boundaryId);
this.robot.startCleaningBoundary(this.eco, this.extraCare, boundaryId, (error, result) => { this.robot.startCleaningBoundary(this.eco, this.extraCare, boundaryId, (error, result) =>
if (error) { {
if (error)
{
this.log(error + ": " + JSON.stringify(result)); this.log(error + ": " + JSON.stringify(result));
} }
callback(); callback();
}); });
return return
} else { }
else
{
this.log("Error, robot is already cleaning"); this.log("Error, robot is already cleaning");
} }
} else { }
if (this.robot.canPause) { else
{
if (this.robot.canPause)
{
debug(this.name + ": Pause cleaning"); debug(this.name + ": Pause cleaning");
this.robot.pauseCleaning(callback); this.robot.pauseCleaning(callback);
return; return;
} else { }
else
{
debug(this.name + ": Already stopped"); debug(this.name + ": Already stopped");
} }
} }
@ -289,30 +359,41 @@ NeatoVacuumRobotAccessory.prototype = {
}); });
}, },
getCleanBoundary: function (boundaryId, callback) { getCleanBoundary: function (boundaryId, callback)
this.updateRobot((error, result) => { {
this.updateRobot((error, result) =>
{
callback(false, this.robot.canPause && (this.robot.cleaningBoundaryId == boundaryId)); callback(false, this.robot.canPause && (this.robot.cleaningBoundaryId == boundaryId));
}); });
}, },
setClean: function (on, callback) { setClean: function (on, callback)
{
let that = this; let that = this;
this.updateRobot(function (error, result) { this.updateRobot(function (error, result)
if (on) { {
if (that.robot.canResume || that.robot.canStart) { if (on)
{
if (that.robot.canResume || that.robot.canStart)
{
// start extra update robot timer if refresh is set to "auto" // start extra update robot timer if refresh is set to "auto"
if (that.refresh === 'auto') { if (that.refresh === 'auto')
setTimeout(function () { {
setTimeout(function ()
{
clearTimeout(that.timer); clearTimeout(that.timer);
that.updateRobotTimer(); that.updateRobotTimer();
}, 60 * 1000); }, 60 * 1000);
} }
if (that.robot.canResume) { if (that.robot.canResume)
{
debug(that.name + ": Resume cleaning"); debug(that.name + ": Resume cleaning");
that.robot.resumeCleaning(callback); that.robot.resumeCleaning(callback);
} else { }
else
{
let eco = that.vacuumRobotEcoService.getCharacteristic(Characteristic.On).value; let eco = that.vacuumRobotEcoService.getCharacteristic(Characteristic.On).value;
let extraCare = that.vacuumRobotExtraCareService.getCharacteristic(Characteristic.On).value; let extraCare = that.vacuumRobotExtraCareService.getCharacteristic(Characteristic.On).value;
let nogoLines = that.vacuumRobotNoGoLinesService.getCharacteristic(Characteristic.On).value; let nogoLines = that.vacuumRobotNoGoLinesService.getCharacteristic(Characteristic.On).value;
@ -321,24 +402,35 @@ NeatoVacuumRobotAccessory.prototype = {
eco, eco,
extraCare ? 2 : 1, extraCare ? 2 : 1,
nogoLines, nogoLines,
function (error, result) { function (error, result)
if (error) { {
if (error)
{
that.log.error("Cannot start cleaning. " + error + ": " + result); that.log.error("Cannot start cleaning. " + error + ": " + result);
callback(true); callback(true);
} else { }
else
{
callback(); callback();
} }
}); });
} }
} else { }
else
{
debug(that.name + ": Cannot start, maybe already cleaning"); debug(that.name + ": Cannot start, maybe already cleaning");
callback(); callback();
} }
} else { }
if (that.robot.canPause) { else
{
if (that.robot.canPause)
{
debug(that.name + ": Pause cleaning"); debug(that.name + ": Pause cleaning");
that.robot.pauseCleaning(callback); that.robot.pauseCleaning(callback);
} else { }
else
{
debug(that.name + ": Already stopped"); debug(that.name + ": Already stopped");
callback(); callback();
} }
@ -346,139 +438,182 @@ NeatoVacuumRobotAccessory.prototype = {
}); });
}, },
setGoToDock: function (on, callback) { setGoToDock: function (on, callback)
{
let that = this; let that = this;
this.updateRobot(function (error, result) { this.updateRobot(function (error, result)
if (on) { {
if (that.robot.canPause) { if (on)
{
if (that.robot.canPause)
{
debug(that.name + ": Pause cleaning to go to dock"); debug(that.name + ": Pause cleaning to go to dock");
that.robot.pauseCleaning(function (error, result) { that.robot.pauseCleaning(function (error, result)
setTimeout(function () { {
setTimeout(function ()
{
debug("Go to dock"); debug("Go to dock");
that.robot.sendToBase(callback); that.robot.sendToBase(callback);
}, 1000); }, 1000);
}); });
} else if (that.robot.canGoToBase) { }
else if (that.robot.canGoToBase)
{
debug(that.name + ": Go to dock"); debug(that.name + ": Go to dock");
that.robot.sendToBase(callback); that.robot.sendToBase(callback);
} else { }
else
{
that.log.warn(that.name + ": Can't go to dock at the moment"); that.log.warn(that.name + ": Can't go to dock at the moment");
callback(); callback();
} }
} else { }
else
{
callback(); callback();
} }
}); });
}, },
setEco: function (on, callback) { setEco: function (on, callback)
{
debug(this.name + ": " + (on ? "Enable eco mode" : "Disable eco mode")); debug(this.name + ": " + (on ? "Enable eco mode" : "Disable eco mode"));
this.robot.eco = on; this.robot.eco = on;
callback(); callback();
}, },
setNoGoLines: function (on, callback) { setNoGoLines: function (on, callback)
{
debug(this.name + ": " + (on ? "Enable nogo lines" : "Disable nogo lines")); debug(this.name + ": " + (on ? "Enable nogo lines" : "Disable nogo lines"));
this.robot.noGoLines = on; this.robot.noGoLines = on;
callback(); callback();
}, },
setExtraCare: function (on, callback) { setExtraCare: function (on, callback)
{
debug(this.name + ": " + (on ? "Enable extra care navigation" : "Disable extra care navigation")); debug(this.name + ": " + (on ? "Enable extra care navigation" : "Disable extra care navigation"));
this.robot.navigationMode = on ? 2 : 1; this.robot.navigationMode = on ? 2 : 1;
callback(); callback();
}, },
setSchedule: function (on, callback) { setSchedule: function (on, callback)
{
let that = this; let that = this;
this.updateRobot(function (error, result) { this.updateRobot(function (error, result)
if (on) { {
if (on)
{
debug(that.name + ": Enable schedule"); debug(that.name + ": Enable schedule");
that.robot.enableSchedule(callback); that.robot.enableSchedule(callback);
} else { }
else
{
debug(that.name + ": Disable schedule"); debug(that.name + ": Disable schedule");
that.robot.disableSchedule(callback); that.robot.disableSchedule(callback);
} }
}); });
}, },
getClean: function (callback) { getClean: function (callback)
{
let that = this; let that = this;
this.updateRobot(function (error, result) { this.updateRobot(function (error, result)
{
debug(that.name + ": Is cleaning: " + that.robot.canPause); debug(that.name + ": Is cleaning: " + that.robot.canPause);
callback(false, that.robot.canPause); callback(false, that.robot.canPause);
}); });
}, },
getGoToDock: function (callback) { getGoToDock: function (callback)
{
callback(false, false); callback(false, false);
}, },
getDock: function (callback) { getDock: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is docked: " + that.robot.isDocked); debug(that.name + ": Is docked: " + that.robot.isDocked);
callback(false, that.robot.isDocked ? 1 : 0); callback(false, that.robot.isDocked ? 1 : 0);
}); });
}, },
getEco: function (callback) { getEco: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is eco: " + that.robot.eco); debug(that.name + ": Is eco: " + that.robot.eco);
callback(false, that.robot.eco); callback(false, that.robot.eco);
}); });
}, },
getNoGoLines: function (callback) { getNoGoLines: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is nogo lines: " + that.robot.noGoLines); debug(that.name + ": Is nogo lines: " + that.robot.noGoLines);
callback(false, that.robot.noGoLines ? 1 : 0); callback(false, that.robot.noGoLines ? 1 : 0);
}); });
}, },
getExtraCare: function (callback) { getExtraCare: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is extra care navigation: " + (that.robot.navigationMode == 2 ? true : false)); debug(that.name + ": Is extra care navigation: " + (that.robot.navigationMode == 2 ? true : false));
callback(false, that.robot.navigationMode == 2 ? 1 : 0); callback(false, that.robot.navigationMode == 2 ? 1 : 0);
}); });
}, },
getSchedule: function (callback) { getSchedule: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is schedule: " + that.robot.isScheduleEnabled); debug(that.name + ": Is schedule: " + that.robot.isScheduleEnabled);
callback(false, that.robot.isScheduleEnabled); callback(false, that.robot.isScheduleEnabled);
}); });
}, },
getBatteryLevel: function (callback) { getBatteryLevel: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Battery: " + that.robot.charge + "%"); debug(that.name + ": Battery: " + that.robot.charge + "%");
callback(false, that.robot.charge); callback(false, that.robot.charge);
}); });
}, },
getBatteryChargingState: function (callback) { getBatteryChargingState: function (callback)
{
let that = this; let that = this;
this.updateRobot(function () { this.updateRobot(function ()
{
debug(that.name + ": Is charging: " + that.robot.isCharging); debug(that.name + ": Is charging: " + that.robot.isCharging);
callback(false, that.robot.isCharging); callback(false, that.robot.isCharging);
}); });
}, },
updateRobot: function (callback) { updateRobot: function (callback)
{
let that = this; let that = this;
if (this.lastUpdate !== null && new Date() - this.lastUpdate < 2000) { if (this.lastUpdate !== null && new Date() - this.lastUpdate < 2000)
{
callback(); callback();
} else { }
else
{
debug(this.name + ": Updating robot state"); debug(this.name + ": Updating robot state");
this.robot.getState(function (error, result) { this.robot.getState(function (error, result)
if (error) { {
if (error)
{
that.log.error("Cannot update robot. Check if robot is online. " + error); that.log.error("Cannot update robot. Check if robot is online. " + error);
} }
that.lastUpdate = new Date(); that.lastUpdate = new Date();
@ -487,22 +622,28 @@ NeatoVacuumRobotAccessory.prototype = {
} }
}, },
updateRobotTimer: function () { updateRobotTimer: function ()
{
let that = this; let that = this;
this.updateRobot((error, result) => { this.updateRobot((error, result) =>
{
if (!this.boundary) { if (!this.boundary)
{
// only update these values if the state is different from the current one, otherwise we might accidentally start an action // only update these values if the state is different from the current one, otherwise we might accidentally start an action
if (that.vacuumRobotCleanService.getCharacteristic(Characteristic.On).value !== that.robot.canPause) { if (that.vacuumRobotCleanService.getCharacteristic(Characteristic.On).value !== that.robot.canPause)
{
that.vacuumRobotCleanService.setCharacteristic(Characteristic.On, that.robot.canPause); that.vacuumRobotCleanService.setCharacteristic(Characteristic.On, that.robot.canPause);
} }
// dock switch is on (dock not seen before) and dock has just been seen -> turn switch off // dock switch is on (dock not seen before) and dock has just been seen -> turn switch off
if (that.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).value == true && that.robot.dockHasBeenSeen) { if (that.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).value == true && that.robot.dockHasBeenSeen)
{
that.vacuumRobotGoToDockService.setCharacteristic(Characteristic.On, false); that.vacuumRobotGoToDockService.setCharacteristic(Characteristic.On, false);
} }
if (that.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).value !== that.robot.isScheduleEnabled) { if (that.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).value !== that.robot.isScheduleEnabled)
{
that.vacuumRobotScheduleService.setCharacteristic(Characteristic.On, that.robot.isScheduleEnabled); that.vacuumRobotScheduleService.setCharacteristic(Characteristic.On, that.robot.isScheduleEnabled);
} }
@ -512,8 +653,11 @@ NeatoVacuumRobotAccessory.prototype = {
that.vacuumRobotNoGoLinesService.setCharacteristic(Characteristic.On, that.robot.noGoLines); that.vacuumRobotNoGoLinesService.setCharacteristic(Characteristic.On, that.robot.noGoLines);
that.vacuumRobotExtraCareService.setCharacteristic(Characteristic.On, that.robot.navigationMode == 2 ? true : false); that.vacuumRobotExtraCareService.setCharacteristic(Characteristic.On, that.robot.navigationMode == 2 ? true : false);
} else { }
if (this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).value !== that.robot.canPause) { else
{
if (this.vacuumRobotCleanBoundaryService.getCharacteristic(Characteristic.On).value !== that.robot.canPause)
{
this.vacuumRobotCleanBoundaryService.setCharacteristic(Characteristic.On, that.robot.canPause); this.vacuumRobotCleanBoundaryService.setCharacteristic(Characteristic.On, that.robot.canPause);
} }
} }
@ -522,16 +666,20 @@ NeatoVacuumRobotAccessory.prototype = {
that.vacuumRobotBatteryService.setCharacteristic(Characteristic.ChargingState, that.robot.isCharging); that.vacuumRobotBatteryService.setCharacteristic(Characteristic.ChargingState, that.robot.isCharging);
// robot is currently cleaning, update if refresh is set to auto or a specific interval // robot is currently cleaning, update if refresh is set to auto or a specific interval
if (that.robot.canPause && that.refresh !== 0) { if (that.robot.canPause && that.refresh !== 0)
{
let refreshTime = that.refresh === 'auto' ? 60 : that.refresh; let refreshTime = that.refresh === 'auto' ? 60 : that.refresh;
debug("Updating state in background every " + refreshTime + " seconds while cleaning"); debug("Updating state in background every " + refreshTime + " seconds while cleaning");
that.timer = setTimeout(that.updateRobotTimer.bind(that), refreshTime * 1000); that.timer = setTimeout(that.updateRobotTimer.bind(that), refreshTime * 1000);
} }
// robot is not cleaning, but a specific refresh interval is set // robot is not cleaning, but a specific refresh interval is set
else if (that.refresh !== 'auto' && that.refresh !== 0) { else if (that.refresh !== 'auto' && that.refresh !== 0)
{
debug("Updating state in background every " + that.refresh + " seconds (user setting)"); debug("Updating state in background every " + that.refresh + " seconds (user setting)");
that.timer = setTimeout(that.updateRobotTimer.bind(that), that.refresh * 1000); that.timer = setTimeout(that.updateRobotTimer.bind(that), that.refresh * 1000);
} else { }
else
{
debug("Updating state in background disabled"); debug("Updating state in background disabled");
} }
}); });