Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Neato Botvac Connected Adapter

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

Neato Botvac Connected Adapter

Neato Botvac Connected Adapter

Scheduled Pinned Locked Moved ioBroker Allgemein
152 Posts 39 Posters 38.1k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • integer63I Offline
    integer63I Offline
    integer63
    wrote on last edited by
    #55

    Ich weiß gar nicht, wie ich es sagen soll, ohne als kompletter Depp dazustehen, aber als ich ein paar Stunden später alles noch mal deinstallieren wollte und noch mal nachgesehen habe, waren plötzlich alle Objekte unter botvac.0 da - obwohl die Instanz gar nicht gestartet war 😮 Ich habe dann die Instanz gestartet und die Fehlermeldung im Log ist weg :? Klassischer Fall von Self-healing 😄

    Trotzdem danke … und bis zum nächsten Problem 😉

    1 Reply Last reply
    0
    • P Offline
      P Offline
      ple
      wrote on last edited by
      #56

      Kannst du deine View noch mal online stellen???

      Gruß und besten Dank.

      @Eisbaeeer:

      Hallo zusammen

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

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

      Grüße Eisbaeee `

      Intel Nuc + Proxmox

      1 Reply Last reply
      0
      • EisbaeeerE Offline
        EisbaeeerE Offline
        Eisbaeeer
        Developer
        wrote on last edited by
        #57

        @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

        Kein support per PM. Bitte im Forum Fragen stellen!

        1 Reply Last reply
        0
        • T Offline
          T Offline
          tempestas
          wrote on last edited by
          #58

          @Schatn:

          Hallo! Bei mir werden im ioBroker.admin die Werte alle korrekt angezeigt aber im VIS wird nur "null" oder "false" angezeigt. Habe den Adapter schon deinstalliert und neu installiert, iobroker neu gestartet, aber leider hat sich dadurch nichts geändert. Woran könnte das liegen? Danke `

          Ich kann mich diesem Problem nur anschliessen, sehe aber keine lösung. Hat irgendwer von den Leuten mit wirklich Ahnung (nicht nur wie ich klauen, trial and error 🙂 eine Idee?

          Pman, Eisbaeer?

          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

          1 Reply Last reply
          0
          • eric2905E Offline
            eric2905E Offline
            eric2905
            wrote on last edited by
            #59

            Screenshots wären hilfreich.

            Bei mir läuft der Adapter und auch die Vis-Einbindung ohne Probleme.

            Gruß,

            Eric

            Von unterwegs getippert

            Roses are red, violets are blue,

            if I listen to metal, my neighbours do too

            1 Reply Last reply
            0
            • T Offline
              T Offline
              tempestas
              wrote on last edited by
              #60

              [hier waren screens, aber die Lösung scheint gefunden]

              Neue Antwort:

              während ich das hier getippt habe und die Screens hochgeladen habe, ist mir eine Idee gekommen:

              Mein Robo hatte Leerzeichen im Namen, die ioB durch Unterstriche ersetzt hat. Das scheint das Problem zu sein.

              Habe aus "Babette die Zweite" jetzt nur "Babette" gemacht via Neato App, die alte "Babette_die_Zweite" Insatz in ioB gelöscht und schon findet VIS die Datenpunkte unter "Babette" wie sie sein sollen.

              Falls das die Lösung ist, könnte man das eventuell in die Adapterdoku aufnehmen, da sicherlich auch andere das Problem haben werden.

              <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

              1 Reply Last reply
              0
              • P Offline
                P Offline
                Pman
                wrote on last edited by
                #61

                Hatte ja schon vermutet, dass es am Namen liegt. Grundsätzlich hatte ich das bei der Erstellung des Adapters zwar bedacht, aber nie getestet. Jetzt habe ich ja leider keinen Botvac mehr 😢

                Ich würde also erstmal empfehlen den Namen so simpel wie möglich zu halten.

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  tempestas
                  wrote on last edited by
                  #62

                  @Eisbaeeer:

                  @Pman:

                  Okay, man sollte dann evtl. in der Readme darauf hinweise, welche Funktionen mit welchem Bot gehen. Mit den D3 und D5 von Neato habe ich noch keine Erfahrung, haben die nicht auch WLAN? `

                  Da kann ich leider auch nichts dazu beitragen. Hat jemand anders noch die Modelle D3 und D5?

                  Gruß Eisbaeeer `

                  Könntest du mir kurz erklären, was die SteuerID ist und was die Object ID? Ich habs jetzt einfach von dir geklaut (danke!), aber ich wills auch verstehen. Abgesehen davon, dass meine Babette zwar startet, aber danach irgendwie nicht mehr richtig reagieren mag auf Stop oder Pause.

                  Vielen Dank vorab

                  <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                  1 Reply Last reply
                  0
                  • EisbaeeerE Offline
                    EisbaeeerE Offline
                    Eisbaeeer
                    Developer
                    wrote on last edited by
                    #63

                    @tempestas:

                    @Eisbaeeer:

                    @Pman:

                    Okay, man sollte dann evtl. in der Readme darauf hinweise, welche Funktionen mit welchem Bot gehen. Mit den D3 und D5 von Neato habe ich noch keine Erfahrung, haben die nicht auch WLAN? `

                    Da kann ich leider auch nichts dazu beitragen. Hat jemand anders noch die Modelle D3 und D5?

                    Gruß Eisbaeeer `

                    Könntest du mir kurz erklären, was die SteuerID ist und was die Object ID? Ich habs jetzt einfach von dir geklaut (danke!), aber ich wills auch verstehen. Abgesehen davon, dass meine Babette zwar startet, aber danach irgendwie nicht mehr richtig reagieren mag auf Stop oder Pause.

                    Vielen Dank vorab `

                    Hallo tempestas

                    Ich komme mit der Fragestellung nicht ganz klar. Wurde ich gefragt? Denn der Adapter ist nicht von mir. Den hat pman geschrieben. Also geht die Frage eher an ihn.

                    Wenn du "commands" und "status" meinst?

                    Bestimmte kommandos sind nur in bestimmten Status möglich. Also z.B. kann man den Befehl "fahre zur Basis zurück" nicht senden, wenn er gerade saugt. Also muss man anhand des Status die entsprechenden Funktionen freischalten oder sperren. Ich habe das in VIS mit der Sichtbarkeit des Buttons geregelt. Also nur wenn der Status entsprechend gesetzt ist, kann man die Funktion auch auslösen.

                    War das, das was du gefragt hattest und hab ich es einigermaßen verständlich erklärt?

                    Gruß Eisbaeeer

                    Kein support per PM. Bitte im Forum Fragen stellen!

                    1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      lonsimbt
                      wrote on last edited by
                      #64

                      Ups, das ist peinlich. Es lag tatsächlich auch bei meinem Gerät am Namen: Wir hatten zwischenzeitlich ein Austauschgerät erhalten. Beim Neuanlegen des Gerätes unter dem (vermeindlich) gleichen Namen hatte sich ein Leerzeichen am Ende eingeschlichen. Leerzeichen gelöscht, schwups läuft das gute Stück wieder über den Adapter.

                      Vielen Dank für den Tip.

                      Gruß Marco

                      iobroker im Container (debian Bullseye) unter proxmox 7.1
                      debmatic in VM (debian Buster) unter proxmox 7.1 mit HB-RF-USB und RPI-RF-MOD
                      40 HomeMatic Geräte, Phillips Hue, Ikea Tradfri, Logitech Harmony Hub, Botvac Connected, Robonect

                      1 Reply Last reply
                      0
                      • T Offline
                        T Offline
                        tempestas
                        wrote on last edited by
                        #65

                        @Eisbaeeer:

                        @tempestas:

                        @Eisbaeeer:

                        Da kann ich leider auch nichts dazu beitragen. Hat jemand anders noch die Modelle D3 und D5?

                        Gruß Eisbaeeer `

                        Könntest du mir kurz erklären, was die SteuerID ist und was die Object ID? Ich habs jetzt einfach von dir geklaut (danke!), aber ich wills auch verstehen. Abgesehen davon, dass meine Babette zwar startet, aber danach irgendwie nicht mehr richtig reagieren mag auf Stop oder Pause.

                        Vielen Dank vorab `

                        Hallo tempestas

                        Ich komme mit der Fragestellung nicht ganz klar. Wurde ich gefragt? Denn der Adapter ist nicht von mir. Den hat pman geschrieben. Also geht die Frage eher an ihn.

                        Wenn du "commands" und "status" meinst?

                        Bestimmte kommandos sind nur in bestimmten Status möglich. Also z.B. kann man den Befehl "fahre zur Basis zurück" nicht senden, wenn er gerade saugt. Also muss man anhand des Status die entsprechenden Funktionen freischalten oder sperren. Ich habe das in VIS mit der Sichtbarkeit des Buttons geregelt. Also nur wenn der Status entsprechend gesetzt ist, kann man die Funktion auch auslösen.

                        War das, das was du gefragt hattest und hab ich es einigermaßen verständlich erklärt?

                        Gruß Eisbaeeer `

                        Hallo Eisbaeeer,

                        ja, die Frage ging an dich, weil du ja diese geile View gebaut hast und freundlicherweise zur Verfügung gestellt hattest.

                        In den darin enthaltenen Widgets, mit denen du den Robo steuerst, wird einmal die "SteuerID" und einmal die "Command ID" enthalten.

                        Ich denke aber, du hast meine Frage bereits beantwortet. Die Command ID führt den eigentlichen Befehl aus, sofern die "SteuerID" den dafür notwendigen Wert hat? Richtig?

                        Sprich bei der SteuerID steht z.B. "robo.canStart" und die CommandID ist "robo.Start" (aus dem Kopf, mag etwas anders sein).

                        Die Sichtbarkeit ist glaube ich beim import deiner View bei mir verlorengegangen, aber das kann ich auch selber regeln 🙂

                        Btw: welches Widget set ist das genau? ich habe bei mir kein jqui ctrl icon val (oder so ähnlich, jedenfalls die, die du nutzt) gefunden?

                        Danke und Grüße

                        <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                        1 Reply Last reply
                        0
                        • T Offline
                          T Offline
                          tempestas
                          wrote on last edited by
                          #66

                          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

                          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            Seryoga_1
                            wrote on last edited by
                            #67

                            Kannst du deine View noch mal online stellen???

                            Gruß und besten Dank.

                            Eisbaeeer hat geschrieben:

                            Hallo zusammen

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

                            Spoiler: Show hidden text

                            Danke

                            1 Reply Last reply
                            0
                            • N Offline
                              N Offline
                              Nabla
                              wrote on last edited by
                              #68

                              Hat das denn Jemand mit dem "can go to base"-Status zum Laufen bekommen?

                              Auch wenn der Staubsauger bei mir länger fährt, geht der Status nicht auf true.

                              Habe auch diverse Reinigungsmodi, stop, pause etc probiert.

                              1 Reply Last reply
                              0
                              • Matten MattenM Offline
                                Matten MattenM Offline
                                Matten Matten
                                wrote on last edited by
                                #69

                                @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]

                                ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

                                1 Reply Last reply
                                0
                                • P Offline
                                  P Offline
                                  Pman
                                  wrote on last edited by
                                  #70

                                  @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
                                  0
                                  • Matten MattenM Offline
                                    Matten MattenM Offline
                                    Matten Matten
                                    wrote on last edited by
                                    #71

                                    @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] ```

                                    ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

                                    1 Reply Last reply
                                    0
                                    • S Offline
                                      S Offline
                                      sottomihai
                                      wrote on last edited by
                                      #72

                                      @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
                                      0
                                      • Matten MattenM Offline
                                        Matten MattenM Offline
                                        Matten Matten
                                        wrote on last edited by
                                        #73

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

                                        ioBroker auf Beelink mit WIN10 home|CCU3 (Raspberrymatic)|Neato BotVac D3|HYPERION Ambilight auf RPI3 und RPI ZeroW|HA-Bridge|Milight LED|Nodered&Redmatic|VU Duo2 & Solo se V2

                                        1 Reply Last reply
                                        0
                                        • S Offline
                                          S Offline
                                          sottomihai
                                          wrote on last edited by
                                          #74

                                          @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
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

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

                                          336

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe