Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Robonect Binding #2249

Merged
merged 54 commits into from May 14, 2018
Merged

Robonect Binding #2249

merged 54 commits into from May 14, 2018

Conversation

reyem
Copy link

@reyem reyem commented May 8, 2017

Implemented features:

  • retrieving status and version information
  • change mode (AUTO, MANUAL, HOME )
  • update name
  • Define and start jobs
  • Optional authentication settings.
    tested against robonect firmware 0.9c

Open/Limitations:

  • Jobs API not fully understood and therefore most probably buggy.

@kaikreuzer kaikreuzer added the new binding If someone has started to work on a binding. For a new binding PR. label May 8, 2017
@itn3rd77
Copy link

itn3rd77 commented May 8, 2017

Great that you took the challenge to develop an openHAB2 Binding! Thanks!

As soon as authentication is working I will start testing and give you feedback.

@reyem
Copy link
Author

reyem commented May 8, 2017

@itheiss Thank you! Great! I committed the authentication bit. So when adding the thing you can optionally pass username and password as well as the poll interval. On my mower it looked so far ok, although I haven't done extensive tests yet...

@martinvw martinvw added the work in progress A PR that is not yet ready to be merged label May 27, 2017
@idznak
Copy link

idznak commented Jun 17, 2017

Hi i've just installed your Robonect Binding via copying in the addons folder.
In OH2 - PaperUI i' tried to add a new "Things" by choose Binding "Robonect Binding" but nothing was shown...
i'have a Gardena R40LI with a Robonect Hx since yesterday and OH2 since today

@reyem
Copy link
Author

reyem commented Jun 17, 2017

Hi idznak,
After chooding the binding you should be presented with a mask, where you can enter the ip etc.

Did you install OH 2.0 release or 2.1-Snapshot?
The binding is built againdt the snapshot release and I'm not sure if it runs with the stable release. So please use the latest oh 2.1-Snapshot.

Also do you have any error logs?

@idznak
Copy link

idznak commented Jun 18, 2017

Strange... now it's there. Seams like it just take some time to show up.

OpenHAB-2.1.0.004-SNAPSHOT-DSM6-syno-noarch-0.001.spk
openHAB 2.1.0 Build #951
org.openhab.binding.robonect-2.1.0-SNAPSHOT.jar

Copy link

@sjsf sjsf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pretty cool that you started this binding, can't wait for my module to arrive and trying it out!

I left a few comments inline already, although I noticed this is WIP and you are probably still refining some parts. Pretty decent state of the binding though already!

One general aspect I noticed is that all your files are lacking license headers and author comments (see Coding Guidelines - Code Style). While they feel like bloat, they are unfortunately required legally in order to stay clean wrt licensing.


<name>Robonect Binding</name>
<description>This is the binding for Robonect.</description>
<author>marco.meyer</author>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unless you really prefer to have it as an "alias", just write your name here without the dot and with capitals.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will do.

@@ -0,0 +1,13 @@
# FIXME: please substitute the xx_XX with a proper locale, ie. de_DE
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just delete this file if you don't need it

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense

</channel-groups>
<config-description>
<parameter name="host" type="text" required="true">
<label>Host</label>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please give UIs a hint on how they should render this field by adding a <context>network-address</context> here (see also Supported Contexts)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point. did not know about the context :-)

<description>The user id if authentication has been enabled on the mower</description>
</parameter>
<parameter name="password" type="text" required="false">
<label>Password</label>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<context>password</context>

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

of course will add as well

<description>The password if authentication has been enabled on the mower</description>
</parameter>
<parameter name="pollInterval" type="integer" required="false" unit="s">
<label>Polling interval.</label>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no "." here

updateStatus(ThingStatus.ONLINE);
} catch (RobonectCommunicationException rce) {
logger.info("Failed to communicate with the mower. Taking it offline.", rce);
updateState(CHANNEL_STATUS, new DecimalType(MowerStatus.OFFLINE.getStatusCode()));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see above

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will be replaced

public class ModelParser {


private Gson gson;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not.. :-)


private final Logger logger = LoggerFactory.getLogger(RobonectClient.class);

private HttpClient httpClient;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final


private HttpClient httpClient;

private ModelParser parser;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final

@@ -0,0 +1,302 @@
package org.openhab.binding.robonect.handler;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kudos for writing tests! 👍
please move these into a separate test fragment though

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usually makes my life easer and coding faster... ;-)
Will move it of course.

@reyem
Copy link
Author

reyem commented Jun 27, 2017

@SJKA Thank you a lot for the valuable early review. I had quite some learnings and hope this will finally bring me closer to an accepted PR. Let me know once your module is installed and you tried it out, if you lack any features.

@sjsf
Copy link

sjsf commented Jun 30, 2017

Argh, your the merge of the latest master into your branch was not good. Now your PR became unreadable and it looks like it grew to 27k lines of code. Can your try rebasing your branch instead (i.e. git rebase origin/master)?
It takes a few times to get your head around it, but in fact it is much easier and you will only have to solve merge conflicts once if you run into them (it simply stops there, you will get the chance to fix them and git add ... them and continue with git rebase --continue. And if you feel you are really stuck in the middle or messed it up, a git rebase --abort will bring you back from where you started.

@reyem
Copy link
Author

reyem commented Jul 1, 2017

ups, @SJKA thank you for the tips. OK, I think I managed to do the proper rebasing.... First I had to revert by using git reflog/ git reset --hard ... I hope I did not mess it up, but at least it does not show other commits than the ones from myself now on this page. So I guess I'am save now!? 😅

@reyem reyem force-pushed the 2240-robonect-binding branch 5 times, most recently from 8f10e4b to 1e79b7c Compare July 3, 2017 11:17
@martinvw
Copy link
Member

@reyem Please note that, because it's marked [WIP], I do and did not review this PR completely yet.

If it's finished and ready to review please update the title and mention me so I can remove the "Work in progress" label.

@reyem reyem changed the title [WIP] [2240] - Robonect Binding [2240] - Robonect Binding Sep 1, 2017
@reyem
Copy link
Author

reyem commented Sep 1, 2017

@martinvw, thank you for your notice and time. I did my final changes and the PR is ready for review. I think @SJKA brought me already on the right path with an early review (thank you!), and some users are already using the binding in production like @DanielMalmgren and of course myself. So from the runtime it looks stable.

@martinvw martinvw removed the work in progress A PR that is not yet ready to be merged label Sep 3, 2017
@BOFH90
Copy link

BOFH90 commented Sep 29, 2017

Hi, This Binding is great. I installed it yesterday morning and it worked perfectly. Today, my mower flaps between offline (just in openhab2) and online. But i can reach the Webinterface perfectly.
Error Message is:
2017-09-29 06:52:33.362 [ERROR] [ing.robonect.handler.RobonectHandler] - Unexpected exception. Setting thing offline
com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 2

@DanielMalmgren
Copy link

@BOFH90 Do you get any more relevant info in the log if you set the binding to bebug logging? Run the following in Karaf console:
log:set debug org.openhab.binding.robonect

@BOFH90
Copy link

BOFH90 commented Sep 29, 2017

@DanielMalmgren
The error went away after restarting openHab2. If the error re-appears i can send you the Debug-Log.
The binding still worked at the time (communication and updated items between robonect and the item).

@DanielMalmgren
Copy link

Too bad this binding didn't get it into 2.2 :-( Is it ok to give @kaikreuzer and @martinvw a little nudge?

@martinvw martinvw self-assigned this Jan 1, 2018
@reyem
Copy link
Author

reyem commented Apr 30, 2018

@thokl71

My problem is that the mower is beeping all the time so at night I have to switch it off. I created a rule that notifys me on every status change. When set to not mow I get 1 and 17 every minute, one time 1 a minute later 17. And every minute the mower beeps. I think it has something to do with the polling. Anyone else with this problem?

Although the binding polls the API, the beep is caused by the robonect module itself. I have a 105 myself running firmware 0.9e and do not have that issue. It just beeps if I change the mode from the binding. Maybe ask in the robonect forum(http://robonect.de) for advice on how to get rid of the beep...

@DanielMalmgren
Copy link

@reyem

Although the binding polls the API, the beep is caused by the robonect module itself. I have a 105 myself running firmware 0.9e and do not have that issue. It just beeps if I change the mode from the binding. Maybe ask in the robonect forum(http://robonect.de) for advice on how to get rid of the beep...

Yep, this seems to be a side effect of upgrading to the latest betas. Also noticed it yesterday (I mentioned it in the Robonect thread of the OH forum). I also threw the question out in the Robonect forum (http://robonect.de/viewtopic.php?f=9&t=365&p=12265#p12265) but haven't got any response yet. I've had to remove the AM from OH for now because of this, so I hope Fabian solves it...

reyem added 3 commits May 1, 2018 22:41
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
…tem files have to be updated!

Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
@reyem
Copy link
Author

reyem commented May 1, 2018

@martinvw @kaikreuzer @SJKA
So, finally I fixed all the review points. I have to agree that the channel-groups were overkill. After refactoring, it looks somehow cleaner. Thank you for all your valuable input. The only thing I miss now, is a final test with a real mower. As my testing raspberry just broke down, this will need a moment. But I would be very happy if you could already do a final review, such that we can hopefully close this PR soon to provide an official binding for the mowing season :-)

@all-snapshot-users: Please check the Readme.md for the new channel names. Unfortunately your item files will not work anymore with the newest SNAPSHOT. Sorry :-/

@sjsf
Copy link

sjsf commented May 2, 2018

I just updated to the latest snapshot and it's indeed a great improvement 👍
Apart from the SocketTimeoutException which went uncaught during initialize() this binding behaves pretty solid now.
Thanks for the great work!

…e version info properties if thing was offline.

Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
@itn3rd77
Copy link

itn3rd77 commented May 6, 2018

Any chance we get this merged before openHAB 2.3 code freeze?

@reyem
Copy link
Author

reyem commented May 6, 2018

from my side all requested changes are done... So @martinvw @kaikreuzer would be great if you find the time for the final review and approve. :-)

Copy link
Member

@kaikreuzer kaikreuzer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @reyem, although I have a Gardena Sileno mower, I took the time to review this binding ;-)

I'd mainly wish to do some further optimisation on the channels - please find my comments below.


<channel-type id="serialType">
<item-type>String</item-type>
<label>Robonect serial number</label>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume the serial number will never dynamically change - this should thus not be modelled as a channel, but rather added as a property.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually I already implemented it as property, but forgot the definition in the xml :-) txh


<channel-type id="versionType">
<item-type>String</item-type>
<label>Robonect version</label>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should also be a property

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dito


<channel-type id="compiledType">
<item-type>String</item-type>
<label>Robonect version</label>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should also be a property

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure


<channel-type id="commentType">
<item-type>String</item-type>
<label>Robonect firmware comment</label>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should also be a property

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as well

<channel-type id="nameType">
<item-type>String</item-type>
<label>Mower name</label>
<description>The name of the mower</description>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should also be a property

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm, here I'm unsure. Although the use case to change the name via OH is rather hypothetic. But if I want to get this via in the properties section I have to do an extra call. On the other hand handling it with the other channels via polling does not cost anything. The name is gettable and settable, thus, why not leave it as channel?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, right, as it is settable, it indeed makes sense as a channel!

<channel id="timer-status" typeId="timerStatusType"/>
<channel id="timer-next" typeId="nextTimerType"/>

<channel id="job-remote-start" typeId="remoteStartType"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that @SJKA already requested to remove these, an idea that you are not very fond of.
But this is really ugly (imho nastier than json-string-channels-on-lametric) as you are using multiple channels for parametrizing an RPC call - the channels by themselves have no value/functionality., thus they should not be channels.

May I suggest some compromise that a) makes it more user friendly for dummy users and b) keeps the full functionality available for the power user? We could:

  1. Add a switch channel type like "mow", which could have parameters "period" and "afterMode". Such a channel would make it terrifically easy to trigger the mowing manually, e.g. via a voice assistant like Alexa. With the right configuration, this might just be fine for 95% of the cases.
  2. Add an advanced "scheduleJob" string channel to which you can send the parameters of your RPC call (something like "14:30,15:30,EOD"). Once we have rule actions in place, this channel could then be easily replaced by a proper action.

Wdyt?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the switch proposal! Just have to find out on how to parameterize channels though. But I guess I will find it in the docu or other bindings...

Copy link
Member

@kaikreuzer kaikreuzer May 7, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the docu is still a bit weak on that, but check the Astro binding as an example with this config for a channel.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, done as well... Nice would be if one could configure multiple channels of theses, but I think this is now a good intermediate way until the action concept is ready.

# Robonect Binding

Robonect is a piece of hardware which has to be put into your Husqvarna, Gardena and other branded automower and makes
it accessible in your internal network. More details about the Robonect module can be found at [robonect.de](http://www.robonect.de)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a line break after every sentence.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

RobonectConfig robonectConfig = getConfigAs(RobonectConfig.class);
RobonectEndpoint endpoint = new RobonectEndpoint(robonectConfig.getHost(), robonectConfig.getUser(),
robonectConfig.getPassword());
httpClient = new HttpClient();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Jetty client uses a lot of resources, for that reason, we have a shared instance available in ESH that should be used.
Your code should be easy to adapt: Simply depend on the HttpClientFactory in your handler factory and pass the http client instance to the handler in the constructor - see this as an example.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is something @SJKA already mentions. But after mentioning that I had to customize the authentication store of the HttpClient instance, he was also skeptical if this is gonna be a good idea.

Concrete I do the following in RobonectClient to get Preemptive Authentication working

AuthenticationStore auth = httpClient.getAuthenticationStore();
        URI uri = URI.create(baseUrl);
        auth.addAuthenticationResult(new BasicResult(HttpHeader.AUTHORIZATION, uri, "Basic " + B64Code
                .encode(endpoint.getUser() + ":" + endpoint.getPassword(), StandardCharsets.ISO_8859_1)));

Do you think this will not have a side effect on others using this client? theoretically the authorizationResult is stored together with the URL, thus it could work..

During 2.2 development this was requrired, as the version of jetty client was quite old. Did jetty client version change since 2.2.0?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, Jetty is still 9.3.15(+) - so yes, I agree that it is probably safer to keep a separate client instance.
Nonetheless, you might want to retrieve it from HttpClientFactory.createHttpClient() as this will use a smaller thread pool (that can be configured for the system) and named threads, so that it is easier to find them in debugging sessions.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, refactored to use factory

httpClient.start();
robonectClient = new RobonectClient(httpClient, endpoint);
} catch (Exception e) {
logger.error("Exception when trying to initialize", e);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this here an irrecoverable situation with a failing handle instantiation? In that case, don't set the thing status, but throw an exeption from this method.
If it is merely a "COMMUNICATION_ERROR" and your polling runnable will retry, reduce the logging to debug.

And if it might be the one or the other, better catch more specialized exceptions as catching Exception is anyhow not adviced.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's the httpClient.start() which may throw an exception here... I guess with the shared httpClient instance this would disappear as well, right. Just still the question if PreEmptive Authentication counts as "specific configuration requirements" and therefore I cannot use it. In this case I understand I would throw the exception. Can I wrap it into a RuntimeException?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, wrapping it in a RuntimeException should be fine in this case (as the Exception from Jetty is anyhow very unspecific).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if it's related here, but every time the binding tries to poll my mower and doesn't succeed I get an error in the log, "Fatal transport error: java.util.concurrent.TimeoutException". Not being able to reach it should be considered quite normal, classing it as an error doesn't seem right.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds like a good example why more finegrained exceptions should be caught and handled differently - a TimeoutException should indeed set the Thing to OFFLINE-COMMUNICATION_ERROR and do a periodic retry.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not too sure about that @kaikreuzer . There is a setting for offline timeout at Thing level, described by @reyem as "The maximum time the mower may be offline before the offline trigger is triggered." The mower being temporarily outside of range is normal and it's not an error unless it's not still unreachable after this timeout.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually this will not happen anymore. This was just possible before, as I was calling refreshInfo already the first time here in a previous version in the binding. But the refactoring removed this. So that should be ok.. now

}
try {
if (httpClient != null) {
httpClient.stop();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will obviously have to be removed when using the shared instance.

reyem added 7 commits May 7, 2018 23:24
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
* use HttpClientFactory to create HttpClient
* extracted trigger channel from channels table

Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
* documented job

Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
@reyem
Copy link
Author

reyem commented May 11, 2018

@kaikreuzer ok, I think now the binding is in a quite good shape. Thank you very much for the extremely valuable feedback. That made the binding a bit slimmer and better 👍

Copy link
Member

@kaikreuzer kaikreuzer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again @reyem for your quick turn around and for the fruitful discussions!

After refreshing my browser 100 times, Github eventually let me view and merge the PR again - so let's go ahead, before the unicorns take over this PR! 🤣

@kaikreuzer kaikreuzer merged commit 042baf2 into openhab:master May 14, 2018
@kaikreuzer kaikreuzer changed the title [2240] - Robonect Binding Robonect Binding May 14, 2018
@reyem
Copy link
Author

reyem commented May 15, 2018

🎉 no 🦄 took over! 😆

Many thanks to my first time user @DanielMalmgren for the reliable reports and eager testing.
Also thank you @kaikreuzer, @martinvw, @SJKA and @Confectrician for your great reviews. They helped a lot to get the binding to its first merge state and also gave me the opportunity to learn useful things for further OH contributions or even other projects!

@DanielMalmgren
Copy link

Thanks for good work @reyem ! I'm noticing that the review only took a little more than a year 🤣

Anyway, what happens now? Does this mean the binding will appear as downloadable in paperui before 2.3 release?

@openhab-bot
Copy link
Collaborator

openhab-bot commented May 15, 2018 via email

@reyem
Copy link
Author

reyem commented May 15, 2018

Does this mean the binding will appear as downloadable in paperui before 2.3 release?

Yes, it is available in the 2.3.0-SNAPSHOT like all other bindings and will most likely make it in the final 2.3.0 Release.

Anyway, what happens now?

Being part of the official bistro does not mean the effort stops. Next is extending the binding with features of the new and existing APIs of Robonect. On the TODO List is

  • Timer Support (at least enable & disable them)
  • Find concepts to support push mode or mqtt integration to get rid of the polling or at least make it optional
  • Channel for resetting errors
  • Job Actions, once the OH/ESH concepts for actions in the rule engine is ready
  • .. you name it

The good thing now is,

Anybody might create a PR and the PRs are likely much smaller with higher likelihood to get in in shorter time.

But please from now on let's discuss enhancements, future improvement whishes in the community form. The currently open thread for this is: https://community.openhab.org/t/robonect-binding-automower-wlan-module/27609/51

Thx for all your help

@martinvw martinvw added this to the 2.3 milestone May 25, 2018
hww3 pushed a commit to hww3/openhab2-addons that referenced this pull request Jul 4, 2018
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
divyachauhan25 pushed a commit to divyachauhan25/openhab2-addons that referenced this pull request Jul 6, 2018
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
koa pushed a commit to koa/openhab2-addons that referenced this pull request Oct 28, 2018
Signed-off-by: Marco Meyer <marco.g.meyer@gmail.com> (github: reyem)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
new binding If someone has started to work on a binding. For a new binding PR.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet