Announcing OpenWeatherMap binding for Eclipse SmartHome / openHAB

You are right…
I’m running on 2.3 and i used the newest version.

Thanks you for the fast help.
And i really like the Binding.
It’s an good alternative to the weatherunderground-binding.

I must be missing something… I am running OH2.3 … How do I install this OWM binding ?

1 Like

I got the JAR from here

Then i copied it to following directory on my PI:

/usr/share/openhab2/addons/

For me it worked without restart/reboot.

So, I’m on a Synology OpenHab2.3.0 and I used PaperUI to install the OpenWeatherMap market:binding-4126092 - 1.0. Now I get the same ‘Cannot find channel type: system:outdoor-temperature’ errors as Vradatta reports.
It used to work fine, but I’ve updated the Synology version (not the OpenHab version I believe) and had to reinstall everything (no backups, lesson learned there) which broke OWM.
Now I’ve tried to make something of your comment:

Have a look here for two versions based on different requirements.

But I believe you’re trying to direct us to the different Jar files found here

In any case, I’ve added the 2.3 jar to the addons directory, but now the log reports the following:

2018-09-30 10:09:50.317 [WARN ] [org.apache.felix.fileinstall        ] - Error while starting bundle: file:/volume1/SmartHome/openHAB/addons/org.eclipse.smarthome.binding.openweathermap-0.10.0-SNAPSHOT.jar
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.smarthome.binding.openweathermap [231]
  Another singleton bundle selected: osgi.identity; type="osgi.bundle"; version:Version="0.10.0.201808271132"; osgi.identity="org.eclipse.smarthome.binding.openweathermap"; singleton:="true"

Any suggestions on how to proceed?

Yes, it looks like the link changed due to a rebate of my code. Thanks for the update.

The log message tells you that a second version of the OWM binding is installed. Did you remove the market place version before you put the jar file into your addons folder manually?

Apparently when I threw the jar in the addons directory, OH got very confused. I had to jump through a lot of hoops to get the bindings and their Things removed. (I had to completely remove the jar, restart OH and then remove the Things. The things would still show up as ‘uninitialized’ but in the end I ignored that).
After removing I put the jar back and I setup the Things. When they were configured it all worked again. I had some trouble with scripts, but I managed to fix that as well.
Well, thank you for supplying us with the jar.

I know what you mean. Have some hassles from time to time too. Hopefully the binding will be finalized and merged soon. Afterwards it will be easier to handle it from a user perspective. I am happy that my work is appreciated by the community - which leads to my personal satisfaction.

Thank you all for your feedback and testing. :clap:

2 Likes

First of all thank you very much for that binding. It´s working right out of the box.

I´ve just one question: I´m running OH 2.3 and I´ve installed the old version. When using the examples made by kugelsicha, there is something wrong with the winddirection. When I use this item

Number:Dimensionless   	owmCurrentWindDirection     "Aktuelle Windrichtung [SCALE(wind.scale):%s]"	<wind>          (gOwmCurrent) {channel="openweathermap:weather:api:local:current#wind-direction"}

I get:

owmCurrentWindDirection changed from 3.839724354387525069232119690674947 to 3.665191429188092111539750613826088

or

owmCurrentWindDirection changed from 2.967059728390360280770274306430641 to 2.792526803190927323077905229581780

Using wind.scale, the wind is alwasy coming from the north (that´s not untypical here but in this case it was not true).

When using

Number:Angle   	owmCurrentWindDirection     "Aktuelle Windrichtung [SCALE(wind.scale):%s]"	<wind>          (gOwmCurrent) {channel="openweathermap:weather:api:local:current#wind-direction"}

I get the correct direction, for example:

owmCurrentWindDirection changed from NULL to 200.0 °

But then I get

Could not transform '200.0 °' with the file 'wind.scale' : Scale can only be used with numeric inputs

Where did I go wrong? Thanks a lot.

Nowhere
It’s another unintended consequence of the Units Of Measurement system
Even though the value is 200, it is represented as 200.0 ° and for the SCALE transform that’s not a number…

So I use a String item, a rule and a javascript transform:

String               WindDirection2             "Wind direction [%s]"                  <winddirection>                         // Set in weather.rules
rule "Windrose"
when
    Item WindDirection changed
then
    var direction = WindDirection.state as Number
    var windrose = transform("JS", "windrose.js", direction.toString)
    WindDirection2.postUpdate(windrose)
end

Transform

/**
 * Windrose
 *
 * Based loosely on the code by:
 * @author rogeriopvl <http://github.com/rogeriopvl>
 * @license MIT
 *
 * the depth parameter will determine the definition of the windrose
 * depth = 0 : 4 points (N, E, S, W)
 * depth = 1 : 8 points (eg: N, SW, NE...)
 * depth = 2 : 16 points (eg: N, SSW, NNE...)
 * depth = 3 : 32 points (eg: N, NbE, Sbw, NNE...)
 * depth = 4 : 64 points (Unused)
 * depth = 5 : 128 points (eg: N¾E, NEbN½N...)
 *
 * the valueReturned parameter will affect the value returned abbreviation or full sentence:
 * valueReturned = symbol : "SE"
 * valueReturned = name: "South East"
 */


(function(i) {
    var DEPTH_AREA = [ 90, 45, 22.5, 11.25, 5.625, 2.8125 ];
    var COMPASS_POINTS = [
        { symbol: 'N', name: 'North', depth: 0 },
        { symbol: 'N¼E', name: 'North quarter East', depth: 5 },
        { symbol: 'N½E', name: 'North half East', depth: 4 },
        { symbol: 'N¾E', name: 'North three quarters East', depth: 5 },
        { symbol: 'NbE', name: 'North by East', depth: 3 },
        { symbol: 'NbE¼E', name: 'North by East quarter East', depth: 5 },
        { symbol: 'NbE½E', name: 'North by East half East', depth: 4 },
        { symbol: 'NbE¾E', name: 'North by East three quarters East', depth: 5 },
        { symbol: 'NNE', name: 'North North East', depth: 2 },
        { symbol: 'NNE¼E', name: 'North North East quarter East', depth: 5 },
        { symbol: 'NNE½E', name: 'North North East half East', depth: 4 },
        { symbol: 'NNE¾E', name: 'North North East three quarters East', depth: 5 },
        { symbol: 'NEbN', name: 'North East by North', depth: 3 },
        { symbol: 'NEbN¾N', name: 'North East by North three quarters North', depth: 5 },
        { symbol: 'NEbN½N', name: 'North East ny North half North', depth: 4 },
        { symbol: 'NEbN¼N', name: 'North East by North quarter North', depth: 5 },
        { symbol: 'NE', name: 'North East', depth: 1 },
        { symbol: 'NE¼E', name: 'North East quarter East', depth: 5 },
        { symbol: 'NE½E', name: 'North East half East', depth: 4 },
        { symbol: 'NE¾E', name: 'North East three quarters East', depth: 5 },
        { symbol: 'NEbE', name: 'North East by East', depth: 3 },
        { symbol: 'NEbE¼E', name: 'North East by East quarter East', depth: 5 },
        { symbol: 'NEbE½E', name: 'North East by East half East', depth: 4 },
        { symbol: 'NEbE¾E', name: 'North East by East three quarters East', depth: 5 },
        { symbol: 'ENE', name: 'East North East', depth: 2 },
        { symbol: 'ENE¼E', name: 'East North East quarter East', depth: 5 },
        { symbol: 'ENE½E', name: 'East North East half East', depth: 4 },
        { symbol: 'ENE¾E', name: 'East North East three quarter East', depth: 5 },
        { symbol: 'EbN', name: 'East by North', depth: 3 },
        { symbol: 'E¾N', name: 'East three quarters North', depth: 5 },
        { symbol: 'E½N', name: 'East half North', depth: 4 },
        { symbol: 'E¼N', name: 'East quarter North', depth: 5 },
        { symbol: 'E', name: 'East', depth: 0 },
        { symbol: 'E¼S', name: 'East quarter South', depth: 5 },
        { symbol: 'E½S', name: 'East half South', depth: 4 },
        { symbol: 'E¾S', name: 'East three quarters South', depth: 5 },
        { symbol: 'EbS', name: 'East by South', depth: 3 },
        { symbol: 'ESE¾E', name: 'East South East three quarters East', depth: 5 },
        { symbol: 'ESE½E', name: 'East South East half East', depth: 4 },
        { symbol: 'ESE¼E', name: 'East South East quarter East', depth: 5 },
        { symbol: 'ESE', name: 'East South East', depth: 2 },
        { symbol: 'SEbE¾E', name: 'South East by East three quarters East', depth: 5 },
        { symbol: 'SEbE½E', name: 'South East by East half East', depth: 4 },
        { symbol: 'SEbE¼E', name: 'South East by East quarter East', depth: 5 },
        { symbol: 'SEbE', name: 'South East by East', depth: 3 },
        { symbol: 'SE¾E', name: 'South East three quarters East', depth: 5 },
        { symbol: 'SE½E', name: 'South East half East', depth: 4 },
        { symbol: 'SE¼E', name: 'South East quarter East', depth: 5 },
        { symbol: 'SE', name: 'South East', depth: 1 },
        { symbol: 'SE¼S', name: 'South East quarter South', depth: 5 },
        { symbol: 'SE½S', name: 'South East half South', depth: 4 },
        { symbol: 'SE¾S', name: 'South East three quartersSouth', depth: 5 },
        { symbol: 'SEbS', name: 'South East by South', depth: 3 },
        { symbol: 'SSE¾E', name: 'South South East three quarters East', depth: 5 },
        { symbol: 'SSE½E', name: 'South South East half East', depth: 4 },
        { symbol: 'SSE¼E', name: 'South South East quarter East', depth: 5 },
        { symbol: 'SSE', name: 'South South East', depth: 2 },
        { symbol: 'SbE¾E', name: 'South by East three quarters East', depth: 5 },
        { symbol: 'SbE½E', name: 'South by East half East', depth: 4 },
        { symbol: 'SbE¼E', name: 'South by East quarter East', depth: 5 },
        { symbol: 'SbE', name: 'South by East', depth: 3 },
        { symbol: 'S¾E', name: 'South three quarters East', depth: 5 },
        { symbol: 'S½E', name: 'South half East', depth: 4 },
        { symbol: 'S¼E', name: 'South quarter East', depth: 5 },
        { symbol: 'S', name: 'South', depth: 0 },
        { symbol: 'S¼W', name: 'South quarter West', depth: 5 },
        { symbol: 'S½W', name: 'South half West', depth: 4 },
        { symbol: 'S¾W', name: 'South three quarters West', depth: 5 },
        { symbol: 'SbW', name: 'South by West', depth: 3 },
        { symbol: 'SbW¼W', name: 'South by West quarter West', depth: 5 },
        { symbol: 'SbW½W', name: 'South by West half West', depth: 4 },
        { symbol: 'SbW¾W', name: 'South by West three quarters West', depth: 5 },
        { symbol: 'SSW', name: 'South South West', depth: 2 },
        { symbol: 'SSW¼W', name: 'South South West quarter West', depth: 5 },
        { symbol: 'SSW½W', name: 'South South West half West', depth: 4 },
        { symbol: 'SSW¾W', name: 'South South West three quarters West', depth: 5 },
        { symbol: 'SWbS', name: 'South West by South', depth: 3 },
        { symbol: 'SW¾S', name: 'South West three quarters South', depth: 5 },
        { symbol: 'SW½S', name: 'South West half South', depth: 4 },
        { symbol: 'SW¼S', name: 'South West quarter South', depth: 5 },
        { symbol: 'SW', name: 'South West', depth: 1 },
        { symbol: 'SW¼W', name: 'South West quarter West', depth: 5 },
        { symbol: 'SW½W', name: 'South West half West', depth: 4 },
        { symbol: 'SW¾W', name: 'South West three quarters West', depth: 5 },
        { symbol: 'SWbW', name: 'South West by West', depth: 3 },
        { symbol: 'SWbW¼W', name: 'South West by West quarter West', depth: 5 },
        { symbol: 'SWbW½W', name: 'South West by West half West', depth: 4 },
        { symbol: 'SWbW¾W', name: 'South West by West three quarters West', depth: 5 },
        { symbol: 'WSW', name: 'West South West', depth: 2 },
        { symbol: 'WSW¼W', name: 'West South West quarter West', depth: 5 },
        { symbol: 'WSW½W', name: 'West South West half West', depth: 4 },
        { symbol: 'WSW¾W', name: 'West South West three quarters West', depth: 5 },
        { symbol: 'WbS', name: 'West by South', depth: 3 },
        { symbol: 'W¾S', name: 'West three quarters South', depth: 5 },
        { symbol: 'W½S', name: 'West half South', depth: 4 },
        { symbol: 'W¼S', name: 'West quarter South', depth: 5 },
        { symbol: 'W', name: 'West', depth: 0 },
        { symbol: 'W¼N', name: 'West quarter North', depth: 5 },
        { symbol: 'W½N', name: 'West half North', depth: 4 },
        { symbol: 'W¾N', name: 'West three quarters North', depth: 5 },
        { symbol: 'WbN', name: 'West by North', depth: 3 },
        { symbol: 'WNW¾W', name: 'West North West three quarters West', depth: 5 },
        { symbol: 'WNW½W', name: 'West North West half West', depth: 4 },
        { symbol: 'WNW¼W', name: 'West North West quarter West', depth: 5 },
        { symbol: 'WNW', name: 'West North West', depth: 2 },
        { symbol: 'NWbW¾W', name: 'North West by West three quarters West', depth: 5 },
        { symbol: 'NWbW½W', name: 'North West by West half West', depth: 4 },
        { symbol: 'NWbW¼W', name: 'North West by West quarter West', depth: 5 },
        { symbol: 'NWbW', name: 'North West by West', depth: 3 },
        { symbol: 'NW¾W', name: 'North West three quarters West', depth: 5 },
        { symbol: 'NW½W', name: 'North West half West', depth: 4 },
        { symbol: 'NW¼W', name: 'North West quarter West', depth: 5 },
        { symbol: 'NW', name: 'North West', depth: 1 },
        { symbol: 'NW¼N', name: 'North West quarter North', depth: 5 },
        { symbol: 'NW½N', name: 'North West half North', depth: 4 },
        { symbol: 'NW¾N', name: 'North West three quarters North', depth: 5 },
        { symbol: 'NWbN', name: 'North West by North', depth: 3 },
        { symbol: 'NNW¾W', name: 'North North West three quarters West', depth: 5 },
        { symbol: 'NNW½W', name: 'North North West half West', depth: 4 },
        { symbol: 'NNW¼W', name: 'North North West quarter West', depth: 5 },
        { symbol: 'NNW', name: 'North North West', depth: 2 },
        { symbol: 'NbW¾W', name: 'North by West three quarters West', depth: 5 },
        { symbol: 'NbW½W', name: 'North by West half West', depth: 4 },
        { symbol: 'NbW¼W', name: 'North by West quarter West', depth: 5 },
        { symbol: 'NbW', name: 'North by West', depth: 3 },
        { symbol: 'N¾W', name: 'North three quarters West', depth: 5 },
        { symbol: 'N½W', name: 'North half West', depth: 4 },
        { symbol: 'N¼W', name: 'North quarter West', depth: 5 }
    ];
    var depth = 5; //Enter desired depth here
    var valueReturned = "symbol"; //Enter returned value here (symbol or name)
    var degrees = parseInt(i);
    var step = DEPTH_AREA[depth];
    var response = "";

    var compass_points = COMPASS_POINTS.filter(function (pt) {
        return pt.depth <= depth;
    });

    degrees = degrees + (step / 2);
    if (degrees > 360) (degrees = degrees - 360);

    var point = Math.floor(degrees / step);

    response = compass_points[point][valueReturned]

    return response;
}) (input)

Hi Leif,

I am not sure what is the exact reason why your examples are not working. I use it in this way - which works quite nice:

Number:Angle owmWindDegree "Windrichtung [%d %unit%]" <wind> { channel="openweathermap:weather:api:local:current#wind-direction" }

In the sitemap:

Frame label="Windrichtung" {
    Text item=owmWindDegree label="Windrichtung [SCALE(windDirection.scale):%s]"
    Text item=owmWindDegree
}

Why? I do not think we need an item containing the transformed value. The transformation is important for us in the moment we want to find out the current wind direction and thus I apply it only in the sitemap.

That´s it. I´ve moved the transformation from the item to the sitemap. Now it´s working really well. Thank´s a lot.

if anyone needs this to translate in his own language, here you go:

String	owmCurrentCondition		"Weather Conditions [MAP(conditions.map):%s]"	<sun_clouds>	{ channel="openweathermap:weather:api:local:current#condition-id" }

conditions.map

200=thunderstorm with light rain
201=thunderstorm with rain
202=thunderstorm with heavy rain
210=light thunderstorm
211=thunderstorm
212=heavy thunderstorm
221=ragged thunderstorm
230=thunderstorm with light drizzle
231=thunderstorm with drizzle
232=thunderstorm with heavy drizzle
300=light intensity drizzle
301=drizzle
302=heavy intensity drizzle
310=light intensity drizzle rain
311=drizzle rain
312=heavy intensity drizzle rain
313=shower rain and drizzle
314=heavy shower rain and drizzle
321=shower drizzle
500=light rain
501=moderate rain
502=heavy intensity rain
503=very heavy rain
504=extreme rain
511=freezing rain
520=light intensity shower rain
521=shower rain
522=heavy intensity shower rain
531=ragged shower rain
600=light snow
601=snow
602=heavy snow
611=sleet
612=shower sleet
615=light rain and snow
616=rain and snow
620=light shower snow
621=shower snow
622=heavy shower snow
701=mist
711=smoke
721=haze
731=sand, dust whirls
741=fog
751=sand
761=dust
762=volcanic ash
771=squalls
781=tornado
800=clear sky
801=few clouds
802=scattered clouds
803=broken clouds
804=overcast clouds

conditions_nl.map

200=onweer met lichte regen
201=onweer met regen
202=onweer met zware regenval
210=lichte onweersbui
211=onweer
212=zwaar onweer
221=haveloze onweersbui
230=onweer met lichte motregen
231=onweer met motregen
232=onweer met zware motregen
300=lichtintensiteit motregen
301=motregen
302=zware motregen
310=lichte regenval
311=motregen
312=zware regenval
313=regen en motregen
314=zware regenbuien en motregen
321=motregen
500=lichte regen
501=matige regen
502=regen met hevige intensiteit
503=zeer zware regen
504=extreme regen
511=ijzel
520=regenbui met lichte intensiteit
521=regen
522=zware regenbuien
531=rafelige regen in de sneeuw
600=lichte sneeuw
601=sneeuw
602=zware sneeuwval
611=natte sneeuw
612=regen-ijzel
615=lichte regen en sneeuw
616=regen en sneeuw
620=lichte natte sneeuw
621=natte sneeuw
622=zware natte sneeuw
701=mist
711=rook
721=nevel
731=zand, stof wervelt
741=mist
751=zand
761=stof
762=vulkaanas
771=rukwinden
781=tornado
800=heldere lucht
801=weinig bewolking
802=losse wolken
803=gebroken wolken
804=bewolkte wolken
1 Like

Is this still under development or can it be used safely in long run environments ? As I can only find testversions like here: https://github.com/cweitkamp/smarthome/commit/b649ac809cdddb61dcd86f3af04db48c1ec81569#commitcomment-30297201

Dear Raymond,

Yes, it is still in development. I am working on the final version this week.

Breaking news.

First code review has passed and with it a great redesign of things for current weather and forecast was introduced. Unfortunately the current structure of the things had to be changed. Now they are combined into a new single thing. Good news are: Now you are able to configure the number of forecast hours and / or days on your own - no limitations - except the API bound restrictions.

You can download a new Testversion here (requires ESH build 306 or higher and / or OH2.4.M5 milestone 5 / or OH2.4 build 1405 or higher). Older versions (e.g. for OH2.3 release) are not supported anymore. I have updated the marketplace version too.

Major changes:

  • Attention: Added single thing weather-and-forecast for weather and forecast - combines all three previous available things
    Fair warning: The things weather, hourly-forecast and daily-forecast will be removed in the final version
  • Added dynamic number of hours / days for forecast - you now can change the number of forcasted hours / days in the thing configuration
    – hourly forecast is now supported from 3h up to 120h instead of 24h (24h are default)
    – daily forecast is now supported from 0 days up to 16 days instead of 5 days (5 days are default)
  • Finalized documentation
  • Finalized German translations - more translations in other languages are welcome; please PM me if you like to help
  • Introduced dedicated channel-types for forcasted data and removed icon-id channel
  • Removed discovery of the OpenWeatherMap Account - you now have to add it manually
  • Code improvements and stability

Thanks you very much for feedback.

Best,

Christoph

3 Likes

Hi Christoph.
I can’t get the binding running. Yesterday i moved to milestone M5 and nothing changed. Before i used the stable version.
Do i need the things.file or can i configure it by paper UI.
If i use your thingdemo.file i get the error missing EOT at : line1,22.
Can you help me,
thanks and greetings,
Markus

Hi Markus,

What a pitty. The example for demo.things from the latest documentation is broken. bridge has to start with a capital letter: Bridge. Thank you very much for reporting this.

Here is a fixed version:

Bridge openweathermap:weather-api:api "OpenWeatherMap Account" [apikey="AAA", refreshInterval=30, language="de"] {
    Thing weather-and-forecast local "Local Weather And Forecast" [location="XXX,YYY", forecastHours=0, forecastDays=7]
    Thing weather-and-forecast miami "Weather And Forecast In Miami" [location="25.782403,-80.264563", forecastHours=24, forecastDays=0]
}
1 Like

@cweitkamp
how long do I wait till I some my site up weather working?

2018-11-03 00:06:09.290 [WARN ] [.weather.internal.bus.WeatherBinding] - Unable to find any configuration settings for weather binding. Check openhab.cfg.

2018-11-03 00:06:09.294 [ERROR] [org.apache.felix.configadmin        ] - [org.osgi.service.cm.ManagedService, org.osgi.service.event.EventHandler, id=401, bundle=242/mvn:org.openhab.binding/org.openhab.binding.weather/1.13.0-SNAPSHOT]: Updating property weather of configuration org.openhab.weather caused a problem: Unable to find any configuration settings for weather binding. Check openhab.cfg.

org.osgi.service.cm.ConfigurationException: weather : Unable to find any configuration settings for weather binding. Check openhab.cfg.

	at org.openhab.binding.weather.internal.bus.WeatherBinding.updated(WeatherBinding.java:76) ~[?:?]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker$1.run(ManagedServiceTracker.java:177) ~[9:org.apache.felix.configadmin:1.9.4]

	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:173) ~[9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.provide(ConfigurationManager.java:1102) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1058) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.UpdateThread$1.run(UpdateThread.java:126) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.UpdateThread$1.run(UpdateThread.java:123) [9:org.apache.felix.configadmin:1.9.4]

	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]

	at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:122) [9:org.apache.felix.configadmin:1.9.4]

	at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:105) [9:org.apache.felix.configadmin:1.9.4]

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

==> /var/log/openhab2/events.log <==

2018-11-03 00:06:09.422 [thome.event.ExtensionEvent] - Extension 'binding-weather1' has been installed.```

Hi @adtwomey,

After installing the binding you have to create a bridge thing and put your credentials of your OWM account into its configuration. Afterwards the weather and forecast thing will be discovered automatically after a few seconds.

The log you have posted here is not related to the OWM binding. It shows messages for the OH1 weather binding.

So it’s not supported on a stable release of OH? I’ll wait for OH2.4 to become stable. :frowning: