HowTo-Wiki: Xiaomi Mi Robot über homee steuern

Hallo zusammen, nachdem es bereits hier eine Anleitung gibt, wie man den Xiaomi Saugroboter V1 über Home Assistant mit Webhooks ansteuert, will ich euch nicht meine Lösung über iobroker, Node Red und einen Wemo Emulator, der den aktuellen Status des Saugroboters in homee anzeigt, vorenthalten.

–> Ergänzung 11.02.2020: Durch die neue Weiter-Entwicklung der virtuellen Geräte lässt sich das auch über hih und Node-Red umsetzen. Flow von @shamrock siehe hier: Mal wieder virtuelle Geräte - jetzt aber richtig!


Disclaimer:
Das hier ist ein Software-Bastelprojekt für Erfahrenere und die Umsetzung bedingt zusätzliche Hardware (z.B. einen Raspi Pi) und Software (iobroker mit installiertem Node Red Adapter)

Start und Installation von iobroker
Als erstes müssen wir auf dem Raspberry Pi iobroker installieren. Ich hatte immer wieder am Anfang Probleme mit dem fertigen Image ( welches man hier herunterladen kann) und dem Node Red Adapter, weswegen ich das fertige Raspbian ohne GUI auf die SD-Karte geflasht habe. (Siehe hier das Raspbian Stretch Lite)

Nach dem ersten Start habe ich iobroker gemäß dieser Anleitung erfolgreich installiert.

nun kann man iobroker über http://IP-Adresse:8081 aufrufen. Als erstes sollte kontrolliert werden, ob der Host die neueste Version beinhaltet, da dies anscheinend zu Fehlern führen kann wenn man mit einem älteren Host neuere Adapter installiert.

Installation der notwendigen iobroker-Adapter

Als erstes müssen wir die Adapter mihome-vacuum und Node Red Adapter installieren. Dazu unter dem Reiter Adapter beide aussuchen und rechts in der Zeile auf das “+” klicken. Die Adapter werden nun im Hintergrund installiert.


WICHTIG: Bei verwendung von iobroker mit dem Node Red Adapter wird keine weitere Node Red Instanz auf dem Pi benötigt! Also z.B. nicht Node Red nachträglich über homeean installieren, da sonst die iobroker Nodes fehlen und die Verbindung iobroker <-> Node Red nicht funktioniert.


Verbindung des Saugroboters mit iobroker

Um den Saugroboter mit dem iobroker Adapter zu verbinden, wird der Token benötigt. Dazu gibt es mehrere Möglichkeiten. Die werden auf den oben verlinkten HowTo kurz vorgestellt, finden sich aber auch hier.

Ich habe es mit einem Android und dem MiToolkit v1.6 gelöst - hatte am Anfang Probleme damit, konnte es aber am Ende einfach mit einem anderen Handy auslösen. Wichtig ist, dass das Handy nicht verschlüsselt ist. Mit einem Verschlüsselten Handy funktioniert es nicht, weil man dann ein Passwort eingeben muss.

Ist erst einmal der Token ausgelesen, läuft das ganze ganz entspannt ab.
Unter dem iobroker Reiter Instanzen wählt man den Saugroboter Adapter aus, klickt auf Konfiguration und füllt die Felder aus:

Hat alles funktioniert, kann man unter “Objekte” den Saugroboter mit einem simulierten Tastendruck bedienen.


Verknüpfung homee mit iobroker über Node Red herstellen
Nun kann man sich Node Red wenden um die Verbindung homee <-> iobroker zu realisieren.

Um die Nötigen Wemo Nodes zu installieren, geht man in der Node Red Ansicht oben rechts auf das Menü -> Manage Palette -> install und installiert diese beiden Nodes:

In der linken Spalte befinden sich nun die entsprechenden Wemo Nodes.
Um den Saugroboter als Gerät mit den Funktionen “Ein” und “Aus” in homee anzulegen, wird der “wemo emu” Node in das leere Feld gezogen und losgelassen. Anschließend kann man den Node mit einem Doppelklick analog wie im Bild konfigurieren.

Durch Klick oben rechts auf Deploy wird der Flow gespeichert und man kann den Schalter in homee unter den Wemo Schaltern hinzufügen.

Nun kann in homee der Schalter für den Saugroboter - allerdings bisher ohne Funktion - angesprochen werden und geschaltet werden und über Homeegrame angesteuert und als Bedingung benutzt werden.

Nun habe ich die folgenden Flows erstellt, damit das Einschalten des Schalters in homee zum Start des Reinigungsvorgangs führt:

Dazu werden noch drei iobroker Output Nodes benötigt, ein delay und ein Switch.
Nach einem Doppelklick auf die iobroker Output Nodes rechts neben Topic auf das Feld gehen, den entsprechenden Control Befehl des mihome Adapters auswählen und speichern.
Um es einfacher zu machen, kann man den Flow einfach in Node Red importieren, dafür den unteren Flow markieren, oben rechts in Node Red wieder auf das Menü gehen -> Import -> Clipboard und dort den Flow reinkopieren.

[
{
    "id": "ebc3425b.5c28a8",
    "type": "wemo-emulator",
    "z": "74688e9c.1ad388",
    "name": "Robbi",
    "friendlyName": "Robbi",
    "serial": "45",
    "port": "49154",
    "onTopic": "switch/Robbi",
    "onPayload": "on",
    "offTopic": "switch/Robbi",
    "offPayload": "off",
    "x": 110,
    "y": 283,
    "wires": [
        [
            "94d96bf1.9d92"
        ]
    ]
},
{
    "id": "94d96bf1.9d92",
    "type": "switch",
    "z": "74688e9c.1ad388",
    "name": "",
    "property": "payload",
    "propertyType": "msg",
    "rules": [
        {
            "t": "eq",
            "v": "on",
            "vt": "str"
        },
        {
            "t": "eq",
            "v": "off",
            "vt": "str"
        }
    ],
    "checkall": "true",
    "repair": false,
    "outputs": 2,
    "x": 329,
    "y": 232,
    "wires": [
        [
            "bbe789d0.9b2008"
        ],
        [
            "52e9a75b.f03e3",
            "acaf2f70.4b791"
        ]
    ]
},
{
    "id": "bbe789d0.9b2008",
    "type": "ioBroker out",
    "z": "74688e9c.1ad388",
    "name": "Start vacuum",
    "topic": "mihome-vacuum.0.control.start",
    "ack": "false",
    "autoCreate": "true",
    "x": 760,
    "y": 179,
    "wires": []
},
{
    "id": "52e9a75b.f03e3",
    "type": "ioBroker out",
    "z": "74688e9c.1ad388",
    "name": "Pause vacuum",
    "topic": "mihome-vacuum.0.control.pause",
    "ack": "false",
    "autoCreate": "true",
    "x": 773,
    "y": 247,
    "wires": []
},
{
    "id": "acaf2f70.4b791",
    "type": "delay",
    "z": "74688e9c.1ad388",
    "name": "",
    "pauseType": "delay",
    "timeout": "1",
    "timeoutUnits": "seconds",
    "rate": "1",
    "nbRateUnits": "1",
    "rateUnits": "second",
    "randomFirst": "1",
    "randomLast": "5",
    "randomUnits": "seconds",
    "drop": false,
    "x": 534,
    "y": 306,
    "wires": [
        [
            "ceb8cd9e.fb29c8"
        ]
    ]
},
{
    "id": "ceb8cd9e.fb29c8",
    "type": "ioBroker out",
    "z": "74688e9c.1ad388",
    "name": "Go home",
    "topic": "mihome-vacuum.0.control.home",
    "ack": "false",
    "autoCreate": "true",
    "x": 763,
    "y": 313,
    "wires": []
}

]

Man kann leider mit einem Home-Befehl den Reinigungsvorgang nicht beenden und den Saugroboter zum Laden schicken, deswegen muss erst ein Stop- und dann der Home-Befehl ausgeführt werden.

Um einen Rückkanal einzurichten, der automatisch den Schalter in homee auf “Aus” stellt, wenn der Roboter fertig gesaugt hat, habe ich folgenden Flow erstellt:

 [
{
    "id": "18c1beaf.42f271",
    "type": "wemo out",
    "z": "74688e9c.1ad388",
    "name": "Robbi",
    "device": "b9a5e5ba.554b1",
    "label": "Robbi",
    "x": 888,
    "y": 569,
    "wires": []
},
{
    "id": "e83b7dd6.168f88",
    "type": "function",
    "z": "74688e9c.1ad388",
    "name": "Robi fertig",
    "func": "if (msg.payload  === `8`)\n{return {payload: `off` };}",
    "outputs": 1,
    "noerr": 0,
    "x": 559,
    "y": 564,
    "wires": [
        [
            "18c1beaf.42f271"
        ]
    ]
},
{
    "id": "a32c027.6e403",
    "type": "ioBroker in",
    "z": "74688e9c.1ad388",
    "name": "Vacuum state",
    "topic": "mihome-vacuum.0.info.state",
    "payloadType": "value",
    "onlyack": "",
    "func": "rbe",
    "gap": "",
    "x": 294,
    "y": 567,
    "wires": [
        [
            "e83b7dd6.168f88"
        ]
    ]
},
{
    "id": "b9a5e5ba.554b1",
    "type": "wemo-dev",
    "z": "",
    "device": "45",
    "name": "Robbi"
} ]

Nun kann man über homee den Saugroboter ansteuern und hat auch jederzeit in homee den aktuellen Status des Saugroboters, auch wenn man den manuell am Gerät zur Ladestation schickt.
Des weiteren kann der homee nun in Homeegramme eingesetzt werden.
So fährt bei mir der Robi wieder zur Ladestation zurück, wenn ich nach Hause komme und der Modus von Abwesend auf Anwesend wechselt. (Ich lasse ihn immer nur fahren wenn niemand Zuhause ist)
Die Weiteren Möglichkeiten dafür sind nahezu unendlich - wenn ihr wollt könnt ihr ja Vorschläge zur Verbesserung oder eure Use-Cases mal teilen!
Freue mich auf jeden Fall auf Feedback für mein erstes HowTo/Wiki.

21 „Gefällt mir“

ein dickes Dankeschön… ich werde das die nächsten Wochen angehen… raspi mit iobroker läuft schon für meine heizungssteuerung… und das werden dann meine ersten schritte mit nodered werden… danke nochmal

hey… ich arbeite mich gerade durch deine Erklärung und bin mir nicht ganz sicher wie die Verknüpfung auf homee läuft… .entweder habe ich da was übersehen oder ich bin blind ^^

also gemacht wurde:
iobroker -> läuft
saugroboter -> läuft (ansteuerbar über klicks in iobroker)
node red -> installiert (ist jetzt eine Instanz in iobroker
flows -> nach Anleitung und bestem wissen und gewissen angelegt

so… wie bekomme ich jetzt da eine Verbindung zu homee? wie kann ich homee die sauger loslaufen lassen? wo ist die Schnittstelle zwischen dem flow eingang und einem homee ausgang? da stehe ich gerade irgendwie auf dem schlauch

Die Verbindung geschieht über einen fiktiven WeMo Schalter. Anlegen wie oben beschrieben und dann bei homee auf Einlernen > Wlan > und den WeMo auswählen.

:coffee:

da war ich gerade… findet keine wemo geräte… anscheinend habe ich übergeordnet noch was vergessen/Denkfehler
ich suche weiter…
danke erstmal für den tip das ich auf der richtigen spur war…

edit: Vermutung… bei mir läuft zu testzwecken gerade der iobroker auf meinem pc der per lan im Netzwerk hängt… homee hängt “noch” im wlan… kann es sein das er deswegen den virtuellen schalter nicht findet?

Wahrscheinlich findest du im Forum unter dem Begriff WeMo noch ein paar weiterführende Tipps.

Oder in den langen Anleitung von Stefan: https://himpler.com/blog/virtuelle-geraete-in-homee

:coffee:

Ich raffe es nicht!
WIE komme ich an den Token des Roboters?
Ich habe nur IOS Geräte oder einen Raspi zur Verfügung.
Das Tool für den Raspi wirft aber unter Token nur ??? aus.

Was kann oder muss ich machen???

Schau doch mal im https://www.roboter-forum.com/index.php?board/130-xiaomi/ rein.

Oder leih dir ein Android Gerät für die Russland App. Leider hat Xiaomi viele ehemals guten Möglichkeiten blockiert.

:coffee:

Probiere das einmal:
iOS

Configure the robot with the Mi-Home app.
Using iTunes, create an unencrypted backup of your iPhone.
Install iBackup Viewer, open it, and open your backup.
Open the “Raw Data” module.
Navigate to com.xiaomi.mihome.
Search for a file that looks like this: 123456789_mihome.sqlite – note that _mihome.sqlite is not the correct file.
Save this file to your filesystem.
Install DB Browser for SQLite.
Open DB Browser and load the .sqlite file you saved from your backup.
Click on the Execute SQL tab.
Input and run this query: SELECT ZTOKEN FROM ZDEVICE WHERE ZMODEL LIKE "%vacuum%"
Copy the returned 32-digit hexadecimal string to your clipboard.
Open Terminal and execute this command: echo '0: <YOUR HEXADECIMAL STRING>' | xxd -r -p | openssl enc -d -aes-128-ecb -nopad -nosalt -K 00000000000000000000000000000000
Use the resulting string as your token.

Andernfalls kann ich dir mit iOS nicht weiter helfen, da ich kein Gerät damit besitze. Das habe ich aus der im Ausgangsbeitrag verlinkten Anleitung zu iOS heraus kopiert.

2 „Gefällt mir“

Das habe ich gerade gemacht. Am Ende bekomme ich einen Token, der an die 32 Stellen hat.
Kann das korrekt sein???

1 „Gefällt mir“

Ja, schau hier:

1 „Gefällt mir“

Ok, danke Jungs. :beers:
Dann denke ich, es hat funktioniert. Werde das dann morgen in Io Broker testen :wink:

1 „Gefällt mir“

Morgen ist ja auch in einer Viertel Stunde. :wink:

Guten Morgen.
So, der Robbi läuft über io-Broker, aber in Node-Red erhalte ich nach dem Import der Flows das hier:
image

Die Nodes habe ich aber alle importiert?! Muß ich den Wemo erst in homee integrieren oder woher kommt dieser “Zustand” bei den Outputs?

Edit: Ich habe definitiv keine Verbindung zwischen iobroker und Node-Red, finde den Fehler aber nicht.

Hast du Node Red über iobroker installiert oder über homeean? Dir fehlen die iobroker Nodes, was ein Zeichen dafür ist, daß du Node Red unabhängig von iobroker installiert hast.

Lösche Node Red noch einmal und installiere über iobroker den Node Red Adapter. Danach solltest du die iobroker Nodes haben und eine Verbindung aufbauen können.

1 „Gefällt mir“

GREAT ! Das hat funktioniert und mir somit eine komplette Neuinstallation erspart. Danke! :beers:

1 „Gefällt mir“

Da unser Robbi auf unterschiedlichen Ebenen und dann ggf. auch ohne die Basis saugen soll, habe ich einen 2. Wemo für die Basisstation integriert und den Flow etwas umgebaut:

image

1 „Gefällt mir“

Das ist auch das gute an Node Red. Du kannst alles so personalisieren wie du möchtest. :slight_smile: Ich habe z.b. mittlerweile auch für meine Wohnung jeden Raum als Koordinaten und einen Wemo Schalter, kann über ein einfaches “Schalte Saugen Küche ein” zu Google sagen, dass nur die Küche gesaugt werden soll. Oder per Tastendruck auf einen Schalter. Da gibt es unzählige Möglichkeiten :slight_smile:

1 „Gefällt mir“

Das klingt sehr interessant. Wie genau grenzt Du den jeweiligen Raum ein?

Für Android gibt es die Flole App. Damit lassen sich Koordinaten auslesen und dann als Zonenreinigung aktivieren.