Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Neato Botvac Connected Adapter

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Neato Botvac Connected Adapter

    This topic has been deleted. Only users with topic management privileges can see it.
    • Matten Matten
      Matten Matten last edited by

      @tempestas:

      Wollte nur anmerken, dass der Botvac D5 doch deutlich weniger Optionen hat, als der VR200. Spotbreite und Länge kann man z.B. nicht einstellen.

      Frage: gibt es hier jemanden, der im Adapter eine Möglichkeit sieht, die "Extra Care" Funktion des Botvac abzugreifen?

      Diese Funktion führt dazu, dass der Robo mehr Abstand zu Möbeln und Co. hält - bei mir ist das z.B. wichtig, weil er ohne diese Funktion immer wirklich auf den cm exakt zwischen die Stuhlbeine fährt und dann nicht mehr rauskommt.

      Ich selber bin dafür leider nicht bewandert genug `

      Moin, habe es geschafft das navigationMode mit zu integrieren.

      (mit meinem kleinen botvac D3)

      1= normal

      2= extra care

      @Pmant

      Kannst du das bitte im Adapter mit integrieren? oder kann ich das über "github.com/Pmant/ioBroker.botvac" selbst ändern?

      main.js

      ! ```
      `/**

      • botvac adapter

      */

      ! /* jshint -W097 */// jshint strict:false
      /*jslint node: true /
      "use strict";
      ! var utils = require(__dirname + '/lib/utils'); // Get common adapter utils
      var botvac = require('node-botvac');
      var client = new botvac.Client();
      var allRobotNames = [];
      var allRobots = {};
      var init = false;
      var polltimer;
      var pollInterval;
      var restartTimer;
      ! // adapter will be restarted automatically every time as the configuration changed, e.g system.adapter.botvac.0
      var adapter = utils.adapter('botvac');
      ! // is called when adapter shuts down - callback has to be called under any circumstances!
      adapter.on('unload', function (callback) {
      callback();
      });
      ! // is called if a subscribed state changes
      adapter.on('stateChange', function (id, state) {
      // you can use the ack flag to detect if it is status (true) or command (false)
      if (init && state && !state.ack) {
      var arr = id.split('.');
      if (arr.length !== 5) {
      return;
      }
      var robotName = arr[2];
      var channel = arr[3];
      var command = arr[4];
      if (allRobotNames.indexOf(robotName) === -1) {
      adapter.log.warn('state change in unknown device: ' + robotName);
      return;
      } else if (channel !== 'commands') {
      adapter.log.warn('state change in unknown channel: ' + channel);
      return;
      }
      ! switch (command) {
      case 'schedule':
      if (state.val) {
      allRobots[robotName].enableSchedule(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot enable schedule ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      adapter.setState(robotName + '.status.isScheduleEnabled', true, true);
      });
      } else {
      allRobots[robotName].disableSchedule(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot disable schedule ' + robotName);
      adapter.setState(id, true, true);
      return;
      }
      adapter.setState(id, false, true);
      adapter.setState(robotName + '.status.isScheduleEnabled', false, true);
      });
      }
      break;
      case 'clean':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use stop state if you want to stop cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canStart !== true) {
      adapter.log.warn('cannot start cleaning ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //start cleaning
      allRobots[robotName].startCleaning(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot start cleaning (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'cleanSpot':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use stop state if you want to stop cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canStart !== true) {
      adapter.log.warn('cannot start cleaning ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //start cleaning
      allRobots[robotName].startSpotCleaning(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot start cleaning (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'pause':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use resume or stop state if you want to resume or stop cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canPause !== true) {
      adapter.log.warn('cannot pause cleaning ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //pause cleaning
      allRobots[robotName].pauseCleaning(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot pause cleaning (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'resume':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use pause or stop state if you want to pause or stop cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canResume !== true) {
      adapter.log.warn('cannot resume cleaning ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //resume cleaning
      allRobots[robotName].resumeCleaning(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot resume cleaning (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'stop':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use start or resume state if you want to start or resume cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canStop !== true) {
      adapter.log.warn('cannot stop cleaning ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //stop cleaning
      allRobots[robotName].stopCleaning(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot stop cleaning (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'goToBase':
      if (!state.val) {
      adapter.setState(id, false, true);
      adapter.log.warn('use start state if you want to start cleaning ' + robotName);
      return;
      }
      updateRobot(allRobots[robotName], function (error) {
      if (error) {
      return;
      }
      if (allRobots[robotName].canGoToBase !== true) {
      adapter.log.warn('cannot go to base ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      //go to base
      allRobots[robotName].sendToBase(function (error, result) {
      if (error || result !== 'ok') {
      adapter.log.warn('cannot go to base (2) ' + robotName);
      adapter.setState(id, false, true);
      return;
      }
      adapter.setState(id, true, true);
      setTimeout(function () {
      updateRobot(allRobots[robotName]);
      }, 1000);
      });
      });
      break;
      case 'eco':
      allRobots[robotName].eco = state.val;
      adapter.setState(id, state.val, true);
      break;
      case 'navigationMode':
      allRobots[robotName].navigationMode = state.val;
      adapter.setState(id, state.val, true);
      break;
      case 'spotWidth':
      allRobots[robotName].spotWidth = state.val;
      adapter.setState(id, state.val, true);
      break;
      case 'spotHeight':
      allRobots[robotName].spotHeight = state.val;
      adapter.setState(id, state.val, true);
      break;
      case 'spotRepeat':
      allRobots[robotName].spotRepeat = state.val;
      adapter.setState(id, state.val, true);
      break;
      default:
      adapter.log.warn('unknown command: ' + command);
      return;
      }
      }
      });
      ! // is called when databases are connected and adapter received configuration.
      // start here!
      adapter.on('ready', function () {
      main();
      });
      ! function restart(ms) {
      clearTimeout(restartTimer);
      clearInterval(polltimer);
      init = false;
      restartTimer = setTimeout(main, ms);
      }
      ! function main() {
      clearInterval(polltimer);
      allRobotNames = [];
      allRobots = {};
      var mail = adapter.config.mail;
      var password = adapter.config.password;
      ! client.authorize(mail, password, false, function (error) {
      if (error) {
      adapter.log.warn('login failed');
      restart(300000);
      return;
      }
      client.getRobots(function (error, robots) {
      if (error || !robots.length) {
      adapter.log.warn('no robots found');
      restart(300000);
      return;
      }
      var devices = {};
      for (var i = 0; i < robots.length; i++) {
      if (robots[i].name) {
      devices[robots[i].name] = {
      'status': {
      common: 'meta',
      states: {
      'reachable': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      def: false,
      role: 'indicator.reachable'
      }
      },
      'lastResult': {
      common: {
      type: 'string',
      read: true,
      write: false,
      role: 'text'
      }
      },
      'error': {
      common: {
      type: 'string',
      read: true,
      write: false,
      role: 'text'
      }
      },
      'state': {
      common: {
      type: 'number',
      read: true,
      write: false,
      role: 'value'
      }
      },
      'action': {
      common: {
      type: 'number',
      read: true,
      write: false,
      role: 'value'
      }
      },
      'lastCleaning': {
      common: {
      type: 'string',
      read: true,
      write: false,
      role: 'text'
      }
      },
      'isCharging': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'isScheduleEnabled': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'isDocked': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'dockHasBeenSeen': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'charge': {
      common: {
      type: 'number',
      read: true,
      write: false,
      role: 'value.battery'
      }
      },
      'canStart': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'canStop': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'canPause': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'canResume': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'canGoToBase': {
      common: {
      type: 'boolean',
      read: true,
      write: false,
      role: 'indicator'
      }
      },
      'modelName': {
      common: {
      type: 'string',
      read: true,
      write: false,
      role: 'text'
      }
      },
      'firmware': {
      common: {
      type: 'string',
      read: true,
      write: false,
      role: 'text'
      }
      }
      }
      },
      'commands': {
      common: 'button',
      states: {
      'schedule': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'clean': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'eco': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'navigationMode': {
      common: {
      type: 'number',
      read: true,
      write: true,
      def: 1,
      role: 'level'
      }
      },
      'cleanSpot': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'spotWidth': {
      common: {
      type: 'number',
      read: true,
      write: true,
      def: 100,
      min: 100,
      unit: 'cm',
      role: 'level.width'
      }
      },
      'spotHeight': {
      common: {
      type: 'number',
      read: true,
      write: true,
      def: 100,
      min: 100,
      unit: 'cm',
      role: 'level.height'
      }
      },
      'spotRepeat': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'pause': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'resume': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'stop': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      },
      'goToBase': {
      common: {
      type: 'boolean',
      read: true,
      write: true,
      def: false,
      role: 'switch'
      }
      }
      }
      }
      };
      allRobots[robots[i].name] = robots[i];
      }
      }
      createDevices(devices, function () {
      adapter.log.info('devices found: ' + robots.length);
      adapter.getDevices(function (err, devices) {
      if (Array.isArray(devices)) {
      for (var i = 0; i < devices.length; i++) {
      allRobotNames.push(devices[i].common.name);
      }
      }
      //subscribe all states in namespace
      init = true;
      adapter.subscribeStates('
      ');
      pollInterval = adapter.config.pollInterval || 120;
      pollInterval = 1000;
      if (pollInterval < 60000) pollInterval = 60000;
      polltimer = setInterval(update, pollInterval);
      update();
      });
      });
      });
      });
      }
      ! function update() {
      for (var i = 0; i < allRobotNames.length; i++) {
      updateRobot(allRobots[allRobotNames[i]]);
      }
      ! /

      client.getRobots(function (error, robots) {
      adapter.log.warn('getRobots!');
      if (error || !robots.length) {
      adapter.log.warn('update error or no robot found ' + error);
      restart(300000);
      return;
      }
      for (var i = 0; i < allRobotNames.length; i++) {
      var k = null;
      //check if robot retrieved
      for (var j = 0; j < robots.length; j++) {
      if (robots[j].name === allRobotNames[i]) {
      k = j;
      }
      if (allRobotNames.indexOf(robots[j].name) === -1) {
      adapter.log.warn('new robot found');
      restart(5000);
      return;
      }
      }
      //robot not retrieved
      if (k === null) {
      adapter.setState(allRobotNames[i] + '.status.reachable', false, true);
      continue;
      }
      //update robot
      adapter.setState(allRobotNames[i] + '.status.reachable', true, true);
      updateRobot(robots[k]);
      }
      });
      */
      }
      ! function updateRobot(robot, callback) {
      if (!init) {
      return;
      }
      robot.getState(function (error, state) {
      if (error || !state) {
      adapter.log.warn('could not update robot ' + robot.name);
      adapter.setState(robot.name + '.status.reachable', true, false);
      restart(pollInterval);
      if (typeof callback === 'function') {
      callback('could not update robot' + robot.name);
      }
      return;
      }
      adapter.setState(robot.name + '.status.reachable', true, true);
      adapter.setState(robot.name + '.status.lastResult', state.result, true);
      adapter.setState(robot.name + '.status.error', state.error, true);
      adapter.setState(robot.name + '.status.state', state.state, true);
      adapter.setState(robot.name + '.status.action', state.action, true);
      var lastCleaning = state.cleaning.category === 1 ? 'manual' : state.cleaning.category === 2 ? 'auto' : 'spot';
      lastCleaning += state.cleaning.mode === 1 ? ' eco' : ' turbo';
      lastCleaning += state.cleaning.modifier === 2 ? ' x2' : '';
      adapter.setState(robot.name + '.status.lastCleaning', lastCleaning, true);
      adapter.setState(robot.name + '.status.isCharging', state.details.isCharging, true);
      adapter.setState(robot.name + '.status.isDocked', state.details.isDocked, true);
      adapter.setState(robot.name + '.status.isScheduleEnabled', state.details.isScheduleEnabled, true);
      adapter.setState(robot.name + '.commands.schedule', state.details.isScheduleEnabled, true);
      adapter.setState(robot.name + '.status.dockHasBeenSeen', state.details.dockHasBeenSeen, true);
      adapter.setState(robot.name + '.status.charge', state.details.charge, true);
      adapter.setState(robot.name + '.status.canStart', state.availableCommands.start, true);
      if (state.availableCommands.start) {
      adapter.setState(robot.name + '.commands.clean', false, true);
      adapter.setState(robot.name + '.commands.cleanSpot', false, true);
      }
      adapter.setState(robot.name + '.status.canStop', state.availableCommands.stop, true);
      if (state.availableCommands.stop) {
      adapter.setState(robot.name + '.commands.stop', false, true);
      }
      adapter.setState(robot.name + '.status.canPause', state.availableCommands.pause, true);
      if (state.availableCommands.pause) {
      adapter.setState(robot.name + '.commands.pause', false, true);
      }
      adapter.setState(robot.name + '.status.canResume', state.availableCommands.resume, true);
      if (state.availableCommands.resume) {
      adapter.setState(robot.name + '.commands.resume', false, true);
      }
      adapter.setState(robot.name + '.status.canGoToBase', state.availableCommands.goToBase, true);
      if (state.availableCommands.goToBase) {
      adapter.setState(robot.name + '.commands.goToBase', false, true);
      }
      adapter.setState(robot.name + '.status.modelName', state.meta.modelName, true);
      adapter.setState(robot.name + '.status.firmware', state.meta.firmware, true);
      if (typeof callback === 'function') {
      callback(null);
      }
      });
      }
      ! function createDevices(devices, callback) {
      var keys = Object.keys(devices);
      if (!keys.length) return callback();
      var device = keys.shift();
      adapter.getObject(device, function (err, obj) {
      //next device if device exists
      if (obj) {
      delete devices[device];
      createDevices(devices, callback);
      return;
      }
      //create device
      adapter.createDevice(device, function () {
      //create channels for device
      createChannels(device, devices[device], function () {
      //next device
      delete devices[device];
      createDevices(devices, callback);
      });
      });
      });
      }
      ! function createChannels(device, channels, callback) {
      var keys = Object.keys(channels);
      if (!keys.length) return callback();
      var channel = keys.shift();
      adapter.createChannel(device, channel, channels[channel].common, function () {
      //create states
      createStates(
      device,
      channel,
      channels[channel].states,
      function () {
      //create next channel
      delete channels[channel];
      createChannels(device, channels, callback);
      }
      );
      });
      }
      ! function createStates(device, channel, states, callback) {
      var keys = Object.keys(states);
      if (!keys.length) return callback();
      var state = keys.shift();
      adapter.createState(device, channel, state, states[state].common, function () {
      //create next state
      delete states[state];
      createStates(device, channel, states, callback);
      });
      }`
      3476_iobroker.admin-01.10.2017_13_00_04.png [/i][/i][/i][/i][/i][/i]

      1 Reply Last reply Reply Quote 0
      • P
        Pman last edited by

        @Matten Matten:

        @Pmant

        Kannst du das bitte im Adapter mit integrieren? oder kann ich das über "github.com/Pmant/ioBroker.botvac" selbst ändern? `

        Wenn du einen GitHub-Account hast, kannst du das Projekt Forken (bzw. einfach bei main.js auf das Editor-Symbol gehen). Sobald du dort deine Änderungen eingepflegt hast, kannst du das einen Pull-Request erstellen, so dass ich die Änderung auch in mein Repository übernehmen kann.

        1 Reply Last reply Reply Quote 0
        • Matten Matten
          Matten Matten last edited by

          @Matten Matten:

          @tempestas:

          Wollte nur anmerken, dass der Botvac D5 doch deutlich weniger Optionen hat, als der VR200. Spotbreite und Länge kann man z.B. nicht einstellen.

          Frage: gibt es hier jemanden, der im Adapter eine Möglichkeit sieht, die "Extra Care" Funktion des Botvac abzugreifen?

          Diese Funktion führt dazu, dass der Robo mehr Abstand zu Möbeln und Co. hält - bei mir ist das z.B. wichtig, weil er ohne diese Funktion immer wirklich auf den cm exakt zwischen die Stuhlbeine fährt und dann nicht mehr rauskommt.

          Ich selber bin dafür leider nicht bewandert genug `

          Moin, habe es geschafft das navigationMode mit zu integrieren.

          (mit meinem kleinen botvac D3)

          1= normal

          2= extra care

          @Pmant

          Kannst du das bitte im Adapter mit integrieren? oder kann ich das über "github.com/Pmant/ioBroker.botvac" selbst ändern?

          main.js

          ! ```
          `/**

          • botvac adapter

          */

          ! /* jshint -W097 */// jshint strict:false
          /*jslint node: true /
          "use strict";
          ! var utils = require(__dirname + '/lib/utils'); // Get common adapter utils
          var botvac = require('node-botvac');
          var client = new botvac.Client();
          var allRobotNames = [];
          var allRobots = {};
          var init = false;
          var polltimer;
          var pollInterval;
          var restartTimer;
          ! // adapter will be restarted automatically every time as the configuration changed, e.g system.adapter.botvac.0
          var adapter = utils.adapter('botvac');
          ! // is called when adapter shuts down - callback has to be called under any circumstances!
          adapter.on('unload', function (callback) {
          callback();
          });
          ! // is called if a subscribed state changes
          adapter.on('stateChange', function (id, state) {
          // you can use the ack flag to detect if it is status (true) or command (false)
          if (init && state && !state.ack) {
          var arr = id.split('.');
          if (arr.length !== 5) {
          return;
          }
          var robotName = arr[2];
          var channel = arr[3];
          var command = arr[4];
          if (allRobotNames.indexOf(robotName) === -1) {
          adapter.log.warn('state change in unknown device: ' + robotName);
          return;
          } else if (channel !== 'commands') {
          adapter.log.warn('state change in unknown channel: ' + channel);
          return;
          }
          ! switch (command) {
          case 'schedule':
          if (state.val) {
          allRobots[robotName].enableSchedule(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot enable schedule ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          adapter.setState(robotName + '.status.isScheduleEnabled', true, true);
          });
          } else {
          allRobots[robotName].disableSchedule(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot disable schedule ' + robotName);
          adapter.setState(id, true, true);
          return;
          }
          adapter.setState(id, false, true);
          adapter.setState(robotName + '.status.isScheduleEnabled', false, true);
          });
          }
          break;
          case 'clean':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use stop state if you want to stop cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canStart !== true) {
          adapter.log.warn('cannot start cleaning ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //start cleaning
          allRobots[robotName].startCleaning(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot start cleaning (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'cleanSpot':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use stop state if you want to stop cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canStart !== true) {
          adapter.log.warn('cannot start cleaning ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //start cleaning
          allRobots[robotName].startSpotCleaning(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot start cleaning (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'pause':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use resume or stop state if you want to resume or stop cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canPause !== true) {
          adapter.log.warn('cannot pause cleaning ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //pause cleaning
          allRobots[robotName].pauseCleaning(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot pause cleaning (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'resume':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use pause or stop state if you want to pause or stop cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canResume !== true) {
          adapter.log.warn('cannot resume cleaning ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //resume cleaning
          allRobots[robotName].resumeCleaning(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot resume cleaning (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'stop':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use start or resume state if you want to start or resume cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canStop !== true) {
          adapter.log.warn('cannot stop cleaning ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //stop cleaning
          allRobots[robotName].stopCleaning(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot stop cleaning (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'goToBase':
          if (!state.val) {
          adapter.setState(id, false, true);
          adapter.log.warn('use start state if you want to start cleaning ' + robotName);
          return;
          }
          updateRobot(allRobots[robotName], function (error) {
          if (error) {
          return;
          }
          if (allRobots[robotName].canGoToBase !== true) {
          adapter.log.warn('cannot go to base ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          //go to base
          allRobots[robotName].sendToBase(function (error, result) {
          if (error || result !== 'ok') {
          adapter.log.warn('cannot go to base (2) ' + robotName);
          adapter.setState(id, false, true);
          return;
          }
          adapter.setState(id, true, true);
          setTimeout(function () {
          updateRobot(allRobots[robotName]);
          }, 1000);
          });
          });
          break;
          case 'eco':
          allRobots[robotName].eco = state.val;
          adapter.setState(id, state.val, true);
          break;
          case 'navigationMode':
          allRobots[robotName].navigationMode = state.val;
          adapter.setState(id, state.val, true);
          break;
          case 'spotWidth':
          allRobots[robotName].spotWidth = state.val;
          adapter.setState(id, state.val, true);
          break;
          case 'spotHeight':
          allRobots[robotName].spotHeight = state.val;
          adapter.setState(id, state.val, true);
          break;
          case 'spotRepeat':
          allRobots[robotName].spotRepeat = state.val;
          adapter.setState(id, state.val, true);
          break;
          default:
          adapter.log.warn('unknown command: ' + command);
          return;
          }
          }
          });
          ! // is called when databases are connected and adapter received configuration.
          // start here!
          adapter.on('ready', function () {
          main();
          });
          ! function restart(ms) {
          clearTimeout(restartTimer);
          clearInterval(polltimer);
          init = false;
          restartTimer = setTimeout(main, ms);
          }
          ! function main() {
          clearInterval(polltimer);
          allRobotNames = [];
          allRobots = {};
          var mail = adapter.config.mail;
          var password = adapter.config.password;
          ! client.authorize(mail, password, false, function (error) {
          if (error) {
          adapter.log.warn('login failed');
          restart(300000);
          return;
          }
          client.getRobots(function (error, robots) {
          if (error || !robots.length) {
          adapter.log.warn('no robots found');
          restart(300000);
          return;
          }
          var devices = {};
          for (var i = 0; i < robots.length; i++) {
          if (robots[i].name) {
          devices[robots[i].name] = {
          'status': {
          common: 'meta',
          states: {
          'reachable': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          def: false,
          role: 'indicator.reachable'
          }
          },
          'lastResult': {
          common: {
          type: 'string',
          read: true,
          write: false,
          role: 'text'
          }
          },
          'error': {
          common: {
          type: 'string',
          read: true,
          write: false,
          role: 'text'
          }
          },
          'state': {
          common: {
          type: 'number',
          read: true,
          write: false,
          role: 'value'
          }
          },
          'action': {
          common: {
          type: 'number',
          read: true,
          write: false,
          role: 'value'
          }
          },
          'lastCleaning': {
          common: {
          type: 'string',
          read: true,
          write: false,
          role: 'text'
          }
          },
          'isCharging': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'isScheduleEnabled': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'isDocked': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'dockHasBeenSeen': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'charge': {
          common: {
          type: 'number',
          read: true,
          write: false,
          role: 'value.battery'
          }
          },
          'canStart': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'canStop': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'canPause': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'canResume': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'canGoToBase': {
          common: {
          type: 'boolean',
          read: true,
          write: false,
          role: 'indicator'
          }
          },
          'modelName': {
          common: {
          type: 'string',
          read: true,
          write: false,
          role: 'text'
          }
          },
          'firmware': {
          common: {
          type: 'string',
          read: true,
          write: false,
          role: 'text'
          }
          }
          }
          },
          'commands': {
          common: 'button',
          states: {
          'schedule': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'clean': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'eco': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'navigationMode': {
          common: {
          type: 'number',
          read: true,
          write: true,
          def: 1,
          role: 'level'
          }
          },
          'cleanSpot': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'spotWidth': {
          common: {
          type: 'number',
          read: true,
          write: true,
          def: 100,
          min: 100,
          unit: 'cm',
          role: 'level.width'
          }
          },
          'spotHeight': {
          common: {
          type: 'number',
          read: true,
          write: true,
          def: 100,
          min: 100,
          unit: 'cm',
          role: 'level.height'
          }
          },
          'spotRepeat': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'pause': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'resume': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'stop': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          },
          'goToBase': {
          common: {
          type: 'boolean',
          read: true,
          write: true,
          def: false,
          role: 'switch'
          }
          }
          }
          }
          };
          allRobots[robots[i].name] = robots[i];
          }
          }
          createDevices(devices, function () {
          adapter.log.info('devices found: ' + robots.length);
          adapter.getDevices(function (err, devices) {
          if (Array.isArray(devices)) {
          for (var i = 0; i < devices.length; i++) {
          allRobotNames.push(devices[i].common.name);
          }
          }
          //subscribe all states in namespace
          init = true;
          adapter.subscribeStates('
          ');
          pollInterval = adapter.config.pollInterval || 120;
          pollInterval = 1000;
          if (pollInterval < 60000) pollInterval = 60000;
          polltimer = setInterval(update, pollInterval);
          update();
          });
          });
          });
          });
          }
          ! function update() {
          for (var i = 0; i < allRobotNames.length; i++) {
          updateRobot(allRobots[allRobotNames[i]]);
          }
          ! /

          client.getRobots(function (error, robots) {
          adapter.log.warn('getRobots!');
          if (error || !robots.length) {
          adapter.log.warn('update error or no robot found ' + error);
          restart(300000);
          return;
          }
          for (var i = 0; i < allRobotNames.length; i++) {
          var k = null;
          //check if robot retrieved
          for (var j = 0; j < robots.length; j++) {
          if (robots[j].name === allRobotNames[i]) {
          k = j;
          }
          if (allRobotNames.indexOf(robots[j].name) === -1) {
          adapter.log.warn('new robot found');
          restart(5000);
          return;
          }
          }
          //robot not retrieved
          if (k === null) {
          adapter.setState(allRobotNames[i] + '.status.reachable', false, true);
          continue;
          }
          //update robot
          adapter.setState(allRobotNames[i] + '.status.reachable', true, true);
          updateRobot(robots[k]);
          }
          });
          */
          }
          ! function updateRobot(robot, callback) {
          if (!init) {
          return;
          }
          robot.getState(function (error, state) {
          if (error || !state) {
          adapter.log.warn('could not update robot ' + robot.name);
          adapter.setState(robot.name + '.status.reachable', true, false);
          restart(pollInterval);
          if (typeof callback === 'function') {
          callback('could not update robot' + robot.name);
          }
          return;
          }
          adapter.setState(robot.name + '.status.reachable', true, true);
          adapter.setState(robot.name + '.status.lastResult', state.result, true);
          adapter.setState(robot.name + '.status.error', state.error, true);
          adapter.setState(robot.name + '.status.state', state.state, true);
          adapter.setState(robot.name + '.status.action', state.action, true);
          var lastCleaning = state.cleaning.category === 1 ? 'manual' : state.cleaning.category === 2 ? 'auto' : 'spot';
          lastCleaning += state.cleaning.mode === 1 ? ' eco' : ' turbo';
          lastCleaning += state.cleaning.modifier === 2 ? ' x2' : '';
          adapter.setState(robot.name + '.status.lastCleaning', lastCleaning, true);
          adapter.setState(robot.name + '.status.isCharging', state.details.isCharging, true);
          adapter.setState(robot.name + '.status.isDocked', state.details.isDocked, true);
          adapter.setState(robot.name + '.status.isScheduleEnabled', state.details.isScheduleEnabled, true);
          adapter.setState(robot.name + '.commands.schedule', state.details.isScheduleEnabled, true);
          adapter.setState(robot.name + '.status.dockHasBeenSeen', state.details.dockHasBeenSeen, true);
          adapter.setState(robot.name + '.status.charge', state.details.charge, true);
          adapter.setState(robot.name + '.status.canStart', state.availableCommands.start, true);
          if (state.availableCommands.start) {
          adapter.setState(robot.name + '.commands.clean', false, true);
          adapter.setState(robot.name + '.commands.cleanSpot', false, true);
          }
          adapter.setState(robot.name + '.status.canStop', state.availableCommands.stop, true);
          if (state.availableCommands.stop) {
          adapter.setState(robot.name + '.commands.stop', false, true);
          }
          adapter.setState(robot.name + '.status.canPause', state.availableCommands.pause, true);
          if (state.availableCommands.pause) {
          adapter.setState(robot.name + '.commands.pause', false, true);
          }
          adapter.setState(robot.name + '.status.canResume', state.availableCommands.resume, true);
          if (state.availableCommands.resume) {
          adapter.setState(robot.name + '.commands.resume', false, true);
          }
          adapter.setState(robot.name + '.status.canGoToBase', state.availableCommands.goToBase, true);
          if (state.availableCommands.goToBase) {
          adapter.setState(robot.name + '.commands.goToBase', false, true);
          }
          adapter.setState(robot.name + '.status.modelName', state.meta.modelName, true);
          adapter.setState(robot.name + '.status.firmware', state.meta.firmware, true);
          if (typeof callback === 'function') {
          callback(null);
          }
          });
          }
          ! function createDevices(devices, callback) {
          var keys = Object.keys(devices);
          if (!keys.length) return callback();
          var device = keys.shift();
          adapter.getObject(device, function (err, obj) {
          //next device if device exists
          if (obj) {
          delete devices[device];
          createDevices(devices, callback);
          return;
          }
          //create device
          adapter.createDevice(device, function () {
          //create channels for device
          createChannels(device, devices[device], function () {
          //next device
          delete devices[device];
          createDevices(devices, callback);
          });
          });
          });
          }
          ! function createChannels(device, channels, callback) {
          var keys = Object.keys(channels);
          if (!keys.length) return callback();
          var channel = keys.shift();
          adapter.createChannel(device, channel, channels[channel].common, function () {
          //create states
          createStates(
          device,
          channel,
          channels[channel].states,
          function () {
          //create next channel
          delete channels[channel];
          createChannels(device, channels, callback);
          }
          );
          });
          }
          ! function createStates(device, channel, states, callback) {
          var keys = Object.keys(states);
          if (!keys.length) return callback();
          var state = keys.shift();
          adapter.createState(device, channel, state, states[state].common, function () {
          //create next state
          delete states[state];
          createStates(device, channel, states, callback);
          });
          } ! mir ist aber aufgefallen, wenn man den Botvac stoppt und neu startet, bei navigationMode immer noch die 2 (extra care) steht , beim start aber navigationMode 1 (normal) ausgeführt wird. Mann muss also vor einem Adapter Starterst bei navigationMode die 2 erneut schreiben. ! Ich habe es bei mir erst mal so gelöst, das bei Änderung von "canStart" auf "true" -> navigationMode auf 1 gesetzt wird. ! eigentlich müsste er den Wert beim Start auf den Wert von navigationMode setzen. Ich weiß aber noch nicht wie das geschrieben wird. :cry: :oops:[/i][/i][/i][/i][/i][/i] ```

          1 Reply Last reply Reply Quote 0
          • S
            sottomihai last edited by

            @Eisbaeeer:

            So Leute. Gute Nachrichten!

            Bei mir läuft das angepasste Neato modul von pman. Danke auch an Phteven! Ich werde das hier noch eine Weile testen, ob alles gut läuft und dann mit Erlaubnis von pman seinen Adapter als Basis nehmen und einen Vorwerk Adapter bauen. Ich hab euch mal einen screenshot von meiner VIS-Oberfläche gemacht:

            Grüße EisbaeeerVR200-VIS1.png `

            Hallo,

            Ich besitze ein VR200 von Vorwerk. Habe versucht in Iobroker über den botvac Adapter einzubinden und es hat nicht geklappt.

            Ich habe die 2 Dateien geändert:

            In "client.js", line 6 modifizieren zu: this._baseUrl = 'https://vorwerk-beehive-production.herokuapp.com';

            In "robot.js", line 5 modifizieren zu: this._baseUrl = 'https://nucleo.ksecosys.com/vendors/vorwerk/robots/';

            Nach der installation verlangt der Adapter ein login, mit welche Logindaten soll man sich da einloggen? die von Vorwerk?

            Kann mir Jemand vielleicht weiterhelfen?

            Gruß

            Mihai

            1 Reply Last reply Reply Quote 0
            • Matten Matten
              Matten Matten last edited by

              @sottomihai:

              @Eisbaeeer:

              So Leute. Gute Nachrichten!

              Bei mir läuft das angepasste Neato modul von pman. Danke auch an Phteven! Ich werde das hier noch eine Weile testen, ob alles gut läuft und dann mit Erlaubnis von pman seinen Adapter als Basis nehmen und einen Vorwerk Adapter bauen. Ich hab euch mal einen screenshot von meiner VIS-Oberfläche gemacht:

              Grüße EisbaeeerVR200-VIS1.png `

              Hallo,

              Ich besitze ein VR200 von Vorwerk. Habe versucht in Iobroker über den botvac Adapter einzubinden und es hat nicht geklappt.

              Ich habe die 2 Dateien geändert:

              In "client.js", line 6 modifizieren zu: this._baseUrl = 'https://vorwerk-beehive-production.herokuapp.com';

              In "robot.js", line 5 modifizieren zu: this._baseUrl = 'https://nucleo.ksecosys.com/vendors/vorwerk/robots/';

              Nach der installation verlangt der Adapter ein login, mit welche Logindaten soll man sich da einloggen? die von Vorwerk?

              Kann mir Jemand vielleicht weiterhelfen?

              Gruß

              Mihai `

              probier mal den -> https://www.dropbox.com/s/u5np1f0fmgcd5 … k.rar?dl=0

              einfach runterladen,entpacken,und bei "ioBroker\node_modules" reinschmeißen.

              den hab ich für nen Kumpel erstellt. Basis ist der Botvac Adapter.

              1 Reply Last reply Reply Quote 0
              • S
                sottomihai last edited by

                @Matten Matten:

                @sottomihai:

                @Eisbaeeer:

                So Leute. Gute Nachrichten!

                Bei mir läuft das angepasste Neato modul von pman. Danke auch an Phteven! Ich werde das hier noch eine Weile testen, ob alles gut läuft und dann mit Erlaubnis von pman seinen Adapter als Basis nehmen und einen Vorwerk Adapter bauen. Ich hab euch mal einen screenshot von meiner VIS-Oberfläche gemacht:

                Grüße EisbaeeerVR200-VIS1.png `

                Hallo,

                Ich besitze ein VR200 von Vorwerk. Habe versucht in Iobroker über den botvac Adapter einzubinden und es hat nicht geklappt.

                Ich habe die 2 Dateien geändert:

                In "client.js", line 6 modifizieren zu: this._baseUrl = 'https://vorwerk-beehive-production.herokuapp.com';

                In "robot.js", line 5 modifizieren zu: this._baseUrl = 'https://nucleo.ksecosys.com/vendors/vorwerk/robots/';

                Nach der installation verlangt der Adapter ein login, mit welche Logindaten soll man sich da einloggen? die von Vorwerk?

                Kann mir Jemand vielleicht weiterhelfen?

                Gruß

                Mihai `

                probier mal den -> https://www.dropbox.com/s/u5np1f0fmgcd5 … k.rar?dl=0

                einfach runterladen,entpacken,und bei "ioBroker\node_modules" reinschmeißen.

                den hab ich für nen Kumpel erstellt. Basis ist der Botvac Adapter. `

                Danke für die schnelle Antwort und für den Adapter.

                Ich habe Ihn installiert, nur mit welchen login soll ich mich einloggen? Mit derr Vorwerk login geht nicht.Mit den botvac Daten funktioniert der Login. Kann man den Vorwerk bei Botvac als Gerät einfügen? Wenn ja, wie?

                "vorwerk.0 2017-11-02 09:03:55.710 warn no robots found"

                Danke und Gruß

                Mihai

                1 Reply Last reply Reply Quote 0
                • Matten Matten
                  Matten Matten last edited by

                  @sottomihai:

                  @Matten Matten:

                  @sottomihai:

                  Hallo,

                  Ich besitze ein VR200 von Vorwerk. Habe versucht in Iobroker über den botvac Adapter einzubinden und es hat nicht geklappt.

                  Ich habe die 2 Dateien geändert:

                  In "client.js", line 6 modifizieren zu: this._baseUrl = 'https://vorwerk-beehive-production.herokuapp.com';

                  In "robot.js", line 5 modifizieren zu: this._baseUrl = 'https://nucleo.ksecosys.com/vendors/vorwerk/robots/';

                  Nach der installation verlangt der Adapter ein login, mit welche Logindaten soll man sich da einloggen? die von Vorwerk?

                  Kann mir Jemand vielleicht weiterhelfen?

                  Gruß

                  Mihai `

                  probier mal den -> https://www.dropbox.com/s/u5np1f0fmgcd5 … k.rar?dl=0

                  einfach runterladen,entpacken,und bei "ioBroker\node_modules" reinschmeißen.

                  den hab ich für nen Kumpel erstellt. Basis ist der Botvac Adapter. `

                  Danke für die schnelle Antwort und für den Adapter.

                  Ich habe Ihn installiert, nur mit welchen login soll ich mich einloggen? Mit derr Vorwerk login geht nicht.Mit den botvac Daten funktioniert der Login. Kann man den Vorwerk bei Botvac als Gerät einfügen? Wenn ja, wie?

                  "vorwerk.0 2017-11-02 09:03:55.710 warn no robots found"

                  Danke und Gruß

                  Mihai `

                  Ist der Vorwerk Staubsauger schon geupdatet worden? Also per WLAN ansteuerbar und bei deinem vorwerk Account registriert? Mit der original Vorwerk App hast du eine Verbindung zum Staubsauger und kannst ihn fernsteuern?

                  1 Reply Last reply Reply Quote 0
                  • S
                    sottomihai last edited by

                    @Matten Matten:

                    @sottomihai:

                    @Matten Matten:

                    probier mal den -> https://www.dropbox.com/s/u5np1f0fmgcd5 … k.rar?dl=0

                    einfach runterladen,entpacken,und bei "ioBroker\node_modules" reinschmeißen.

                    den hab ich für nen Kumpel erstellt. Basis ist der Botvac Adapter. `

                    Danke für die schnelle Antwort und für den Adapter.

                    Ich habe Ihn installiert, nur mit welchen login soll ich mich einloggen? Mit derr Vorwerk login geht nicht.Mit den botvac Daten funktioniert der Login. Kann man den Vorwerk bei Botvac als Gerät einfügen? Wenn ja, wie?

                    "vorwerk.0 2017-11-02 09:03:55.710 warn no robots found"

                    Danke und Gruß

                    Mihai `

                    Ist der Vorwerk Staubsauger schon geupdatet worden? Also per WLAN ansteuerbar und bei deinem vorwerk Account registriert? Mit der original Vorwerk App hast du eine Verbindung zum Staubsauger und kannst ihn fernsteuern? `

                    Ja der hat die Neue Firmware, und kann Ihn per App steuern also auch an Wlan Verbunden. Die Logindaten welche ich bei der App nutze habe ich auch im Adapter eingetragen und kommt die Meldung

                    "vorwerk.0 2017-11-02 12:21:54.631 warn login failed"

                    wenn ich die logindaten von botvac benutze bekomme ich die Meldung:

                    "vorwerk.0 2017-11-02 09:03:55.710 warn no robots found"

                    1 Reply Last reply Reply Quote 0
                    • Matten Matten
                      Matten Matten last edited by

                      OK, das Problem ist das ich ein NEATO besitze und kein Vorwerk. Deshalb muss ich schauen ob ich den Fehler reproduzieren kann.

                      1 Reply Last reply Reply Quote 0
                      • S
                        sottomihai last edited by

                        Seit kurzen unterstürzt Alexa den Vorwerk Roboter

                        http://stadt-bremerhaven.de/vorwerk-vr2 … exa-skill/

                        :roll:

                        1 Reply Last reply Reply Quote 0
                        • F
                          feuer112 last edited by

                          Hallo Eisbaeeer,

                          bin nun auch Neato besitzer.

                          Kannst du nochmal deine View hochladen?

                          Vielen Dank im Vorraus.

                          @Eisbaeeer:

                          @ple:

                          Kannst du deine View noch mal online stellen???

                          Gruß und besten Dank. `

                          Hier nochmal der View. Unter dem Link sind auch die notwendigen Grafiken mit drin.

                          Die Gültigkeit läuft am 31.7. ab.

                          ! https://oisnczog0ig6s79i.myfritz.net/in … O8KsC5iE08
                          ! Kennwort: iobroker

                          Grüße Eisbaeeer `

                          1 Reply Last reply Reply Quote 0
                          • Eisbaeeer
                            Eisbaeeer Developer last edited by

                            Hallo Feuer123

                            Du findest den View im Anhang. Ich habe die benötigten Images mit reingepackt.

                            Gruß Eisbaeeer
                            139_vr200.zip

                            1 Reply Last reply Reply Quote 0
                            • Eisbaeeer
                              Eisbaeeer Developer last edited by

                              @Matzes:

                              Hallo Pman,

                              wäre klasse wenn du den Adapter um den Vorwerk VR200 erweitern könntest.

                              Für FHEM wurde dies schon vorgenommen. Als Basis hat ebenfalls die Arbeit vn Kangguru gedient.

                              https://raw.githubusercontent.com/vuffi … _BOTVAC.pm

                              Gruß,

                              Matze `

                              Hmm, inzwischen gibt es hier ein npm-module. Damit wäre ein VR200 Adapter sehr einfach zu realisieren. Wäre sicher einfacher, als den Neato anzupassen. Was meinen die VR200 Besitzer?

                              https://github.com/nicoh88/node-kobold/

                              Gruß Eisbaeeer

                              1 Reply Last reply Reply Quote 0
                              • T
                                TheSeeker last edited by

                                Hallo Eisbaeeer,

                                Ein funktionsfähiger Adapter wäre prima.

                                Dieses Modul habe ich gestern auch gefunden und habe nun begonnen mich mal ein zulesen wie man einen Adapter baut.

                                Da ich aber von FHEM komme und ich im Moment sehr eingespannt bin mit der Arbeit. (Serverumgebung wird ern bei uns im Geschäft) kann dies wirklich noch dauern.

                                Bin auf jeden fall gerne Tester.

                                Grüße

                                Jan

                                1 Reply Last reply Reply Quote 0
                                • Eisbaeeer
                                  Eisbaeeer Developer last edited by

                                  @TheSeeker:

                                  Hallo Eisbaeeer,

                                  Ein funktionsfähiger Adapter wäre prima.

                                  Dieses Modul habe ich gestern auch gefunden und habe nun begonnen mich mal ein zulesen wie man einen Adapter baut.

                                  Da ich aber von FHEM komme und ich im Moment sehr eingespannt bin mit der Arbeit. (Serverumgebung wird ern bei uns im Geschäft) kann dies wirklich noch dauern.

                                  Bin auf jeden fall gerne Tester.

                                  Grüße

                                  Jan ` Hallo Jan

                                  Ich muss auch noch unsere VM Umgebung patchen.

                                  Gilt nicht als Ausrede 😉

                                  Gesendet von meinem SM-G950F mit Tapatalk

                                  1 Reply Last reply Reply Quote 0
                                  • H
                                    Hellechinno last edited by

                                    Hey, gibt es hier was neues?

                                    Würde mich sehr freuen.

                                    Grüße Marco

                                    1 Reply Last reply Reply Quote 0
                                    • Eisbaeeer
                                      Eisbaeeer Developer last edited by

                                      @Hellechinno:

                                      Hey, gibt es hier was neues?

                                      Würde mich sehr freuen.

                                      Grüße Marco `

                                      Hallo Marco

                                      Versuch mal den folgenden Adapter per Github in iobroker zu installieren:

                                      ! https://github.com/Eisbaeeer/ioBroker.vr200

                                      139_iobroker.png

                                      Sollte funktionieren. Warte gerne auf Rückmeldung.

                                      Gruß Eisbaeeer

                                      1 Reply Last reply Reply Quote 0
                                      • integer63
                                        integer63 last edited by

                                        @Eisbaeeer:

                                        Sollte funktionieren. Warte gerne auf Rückmeldung.

                                        Gruß Eisbaeeer `

                                        Bei mir hat die Installation und die Datenabfrage auf Anhieb funktioniert 😄

                                        Vielen Dank :!:

                                        1 Reply Last reply Reply Quote 0
                                        • Eisbaeeer
                                          Eisbaeeer Developer last edited by

                                          Der Vorwerk VR200 ist ab sofort auch als npm verfügbar. Ein Pull-request ist auch gemacht. Sollte also bald in der Adapter Liste erscheinen.

                                          Gruß Eisbaeeer

                                          1 Reply Last reply Reply Quote 0
                                          • xeno220
                                            xeno220 last edited by

                                            @Eisbaeeer:

                                            Der Vorwerk VR200 ist ab sofort auch als npm verfügbar. Ein Pull-request ist auch gemacht. Sollte also bald in der Adapter Liste erscheinen.

                                            Gruß Eisbaeeer `

                                            Danke Euch dafür, habe den Adapter installiert nur leider bekomme ich keinen Status ausgelesen.. Im Log sind folgende Fehlermeldungen zu finden.

                                            Habe ich etwas falsch gemacht?

                                            VG

                                            Matthias
                                            6062_bildschirmfoto_2018-02-25_um_09.07.33.png

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            908
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            39
                                            152
                                            32960
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo