package org.openhab.binding.miio.internal;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.openhab.core.library.unit.SIUnits;
import org.openhab.core.library.unit.SmartHomeUnits;
+import tec.uom.se.unit.Units;
+
/**
* Enum of the units used in the miio protocol
* Used to find the right {@link javax.measure.Unit} given the string of the unit
@NonNullByDefault
public enum MiIoQuantiyTypes {
- CELCIUS(SIUnits.CELSIUS),
+ CELCIUS(SIUnits.CELSIUS, "C"),
FAHRENHEIT(ImperialUnits.FAHRENHEIT),
- SECOND(SmartHomeUnits.SECOND),
- MINUTE(SmartHomeUnits.MINUTE),
- HOUR(SmartHomeUnits.HOUR),
- SECONDS(SmartHomeUnits.SECOND),
- MINUTES(SmartHomeUnits.MINUTE),
- HOURS(SmartHomeUnits.HOUR),
+ SECOND(SmartHomeUnits.SECOND, "seconds"),
+ MINUTE(SmartHomeUnits.MINUTE, "minutes"),
+ HOUR(SmartHomeUnits.HOUR, "hours"),
AMPERE(SmartHomeUnits.AMPERE),
- WATT(SmartHomeUnits.WATT);
+ WATT(SmartHomeUnits.WATT),
+ SQUARE_METRE(Units.SQUARE_METRE, "square_meter", "squaremeter"),
+ PERCENT(SmartHomeUnits.PERCENT);
private final Unit<?> unit;
+ private final String[] aliasses;
private static Map<String, Unit<?>> stringMap = Arrays.stream(values())
.collect(Collectors.toMap(Enum::toString, MiIoQuantiyTypes::getUnit));
- private MiIoQuantiyTypes(Unit<?> unit) {
+ private static Map<String, Unit<?>> aliasMap() {
+ Map<String, Unit<?>> aliassesMap = new HashMap<>();
+ for (MiIoQuantiyTypes miIoQuantiyType : values()) {
+ for (String alias : miIoQuantiyType.getAliasses()) {
+ aliassesMap.put(alias.toLowerCase(), miIoQuantiyType.getUnit());
+ }
+ }
+ return aliassesMap;
+ }
+
+ private MiIoQuantiyTypes(Unit<?> unit, String... aliasses) {
this.unit = unit;
+ this.aliasses = aliasses;
}
public Unit<?> getUnit() {
return unit;
}
+ public String[] getAliasses() {
+ return aliasses;
+ }
+
public static @Nullable Unit<?> get(String unitName) {
- return stringMap.get(unitName.toUpperCase());
+ Unit<?> unit = stringMap.get(unitName.toUpperCase());
+ if (unit == null) {
+ unit = aliasMap().get(unitName.toLowerCase());
+ }
+ return unit;
}
}
--- /dev/null
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.miio.internal;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static tec.uom.se.unit.Units.SQUARE_METRE;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.junit.jupiter.api.Test;
+import org.openhab.core.library.unit.SmartHomeUnits;
+
+/**
+ * Test case for {@link MiIoQuantityTypes}
+ *
+ * @author Marcel Verpaalen - Initial contribution
+ *
+ */
+@NonNullByDefault
+public class MiIoQuantityTypesTest {
+
+ @Test
+ public void UnknownUnitTest() {
+
+ String unitName = "some none existent unit";
+ assertNull(MiIoQuantiyTypes.get(unitName));
+ }
+
+ @Test
+ public void regularsUnitTest() {
+
+ String unitName = "minute";
+ assertEquals(SmartHomeUnits.MINUTE, MiIoQuantiyTypes.get(unitName));
+
+ unitName = "Minute";
+ assertEquals(SmartHomeUnits.MINUTE, MiIoQuantiyTypes.get(unitName));
+ }
+
+ @Test
+ public void aliasUnitsTest() {
+
+ String unitName = "square_meter";
+ assertEquals(SQUARE_METRE, MiIoQuantiyTypes.get(unitName));
+
+ unitName = "Square_meter";
+ assertEquals(SQUARE_METRE, MiIoQuantiyTypes.get(unitName));
+
+ unitName = "squaremeter";
+ assertEquals(SQUARE_METRE, MiIoQuantiyTypes.get(unitName));
+ }
+}