Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Roborock S5 "cleaning area" per Tastendruck?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Roborock S5 "cleaning area" per Tastendruck?

    This topic has been deleted. Only users with topic management privileges can see it.
    • AlCalzone
      AlCalzone Developer @Guest last edited by

      @FrankDCE sagte in Roborock S5 "cleaning area" per Tastendruck?:

      GoTo need two koordinates with type number

      Bin mir gerade nicht sicher... hast du es mal ohne die eckigen Klammern probiert?

      ? 1 Reply Last reply Reply Quote 0
      • ?
        A Former User @AlCalzone last edited by

        @AlCalzone

        Tatsache, das war es. Komisch, im area cleaning sind die auch drin und es klappt.

        Wie dem auch sei: Danke für den Hinweis.

        1 Reply Last reply Reply Quote 0
        • K
          kaiserm @Stoni last edited by kaiserm

          @Stoni Genau das hätte ich auch gerne.

          1. Alles per Sprachbefehle.
            Also z.B. Alexa, sauge das Esszimmer oder Alexa, sauge das Wohnzimmer
            Falls alles gereinigt werden soll: Alexa, sauge die Wohnung.

          Für die Reinigung / Wartung wäre es ideal wenn ich Alexa sagen könnte: Alexa, fahre Hugo (so heisst unser S50) zum Mülleimer.

          Wie macht man das ?
          Ok, die Zonen der Zimmer oder Bereiche, also Wohnzimmer, Esszimmer, Mülleimer,...) bekommt man ja in der Flolevac App.

          Muss man für die komplette Wohnung die Zone über alles ziehen?

          Was macht man dann mit den ermittelten Zonen?
          Wo müssen die eingebunden werden damit alles per Sprache läuft?

          Wenn er vor dem Mülleimer steht und gereinigt wurde müsste man ihn ja mit Alexa, fahre Hugo zur Ladestation zurückschicken können?

          Weitere Befehle: Alexa, pausiere Saugvorgang oder Alexa, beende Saugvorgang.

          Was gibt man da wo an ?

          Man kann ja im Alexa2 Adapter in der Summary immer den letzten Befehl sehen, also kann man darauf triggern und eine Szene abspielen lassen?

          Danke im Voraus.

          LG Martin

          AlCalzone S 2 Replies Last reply Reply Quote 0
          • 0
            0018 @Brati last edited by

            @Brati sagte in Roborock S5 "cleaning area" per Tastendruck?:

            Du musst ihn einmal alles reinigen lassen und einstellen, dass die Karte gespeichert wird.

            Hi Brati,

            wo genau kann ich sagen das die Karte gespeichert wird? Hast du evtl einen Screenshot dazu? Behält er dann auch die Karte wenn man den Sauger über den Button am Sauger startet?

            B 1 Reply Last reply Reply Quote 0
            • AlCalzone
              AlCalzone Developer @kaiserm last edited by

              @kaiserm sagte in Roborock S5 "cleaning area" per Tastendruck?:

              Wie macht man das ?

              Ich mache das über Alexa-Routinen, die jeweils einen Datenpunkt in ioBroker auf true setzen. Ein JavaScript beobachtet die und startet dann die jeweilige Zonenreinigung. Hierbei wird keine Karte neu generiert.

              Alles saugen geht über den normalen "start"-Datenpunkt vom Sauger, also keine Zonenreinigung. Dabei wird (zumindest bei mir, 1. Generation) jedes Mal die Karte neu aufgebaut (und so Fehler bereinigt).

              Alexa, fahre Hugo (so heisst unser S50) zum Mülleimer.

              Mache noch eine Alexa-Routine, die einen GoTo-Befehl steuert.

              Wenn er vor dem Mülleimer steht und gereinigt wurde müsste man ihn ja mit Alexa, fahre Hugo zur Ladestation zurückschicken können?
              Alexa, pausiere Saugvorgang oder Alexa, beende Saugvorgang.

              Alles Alexa-Routinen, die den jeweiligen DP (Home, Pause, etc...) des Vacuum-Adapters setzen.

              1 Reply Last reply Reply Quote 0
              • K
                kaiserm last edited by

                Nur nochmal zu meinem Verständnis:

                Ich möchte folgendes erreichen:

                Alexa, saug die Wohnung - Der S50 soll alles saugen
                Alexa, saug das ***zimmer - Der S50 soll das angegebene Zimmer saugen
                Alexa, schick Hugo zum Mülleimer - Der S50 (Hugo) fährt zum Mülleimer
                Alexa, schick Hugo zum laden - Der S50 (Hugo) fährt zurück zur Ladestation
                Alxea, Hugo Pause - Der S50 bleibt stehen
                Alexa, Hugo Weiter - Der S50 saugt weiter
                Alexa, Hugo Stop - Der S50 stoppt und fährt zurück in die Ladestation

                Ich benötige ausser dem Bestätigungston von Alexa eigentlich kein weiteres Gelaber.
                Der S50 labert ja selbst auch wenn ihm was nicht passen sollte.

                Ich muss also Summary im ersten Fall auf saug UND die UND Wohnung abfragen.

                Wenn das wahr ist soll der Sauger die Koordinate ansteuern und lossaugen.

                Wie steuert man dann die Koordinaten aus dem Script an?
                Habe gelesen das man die Koordinaten über eine Szene übergeben muss?!
                In diesem Fall (Wohnung) müsste man nacheinander die Koordinaten aller Zimmer hintereinander in die Szene schreiben.

                Kann man per Script dann STEUERE SZENE Sauge_Wohnung mit WAHR ansprechen?

                Was muss man für Pausieren, Weiter und Stop ansteuern damit der S50 dies auch macht ?

                Danke im Voraus

                LG Martin

                AlCalzone 1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer @kaiserm last edited by

                  @kaiserm Hier sind die unterschiedlichen Kommandos beschrieben:
                  https://github.com/iobroker-community-adapters/ioBroker.mihome-vacuum#goto

                  Ich kann später auch gerne mein Skript zur Verfügung stellen, allerdings kann das noch nicht alles was du dir wünschst. Nur einzelne Räume saugen und zurück zum Dock. Und es benötigt Valetudo auf dem Robbie, da meiner (1. Generation) gerne mal die Karte dreht.

                  K 1 Reply Last reply Reply Quote 0
                  • K
                    kaiserm @AlCalzone last edited by kaiserm

                    @AlCalzone Das wäre Klasse.

                    Einzelne Räume und zurück zum Dock wäre ja schon mal was.

                    Pause, Weiter und andere Koordinaten sind ja auch nur weitere Kommandos.

                    In welchen Datenpunkt muss man denn z.B. pause schreiben damit er pausiert?

                    Update: Habe gesehen das pause ja ein eigener Datenpunkt ist.

                    Also müsste ja steuere Datenpunkt mit true den S50 pausieren.

                    LG Martin

                    AlCalzone 1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer @kaiserm last edited by AlCalzone

                      @kaiserm Also wie versprochen:

                      Hier die Variante, die bei mir im Einsatz ist (inklusive Test der Kartenorientierung via Valetudo). Muss als TypeScript angelegt werden und benötigt das zusätzliche Paket "axios":

                      import axios from "axios";
                      
                      // Hier den Hostnamen und Zugangsdaten eintragen, unter dem Valetudo erreichbar ist
                      const roboHostname = "rockrobo.fritz.box";
                      const valetudoAuth = {
                      	username: 'valetudo-username',
                      	password: 'valetudo-password'
                      }
                      // Hier den State eintragen, der den aktuellen Sauger-Status angibt
                      const idVacuumState = "mihome-vacuum.0.info.state";
                      
                      const center: Point = [25600, 25600];
                      // Koordiaten zählen von unten links (0,0) nach oben rechts (51200,51200)
                      // Die folgenden Koordinaten gehen von nicht rotierter Karte (Winkel 0) aus
                      const rooms: Record<string, Rectangle[]> = {
                          "Küche": [[21600, 29100, 23500, 33100]],
                          "Flur": [[18400, 24000, 22200, 27100], [19500, 27100, 21600, 30400]],
                          "Wohnzimmer": [[17600, 20000, 21600, 24000], [21600, 19200, 24200, 23200]],
                          "Schlafzimmer": [[24100, 23200, 26100, 27400], [22100, 23800, 24100, 27400]],
                          "Bad": [[21500, 27500, 23200, 29000]],
                      };
                      
                      // ===============================================================================
                      
                      type Rectangle = [number, number, number, number];
                      type Point = [number, number];
                      
                      /** rotates a rectangle by 90° around the absolute origin */
                      function rotate90([x1, y1, x2, y2]: Rectangle): Rectangle {
                          return [-y2, x1, -y1, x2];
                      }
                      
                      /** rotates a rectangle by 180° around the absolute origin */
                      function rotate180([x1, y1, x2, y2]: Rectangle): Rectangle {
                          return [-x2, -y2, -x1, -y1];
                      }
                      
                      /** Rotates a rectangle around the given center by the given angle */
                      function rotate(rect: Rectangle, center: Point, angle: number) {
                          rect = [rect[0] - center[0], rect[1] - center[1], rect[2] - center[0], rect[3] - center[1]];
                          if (angle % 180 === 90) {
                              rect = rotate90(rect);
                              angle -= 90;
                          }
                          if (angle === 180) {
                              rect = rotate180(rect);
                          }
                          rect = [rect[0] + center[0], rect[1] + center[1], rect[2] + center[0], rect[3] + center[1]];
                          return rect;
                      }
                      
                      for (const room of Object.keys(rooms) as (keyof typeof rooms)[]) {
                          createState(`Staubsauger.${room}`, {
                              type: "boolean",
                              read: true,
                              write: true,
                              role: "switch",
                              name: `${room} saugen`,
                          });
                          on({ id: `javascript.${instance}.Staubsauger.${room}`, val: true, ack: false }, async () => {
                              if (getState(idVacuumState).val !== 8) await cancelCurrentAction();
                      
                              if (getMapRotation() === -1 /* unbekannt */) {
                                  // We need to test the map rotation
                                  const rotation = await testMapRotation();
                                  log(`Die Karte ist ${rotation !== 0 ? `um ${rotation}° ` : "nicht "}rotiert.`);
                                  await rememberMapRotation(rotation);
                              }
                      
                              // Now that we know how the map is rotated, we can clean the room
                              cleanRoom(room);
                          });
                      }
                      
                      createState(`Staubsauger.stop`, {
                          type: "boolean",
                          read: true,
                          write: true,
                          role: "switch",
                          name: `Staubsauger anhalten`,
                      });
                      on({ id: `javascript.${instance}.Staubsauger.stop`, val: true, ack: false }, () => {
                          stopCleanup();
                      });
                      
                      const idMapRotated = "Staubsauger.info.mapRotated";
                      createState(idMapRotated, {
                          type: "number",
                          read: true,
                          write: false,
                          role: "indicator",
                          states: {
                              "-1": "unknown",
                              "0": "Robo links vom Dock",
                              "90": "Robo unten vom Dock",
                              "180": "Robo rechts vom Dock",
                              "270": "Robo oben vom Dock",
                          },
                          name: `Wie die Karte rotiert ist`,
                      });
                      
                      /** 
                       * Bestimmt die Kartenrotation wenn der Staubsauger neben dem Dock steht
                       * 0 Grad bedeutet, der Sauger steht links
                       */
                      async function testMapRotation(): Promise<number> {
                          log("Teste Kartenorientierung...");
                          const { data: { charger, robot } } = await axios({
                              url: `http://${roboHostname}/api/map/latest`,
                              auth: valetudoAuth
                          });
                      
                          // Valetudo zählt von oben links nach unten rechts, d.h. die Y-Koordinaten
                          // sind entgegengesetzt der mathematischen Definition
                          let c2r = [robot[0] - charger[0], charger[1] - robot[1]];
                          const angle = Math.atan2(c2r[1], c2r[0]) * 180 / Math.PI;
                          if (angle <= 45 && angle >= -45) {
                              // Sauger steht rechts
                              return 180;
                          } else if (angle > 45 && angle < 135) {
                              // Sauger steht oben
                              return 270;
                          } else if (angle < -45 && angle > -135) {
                              // Sauger steht unten
                              return 90;
                          } else {
                              return 0;
                          }
                      }
                      
                      function rememberMapRotation(rotation: number): Promise<void> {
                          return setStateAsync(idMapRotated, rotation);
                      }
                      function getMapRotation(): number {
                          return getState(idMapRotated).val;
                      }
                      
                      // "Forget" map rotation when the vacuum starts charging
                      on({ id: idVacuumState, val: 8 /* charging */ }, (obj) => {
                          setState(idMapRotated, -1 /* unknown */);
                          // And reset all control states
                          for (const room of Object.keys(rooms) as (keyof typeof rooms)[]) {
                              setState(`Staubsauger.${room}`, false, true);
                          }
                          setState(`Staubsauger.stop`, false, true);
                      });
                      
                      async function beginCleanup(): Promise<void> {
                      }
                      
                      async function cancelCurrentAction(): Promise<void> {
                          setState("mihome-vacuum.0.control.pause", true);
                          // wait for the "paused" status before going home
                          await waitForPauseOrSleep();
                      }
                      
                      async function stopCleanup(): Promise<void> {
                          log(`Saugvorgang abgebrochen!`);
                          setState(`Staubsauger.stop`, true, true);
                      
                          if (getState(idVacuumState).val !== 8) {
                              await cancelCurrentAction();
                      
                              await setStateAsync('mihome-vacuum.0.control.home', true);
                              // wait for the "charging" status before resolving
                              await waitFor(idVacuumState, 8);
                          }
                      
                          log(`Staubsauger ist in der Basis`);
                      
                          setState(`Staubsauger.stop`, false, true);
                      }
                      
                      async function cleanRoom(room: keyof typeof rooms): Promise<void> {
                          log(`Saugvorgang für ${room} gestartet!`);
                          setState(`Staubsauger.${room}`, true, true);
                      
                          const mapRotation = getMapRotation();
                          const originalCoords = rooms[room];
                          log(`original coordinates: ${JSON.stringify(originalCoords)}`);
                          const roomCoords = rooms[room].map(rect => rotate(rect, center, mapRotation));
                          log(`rotated coordinates: ${JSON.stringify(roomCoords)}`);
                      
                          const coords = roomCoords[0];
                          const targetCoords = [
                              ((coords[0] + coords[2]) / 2).toFixed(0),
                              ((coords[1] + coords[3]) / 2).toFixed(0),
                          ]
                      
                          // go to center of first zone
                          const gotoString = targetCoords.join(",");
                          await setStateAsync("mihome-vacuum.0.control.goTo", gotoString);
                          log(`Fahre zur Mitte von ${room}`);
                          await wait(10000);
                          await waitForPauseOrSleep();
                      
                          if (getState("Staubsauger.stop").val) return;
                      
                          const zoneCleanString = roomCoords.map(zone => {
                              return "[" + zone.concat(1).map(coord => coord.toString()).join(",") + "]";
                          }).join(",");
                      
                          log("Starte Zonenreinigung...");
                          await setStateAsync("mihome-vacuum.0.control.zoneClean", zoneCleanString);
                          // wait for the cleanup to finish
                          await waitFor(idVacuumState, 6);
                      }
                      
                      async function waitForPauseOrSleep(): Promise<void> {
                          log("Warte auf Zustand schlafen oder Pause...");
                          switch (getState(idVacuumState).val) {
                              case 3:
                              case 10:
                                  log(" => Zustand bereits aktiv!");
                                  return;
                              default:
                                  await Promise.race([
                                      waitFor(idVacuumState, 10),
                                      waitFor(idVacuumState, 3),
                                  ]);
                                  log(" => Zustand erreicht!");
                          }
                      }
                      
                      function wait(ms: number): Promise<void> {
                          return new Promise(resolve => {
                              setTimeout(resolve, ms);
                          });
                      }
                      
                      function waitFor(stateID: string, value: any): Promise<void> {
                          return new Promise(resolve => {
                              const handler = (obj: iobJS.ChangedStateObject) => {
                                  if (obj.newState.val === value) {
                                      unsubscribe(handler);
                                      resolve();
                                  }
                              }
                              subscribe(stateID, handler);
                          })
                      }
                      
                      function setStateAsync(id: string, state: any): Promise<void> {
                          return new Promise(res => {
                              setState(id, state, () => res());
                          });
                      }
                      

                      Wenn du die automatische Rotation nicht benötigst oder kein Valetudo hast, wäre folgendes die vereinfachte Variante:

                      // Hier den State eintragen, der den aktuellen Sauger-Status angibt
                      const idVacuumState = "mihome-vacuum.0.info.state";
                      
                      // Koordiaten zählen von unten links (0,0) nach oben rechts (51200,51200)
                      // Die folgenden Koordinaten gehen von nicht rotierter Karte (Winkel 0) aus
                      const rooms: Record<string, Rectangle[]> = {
                      	"Küche": [[21600, 29100, 23500, 33100]],
                      	"Flur": [[18400, 24000, 22200, 27100], [19500, 27100, 21600, 30400]],
                      	"Wohnzimmer": [[17600, 20000, 21600, 24000], [21600, 19200, 24200, 23200]],
                      	"Schlafzimmer": [[24100, 23200, 26100, 27400], [22100, 23800, 24100, 27400]],
                      	"Bad": [[21500, 27500, 23200, 29000]],
                      };
                      
                      // ===============================================================================
                      
                      type Rectangle = [number, number, number, number];
                      
                      for (const room of Object.keys(rooms) as (keyof typeof rooms)[]) {
                      	createState(`Staubsauger.${room}`, {
                      		type: "boolean",
                      		read: true,
                      		write: true,
                      		role: "switch",
                      		name: `${room} saugen`,
                      	});
                      	on({ id: `javascript.${instance}.Staubsauger.${room}`, val: true, ack: false }, async () => {
                      		if (getState(idVacuumState).val !== 8) await cancelCurrentAction();
                      		
                      		cleanRoom(room);
                      	});
                      }
                      
                      createState(`Staubsauger.stop`, {
                      	type: "boolean",
                      	read: true,
                      	write: true,
                      	role: "switch",
                      	name: `Staubsauger anhalten`,
                      });
                      on({ id: `javascript.${instance}.Staubsauger.stop`, val: true, ack: false }, () => {
                      	stopCleanup();
                      });
                      
                      // Reset all control states when the vacuum starts charging
                      on({ id: idVacuumState, val: 8 /* charging */ }, (obj) => {
                      	for (const room of Object.keys(rooms) as (keyof typeof rooms)[]) {
                      		setState(`Staubsauger.${room}`, false, true);
                      	}
                      	setState(`Staubsauger.stop`, false, true);
                      });
                      
                      async function cancelCurrentAction(): Promise<void> {
                      	setState("mihome-vacuum.0.control.pause", true);
                      	// wait for the "paused" status before going home
                      	await waitForPauseOrSleep();
                      }
                      
                      async function stopCleanup(): Promise<void> {
                      	log(`Saugvorgang abgebrochen!`);
                      	setState(`Staubsauger.stop`, true, true);
                      
                      	if (getState(idVacuumState).val !== 8) {
                      		await cancelCurrentAction();
                      
                      		await setStateAsync('mihome-vacuum.0.control.home', true);
                      		// wait for the "charging" status before resolving
                      		await waitFor(idVacuumState, 8);
                      	}
                      
                      	log(`Staubsauger ist in der Basis`);
                      
                      	setState(`Staubsauger.stop`, false, true);
                      }
                      
                      async function cleanRoom(room: keyof typeof rooms): Promise<void> {
                      	log(`Saugvorgang für ${room} gestartet!`);
                      	setState(`Staubsauger.${room}`, true, true);
                      
                      	const roomCoords = rooms[room];
                      
                      	const coords = roomCoords[0];
                      	const targetCoords = [
                      		((coords[0] + coords[2]) / 2).toFixed(0),
                      		((coords[1] + coords[3]) / 2).toFixed(0),
                      	]
                      
                      	// go to center of first zone
                      	const gotoString = targetCoords.join(",");
                      	await setStateAsync("mihome-vacuum.0.control.goTo", gotoString);
                      	log(`Fahre zur Mitte von ${room}`);
                      	await wait(10000);
                      	await waitForPauseOrSleep();
                      
                      	if (getState("Staubsauger.stop").val) return;
                      
                      	const zoneCleanString = roomCoords.map(zone => {
                      		return "[" + zone.concat(1).map(coord => coord.toString()).join(",") + "]";
                      	}).join(",");
                      
                      	log("Starte Zonenreinigung...");
                      	await setStateAsync("mihome-vacuum.0.control.zoneClean", zoneCleanString);
                      	// wait for the cleanup to finish
                      	await waitFor(idVacuumState, 6);
                      }
                      
                      async function waitForPauseOrSleep(): Promise<void> {
                      	log("Warte auf Zustand schlafen oder Pause...");
                      	switch (getState(idVacuumState).val) {
                      		case 3:
                      		case 10:
                      			log(" => Zustand bereits aktiv!");
                      			return;
                      		default:
                      			await Promise.race([
                      				waitFor(idVacuumState, 10),
                      				waitFor(idVacuumState, 3),
                      			]);
                      			log(" => Zustand erreicht!");
                      	}
                      }
                      
                      function wait(ms: number): Promise<void> {
                      	return new Promise(resolve => {
                      		setTimeout(resolve, ms);
                      	});
                      }
                      
                      function waitFor(stateID: string, value: any): Promise<void> {
                      	return new Promise(resolve => {
                      		const handler = (obj: iobJS.ChangedStateObject) => {
                      			if (obj.newState.val === value) {
                      				unsubscribe(handler);
                      				resolve();
                      			}
                      		}
                      		subscribe(stateID, handler);
                      	})
                      }
                      
                      function setStateAsync(id: string, state: any): Promise<void> {
                      	return new Promise(res => {
                      		setState(id, state, () => res());
                      	});
                      }
                      

                      Beide Varianten legen für jeden Raum und für Stop einen State an, den du dann jeweils mit einer Alexa-Routine ansprechen kannst.

                      K M 0 Chris_71 5 Replies Last reply Reply Quote 1
                      • K
                        kaiserm @AlCalzone last edited by kaiserm

                        @AlCalzone Vielen Dank.

                        Ich probiere gerade noch was anderes:

                        Alexa reagiert und spricht den Text.
                        Egal wie ich die Koordinaten eingebe. Der S50 macht keinen Mucks.
                        GFebe ich nur die ersten beiden Punkte ohne Klammern aber mit Komma an fährt er aus der Ladestation, irrt etwas umher und sagt dann er kann nicht zum Ziel fahren.

                        Man müsste doch in den GoToPoint Datenpunkt direkt die Koordinate reinschreiben können?!

                        Habe alles probiert. Mit Klammern, ohne ... mit Kommas

                        Gebe ich ihm nur die ersten beiden Zahlen fährt er aus der Docking Station irrt kurz umher und sagt dann er kann nicht an die Koordinate fahren.

                        Im Log finde ich immer nur: GoTo only work with two arguments seperated by

                        LG Martin

                        fb33cc15-1813-4d1b-bb7d-36794475ee4d-grafik.png

                        K M 2 Replies Last reply Reply Quote 0
                        • K
                          kaiserm @kaiserm last edited by kaiserm

                          @kaiserm Ich darf natürlich nur X und Y angeben.

                          Mit flolevac habe ich die Zone beim Mülleimer bestimmt:

                          32315,28722,32815,29222

                          Ich dachte ich muss nun nur 32315,28722 für den Zielpunkt angeben.
                          Aber da spackt er nur dumm rum und sagt dann er kann nicht an die Koordinate fahren.

                          AlCalzone 1 Reply Last reply Reply Quote 0
                          • AlCalzone
                            AlCalzone Developer @kaiserm last edited by

                            @kaiserm Das ist die obere linke Ecke des Rechtecks. Liegt die ggf. hinter dem Mülleimer oder in einer Wand? Dann kann er da nicht hinfahren. Du brauchst die Koordinaten, wo der Sauger stehen würde, wenn er vor dem Mülleimer anhält.

                            K 1 Reply Last reply Reply Quote 0
                            • K
                              kaiserm @AlCalzone last edited by kaiserm

                              @AlCalzone Ich habe mir in der erstellten Karte das kleinstmögliche Rechteck in flolevac aufgezogen und diese Koordinaten übernommen. Der S50 fährt nicht mal ansatzweise in diese Richtung sondern irrt irgendwie nur um den Startpunkt herum.

                              AlCalzone 1 Reply Last reply Reply Quote 0
                              • AlCalzone
                                AlCalzone Developer @kaiserm last edited by AlCalzone

                                @kaiserm Kenn er denn die komplette Karte? Ist der gewünschte Punkt etwa 7 Meter rechts und 3 Meter oben vom Dock aus? Kannst du ggf. mit der App nachvollziehen, wo er hin will, ob das stimmt und warum er so dumm fährt? War ggf. eine Tür zu beim Erstellen der Karte?

                                K 1 Reply Last reply Reply Quote 0
                                • K
                                  kaiserm @AlCalzone last edited by

                                  @AlCalzone Ganz komisch.
                                  Soeben nochmal getestet. Nun fuhr er brav bis vor den Mülleimer.

                                  Keine Ahnung was da schiefgelaufen ist.

                                  LG Martin

                                  1 Reply Last reply Reply Quote 0
                                  • B
                                    Brati @0018 last edited by

                                    @0018

                                    Einstellungen/ Staubsaugereinstellungen/ Kartenspeichermodus on/off

                                    Ich habe aber die russische App, sollte in der Chinaversion jedoch genauso sein. Das geht erst, wenn einmal die Karte aufgebaut wurde. Danach bleibt sie immer so erhalten.

                                    Grüße

                                    Brati

                                    K 0 2 Replies Last reply Reply Quote 0
                                    • K
                                      kaiserm @Brati last edited by

                                      @Brati Ja, das habe ich bei mir so eingestellt.

                                      Ihm fehlt lediglich noch ein Raum wo er noch nicht war.

                                      Da lasse ich das nächste Mal die Türe offen.

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        Stoni @kaiserm last edited by

                                        @kaiserm sagte in Roborock S5 "cleaning area" per Tastendruck?:

                                        @Stoni Genau das hätte ich auch gerne.

                                        1. Alles per Sprachbefehle.
                                          Also z.B. Alexa, sauge das Esszimmer oder Alexa, sauge das Wohnzimmer
                                          Falls alles gereinigt werden soll: Alexa, sauge die Wohnung.

                                        Für die Reinigung / Wartung wäre es ideal wenn ich Alexa sagen könnte: Alexa, fahre Hugo (so heisst unser S50) zum Mülleimer.

                                        Wie macht man das ?
                                        Ok, die Zonen der Zimmer oder Bereiche, also Wohnzimmer, Esszimmer, Mülleimer,...) bekommt man ja in der Flolevac App.

                                        Muss man für die komplette Wohnung die Zone über alles ziehen?

                                        Was macht man dann mit den ermittelten Zonen?
                                        Wo müssen die eingebunden werden damit alles per Sprache läuft?

                                        Wenn er vor dem Mülleimer steht und gereinigt wurde müsste man ihn ja mit Alexa, fahre Hugo zur Ladestation zurückschicken können?

                                        Weitere Befehle: Alexa, pausiere Saugvorgang oder Alexa, beende Saugvorgang.

                                        Was gibt man da wo an ?

                                        Man kann ja im Alexa2 Adapter in der Summary immer den letzten Befehl sehen, also kann man darauf triggern und eine Szene abspielen lassen?

                                        Danke im Voraus.

                                        LG Martin

                                        Einfach nach der Anleitung aus dem Roboter Forum vorgehen. Dort ist alles im Detail beschrieben.

                                        Ich habe in der Alexa App Routinen erstellt wo ich selber sage "Alexa, mach das Haus sauber" und dann eine Szene, die ich per Cloud Adapter als "Gerät" angelegt habe, gestartet.

                                        Funzt bis heute einwandfrei. Das geht natürlich auch mit Teilbereichen wie Esszimmer, Wohnzimmer oder Flur.
                                        Wichtig ist, den Robo nur noch auf diese Weise los zu schicken und nicht mehr einfach reinigen zu lassen. Sonst baut er die Karte neu auf und die Koordinaten stimmen ggf. nicht mehr.

                                        K 1 Reply Last reply Reply Quote 1
                                        • K
                                          kaiserm @Stoni last edited by

                                          @Stoni Die Karte ist gespeichert, sollte also nicht mehr neu aufegabut werden.

                                          Ich will von den Szenen weg.

                                          Ich realisiere wohl alles direkt mit Blockly.

                                          LG Martin

                                          1 Reply Last reply Reply Quote 0
                                          • K
                                            kaiserm last edited by

                                            Ich bin begeistert.

                                            Unser S50 ist nun voll per Sprache bedienbar.

                                            Er fährt zum Mülleimer, reinigt alles oder auch nur bestimmte Räume, macht ein Päuschen, fährt zurück zur Ladestation.

                                            iobroker rockt.

                                            LG Martin

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            905
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            9
                                            57
                                            7615
                                            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