2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.smartmeter.internal.sml;
15 import javax.measure.Quantity;
16 import javax.measure.Unit;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.core.library.unit.SIUnits;
21 import org.openhab.core.library.unit.SmartHomeUnits;
22 import org.openmuc.jsml.EUnit;
25 * Converts a {@link EUnit} to an {@link Unit}.
27 * @author Matthias Steigenberger - Initial contribution
31 public class SmlUnitConversion {
33 @SuppressWarnings("unchecked")
34 public static @Nullable <Q extends Quantity<Q>> Unit<Q> getUnit(EUnit unit) {
35 Unit<?> javaUnit = null;
38 javaUnit = SmartHomeUnits.AMPERE;
41 javaUnit = SmartHomeUnits.AMPERE.divide(SmartHomeUnits.HOUR);
43 case AMPERE_PER_METRE:
44 javaUnit = SmartHomeUnits.AMPERE.multiply(SIUnits.METRE);
46 case AMPERE_SQUARED_HOURS:
47 javaUnit = SmartHomeUnits.AMPERE.pow(2).multiply(SmartHomeUnits.HOUR);
50 javaUnit = SIUnits.PASCAL.multiply(100000);
53 javaUnit = SmartHomeUnits.COULOMB;
57 case CUBIC_METRE_CORRECTED:
58 javaUnit = SIUnits.CUBIC_METRE;
60 case CUBIC_METRE_PER_DAY:
61 case CUBIC_METRE_PER_DAY_CORRECTED:
62 javaUnit = SIUnits.CUBIC_METRE.divide(SmartHomeUnits.DAY);
64 case CUBIC_METRE_PER_HOUR:
65 case CUBIC_METRE_PER_HOUR_CORRECTED:
66 javaUnit = SIUnits.CUBIC_METRE.divide(SmartHomeUnits.HOUR);
70 javaUnit = SmartHomeUnits.DAY;
73 javaUnit = SmartHomeUnits.DEGREE_ANGLE;
76 javaUnit = SIUnits.CELSIUS;
80 javaUnit = SmartHomeUnits.FARAD;
83 javaUnit = SmartHomeUnits.HENRY;
86 javaUnit = SmartHomeUnits.HERTZ;
89 javaUnit = SmartHomeUnits.HOUR;
92 javaUnit = SmartHomeUnits.JOULE;
95 javaUnit = SmartHomeUnits.JOULE.divide(SmartHomeUnits.HOUR);
98 javaUnit = SmartHomeUnits.KELVIN;
101 javaUnit = SIUnits.KILOGRAM;
102 case KILOGRAM_PER_SECOND:
103 javaUnit = SIUnits.KILOGRAM.divide(SmartHomeUnits.SECOND);
106 javaUnit = SmartHomeUnits.LITRE;
110 case METER_CONSTANT_OR_PULSE_VALUE:
113 javaUnit = SIUnits.METRE;
115 case METRE_PER_SECOND:
116 javaUnit = SmartHomeUnits.METRE_PER_SECOND;
119 javaUnit = SmartHomeUnits.MOLE;
122 javaUnit = SmartHomeUnits.YEAR.divide(12);
125 javaUnit = SmartHomeUnits.NEWTON;
127 javaUnit = SmartHomeUnits.NEWTON.multiply(SIUnits.METRE);
130 javaUnit = SmartHomeUnits.OHM;
133 javaUnit = SmartHomeUnits.OHM.multiply(SIUnits.METRE);
136 javaUnit = SIUnits.PASCAL;
139 javaUnit = SIUnits.PASCAL.multiply(SmartHomeUnits.SECOND);
142 javaUnit = SmartHomeUnits.PERCENT;
145 javaUnit = SmartHomeUnits.SECOND;
148 javaUnit = SmartHomeUnits.TESLA;
151 javaUnit = SmartHomeUnits.WATT.alternate("Var");
154 javaUnit = SmartHomeUnits.WATT.alternate("Var").multiply(SmartHomeUnits.HOUR);
157 javaUnit = SmartHomeUnits.VOLT;
160 javaUnit = SmartHomeUnits.VOLT.multiply(SmartHomeUnits.AMPERE);
162 case VOLT_AMPERE_HOUR:
163 javaUnit = SmartHomeUnits.VOLT.multiply(SmartHomeUnits.AMPERE).multiply(SmartHomeUnits.HOUR);
166 javaUnit = SmartHomeUnits.WATT.divide(SIUnits.METRE);
168 case VOLT_SQUARED_HOURS:
169 javaUnit = SmartHomeUnits.VOLT.pow(2).multiply(SmartHomeUnits.HOUR);
172 javaUnit = SmartHomeUnits.WATT;
175 javaUnit = SmartHomeUnits.WATT.multiply(SmartHomeUnits.HOUR);
178 javaUnit = SmartHomeUnits.WEBER;
181 javaUnit = SmartHomeUnits.WEEK;
184 javaUnit = SmartHomeUnits.YEAR;
187 // not clearly defined yet:
188 case VOLT_SQUARED_HOUR_METER_CONSTANT_OR_PULSE_VALUE:
190 case REACTIVE_ENERGY_METER_CONSTANT_OR_PULSE_VALUE:
192 case ACTIVE_ENERGY_METER_CONSTANT_OR_PULSE_VALUE:
194 case AMPERE_SQUARED_HOUR_METER_CONSTANT_OR_PULSE_VALUE:
196 case APPARENT_ENERGY_METER_CONSTANT_OR_PULSE_VALUE:
198 case ENERGY_PER_VOLUME:
200 case CALORIFIC_VALUE:
214 return (Unit<Q>) javaUnit;