2 * Copyright (c) 2010-2023 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.Units;
22 import org.openmuc.jsml.EUnit;
25 * Converts an {@link EUnit} to a {@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 = Units.AMPERE;
41 javaUnit = Units.AMPERE.divide(Units.HOUR);
43 case AMPERE_PER_METRE:
44 javaUnit = Units.AMPERE.multiply(SIUnits.METRE);
46 case AMPERE_SQUARED_HOURS:
47 javaUnit = Units.AMPERE.pow(2).multiply(Units.HOUR);
50 javaUnit = SIUnits.PASCAL.multiply(100000);
53 javaUnit = Units.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(Units.DAY);
64 case CUBIC_METRE_PER_HOUR:
65 case CUBIC_METRE_PER_HOUR_CORRECTED:
66 javaUnit = SIUnits.CUBIC_METRE.divide(Units.HOUR);
73 javaUnit = Units.DEGREE_ANGLE;
76 javaUnit = SIUnits.CELSIUS;
80 javaUnit = Units.FARAD;
83 javaUnit = Units.HENRY;
86 javaUnit = Units.HERTZ;
89 javaUnit = Units.HOUR;
92 javaUnit = Units.JOULE;
95 javaUnit = Units.JOULE.divide(Units.HOUR);
98 javaUnit = Units.KELVIN;
101 javaUnit = SIUnits.KILOGRAM;
102 case KILOGRAM_PER_SECOND:
103 javaUnit = SIUnits.KILOGRAM.divide(Units.SECOND);
106 javaUnit = Units.LITRE;
110 case METER_CONSTANT_OR_PULSE_VALUE:
113 javaUnit = SIUnits.METRE;
115 case METRE_PER_SECOND:
116 javaUnit = Units.METRE_PER_SECOND;
119 javaUnit = Units.MOLE;
122 javaUnit = Units.YEAR.divide(12);
125 javaUnit = Units.NEWTON;
127 javaUnit = Units.NEWTON.multiply(SIUnits.METRE);
130 javaUnit = Units.OHM;
133 javaUnit = Units.OHM.multiply(SIUnits.METRE);
136 javaUnit = SIUnits.PASCAL;
139 javaUnit = SIUnits.PASCAL.multiply(Units.SECOND);
142 javaUnit = Units.PERCENT;
145 javaUnit = Units.SECOND;
148 javaUnit = Units.TESLA;
151 javaUnit = Units.WATT.alternate("Var");
154 javaUnit = Units.WATT.alternate("Var").multiply(Units.HOUR);
157 javaUnit = Units.VOLT;
160 javaUnit = Units.VOLT.multiply(Units.AMPERE);
162 case VOLT_AMPERE_HOUR:
163 javaUnit = Units.VOLT.multiply(Units.AMPERE).multiply(Units.HOUR);
166 javaUnit = Units.WATT.divide(SIUnits.METRE);
168 case VOLT_SQUARED_HOURS:
169 javaUnit = Units.VOLT.pow(2).multiply(Units.HOUR);
172 javaUnit = Units.WATT;
175 javaUnit = Units.WATT.multiply(Units.HOUR);
178 javaUnit = Units.WEBER;
181 javaUnit = Units.WEEK;
184 javaUnit = Units.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;