eslint compliance

This commit is contained in:
Luis Riegger 2021-05-10 20:51:29 +02:00
parent 9a9789328f
commit 82808d7850
8 changed files with 334 additions and 277 deletions

View File

@ -1,7 +1,9 @@
import type { Characteristic, WithUUID } from 'homebridge'; import type { Characteristic, WithUUID } from 'homebridge';
import { Formats, Perms } from 'homebridge'; import { Formats, Perms } from 'homebridge';
export default function spotHeight(CustomCharacteristic: typeof Characteristic): WithUUID<new () => Characteristic> { export default function spotHeight(
CustomCharacteristic: typeof Characteristic,
): WithUUID<new () => Characteristic> {
return class SpotHeight extends CustomCharacteristic { return class SpotHeight extends CustomCharacteristic {
static readonly UUID = 'CA282DB2-62BF-4325-A1BE-F8BB5478781A'; static readonly UUID = 'CA282DB2-62BF-4325-A1BE-F8BB5478781A';
@ -12,7 +14,7 @@ export default function spotHeight(CustomCharacteristic: typeof Characteristic):
maxValue: 400, maxValue: 400,
minValue: 100, minValue: 100,
minStep: 50, minStep: 50,
perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE] perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE],
}); });
} }
}; };

View File

@ -1,14 +1,16 @@
import type { Characteristic, WithUUID } from 'homebridge'; import type { Characteristic, WithUUID } from 'homebridge';
import { Formats, Perms } from 'homebridge'; import { Formats, Perms } from 'homebridge';
export default function spotRepeat(CustomCharacteristic: typeof Characteristic): WithUUID<new () => Characteristic> { export default function spotRepeat(
CustomCharacteristic: typeof Characteristic,
): WithUUID<new () => Characteristic> {
return class SpotRepeat extends CustomCharacteristic { return class SpotRepeat extends CustomCharacteristic {
static readonly UUID = '1E79C603-63B8-4E6A-9CE1-D31D67981831'; static readonly UUID = '1E79C603-63B8-4E6A-9CE1-D31D67981831';
constructor() { constructor() {
super('Spot 2x', SpotRepeat.UUID, { super('Spot 2x', SpotRepeat.UUID, {
format: Formats.BOOL, format: Formats.BOOL,
perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE] perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE],
}); });
} }
}; };

View File

@ -1,7 +1,9 @@
import type { Characteristic, WithUUID } from 'homebridge'; import type { Characteristic, WithUUID } from 'homebridge';
import { Formats, Perms } from 'homebridge'; import { Formats, Perms } from 'homebridge';
export default function spotWidth(CustomCharacteristic: typeof Characteristic): WithUUID<new () => Characteristic> { export default function spotWidth(
CustomCharacteristic: typeof Characteristic,
): WithUUID<new () => Characteristic> {
return class SpotWidth extends CustomCharacteristic { return class SpotWidth extends CustomCharacteristic {
static readonly UUID = 'A7889A9A-2F27-4293-BEF8-3FE805B36F4E'; static readonly UUID = 'A7889A9A-2F27-4293-BEF8-3FE805B36F4E';
@ -12,7 +14,7 @@ export default function spotWidth(CustomCharacteristic: typeof Characteristic):
maxValue: 400, maxValue: 400,
minValue: 100, minValue: 100,
minStep: 50, minStep: 50,
perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE] perms: [Perms.PAIRED_READ, Perms.PAIRED_WRITE],
}); });
} }
}; };

View File

@ -1,6 +1,6 @@
import { RobotService } from "./models/services"; import { RobotService } from './models/services';
export const BACKGROUND_INTERVAL = 30; export const BACKGROUND_INTERVAL = 30;
export const PREFIX = false; export const PREFIX = false;
export const ALL_SERVICES = new Set(Object.values(RobotService)); export const ALL_SERVICES = new Set(Object.values(RobotService));
export const LOCALE = "en" export const LOCALE = 'en';

View File

@ -1,17 +1,25 @@
import {API, Characteristic, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service} from "homebridge"; import {
import KoboldApi from "node-kobold-control"; API,
import {PLATFORM_NAME, PLUGIN_NAME} from "./settings"; Characteristic,
import {KoboldVacuumRobotAccessory} from "./accessories/koboldVacuumRobot"; DynamicPlatformPlugin,
Logger,
PlatformAccessory,
PlatformConfig,
Service,
} from 'homebridge';
import KoboldApi from 'node-kobold-control';
import { PLATFORM_NAME, PLUGIN_NAME } from './settings';
import { KoboldVacuumRobotAccessory } from './accessories/koboldVacuumRobot';
/** /**
* HomebridgePlatform * HomebridgePlatform
* This class is the main constructor for your plugin, this is where you should * This class is the main constructor for your plugin, this is where you should
* parse the user config and discover/register accessories with Homebridge. * parse the user config and discover/register accessories with Homebridge.
*/ */
export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin {
{
public readonly Service: typeof Service = this.api.hap.Service; public readonly Service: typeof Service = this.api.hap.Service;
public readonly Characteristic: typeof Characteristic = this.api.hap.Characteristic; public readonly Characteristic: typeof Characteristic =
this.api.hap.Characteristic;
// this is used to track restored cached accessories // this is used to track restored cached accessories
public readonly cachedRobotAccessories: PlatformAccessory[] = []; public readonly cachedRobotAccessories: PlatformAccessory[] = [];
@ -19,9 +27,9 @@ export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin
constructor( constructor(
public readonly log: Logger, public readonly log: Logger,
public readonly config: PlatformConfig, public readonly config: PlatformConfig,
public readonly api: API) public readonly api: API,
{ ) {
this.api.on("didFinishLaunching", () => { this.api.on('didFinishLaunching', () => {
this.discoverRobots(); this.discoverRobots();
}); });
} }
@ -30,25 +38,24 @@ export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin
* This function is invoked when homebridge restores cached accessories from disk at startup. * This function is invoked when homebridge restores cached accessories from disk at startup.
* It should be used to setup event handlers for characteristics and update respective values. * It should be used to setup event handlers for characteristics and update respective values.
*/ */
configureAccessory(accessory: PlatformAccessory) configureAccessory(accessory: PlatformAccessory) {
{
// add the restored accessory to the accessories cache so we can track if it has already been registered // add the restored accessory to the accessories cache so we can track if it has already been registered
this.cachedRobotAccessories.push(accessory); this.cachedRobotAccessories.push(accessory);
} }
discoverRobots() {
discoverRobots()
{
const client = new KoboldApi.Client(); const client = new KoboldApi.Client();
try try {
{
// Login // Login
client.authorize((this.config)["token"], (error) => { client.authorize(this.config['token'], (error) => {
if (error) if (error) {
{ this.log.error(
this.log.error("Cannot connect to Vorwerk server. No new robots will be found and existing robots will be unresponsive. Retrying in 5 minutes."); `Cannot connect to Vorwerk server.
this.log.error("Error: " + error); No new robots will be found and existing robots will be unresponsive.
Retrying in 5 minutes.`,
);
this.log.error('Error: ' + error);
setTimeout(() => { setTimeout(() => {
this.discoverRobots(); this.discoverRobots();
@ -58,10 +65,11 @@ export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin
// Get all robots from account // Get all robots from account
client.getRobots((error, robots) => { client.getRobots((error, robots) => {
if (error) if (error) {
{ this.log.error(
this.log.error("Successful login but can't list the robots in your Vorwerk robots. Retrying in 5 minutes."); 'Successful login but can\'t list the robots in your Vorwerk robots. Retrying in 5 minutes.',
this.log.error("Error: " + error); );
this.log.error('Error: ' + error);
setTimeout(() => { setTimeout(() => {
this.discoverRobots(); this.discoverRobots();
@ -70,89 +78,133 @@ export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin
} }
// Vorwerk robots in account // Vorwerk robots in account
if (robots.length === 0) if (robots.length === 0) {
{ this.log.error('Vorwerk account has no robots.');
this.log.error("Vorwerk account has no robots."); } else {
} this.log.info(
else 'Vorwerk account has ' +
{ robots.length +
this.log.info("Vorwerk account has " + robots.length + " robot" + (robots.length === 1 ? "" : "s")); ' robot' +
(robots.length === 1 ? '' : 's'),
);
} }
// Vorwerk robots in cache // Vorwerk robots in cache
this.log.debug("Plugin Cache has " + this.cachedRobotAccessories.length + " robot" + (this.cachedRobotAccessories.length === 1 ? "" : "s")); this.log.debug(
for (let cachedRobot of this.cachedRobotAccessories) 'Plugin Cache has ' +
{ this.cachedRobotAccessories.length +
let accountRobot = robots.find(robot => this.api.hap.uuid.generate(robot._serial) === cachedRobot.UUID); ' robot' +
if (accountRobot) (this.cachedRobotAccessories.length === 1 ? '' : 's'),
{ );
this.log.debug("[" + cachedRobot.displayName + "] Cached robot found in Vorwerk account."); for (const cachedRobot of this.cachedRobotAccessories) {
} const accountRobot = robots.find(
else (robot) =>
{ this.api.hap.uuid.generate(robot._serial) === cachedRobot.UUID,
this.log.error("[" + cachedRobot.displayName + "] Cached robot not found in Vorwerk account. Robot will now be removed from homebridge."); );
this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [cachedRobot]); if (accountRobot) {
this.log.debug(
'[' +
cachedRobot.displayName +
'] Cached robot found in Vorwerk account.',
);
} else {
this.log.error(
'[' +
cachedRobot.displayName +
'] Cached robot not found in Vorwerk account. Robot will now be removed from homebridge.',
);
this.api.unregisterPlatformAccessories(
PLUGIN_NAME,
PLATFORM_NAME,
[cachedRobot],
);
} }
} }
// Add / Update homebridge accessories with robot information from Vorwerk. This must be done for new and existing robots to reflect changes in the name, firmware, pluginconfig etc. // Add / Update homebridge accessories with robot information from Vorwerk.
for (let robot of robots) // This must be done for new and existing robots to reflect changes in the name, firmware, pluginconfig etc.
{ for (const robot of robots) {
// Check if robot already exists as an accessory // Check if robot already exists as an accessory
const uuid = this.api.hap.uuid.generate(robot._serial); const uuid = this.api.hap.uuid.generate(robot._serial);
const cachedRobot = this.cachedRobotAccessories.find(accessory => accessory.UUID === uuid); const cachedRobot = this.cachedRobotAccessories.find(
(accessory) => accessory.UUID === uuid,
);
if (cachedRobot) if (cachedRobot) {
{ this.log.debug(
this.log.debug("[" + robot.name + "] Connecting to cached robot and updating information."); '[' +
} robot.name +
else '] Connecting to cached robot and updating information.',
{ );
this.log.debug("[" + robot.name + "] Connecting to new robot and updating information."); } else {
this.log.debug(
'[' +
robot.name +
'] Connecting to new robot and updating information.',
);
} }
robot.getState((error, state) => { robot.getState((error, state) => {
if (error) if (error) {
{ this.log.error(
this.log.error("[" + robot.name + "] Cannot connect to robot. Is the robot connected to the internet? Retrying in 5 minutes."); '[' +
this.log.error("Error: " + error); robot.name +
'] Cannot connect to robot. Is the robot connected to the internet? Retrying in 5 minutes.',
);
this.log.error('Error: ' + error);
setTimeout(() => { setTimeout(() => {
this.discoverRobots(); this.discoverRobots();
}, 5 * 60 * 1000); }, 5 * 60 * 1000);
} } else {
else try {
{
try
{
robot.meta = state.meta; robot.meta = state.meta;
robot.availableServices = state.availableServices; robot.availableServices = state.availableServices;
// Update existing robot accessor // Update existing robot accessor
if (cachedRobot) if (cachedRobot) {
{
// TODO update maps // TODO update maps
cachedRobot.context.robot = robot; cachedRobot.context.robot = robot;
this.api.updatePlatformAccessories([cachedRobot]); this.api.updatePlatformAccessories([cachedRobot]);
new KoboldVacuumRobotAccessory(this, cachedRobot, this.config); new KoboldVacuumRobotAccessory(
this.log.info("[" + robot.name + "] Successfully loaded robot from cache"); this,
} cachedRobot,
this.config,
);
this.log.info(
'[' +
robot.name +
'] Successfully loaded robot from cache',
);
} else {
// Create new robot accessory // Create new robot accessory
else
{
// TODO get maps // TODO get maps
const newRobot = new this.api.platformAccessory(robot.name, uuid); const newRobot = new this.api.platformAccessory(
robot.name,
uuid,
);
newRobot.context.robot = robot; newRobot.context.robot = robot;
new KoboldVacuumRobotAccessory(this, newRobot, this.config); new KoboldVacuumRobotAccessory(this, newRobot, this.config);
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [newRobot]); this.api.registerPlatformAccessories(
this.log.info("[" + robot.name + "] Successfully created as new robot"); PLUGIN_NAME,
PLATFORM_NAME,
[newRobot],
);
this.log.info(
'[' + robot.name + '] Successfully created as new robot',
);
} }
} } catch (error) {
catch (error) this.log.error(
{ '[' +
this.log.error("[" + robot.name + "] Creating accessory failed. Error: " + error); robot.name +
throw new this.api.hap.HapStatusError(this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE); '] Creating accessory failed. Error: ' +
error,
);
throw new this.api.hap.HapStatusError(
this.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE,
);
} }
} }
@ -210,10 +262,12 @@ export class HomebridgeKoboldPlatform implements DynamicPlatformPlugin
} }
}); });
}); });
} } catch (error) {
catch (error) this.log.error(
{ `Can't log on to Vorwerk cloud. Please check your internet connection and your credentials.
this.log.error("Can't log on to Vorwerk cloud. Please check your internet connection and your credentials. Try again later if the neato servers have issues. Error: " + error); Try again later if the neato servers have issues. Error: ` +
error,
);
} }
} }
} }

View File

@ -1,12 +1,11 @@
import {API} from "homebridge"; import { API } from 'homebridge';
import {PLATFORM_NAME} from "./settings"; import { PLATFORM_NAME } from './settings';
import {HomebridgeKoboldPlatform} from "./homebridgeKoboldPlatform"; import { HomebridgeKoboldPlatform } from './homebridgeKoboldPlatform';
/** /**
* This method registers the platform with Homebridge * This method registers the platform with Homebridge
*/ */
export = (api: API) => export = (api: API) => {
{
api.registerPlatform(PLATFORM_NAME, HomebridgeKoboldPlatform); api.registerPlatform(PLATFORM_NAME, HomebridgeKoboldPlatform);
}; };

View File

@ -1,5 +1,4 @@
export class Options export class Options {
{
public eco: boolean; public eco: boolean;
public extraCare: boolean; public extraCare: boolean;
public noGoLines: boolean; public noGoLines: boolean;
@ -8,8 +7,7 @@ export class Options
public spotWidth: number; public spotWidth: number;
public spotHeight: number; public spotHeight: number;
constructor() constructor() {
{
this.eco = false; this.eco = false;
this.extraCare = false; this.extraCare = false;
this.noGoLines = false; this.noGoLines = false;

View File

@ -4,16 +4,16 @@ export enum CleanType {
} }
export enum RobotService { export enum RobotService {
CLEAN = "clean", CLEAN = 'clean',
CLEAN_SPOT = "cleanSpot", CLEAN_SPOT = 'cleanSpot',
CLEAN_ZONE = "cleanZone", CLEAN_ZONE = 'cleanZone',
GO_TO_DOCK = "goToDock", GO_TO_DOCK = 'goToDock',
DOCKED = "dockState", DOCKED = 'dockState',
BIN_FULL = "binFull", BIN_FULL = 'binFull',
FIND_ME = "findMe", FIND_ME = 'findMe',
SCHEDULE = "schedule", SCHEDULE = 'schedule',
ECO = "eco", ECO = 'eco',
NOGO_LINES = "noGoLines", NOGO_LINES = 'noGoLines',
EXTRA_CARE = "extraCare", EXTRA_CARE = 'extraCare',
BATTERY = "battery", BATTERY = 'battery',
} }