Es gibt bereits ein HowTo zu diesem Thema, in diesem werden alle Funktionen in free@home gebracht. Mein Ansatz ist etwas schlichter gehalten.
XIAOMI Robot Vacuum S6 controlled by free@home
Voraussetzungen:
SysAP 2.0, Node-Red
Node-Red benötigt die Palette "node-red-contrib-miio-roborock"
Virtual device:
Um den Staubsauger einzubinden, müsst ihr zunächst die free@home local API aktivieren (geht in der App oder über die Weboberfläche), im Browser auf http://AP-IP/swagger/ gehen und euch mit dem Installations-Benutzer authentifizieren.
Wenn das geschehen ist, müsst ihr ein neues virtuelles Gerät erstellen. Dazu müsst ihr den Reiter "Create virtual device" ausklappen und auf "Try it out" klicken.
Legt jetzt einen DimActuator an, die Prozentanzeige können wir später für den Ladezustand des Staubsaugers nutzen (mit etwas Kreativität sicherlich auch um die Saugleistung einzustellen ;P ).
Bsp.
{ "type": "DimActuator", "properties": { "ttl": "-1", "displayname": "Robot"}}
Dann auf "Execute" drücken. Ihr bekommt unterhalb des Execute-Knopfs eine Rückmeldung mit der vom System vergebenen AKTOR-ID (Die beginnt mit 6000).
Bsp.
{ "00000000-0000-0000-0000-000000000000": {"devices": {"6000E8B3099F": {"serial": "dim00001"}}}}
Node-Red
Nachdem ihr den untenstehenden Node importiert habt, müsst ihr die AP-IP, Installations-Benutzer und Aktor ID anpassen. Zudem muss der node-red-contrib-miio-roborock Konfigurations-Node mit der IP und Token des Staubsaugers eingerichtet werden.
Angepasst werden muss:
installer:pass@AP-IP im Websocket und in den HTTP Request Nodes.
AKTOR-ID im Switch Node, is on/off Node und in den HTTP Request Nodes.
IP und Token im Roborock Node
[ { "id": "674ee98cf40f8231", "type": "http request", "z": "f6f2187d.f17ca8", "name": "DimActor-odp0000-onoff", "method": "PUT", "ret": "txt", "paytoqs": "ignore", "url": "http://installer:pass@AP-IP/fhapi/v1/api/rest/datapoint/00000000-0000-0000-0000-000000000000/AKTOR-ID.ch0000.odp0000", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "credentials": {}, "x": 550, "y": 400, "wires": [ [] ] }, { "id": "778a24ba49caeda8", "type": "miio-roborock-event", "z": "f6f2187d.f17ca8", "name": "", "server": "", "outputAtStartup": true, "x": 160, "y": 400, "wires": [ [ "5a1ba8b4cb7f97c2", "3b1b43f01af1363d" ] ] }, { "id": "5a1ba8b4cb7f97c2", "type": "function", "z": "f6f2187d.f17ca8", "name": "battery", "func": "var payload=msg.payload.key;\nif (payload == \"battery\") {\n msg.payload=msg.payload.value\n return msg;\n}\n\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 340, "y": 440, "wires": [ [ "f28460e546d1d406" ] ] }, { "id": "f28460e546d1d406", "type": "http request", "z": "f6f2187d.f17ca8", "name": "DimActor-odp0001-dimvalue", "method": "PUT", "ret": "txt", "paytoqs": "ignore", "url": "http://installer:pass@AP-IP/fhapi/v1/api/rest/datapoint/00000000-0000-0000-0000-000000000000/AKTOR-ID.ch0000.odp0001", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 540, "y": 440, "wires": [ [] ] }, { "id": "3b1b43f01af1363d", "type": "function", "z": "f6f2187d.f17ca8", "name": "is_cleaning?", "func": "var payload=msg.payload.key;\nif (payload == \"in_cleaning\") {\n msg.payload=msg.payload.value\n return msg;\n}\n\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 350, "y": 400, "wires": [ [ "674ee98cf40f8231" ] ] }, { "id": "db946b5756357edf", "type": "link in", "z": "f6f2187d.f17ca8", "name": "Gizmo IN", "links": [ "162fdb111de5638d" ], "x": 95, "y": 340, "wires": [ [ "a98b64e3a0a77fc7" ] ] }, { "id": "0ceaec9f7fda8a1e", "type": "function", "z": "f6f2187d.f17ca8", "name": "is on/off", "func": "var payload=msg.payload[\"00000000-0000-0000-0000-000000000000\"].datapoints[\"AKTOR-ID/ch0000/idp0000\"];\nif(isNaN(payload)) {\n return null; //halt flow\n}\nelse{\nvar int_payload=parseInt(payload);\nif (int_payload == 1) {\n msg.payload=int_payload\n return [msg,null];\n}\nmsg.payload=int_payload\nreturn [null,msg];\n}\n", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 560, "y": 340, "wires": [ [ "80d2640304274b83", "8a9b3985a380e1c2" ], [ "14baa9ae0e778d83", "6f2a1694a1d9153b" ] ] }, { "id": "14baa9ae0e778d83", "type": "miio-roborock-command", "z": "f6f2187d.f17ca8", "name": "", "server": "", "command_name": "◼ Stop & dock", "command": "app_stop_dock", "commandType": "vacuum_cmd", "payload": "payload", "payloadType": "msg", "coordinates": "", "fan_speed": 100, "voice_pack": null, "homekit_stop_to_dock": false, "x": 800, "y": 400, "wires": [ [] ] }, { "id": "80d2640304274b83", "type": "miio-roborock-command", "z": "f6f2187d.f17ca8", "name": "", "server": "", "command_name": "► Start", "command": "app_start", "commandType": "vacuum_cmd", "payload": "payload", "payloadType": "msg", "coordinates": "", "fan_speed": 100, "voice_pack": null, "homekit_stop_to_dock": false, "x": 780, "y": 360, "wires": [ [] ] }, { "id": "a98b64e3a0a77fc7", "type": "switch", "z": "f6f2187d.f17ca8", "name": "is_ID 6000DC4C2B14", "property": "payload", "propertyType": "msg", "rules": [ { "t": "cont", "v": "6000DC4C2B14", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 240, "y": 340, "wires": [ [ "4ce518a12832698c" ] ] }, { "id": "4ce518a12832698c", "type": "json", "z": "f6f2187d.f17ca8", "name": "", "property": "payload", "action": "obj", "pretty": false, "x": 430, "y": 340, "wires": [ [ "0ceaec9f7fda8a1e" ] ] }, { "id": "8a9b3985a380e1c2", "type": "http request", "z": "f6f2187d.f17ca8", "name": "DimActor-odp0000-onoff", "method": "PUT", "ret": "txt", "paytoqs": "ignore", "url": "http://installer:pass@AP-IP/fhapi/v1/api/rest/datapoint/00000000-0000-0000-0000-000000000000/AKTOR-ID.ch0000.odp0000", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 830, "y": 320, "wires": [ [ "d07958341e59344f" ] ] }, { "id": "6f2a1694a1d9153b", "type": "http request", "z": "f6f2187d.f17ca8", "name": "DimActor-odp0000-onoff", "method": "PUT", "ret": "txt", "paytoqs": "ignore", "url": "http://installer:pass@AP-IP/fhapi/v1/api/rest/datapoint/00000000-0000-0000-0000-000000000000/AKTOR-ID.ch0000.odp0000", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 830, "y": 440, "wires": [ [ "3138b5202688d433" ] ] }, { "id": "d07958341e59344f", "type": "debug", "z": "f6f2187d.f17ca8", "name": "Staubsauger eingeschaltet", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1080, "y": 320, "wires": [] }, { "id": "3138b5202688d433", "type": "debug", "z": "f6f2187d.f17ca8", "name": "Staubsauger ausgeschaltet", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1080, "y": 440, "wires": [] }, { "id": "84462cfd45ba8f78", "type": "websocket in", "z": "f6f2187d.f17ca8", "name": "f@h websocket", "server": "", "client": "640b2cab.576684", "x": 160, "y": 280, "wires": [ [ "162fdb111de5638d" ] ] }, { "id": "162fdb111de5638d", "type": "link out", "z": "f6f2187d.f17ca8", "name": "Free@home WebOut", "links": [ "5c4893a3.da44bc", "c7fd5c31.cb89d", "cf78e61.5db6918", "a811ebf2.385e18", "2802d49.900422c", "c30238c3.fef338", "4f60647f.8aa4ac", "db946b5756357edf", "f2c1426620c4eb08", "a7bdf4b5975a1688", "e382cafba4a0186b", "bb7c16c1ff059a8d", "49637ed88b4e09a8" ], "x": 275, "y": 280, "wires": [] }, { "id": "640b2cab.576684", "type": "websocket-client", "path": "ws://installer:pass@AP-IP/fhapi/v1/api/ws", "tls": "", "wholemsg": "false", "hb": "0", "subprotocol": "" } ]
Jetzt solltet ihr den Staubsauger aus free@home ein und ausschalten können, zudem werden Status und Akkustand des Staubsaugers an free@home zurückgemeldet. Der virtuelle Dimmer wird in die passenden zustände versetzt, wenn ihr die Tasten auf dem Staubsauger drückt.
Z.B lässt sich der Staubsauger nun auch über ein Zeitprofil starten und es muss nicht mehr zusätzlich die Xiaomi App genutzt werden.
Ps. Falls jemand von Busch-Jaeger mitliest, es wäre cool, wenn man beim Dimmaktor das Symbol auch auswählen könnte, wie es beim Schaltaktor der Fall ist :)