NEWS
Roborock S5 "cleaning area" per Tastendruck?
-
@AlCalzone Ja, die Koordinaten sind direkt aus Valetudo unter http://IPdesSaugers/zone
Habe jetzt die Y-Koordinaten nach Vorgabe umgerechnet und jetzt stimmen die Zonen überein.
Der Tipp mit// @ts-ignore
hat auch funktioniert. Scheint also auf den ersten Blick erstmal alles zu passen. Ich werde es jetzt die nächsten Wochen mal testen.
Vielen Dank!
-
@AlCalzone Erstmal danke für dein Script
Leider scheint es bei mir nicht zu funktionieren, laut Log bleibt es bei
script.js.Xiaomi_Sauger.Zonenreinigung_Kartenrotation: Teste Kartenorientierung... stehen.
Ich nutze den mihome-vacuum 1.9.2 mit Valetudo RE 0.8.1, der Datenpunkt mapRotated bleibt auf unkown(-1). -
@Chris_71 Hast du die Zugangsdaten und Hostnamen bzw. IP korrekt eingetragen?
Kannst du mit diesen Zugangsdaten im Browser die folgende Adresse öffnen?http://<Adresse-Des-Saugers>/api/map/latest
-
@Chris_71 sagte in Roborock S5 "cleaning area" per Tastendruck?:
Valetudo RE 0.8.1
Ich glaube das liegt an Valetudo RE 0.8.1. Dort bekommt man über /api/map/latest nichts mehr angezeigt, sondern es wird eine Datei ohne Endung heruntergeladen. Der Inhalt ist mit dem Notepad++ nicht lesbar.
Seit meinem Update von Valetudo auf Valetudo RE 0.8.1 habe ich das gleiche Problem. Siehe auch hier von @base im Beitrag hier
-
@0018 Kannst du vielleicht mal im Browser schauen, welche Adresse diese Version lädt, um an die Map zu kommen?
-
@AlCalzone Da passiert das gleiche das auch @0018 geschrieben hat.
Eine Karte kann man über /api/simple_map abrufen (PNG-Datei). -
@Chris_71 dann muss man die Karte anders decoden. Ich brauche nicht die Pixel sondern die Koordinaten von sauger und Station um die rotation zu erkennen
@Meistertr hast du ne Idee wie sich das genau geändert hat?
-
@AlCalzone: Hey! Ich hoffe, du kannst mir helfen! Ich nutze dein Script und plötzlich, seit ca. einer Woche, funktioniert es nicht mehr. Ich bekomme plötzlich im Log:
State value to set for "mihome-vacuum.0.info.water_box" has to be type "string" but received type "boolean"
sobald ich einen der Räume ansteuere. (per Sprache oder per Alexa (Gerät/Button).
Geändert habe ich nichts. Die relevanten Adapter scheinen auch alle richtig angebunden zu sein. Siehe Screenshot:
Die Verbindung zum Roborock habe ich mit dem "Find" erfolgreich getestet. Muss ich was am script verändern, um die Raumsteuerung wieder zum Laufen zu bringen?
Dein Script lief bei mir Jahre so:
// 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": [[21386,18786,23486,22936]], "Flur": [[18323,22873,23623,24523]], "Wohnzimmer": [[23470,18841,27620,24341]], "Schlafzimmer": [[18235,24479,22285,28829]], "Bad": [[18273,19241,20723,23091]], "Arbeitszimmer": [[22413,24357,27463,28657]], "Wohnbereich": [[23470,18841,27620,24341],[21386,18786,23486,22936]], "Wohnung": [[23470,18841,27620,24341],[21386,18786,23486,22936],[18323,22873,23623,24523],[18273,19241,20723,23091],[18235,24479,22285,28829]] }; // =============================================================================== 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()); }); }
-
@mor9oth sagte in Roborock S5 "cleaning area" per Tastendruck?:
State value to set for "mihome-vacuum.0.info.water_box" has to be type "string" but received type "boolean"
Der State wird im Skript nicht verwendet. Das muss woanders her kommen.
-
@alcalzone Ok, danke für das Feedback! Dann suche ich mal weiter ^^