Git Product home page Git Product logo

roborock-bridge's Introduction

roborock-bridge

This service connects to RR's servers and provides status information from your robot to your mqtt broker. It can also send simple commands and requests to the robot.

Setup & Start

To start experimenting you can start the application with docker compose. If you want to use the application for real you'll have to start it the regular way.

Quickstart with docker compose

To get started quick you can use docker compose. This will start:

  • the bridge itself
  • an mqtt broker
  • the web ui

Create an env file that contains

USERNAME=<email>
PASSWORD=<password>

Start up everything with

docker compose --env-file <your-env-file> up

Now open up a browser and navigate to http://localhost:8080.

The regular way

You need at least Java 17 to run the application.

Create an application.yaml file with the following content. Replace username, password and bridge-mqtt.url, etc. (don't change the app_secret_salt).

username: user   # your roborock account username (email address)
password: secret # your roborock account password
roborock-mqtt:
  nonce_generation_salt: ThisIsASecret # just a random string for entropy
  endpoint: aAbBz0                     # 6 char string to use as an identifier
bridge-mqtt:
  url: tcp://localhost:1883            # connection url to your mqtt broker (use ssl:// for ssl)
  # If you don't use anonymous access to the broker, also set these
  # username: username
  # password: secret
  client_id: mqtt-bridge-service       # how the client appears to your broker
  base_topic: mqtt-bridge              # everything th service does will be below this topic string

Start the application with:

java -jar file.jar

How to use

What you'll get:

topic description
home/<homeId> All devices and routines are associated to a room. This topic contains the home name and the id.
home/<homeId>/rooms Homes have rooms. This topic contains a list of the defined rooms.
home/<homeId>/routine/<routineId> Routines are predefined cleanup tasks (i.e. first vacuum, the mop room A). Routines can be executed with /action.
home/<homeId>/device/<deviceId> This topic contains basic information of the device and is the parent various property topics.
home/<homeId>/device/<deviceId>/<property> Topics associated with properties of the device. e.g. current state, remaining battery charge, map data, ...
home/<homeId>/device/<deviceId>/<property>/options Send an empty body to this topic to get a list of possible values for the property

List of some of the available properties:

  • map
  • path
  • virtual_walls
  • robot_position
  • charger_position
  • state
  • battery
  • ...

Commands

Commands are topics which will invoke certain functionality on the bridge. Each command is a prefix that immediately follows the path to the resource the command should be invoked upon.

Example: If you with to perform a get command on a home node, you would publish a message on topic <base-topic>/home/12345/get

Currently available commands:

postfix description
/get request data from remote servers
/action invoke action (e.g. return to dock, start cleanup routine)

What can you request with get?

target body description
home empty update home and devices via rest (some device states not included)
Example: <base-topic>/home/12345/get
device state request update of all states via mqtt
Example: <base-topic>/home/12345/device/asjnkd978732/get with body state
device map request update of map data via mqtt
Example: <base-topic>/home/12345/device/asjnkd978732/get with body map
device consumables request update of consumables data via mqtt
Example: <base-topic>/home/12345/device/asjnkd978732/get with body consumables

What can you do with actions?

target body description
routine empty Start the cleanup routine
Example: <base-topic>/home/12345/routine/34544/action
device home Send device back to base station
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload home
device {"action": "segments", "clean_mop": int?, "clean_order_mode": int?, "repeat": int?, "segments": int[]} Clean selected segments / rooms. Possible values are the mqttRoomIds for segments and 0 or 1 for the other values (to be verified)
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload {"action": "segments", "segments": [18,19,20]}
device {"action": "clean_mode", "fan_power": int,"mop_mode": int, "water_box_mode": int} Set cleanup options. Possible property values can be found in the Interpreter for your robot e.g. S8 Pro Ultra, MOP_MODE_UNKNOWN, FAN_POWER_123, WATER_BOX_124.
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload {"action": "clean_mode", "fan_power": 103,"mop_mode": 300, "water_box_mode": 202}
device {"action": "clean_mode", "fan_power": string,"mop_mode": string, "water_box_mode": string} Set cleanup options via string values (see next section to find out allowed values).
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload {"action": "clean_mode", "fan_power": "max","mop_mode": "deep", "water_box_mode": "off"}
device start or {"action": "start", "clean_mop": 1} Start / Resume current cleanup task.
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload start
device pause Pause current cleanup task.
Example: <base-topic>/home/12345/device/asjnkd978732/action with payload pause

What values are allowed for which property

If you want to know which values are allowed for which property you can ask the bridge for it. Send a message to home/<homeId>/device/<deviceId>/<property>/options with an empty body (important). The bridge will reply on the same topic with a map of values and their meaning. If there is no interpreter for your device available or the interpreter has no information about possible values it won't reply.

Example: <base-topic>/home/12345/device/asjnkd978732/fan_power/options

Something is wrong

Try resetting the authentication by deleting the auth.json file.

Short excursion on RR's APIs (completely optional read)

Sadly RR does not provide a public interface (i.e. APIs) for developers to create their own solutions. Some people smarter than me started to decompile RR's apps and reverse engineered a lot of the protocol. Today, with a little help by a couple of extracted secrets and a bit of mitm traffic sniffing, we can see what the official app does and recreate some of it.

A few things you should know about the communication between the app and roborock servers (even if it's only to understand some of the errors this application might produce) are:

  • There are a couple of REST APIs that are used for
    • Authentication (login api), is where you log in and get a set of credentials for other operations
    • Home (home api), is where you get information about a home, which is the root node where everything else is assigned to
    • Interaction with devices (user api), requests available devices and their status, also allows starting predefined cleanups
  • There also is an MQTT connection. This is used for
    • IPC request/responses. Used for live updates of the robot status (e.g. idle/cleaning/drying/charging)
    • There are also "special" IPC requests that request the map of your place as seen by the robot

This application hides all the different ways of communication and provides a single way of communication with your device via mqtt. IF you already have a mqtt broker running for things like zigbee2mqtt, this service should be right up your alley. However, if you have never heard of mqtt, and you have no idea what it is, you may want to continue RR's app.

Todo-List

Status What
Use request memory to determine avg request to response time
Create "idle mode"
Disconnect roborock mqtt when idle, reconnect on activity
Detect routine finished to send bridge into idle mode
poll frequent updates during active phase
✅️ Room cleaning
Set Cleanup modes
Verify room cleaning parameters
Pause & Resume (e.g. to pause when certain area is entered)
📝 Verify Pause & Resume
Detect Device MQTT unreachable and stop polling
Fix POC ui after renaming room property names
Add room cleaning parameters to POC ui
📝 Find out how to get status of dock (probably not much to do)
📝 Allow resetting consumables (set on properties)
📝 Start / Stop drying at base
📝 trigger mop cleanup?
create way to ask about possible prop values and meaning
📝 Selected area cleaning (via mqtt? tricky!)

Help reverse engineering the protocol

Instructions on breaking and entering the protocol

I only own an S8 Ultra, and I have no idea how the protocol varies between models. Theoretically you should be able to use this service for other robots as well, if not, you can help by adding the functionality for it.

Most likely you will have to create a SchemaValueInterpreter for your robot, which should be a simple copy & paste & adapt (you might even find the data you need in some other services that do something similar). In case the application doesn't work at all for you, bigger changes might be necessary. You can help by figuring out what these changes are on the protocol level by following the instruction behind the link above.

Feel free to

  • open a pull request for
    • compatibility patches
    • bugfixes
    • new features / improvements
  • report issues

Other ways to support

If you have no idea how to code, but really want to use this application, you can sponsor me an additional roborock robot or lend me yours for a while. The actual extraction of what I need shouldn't take long. I cannot give any guarantees to how long it might take to make the required adjustments to the application. Contact me if interested.

roborock-bridge's People

Contributors

dependabot[bot] avatar dkneisz avatar konqi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

chakjer dkneisz

roborock-bridge's Issues

Docker - bridge - Application run failed

Hi,
For v0.0.5 bridge stop working after announced on mqtt.
Frontend works fine i think so, i see map.

bridge_1      | 2024-01-25T20:32:09.334Z  INFO 1 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing 16 rooms.
bridge_1      | 2024-01-25T20:32:09.590Z ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed
bridge_1      | 
bridge_1      | org.springframework.web.client.RestClientException: Error while extracting response for type [de.konqi.roborockbridge.remote.rest.dto.user.UserApiResponseDto<java.util.List<? extends de.konqi.roborockbridge.remote.rest.dto.user.UserScenes>>] and content type [application/json]
bridge_1      | 	at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:118) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1132) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1115) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:865) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:785) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:685) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at de.konqi.roborockbridge.remote.rest.UserApi.getCleanupScenes(UserApi.kt:92) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at de.konqi.roborockbridge.BridgeService.init(BridgeService.kt:80) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at de.konqi.roborockbridge.BridgeService.worker(BridgeService.kt:116) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
bridge_1      | 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
bridge_1      | 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
bridge_1      | 	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
bridge_1      | 	at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:348) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:233) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:165) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:174) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:445) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
bridge_1      | 	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.1.5.jar!/:3.1.5]
bridge_1      | 	at de.konqi.roborockbridge.RoborockBridgeApplicationKt.main(RoborockBridgeApplication.kt:38) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
bridge_1      | 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
bridge_1      | 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
bridge_1      | 	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
bridge_1      | 	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[roborock-bridge-0.0.5-SNAPSHOT.jar:0.0.5-SNAPSHOT]
bridge_1      | 	at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[roborock-bridge-0.0.5-SNAPSHOT.jar:0.0.5-SNAPSHOT]
bridge_1      | 	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[roborock-bridge-0.0.5-SNAPSHOT.jar:0.0.5-SNAPSHOT]
bridge_1      | 	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[roborock-bridge-0.0.5-SNAPSHOT.jar:0.0.5-SNAPSHOT]
bridge_1      | Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (token `JsonToken.START_OBJECT`)
bridge_1      |  at [Source: (String)"{"triggers":[{"name":"TIMER","type":"TIMER","entityId":"TIMER","param":"{\"cron\": \"6 20 * * 0,1,2,3,4,5,6\", \"enabled\": true, \"repeated\": true, \"timeZoneId\": \"Europe/Warsaw\"}"}],"action":{"type":"S","items":[{"id":1,"type":"CMD","name":"Korytarz","entityId":"7h2sLZVVs3oeb2JXEJSHP3","param":"{\"id\":1,\"method\":\"do_scenes_segments\",\"params\":{\"data\":[{\"tid\":\"1697821693196\",\"segs\":[{\"sid\":16}],\"map_flag\":0,\"fan_power\":102,\"water_box_mode\":202,\"mop_mode\":300,\"mop_te"[truncated 114 chars]; line: 1, column: 14] (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParam["triggers"]->java.util.ArrayList[0])
bridge_1      | 	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:103) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	... 36 common frames omitted
bridge_1      | Caused by: com.fasterxml.jackson.databind.JsonMappingException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (token `JsonToken.START_OBJECT`)
bridge_1      |  at [Source: (String)"{"triggers":[{"name":"TIMER","type":"TIMER","entityId":"TIMER","param":"{\"cron\": \"6 20 * * 0,1,2,3,4,5,6\", \"enabled\": true, \"repeated\": true, \"timeZoneId\": \"Europe/Warsaw\"}"}],"action":{"type":"S","items":[{"id":1,"type":"CMD","name":"Korytarz","entityId":"7h2sLZVVs3oeb2JXEJSHP3","param":"{\"id\":1,\"method\":\"do_scenes_segments\",\"params\":{\"data\":[{\"tid\":\"1697821693196\",\"segs\":[{\"sid\":16}],\"map_flag\":0,\"fan_power\":102,\"water_box_mode\":202,\"mop_mode\":300,\"mop_te"[truncated 114 chars]; line: 1, column: 14] (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParam["triggers"]->java.util.ArrayList[0]) (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserApiResponseDto["result"]->java.util.ArrayList[1]->de.konqi.roborockbridge.remote.rest.dto.user.UserScenes["param"])
bridge_1      | 	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1853) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:572) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:359) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395) ~[spring-web-6.0.13.jar!/:6.0.13]
bridge_1      | 	... 38 common frames omitted
bridge_1      | Caused by: java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (token `JsonToken.START_OBJECT`)
bridge_1      |  at [Source: (String)"{"triggers":[{"name":"TIMER","type":"TIMER","entityId":"TIMER","param":"{\"cron\": \"6 20 * * 0,1,2,3,4,5,6\", \"enabled\": true, \"repeated\": true, \"timeZoneId\": \"Europe/Warsaw\"}"}],"action":{"type":"S","items":[{"id":1,"type":"CMD","name":"Korytarz","entityId":"7h2sLZVVs3oeb2JXEJSHP3","param":"{\"id\":1,\"method\":\"do_scenes_segments\",\"params\":{\"data\":[{\"tid\":\"1697821693196\",\"segs\":[{\"sid\":16}],\"map_flag\":0,\"fan_power\":102,\"water_box_mode\":202,\"mop_mode\":300,\"mop_te"[truncated 114 chars]; line: 1, column: 14] (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParam["triggers"]->java.util.ArrayList[0])
bridge_1      | 	at de.konqi.roborockbridge.utility.NestedJsonDeserializer.convert(NestedJsonDeserializer.kt:13) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at de.konqi.roborockbridge.utility.NestedJsonDeserializer.convert(NestedJsonDeserializer.kt:8) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StdDelegatingDeserializer.convertValue(StdDelegatingDeserializer.java:337) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StdDelegatingDeserializer.deserialize(StdDelegatingDeserializer.java:174) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	... 55 common frames omitted
bridge_1      | Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (token `JsonToken.START_OBJECT`)
bridge_1      |  at [Source: (String)"{"triggers":[{"name":"TIMER","type":"TIMER","entityId":"TIMER","param":"{\"cron\": \"6 20 * * 0,1,2,3,4,5,6\", \"enabled\": true, \"repeated\": true, \"timeZoneId\": \"Europe/Warsaw\"}"}],"action":{"type":"S","items":[{"id":1,"type":"CMD","name":"Korytarz","entityId":"7h2sLZVVs3oeb2JXEJSHP3","param":"{\"id\":1,\"method\":\"do_scenes_segments\",\"params\":{\"data\":[{\"tid\":\"1697821693196\",\"segs\":[{\"sid\":16}],\"map_flag\":0,\"fan_power\":102,\"water_box_mode\":202,\"mop_mode\":300,\"mop_te"[truncated 114 chars]; line: 1, column: 14] (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParam["triggers"]->java.util.ArrayList[0])
bridge_1      | 	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1526) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1431) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.DeserializationContext.extractScalarFromObject(DeserializationContext.java:943) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1424) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:218) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:184) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:27) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3772) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3740) ~[jackson-databind-2.15.3.jar!/:2.15.3]
bridge_1      | 	at de.konqi.roborockbridge.utility.NestedJsonDeserializer.convert(NestedJsonDeserializer.kt:11) ~[classes!/:0.0.5-SNAPSHOT]
bridge_1      | 	... 60 common frames omitted
bridge_1      | 
bridge_1      | 2024-01-25T20:32:09.620Z  INFO 1 --- [           main] de.konqi.roborockbridge.BridgeService    : Shutting down bridge service
bridge_1      | 2024-01-25T20:32:09.633Z  WARN 1 --- [           main] .s.c.a.CommonAnnotationBeanPostProcessor : Destroy method on bean with name 'roborockMqtt' threw an exception: kotlin.UninitializedPropertyAccessException: lateinit property mqttClient has not been initialized
bridge_1      | 2024-01-25T20:32:09.656Z  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
bridge_1      | 2024-01-25T20:32:09.661Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
bridge_1      | 2024-01-25T20:32:09.667Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
roborock-bridge-005_bridge_1 exited with code 1

unrecognized property "auto_dry" with QRevo MaxV

crashing exception:

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "auto_dry" (class de.konqi.roborockbridge.remote.rest.dto.user.ParamsForSegmentedCleanup), not marked as ignorable (9 known properties: "mop_mode", "fan_power", "clean_order_mode", "repeat", "segs", "water_box_mode", "mop_template_id", "map_flag", "tid"])
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParam["action"]->de.konqi.roborockbridge.remote.rest.dto.user.UserSceneAction["items"]->java.util.ArrayList[0]->de.konqi.roborockbridge.remote.rest.dto.user.UserSceneParamActionItem["param"]->de.konqi.roborockbridge.remote.rest.dto.user.DifferentiatingCleanupParams["data"]->java.util.ArrayList[0]->de.konqi.roborockbridge.remote.rest.dto.user.ParamsForSegmentedCleanup["auto_dry"])
        at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1138) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1709) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1687) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:284) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:463) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:359) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2999) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at de.konqi.roborockbridge.remote.rest.dto.user.ActionItemParamDeserializer.deserialize(UserScenes.kt:169) ~[classes!/:0.0.6-SNAPSHOT]
        at de.konqi.roborockbridge.remote.rest.dto.user.ActionItemParamDeserializer.deserialize(UserScenes.kt:48) ~[classes!/:0.0.6-SNAPSHOT]
        at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:359) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3772) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3740) ~[jackson-databind-2.15.3.jar!/:2.15.3]
        at de.konqi.roborockbridge.utility.NestedJsonDeserializer.convert(NestedJsonDeserializer.kt:11) ~[classes!/:0.0.6-SNAPSHOT]
        ... 60 common frames omitted

Problem with setup of virtual android device

The problem i have is at the stop with rootAVD:
I have a virtual device running and followed the gif instructions for windows:

Getting errors regarding ADB commands not found:

Microsoft Windows [Version 10.0.22631.3737]
(c) Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\binde>g:

G:\>cd binde\Desktop\rootAVD-master

G:\binde\Desktop\rootAVD-master>rootAVD.bat
rootAVD A Script to root AVD by NewBit XDA

Usage:  rootAVD [DIR/ramdisk.img] [OPTIONS] | [EXTRA ARGUMENTS]
or:     rootAVD [ARGUMENTS]

Arguments:
        ListAllAVDs                     Lists Command Examples for ALL installed AVDs

        InstallApps                     Just install all APKs placed in the Apps folder

Main operation mode:
        DIR                             a path to an AVD system-image
                                        - must always be the 1st Argument after rootAVD

ADB Path | Ramdisk DIR| ANDROID_HOME:
        [M]ac/Darwin:                   export PATH=~/Library/Android/sdk/platform-tools:$PATH
                                        export PATH=$ANDROID_HOME/platform-tools:$PATH
                                        system-images/android-$API/google_apis_playstore/x86_64/

        [L]inux:                        export PATH=~/Android/Sdk/platform-tools:$PATH
                                        export PATH=$ANDROID_HOME/platform-tools:$PATH
                                        system-images/android-$API/google_apis_playstore/x86_64/

        [W]indows:                      set PATH=%LOCALAPPDATA%\Android\Sdk\platform-tools;%PATH%
                                        system-images\android-$API\google_apis_playstore\x86_64\

        ANDROID_HOME:                   By default, the script uses %LOCALAPPDATA%, to set its Android Home
                                        directory, search for AVD system-images and ADB binarys. This behaviour
                                        can be overwritten by setting the ANDROID_HOME variable.
                                        e.g. set ANDROID_HOME=%USERPROFILE%\Downloads\sdk

        $API:                           25,29,30,31,32,33,34,UpsideDownCake,etc.

Options:
        restore                         restore all existing .backup files, but doesn't delete them
                                        - the AVD doesn't need to be running
                                        - no other Argument after will be processed

        InstallKernelModules            install custom build kernel and its modules into ramdisk.img
                                        - kernel (bzImage) and its modules (initramfs.img) are inside rootAVD
                                        - both files will be deleted after installation

        InstallPrebuiltKernelModules    download and install an AOSP prebuilt kernel and its modules into ramdisk.img
                                        - similar to InstallKernelModules, but the AVD needs to be online

Options are exclusive, only one at the time will be processed.

Extra Arguments:
        DEBUG                           Debugging Mode, prevents rootAVD to pull back any patched file

        PATCHFSTAB                      fstab.ranchu will get patched to automount Block Devices like /dev/block/sda1
                                        - other entries can be added in the script as well
                                        - a custom build Kernel might be necessary

        GetUSBHPmodZ                    The USB HOST Permissions Module Zip will be downloaded into /sdcard/Download

        FAKEBOOTIMG                     Creates a fake Boot.img file that can directly be patched from the Magisk APP
                                        - Magisk will be launched to patch the fake Boot.img within 60s
                                        - the fake Boot.img will be placed under /sdcard/Download/fakeboot.img

Extra Arguments can be combined, there is no particular order.

Notes: rootAVD will
- always create .backup files of ramdisk*.img and kernel-ranchu
- replace both when done patching
- show a Menu, to choose the Magisk Version (Stable || Canary || Alpha), if the AVD is online
- make the choosen Magisk Version to its local
- install all APKs placed in the Apps folder
- use %LOCALAPPDATA%\Android\Sdk to search for AVD system images

Command Examples:
rootAVD.bat
rootAVD.bat ListAllAVDs
rootAVD.bat InstallApps

rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img FAKEBOOTIMG
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img DEBUG PATCHFSTAB GetUSBHPmodZ
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img restore
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallKernelModules
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallPrebuiltKernelModules
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallPrebuiltKernelModules GetUSBHPmodZ PATCHFSTAB DEBUG


G:\binde\Desktop\rootAVD-master>rootAVD.bat ListAllAVDs
rootAVD A Script to root AVD by NewBit XDA

Usage:  rootAVD [DIR/ramdisk.img] [OPTIONS] | [EXTRA ARGUMENTS]
or:     rootAVD [ARGUMENTS]

Arguments:
        ListAllAVDs                     Lists Command Examples for ALL installed AVDs

        InstallApps                     Just install all APKs placed in the Apps folder

Main operation mode:
        DIR                             a path to an AVD system-image
                                        - must always be the 1st Argument after rootAVD

ADB Path | Ramdisk DIR| ANDROID_HOME:
        [M]ac/Darwin:                   export PATH=~/Library/Android/sdk/platform-tools:$PATH
                                        export PATH=$ANDROID_HOME/platform-tools:$PATH
                                        system-images/android-$API/google_apis_playstore/x86_64/

        [L]inux:                        export PATH=~/Android/Sdk/platform-tools:$PATH
                                        export PATH=$ANDROID_HOME/platform-tools:$PATH
                                        system-images/android-$API/google_apis_playstore/x86_64/

        [W]indows:                      set PATH=%LOCALAPPDATA%\Android\Sdk\platform-tools;%PATH%
                                        system-images\android-$API\google_apis_playstore\x86_64\

        ANDROID_HOME:                   By default, the script uses %LOCALAPPDATA%, to set its Android Home
                                        directory, search for AVD system-images and ADB binarys. This behaviour
                                        can be overwritten by setting the ANDROID_HOME variable.
                                        e.g. set ANDROID_HOME=%USERPROFILE%\Downloads\sdk

        $API:                           25,29,30,31,32,33,34,UpsideDownCake,etc.

Options:
        restore                         restore all existing .backup files, but doesn't delete them
                                        - the AVD doesn't need to be running
                                        - no other Argument after will be processed

        InstallKernelModules            install custom build kernel and its modules into ramdisk.img
                                        - kernel (bzImage) and its modules (initramfs.img) are inside rootAVD
                                        - both files will be deleted after installation

        InstallPrebuiltKernelModules    download and install an AOSP prebuilt kernel and its modules into ramdisk.img
                                        - similar to InstallKernelModules, but the AVD needs to be online

Options are exclusive, only one at the time will be processed.

Extra Arguments:
        DEBUG                           Debugging Mode, prevents rootAVD to pull back any patched file

        PATCHFSTAB                      fstab.ranchu will get patched to automount Block Devices like /dev/block/sda1
                                        - other entries can be added in the script as well
                                        - a custom build Kernel might be necessary

        GetUSBHPmodZ                    The USB HOST Permissions Module Zip will be downloaded into /sdcard/Download

        FAKEBOOTIMG                     Creates a fake Boot.img file that can directly be patched from the Magisk APP
                                        - Magisk will be launched to patch the fake Boot.img within 60s
                                        - the fake Boot.img will be placed under /sdcard/Download/fakeboot.img

Extra Arguments can be combined, there is no particular order.

Notes: rootAVD will
- always create .backup files of ramdisk*.img and kernel-ranchu
- replace both when done patching
- show a Menu, to choose the Magisk Version (Stable || Canary || Alpha), if the AVD is online
- make the choosen Magisk Version to its local
- install all APKs placed in the Apps folder
- use %LOCALAPPDATA%\Android\Sdk to search for AVD system images

Command Examples:
rootAVD.bat
rootAVD.bat ListAllAVDs
rootAVD.bat InstallApps

rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img FAKEBOOTIMG
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img DEBUG PATCHFSTAB GetUSBHPmodZ
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img restore
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallKernelModules
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallPrebuiltKernelModules
rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img InstallPrebuiltKernelModules GetUSBHPmodZ PATCHFSTAB DEBUG

rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img FAKEBOOTIMG
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img DEBUG PATCHFSTAB GetUSBHPmodZ
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img restore
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img InstallKernelModules
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img InstallPrebuiltKernelModules
rootAVD.bat system-images\android-33\google_apis_playstore\x86_64\ramdisk.img InstallPrebuiltKernelModules GetUSBHPmodZ PATCHFSTAB DEBUG


G:\binde\Desktop\rootAVD-master>rootAVD.bat system-images\android-34\google_apis\x86_64\ramdisk.img
[*] Set Directorys
[*] Testing for write permissions
[-] creating TEMPFILE File
[-] deleating TEMPFILE File
[^!] NO elevated write permissions are needed to access $ANDROID_HOME
[-] Test IF ADB SHELL is working
[-] In any AVD via ADB, you can execute code without root in /data/data/com.android.shell
[*] Testing the ADB working space
[!] /data/data/com.android.shell is available
[*] Cleaning up the ADB working space
Der Befehl "adb" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
[*] Creating the ADB working space
Der Befehl "adb" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
[*] looking for Magisk installer Zip
[*] Push Magisk.zip into /data/data/com.android.shell/Magisk
[-] Der Befehl "adb" ist entweder falsch geschrieben oder
[-] Backup exists already
[*] Push ramdisk.img into /data/data/com.android.shell/Magisk/ramdisk.img
[-] Der Befehl "adb" ist entweder falsch geschrieben oder
[-] Copy rootAVD Script into Magisk DIR
Der Befehl "adb" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
[-] run the actually Boot/Ramdisk/Kernel Image Patch Script
[*] from Magisk by topjohnwu and modded by NewBit XDA
Der Befehl "adb" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

G:\binde\Desktop\rootAVD-master>

image

I checked that i have the Android SDK Platform-Tools installed.
I am running Windows 11 Pro 23H2.

Problem running application

What do i do wrong?

pi@raspberrypi:~ $ sudo java -jar -Dspring.config.location="FTP/files/application.yaml" FTP/files/roborock-bridge-0.0.6-SNAPSHOT.jar
2024-05-29T22:56:53.096+01:00  INFO 28848 --- [           main] d.k.r.RoborockBridgeApplicationKt        : Starting RoborockBridgeApplicationKt v0.0.6-SNAPSHOT using Java 17.0.1 with PID 28848 (/home/pi/FTP/files/roborock-bridge-0.0.6-SNAPSHOT.jar started by root in /home/pi)
2024-05-29T22:56:53.117+01:00  INFO 28848 --- [           main] d.k.r.RoborockBridgeApplicationKt        : The following 1 profile is active: "bridge"
2024-05-29T22:56:58.253+01:00  INFO 28848 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-05-29T22:56:58.656+01:00  INFO 28848 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 371 ms. Found 5 JPA repository interfaces.
2024-05-29T22:57:01.139+01:00  INFO 28848 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-05-29T22:57:01.405+01:00  INFO 28848 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.13.Final
2024-05-29T22:57:01.415+01:00  INFO 28848 --- [           main] org.hibernate.cfg.Environment            : HHH000406: Using bytecode reflection optimizer
2024-05-29T22:57:02.801+01:00  INFO 28848 --- [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-05-29T22:57:02.935+01:00  INFO 28848 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-05-29T22:57:03.776+01:00  INFO 28848 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:h2 user=SA
2024-05-29T22:57:03.785+01:00  INFO 28848 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-05-29T22:57:07.981+01:00  INFO 28848 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-05-29T22:57:08.243+01:00  INFO 28848 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-05-29T22:57:09.069+01:00  INFO 28848 --- [           main] d.k.r.remote.RoborockCredentials         : clientId not configured. Using auto-generated clientId rqLJB4fibvxQtYz3uDqZwA==.
2024-05-29T22:57:12.133+01:00  INFO 28848 --- [           main] o.s.d.j.r.query.QueryEnhancerFactory     : Hibernate is in classpath; If applicable, HQL parser will be used.
2024-05-29T22:57:17.016+01:00 ERROR 28848 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Could not connect to tcp://192.168.202.201:1883. Unable to connect to server (32103) - java.net.ConnectException: Connection refused
2024-05-29T22:57:17.019+01:00  WARN 28848 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bridgeService' defined in URL [jar:file:/home/pi/FTP/files/roborock-bridge-0.0.6-SNAPSHOT.jar!/BOOT-INF/classes!/de/konqi/roborockbridge/BridgeService.class]: Unsatisfied dependency expressed through constructor parameter 5: Error creating bean with name 'bridgeMqtt': Invocation of init method failed
2024-05-29T22:57:17.022+01:00  WARN 28848 --- [           main] .s.c.a.CommonAnnotationBeanPostProcessor : Destroy method on bean with name 'roborockMqtt' threw an exception: kotlin.UninitializedPropertyAccessException: lateinit property mqttClient has not been initialized
2024-05-29T22:57:17.194+01:00  INFO 28848 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2024-05-29T22:57:17.200+01:00  INFO 28848 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2024-05-29T22:57:17.207+01:00  INFO 28848 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2024-05-29T22:57:17.269+01:00  INFO 28848 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger :

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-05-29T22:57:17.344+01:00 ERROR 28848 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bridgeService' defined in URL [jar:file:/home/pi/FTP/files/roborock-bridge-0.0.6-SNAPSHOT.jar!/BOOT-INF/classes!/de/konqi/roborockbridge/BridgeService.class]: Unsatisfied dependency expressed through constructor parameter 5: Error creating bean with name 'bridgeMqtt': Invocation of init method failed
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:801) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:950) ~[spring-context-6.0.13.jar!/:6.0.13]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) ~[spring-context-6.0.13.jar!/:6.0.13]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738) ~[spring-boot-3.1.5.jar!/:3.1.5]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440) ~[spring-boot-3.1.5.jar!/:3.1.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-3.1.5.jar!/:3.1.5]
        at de.konqi.roborockbridge.RoborockBridgeApplicationKt.main(RoborockBridgeApplication.kt:38) ~[classes!/:0.0.6-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[roborock-bridge-0.0.6-SNAPSHOT.jar:0.0.6-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[roborock-bridge-0.0.6-SNAPSHOT.jar:0.0.6-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[roborock-bridge-0.0.6-SNAPSHOT.jar:0.0.6-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[roborock-bridge-0.0.6-SNAPSHOT.jar:0.0.6-SNAPSHOT]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bridgeMqtt': Invocation of init method failed
        at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:222) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:419) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:910) ~[spring-beans-6.0.13.jar!/:6.0.13]
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:788) ~[spring-beans-6.0.13.jar!/:6.0.13]
        ... 24 common frames omitted
Caused by: org.eclipse.paho.client.mqttv3.MqttException: Unable to connect to server
        at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:80) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
        at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:724) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
        at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
        at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
        at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549) ~[na:na]
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
        at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]
        at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:74) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
        ... 2 common frames omitted

Possible regression with org.springframework.boot

One additional note, that is not directly related to this topic:
As I mentioned when using a higher version than "3.2.5" for "org.springframework.boot" I did not get any update for the states. I thought I got it fixed by removing the second parameter when calling publishDeviceStatus(message.deviceId) in "BridgeService.kt" (line 173). Then I did get updates when requesting state updates, but I did not get all properties, just a handfull. I was not able to find out why that's the case, maybe you have an idea (but maybe that should be another topic, because it has nothing to do with this).

Originally posted by @dkneisz in #71 (comment)

SpringApplication Application run failed after requesting cleanup routine

I got an issue when I trigger a cleanup routine via mqtt (which routine doesn't matter). The routine does trigger, but the bridge shuts down with the following error.

Device is a Roborock QRevo Pro.
Issue is fully reproducible

2024-08-18T19:16:07.949+02:00  INFO 17422 --- [           main] d.k.r.RoborockBridgeApplicationKt        : Starting RoborockBridgeApplicationKt v0.0.7-SNAPSHOT using Java 17.0.11 with PID 17422 (/opt/roborock-bridge/roborock-bridge.jar started by openhabian in /opt/roborock-bridge)
2024-08-18T19:16:07.966+02:00  INFO 17422 --- [           main] d.k.r.RoborockBridgeApplicationKt        : The following 1 profile is active: "bridge"
2024-08-18T19:16:12.521+02:00  INFO 17422 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-08-18T19:16:12.833+02:00  INFO 17422 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 278 ms. Found 5 JPA repository interfaces.
2024-08-18T19:16:15.322+02:00  INFO 17422 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-08-18T19:16:15.656+02:00  INFO 17422 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.4.4.Final
2024-08-18T19:16:15.851+02:00  INFO 17422 --- [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2024-08-18T19:16:17.282+02:00  INFO 17422 --- [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-08-18T19:16:17.433+02:00  INFO 17422 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-08-18T19:16:18.122+02:00  INFO 17422 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:h2 user=SA
2024-08-18T19:16:18.131+02:00  INFO 17422 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-08-18T19:16:23.359+02:00  INFO 17422 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-08-18T19:16:23.682+02:00  INFO 17422 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-08-18T19:16:26.640+02:00  INFO 17422 --- [           main] o.s.d.j.r.query.QueryEnhancerFactory     : Hibernate is in classpath; If applicable, HQL parser will be used.
2024-08-18T19:16:28.644+02:00  INFO 17422 --- [           main] d.k.r.remote.RoborockCredentials         : clientId not configured. Using auto-generated clientId 5Q2+aXjtO5qukg7yEoWu1Q==.
2024-08-18T19:16:32.075+02:00  INFO 17422 --- [           main] d.k.r.RoborockBridgeApplicationKt        : Started RoborockBridgeApplicationKt in 26.25 seconds (process running for 28.366)
2024-08-18T19:16:34.710+02:00  INFO 17422 --- [           main] d.k.roborockbridge.remote.rest.UserApi   : ok true
2024-08-18T19:16:35.077+02:00  INFO 17422 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing new home with id '3659986'
2024-08-18T19:16:35.171+02:00  INFO 17422 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing new robot with id '782w1Nhd37ltwdVbn1xc6O'
2024-08-18T19:16:35.534+02:00  INFO 17422 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing 6 rooms.
2024-08-18T19:16:35.848+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : ParamsForZonedCleanup: Found unknown extra property "auto_dry" with value: 1
2024-08-18T19:16:35.849+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : ParamsForZonedCleanup: Found unknown extra property "auto_dustCollection" with value: 1
2024-08-18T19:16:35.849+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : ParamsForZonedCleanup: Found unknown extra property "region_num" with value: 0
2024-08-18T19:16:35.854+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : UserSceneParam: Found unknown extra property "tagId" with value: "1002"
2024-08-18T19:16:35.878+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : ScenesAppStartParam: Found unknown extra property "auto_dustCollection" with value: 1
2024-08-18T19:16:35.879+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : UserSceneParam: Found unknown extra property "tagId" with value: "1005"
2024-08-18T19:16:35.881+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : ScenesAppStartParam: Found unknown extra property "auto_dustCollection" with value: 1
2024-08-18T19:16:35.883+02:00  WARN 17422 --- [           main] d.k.r.remote.rest.dto.UnknownFieldsImpl  : UserSceneParam: Found unknown extra property "tagId" with value: "1003"
2024-08-18T19:16:35.933+02:00  INFO 17422 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing 3 schemas.
2024-08-18T19:16:36.571+02:00  INFO 17422 --- [       Thread-1] d.k.r.remote.mqtt.RoborockMqtt           : connected
2024-08-18T19:16:36.573+02:00  INFO 17422 --- [       Thread-1] d.k.r.remote.mqtt.RoborockMqtt           : Subscribing to topic rr/m/o/AbPEVCD9fOfam8Isumhyf/52163555/#
2024-08-18T19:16:37.493+02:00  INFO 17422 --- [           main] d.k.r.remote.mqtt.RoborockMqtt           : connected
2024-08-18T19:16:37.495+02:00  INFO 17422 --- [           main] d.k.r.remote.mqtt.RoborockMqtt           : Subscribing to topic rr/m/o/AbPEVCD9fOfam8Isumhyf/52163555/#
2024-08-18T19:16:37.498+02:00  WARN 17422 --- [Rec: rrb_POPa0n] d.k.r.remote.mqtt.RoborockMqtt           : Connection lost
2024-08-18T19:16:38.502+02:00  INFO 17422 --- [           main] d.k.r.remote.mqtt.RoborockMqtt           : Published 'get_room_mapping' request via topic 'rr/m/i/AbPEVCD9fOfam8Isumhyf/52163555/782w1Nhd37ltwdVbn1xc6O'.
2024-08-18T19:16:38.609+02:00  INFO 17422 --- [all: rrb_POPa0n] d.k.r.remote.mqtt.RoborockMqtt           : Lambda: New message for topic 'rr/m/o/AbPEVCD9fOfam8Isumhyf/52163555/782w1Nhd37ltwdVbn1xc6O' 0
2024-08-18T19:16:38.884+02:00  INFO 17422 --- [all: rrb_POPa0n] d.k.r.remote.mqtt.MessageDecoder         : Received response to request 1 with method 'GET_ROOM_MAPPING'.
2024-08-18T19:16:39.203+02:00  INFO 17422 --- [           main] d.k.roborockbridge.bridge.BridgeMqtt     : Announcing 6 rooms.
2024-08-18T19:17:32.132+02:00  INFO 17422 --- [   scheduling-1] d.k.r.remote.mqtt.RoborockMqtt           : disconnecting since bus idle
2024-08-18T19:17:32.180+02:00  INFO 17422 --- [   scheduling-1] d.k.r.remote.mqtt.RoborockMqtt           : disconnected
2024-08-18T19:17:39.248+02:00  INFO 17422 --- [           main] de.konqi.roborockbridge.BridgeService    : Requesting cleanup routine '3358614' via rest api.
2024-08-18T19:17:39.567+02:00 ERROR 17422 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.konqi.roborockbridge.persistence.entity.Routine.triggeredDeviceIds: could not initialize proxy - no Session
        at org.hibernate.collection.spi.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:634) ~[hibernate-core-6.4.4.Final.jar!/:6.4.4.Final]
        at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217) ~[hibernate-core-6.4.4.Final.jar!/:6.4.4.Final]
        at org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:613) ~[hibernate-core-6.4.4.Final.jar!/:6.4.4.Final]
        at org.hibernate.collection.spi.AbstractPersistentCollection.read(AbstractPersistentCollection.java:136) ~[hibernate-core-6.4.4.Final.jar!/:6.4.4.Final]
        at org.hibernate.collection.spi.PersistentSet.iterator(PersistentSet.java:169) ~[hibernate-core-6.4.4.Final.jar!/:6.4.4.Final]
        at de.konqi.roborockbridge.BridgeService.bridgeMqttProcessingLoop$lambda$16(BridgeService.kt:442) ~[!/:0.0.7-SNAPSHOT]
        at de.konqi.roborockbridge.BridgeService.bridgeMqttProcessingLoop$lambda$17(BridgeService.kt:295) ~[!/:0.0.7-SNAPSHOT]
        at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]
        at de.konqi.roborockbridge.BridgeService.bridgeMqttProcessingLoop(BridgeService.kt:295) ~[!/:0.0.7-SNAPSHOT]
        at de.konqi.roborockbridge.BridgeService.worker(BridgeService.kt:130) ~[!/:0.0.7-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:365) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:237) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:168) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:185) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:178) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:156) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:451) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:384) ~[spring-context-6.1.6.jar!/:6.1.6]
        at org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:348) ~[spring-boot-3.2.5.jar!/:3.2.5]
        at de.konqi.roborockbridge.RoborockBridgeApplicationKt.main(RoborockBridgeApplication.kt:38) ~[!/:0.0.7-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91) ~[roborock-bridge.jar:0.0.7-SNAPSHOT]
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53) ~[roborock-bridge.jar:0.0.7-SNAPSHOT]
        at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58) ~[roborock-bridge.jar:0.0.7-SNAPSHOT]

2024-08-18T19:17:39.630+02:00  INFO 17422 --- [           main] de.konqi.roborockbridge.BridgeService    : Shutting down bridge service
2024-08-18T19:17:39.650+02:00  INFO 17422 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2024-08-18T19:17:39.657+02:00  INFO 17422 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2024-08-18T19:17:39.663+02:00  INFO 17422 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.