Xiaomi Robot Vacuum Binding

As I own the same vacuum cleaner, I created a Github issue with the mentioned device testing file.

If things went right, you can now see all the channels for your device. (if not, delete the thing and let it be discovered again)
Based on the responses seems all of the request for properties returned values

Can you also confirm that the actions are working or at least the essential ones like start/stopping the cleaning)

Thanks for your reply. But unfortunately it doesn’t work…

The channels were not there, so I removed the thing again and started a discovery. But the vacuum cleaner is only recognized with type “miio:generic”.

In the log file I find these lines

2022-05-18 22:51:53.076 [WARN ] [iio.internal.discovery.MiIoDiscovery] - Discovered from cloud, but ignored because not supported: 521112821 Device name: 'Dreame Bot L10 Pro', did: '521112821', token: '***MASKED***', ip: ***MASKED***, server: de
2022-05-18 22:51:53.082 [INFO ] [g.discovery.internal.PersistentInbox] - Added new thing 'miio:generic:1F0F8CF5' to inbox.

It is not a problem that it is discovered as generic, after a minute or so it should change itself to a basic device, with the database file created:/etc/openhab/misc/miio/dreame.vacuum.p2029-miot-experimental.json

If not, restart the binding (or restart openhab) to make sure the created database file is picked up from the folder.

Restarting the binding did the trick. I’ll test the functionality this evening.

Is it possible send the robot to a specific room?

Yes you can.
You get access to the rooms defined in the app also in OpenHAB.
Example: I can send my robot to various rooms, or multiple rooms depending on what I select in the OH app.

Example of my basic rule, there is also a full widget for it available in another thread.

Thank you that sounds good.
But for my Dreame Bot L10 Pro the Roborock commands don’t work.

Marcel said, with an hacked Xiaomi app it is possible to extract the commands sent by the app. Has anybody experience here how to do that in detail? Is there a thread about it? I would like to know how to do it if nobody had done it yet.

perform the operation, read the log
https://4pda.to/forum/index.php?showtopic=954235&st=2640#entry91877032

https://rumihome.ru/

https://home.miot-spec.com/spec/dreame.vacuum.p2029

1 Like

Does anyone else already added a Roborock 7 maxV to his/her OH instance?

It says it is a roborock.vacuum.a27 model but I couldn’t find anything regarding this model in the forums. Experimental discovery retrieved some channels but not really a lot of useful ones. These are the contents of the created roborock.vacuum.a27-experimental.json file.

{
  "deviceMapping": {
    "id": [
      "roborock.vacuum.a27"
    ],
    "propertyMethod": "get_prop",
    "maxProperties": 2,
    "channels": [
      {
        "property": "battery",
        "friendlyName": "Battery",
        "channel": "battery",
        "channelType": "system:battery-level",
        "type": "Number",
        "refresh": true,
        "ChannelGroup": "Status",
        "actions": []
      },
      {
        "property": "",
        "friendlyName": "BT Gateway",
        "channel": "bt-gw",
        "type": "String",
        "stateDescription": {
          "readOnly": false,
          "options": [
            {
              "value": "disable",
              "label": "Disable"
            },
            {
              "value": "enable",
              "label": "Enable"
            }
          ]
        },
        "refresh": true,
        "customRefreshCommand": "bt_gateway_status",
        "transformation": "getJsonElement-gateway_status",
        "actions": [
          {
            "command": "bt_gateway_enable",
            "parameterType": "EMPTY",
            "condition": {
              "name": "matchValue",
              "parameters": [
                {
                  "matchValue": "enable"
                }
              ]
            }
          },
          {
            "command": "bt_gateway_disable",
            "parameterType": "EMPTY",
            "condition": {
              "name": "matchValue",
              "parameters": [
                {
                  "matchValue": "disable"
                }
              ]
            }
          }
        ],
        "category": "bluetooth",
        "readmeComment": "Value mapping `[\"disable\"\u003d\"Disable\",\"enable\"\u003d\"Enable\"]`"
      },
      {
        "property": "",
        "friendlyName": "Connected BT Gateway Devices",
        "channel": "bt-gw-devices",
        "type": "String",
        "stateDescription": {
          "readOnly": true
        },
        "refresh": true,
        "refreshInterval": 2,
        "customRefreshCommand": "/device/get_bledevice_by_gateway",
        "customRefreshParameters": {
          "dids": [
            "$deviceId$"
          ]
        },
        "transformation": "getDiDElement",
        "actions": [],
        "category": "bluetooth",
        "readmeComment": "Note, refreshes every 2nd refresh. Channel requires cloud connectivity to function. Sample widget to visualise the (json) output available from the widget market"
      },
      {
        "property": "get_arming",
        "friendlyName": "Guard",
        "channel": "guard",
        "type": "Switch",
        "refresh": true,
        "customRefreshCommand": "get_arming",
        "actions": [
          {
            "command": "set_arming",
            "parameterType": "ONOFF"
          }
        ],
        "category": "alarm",
        "tags": [
          "Alarm"
        ]
      },
      {
        "property": "get_arming_time",
        "friendlyName": "Arming Time",
        "channel": "arming_time",
        "type": "Number:Time",
        "unit": "seconds",
        "refresh": true,
        "customRefreshCommand": "get_arming_time",
        "actions": [
          {
            "command": "set_alarming_time",
            "parameterType": "NUMBER"
          }
        ],
        "category": "time",
        "tags": [
          "Setpoint",
          "Duration"
        ]
      },
      {
        "property": "language",
        "friendlyName": "Voice prompt Language",
        "channel": "language",
        "type": "String",
        "refresh": true,
        "customRefreshCommand": "get_device_prop[\"lumi.0\",\"gateway_lang\"]",
        "actions": [],
        "category": "settings"
      },
      {
        "property": "get_zigbee_channel",
        "friendlyName": "Zigbee Channel",
        "channel": "zigbee_channel",
        "type": "String",
        "refresh": true,
        "customRefreshCommand": "get_zigbee_channel",
        "actions": [],
        "category": "settings"
      },
      {
        "property": "lumi_bind",
        "friendlyName": "Lumi_bind info",
        "channel": "lumi_bind",
        "type": "String",
        "refresh": true,
        "customRefreshCommand": "get_lumi_bind",
        "actions": [],
        "category": "settings"
      },
      {
        "property": "Query_Machine_Status",
        "friendlyName": "status",
        "channel": "Status",
        "type": "String",
        "refresh": true,
        "customRefreshCommand": "true",
        "ChannelGroup": "actions",
        "actions": []
      }
    ]
  }
}

And this is the output when using the “new MIOT protocol” switch:

{
	"deviceMapping": {
		"id": [
			"roborock.vacuum.a27"
		],
		"propertyMethod": "get_properties",
		"maxProperties": 1,
		"channels": [
			{
				"property": "",
				"friendlyName": "Actions",
				"channel": "actions",
				"type": "String",
				"stateDescription": {
					"options": [
						{
							"value": "vacuum-start-sweep",
							"label": "Vacuum Start Sweep"
						},
						{
							"value": "vacuum-stop-sweeping",
							"label": "Vacuum Stop Sweeping"
						},
						{
							"value": "vacuum-start-mop",
							"label": "Vacuum Start Mop"
						},
						{
							"value": "vacuum-start-sweep-mop",
							"label": "Vacuum Start Sweep Mop"
						},
						{
							"value": "vacuum-start-room-sweep",
							"label": "Vacuum Start Room Sweep"
						},
						{
							"value": "battery-start-charge",
							"label": "Battery Start Charge"
						},
						{
							"value": "generic-rpc-generic-rpc-call",
							"label": "Generic Rpc Generic Rpc Call"
						}
					]
				},
				"refresh": false,
				"actions": [
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 2,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-stop-sweeping"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 4,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 5,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							9.0
						],
						"siid": 2,
						"aiid": 6,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-room-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 3,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "battery-start-charge"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							1.0
						],
						"siid": 7,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "generic-rpc-generic-rpc-call"
								}
							]
						}
					}
				]
			},
			{
				"property": "status",
				"siid": 2,
				"piid": 1,
				"friendlyName": "Robot Cleaner - Status",
				"channel": "status",
				"type": "Number",
				"stateDescription": {
					"readOnly": true,
					"options": [
						{
							"value": "1",
							"label": "Idle"
						},
						{
							"value": "2",
							"label": "Idle"
						},
						{
							"value": "3",
							"label": "Idle"
						},
						{
							"value": "5",
							"label": "Sweeping"
						},
						{
							"value": "6",
							"label": "Go Charging"
						},
						{
							"value": "7",
							"label": "Sweeping"
						},
						{
							"value": "8",
							"label": "Charging"
						},
						{
							"value": "10",
							"label": "Paused"
						},
						{
							"value": "11",
							"label": "Sweeping"
						},
						{
							"value": "12",
							"label": "Error"
						},
						{
							"value": "14",
							"label": "Updating"
						},
						{
							"value": "15",
							"label": "Go Charging"
						},
						{
							"value": "16",
							"label": "Sweeping"
						},
						{
							"value": "17",
							"label": "Sweeping"
						},
						{
							"value": "18",
							"label": "Sweeping"
						},
						{
							"value": "26",
							"label": "Go Charging"
						},
						{
							"value": "22",
							"label": "Emptying"
						},
						{
							"value": "23",
							"label": "Wash"
						},
						{
							"value": "29",
							"label": "Sweeping"
						}
					]
				},
				"refresh": true,
				"actions": [],
				"readmeComment": "Value mapping [\"1\"\u003d\"Idle\",\"2\"\u003d\"Idle\",\"3\"\u003d\"Idle\",\"5\"\u003d\"Sweeping\",\"6\"\u003d\"Go Charging\",\"7\"\u003d\"Sweeping\",\"8\"\u003d\"Charging\",\"10\"\u003d\"Paused\",\"11\"\u003d\"Sweeping\",\"12\"\u003d\"Error\",\"14\"\u003d\"Updating\",\"15\"\u003d\"Go Charging\",\"16\"\u003d\"Sweeping\",\"17\"\u003d\"Sweeping\",\"18\"\u003d\"Sweeping\",\"26\"\u003d\"Go Charging\",\"22\"\u003d\"Emptying\",\"23\"\u003d\"Wash\",\"29\"\u003d\"Sweeping\"]"
			},
			{
				"property": "fault",
				"siid": 2,
				"piid": 2,
				"friendlyName": "Robot Cleaner - Device Fault",
				"channel": "fault",
				"type": "Number",
				"stateDescription": {
					"minimum": 0,
					"maximum": 255,
					"step": 1,
					"pattern": "%.0f",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "mode",
				"siid": 2,
				"piid": 4,
				"friendlyName": "Robot Cleaner - Mode",
				"channel": "mode",
				"type": "Number",
				"stateDescription": {
					"options": [
						{
							"value": "101",
							"label": "Silent"
						},
						{
							"value": "102",
							"label": "Basic"
						},
						{
							"value": "103",
							"label": "Strong"
						},
						{
							"value": "104",
							"label": "Full Speed"
						},
						{
							"value": "105",
							"label": "Silent"
						},
						{
							"value": "106",
							"label": "Custom"
						}
					]
				},
				"refresh": true,
				"actions": [
					{
						"command": "set_properties",
						"parameterType": "NUMBER"
					}
				],
				"readmeComment": "Value mapping [\"101\"\u003d\"Silent\",\"102\"\u003d\"Basic\",\"103\"\u003d\"Strong\",\"104\"\u003d\"Full Speed\",\"105\"\u003d\"Silent\",\"106\"\u003d\"Custom\"]"
			},
			{
				"property": "battery-level",
				"siid": 3,
				"piid": 1,
				"friendlyName": "Battery - Battery Level",
				"channel": "battery_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level",
				"siid": 9,
				"piid": 2,
				"friendlyName": "Main Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level1",
				"siid": 10,
				"piid": 2,
				"friendlyName": "Side Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level1",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "filter-life-level",
				"siid": 11,
				"piid": 1,
				"friendlyName": "Filter - Filter Life Level",
				"channel": "filter_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			}
		],
		"experimental": true
	}
}

I does look better but there are not really a lot of channels. I will experiment some more now…

And here comes the log output (was too long to include it in my last post):

2022-06-08 17:14:09.898 [INFO ] [g.discovery.internal.PersistentInbox] - Added new thing 'miio:generic:1FE905B2' to inbox.
2022-06-08 17:15:17.994 [INFO ] [internal.handler.MiIoAbstractHandler] - Mi Device model roborock.vacuum.a27 identified as: Unknown Mi IO Device (unknown). Does not match thingtype miio:generic. Changing thingtype to miio:unsupported
2022-06-08 17:15:48.032 [INFO ] [inding.miio.internal.miot.MiotParser] - miot info: https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:vacuum:0000A006:roborock-a27:1
2022-06-08 17:15:48.051 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 1, description: Device Information, identifier: device-information
2022-06-08 17:15:48.051 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 1, description: Device Information, piid: 1, description: Device Manufacturer, identifier: manufacturer
2022-06-08 17:15:48.051 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 1, description: Device Information, piid: 2, description: Device Model, identifier: model
2022-06-08 17:15:48.051 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 1, description: Device Information, piid: 3, description: Device Serial Number, identifier: serial-number
2022-06-08 17:15:48.051 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 1, description: Device Information, piid: 4, description: Current Firmware Version, identifier: firmware-revision
2022-06-08 17:15:48.052 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 2, description: Robot Cleaner, identifier: vacuum
2022-06-08 17:15:48.052 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 2, description: Robot Cleaner, piid: 1, description: Status, identifier: status
2022-06-08 17:15:48.056 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 2, description: Robot Cleaner, piid: 2, description: Device Fault, identifier: fault
2022-06-08 17:15:48.056 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 2, description: Robot Cleaner, piid: 4, description: Mode, identifier: mode
2022-06-08 17:15:48.057 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 2, description: Robot Cleaner, piid: 9, description: Room IDs, identifier: room-ids
2022-06-08 17:15:48.057 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 2, description: Robot Cleaner, piid: 9,description: Room IDs
2022-06-08 17:15:48.057 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 3, description: Battery, identifier: battery
2022-06-08 17:15:48.057 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 3, description: Battery, piid: 1, description: Battery Level, identifier: battery-level
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 6, description: Identify, identifier: identify
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 6, description: Identify has no identified properties
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 9, description: Main Cleaning Brush, identifier: brush-cleaner
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 9, description: Main Cleaning Brush, piid: 2, description: Brush Life Level, identifier: brush-life-level
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 10, description: Side Cleaning Brush, identifier: brush-cleaner
2022-06-08 17:15:48.058 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 10, description: Side Cleaning Brush, piid: 2, description: Brush Life Level, identifier: brush-life-level
2022-06-08 17:15:48.059 [WARN ] [inding.miio.internal.miot.MiotParser] - duplicate for property:brush_life_level1 - Brush Life Level (1
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 11, description: Filter, identifier: filter
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 11, description: Filter, piid: 1, description: Filter Life Level, identifier: filter-life-level
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 7, description: generic-rpc, identifier: generic-rpc
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 7, description: generic-rpc, piid: 1, description: rpc-in, identifier: rpc-in
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 7, description: generic-rpc, piid: 1,description: rpc-in
2022-06-08 17:15:48.059 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 7, description: generic-rpc, piid: 2, description: rpc-out, identifier: rpc-out
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 7, description: generic-rpc, piid: 2,description: rpc-out
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - SID: 8, description: roborock-vacuum, identifier: roborock-vacuum
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 8, description: roborock-vacuum, piid: 1, description: consumable-id, identifier: consumable-id
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 8, description: roborock-vacuum, piid: 1,description: consumable-id
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 8, description: roborock-vacuum, piid: 2, description: failed-reason, identifier: failed-reason
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 8, description: roborock-vacuum, piid: 2,description: failed-reason
2022-06-08 17:15:48.060 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 8, description: roborock-vacuum, piid: 3, description: error-code, identifier: error-code
2022-06-08 17:15:48.061 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 8, description: roborock-vacuum, piid: 3,description: error-code
2022-06-08 17:15:48.061 [INFO ] [inding.miio.internal.miot.MiotParser] - siid: 8, description: roborock-vacuum, piid: 4, description: schedule-type, identifier: schedule-type
2022-06-08 17:15:48.061 [INFO ] [inding.miio.internal.miot.MiotParser] - No reading siid: 8, description: roborock-vacuum, piid: 4,description: schedule-type
2022-06-08 17:15:48.062 [INFO ] [inding.miio.internal.miot.MiotParser] - Suggested additional channelType 

2022-06-08 17:15:48.062 [INFO ] [inding.miio.internal.miot.MiotParser] - Manual actions for execution
`action{"did":"vacuum-start-sweep","siid":2,"aiid":1,"in":[]}`
`action{"did":"vacuum-stop-sweeping","siid":2,"aiid":2,"in":[]}`
`action{"did":"vacuum-start-mop","siid":2,"aiid":4,"in":[]}`
`action{"did":"vacuum-start-sweep-mop","siid":2,"aiid":5,"in":[]}`
`action{"did":"vacuum-start-room-sweep","siid":2,"aiid":6,"in":[9.0]}`
`action{"did":"battery-start-charge","siid":3,"aiid":1,"in":[]}`
`action{"did":"generic-rpc-generic-rpc-call","siid":7,"aiid":1,"in":[1.0]}`

2022-06-08 17:15:48.063 [INFO ] [ernal.handler.MiIoUnsupportedHandler] - urn: urn:miot-spec-v2:device:vacuum:0000A006:roborock-a27:1
2022-06-08 17:15:48.063 [INFO ] [ernal.handler.MiIoUnsupportedHandler] - {"type":"urn:miot-spec-v2:device:vacuum:0000A006:roborock-a27:1","description":"Robot Cleaner","services":[{"iid":1,"type":"urn:miot-spec-v2:service:device-information:00007801:roborock-a27:1","description":"Device Information","properties":[{"iid":1,"type":"urn:miot-spec-v2:property:manufacturer:00000001:roborock-a27:1","description":"Device Manufacturer","format":"string","access":["read"]},{"iid":2,"type":"urn:miot-spec-v2:property:model:00000002:roborock-a27:1","description":"Device Model","format":"string","access":["read"]},{"iid":3,"type":"urn:miot-spec-v2:property:serial-number:00000003:roborock-a27:1","description":"Device Serial Number","format":"string","access":["read"]},{"iid":4,"type":"urn:miot-spec-v2:property:firmware-revision:00000005:roborock-a27:1","description":"Current Firmware Version","format":"string","access":["read"]}]},{"iid":2,"type":"urn:miot-spec-v2:service:vacuum:00007810:roborock-a27:1","description":"Robot Cleaner","properties":[{"iid":1,"type":"urn:miot-spec-v2:property:status:00000007:roborock-a27:1","description":"Status","format":"uint8","access":["read","notify"],"value-list":[{"value":1,"description":"Idle"},{"value":2,"description":"Idle"},{"value":3,"description":"Idle"},{"value":5,"description":"Sweeping"},{"value":6,"description":"Go Charging"},{"value":7,"description":"Sweeping"},{"value":8,"description":"Charging"},{"value":10,"description":"Paused"},{"value":11,"description":"Sweeping"},{"value":12,"description":"Error"},{"value":14,"description":"Updating"},{"value":15,"description":"Go Charging"},{"value":16,"description":"Sweeping"},{"value":17,"description":"Sweeping"},{"value":18,"description":"Sweeping"},{"value":26,"description":"Go Charging"},{"value":22,"description":"Emptying"},{"value":23,"description":"Wash"},{"value":29,"description":"Sweeping"}]},{"iid":2,"type":"urn:miot-spec-v2:property:fault:00000009:roborock-a27:1","description":"Device Fault","format":"uint8","access":["read","notify"],"unit":"none","value-range":[0,255,1]},{"iid":4,"type":"urn:miot-spec-v2:property:mode:00000008:roborock-a27:1","description":"Mode","format":"uint8","access":["read","write","notify"],"unit":"none","value-list":[{"value":101,"description":"Silent"},{"value":102,"description":"Basic"},{"value":103,"description":"Strong"},{"value":104,"description":"Full Speed"},{"value":105,"description":"Silent"},{"value":106,"description":"Custom"}]},{"iid":9,"type":"urn:miot-spec-v2:property:room-ids:00000073:roborock-a27:1","description":"Room IDs","format":"string","access":[]}],"actions":[{"iid":1,"type":"urn:miot-spec-v2:action:start-sweep:00002804:roborock-a27:1","description":"Start Sweep","in":[],"out":[]},{"iid":2,"type":"urn:miot-spec-v2:action:stop-sweeping:00002805:roborock-a27:1","description":"Stop Sweeping","in":[],"out":[]},{"iid":4,"type":"urn:miot-spec-v2:action:start-mop:00002834:roborock-a27:1","description":"Start Mop","in":[],"out":[]},{"iid":5,"type":"urn:miot-spec-v2:action:start-sweep-mop:00002835:roborock-a27:1","description":"Start Sweep Mop","in":[],"out":[]},{"iid":6,"type":"urn:miot-spec-v2:action:start-room-sweep:00002826:roborock-a27:1","description":"Start Room Sweep","in":[9],"out":[]}]},{"iid":3,"type":"urn:miot-spec-v2:service:battery:00007805:roborock-a27:1","description":"Battery","properties":[{"iid":1,"type":"urn:miot-spec-v2:property:battery-level:00000014:roborock-a27:1","description":"Battery Level","format":"uint8","access":["read","notify"],"unit":"percentage","value-range":[0,100,1]}],"actions":[{"iid":1,"type":"urn:miot-spec-v2:action:start-charge:00002802:roborock-a27:1","description":"Start Charge","in":[],"out":[]}]},{"iid":6,"type":"urn:miot-spec-v2:service:identify:0000782C:roborock-a27:1","description":"Identify","actions":[{"iid":1,"type":"urn:miot-spec-v2:action:identify:00002801:roborock-a27:1","description":"Identify","in":[],"out":[]}]},{"iid":9,"type":"urn:miot-spec-v2:service:brush-cleaner:0000784C:roborock-a27:1","description":"Main Cleaning Brush","properties":[{"iid":2,"type":"urn:miot-spec-v2:property:brush-life-level:00000085:roborock-a27:1","description":"Brush Life Level","format":"uint8","access":["read","notify"],"unit":"percentage","value-range":[0,100,1]}]},{"iid":10,"type":"urn:miot-spec-v2:service:brush-cleaner:0000784C:roborock-a27:1","description":"Side Cleaning Brush","properties":[{"iid":2,"type":"urn:miot-spec-v2:property:brush-life-level:00000085:roborock-a27:1","description":"Brush Life Level","format":"uint8","access":["read","notify"],"unit":"percentage","value-range":[0,100,1]}]},{"iid":11,"type":"urn:miot-spec-v2:service:filter:0000780B:roborock-a27:1","description":"Filter","properties":[{"iid":1,"type":"urn:miot-spec-v2:property:filter-life-level:0000001E:roborock-a27:1","description":"Filter Life Level","format":"uint8","access":["read","notify"],"unit":"percentage","value-range":[0,100,1]}]},{"iid":7,"type":"urn:roborock-spec:service:generic-rpc:00007801:roborock-a27:1","description":"generic-rpc","properties":[{"iid":1,"type":"urn:roborock-spec:property:rpc-in:00000001:roborock-a27:1","description":"rpc-in","format":"string","access":[],"unit":"none"},{"iid":2,"type":"urn:roborock-spec:property:rpc-out:00000002:roborock-a27:1","description":"rpc-out","format":"string","access":[],"unit":"none"}],"actions":[{"iid":1,"type":"urn:roborock-spec:action:generic-rpc-call:00002801:roborock-a27:1","description":"generic-rpc-call","in":[1],"out":[2]}]},{"iid":8,"type":"urn:roborock-spec:service:roborock-vacuum:00007802:roborock-a27:1","description":"roborock-vacuum","properties":[{"iid":1,"type":"urn:roborock-spec:property:consumable-id:00000001:roborock-a27:1","description":"consumable-id","format":"uint8","access":[],"unit":"none","value-range":[0,255,1]},{"iid":2,"type":"urn:roborock-spec:property:failed-reason:00000002:roborock-a27:1","description":"failed-reason","format":"uint8","access":[],"unit":"none","value-range":[0,255,1]},{"iid":3,"type":"urn:roborock-spec:property:error-code:00000003:roborock-a27:1","description":"error-code","format":"uint16","access":[],"unit":"none","value-range":[0,65535,1]},{"iid":4,"type":"urn:roborock-spec:property:schedule-type:00000004:roborock-a27:1","description":"schedule-type","format":"uint8","access":[],"value-list":[{"value":1,"description":"ScheduledClean"},{"value":2,"description":"ScheduledMop"},{"value":3,"description":"ScheduledCleanMop"}]}],"events":[{"iid":1,"type":"urn:roborock-spec:event:error:00005001:roborock-a27:1","description":"error","arguments":[3]},{"iid":2,"type":"urn:roborock-spec:event:consumable-reminder:00005002:roborock-a27:1","description":"consumable-reminder","arguments":[1]},{"iid":3,"type":"urn:roborock-spec:event:schedule-canceled:00005003:roborock-a27:1","description":"schedule-canceled","arguments":[2]},{"iid":4,"type":"urn:roborock-spec:event:schedule-started:00005004:roborock-a27:1","description":"schedule-started","arguments":[4]},{"iid":6,"type":"urn:roborock-spec:event:clean-completed:00005006:roborock-a27:1","description":"clean-completed","arguments":[]},{"iid":7,"type":"urn:roborock-spec:event:bin-full:00005007:roborock-a27:1","description":"bin-full","arguments":[]},{"iid":8,"type":"urn:roborock-spec:event:low-power-back:00005008:roborock-a27:1","description":"low-power-back","arguments":[]},{"iid":9,"type":"urn:roborock-spec:event:back-to-origin-succ:00005009:roborock-a27:1","description":"back-to-origin-succ","arguments":[]},{"iid":10,"type":"urn:roborock-spec:event:back-to-origin-fail:0000500a:roborock-a27:1","description":"back-to-origin-fail","arguments":[]},{"iid":11,"type":"urn:roborock-spec:event:back-to-dock-nearby:0000500b:roborock-a27:1","description":"back-to-dock-nearby","arguments":[]},{"iid":19,"type":"urn:roborock-spec:event:clean-with-new-map:00005013:roborock-a27:1","description":"clean-with-new-map","arguments":[]},{"iid":20,"type":"urn:roborock-spec:event:water-short-reminder:00005014:roborock-a27:1","description":"water-short-reminder","arguments":[]},{"iid":21,"type":"urn:roborock-spec:event:charge-dust-collect:00005015:roborock-a27:1","description":"charge-dust-collect","arguments":[]},{"iid":25,"type":"urn:roborock-spec:event:clean-failed:00005019:roborock-a27:1","description":"clean-failed","arguments":[]},{"iid":27,"type":"urn:roborock-spec:event:clean-partial-done:0000501b:roborock-a27:1","description":"clean-partial-done","arguments":[]},{"iid":29,"type":"urn:roborock-spec:event:back-wash-fail-bar:0000501d:roborock-a27:1","description":"back-wash-fail-bar","arguments":[]},{"iid":30,"type":"urn:roborock-spec:event:back-wash-fail-comm:0000501e:roborock-a27:1","description":"back-wash-fail-comm","arguments":[]},{"iid":31,"type":"urn:roborock-spec:event:back-wash-fail-dock:0000501f:roborock-a27:1","description":"back-wash-fail-dock","arguments":[]},{"iid":35,"type":"urn:roborock-spec:event:positioning-failed:00005005:roborock-a27:1","description":"positioning-failed","arguments":[]}]}]}
2022-06-08 17:15:48.063 [INFO ] [ernal.handler.MiIoUnsupportedHandler] - Start experimental creation of database file based on MIOT spec for device 'Unknown Mi IO Device (unknown)'. 
2022-06-08 17:15:48.066 [INFO ] [ernal.handler.MiIoUnsupportedHandler] - Info for roborock.vacuum.a27
Database file created:/openhab/conf/misc/miio/roborock.vacuum.a27-miot-experimental.json
{
	"deviceMapping": {
		"id": [
			"roborock.vacuum.a27"
		],
		"propertyMethod": "get_properties",
		"maxProperties": 1,
		"channels": [
			{
				"property": "",
				"friendlyName": "Actions",
				"channel": "actions",
				"type": "String",
				"stateDescription": {
					"options": [
						{
							"value": "vacuum-start-sweep",
							"label": "Vacuum Start Sweep"
						},
						{
							"value": "vacuum-stop-sweeping",
							"label": "Vacuum Stop Sweeping"
						},
						{
							"value": "vacuum-start-mop",
							"label": "Vacuum Start Mop"
						},
						{
							"value": "vacuum-start-sweep-mop",
							"label": "Vacuum Start Sweep Mop"
						},
						{
							"value": "vacuum-start-room-sweep",
							"label": "Vacuum Start Room Sweep"
						},
						{
							"value": "battery-start-charge",
							"label": "Battery Start Charge"
						},
						{
							"value": "generic-rpc-generic-rpc-call",
							"label": "Generic Rpc Generic Rpc Call"
						}
					]
				},
				"refresh": false,
				"actions": [
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 2,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-stop-sweeping"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 4,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 5,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							9.0
						],
						"siid": 2,
						"aiid": 6,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-room-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 3,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "battery-start-charge"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							1.0
						],
						"siid": 7,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "generic-rpc-generic-rpc-call"
								}
							]
						}
					}
				]
			},
			{
				"property": "status",
				"siid": 2,
				"piid": 1,
				"friendlyName": "Robot Cleaner - Status",
				"channel": "status",
				"type": "Number",
				"stateDescription": {
					"readOnly": true,
					"options": [
						{
							"value": "1",
							"label": "Idle"
						},
						{
							"value": "2",
							"label": "Idle"
						},
						{
							"value": "3",
							"label": "Idle"
						},
						{
							"value": "5",
							"label": "Sweeping"
						},
						{
							"value": "6",
							"label": "Go Charging"
						},
						{
							"value": "7",
							"label": "Sweeping"
						},
						{
							"value": "8",
							"label": "Charging"
						},
						{
							"value": "10",
							"label": "Paused"
						},
						{
							"value": "11",
							"label": "Sweeping"
						},
						{
							"value": "12",
							"label": "Error"
						},
						{
							"value": "14",
							"label": "Updating"
						},
						{
							"value": "15",
							"label": "Go Charging"
						},
						{
							"value": "16",
							"label": "Sweeping"
						},
						{
							"value": "17",
							"label": "Sweeping"
						},
						{
							"value": "18",
							"label": "Sweeping"
						},
						{
							"value": "26",
							"label": "Go Charging"
						},
						{
							"value": "22",
							"label": "Emptying"
						},
						{
							"value": "23",
							"label": "Wash"
						},
						{
							"value": "29",
							"label": "Sweeping"
						}
					]
				},
				"refresh": true,
				"actions": [],
				"readmeComment": "Value mapping [\"1\"\u003d\"Idle\",\"2\"\u003d\"Idle\",\"3\"\u003d\"Idle\",\"5\"\u003d\"Sweeping\",\"6\"\u003d\"Go Charging\",\"7\"\u003d\"Sweeping\",\"8\"\u003d\"Charging\",\"10\"\u003d\"Paused\",\"11\"\u003d\"Sweeping\",\"12\"\u003d\"Error\",\"14\"\u003d\"Updating\",\"15\"\u003d\"Go Charging\",\"16\"\u003d\"Sweeping\",\"17\"\u003d\"Sweeping\",\"18\"\u003d\"Sweeping\",\"26\"\u003d\"Go Charging\",\"22\"\u003d\"Emptying\",\"23\"\u003d\"Wash\",\"29\"\u003d\"Sweeping\"]"
			},
			{
				"property": "fault",
				"siid": 2,
				"piid": 2,
				"friendlyName": "Robot Cleaner - Device Fault",
				"channel": "fault",
				"type": "Number",
				"stateDescription": {
					"minimum": 0,
					"maximum": 255,
					"step": 1,
					"pattern": "%.0f",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "mode",
				"siid": 2,
				"piid": 4,
				"friendlyName": "Robot Cleaner - Mode",
				"channel": "mode",
				"type": "Number",
				"stateDescription": {
					"options": [
						{
							"value": "101",
							"label": "Silent"
						},
						{
							"value": "102",
							"label": "Basic"
						},
						{
							"value": "103",
							"label": "Strong"
						},
						{
							"value": "104",
							"label": "Full Speed"
						},
						{
							"value": "105",
							"label": "Silent"
						},
						{
							"value": "106",
							"label": "Custom"
						}
					]
				},
				"refresh": true,
				"actions": [
					{
						"command": "set_properties",
						"parameterType": "NUMBER"
					}
				],
				"readmeComment": "Value mapping [\"101\"\u003d\"Silent\",\"102\"\u003d\"Basic\",\"103\"\u003d\"Strong\",\"104\"\u003d\"Full Speed\",\"105\"\u003d\"Silent\",\"106\"\u003d\"Custom\"]"
			},
			{
				"property": "battery-level",
				"siid": 3,
				"piid": 1,
				"friendlyName": "Battery - Battery Level",
				"channel": "battery_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level",
				"siid": 9,
				"piid": 2,
				"friendlyName": "Main Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level1",
				"siid": 10,
				"piid": 2,
				"friendlyName": "Side Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level1",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "filter-life-level",
				"siid": 11,
				"piid": 1,
				"friendlyName": "Filter - Filter Life Level",
				"channel": "filter_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			}
		],
		"experimental": true
	}
}
Testing Properties:
status -> get_properties[{"did":"status","siid":2,"piid":1}] -> 10094, 
fault -> get_properties[{"did":"fault","siid":2,"piid":2}] -> 10095, 
mode -> get_properties[{"did":"mode","siid":2,"piid":4}] -> 10096, 
battery_level -> get_properties[{"did":"battery-level","siid":3,"piid":1}] -> 10097, 
brush_life_level -> get_properties[{"did":"brush-life-level","siid":9,"piid":2}] -> 10098, 
brush_life_level1 -> get_properties[{"did":"brush-life-level1","siid":10,"piid":2}] -> 10099, 
filter_life_level -> get_properties[{"did":"filter-life-level","siid":11,"piid":1}] -> 10100, 


2022-06-08 17:15:50.155 [INFO ] [ernal.handler.MiIoUnsupportedHandler] - Info for roborock.vacuum.a27
Database file created:/openhab/conf/misc/miio/roborock.vacuum.a27-miot-experimental.json
{
	"deviceMapping": {
		"id": [
			"roborock.vacuum.a27"
		],
		"propertyMethod": "get_properties",
		"maxProperties": 1,
		"channels": [
			{
				"property": "",
				"friendlyName": "Actions",
				"channel": "actions",
				"type": "String",
				"stateDescription": {
					"options": [
						{
							"value": "vacuum-start-sweep",
							"label": "Vacuum Start Sweep"
						},
						{
							"value": "vacuum-stop-sweeping",
							"label": "Vacuum Stop Sweeping"
						},
						{
							"value": "vacuum-start-mop",
							"label": "Vacuum Start Mop"
						},
						{
							"value": "vacuum-start-sweep-mop",
							"label": "Vacuum Start Sweep Mop"
						},
						{
							"value": "vacuum-start-room-sweep",
							"label": "Vacuum Start Room Sweep"
						},
						{
							"value": "battery-start-charge",
							"label": "Battery Start Charge"
						},
						{
							"value": "generic-rpc-generic-rpc-call",
							"label": "Generic Rpc Generic Rpc Call"
						}
					]
				},
				"refresh": false,
				"actions": [
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 2,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-stop-sweeping"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 4,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 2,
						"aiid": 5,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-sweep-mop"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							9.0
						],
						"siid": 2,
						"aiid": 6,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "vacuum-start-room-sweep"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "EMPTY",
						"siid": 3,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "battery-start-charge"
								}
							]
						}
					},
					{
						"command": "action",
						"parameterType": "UNKNOWN",
						"parameters": [
							1.0
						],
						"siid": 7,
						"aiid": 1,
						"condition": {
							"name": "matchValue",
							"parameters": [
								{
									"matchValue": "generic-rpc-generic-rpc-call"
								}
							]
						}
					}
				]
			},
			{
				"property": "status",
				"siid": 2,
				"piid": 1,
				"friendlyName": "Robot Cleaner - Status",
				"channel": "status",
				"type": "Number",
				"stateDescription": {
					"readOnly": true,
					"options": [
						{
							"value": "1",
							"label": "Idle"
						},
						{
							"value": "2",
							"label": "Idle"
						},
						{
							"value": "3",
							"label": "Idle"
						},
						{
							"value": "5",
							"label": "Sweeping"
						},
						{
							"value": "6",
							"label": "Go Charging"
						},
						{
							"value": "7",
							"label": "Sweeping"
						},
						{
							"value": "8",
							"label": "Charging"
						},
						{
							"value": "10",
							"label": "Paused"
						},
						{
							"value": "11",
							"label": "Sweeping"
						},
						{
							"value": "12",
							"label": "Error"
						},
						{
							"value": "14",
							"label": "Updating"
						},
						{
							"value": "15",
							"label": "Go Charging"
						},
						{
							"value": "16",
							"label": "Sweeping"
						},
						{
							"value": "17",
							"label": "Sweeping"
						},
						{
							"value": "18",
							"label": "Sweeping"
						},
						{
							"value": "26",
							"label": "Go Charging"
						},
						{
							"value": "22",
							"label": "Emptying"
						},
						{
							"value": "23",
							"label": "Wash"
						},
						{
							"value": "29",
							"label": "Sweeping"
						}
					]
				},
				"refresh": true,
				"actions": [],
				"readmeComment": "Value mapping [\"1\"\u003d\"Idle\",\"2\"\u003d\"Idle\",\"3\"\u003d\"Idle\",\"5\"\u003d\"Sweeping\",\"6\"\u003d\"Go Charging\",\"7\"\u003d\"Sweeping\",\"8\"\u003d\"Charging\",\"10\"\u003d\"Paused\",\"11\"\u003d\"Sweeping\",\"12\"\u003d\"Error\",\"14\"\u003d\"Updating\",\"15\"\u003d\"Go Charging\",\"16\"\u003d\"Sweeping\",\"17\"\u003d\"Sweeping\",\"18\"\u003d\"Sweeping\",\"26\"\u003d\"Go Charging\",\"22\"\u003d\"Emptying\",\"23\"\u003d\"Wash\",\"29\"\u003d\"Sweeping\"]"
			},
			{
				"property": "fault",
				"siid": 2,
				"piid": 2,
				"friendlyName": "Robot Cleaner - Device Fault",
				"channel": "fault",
				"type": "Number",
				"stateDescription": {
					"minimum": 0,
					"maximum": 255,
					"step": 1,
					"pattern": "%.0f",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "mode",
				"siid": 2,
				"piid": 4,
				"friendlyName": "Robot Cleaner - Mode",
				"channel": "mode",
				"type": "Number",
				"stateDescription": {
					"options": [
						{
							"value": "101",
							"label": "Silent"
						},
						{
							"value": "102",
							"label": "Basic"
						},
						{
							"value": "103",
							"label": "Strong"
						},
						{
							"value": "104",
							"label": "Full Speed"
						},
						{
							"value": "105",
							"label": "Silent"
						},
						{
							"value": "106",
							"label": "Custom"
						}
					]
				},
				"refresh": true,
				"actions": [
					{
						"command": "set_properties",
						"parameterType": "NUMBER"
					}
				],
				"readmeComment": "Value mapping [\"101\"\u003d\"Silent\",\"102\"\u003d\"Basic\",\"103\"\u003d\"Strong\",\"104\"\u003d\"Full Speed\",\"105\"\u003d\"Silent\",\"106\"\u003d\"Custom\"]"
			},
			{
				"property": "battery-level",
				"siid": 3,
				"piid": 1,
				"friendlyName": "Battery - Battery Level",
				"channel": "battery_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level",
				"siid": 9,
				"piid": 2,
				"friendlyName": "Main Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "brush-life-level1",
				"siid": 10,
				"piid": 2,
				"friendlyName": "Side Cleaning Brush - Brush Life Level",
				"channel": "brush_life_level1",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			},
			{
				"property": "filter-life-level",
				"siid": 11,
				"piid": 1,
				"friendlyName": "Filter - Filter Life Level",
				"channel": "filter_life_level",
				"type": "Number:Dimensionless",
				"unit": "percentage",
				"stateDescription": {
					"minimum": 0,
					"maximum": 100,
					"step": 1,
					"pattern": "%.0f %unit%",
					"readOnly": true
				},
				"refresh": true,
				"actions": []
			}
		],
		"experimental": true
	}
}
Testing Properties:
status -> get_properties[{"did":"status","siid":2,"piid":1}] -> 10094, 
fault -> get_properties[{"did":"fault","siid":2,"piid":2}] -> 10095, 
mode -> get_properties[{"did":"mode","siid":2,"piid":4}] -> 10096, 
battery_level -> get_properties[{"did":"battery-level","siid":3,"piid":1}] -> 10097, 
brush_life_level -> get_properties[{"did":"brush-life-level","siid":9,"piid":2}] -> 10098, 
brush_life_level1 -> get_properties[{"did":"brush-life-level1","siid":10,"piid":2}] -> 10099, 
filter_life_level -> get_properties[{"did":"filter-life-level","siid":11,"piid":1}] -> 10100, 

{"life":50460,"uid":6169258933,"model":"roborock.vacuum.a27","ipflag":1,"miio_ver":"0.0.9","fw_ver":"4.1.5_4396","hw_ver":"Linux","miio_client_ver":"4.1.5","VmPeak":333348,"VmRSS":2384,"MemFree":33492,"netif":{"localIp":"10.9.50.51","mask":"255.255.255.0","gw":"10.9.50.1"},"miio_times":[50459,18,0,50439]}
{"id":10093,"method":"miIO.info","params":[]} -> {"id":10093,"result":{"life":50460,"uid":6169258933,"model":"roborock.vacuum.a27","ipflag":1,"miio_ver":"0.0.9","fw_ver":"4.1.5_4396","hw_ver":"Linux","miio_client_ver":"4.1.5","VmPeak":333348,"VmRSS":2384,"MemFree":33492,"netif":{"localIp":"10.9.50.51","mask":"255.255.255.0","gw":"10.9.50.1"},"miio_times":[50459,18,0,50439]},"exe_time":0}
{"id":10094,"method":"get_properties","params":[{"did":"status","siid":2,"piid":1}]} -> {"id":10094,"result":[{"did":"status","siid":2,"piid":1,"value":8}],"exe_time":100}
{"id":10095,"method":"get_properties","params":[{"did":"fault","siid":2,"piid":2}]} -> {"id":10095,"result":[{"did":"fault","siid":2,"piid":2,"value":0}],"exe_time":100}
{"id":10096,"method":"get_properties","params":[{"did":"mode","siid":2,"piid":4}]} -> {"id":10096,"result":[{"did":"mode","siid":2,"piid":4,"value":102}],"exe_time":101}
{"id":10097,"method":"get_properties","params":[{"did":"battery-level","siid":3,"piid":1}]} -> {"id":10097,"result":[{"did":"battery-level","siid":3,"piid":1,"value":100}],"exe_time":101}
{"id":10098,"method":"get_properties","params":[{"did":"brush-life-level","siid":9,"piid":2}]} -> {"id":10098,"result":[{"did":"brush-life-level","siid":9,"piid":2,"value":98}],"exe_time":101}
{"id":10099,"method":"get_properties","params":[{"did":"brush-life-level1","siid":10,"piid":2}]} -> {"id":10099,"result":[{"did":"brush-life-level1","siid":10,"piid":2,"value":97}],"exe_time":101}
{"id":10100,"method":"get_properties","params":[{"did":"filter-life-level","siid":11,"piid":1}]} -> {"id":10100,"result":[{"did":"filter-life-level","siid":11,"piid":1,"value":96}],"exe_time":101}
===================================
Responsive properties
===================================
Device Info: {"life":50460,"uid":6169258933,"model":"roborock.vacuum.a27","ipflag":1,"miio_ver":"0.0.9","fw_ver":"4.1.5_4396","hw_ver":"Linux","miio_client_ver":"4.1.5","VmPeak":333348,"VmRSS":2384,"MemFree":33492,"netif":{"localIp":"10.9.50.51","mask":"255.255.255.0","gw":"10.9.50.1"},"miio_times":[50459,18,0,50439]}
7 channels with responses.
Property: status          Friendly Name: Robot Cleaner - Status    Response: [{"did":"status","siid":2,"piid":1,"value":8}]
Property: fault           Friendly Name: Robot Cleaner - Device Fault Response: [{"did":"fault","siid":2,"piid":2,"value":0}]
Property: mode            Friendly Name: Robot Cleaner - Mode      Response: [{"did":"mode","siid":2,"piid":4,"value":102}]
Property: battery-level   Friendly Name: Battery - Battery Level   Response: [{"did":"battery-level","siid":3,"piid":1,"value":100}]
Property: brush-life-level Friendly Name: Main Cleaning Brush - Brush Life Level Response: [{"did":"brush-life-level","siid":9,"piid":2,"value":98}]
Property: brush-life-level1 Friendly Name: Side Cleaning Brush - Brush Life Level Response: [{"did":"brush-life-level1","siid":10,"piid":2,"value":97}]
Property: filter-life-level Friendly Name: Filter - Filter Life Level Response: [{"did":"filter-life-level","siid":11,"piid":1,"value":96}]
Miot file already created. Manually remove non-functional channels.

Device testing file saved to: /openhab/userdata/miio/test-roborock.vacuum.a27-20220608-171550.txt
Please share your these files on the community forum or github to get this device supported.

I finally realized that when manually added as vaccuum thing I get the best results in terms of number of channels so far.

Also I find a couple of these lines in my logs:

2022-06-11 03:07:05.432 [INFO ] [.miio.internal.robot.RRMapFileParser] - Unknown blocktype 26 (pls report to author)

I get the same logs also for blocktypes 21 through 25.

anyone knows a way to select 1 or 2 clean passes for roborock S5 using the ui widget?

I’ve got a new S7 MaxV Ultra and I get unknown blocktype 21, 22, 24, 25, 26 - latest oh3 stable

1 Like

I’ve already opened an issue for this [MIIO] Roborock - Unknown Blocktype RRMapFileParser · Issue #13079 · openhab/openhab-addons · GitHub

Thanks @Sascha_ - I see your Issue is about the Q7 - but afaik the S7 map is the same.

Maybe @marcel_verpaalen will have the time to look at the issue

I have just got the Roborock S7 MaxV Ultra, is it supported by this binding ?

If not what is needed/how can I help to make it supported?

I’ve summitted an PR update which will remove the unknown blocktype messages for blocktypes 20-27.
To be able to decode them, I’ll need some examples with pic of what it looks like in the app as well as the associated rrmap file. If you want to share some that will help (you can send them in PM)

In the mean time, to avoid flooding your log, you can do the following:
log:set warn org.openhab.binding.miio.internal.robot.RRMapFileParser
or log:set warn org.openhab.binding.miio.internal.robot

try to override the model with in the config with a supported type, e.g. roborock.vacuum.s5 than you prob can use the majority of functionality. @Flip can comment if the rest works as expected…

Hi @marcel_verpaalen - for my S7 MaxV Ultra I used roborock.vacuum.a15 as type. Everything seems to work as expected - only the blocktype-messages are flooding the log when the vacuum is running.

I will to get the pics and the rrmap files and send it to you via PM.

Thanks!