/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.weather.internal.utils;
import org.openhab.binding.weather.internal.common.Unit;
/**
* Utility class for different unit conversions.
*
* @author Gerhard Riegler
* @since 1.6.0
*/
public class UnitUtils {
/**
* Converts celsius to fahrenheit.
*/
public static Double celsiusToFahrenheit(Double celsius) {
if (celsius == null) {
return null;
}
return celsius * 1.8 + 32.0;
}
/**
* Converts millimeters to inches.
*/
public static Double millimetersToInches(Double millimeters) {
if (millimeters == null) {
return null;
}
return millimeters * 0.0393700787;
}
/**
* Converts kilometers per hour to miles per hour.
*/
public static Double kmhToMph(Double kmh) {
if (kmh == null) {
return null;
}
return kmh * 0.621371192;
}
/**
* Converts kilometers per hour to knots.
*/
public static Double kmhToKnots(Double kmh) {
if (kmh == null) {
return null;
}
return kmh * 0.539956803;
}
/**
* Converts kilometers per hour to meter per seconds.
*/
public static Double kmhToMps(Double kmh) {
if (kmh == null) {
return null;
}
return kmh * 0.277777778;
}
/**
* Converts meter per seconds to kilometers per hour.
*/
public static Double mpsToKmh(Double mps) {
if (mps == null) {
return null;
}
return mps / 0.277777778;
}
/**
* Converts kilometers per hour to beaufort.
*/
public static Double kmhToBeaufort(Double kmh) {
if (kmh == null) {
return null;
}
return new Double(Math.round(Math.pow(kmh / 3.01, 0.666666666)));
}
/**
* Converts millibar to inches.
*/
public static Double millibarToInches(Double millibar) {
if (millibar == null) {
return null;
}
return millibar * 0.0295299830714;
}
/**
* Converts meter to feet.
*/
public static Double meterToFeet(Double meter) {
if (meter == null) {
return null;
}
return meter * 3.2808399;
}
/**
* Converts feet to meter.
*/
public static Double feetToMeter(Double feet) {
if (feet == null) {
return null;
}
return feet / 3.2808399;
}
/**
* Converts centimeter to millimeter.
*/
public static Double centimeterToMillimeter(Double centimeter) {
if (centimeter == null) {
return null;
}
return centimeter * 100;
}
/**
* Calculates the humidex (feels like temperature) from temperature and
* humidity.
*/
public static double getHumidex(double temp, int humidity) {
Double x = 7.5 * temp / (237.7 + temp);
Double e = 6.112 * Math.pow(10, x) * humidity / 100;
return temp + (5d / 9d) * (e - 10);
}
/**
* Returns the wind direction based on degree.
*/
public static String getWindDirection(Integer degree) {
if (degree < 0 || degree > 360) {
return null;
}
String[] directions = new String[] { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW",
"W", "WNW", "NW", "NNW" };
double step = 360.0 / directions.length;
double b = Math.floor((degree + (step / 2.0)) / step);
return directions[(int) (b % directions.length)];
}
/**
* Converts a value to the unit configured in the item binding.
*/
public static Double convertUnit(Double value, Unit unit, String property) {
if (unit != null) {
switch (unit) {
case FAHRENHEIT:
return celsiusToFahrenheit(value);
case MPH:
return kmhToMph(value);
case INCHES:
if ("atmosphere.pressure".equals(property)) {
return millibarToInches(value);
} else if ("precipitation.snow".equals(property)) {
return millimetersToInches(centimeterToMillimeter(value));
} else {
return millimetersToInches(value);
}
case BEAUFORT:
return kmhToBeaufort(value);
case KNOTS:
return kmhToKnots(value);
case MPS:
return kmhToMps(value);
}
}
return value;
}
/**
* Computes the sea level pressure depending of observed pressure,
* temperature and altitude of the observed point
*/
public static double getSeaLevelPressure(double pressure, double temp, double altitude) {
double x = 0.0065 * altitude;
x = (1 - x / (temp + x + 273.15));
return pressure * Math.pow(x, -5.257);
}
}