Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
88f217e2b1 | ||
|
2fec762498 | ||
|
857af55e99 | ||
|
20e0a9b909 | ||
|
afdff765b0 | ||
|
dcef6653ff | ||
|
82bf19c548 | ||
|
1084bff0ee | ||
|
5aa66835dd | ||
|
08ef90f7b0 | ||
|
bfb03b5d5d | ||
|
56e85c92e0 | ||
|
d6dd94979b | ||
|
6deca89d27 | ||
|
5eb5b9934d | ||
|
9a5c3f942c | ||
|
8f6f3dc72d | ||
|
0f8fb1dedf | ||
|
e01fb8df28 | ||
|
8cb6ecf8a5 | ||
|
36e8496108 | ||
|
b2ddecc827 | ||
|
5dbdb18c58 | ||
|
d49cab1e97 |
46
CHANGELOG.md
46
CHANGELOG.md
@@ -9,4 +9,48 @@
|
||||
## 0.2.0
|
||||
|
||||
* Added dock info
|
||||
* Changed logging to debug library
|
||||
* Improved logging to use a debug library
|
||||
|
||||
## 0.2.1
|
||||
|
||||
* Improved the go to dock command
|
||||
|
||||
## 0.3.0
|
||||
|
||||
* Added periodic refresh of robot state while cleaning
|
||||
* Added optional periodic refresh of robot state while not cleaning
|
||||
* Added error messages when cant login or get robot
|
||||
* Improved go to dock switch to be enabled as soon as possible without manual refresh
|
||||
* Improved switches to indicate the time an action needs to complete
|
||||
* Improved eco mode to not be overwritten by robot state update
|
||||
|
||||
## 0.3.1
|
||||
|
||||
* Added support for Neato BotVac D5 Connected
|
||||
|
||||
## 0.3.2
|
||||
|
||||
* Fixed a bug that refresh is not disabled when set to 0
|
||||
|
||||
## 0.4.0
|
||||
|
||||
* Added support for multiple robots
|
||||
* Added log output when user requests accessory identify
|
||||
* Changed plugin to platform instead of single accessory
|
||||
* Removed parameter name from config
|
||||
|
||||
## 0.4.1
|
||||
|
||||
* Added config parameter for extraCareNavigation
|
||||
|
||||
## 0.4.2
|
||||
|
||||
* Added config parameter to disable switches/sensors
|
||||
|
||||
## 0.4.4
|
||||
|
||||
* Fixed config parameter to disable switches/sensors not optional
|
||||
|
||||
## 0.4.5
|
||||
|
||||
* Fixed compatibility with homebridge 0.4.23 (occupancy sensor not working)
|
53
README.md
53
README.md
@@ -4,39 +4,72 @@ This is a plugin for [homebridge](https://github.com/nfarina/homebridge) to cont
|
||||
|
||||
Feel free to leave any feedback [here](https://github.com/naofireblade/homebridge-neato/issues).
|
||||
|
||||
# Features
|
||||
If you update from a previous version 0.3.x you have to adapt your config.
|
||||
|
||||
## Features
|
||||
|
||||
- Start and pause cleaning
|
||||
- Return to dock
|
||||
- Return to dock\*
|
||||
- Enable and disable schedule
|
||||
- Enable and disable eco mode
|
||||
- Get battery info
|
||||
- Get dock info
|
||||
- Periodic refresh of robot state
|
||||
- Support for multiple robots
|
||||
- Extra care navigation
|
||||
|
||||
# Installation
|
||||
\* Available after some seconds of cleaning.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Install homebridge using: `npm install -g homebridge`
|
||||
2. Install this plugin using: `npm install -g homebridge-neato`
|
||||
3. If you don't have a Neato account yet create one [here](https://www.neatorobotics.com/create-account/).
|
||||
4. Update your configuration file. See the sample below.
|
||||
|
||||
### Configuration
|
||||
## Configuration
|
||||
|
||||
Add the following information to your config file. Change the values for name, email and password.
|
||||
Add the following information to your config file. Change the values for email and password.
|
||||
|
||||
### Simple
|
||||
|
||||
```json
|
||||
"accessories": [
|
||||
"platforms": [
|
||||
{
|
||||
"accessory": "NeatoVacuumRobot",
|
||||
"name": "YourRobot",
|
||||
"platform": "NeatoVacuumRobot",
|
||||
"email": "YourEmail",
|
||||
"password": "YourPassword"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
# Tested robots
|
||||
### Advanced
|
||||
|
||||
The following config contains advanced optional settings that are off when not specified.
|
||||
|
||||
The parameter **refresh** sets in what interval (seconds) changes of the robot state will be pushed to homekit. The minimum refresh time is 60 seconds. You need this only when you set up rules based on the robot state and start him outside of homekit (e.g. with the Neato app).
|
||||
|
||||
The parameter **extraCareNavigation** sets if supporting models (currently Neato D3 and D5) should take extra care of your furniture while cleaning.
|
||||
|
||||
The parameter **disabled** accepts a list of switches/sensors that can be disabled in the neato homekit plugin (e.g. dock, dockstate, eco, schedule).
|
||||
|
||||
```json
|
||||
"platforms": [
|
||||
{
|
||||
"platform": "NeatoVacuumRobot",
|
||||
"email": "YourEmail",
|
||||
"password": "YourPassword",
|
||||
"refresh": "120",
|
||||
"extraCareNavigation": true,
|
||||
"disabled": ["dock", "dockstate", "eco"]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Tested robots
|
||||
|
||||
- BotVac Connected (Firmware 2.2.0)
|
||||
- BotVac D3 Connected
|
||||
- BotVac D5 Connected
|
||||
|
||||
If you have another connected neato robot, please [tell me](https://github.com/naofireblade/homebridge-neato/issues) your experience with this plugin.
|
||||
If you have another connected neato robot, please [tell me](https://github.com/naofireblade/homebridge-neato/issues) about your experience with this plugin.
|
1
_config.yml
Normal file
1
_config.yml
Normal file
@@ -0,0 +1 @@
|
||||
theme: jekyll-theme-cayman
|
376
index.js
376
index.js
@@ -1,164 +1,278 @@
|
||||
"use strict";
|
||||
var inherits = require('util').inherits;
|
||||
var debug = require('debug')('homebridge-neato');
|
||||
var botvac = require('node-botvac');
|
||||
var inherits = require('util').inherits,
|
||||
debug = require('debug')('homebridge-neato'),
|
||||
botvac = require('node-botvac'),
|
||||
|
||||
var Service, Characteristic;
|
||||
Service,
|
||||
Characteristic
|
||||
|
||||
module.exports = function (homebridge) {
|
||||
Service = homebridge.hap.Service;
|
||||
Characteristic = homebridge.hap.Characteristic;
|
||||
homebridge.registerAccessory("homebridge-neato", "NeatoVacuumRobot", NeatoVacuumRobot);
|
||||
homebridge.registerPlatform("homebridge-neato", "NeatoVacuumRobot", NeatoVacuumRobotPlatform);
|
||||
}
|
||||
|
||||
function NeatoVacuumRobot(log, config) {
|
||||
function NeatoVacuumRobotPlatform(log, config) {
|
||||
this.log = log;
|
||||
this.name = config['name'];
|
||||
this.serial = "1-3-3-7";
|
||||
this.email = config['email'];
|
||||
this.password = config['password'];
|
||||
this.hiddenServices = ('disabled' in config ? config['disabled'] : '');
|
||||
|
||||
this.lastUpdate = null;
|
||||
this.robot = null;
|
||||
this.careNavigation = ('extraCareNavigation' in config && config['extraCareNavigation'] ? 2 : 1);
|
||||
debug("Extra Care Navigation: " + this.careNavigation);
|
||||
|
||||
// default off
|
||||
this.refresh = ('refresh' in config ? parseInt(config['refresh']) : 0);
|
||||
// must be integer and positive
|
||||
this.refresh = (typeof this.refresh !=='number' || (this.refresh%1)!==0 || this.refresh < 0) ? 0 : this.refresh;
|
||||
// minimum 60s
|
||||
this.refresh = (this.refresh > 0 && this.refresh < 60) ? 60 : this.refresh;
|
||||
}
|
||||
|
||||
NeatoVacuumRobot.prototype = {
|
||||
NeatoVacuumRobotPlatform.prototype = {
|
||||
accessories: function(callback) {
|
||||
this.accessories = [];
|
||||
|
||||
let that = this;
|
||||
this.robots = this.getRobots(function () {
|
||||
for (var i = 0; i < that.robots.length; i++) {
|
||||
that.log("Found robot #" + (i+1) + ": " + that.robots[i].name);
|
||||
var robotAccessory = new NeatoVacuumRobotAccessory(that.robots[i], that);
|
||||
that.accessories.push(robotAccessory);
|
||||
}
|
||||
callback(that.accessories);
|
||||
});
|
||||
},
|
||||
|
||||
getRobots: function(callback) {
|
||||
debug("Get all robots");
|
||||
let client = new botvac.Client();
|
||||
let that = this;
|
||||
client.authorize(this.email, this.password, false, function (error) {
|
||||
if (error) {
|
||||
that.log(error);
|
||||
that.log.error("Can't log on to neato cloud. Please check your credentials.");
|
||||
callback();
|
||||
}
|
||||
else {
|
||||
client.getRobots(function (error, robots) {
|
||||
if (error) {
|
||||
that.log(error);
|
||||
that.log.error("Successful login but can't connect to your neato robot.");
|
||||
callback();
|
||||
}
|
||||
else {
|
||||
if (robots.length === 0) {
|
||||
that.log.error("Successful login but no robots associated with your account.");
|
||||
callback();
|
||||
}
|
||||
else {
|
||||
that.robots = robots;
|
||||
callback();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function NeatoVacuumRobotAccessory(robot, platform) {
|
||||
this.platform = platform;
|
||||
this.log = platform.log;
|
||||
this.refresh = platform.refresh;
|
||||
this.careNavigation = platform.careNavigation;
|
||||
this.hiddenServices = platform.hiddenServices;
|
||||
this.robot = robot;
|
||||
this.name = robot.name;
|
||||
this.lastUpdate = null;
|
||||
|
||||
this.vacuumRobotCleanService = new Service.Switch(this.name + " Clean", "clean");
|
||||
this.vacuumRobotGoToDockService = new Service.Switch(this.name + " Go to Dock", "goToDock");
|
||||
this.vacuumRobotDockStateService = new Service.OccupancySensor(this.name + " Dock", "dockState");
|
||||
this.vacuumRobotEcoService = new Service.Switch(this.name + " Eco Mode", "eco");
|
||||
this.vacuumRobotScheduleService = new Service.Switch(this.name + " Schedule", "schedule");
|
||||
this.vacuumRobotBatteryService = new Service.BatteryService("Battery", "battery");
|
||||
|
||||
this.updateRobotTimer();
|
||||
}
|
||||
|
||||
|
||||
NeatoVacuumRobotAccessory.prototype = {
|
||||
identify: function (callback) {
|
||||
this.log("Identify requested");
|
||||
callback();
|
||||
let that = this;
|
||||
this.updateRobot(function() {
|
||||
// hide serial and secret in log
|
||||
let _serial = that.robot._serial;
|
||||
let _secret = that.robot._secret;
|
||||
that.robot._serial = "*****";
|
||||
that.robot._secret = "*****";
|
||||
that.log(that.robot);
|
||||
that.robot._serial = _serial;
|
||||
that.robot._secret = _secret;
|
||||
callback();
|
||||
});
|
||||
},
|
||||
|
||||
getServices: function () {
|
||||
debug(this.robot._serial);
|
||||
this.informationService = new Service.AccessoryInformation();
|
||||
this.informationService
|
||||
.setCharacteristic(Characteristic.Name, this.robot.name)
|
||||
.setCharacteristic(Characteristic.Manufacturer, "Neato Robotics")
|
||||
.setCharacteristic(Characteristic.Model, this.name)
|
||||
.setCharacteristic(Characteristic.SerialNumber, this.serial);
|
||||
.setCharacteristic(Characteristic.Model, "Coming soon")
|
||||
.setCharacteristic(Characteristic.SerialNumber, this.robot._serial);
|
||||
|
||||
this.vacuumRobotCleanService = new Service.Switch(this.name + " Clean", "clean");
|
||||
this.vacuumRobotCleanService.getCharacteristic(Characteristic.On).on('set', this.clean.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.vacuumRobotGoToDockService = new Service.Switch(this.name + " Go to Dock", "goToDock");
|
||||
this.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).on('set', this.dock.bind(this));
|
||||
this.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).on('get', this.getCanGoToDock.bind(this));
|
||||
this.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).on('set', this.setGoToDock.bind(this));
|
||||
this.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).on('get', this.getGoToDock.bind(this));
|
||||
|
||||
this.vacuumRobotDockStateService = new Service.OccupancySensor(this.name + " Dock", "dockState");
|
||||
this.vacuumRobotDockStateService.getCharacteristic(Characteristic.OccupancyDetected).on('get', this.getDockState.bind(this));
|
||||
this.vacuumRobotDockStateService.getCharacteristic(Characteristic.OccupancyDetected).on('get', this.getDock.bind(this));
|
||||
|
||||
this.vacuumRobotEcoService = new Service.Switch(this.name + " Eco Mode", "eco");
|
||||
this.vacuumRobotEcoService.getCharacteristic(Characteristic.On).on('set', this.eco.bind(this));
|
||||
this.vacuumRobotEcoService.getCharacteristic(Characteristic.On).on('set', this.setEco.bind(this));
|
||||
this.vacuumRobotEcoService.getCharacteristic(Characteristic.On).on('get', this.getEco.bind(this));
|
||||
|
||||
this.vacuumRobotScheduleService = new Service.Switch(this.name + " Schedule", "schedule");
|
||||
this.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).on('set', this.schedule.bind(this));
|
||||
this.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).on('set', this.setSchedule.bind(this));
|
||||
this.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).on('get', this.getSchedule.bind(this));
|
||||
|
||||
this.vacuumRobotBatteryService = new Service.BatteryService("Battery", "battery");
|
||||
this.vacuumRobotBatteryService.getCharacteristic(Characteristic.BatteryLevel).on('get', this.getBatteryLevel.bind(this));
|
||||
this.vacuumRobotBatteryService.getCharacteristic(Characteristic.ChargingState).on('get', this.getBatteryChargingState.bind(this));
|
||||
|
||||
return [this.informationService, this.vacuumRobotCleanService, this.vacuumRobotGoToDockService, this.vacuumRobotDockStateService, this.vacuumRobotEcoService,
|
||||
this.vacuumRobotScheduleService, this.vacuumRobotBatteryService];
|
||||
this.services = [this.informationService, this.vacuumRobotCleanService, this.vacuumRobotBatteryService];
|
||||
if (this.hiddenServices.indexOf('dock') === -1)
|
||||
this.services.push(this.vacuumRobotGoToDockService);
|
||||
if (this.hiddenServices.indexOf('dockstate') === -1)
|
||||
this.services.push(this.vacuumRobotDockStateService);
|
||||
if (this.hiddenServices.indexOf('eco') === -1)
|
||||
this.services.push(this.vacuumRobotEcoService);
|
||||
if (this.hiddenServices.indexOf('schedule') === -1)
|
||||
this.services.push(this.vacuumRobotScheduleService);
|
||||
|
||||
return this.services;
|
||||
},
|
||||
|
||||
clean: function (on, callback) {
|
||||
setClean: function (on, callback) {
|
||||
let that = this;
|
||||
if (on) {
|
||||
this.getState(function (error, result) {
|
||||
if (that.robot.canResume === true) {
|
||||
debug("Resume cleaning");
|
||||
that.robot.resumeCleaning(function (error, result) {
|
||||
that.log(result);
|
||||
});
|
||||
this.updateRobot(function (error, result) {
|
||||
if (on) {
|
||||
if (that.robot.canResume || that.robot.canStart) {
|
||||
// wait for robot to start and then start a short timer to recognize when he can go to dock or is finished
|
||||
setTimeout(function() {
|
||||
clearTimeout(that.timer);
|
||||
that.updateRobotTimer();
|
||||
}, 10000);
|
||||
|
||||
if (that.robot.canResume) {
|
||||
debug(that.name + ": Resume cleaning");
|
||||
that.robot.resumeCleaning(callback);
|
||||
}
|
||||
else {
|
||||
debug(that.name + ": Start cleaning (" + that.careNavigation + ")");
|
||||
that.robot.startCleaning(that.robot.eco, that.careNavigation, callback);
|
||||
}
|
||||
}
|
||||
else {
|
||||
debug("Start cleaning");
|
||||
that.robot.startCleaning(that.robot.eco, function (error, result) {
|
||||
that.log(result);
|
||||
debug(that.name + ": Cant start, maybe already cleaning");
|
||||
callback();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (that.robot.canPause) {
|
||||
debug(that.name + ": Pause cleaning");
|
||||
that.robot.pauseCleaning(callback);
|
||||
}
|
||||
else {
|
||||
debug(that.name + ": Already stopped");
|
||||
callback();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
setGoToDock: function (on, callback) {
|
||||
let that = this;
|
||||
this.updateRobot(function (error, result) {
|
||||
if (on) {
|
||||
if (that.robot.canPause) {
|
||||
debug(that.name + ": Pause cleaning to go to dock");
|
||||
that.robot.pauseCleaning(function (error, result) {
|
||||
setTimeout(function() {
|
||||
debug("Go to dock");
|
||||
that.robot.sendToBase(callback);
|
||||
}, 1000);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
debug("Pause cleaning");
|
||||
this.robot.pauseCleaning(false, function (error, result) {
|
||||
that.log(result);
|
||||
});
|
||||
}
|
||||
callback();
|
||||
else if (that.robot.canGoToBase)
|
||||
{
|
||||
debug(that.name + ": Go to dock");
|
||||
that.robot.sendToBase(callback);
|
||||
}
|
||||
else {
|
||||
debug(that.name + ": Can't go to dock at the moment");
|
||||
callback();
|
||||
}
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
dock: function (on, callback) {
|
||||
let that = this;
|
||||
if (on) {
|
||||
debug("Go to dock");
|
||||
that.robot.sendToBase(false, function (error, result) {
|
||||
that.log(result);
|
||||
});
|
||||
}
|
||||
callback();
|
||||
},
|
||||
|
||||
eco: function (on, callback) {
|
||||
debug(on ? "Enable eco mode" : "Disable eco mode");
|
||||
setEco: function (on, callback) {
|
||||
debug(this.name + ": " + (on ? "Enable eco mode" : "Disable eco mode"));
|
||||
this.robot.eco = on;
|
||||
callback();
|
||||
},
|
||||
|
||||
schedule: function (on, callback) {
|
||||
setSchedule: function (on, callback) {
|
||||
let that = this;
|
||||
if (on) {
|
||||
debug("Enable schedule");
|
||||
this.robot.enableSchedule(false, function (error, result) {
|
||||
that.log(result);
|
||||
});
|
||||
}
|
||||
else {
|
||||
debug("Disable schedule");
|
||||
this.robot.disableSchedule(false, function (error, result) {
|
||||
that.log(result);
|
||||
});
|
||||
}
|
||||
callback();
|
||||
this.updateRobot(function (error, result) {
|
||||
if (on) {
|
||||
debug(that.name + ": Enable schedule");
|
||||
that.robot.enableSchedule(callback);
|
||||
}
|
||||
else {
|
||||
debug(that.name + ": Disable schedule");
|
||||
that.robot.disableSchedule(callback);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getClean: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Is cleaning: " + that.robot.canPause);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Is cleaning: " + that.robot.canPause);
|
||||
callback(false, that.robot.canPause);
|
||||
});
|
||||
},
|
||||
|
||||
getCanGoToDock: function(callback) {
|
||||
getGoToDock: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Can go to dock: " + that.robot.canGoToBase);
|
||||
callback(false, !that.robot.canGoToBase);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Can go to dock: " + that.robot.dockHasBeenSeen);
|
||||
callback(false, !that.robot.dockHasBeenSeen);
|
||||
});
|
||||
},
|
||||
|
||||
getDockState: function(callback) {
|
||||
getDock: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Is docked: " + that.robot.isDocked);
|
||||
callback(false, that.robot.isDocked);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Is docked: " + that.robot.isDocked);
|
||||
callback(false, that.robot.isDocked ? 1 : 0);
|
||||
});
|
||||
},
|
||||
|
||||
getEco: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Eco mode: " + that.robot.eco);
|
||||
callback(false, that.robot.eco);
|
||||
});
|
||||
// dont load eco here, because we cant save the eco state on the robot
|
||||
callback(false, this.robot.eco);
|
||||
},
|
||||
|
||||
getSchedule: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Schedule: " + that.robot.isScheduleEnabled);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Schedule: " + that.robot.isScheduleEnabled);
|
||||
callback(false, that.robot.isScheduleEnabled);
|
||||
});
|
||||
},
|
||||
@@ -166,41 +280,28 @@ NeatoVacuumRobot.prototype = {
|
||||
|
||||
getBatteryLevel: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Battery: " + that.robot.charge);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Battery: " + that.robot.charge);
|
||||
callback(false, that.robot.charge);
|
||||
});
|
||||
},
|
||||
|
||||
getBatteryChargingState: function(callback) {
|
||||
let that = this;
|
||||
this.getState(function (error, result) {
|
||||
debug("Is charging: " + that.robot.isCharging);
|
||||
this.updateRobot(function (error, result) {
|
||||
debug(that.name + ": Is charging: " + that.robot.isCharging);
|
||||
callback(false, that.robot.isCharging);
|
||||
});
|
||||
},
|
||||
|
||||
getState: function(callback) {
|
||||
updateRobot: function(callback) {
|
||||
let that = this;
|
||||
if (this.robot === null)
|
||||
{
|
||||
this.getRobot(function (error, result) {
|
||||
that._getState(callback);
|
||||
});
|
||||
}
|
||||
else {
|
||||
that._getState(callback);
|
||||
}
|
||||
},
|
||||
|
||||
_getState: function(callback) {
|
||||
if (this.lastUpdate !== null && new Date() - this.lastUpdate < 2000) {
|
||||
debug("Get info (cached)");
|
||||
debug(this.name + ": Update (cached)");
|
||||
callback();
|
||||
}
|
||||
else {
|
||||
debug("Get info (new)");
|
||||
let that = this;
|
||||
debug(this.name + ": Update (online)");
|
||||
this.robot.getState(function (error, result) {
|
||||
that.lastUpdate = new Date();
|
||||
callback();
|
||||
@@ -208,27 +309,42 @@ NeatoVacuumRobot.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
getRobot: function(callback) {
|
||||
debug("Get robot");
|
||||
let client = new botvac.Client();
|
||||
updateRobotTimer: function() {
|
||||
let that = this;
|
||||
client.authorize(this.email, this.password, false, function (error) {
|
||||
if (error) {
|
||||
that.log(error);
|
||||
debug(this.name + ": Timer called");
|
||||
this.updateRobot(function (error, result) {
|
||||
|
||||
// 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) {
|
||||
that.vacuumRobotCleanService.setCharacteristic(Characteristic.On, that.robot.canPause);
|
||||
}
|
||||
|
||||
if (that.vacuumRobotGoToDockService.getCharacteristic(Characteristic.On).value !== !that.robot.dockHasBeenSeen) {
|
||||
that.vacuumRobotGoToDockService.setCharacteristic(Characteristic.On, !that.robot.dockHasBeenSeen);
|
||||
}
|
||||
|
||||
if (that.vacuumRobotScheduleService.getCharacteristic(Characteristic.On).value !== that.robot.isScheduleEnabled) {
|
||||
that.vacuumRobotScheduleService.setCharacteristic(Characteristic.On, that.robot.isScheduleEnabled);
|
||||
}
|
||||
|
||||
// no commands here, values can be updated without problems
|
||||
that.vacuumRobotDockStateService.setCharacteristic(Characteristic.OccupancyDetected, that.robot.isDocked ? 1 : 0);
|
||||
that.vacuumRobotBatteryService.setCharacteristic(Characteristic.BatteryLevel, that.robot.charge);
|
||||
that.vacuumRobotBatteryService.setCharacteristic(Characteristic.ChargingState, that.robot.isCharging);
|
||||
|
||||
// dont update eco, because we cant write that value onto the robot and dont want it to be overwritten in our plugin
|
||||
|
||||
if (that.robot.canPause) {
|
||||
debug(that.name + ": Timer set (cleaning): 30s");
|
||||
that.timer = setTimeout(that.updateRobotTimer.bind(that), 30 * 1000);
|
||||
}
|
||||
else if (that.refresh != 0) {
|
||||
debug(that.name + ": Timer set (user): " + that.refresh + "s");
|
||||
that.timer = setTimeout(that.updateRobotTimer.bind(that), that.refresh * 1000);
|
||||
}
|
||||
else {
|
||||
client.getRobots(function (error, robots) {
|
||||
if (error) {
|
||||
that.log(error);
|
||||
}
|
||||
else {
|
||||
that.robot = robots[0];
|
||||
that.log("Found robot: " + that.robot.name);
|
||||
debug(that.robot);
|
||||
callback();
|
||||
}
|
||||
});
|
||||
debug(that.name + ": Timer stopped");
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homebridge-neato",
|
||||
"version": "0.2.0",
|
||||
"version": "0.4.5",
|
||||
"description": "A Neato vacuum robot plugin for homebridge.",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
@@ -20,7 +20,7 @@
|
||||
"url": "git://github.com/naofireblade/homebridge-neato.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-botvac": "^0.1.4",
|
||||
"node-botvac": ">=0.1.5",
|
||||
"debug": "^2.2.0"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user