Miio , Roborock S5 Max , no auto discovery

Hi all,

I started playing around with integrating my Roborock S5 Max vacuum cleaner into openHAB.

After installing the binding, and getting the token from the device, I got stuck now as the vacumm cleaner is not showing up in my inbox of openHAB…

Any hint what I’m doing wrong here?

  • I was expecting that openHAB at least discovers the device by itself…
  • I disabled the local firewall temporarily, with no change…

When adding the S5Max to a things file manually, I immediately get the error:

“Handler MiIoVacuumHandler of thing miio:vacuum:rrs5maxog tried updating channel consumables#consumable_reset although the handler was already disposed.”

How is discovery working for the miio binding?

  • I also doublechecked the output of “avahi-browse -a -t” , but could not find the vacuum cleaner in the list…
  • I also tried python “mirobo discover” without success…

Seems something general is wrong with my setup :frowning: .

=> Any hint would be greatly appreciated!

PS: Searching through many many sites didn’t take me toward fixing it…

Thanks and regards
waki

Hi all,

although I was hesitating to move from the Roborock app to the Xiaomi Mi Home app I finally gave it a try. Especially after reading some posts on another forum, where people reported problems with loosing the connection from day to day while using the Roborock app, I decided to switch over.

Immediately after registering the vacuum cleaner with the Mi Home app, things started to work out way better :slight_smile:

=> For whatever reason I don’t know yet, the S5 Max seems to behave differently when registered within the Mi Home app.

Differences I found are:

  • it showed up in the list of avahi-browse (mDNS)
  • It showed up in the inbox of openHAB
  • I was able to integrate it into openHAB by using a things file successfully

Now it seems to work and I look forward for some more adjustments of my configuration soon…

Few things I want to write down here for all those struggling with similar issues:

  • Although intensively trying for many days, I had no chance to get it working while the S5 Max was registered with the Roborock app

  • It was not listed with mDNS and therefore not shown, e.g. on the output of avahi-browse

  • Although I had extracted the token successfully, with a method that is applied during the WiFi setup of the vacuum cleaner, it was not accessible with the python-miio tools, e.g. mirobo —ip x.x.x.x —token xxxxx status

  • Nor it was auto-detected by openHAB with the miio binding installed

  • After deleting from the Roborock app and adding it to the Mi Home app, it immediately showed up in mDNS

  • It immediately was added to the inbox of openHAB

  • (And I took a note of the deviceID shown in the openHAB inbox to add it to the things file later)

  • It was pretty easy to extract the token from the .sqlite file of the smartphone backup, following one of the various descriptions found on the Internet, including using the python miio-extract-token tool against the file

  • With the token the S5 Max became accessible within openHAB and also with the python-miio tools

  • While registering the vacuum cleaner multiple times in the apps I found it to have a different token each time! (Just want to mention this as it did not become clear to me from all the infos I read.)

However, it seems to work for me now :slight_smile:

I just wonder why the S5 Max seems to behave so different on the network, and would greatly appreciate any comment that clarifies this finding.

BG

Waki

3 Likes

thanks for sharing your experience… I think it is really helpful for others.
Quick hint on the tokens: adding your cloud userId/pwd in Openhab will pull the token automatically without the need for tool to pull it from sqlite

1 Like

Thank you.
can you share the things and item files?
I’m having problems with configuring the thing.
I tried this:
Thing miio:vacuum:s50 “vacuum” @ “livingroom” [ host=“192.168.15.20”, token=“xxxxxxx”, deviceId=“0470DDAA”, model=“roborock.vacuum.s5e”, communication=“cloud”]

The errors are:
no viable alternative at input ‘model’
no viable alternative at input ‘communication’

Thanks

Hi Ahiel,
sorry for my late reply :frowning: … I was pretty busy the last weeks.

However, here is what I have in my things file:

Thing miio:vacuum:rrs5max01 "RR-S5Max-01" @ "City" [ host="192.168.xxx.yyy", token="12345678901234567890123456789012", deviceId="12345678", model="roborock.vacuum.s5e" ]

And this is what I have in my items file:

// Xiamo Roborock - GRUPPEN allgemein
//////////////////////////////////////
Group  gVac                         "Xiaomi Robot Vacuum"                                               <fan>           (gKomponenten)

// Roborock S5Max 01
// Xiamo Roborock - GRUPPEN
////////////////////////////
Group  gRRS5Max01_Vac               "RR-S5Max-01 Staubsauger"                                           <fan>           (gVac)
Group  gRRS5Max01_VacStat           "RR-S5Max-01 Status (Details)"                                      <status>        (gRRS5Max01_Vac)
Group  gRRS5Max01_VacCons           "RR-S5Max-01 Verbrauchsmaterial"                                    <line-increase> (gRRS5Max01_Vac)
Group  gRRS5Max01_VacDND            "RR-S5Max-01 'Nicht-Stören'"                                        <moon>          (gRRS5Max01_Vac)
Group  gRRS5Max01_VacHist           "RR-S5Max-01 Reinigungsverlauf"                                     <calendar>      (gRRS5Max01_Vac)
Group  gRRS5Max01_VacLast           "RR-S5Max-01 Reinigungsverlauf (zuletzt)"                           <calendar>      (gRRS5Max01_Vac)
Group  gRRS5Max01_VacNetwork        "RR-S5Max-01 Netzwerk Details"                                      <network>       (gRRS5Max01_Vac)

// Xiamo Roborock - CONTROL
////////////////////////////
String RRS5Max01_actionControl      "Steuerung"                                                                         (gRRS5Max01_Vac)                         {channel="miio:vacuum:rrs5max01:actions#control" }
String RRS5Max01_actionCommand      "Befehl"                                                                            (gRRS5Max01_Vac)                         {channel="miio:vacuum:rrs5max01:actions#commands" }
Number RRS5Max01_actionFan          "Saugstärke [MAP(xiaomi_roborock_fanpower.map):%s]"                                 (gRRS5Max01_Vac)                         {channel="miio:vacuum:rrs5max01:actions#fan"}
Switch RRS5Max01_vacONOFF           "Staubsauger AN/AUS"                                                                (gRRS5Max01_Vac)   [ "Switchable" ]      {channel="miio:vacuum:rrs5max01:actions#vacuum" }

// Xiamo Roborock - STATUS
////////////////////////////
Number RRS5Max01_statusBat          "Akku [%1.0f %%]"                                                   <battery>       (gRRS5Max01_Vac,gRRS5Max01_VacStat)      {channel="miio:vacuum:rrs5max01:status#battery" }
Number RRS5Max01_statusArea         "Gereinigte m2 [%1.0f m²]"                                          <zoom>          (gRRS5Max01_Vac,gRRS5Max01_VacStat)      {channel="miio:vacuum:rrs5max01:status#clean_area" }
Number RRS5Max01_statusTime         "Reinigungszeit [%1.0f Min.]"                                       <clock>         (gRRS5Max01_Vac,gRRS5Max01_VacStat)      {channel="miio:vacuum:rrs5max01:status#clean_time" }
String RRS5Max01_statusError        "Fehler [MAP(xiaomi_roborock_error.map):%s]"                        <error>         (gRRS5Max01_Vac,gRRS5Max01_VacStat)      {channel="miio:vacuum:rrs5max01:status#error_code" }
Number RRS5Max01_statusFanPow       "Saugstärke [%1.0f %%]"                                             <signal>        (gRRS5Max01_VacStat)                     {channel="miio:vacuum:rrs5max01:status#fan_power" } 
Number RRS5Max01_statusClean        "Status Reinigung [%1.0f]"                                          <switch>        (gRRS5Max01_VacStat)                     {channel="miio:vacuum:rrs5max01:status#in_cleaning" }
Switch RRS5Max01_statusDND          "'Nicht-Stören' aktiv"                                                              (gRRS5Max01_VacStat)                     {channel="miio:vacuum:rrs5max01:status#dnd_enabled" }
Number RRS5Max01_statusStatus       "Status [%1.0f]"                                                    <status>        (gRRS5Max01_VacStat)                     {channel="miio:vacuum:rrs5max01:status#state"} 

// Xiamo Roborock - VERBRAUCH
////////////////////////////
Number RRS5Max01_consumableMain     "Hauptbürste verbleibend [%1.0f Std.]"                                              (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#main_brush_time"}
Number RRS5Max01_consumableMainP    "Hauptbürste [%1.0f %%]"                                                            (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#main_brush_percent"}
Number RRS5Max01_consumableSide     "Seitenbürste verbleibend [%1.0f Std.]"                                             (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#side_brush_time"}
Number RRS5Max01_consumableSideP    "Seitenbürste [%1.0f %%]"                                                           (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#side_brush_percent"}
Number RRS5Max01_consumableFilter   "Filter verbleibend [%1.0f Std.]"                                                   (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#filter_time" }
Number RRS5Max01_consumableFilterP  "Filter [%1.0f %%]"                                                                 (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#filter_percent" }
Number RRS5Max01_consumableSensor   "Sensoren verbleibend [%1.0f Std.]"                                                 (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#sensor_dirt_time"}
Number RRS5Max01_consumableSensorP  "Sensoren [%1.0f %%]"                                                               (gRRS5Max01_VacCons)                     {channel="miio:vacuum:rrs5max01:consumables#sensor_dirt_percent"}

// Xiamo Roborock - DND - Do not Disturb
////////////////////////////
Switch RRS5Max01_dndFunction        "Modus 'Nicht-Stören'"                                              <moon>          (gRRS5Max01_VacDND)                      {channel="miio:vacuum:rrs5max01:dnd#dnd_function"}
String RRS5Max01_dndStart           "'Nicht-Stören' Start [%s]"                                         <clock>         (gRRS5Max01_VacDND)                      {channel="miio:vacuum:rrs5max01:dnd#dnd_start"}
String RRS5Max01_dndEnd             "'Nicht-Stören' Ende [%s]"                                          <clock-on>      (gRRS5Max01_VacDND)                      {channel="miio:vacuum:rrs5max01:dnd#dnd_end"}

// Xiamo Roborock - HISTORY
////////////////////////////
Number RRS5Max01_historyArea        "Gesamtbereich m2 [%1.0f m²]"                                       <zoom>          (gRRS5Max01_VacHist)                     {channel="miio:vacuum:rrs5max01:history#total_clean_area"}
String RRS5Max01_historyTime        "Gesamtzeit [%1$tH:%1$tM h]"                                        <clock>         (gRRS5Max01_VacHist)                     {channel="miio:vacuum:rrs5max01:history#total_clean_time"}
Number RRS5Max01_historyCount       "Gesamtreinigungen [%1.0fx]"                                        <office>        (gRRS5Max01_VacHist)                     {channel="miio:vacuum:rrs5max01:history#total_clean_count"}

String RRS5Max01_lastStart          "Startzeit letzte Reinigung [%1$tA, %1$td.%1$tm.%1$ty %1$tH:%1$tM]" <clock>         (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_start_time"}
String RRS5Max01_lastEnd            "Endzeit letzte Reinigung [%1$tA, %1$td.%1$tm.%1$ty %1$tH:%1$tM]"   <clock>         (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_end_time"}
Number RRS5Max01_lastArea           "Zuletzt gereinigte m2 [%1.0f m²]"                                  <zoom>          (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_area"}
Number RRS5Max01_lastTime           "Dauer letzte Reinigung [%1.0f Min.]"                               <clock>         (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_duration"}
Number RRS5Max01_lastError          "Fehler [MAP(xiaomi_roborock_error.map):%s]"                        <error>         (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_error" }
Switch RRS5Max01_lastCompleted      "Letzte Reinigung abgeschlossen [%s]"                                               (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#last_clean_finish" }

// Xiamo Roborock - NETWORK
////////////////////////////
String  RRS5Max01_miNetSSID         "Netzwerk SSID [%s]"                                                                (gRRS5Max01_Vac,gRRS5Max01_VacNetwork)   {channel="miio:vacuum:rrs5max01:network#ssid" }
String  RRS5Max01_miNetBSSID        "Netzwerk BSSID [%s]"                                                               (gRRS5Max01_Vac,gRRS5Max01_VacNetwork)   {channel="miio:vacuum:rrs5max01:network#bssid" }
Number  RRS5Max01_miNetRSSI         "Netzwerk RSSI [%1.0f]"                                                             (gRRS5Max01_Vac,gRRS5Max01_VacNetwork)   {channel="miio:vacuum:rrs5max01:network#rssi" }
Number  RRS5Max01_miNetLife         "Uptime [%1.0f]"                                                                    (gRRS5Max01_Vac,gRRS5Max01_VacNetwork)   {channel="miio:vacuum:rrs5max01:network#life" }

// Xiamo Roborock - Cleaning Map
////////////////////////////
Image RRS5Max01_map                 "Karte"                                                                             (gRRS5Max01_VacLast)                     {channel="miio:vacuum:rrs5max01:cleaning#map"}

Mapping files (transforms) referred to are as follows:

  • xiaomi_roborock_error.map
No\ error=keine Fehler
0=keine Fehler
0.0=keine Fehler
Laser\ distance\ sensor\ error=Fehler Laserdistanzsensor
Collision\ sensor\ error=Fehler Kollisionssensor
Wheels\ on\ top\ of\ void,\ move\ robot=Räder ohne Haftung, Roboter bewegen
Clean\ hovering\ sensors,\ move\ robot=Schwebesensoren reinigen
Clean\ main\ brush=Hauptbürste reinigen
Clean\ side\ brush=Seitenbürste reinigen
Main\ wheel\ stuck?=Hauptrad blockiert?
Device\ stuck,\ clean\ area=Staubsauger festgefahren
Dust\ collector\ missing=Staubbehälter fehlt
Clean\ filter=Filter reinigen
Stuck\ in\ magnetic\ barrier=in Magnetschranke festgefahren
Low\ battery=Akkustand niedrig
Charging\ fault=Ladefehler
Battery\ fault=Akkufehler
Wall\ sensors\ dirty,\ wipe\ them=Wandsensoren verschmutzt
Place\ me\ on\ flat\ surface=auf flachem Untergrund platzieren
Side\ brushes\ problem,\ reboot\ me=Fehler Seitenbürste
Suction\ fan\ problem=Fehler Sauggebläse
Unpowered\ charging\ station=Ladestation ohne Strom
Unknown\ Error=unbekannter Fehler
NULL=Status unbekannt
  • xiaomi_roborock_fanpower.map
101=Leise
101.0=Leise
102=Normal
102.0=Normal
103=Turbo
103.0=Turbo
104=Max
104.0=Max
105=Sanft
105.0=Sanft
106=Angepasst (Auto)
106.0=Angepasst (Auto)
NULL=Status unbekannt

My sitemap file contains the following section for the RR-S5max:

Frame label="Roborock S5 Max 01" {
	Switch item=RRS5Max01_actionControl mappings=[vacuum="Saugen", pause="Pause",spot="Spot", dock="Dock"]
	Switch item=RRS5Max01_actionFan mappings=[38="Leise", 60="Normal", 77="Turbo",90="Max", -1="Angepasst"]
	Default item=RRS5Max01_statusBat 
	Default item=RRS5Max01_statusArea 
	Default item=RRS5Max01_statusTime 
	Group  item=gRRS5Max01_VacStat
	Group  item=gRRS5Max01_VacCons
	Group  item=gRRS5Max01_VacDND
	Group  item=gRRS5Max01_VacHist
	Group  item=gRRS5Max01_VacLast
	Group  item=gRRS5Max01_VacNetwork
}

Content mentioned above is probably not perfectly cleaned up. However, working for months now…

=> Hope this helps, if not too late :wink:

2 Likes

Thank you very much!
Just got my S5 Max two days ago, this is a very big help!

1 Like

Hi Ahiel.
I was able to get token… but where you get the deviceId?

it was found by openhab automatic.

Openhab miio binding will find your device id.
I would not know a situation where it would not find it…

If yours is not found, you most likely are using the roborock app.
You will first need to switch to mihome app, before it will work with openhab

2 Likes