npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-kobold

v0.2.0

Published

Vorwerk Kobold API for VR200 and VR300

Downloads

62

Readme

node-kobold

A node module for Vorwerk Kobold VR200 and VR300.

Based on Pmant's node-botvac, thanks to tomrosenback's PHP Port, kangguru's and naofireblade's work on the undocumented Neato / Vorwerk API.

Installation

npm install node-kobold

Usage Example (old auth using password)

var kobold = require('node-kobold');

var client = new kobold.Client();
//authorize
client.authorize('email', 'password', false, function (error) {
    if (error) {
        console.log(error);
        return;
    }
    //get your robots
    client.getRobots(function (error, robots) {
        if (error) {
            console.log(error);
            return;
        }
        if (robots.length) {
            //do something        
            robots[0].getState(function (error, result) {
               console.log(result);
            });
        }
    });
});

Usage OAuth2 (for i.e. MyKobold app)

var kobold = require('node-kobold');

var client = new kobold.Client();
//authorize
client.setToken(token);

//get your robots
client.getRobots(function (error, robots) {
    if (error) {
        console.log(error);
        return;
    }
    if (robots.length) {
        //do something        
        robots[0].getState(function (error, result) {
            console.log(result);
        });
    }
});

Getting a token

You can get a token using the following two curl commands:

# 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 ====

# 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.

Client API

  • client.authorize()
  • client.setToken()
  • client.getRobots()

client.authorize(email, password, force, callback)

Login at the Vorwerk api.

  • email - your Vorwerk email
  • password - your Vorwerk passwort
  • force - force login if already authorized
  • callback - function(error)
    • error null if no error occurred

client.setToken(token)

Set a token that you already gathered via the oauth workflow

  • token - the OAuth token you acquired

client.getRobots(callback)

Returns an array containing your registered robots.

  • callback - function(error, robots)
    • error null if no error occurred
    • robots array - your robots

Robot Properties

  • robot.name - nickname of this robot (cannot be changed)

These properties will be updated every time robot.getState() is called:

  • robot.isCharging boolean
  • robot.isDocked boolean
  • robot.isScheduleEnabled boolean
  • robot.dockHasBeenSeen boolean
  • robot.charge number - charge in percent
  • robot.canStart boolean - robot is ready to start cleaning
  • robot.canStop boolean - cleaning can be stopped
  • robot.canPause boolean - cleaning can be paused
  • robot.canResume boolean - cleaning can be resumed
  • robot.canGoToBase boolean - robot can be sent to base
  • robot.eco boolean - set to true to clean in eco mode
  • robot.noGoLines boolean - set to true to enable noGoLines
  • robot.navigationMode number - 1: normal, 2: extra care (new models only)
  • robot.spotWidth number - width for spot cleaning in cm
  • robot.spotHeight number - height for spot cleaning in cm
  • robot.spotRepeat boolean - set to true to clean spot two times

Robot API

  • robot.getState()
  • robot.getSchedule()
  • robot.enableSchedule()
  • robot.disableSchedule()
  • robot.startCleaning()
  • robot.startSpotCleaning()
  • robot.stopCleaning()
  • robot.pauseCleaning()
  • robot.resumeCleaning()
  • robot.sendToBase()

robot.getState([callback])

Returns the state object of the robot. Also updates all robot properties.

  • callback - function(error, state)
    • error null if no error occurred
    • state object
      • example:

VR200

var state = {
  version: 1,
  reqId: '1',
  result: 'ok',
  error: 'ui_alert_invalid',
  data: {},
  state: 1,
  action: 0,
  cleaning: {
    category: 2,
    mode: 1,
    modifier: 1,
    spotWidth: 0,
    spotHeight: 0
  },
  details: {
    isCharging: false,
    isDocked: true,
    isScheduleEnabled: false,
    dockHasBeenSeen: false,
    charge: 98
  },
  availableCommands: {
    start: true,
    stop: false,
    pause: false,
    resume: false,
    goToBase: false
  },
  availableServices: {
    houseCleaning: 'basic-1',
    spotCleaning: 'basic-1',
    manualCleaning: 'basic-1',
    easyConnect: 'basic-1',
    schedule: 'basic-1'
  },
  meta: {
    modelName: 'VR200',
    firmware: '2.1.3'
  }
};

VR300

var state = {
  version: 1,
  reqId: '1',
  result: 'ok',
  data: {},
  error: null,
  alert: null,
  state: 1,
  action: 0,
  cleaning: {
    category: 4,
    mode: 1,
    modifier: 1,
    navigationMode: 1,
    mapId: '',
    spotWidth: 0,
    spotHeight: 0
  },
  details: {
    isCharging: false,
    isDocked: true,
    isScheduleEnabled: false,
    dockHasBeenSeen: false,
    charge: 99
  },
  availableCommands: {
    start: true,
    stop: false,
    pause: false,
    resume: false,
    goToBase: false
  },
  availableServices: {
    findMe: 'basic-1',
    generalInfo: 'basic-1',
    houseCleaning: 'basic-3',
    IECTest: 'advanced-1',
    logCopy: 'basic-1',
    manualCleaning: 'basic-1',
    maps: 'advanced-1',
    preferences: 'basic-1',
    schedule: 'basic-1',
    softwareUpdate: 'basic-1',
    spotCleaning: 'basic-1',
    wifi: 'basic-1'
  },
  meta: {
    modelName: 'VR220',
    firmware: '4.2.4-162'
  }
};

robot.getSchedule([callback])

Returns the scheduling state of the robot.

  • callback - function(error, schedule)
    • error null if no error occurred
    • schedule boolean - true if scheduling is enabled

robot.enableSchedule([callback])

Enables scheduling.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if scheduling got enabled

robot.disableSchedule([callback])

Disables scheduling.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if scheduling got disabled

robot.startCleaning([eco], [navigationMode], [noGoLines], [callback])

Start cleaning.

  • eco boolean - clean in eco mode
  • navigationMode number - 1: normal, 2: extra care (new neato models only)
  • noGoLines boolean - clean with enabled nogo lines
  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if cleaning could be started

robot.startSpotCleaning([eco], [width], [height], [repeat], [navigationMode], [callback])

Start spot cleaning.

  • eco boolean - clean in eco mode
  • width number - spot width in cm (min 100cm)
  • height number - spot height in cm (min 100cm)
  • repeat boolean - clean spot two times
  • navigationMode number - 1: normal, 2: extra care (new neato models only)
  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if spot cleaning could be started

robot.stopCleaning([callback])

Stop cleaning.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if cleaning could be stopped

robot.pauseCleaning([callback])

Pause cleaning.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if cleaning could be paused

robot.resumeCleaning([callback])

Resume cleaning.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if cleaning could be resumed

robot.sendToBase([callback])

Send robot to base.

  • callback - function(error, result)
    • error null if no error occurred
    • result string - 'ok' if robot could be sent to base

Changelog

0.1.0

  • (nicoh88) initial release

0.1.2

  • (nicoh88) update for npmjs

0.1.3

  • (nicoh88) NoGo Lines and options sync
  • (nicoh88) Syncing cleaning options from last runupdate for npmjs

0.2.0

  • (carlambroselli) Add oauth2 option