6 Commits

Author SHA1 Message Date
Luis Riegger
0767779172 Add language support to README.md 2021-05-04 08:48:48 +02:00
Luis Riegger
bdb5807aeb Add language to plugin via dict object 2021-05-04 08:46:12 +02:00
Luis Riegger
010e177306 Add language selection to plugin schema 2021-05-04 08:32:42 +02:00
Arne Blumentritt
3af668399b Finalised v0.7.3 2021-04-25 21:41:23 +02:00
Arne Blumentritt
877c3d7d26 Fixed homebridge 1.3 warning because of additional parameter in setter callback 2021-04-25 20:05:46 +02:00
Arne Blumentritt
77945f8420 Fixed #61 Warnings in homebridge 1.3 because of illegal characteristic values 2021-04-25 19:35:34 +02:00
8 changed files with 168 additions and 138 deletions

View File

@@ -118,9 +118,5 @@
## 0.7.2 ## 0.7.2
* Fixed homebridge crash with multiple robots per account * Fixed homebridge crash with multiple robots per account
## 0.8.0 ## 0.7.3
* Add German plugin language (for example, this gives you a "Sauge Küche" Siri command for a zone called "Küche") * Fixed warnings since homebridge 1.3.0
* Added possibility to toggle between languages (English/German) in Homebridge UI Plugin Settings
## 0.8.1
* Include Robot name in Homekit battery service name

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2020 Luis Riegger Copyright (c) 2017 Arne Blumentritt
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

104
README.md
View File

@@ -1,10 +1,15 @@
# homebridge-kobold # homebridge-neato
[![npm](https://img.shields.io/npm/v/homebridge-neato)](https://www.npmjs.com/package/homebridge-neato)
[![npm](https://img.shields.io/npm/dt/homebridge-neato)](https://www.npmjs.com/package/homebridge-neato?activeTab=versions)
[![GitHub last commit](https://img.shields.io/github/last-commit/naofireblade/homebridge-neato)](https://github.com/naofireblade/homebridge-neato)
This is a plugin for [homebridge](https://github.com/nfarina/homebridge) to control your [Vorwerk Kobold](https://kobold.vorwerk.de/saugroboter/) VR300 vacuum robot. You can download it via [npm](https://www.npmjs.com/package/homebridge-kobold). This is a plugin for [homebridge](https://github.com/nfarina/homebridge) to control your [Neato](https://www.neatorobotics.com/) vacuum robot. You can download it via [npm](https://www.npmjs.com/package/homebridge-neato).
It is based on a fork of naofireblade's [homebridge-neato](https://github.com/naofireblade/homebridge-neato), merged with the oAuth authentication mechanism from nicoh88's [homebridge-vorwerk](https://github.com/nicoh88/homebridge-vorwerk). If you like this plugin and find it useful, I would be forever grateful for your support:
The interaction with the Server is handled by the underlying [node-kobold-control](https://github.com/himbeles/node-kobold-control) module. <a href="https://www.buymeacoffee.com/naofireblade" target="_blank"><img width="140" src="https://bmc-cdn.nyc3.digitaloceanspaces.com/BMC-button-images/custom_images/orange_img.png" alt="Buy Me A Coffee"></a>
Feel free to leave any feedback [here](https://github.com/naofireblade/homebridge-neato/issues).
## Features ## Features
@@ -12,10 +17,10 @@ The interaction with the Server is handled by the underlying [node-kobold-contro
- Eco mode - Eco mode
- Extra care navigation - Extra care navigation
- Nogo lines - Nogo lines
- Zone cleaning <sup>[1](#change-room)</sup> - Zone cleaning <sup>[1](#d7)</sup><sup>, </sup><sup>[2](#change-room)</sup>
- Spot cleaning - Spot cleaning
- Individual spot size <sup>[2](#eve)</sup> - Individual spot size <sup>[1](#d7)</sup><sup>, </sup><sup>[3](#eve)</sup>
- Clean twice <sup>[2](#eve)</sup> - Clean twice <sup>[3](#eve)</sup>
- Return to dock - Return to dock
- Find the robot - Find the robot
- Schedule (de)activation - Schedule (de)activation
@@ -26,8 +31,9 @@ The interaction with the Server is handled by the underlying [node-kobold-contro
- Model and firmware version - Model and firmware version
- Automatic or periodic refresh of robot state - Automatic or periodic refresh of robot state
- Multiple robots - Multiple robots
- Multiple language support (en, de, fr)
- German or English Language Setting > <b name="d7">1</b> Only available on the Neato D7.
> <b name="change-room">2</b> You can send the robot from one room to another as well. He will return to the base, wait there some seconds and then starts cleaning the next room. > <b name="change-room">2</b> You can send the robot from one room to another as well. He will return to the base, wait there some seconds and then starts cleaning the next room.
@@ -38,65 +44,27 @@ The interaction with the Server is handled by the underlying [node-kobold-contro
## Installation ## Installation
1. Install homebridge using: `npm install -g homebridge` 1. Install homebridge using: `npm install -g homebridge`
2. Install this plugin using: `npm install -g homebridge-kobold` 2. Install this plugin using: `npm install -g homebridge-neato`
3. Update your configuration file. See the sample below. 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 email and password. Add the following information to your config file. Change the values for email and password.
### Simple ### Simple
```json ```json
"platforms": [ "platforms": [
{ {
"platform": "KoboldVacuumRobot", "platform": "NeatoVacuumRobot",
"token": "YourToken", "email": "YourEmail",
"language": "de" "password": "YourPassword",
} "language": "de"
}
] ]
``` ```
You can get a token using the following two curl commands:
```bash
# This will trigger the email sending
curl -X "POST" "https://mykobold.eu.auth0.com/passwordless/start" \
-H 'Content-Type: application/json' \
-d '{
"send": "code",
"email": "ENTER_YOUR_EMAIL_HERE",
"client_id": "KY4YbVAvtgB7lp8vIbWQ7zLk3hssZlhR",
"connection": "email"
}'
```
==== wait for the email to be received ====
```bash
# this will generate a token using the numbers you received via email
# replace the value of otp 123456 with the value you received from the email
curl -X "POST" "https://mykobold.eu.auth0.com/oauth/token" \
-H 'Content-Type: application/json' \
-d '{
"prompt": "login",
"grant_type": "http://auth0.com/oauth/grant-type/passwordless/otp",
"scope": "openid email profile read:current_user",
"locale": "en",
"otp": "123456",
"source": "vorwerk_auth0",
"platform": "ios",
"audience": "https://mykobold.eu.auth0.com/userinfo",
"username": "ENTER_YOUR_EMAIL_HERE",
"client_id": "KY4YbVAvtgB7lp8vIbWQ7zLk3hssZlhR",
"realm": "email",
"country_code": "DE"
}'
```
From the output, you want to copy the `id_token` value.
The `language` can be `de` for German, or `en` for English.
### Advanced ### Advanced
Below are explanations for advanced parameters to adjust the plugin to your needs. All parameters are *optional*. Below are explanations for advanced parameters to adjust the plugin to your needs. All parameters are *optional*.
@@ -112,16 +80,24 @@ List of plugin features that you don't want to use in homekit (e.g. `dock`, `doc
```json ```json
"platforms": [ "platforms": [
{ {
"platform": "KoboldVacuumRobot", "platform": "NeatoVacuumRobot",
"token": "YourToken", "email": "YourEmail",
"refresh": "120", "password": "YourPassword",
"hidden": ["dock", "dockstate", "eco", "nogolines", "extracare", "schedule", "find", "spot"], "language": "de",
"language": "de" "refresh": "120",
} "hidden": ["dock", "dockstate", "eco", "nogolines", "extracare", "schedule", "find", "spot"]
}
] ]
``` ```
## Tested robots ## Tested robots
- Vorwerk Kobold VR300 The plugin is successfully tested with all Neato Connected Robots.
## Contributors
Many thanks go to
- [ghulands](https://github.com/ghulands) for finding and fixing a bug when no robot is associated with the neato account
- [Berkay](https://github.com/btutal) for adding the schema file to use the plugin with homebridge-config-ui-x
- [Antoine de Maleprade](https://github.com/az0uz) for adding the zone cleaning feature
- [DJay](https://github.com/DJay-X) for testing out tons of new beta versions

1
_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman

View File

@@ -1,4 +1,4 @@
const debug = require('debug')('homebridge-kobold'); const debug = require('debug')('homebridge-neato');
const colors = require('colors'); const colors = require('colors');
const CustomUUID = { const CustomUUID = {
@@ -21,10 +21,10 @@ module.exports = function (_Service, _Characteristic)
SpotHeightCharacteristic = require('../characteristics/spotHeight')(Characteristic, CustomUUID); SpotHeightCharacteristic = require('../characteristics/spotHeight')(Characteristic, CustomUUID);
SpotRepeatCharacteristic = require('../characteristics/spotRepeat')(Characteristic, CustomUUID); SpotRepeatCharacteristic = require('../characteristics/spotRepeat')(Characteristic, CustomUUID);
return KoboldVacuumRobotAccessory; return NeatoVacuumRobotAccessory;
}; };
function KoboldVacuumRobotAccessory(platform, robotObject) function NeatoVacuumRobotAccessory(platform, robotObject)
{ {
this.platform = platform; this.platform = platform;
this.log = platform.log; this.log = platform.log;
@@ -64,6 +64,19 @@ function KoboldVacuumRobotAccessory(platform, robotObject)
"findMe": "Finde mich", "findMe": "Finde mich",
"cleanSpot": "Spot Reinigung", "cleanSpot": "Spot Reinigung",
"battery": "Batterie" "battery": "Batterie"
},
'fr': {
"clean": "Aspirer",
"clean the": "Aspirer",
"goToDock": "Retour à la base",
"dockState": "Sur la base",
"eco": "Eco mode",
"noGoLines": "Lignes NoGo",
"extraCare": "Extra Care",
"schedule": "Planifier",
"findMe": "Me retrouver",
"cleanSpot": "Nettoyage local",
"battery": "Batterie"
} }
}[this.platform.language] }[this.platform.language]
@@ -128,7 +141,7 @@ function KoboldVacuumRobotAccessory(platform, robotObject)
this.log("Added cleaning device named: " + this.name); this.log("Added cleaning device named: " + this.name);
} }
KoboldVacuumRobotAccessory.prototype = { NeatoVacuumRobotAccessory.prototype = {
identify: function (callback) identify: function (callback)
{ {
this.robot.getState((error, result) => this.robot.getState((error, result) =>
@@ -150,7 +163,7 @@ KoboldVacuumRobotAccessory.prototype = {
{ {
this.informationService = new Service.AccessoryInformation(); this.informationService = new Service.AccessoryInformation();
this.informationService this.informationService
.setCharacteristic(Characteristic.Manufacturer, "Vorwerk Deutschland Stiftung & Co. KG") .setCharacteristic(Characteristic.Manufacturer, "Neato Robotics")
.setCharacteristic(Characteristic.Model, this.meta.modelName) .setCharacteristic(Characteristic.Model, this.meta.modelName)
.setCharacteristic(Characteristic.SerialNumber, this.robot._serial) .setCharacteristic(Characteristic.SerialNumber, this.robot._serial)
.setCharacteristic(Characteristic.FirmwareRevision, this.meta.firmware) .setCharacteristic(Characteristic.FirmwareRevision, this.meta.firmware)
@@ -260,12 +273,14 @@ KoboldVacuumRobotAccessory.prototype = {
if (this.robot.canResume) if (this.robot.canResume)
{ {
debug(this.name + ": ## Resume cleaning"); debug(this.name + ": ## Resume cleaning");
this.robot.resumeCleaning(callback); this.robot.resumeCleaning((error) =>
{
callback(error);
});
} }
// Start cleaning // Start cleaning
else if (this.robot.canStart) else if (this.robot.canStart)
{ {
debug(this.name + ": ## Start cleaning");
this.clean(callback); this.clean(callback);
} }
// Cannot start // Cannot start
@@ -302,7 +317,10 @@ KoboldVacuumRobotAccessory.prototype = {
if (this.robot.canPause) if (this.robot.canPause)
{ {
debug(this.name + ": ## Pause cleaning"); debug(this.name + ": ## Pause cleaning");
this.robot.pauseCleaning(callback); this.robot.pauseCleaning((error) =>
{
callback(error);
});
} }
else else
{ {
@@ -338,12 +356,8 @@ KoboldVacuumRobotAccessory.prototype = {
if (error) if (error)
{ {
this.log.error("Cannot start cleaning. " + error + ": " + JSON.stringify(result)); this.log.error("Cannot start cleaning. " + error + ": " + JSON.stringify(result));
callback(true);
}
else
{
callback();
} }
callback(error);
}); });
} }
// Room cleaning // Room cleaning
@@ -354,12 +368,8 @@ KoboldVacuumRobotAccessory.prototype = {
if (error) if (error)
{ {
this.log.error("Cannot start room cleaning. " + error + ": " + JSON.stringify(result)); this.log.error("Cannot start room cleaning. " + error + ": " + JSON.stringify(result));
callback(true);
}
else
{
callback();
} }
callback(error);
}); });
} }
// Spot cleaning // Spot cleaning
@@ -370,12 +380,8 @@ KoboldVacuumRobotAccessory.prototype = {
if (error) if (error)
{ {
this.log.error("Cannot start spot cleaning. " + error + ": " + JSON.stringify(result)); this.log.error("Cannot start spot cleaning. " + error + ": " + JSON.stringify(result));
callback(true);
}
else
{
callback();
} }
callback(error);
}); });
} }
}, },
@@ -399,14 +405,20 @@ KoboldVacuumRobotAccessory.prototype = {
setTimeout(() => setTimeout(() =>
{ {
debug(this.name + ": ## Go to dock"); debug(this.name + ": ## Go to dock");
this.robot.sendToBase(callback); this.robot.sendToBase(() =>
{
callback();
});
}, 1000); }, 1000);
}); });
} }
else if (this.robot.canGoToBase) else if (this.robot.canGoToBase)
{ {
debug(this.name + ": ## Go to dock"); debug(this.name + ": ## Go to dock");
this.robot.sendToBase(callback); this.robot.sendToBase(() =>
{
callback();
});
} }
else else
{ {
@@ -485,12 +497,18 @@ KoboldVacuumRobotAccessory.prototype = {
if (on) if (on)
{ {
debug(this.name + ": " + "Enabled".brightGreen + " Schedule"); debug(this.name + ": " + "Enabled".brightGreen + " Schedule");
this.robot.enableSchedule(callback); this.robot.enableSchedule((error) =>
{
callback(error);
});
} }
else else
{ {
debug(this.name + ": " + "Disabled".red + " Schedule"); debug(this.name + ": " + "Disabled".red + " Schedule");
this.robot.disableSchedule(callback); this.robot.disableSchedule((error) =>
{
callback(error);
});
} }
}); });
}, },
@@ -510,13 +528,16 @@ KoboldVacuumRobotAccessory.prototype = {
this.findMeService.setCharacteristic(Characteristic.On, false); this.findMeService.setCharacteristic(Characteristic.On, false);
}, 1000); }, 1000);
this.robot.findMe(callback); this.robot.findMe((error) =>
{
callback(error);
});
} }
}, },
getSpotClean: function (callback) getSpotClean: function (callback)
{ {
callback(); callback(false, this.spotCleanService.getCharacteristic(Characteristic.On).value);
}, },
setSpotClean: function (on, callback) setSpotClean: function (on, callback)
@@ -556,7 +577,10 @@ KoboldVacuumRobotAccessory.prototype = {
if (this.robot.canPause) if (this.robot.canPause)
{ {
debug(this.name + ": ## Pause cleaning"); debug(this.name + ": ## Pause cleaning");
this.robot.pauseCleaning(callback); this.robot.pauseCleaning((error) =>
{
callback(error);
});
} }
else else
{ {
@@ -674,8 +698,13 @@ KoboldVacuumRobotAccessory.prototype = {
if (this.spotPlusFeatures) if (this.spotPlusFeatures)
{ {
this.spotCleanService.setCharacteristic(SpotWidthCharacteristic, this.robot.spotWidth); let widthProps = this.spotCleanService.getCharacteristic(SpotWidthCharacteristic).props;
this.spotCleanService.setCharacteristic(SpotHeightCharacteristic, this.robot.spotHeight); let heightProps = this.spotCleanService.getCharacteristic(SpotHeightCharacteristic).props;
this.spotCleanService.setCharacteristic(SpotWidthCharacteristic,
this.robot.spotWidth >= widthProps.minValue && this.robot.spotWidth <= widthProps.maxValue ? this.robot.spotWidth : widthProps.minValue);
this.spotCleanService.setCharacteristic(SpotHeightCharacteristic,
this.robot.spotHeight >= heightProps.minValue && this.robot.spotHeight <= heightProps.maxValue ? this.robot.spotHeight : heightProps.minValue);
} }
} }
@@ -692,4 +721,4 @@ KoboldVacuumRobotAccessory.prototype = {
}); });
} }
} }
}; };

View File

@@ -1,15 +1,22 @@
{ {
"pluginAlias": "KoboldVacuumRobot", "pluginAlias": "NeatoVacuumRobot",
"pluginType": "platform", "pluginType": "platform",
"headerDisplay": "For Advanced settings like the refresh time interval or disabled switches/sensors. [Check Here](https://github.com/himbeles/homebridge-kobold#readme)", "headerDisplay": "For Advanced settings like Refresh time interval or Disabled switches/sensors. [Check Here](https://github.com/naofireblade/homebridge-neato#readme)",
"schema": { "schema": {
"type": "object", "type": "object",
"properties": { "properties": {
"token": { "email": {
"title": "token", "title": "email",
"type": "string",
"required": true,
"format": "email",
"description": "Your Email Address"
},
"password": {
"title": "password",
"type": "string", "type": "string",
"required": true, "required": true,
"description": "Your Token" "description": "Your Password"
}, },
"language": { "language": {
"title": "language", "title": "language",
@@ -27,10 +34,16 @@
"enum": [ "enum": [
"de" "de"
] ]
},
{
"title": "French",
"enum": [
"fr"
]
} }
], ],
"required": true "required": true
} }
} }
} }
} }

View File

@@ -1,25 +1,26 @@
"use strict"; "use strict";
let inherits = require('util').inherits, let inherits = require('util').inherits,
debug = require('debug')('homebridge-kobold'), debug = require('debug')('homebridge-neato'),
control = require('node-kobold-control'), botvac = require('node-botvac'),
Service, Service,
Characteristic, Characteristic,
KoboldVacuumRobotAccessory; NeatoVacuumRobotAccessory;
module.exports = function (homebridge) module.exports = function (homebridge)
{ {
Service = homebridge.hap.Service; Service = homebridge.hap.Service;
Characteristic = homebridge.hap.Characteristic; Characteristic = homebridge.hap.Characteristic;
KoboldVacuumRobotAccessory = require('./accessories/koboldVacuumRobot')(Service, Characteristic); NeatoVacuumRobotAccessory = require('./accessories/neatoVacuumRobot')(Service, Characteristic);
homebridge.registerPlatform("homebridge-kobold", "KoboldVacuumRobot", KoboldVacuumRobotPlatform); homebridge.registerPlatform("homebridge-neato", "NeatoVacuumRobot", NeatoVacuumRobotPlatform);
}; };
function KoboldVacuumRobotPlatform(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.token = config['token']; this.email = config['email'];
this.password = config['password'];
this.language = config['language']; this.language = config['language'];
this.hiddenServices = ''; this.hiddenServices = '';
this.hiddenServices = ('disabled' in config ? config['disabled'] : this.hiddenServices); this.hiddenServices = ('disabled' in config ? config['disabled'] : this.hiddenServices);
@@ -35,10 +36,10 @@ function KoboldVacuumRobotPlatform(log, config)
this.refresh = parseInt(config['refresh']); this.refresh = parseInt(config['refresh']);
// must be integer and positive // must be integer and positive
this.refresh = (typeof this.refresh !== 'number' || (this.refresh % 1) !== 0 || this.refresh < 0) ? 60 : this.refresh; this.refresh = (typeof this.refresh !== 'number' || (this.refresh % 1) !== 0 || this.refresh < 0) ? 60 : this.refresh;
// minimum 60s to save some load on the Vorwerk servers // minimum 60s to save some load on the neato servers
if (this.refresh > 0 && this.refresh < 60) if (this.refresh > 0 && this.refresh < 60)
{ {
this.log.warn("Minimum refresh time is 60 seconds to not overload the Vorwerk servers"); this.log.warn("Minimum refresh time is 60 seconds to not overload the neato servers");
this.refresh = (this.refresh > 0 && this.refresh < 60) ? 60 : this.refresh; this.refresh = (this.refresh > 0 && this.refresh < 60) ? 60 : this.refresh;
} }
} }
@@ -50,7 +51,7 @@ function KoboldVacuumRobotPlatform(log, config)
this.log("Refresh is set to: " + this.refresh + (this.refresh !== 'auto' ? ' seconds' : '')); this.log("Refresh is set to: " + this.refresh + (this.refresh !== 'auto' ? ' seconds' : ''));
} }
KoboldVacuumRobotPlatform.prototype = { NeatoVacuumRobotPlatform.prototype = {
accessories: function (callback) accessories: function (callback)
{ {
debug("Get robots"); debug("Get robots");
@@ -60,8 +61,8 @@ KoboldVacuumRobotPlatform.prototype = {
this.getRobots(() => this.getRobots(() =>
{ {
// // MOCK MULTIPLE ROBOTS START // // MOCK MULTIPLE ROBOTS START
// let client = new control.Client(); // let client = new botvac.Client();
// client.authorize(this.token, (error) => // client.authorize(this.email, this.password, false, (error) =>
// { // {
// client.getRobots((error, robs) => // client.getRobots((error, robs) =>
// { // {
@@ -76,7 +77,7 @@ KoboldVacuumRobotPlatform.prototype = {
{ {
this.log("Found robot #" + (i + 1) + " named \"" + robot.device.name + "\" with serial \"" + robot.device._serial.substring(0, 9) + "XXXXXXXXXXXX\""); this.log("Found robot #" + (i + 1) + " named \"" + robot.device.name + "\" with serial \"" + robot.device._serial.substring(0, 9) + "XXXXXXXXXXXX\"");
let mainAccessory = new KoboldVacuumRobotAccessory(this, robot); let mainAccessory = new NeatoVacuumRobotAccessory(this, robot);
accessories.push(mainAccessory); accessories.push(mainAccessory);
robot.mainAccessory = mainAccessory; robot.mainAccessory = mainAccessory;
@@ -87,7 +88,7 @@ KoboldVacuumRobotPlatform.prototype = {
// // MOCK ZONE CLEANING START // // MOCK ZONE CLEANING START
// robot.boundary = {name: "Testroom", id: "1"}; // robot.boundary = {name: "Testroom", id: "1"};
// let roomAccessory = new KoboldVacuumRobotAccessory(this, robot); // let roomAccessory = new NeatoVacuumRobotAccessory(this, robot);
// accessories.push(roomAccessory); // accessories.push(roomAccessory);
// robot.roomAccessories.push(roomAccessory); // robot.roomAccessories.push(roomAccessory);
// // MOCK ZONE CLEANING END // // MOCK ZONE CLEANING END
@@ -103,7 +104,7 @@ KoboldVacuumRobotPlatform.prototype = {
if (boundary.type === "polygon") if (boundary.type === "polygon")
{ {
robot.boundary = boundary; robot.boundary = boundary;
let roomAccessory = new KoboldVacuumRobotAccessory(this, robot); let roomAccessory = new NeatoVacuumRobotAccessory(this, robot);
accessories.push(roomAccessory); accessories.push(roomAccessory);
robot.roomAccessories.push(roomAccessory); robot.roomAccessories.push(roomAccessory);
@@ -126,14 +127,14 @@ KoboldVacuumRobotPlatform.prototype = {
getRobots: function (callback) getRobots: function (callback)
{ {
debug("Loading your robots"); debug("Loading your robots");
let client = new control.Client(); let client = new botvac.Client();
// Login // Login
client.authorize(this.token, (error) => client.authorize(this.email, this.password, false, (error) =>
{ {
if (error) if (error)
{ {
this.log.error("Can't log on to Vorwerk cloud. Please check your internet connection and your token. Try again later if the Vorwerk servers have issues: " + error); this.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: " + error);
callback(); callback();
} }
else else
@@ -143,7 +144,7 @@ KoboldVacuumRobotPlatform.prototype = {
{ {
if (error) if (error)
{ {
this.log.error("Successful login but can't connect to your Vorwerk robot: " + error); this.log.error("Successful login but can't connect to your neato robot: " + error);
callback(); callback();
} }
else if (robots.length === 0) else if (robots.length === 0)

View File

@@ -1,29 +1,43 @@
{ {
"name": "homebridge-kobold", "name": "homebridge-neato",
"version": "0.8.0", "version": "0.7.3",
"description": "A Vorwerk Kobold vacuum robot plugin for homebridge.", "description": "A Neato vacuum robot plugin for homebridge.",
"license": "MIT", "license": "MIT",
"keywords": [ "keywords": [
"homebridge-plugin", "homebridge-plugin",
"vorwerk", "neato",
"kobold" "botvac"
], ],
"engines": { "engines": {
"node": ">=0.12.0", "node": ">=0.12.0",
"homebridge": ">=0.2.0" "homebridge": ">=0.2.0"
}, },
"author": { "author": {
"name": "Luis R.", "name": "Arne Blumentritt",
"url2": "https://github.com/himbeles" "url2": "https://github.com/naofireblade"
}, },
"contributors": [
{
"name": "ghulands",
"url": "https://github.com/ghulands"
},
{
"name": "Berkay",
"url": "https://github.com/btutal"
},
{
"name": "Antoine de Maleprade",
"url": "https://github.com/az0uz"
}
],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/himbeles/homebridge-kobold.git" "url": "git://github.com/naofireblade/homebridge-neato.git"
}, },
"dependencies": { "dependencies": {
"colors": "^1.4.0", "colors": "^1.4.0",
"debug": "^4.1.1", "debug": "^4.1.1",
"node-kobold-control": ">=0.4.0", "node-botvac": ">=0.4.0",
"uuid": "^3.3.2" "uuid": "^3.3.2"
} }
} }