Ecovacs Vacuum Cleaners Binding [3.2.0;4.0.0)

Oh, right. I completely forgot about that: your device does have mapping capability, but there’s no map info in cleaning history (as you’ve seen, there’s just area (a), timestamp (s), duration (l), trigger condition (t) and stop reason (f)).
I’ve just done a new release which filters out the unsupported channels (last clean mode, last clean map) on XML devices.

Is there any link where I can find documentation, or all is made by reverse engineer the current official application?
I’m finding several implementation, but not a real documentation.

It’s all reverse engineering, there’s no official documentation that I am aware of.

I have a DEEBOT OZMO 900 and this addon from 20th May. All channels I tested work, but I’m missing two channels:

Things you could add:

  • Add customArea to actions#command.
  • Add “Find DEEBOT”. When pressing this button in the app, the robot plays a sound.

So you have status#water-system-present, but not settings#water-amount? That would be weird, because those two have the same condition for removal. You do have Show advanced channels enabled though, right?

The README doesn’t currently make any efforts of calling out supported device features. The reason for that is that in most cases I can’t validate supported device features myself, simply because I don’t own the devices (I gathered the supported device features from other open source libraries and this list).

I thought about this, but I have no idea what a meaningful parameter format for specifying the area to be cleaned could look like. Do you have an idea there?

I’ll add a playSound rule action, with a parameter specifying the sound to be played.

No, I wasn’t even aware of that checkbox. After ticking it, settings#water-amount is now visible :man_facepalming:

Maybe customArea:(1|2)(3|4) where (1|2) stand for the x and y coordinates of the top left hand corner of the custom area and (3|4) for the bottom right hand corner?

I hope that these coordinates are stable. Otherwise this wouldn’t be useful at all.
At least the room ids change with nearly every run on my device…

:+1:

And how do you find out the coordinates to put there? :wink:
Only idea I have about that is logging custom area runs started by the app (need to see if this is possible). The coordinates should be stable as long as the map has the same size.

Edit:
A cleaning info MQTT message that shows the custom area format (here: a 1.0 x 0.5m area) used by the device looks like this:
{"header":{"pri":1,"tzm":480,"ts":"1653461358022","ver":"0.0. 1","fwVer":"1.8.2","hwVer":"0.1.1"},"body":{"data":{"trigger":"app","state":"clean","cleanState":{"id":"122","router":"plan","type":"customArea","content":"1074.000000,-326.000000,2098.000000,-855.000000","count":1,"motionState":"working"}}}}

A 1.0 x 2.0m area (roughly at the same spot in the map) looks like this:
{"header":{"pri":1,"tzm":480,"ts":"1653461526530","ver":"0.0. 1","fwVer":"1.8.2","hwVer":"0.1.1"},"body":{"data":{"trigger":"app","state":"clean","cleanState":{"id":"122","router":"plan","type":"customArea","content":"992.000000,256.000000,2112.000000,-1702.000000","count":1,"motionState":"working"}}}}

2.0 x 0.5m:
{"header":{"pri":1,"tzm":480,"ts":"1653461720967","ver":"0.0.1","fwVer":"1.8.2","hwVer":"0.1.1"},"body":{"data":{"trigger":"app","state":"clean","cleanState":{"id":"122","router":"plan","type":"customArea","content":"-20.000000,114.000000,2027.000000,-358.000000","count":1,"motionState":"working"}}}}

Coordinate system seems to be x1,y1,x2,y2 in mm, but I’m not sure about the origin point of it. Probably somewhere around the charging station. In any case, I don’t see a user measuring this manually, so logging the coordinates, triggering from the app and using those coordinates seems like the only meaningful choice?

If you agree, it would be great if you could enable TRACE logging for org.openhab.binding.ecovacs, start a custom area clean run and then send me a PM with the log so I can see the format for XML devices. Thanks.

I guess that’s the best solution.

Yes, I can do that. Is the debug message already implemented or do I need to update the binding first?

It’s already implemented.

Published an update with support for ‘play sound’ rule actions and ‘custom area’ command. For details see README :slight_smile:

2 Likes

Hello there,

every time If I install the binding, I ran into the following warning.

2022-07-22 12:07:36.253 [WARN ] [internal.service.FeaturesServiceImpl] - Can't load features repository mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/3.3.0-SNAPSHOT/xml/features

java.lang.RuntimeException: Error resolving artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT: [Could not find artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT] : mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/3.3.0-SNAPSHOT/xml/features

	at org.apache.karaf.features.internal.service.RepositoryImpl.load(RepositoryImpl.java:121) ~[?:?]

	at org.apache.karaf.features.internal.service.RepositoryImpl.<init>(RepositoryImpl.java:51) ~[?:?]

	at org.apache.karaf.features.internal.service.RepositoryCacheImpl.create(RepositoryCacheImpl.java:51) ~[?:?]

	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.getFeatureCache(FeaturesServiceImpl.java:611) ~[?:?]

	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.ensureCacheLoaded(FeaturesServiceImpl.java:582) ~[?:?]

	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.getRepository(FeaturesServiceImpl.java:530) ~[?:?]

	at org.apache.karaf.kar.internal.KarServiceImpl.findMissingDependency(KarServiceImpl.java:165) ~[?:?]

	at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:116) ~[?:?]

	at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:95) ~[?:?]

	at org.openhab.core.addon.marketplace.karaf.internal.community.CommunityKarafAddonHandler.installFromCache(CommunityKarafAddonHandler.java:163) ~[?:?]

	at org.openhab.core.addon.marketplace.karaf.internal.community.CommunityKarafAddonHandler.install(CommunityKarafAddonHandler.java:110) ~[?:?]

	at org.openhab.core.addon.marketplace.AbstractRemoteAddonService.install(AbstractRemoteAddonService.java:176) ~[?:?]

	at org.openhab.core.io.rest.core.internal.addons.AddonResource.lambda$1(AddonResource.java:223) ~[?:?]

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]

	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

	at java.lang.Thread.run(Thread.java:829) [?:?]

Caused by: java.io.IOException: Error resolving artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT: [Could not find artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.configureIOException(AetherBasedResolver.java:803) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:774) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:657) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:598) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:565) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:555) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.Connection.getInputStream(Connection.java:123) ~[?:?]

	at java.net.URL.openStream(URL.java:1165) ~[?:?]

	at org.apache.karaf.features.internal.service.RepositoryImpl.load(RepositoryImpl.java:114) ~[?:?]

	... 17 more

	Suppressed: shaded.org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT

		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:403) ~[?:?]

		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:215) ~[?:?]

		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:192) ~[?:?]

		at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:247) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:657) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:598) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:565) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:555) ~[?:?]

		at org.ops4j.pax.url.mvn.internal.Connection.getInputStream(Connection.java:123) ~[?:?]

		at java.net.URL.openStream(URL.java:1165) ~[?:?]

		at org.apache.karaf.features.internal.service.RepositoryImpl.load(RepositoryImpl.java:114) ~[?:?]

		at org.apache.karaf.features.internal.service.RepositoryImpl.<init>(RepositoryImpl.java:51) ~[?:?]

		at org.apache.karaf.features.internal.service.RepositoryCacheImpl.create(RepositoryCacheImpl.java:51) ~[?:?]

		at org.apache.karaf.features.internal.service.FeaturesServiceImpl.getFeatureCache(FeaturesServiceImpl.java:611) ~[?:?]

		at org.apache.karaf.features.internal.service.FeaturesServiceImpl.ensureCacheLoaded(FeaturesServiceImpl.java:582) ~[?:?]

		at org.apache.karaf.features.internal.service.FeaturesServiceImpl.getRepository(FeaturesServiceImpl.java:530) ~[?:?]

		at org.apache.karaf.kar.internal.KarServiceImpl.findMissingDependency(KarServiceImpl.java:165) ~[?:?]

		at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:116) ~[?:?]

		at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:95) ~[?:?]

		at org.openhab.core.addon.marketplace.karaf.internal.community.CommunityKarafAddonHandler.installFromCache(CommunityKarafAddonHandler.java:163) ~[?:?]

		at org.openhab.core.addon.marketplace.karaf.internal.community.CommunityKarafAddonHandler.install(CommunityKarafAddonHandler.java:110) ~[?:?]

		at org.openhab.core.addon.marketplace.AbstractRemoteAddonService.install(AbstractRemoteAddonService.java:176) ~[?:?]

		at org.openhab.core.io.rest.core.internal.addons.AddonResource.lambda$1(AddonResource.java:223) ~[?:?]

		at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]

		at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]

		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

		at java.lang.Thread.run(Thread.java:829) [?:?]

Caused by: shaded.org.eclipse.aether.resolution.ArtifactResolutionException: Error resolving artifact org.openhab.core.features.karaf:org.openhab.core.features.karaf.openhab-core:xml:features:3.3.0-SNAPSHOT

	at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:413) ~[?:?]

	at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:215) ~[?:?]

	at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:192) ~[?:?]

	at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:247) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:657) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:598) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:565) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:555) ~[?:?]

	at org.ops4j.pax.url.mvn.internal.Connection.getInputStream(Connection.java:123) ~[?:?]

	at java.net.URL.openStream(URL.java:1165) ~[?:?]

	at org.apache.karaf.features.internal.service.RepositoryImpl.load(RepositoryImpl.java:114) ~[?:?]

	... 17 more

I’ve tried everything I think, yesterday I installed a completely fresh install of openhabian… still appears.
current version completely fresh - openHAB 3.3.0 - Release Build

Can anyone support with this ?

I’ve exactly the same issue after updating to 3.3.0 release.
Binding isn’t working any more :confused:

I guess this is due to 3.3.0-SNAPSHOT artifacts being removed from the Maven repo after 3.3.0 release. I’ll do a rebuild against 3.4.0-SNAPSHOT ASAP.

2 Likes

It looks like this warning actually is not an issue, at least it doesn’t seem to impair using the binding. I set up a test environment and

  • got the warning with 3.3.0 and 20220622 binding, but binding was active nevertheless
  • still get the warning with 20220726 binding, which is now built against the 3.4.0-SNAPSHOT runtime, but the binding still seems to work fine

I’m not sure about the source/reason of this warning, because I do not fully understand the distribution model of OH and the repositories used to fetch the various jar files. TBH, I’d suggest ignoring the warnings for now as long as the binding continues to work fine. I hope those warnings will disappear if/when the binding eventually gets merged to the OH distribution.

Today I tested this feature and found two issues:

  • It’s not possible to enter customArea:0,0,100,100=customArea in the command descriptions textbox on /settings/items/Ecovacs_Command/metadata/commandDescription, because commas are used as option delimiter there. Maybe change the coordinate delimiter to _, e.g. customArea:0_0_100_100?
  • I re-created the robot thing, but I still don’t see the channel current-cleaning-spot-definition and this time I checked the “Show advanced” checkbox :wink:

My robot is supported by this feature, because sending customArea:100,100,1000,1000 to the command channel triggers a custom area clean.

I’ve changed the delimiter to semicolon, so now it’s customArea:0;0;100;100. Same applies to spot area: spotArea:A;B;D.

I’m not sure what’s going on on your machine then :confused:

Are you sure you recreated the thing using the latest binding?

I think so. On /settings/addons/marketplace:132989 it says " Updated At: 2. September 2022 10:18" and there’s no “Update” button, so I have the latest version?

You need to reinstall (as in: uninstall and install again) to update the installed binding.

1 Like

With that the channel appears and the delimiter change I can now control my robot by a single drop down menu that contains my rooms. Thank you :slight_smile:

Nit: You could round the values in current-cleaning-spot-definition. For my device it contains values with 6 positions after decimal point.