Worx Landroid Binding

Hi,
this should already be available

String LandroidAction

This one accepts “Start” “Stop” and “Home” while Stop is similar to Pause as Mower stops (even while still searching for Zone) and would start when sending “Start” again. Stop is not to take so as “manual stop” when Mower stops and manual action is required.

Does this answer your question or is your Mower working different?

I used Sitemap to show only valid commands

Switch item=LandroidAction label=“Action” mappings=[START=“Start”] visibility=[LandroidStatusCode==0, LandroidStatusCode==1]
Switch item=LandroidAction label=“Action” mappings=[STOP=“Stop”,HOME=“Home”] visibility=[LandroidStatusCode==7, LandroidStatusCode==33]
Switch item=LandroidAction label=“Action” mappings=[START=“Start”,HOME=“Home”] visibility=[LandroidStatusCode==34]

Regards
int5749

@nibi79 @INT5749 Thank you guys. That is the reason. Just a misunderstanding. I will name it “Pause” in my sitemap and everything is consitent between the worx app and openhab :slight_smile:

honestly I’m not pretty sure. I believe if you pause mower in Positec App you have to manually start mower on device? While with Binding it is really “just” paused and can be started by binding again. Open speaking I don’t use Positec App that much as I started 2 years ago to integrate to openHAB but this binding is first which supports pause/reactivation while the other bridges - as far as I do reacall - where similar to App. But I might be wrong and shall test this later, when the sun is no longer shining on my gras :slight_smile:

Hi nibi79,
I have some issue with the landroid binding. The bridge is offline due to a communication error. I have been trying to disable the binding many for more than two days but when I try to enable it I have the same error. This is the binding’s DEBUG LOG.

...
2020-05-17 15:08:43.153 [DEBUG] [nternal.webapi.request.WebApiRequest] - URI: 
https://api.worxlandroid.com/api/v2/oauth/token
...
2020-05-17 15:08:47.566 [DEBUG] [nternal.webapi.request.WebApiRequest] - Worx Landroid WebApi Response: {"token_type":"Bearer","expires_in":31536000,"access_token":"***hidden for debug log***","refresh_token":"***hidden for debug log***"}
2020-05-17 15:08:47.583 [WARN ] [ernal.webapi.response.WebApiResponse] - Cannot get response as JosnObject
2020-05-17 15:08:47.585 [WARN ] [ernal.webapi.response.WebApiResponse] - Cannot get response  as JosnObject
...

2020-05-17 15:08:47.622 [DEBUG] [nternal.webapi.request.WebApiRequest] - URI: https://api.worxlandroid.com/api/v2/users/me
...
2020-05-17 15:08:47.843 [DEBUG] [nternal.webapi.request.WebApiRequest] - Worx Landroid WebApi Response: {"id":40794,"email":"MY_MAIL","name":"MY_NAME","surname":"MY_SURNAME","user_type":"customer","locale":"en","push_notifications":true,"location":{"latitude":MY_LAT,"longitude":MY_LONG},"terms_of_use_agreed":true,"marketing_consent":null,"profiling_consent":null,"advertising_consent":null,"country_id":380,"mqtt_endpoint":"a1optpg82s0ydf-ats.iot.eu-west-1.amazonaws.com","actions_on_google_pin_code":null,"created_at":"2018-04-23 07:30:49","updated_at":"2020-05-16 20:10:27"}
2020-05-17 15:08:47.849 [WARN ] [ernal.webapi.response.WebApiResponse] - Cannot get response as JosnObject
...
2020-05-17 15:08:47.864 [WARN ] [ernal.webapi.response.WebApiResponse] - Cannot get response as JosnObject
...
2020-05-17 15:08:48.073 [DEBUG] [d.internal.WorxLandroidBridgeHandler] - Start retrieving AWS certificate
2020-05-17 15:08:48.083 [WARN ] [core.thing.internal.ThingManagerImpl] - Initializing handler for thing 'worxlandroid:worxlandroidBridge:454ba88d' takes more than 5000ms.
2020-05-17 15:08:48.090 [DEBUG] [nternal.webapi.request.WebApiRequest] - URI: https://api.worxlandroid.com/api/v2/users/certificate
...
2020-05-17 15:08:48.278 [DEBUG] [nternal.webapi.request.WebApiRequest] - Worx Landroid WebApi Response: {"id":36558,"pkcs12":"***hidden for debug log***","active":false,"created_at":"2018-04-23 07:32:04","updated_at":"2018-08-18 09:55:45"}
2020-05-17 15:08:48.282 [WARN ] [ernal.webapi.response.WebApiResponse] - Cannot get response as JosnObject
2020-05-17 15:08:48.286 [ERROR] [d.internal.WorxLandroidBridgeHandler] - Connection blocked from Worx, please try again in 24h

Have you got some suggestions??
Thanks
Giovanni

Hi Giovanni,
it looks like your account is locked, which occassionally took longer than 24h
Anyway: I recommend to check that connection is working fine again before enabling binding.

a) can you please remove all things and items related to Binding as well as remove .jar from addon folder to remove the binding

b) ensure that there is NO other installation which interacts with Landroid backend like iobroker, bridge, etc.

c) wait for having your account been unlocked and you are able to use positec app to manage/stear your Mower.
Important: Not only to recieve updates and work according available schedule (as this is working even account is locked) but also to start/stop mower manually

If this going to work properly (best case for 1-2 days) you may start to install binding and to configure things and items again.

Looking forward to your update :wink:

Regards
int5749

Would it be possible to „simulate“ multiple start times per day, by automatically sending a new schedule to the server - lets say 5 minutes before It actually should start?

1 Like

Yes, should be possible. But (as there is always a but) you would need a rule for this anyway, so why not to disable all schedule or just use them to cut edge and use a Rule to start Mower at multiple times? wouldn’t this be even smarter way than “only” manipulating different start times by rule?

e.g I use timecron to start mower dependend to temp and last rain (in preperation of having a garage for Shaun so he doesn’t recognize it’s raining) etc. Check if Shaun is at home and disable all schedule close before starting irrigation to ensure shaun is not damaging irrigation system etc.

Hmm maybe you‘re right. I thought the original schedule includes some more magic like reacting on battery level, multi-zones, multiples starts in the time frame…
If I do scheduleing only via openhab I have to reimplement all this.

No, it doesn’t - just see positec app - it’s simply day, start, duration/end and edge cut.
That’s why I prefer to use rules for this.

Hi,

Thanks for the great binding, have swapped over from using Landroid Bridge, hopefully this will be less finicky!

Every now and then (well, quite regularly, actually), I’m getting the following error - it’s not a 503.

2020-05-21 10:30:45.969 [INFO ] [.worxlandroid.internal.mqtt.AWSTopic] - onMessage: {"cfg":{"id":0,"lg":"it","tm":"10:30:49","dt":"21/05/2020","sc":{"m":1,"p":0,"d":[["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0]]},"cmd":0,"mz":[0,0,0,0],"mzv":[0,0,0,0,1,1,1,1,1,1],"rd":180,"sn":"xxxxxxx"},"dat":{"mac":"xxxxxxx","fw":3.52,"bt":{"t":19.7,"v":19.20,"p":100,"nr":1283,"c":0,"m":1},"dmp":[-3.6,-1.2,324.5],"st":{"b":29547,"d":489611,"wt":32449},"ls":1,"le":0,"lz":8,"rsi":-38,"lk":0}}
2020-05-21 10:30:46.018 [INFO ] [id.internal.WorxLandroidMowerHandler] - HOME | StatusCode: 1 - Home
2020-05-21 10:30:46.019 [INFO ] [id.internal.WorxLandroidMowerHandler] - NO_ERROR | ErrorCode: 0 - No error
2020-05-21 10:34:34.598 [ERROR] [id.internal.WorxLandroidMowerHandler] - RefreshStatusRunnable 201830174205000040FC: Unknown error
org.openhab.binding.worxlandroid.internal.webapi.WebApiException: java.io.EOFException: HttpConnectionOverHTTP@4331137e::DecryptedEndPoint@6a5fab4b{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48284,OPEN,fill=-,flush=-,to=60005/0}
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApi(WebApiRequest.java:122) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApiGet(WebApiRequest.java:79) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.request.ProductItemsRequest.call(ProductItemsRequest.java:46) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.WorxLandroidWebApiImpl.retrieveUserDevices(WorxLandroidWebApiImpl.java:101) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.WorxLandroidMowerHandler$1.run(WorxLandroidMowerHandler.java:104) [bundleFile:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_252]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_252]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_252]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_252]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_252]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_252]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
Caused by: java.util.concurrent.ExecutionException: java.io.EOFException: HttpConnectionOverHTTP@4331137e::DecryptedEndPoint@6a5fab4b{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48284,OPEN,fill=-,flush=-,to=60005/0}
	at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118) ~[bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101) ~[bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:685) ~[bundleFile:9.4.20.v20190813]
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApi(WebApiRequest.java:92) ~[bundleFile:?]
	... 11 more
Caused by: java.io.EOFException: HttpConnectionOverHTTP@4331137e::DecryptedEndPoint@6a5fab4b{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48284,OPEN,fill=-,flush=-,to=60005/0}
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.earlyEOF(HttpReceiverOverHTTP.java:335) ~[?:?]
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1526) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.shutdown(HttpReceiverOverHTTP.java:209) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:147) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:73) ~[?:?]
	at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:133) ~[?:?]
	at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:154) ~[?:?]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[?:?]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:426) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:320) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:158) ~[?:?]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) ~[?:?]
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) ~[?:?]
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:367) ~[?:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782) ~[?:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:918) ~[?:?]
	... 1 more
2020-05-21 10:34:38.276 [INFO ] [orxlandroid.internal.mqtt.AWSMessage] - onSuccess
2020-05-21 10:34:38.682 [INFO ] [.worxlandroid.internal.mqtt.AWSTopic] - onMessage: {"cfg":{"id":1,"lg":"it","tm":"10:34:41","dt":"21/05/2020","sc":{"m":1,"p":0,"d":[["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0],["13:00",120,0]]},"cmd":0,"mz":[0,0,0,0],"mzv":[0,0,0,0,1,1,1,1,1,1],"rd":180,"sn":"xxxxxxx"},"dat":{"mac":"xxxxxxx","fw":3.52,"bt":{"t":19.7,"v":19.18,"p":100,"nr":1283,"c":0,"m":1},"dmp":[-3.6,-1.1,323.6],"st":{"b":29547,"d":489611,"wt":32449},"ls":1,"le":0,"lz":8,"rsi":-37,"lk":0}}
2020-05-21 10:34:38.695 [INFO ] [id.internal.WorxLandroidMowerHandler] - HOME | StatusCode: 1 - Home
2020-05-21 10:34:38.696 [INFO ] [id.internal.WorxLandroidMowerHandler] - NO_ERROR | ErrorCode: 0 - No error
2020-05-21 10:37:35.440 [ERROR] [id.internal.WorxLandroidMowerHandler] - RefreshStatusRunnable 201830174205000040FC: Unknown error
org.openhab.binding.worxlandroid.internal.webapi.WebApiException: java.io.EOFException: HttpConnectionOverHTTP@2bbf68ab::DecryptedEndPoint@6154a604{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48470,OPEN,fill=-,flush=-,to=60004/0}
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApi(WebApiRequest.java:122) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApiGet(WebApiRequest.java:79) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.request.ProductItemsRequest.call(ProductItemsRequest.java:46) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.webapi.WorxLandroidWebApiImpl.retrieveUserDevices(WorxLandroidWebApiImpl.java:101) ~[bundleFile:?]
	at org.openhab.binding.worxlandroid.internal.WorxLandroidMowerHandler$1.run(WorxLandroidMowerHandler.java:104) [bundleFile:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_252]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_252]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_252]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_252]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_252]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_252]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
Caused by: java.util.concurrent.ExecutionException: java.io.EOFException: HttpConnectionOverHTTP@2bbf68ab::DecryptedEndPoint@6154a604{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48470,OPEN,fill=-,flush=-,to=60004/0}
	at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118) ~[bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101) ~[bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:685) ~[bundleFile:9.4.20.v20190813]
	at org.openhab.binding.worxlandroid.internal.webapi.request.WebApiRequest.callWebApi(WebApiRequest.java:92) ~[bundleFile:?]
	... 11 more
Caused by: java.io.EOFException: HttpConnectionOverHTTP@2bbf68ab::DecryptedEndPoint@6154a604{api.worxlandroid.com/54.194.27.98:443<->/192.168.10.205:48470,OPEN,fill=-,flush=-,to=60004/0}
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.earlyEOF(HttpReceiverOverHTTP.java:335) ~[?:?]
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1526) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.shutdown(HttpReceiverOverHTTP.java:209) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:147) ~[?:?]
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:73) ~[?:?]
	at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:133) ~[?:?]
	at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:154) ~[?:?]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[?:?]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:426) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:320) ~[?:?]
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:158) ~[?:?]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) ~[?:?]
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) ~[?:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) ~[?:?]
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:367) ~[?:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782) ~[?:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:918) ~[?:?]
	... 1 more

So you’ll see I get a successful retrieval of the data, followed by a failure, followed by success, followed by failure.

Another point… one thing that the Landroid Bridge didn’t like was starting up if the mower was unavailable - for example switched off over winter. This caused it to use 100% CPU, so I had to disable it - being summer currently, my mower is on all the time, so restarting openHAB if I need to shouldn’t be a problem. Hopefully this won’t be an issue for this binding though come winter!!

Hi, please take a look to this post:

So please increase ‘refreshStatusInterval’ in the configuration of your mower

That’s no problem for the binding!

Thanks, I’ll give it a try :slight_smile:

@INT5749 @nibi79
When I change the resolution of schedule start minutes to e.g. 2 instead 15 and try to change them to a value <10, the binding applys 2 as 20, 3 as 30 and so on.
Any idea how to resolve it?

Beside I personally feel this being not that usefull and even official App only support 15 Min Steps.
Have you changed max. value accordingly? With 2Min it should be set to 58 while keeping 0 as min Val.

I’ve changed the maximum value, too. Values like 10, 12, 22, etc. arrive in the official app propperly.

Hmm, at least I’m able to reproduce this but sill I’m not sure if this is really required??
Nevertheless, please open an issue at https://github.com/nibi79/worxlandroid/issues
Probably it’s not possible to change this because of limitation of Landroid/Positec interface but it can be investigated

I agree, one can discuss about this requirement. I use it, to start my landroid with sunset. I’ll open an issue.

My work around now is to use a resolution of 10min and round sunset minutes to 10, 20, 30, …

Quick question: Why not simply send command start at Sunset?? You may use a Dummy Item to save time in same rule, add your preferred time for Mower to run.
than check for mower to finish charging and if there is still time (I would recommend 30 min) til end of schedule, mower would start again.

This is even smarter Schedule as with fixed schedule and depending on time required to recharge, Mower might start while there is just 5 Min left from schedule. This would lead to start mower for few min only :wink:

I need to use the schedule because this is the only way to activate edge cut. Or did I miss a possibility to start mowing instantly with edge cut?

No, we just think about how to implement, but this is not that easy, based on available interface.

Please open issue, in order to track :wink: