Convert Wind Direction (degrees) to Compass Points

:hugs: So I was NOT understanding the code.

@Udo_Hartmann and @zobelhelas you’re indeed right, I do like the look of this solution best though. Thanks guys.

EDIT: it doesn’t work as expected though.

My amended version using the actual compass points even though my readings are integers, this still holds true. Yes I know if we get down to the final condition it could simply be an ‘else’ statement, and that all of the conditions could be one liners, but to me it’s more readable in this form.

(function(i) {
        if(i >= 348.75 || i < 11.25){
                return +i + ". -=- N";
        } else if (i >= 11.25 && i < 33.75) {
                return +i + ". -=- NNE";
        } else if (i >= 33.75 && i < 56.25) {
                return +i + ". -=- NE";
        } else if (i >= 56.25 && i < 78.75) {
                return +i + ". -=- ENE";
        } else if (i >= 78.25 && i < 101.25) {
                return +i + ". -=- E";
        } else if (i >= 101.25 && i < 123.75) {
                return +i + ". -=- ESE";
        } else if (i >= 123.75 && i < 146.25) {
                return +i + ". -=- SE";
        } else if (i >= 146.25 && i < 168.75) {
                return +i + ". -=- SSE";
        } else if (i >= 168.75 && i < 191.25) {
                return +i + ". -=- S";
        } else if (i >= 191.25 && i < 213.75) {
                return +i + ". -=- SSW";
        } else if (i >= 213.75 && i < 236.25) {
                return +i + ". -=- SW";
        } else if (i >= 236.25 && i < 258.75) {
                return +i + ". -=- WSW";
        } else if (i >= 258.75 && i < 281.25) {
                return +i + ". -=- W";
        } else if (i >= 281.25 && i < 303.75) {
                return +i + ". -=- WNW";
        } else if (i >= 303.75 && i < 326.25) {
                return +i + ". -=- NW";
        } else if (i >= 326.25 && i < 348.75) {
                return +i + ". -=- NNW";
        }
})(input)

Hi all,

Just a slight pointer to the Scale Transformation which does the math for you.

Have fun.

2 Likes

Brilliant, thanks for that @cweitkamp. I was looking for a way to do that with a normal transform, but as far as I understood it, it only allows a single value either side of the =. Didn’t know about the Scale Transformation, thanks for bringing it to my attention. I’ll stick to my script for now though so I can return both the angular direction and the compass point together. But I’ll definitely use the scale transform once I’m happy with the values my weather station provides.

I think the second line should be

var j = (…

instead of

val j = (…

at least that way it works for me :slight_smile:

My guess is you do not know the difference between a val (value) and a var (variable).

1 Like

For shure I don’t know the to much about the JS Implementation within OH rules, but my installation complains about val but not about var.
var: object; val: method

Perhaps you could show us the error message.

Happy to find this. However, having a problem with the item definitions…

I am not sure how this code works with item definitions, but it breaks my sitemap (where only frame names are shown, no items). If I remove it, the value is shown as null.

I’ve tried with and without the padding spaces, confirmed javascript transformation, confirmed string item type… what am I missing?

Oh, maybe I need to wait for an item update? It should have come through by now…

Take the <----> and <> parts out and replace with spaces, they’re tabs, that was me copying from my editor which was set to show tabs which then became part of that copy.

EDIT: I’ve now cleaned up that copy problem in the original post.

cool - will try, thanks!

Strange, it doesn’t seem to be returning a valid result:

Mqtt_WeatherStation_WindDir changed from NULL to 1969-12-31T19:04:22.000-0500

Will have to look at later, but if you have any ideas…

got it. My item didn’t like being changed to a number to string.

Make sure you have the correct transformation services enabled, I can’t remember which one is needed for this, but here’s my transform setup, it’s in the ‘OPENHAB_CFG"/openhab2/services/addons.cfg’ file.

transformation = map,jsonpath,exec,javascript,regex,scale,xpath,xslt

It is much easier to just use the Scale transformation…

1 Like

That’s what I use since April last year now.

windDir.scale

[0..11.25] = N
]11.25..33.75] = NNE
]33.75..56.25] = NE
]56.25..78.75] = ENE
]78.75..101.25] = E
]101.25..123.75] = ESE
]123.75..146.25] = SE
]146.25..168.75] = SSE
]168.75..191.25] = S
]191.25..213.75] = SSW
]213.75..236.25] = SW
]236.25..258.75] = WSW
]258.75..281.25] = W
]281.25..303.75] = WNW
]303.75..326.25] = NW
]326.25..348.75] = NNW
]348.75..360] = N
[..] = Unknown Value
NaN="N/A"

Items file

String windDir          "Wind Direction [SCALE(windDir.scale):%s]"      <wind>          (Home,Weather)  ["Data"]                {channel="mqtt:topic:mosquitto2:weather:windDir"}
String windGustDir      "Wind Gust Direction [SCALE(windDir.scale):%s]" <wind>          (Home,Weather)  ["Data"]                {channel="mqtt:topic:mosquitto2:weather:windGustDir"

Dear All,

for OH3 user I create my first widget for personal weather station
You can find it here

you can use also with other weather binding, but wind direction must be in degrees…
Any improvements and comment are welocme

I just came across the need to do this.
My version (in jruby)

# Given the direction in degrees, return the direction abbreviation
def direction_name(degree)
  degree = (degree + 11.25) % 360
  index = (degree.to_f / 22.5).floor
  %w[N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW][index]
end