NEWS
Adapter mihome-vacuum anpassungen
-
@rkccorian ich kann mir das ja mal anschschauen.
Das mit der doku nehme ich mal mit -
@dirkhe Nachdem das mit den Räumen wunderbar funktioniert versuche ich mich gerade an der Zonenreinigung.
-
Versuch 1: Schreiben auf
DP mihome-vacuum.0.control.zoneClean
hat keine Effekt. Auch nicht mit den Daten, welche vorher aufgrund einer Zonenreinigung, welche über die App angefragt habe, eingegeben werden. Die Werte werden beim ersten Versuch sogar aus dem DP gelöscht. Anbei das Log...
-
Versuch 2: Die Zonendaten vom DP
mihome-vacuum.0.control.zoneClean
nehmen undapp_zoned_clean;[20950,23000,23650,20500,1]
auf den DPmihome-vacuum.0.control.X_send_command
schreiben. Dann legt der Roboter los, fährt aber komplett woanders hin. Woher bekomme ich die "richtigen" Koordinaten?
Hab jetzt keinen dazu passenden offenen Issue gefunden. Mache ich einen Fehler? Vielen Dank erneut!!
-
-
@rkccorian also nochmal zu den clean rooms, da steht in der readme, das dort ein String erwartet wird:
also muss das heißen:sendTo("mihome-vacuum.0", "cleanRooms", 'enum.rooms.wohnzimmer,enum.rooms.kueche' , async function (result) { console.log(result); });
Ich habe die readme aber daraufhin nochmal angepasst. Zusätzlich gebe ich dann noch im log aus, dass ein string erwartet wird. Kommt dann bald
Für das andere bitte den adapter nochmal auf debug stellen und nochmal machen, bitte.
-
@dirkhe Ahhh, geil, jetzt geht es. Zur Vollständigkeit das funktionierende Blockly zu Deinem obigen Code:
Im Folgenden das Log, wenn ich
[21050,22800,23650,20150,1]
auf den DPmihome-vacuum.0.control.zoneClean
schreibe...
-
@rkccorian du hast da zeilenumbrüche in deinen koordinaten, gibt die mal neu ein
-
@dirkhe Ahhh, stimmt. Jetzt geht es. Bleibt nur noch das Problem, dass der Roboter mit den Koordinaten wohl nichts anfängt. Er reinigt nicht die gewünschte Zone.
Ich habe meine Karte um 90° nach rechts gedreht. Hätte aber erwartet, wenn ich in der App das Rechteck zeichne, der DP diese Daten kurze Zeit später hat (Wird auch damit aktualisiert) und wenn ich diese genauso eingeben, dass es klappt. Aber anscheinend nicht. Muss ich da was beachten? -
@rkccorian kann ich dir gerade nicht sagen, wäre auch davon ausgegangen, dass die gemeldeten daten richtig sind. Ich habe meine damals mitgesnifft, meine ich. Aber im prinzip lefert der adapter das eigentlich. Vielleicht hat der ein oder andere ja nich erfahrung damit
-
@dirkhe Moin! Anbei ein Update...
Folgendes klappt nun...
Blockly
Blockly als JS Code
sendTo("mihome-vacuum.0", "cleanZone", '[21000,28200,23600,30750,1]', async function (result) { console.log(result); });
Oder auch schreiben von
app_zoned_clean;[[21000,28200,23600,30750,1]]
(auf die doppelte Klammerung achten, da mehrere Zonen kommasepariert übergeben werden können) auf DPmihome-vacuum.0.control.X_send_command
Bzgl. Koordinaten gibt es ein Problem. Das ist unabhängig der Kartenorientierung. Bin über https://www.roboter-forum.com/threads/zonen-reinigung-per-iobroker-alexa-steuern-schritt-fuer-schritt-anleitung.26292/page-2#post-327449 drauf gekommen.
Mitte ist immer 25500, 25500 bezogen auf Ladestation (daher ist die Orientierung der Karte egal). Die X-Koordinaten sind auch korrekt im Adapter gemeldet worden. Die Y-Koordinaten sind aber in der Richtung vertauscht. D.h. ich musste die Y-Koordinaten erst neu berechnen über (25500 - Y-Koordinate Adapter) + 25500. > Bug?!
Frage für meine finale Implementierung
Gibt es einen Unterschied, ob ich auf den DPmihome-vacuum.0.control.X_send_command
schreibe oder ob ich SendTo benutze? Gibt es da bspw. eine Queue oder wird ein Befehl unterbrochen, wenn mehrfache Kommandos gleichzeitig kommen? Oder ist es komplett egal? Vielen Dank im Voraus! -
@rkccorian send commsnd ist ein beipass, das wird immer direkt zum robbi gesendet.
DIe anderen laufen immer erst durch den adapter. Der prüft ab, ob gerade ein saugvorgang läuft ubd reiht es in eine queue ein. Das passiert aber adapter intern.
ob das mit den koordinaten ein bug ust, kann ich dir nicht sagen, ich vermute aber mal, das es vom robbi so kommt -
Hallo zusammen, ich habe einen S7 und dieser löst meinen Roomba s9 ab.
Nun vermisse ich etwa die Möglichkeit jeden Raum inidividuell nach Plan zu reinigen.
Sowas wie:
Morgens: Bad nur saugen, Flur stark saugen, Küche nur saugen (in einem Rutsch versteht sich)
Mittags: Bad saugen & intensiv wischen; Kuche saugen & wischen (...)
Abends: Zone1 saugen & intensiv wischen; Flur saugen (...)geht sowas?
Bei meinem S9 habe ich in IoBroker nen Kalender gehabt, von dem aus Flags gesteuert haben welcher Raum in welchem Modus gereinigt werden soll. Mit nem kleinem JavaScript habe ich mir dann ein JSon-Object gebastelt, das zum S9 geschickt und er hat losgelegt.
Kann ich diese Form von Koordination auch mit dem mihome-vacuum Adapter hinbekommen?
So wie ich das sehe kann ich fur den Sauger und den Wischer nur globale Setting vornehmen, richtig ?BTW sehr toller Adapter!!
Vielen Dank dafürKai
-
@ashuan Moin! Soweit ich es sehe geht aktuell nur global. Ich selber stehe vor dem gleichen Problem. Ich werde mir jetzt auch ne Queue erstellen, die folgendes beinhaltet...
- Reinungsmodus (Wischleistung, Saugleistung)
- Zone oder Raum
- Zonendaten oder Raumdaten
Hab sonst auch das Problem, dass zwar die Räume / Zone in der Queue landet, aber der Reinigungsmodus leider nicht.
Viele Grüße!
-
@dirkhe Vielen Dank!
Dann muss ich für meine eigene Queue (vgl. auch den Post direkt über diesem)send_command
nutzen um nicht mit der Queue des Adapter durcheinander zu kommen.Wäre geil, wenn die Adapter-Queue den Saugmodus, etc. mit beinhalten würde.
Viele Grüße!
-
man könnte die timer evtl erweitern, das man den saugmodus noch mit definieren könnte
-
@ashuan Das ist möglich, du kannst eine "JSON" mit den zu reinigenden räumen oder Zonen schicken siehe hier: https://github.com/MeisterTR/XiaomiRobotVacuumProtocol/blob/master/segment_clean.md
oder hier:
https://github.com/MeisterTR/XiaomiRobotVacuumProtocol/blob/master/zoned_clean.md
die commandos kannst du dann über send own command direkt an den Roboter senden (hierbei eben auf die richtige Formatierung in der Adapter readme achten)vielleicht hilft dir das weiter : das Skript sucht in den Alexe Kommandos nach den räumen uns schickt sie dann an den Sauger BSP: "Alexa sauge Flur Küche und Badezimmer" und dann werden die jeweiligen Räume gesaugt.
// 17150,28200 const rooms = [ { name : 'Kueche', id : 17, regex : /küche|Küche/, text : 'Küche', floor: 0 }, { name : 'Flur_unten', id : 19, regex : /flur unten|Flur unten|diele unten/, text : 'Flur unten', floor: 0}, { name : 'Gaestebad', id : 20, regex : /gästebad|gästebadezimmer/, text : 'Gästebadezimmer', floor: 0}, { name : 'Wohnbereich', id : 18, regex : /wohnzimmer|wohnbereich/, text : 'Wohnbereich', floor: 0 }, { name : 'Essbereich', id : 16, regex : /essbereich|esszimmer|Essbereich|Esszimmer/, text : 'Essbereich', floor: 0 }, { name : 'Vorratsraum', id : 21, regex : /vorratsraum|speisekammer/, text : 'Vorratsraum', floor: 0}, //Obergeschoss { name : 'Luisa', id : 7, regex : /luisa|Luisa/, text : 'Luisa`s Zimmer', floor: 1}, { name : 'Finja', id : 6, regex : /Finja|finja/, text : 'Finja`s Zimmer', floor: 1}, { name : 'Badezimmer', id : 7, regex : / bad| badezimmer/, text : 'Badezimmer', floor: 1}, { name : 'Sophia', id : 6, regex : /Sophia|sophia/, text : 'Sophia`s Zimmer', floor: 1}, { name : 'Schlafzimmer', id : 5, regex : /Schlafzimmer|schlafzimmer/, text : 'Schlafzimmer', floor: 1}, { name : 'Waschkammer', id : 18, regex : /waschkammer|wäschekammer| wäsche kammer/, text : 'Waschkammer', floor: 1}, { name : 'Arbeitszimmer', id : 16, regex : /arbeitszimmmer|gästezimmer/, text : 'Badezimmer', floor: 1}, { name : 'Flur_oben', id : 17, regex : /flur oben|Flur unten/, text : 'Flur oben', floor: 1}, ] const debug = true; let id = '' subscribe({ id: "alexa2.0.History.summary", change: "ne" }, function(obj) { id = getState('alexa2.0.History.serialNumber'/*serialNumber*/).val debug && log('Starte id '+ id) findNewRooms(obj.state.val) }); //{"id":8480,"method":"app_segment_clean","params":[{"segments":[17],"repeat":2,"clean_order_mode":0}]} function findNewRooms(array){ const wrongkey = array.match(/sprich mir nach|asd/); const key = array.match(/sauge|sage|reinige|wische|staubsauger/); if(wrongkey || !key) return debug && log(array); const zweimal = array.match(/zwei mal/); const dreimal = array.match(/drei mal/); let wiederholung = 1; let speakText = 'Aber ich lasse den Staubsauger '; let room0IdArray = []; let room1IdArray = []; rooms.forEach((room, index) => { const findRoom = array.match(room.regex); findRoom && debug && log(room.text + ' erkannt') if(findRoom){ if(room0IdArray.length != 0 || room1IdArray.length != 0) speakText += ',' if(room.floor == 0 ) room0IdArray.push(room.id); if(room.floor == 1 ) room1IdArray.push(room.id); speakText += ' '+ room.text } }); const n = speakText.lastIndexOf(','); speakText = speakText.slice(0, n) + speakText.slice(n).replace(',', ' und'); debug && log(JSON.stringify(room0IdArray)) debug && log(JSON.stringify(room1IdArray)) if(zweimal){ wiederholung = 2 speakText += ' zwei mal' } if(dreimal){ wiederholung = 3 speakText += ' drei mal' } setStateDelayed('alexa2.0.Echo-Devices.'+ id +'.Commands.speak', speakText +' saugen!',1500); //starte Roboter Unten if(room0IdArray.length != 0) setStateDelayed('mihome-vacuum.0.control.X_send_command','app_segment_clean;[{"segments":'+JSON.stringify(room0IdArray)+',"repeat":'+ wiederholung +',"clean_order_mode":0}]',3000) // starte Roboter oben if(room1IdArray.length != 0) setStateDelayed('mihome-vacuum.1.control.X_send_command','app_segment_clean;[{"segments":'+JSON.stringify(room1IdArray)+',"repeat":'+ wiederholung +',"clean_order_mode":0}]',3000) }
-
@meistertr Ich versuche auch über Alexa anzubinden. Leider hat der Alexa2 Adapter den Nachteil, dass Alexa schneller reagiert und dann eine negative Antwort kommt, bevor die Daten in ioBroker verarbeitet wurden.
Versuche es gerade auch mit dem iot Adapter, leider klappt das auch nicht zufriedenstellend, vgl. auch https://github.com/ioBroker/ioBroker.iot/issues/442Jemand noch ne gute Idee? Evtl. iot Adapter und dann über Callback Summary von Alexa2 Adapter auswerten o.ä.?
-
@rkccorian also ich habe bei mir fie räume alle in alexa und sage nur "alexa, sauge küche an". Wenn ich mehrere räume ssugen will, sage ich den satz halt mehrmals hintereinander, den rest (queue)macht dann der adapter. Um das zu machen, musst du einfach nur die smartname variable setzten
{ "type": "state", "common": { "name": "clean Room", "type": "boolean", "role": "button", "read": false, "write": true, "desc": "Start Room Cleaning", "smartName": { "de": "sauge Wohnzimmer" } }, "native": {}, "from": "system.adapter.mihome-vacuum.0", "user": "system.user.admin", "ts": 1578400811474, "_id": "mihome-vacuum.0.rooms.20001007939.roomClean", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
-
@meistertr Vielen Dank das werde ich mir mal zu Gemüte führen.
-
@rkccorian wäre mit einer Queue nicht eher das Problem das er den nächsten Raum erst abarbeiten kann wenn er in die Ladestation fährt?
Müsse man nicht eher eine Art Koordinator hinlegen der den Roboter überwacht und soblad der Raum fertig ist (ich weiss nicht ob es dafür einen State gibt), den Roboter in Pause versetzt, die neuen Anweisungen überträgt und Ihn wieder los schickt?So wie ich das sehe gibt es beim S7 MaxV mit Station ja noch die Möglichkeit das er zur Ladestation fährt um dem Mob zu reinigen obwohl er noch nicht fertig ist mit dem Raum.
Entschuldigt die Verwirrung aber ich bin was das angeht eher ein "Perfektionist"
LG
Kai -
@ashuan sobald der status kommt, dass er zurück zur ladestation will, bekommt er den nächsten aus der queue. Während des saugens wird der status auch häufiger abgefragt.
ob der status zur mobreinigung ein anderer ist, wie zur ladestion zurückfahrebn ist, weiss ich gerade nicgt, müsste man mal ausprobieren -
@ashuan Der aktuelle Adapter macht das bereits korrekt, d.h. während der Roboter zur Ladestation zurück fährt wird aus der Adapter Queue der nächste Befehl geschickt.
Probleme aus meiner Sicht:- Man kann die Saug-/Wischleistung nur global steuern. Diese sind im Adapter bislang nicht Bestandteil der Queue. Ich möchte aber über Alexa die Räume unterschiedlich ansteuern können. Damit muss er sich für jeden Raum / jede Zone aber merken, welcher Modus kommandiert wurde
- Verwirrende Sprachansagen: "Fahre zur Ladestation zurück" > "Starte Raumreinigung"
- Darüber hinaus (Problem mit Alexa für mich bislang): Das Kommandieren von unterschiedlichen Modi, mit mehreren Räumen klappt nicht gut (bin ebenfalls Perfektionist).
- Über Alexa2 gibt es das Problem, dass vor meiner Antwort fast immer erstmal kommt, dass der Befehl nicht verstanden wurde, da es zu viel Zeit braucht
- Über iot Adapter klappt das Kommandieren nur eingeschränkt, vgl. auch https://github.com/ioBroker/ioBroker.iot/issues/442
Ich habe für mich inzw. eine Queue programmiert. Jetzt kommt noch die Abarbeitung und für das Alexa-Problem habe ich die Idee eines Workarounds, bei welchem ich Alexa2 und iot Adapter beide benötige. Ich melde mich sobald ich was Neues fertig habe und teile meine Implementierung hier, falls interessant für Dich/Euch. Evtl. kann diese auch in den Adapter kommen