Navigation

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

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    Neato Botvac Connected Adapter

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

      Hi,

      mein Neato rennt sauber über den Adapter.

      Ich schaue nachher mal nach, welche Version und Konfig ich habe.

      Melde mich später.

      Gruß,

      Eric

      Von unterwegs getippert

      1 Reply Last reply Reply Quote 0
      • L
        lonsimbt last edited by

        Hallo,

        ich bin jetzt ein wenig weitergekommen. Nachdem ich den Botvac neu ans WLAN angelernt habe. Wird er jetzt vom iobroker-Adapter auch gefunden. Der Status im Objekt botvac.0 wird ohne die oben genannte Fehlermeldung aktualisiert (zumindest zeigt er mir jetzt den richtigen Zustand inkl. korrekter Firmwareversion an).

        Unter commands kann ich bspw. spotHeight oder eco ändern, es erscheint im Log aber stets die Fehlermeldung

        botvac.0	2017-06-13 22:25:27.359	warn	state change in unknown device: Robert_
        
        

        Der Botvac startet auch nicht, wenn ich clean oder cleanSpot auf True setze.

        Hat jemand eine Idee?

        Viele Grüße

        Marco

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

          @lonsimbt:

          Hallo zusammen,

          ich hatte im letzten Jahr meinen Botvac Conncted problemlos mittels des Adapters einbinden können. Seit einiger Zeit funktionierte der Adapter leider nicht mehr. Zwischenzeitlich musste ich meinen Raspberrypi mit iobroker neu aufsetzen und bekomme den Adapter nun nicht mehr ans laufen.

          Die Instanz des Adapters wird gestartet und der Roboter auch gefunden. Das Objekt mit dem richtigen Namen des Roboters wird angelegt. Er ist aber nicht in der Lage den Status zu aktualisieren oder Aktionen zu starten. Im Log findet sich nur folgendes:

          botvac.0	2017-06-07 20:48:40.444	warn	could not update robot Robert
          botvac.0	2017-06-07 20:48:40.031	info	devices found: 1
          
          

          Ich hoffe jemand mit mehr iobroker-Knowhow kann mich bei der Fehlersuche unterstützen.

          Viele Grüße

          Marco Lonsing `

          Hallo zusammen, ich bin ganz frisch hier im Forum und hoffe, ihr könnt mir helfen.

          Ich habe die Anpassungen für den VR200 in den js Dateien vorgenommen und bekomme jetzt genau die gleichen Einträge im Log:

          botvac.0	2017-06-14 17:40:36.863	warn	could not update robot Vincent
          botvac.0	2017-06-14 17:40:36.595	info	devices found: 1
          botvac.0	2017-06-14 17:40:35.832	info	starting. Version 0.5.0 in /opt/iobroker/node_modules/iobroker.botvac, node: v4.7.2
          
          

          Mit der "Kobold Roboter" App kann ich den Kollegen ohne Probleme fernsteuern - also WLAN und so funktioniert. Was könnte ich noch probieren?

          Gruß

          Thomas

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

            Bitte nochmal den Adapter deinstallieren und sicher gehen, dass alle alten Objekte weg sind. Wie heißen eure Roboter mit kompletten Namen? Evtl. gibt es auch Probleme mit Sonderzeichen?

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

              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 Reply Quote 0
              • P
                ple last edited by

                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 `

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

                  @ple:

                  Kannst du deine View noch mal online stellen???

                  Gruß und besten Dank. `

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

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

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

                  Grüße Eisbaeeer

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

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

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

                      Screenshots wären hilfreich.

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

                      Gruß,

                      Eric

                      Von unterwegs getippert

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

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

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

                          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 Reply Quote 0
                          • T
                            tempestas last edited by

                            @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

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

                              @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

                              1 Reply Last reply Reply Quote 0
                              • L
                                lonsimbt last edited by

                                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

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

                                  @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

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

                                    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

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

                                      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 Reply Quote 0
                                      • N
                                        Nabla last edited by

                                        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 Reply Quote 0
                                        • Matten Matten
                                          Matten Matten last edited by

                                          @tempestas:

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

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

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

                                          Ich selber bin dafür leider nicht bewandert genug `

                                          Moin, habe es geschafft das navigationMode mit zu integrieren.

                                          (mit meinem kleinen botvac D3)

                                          1= normal

                                          2= extra care

                                          @Pmant

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

                                          main.js

                                          ! ```
                                          `/**

                                          • botvac adapter

                                          */

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

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

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

                                            @Matten Matten:

                                            @Pmant

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

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

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

                                            Support us

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

                                            852
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

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