diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoQuantiyTypes.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoQuantiyTypes.java index 49cf9a3f297ca..c3c06418afacc 100644 --- a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoQuantiyTypes.java +++ b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoQuantiyTypes.java @@ -13,6 +13,7 @@ package org.openhab.binding.miio.internal; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @@ -24,6 +25,8 @@ 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 @@ -33,31 +36,50 @@ @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> stringMap = Arrays.stream(values()) .collect(Collectors.toMap(Enum::toString, MiIoQuantiyTypes::getUnit)); - private MiIoQuantiyTypes(Unit unit) { + private static Map> aliasMap() { + Map> 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; } } diff --git a/bundles/org.openhab.binding.miio/src/test/java/org/openhab/binding/miio/internal/MiIoQuantityTypesTest.java b/bundles/org.openhab.binding.miio/src/test/java/org/openhab/binding/miio/internal/MiIoQuantityTypesTest.java new file mode 100644 index 0000000000000..d5346d53ede0d --- /dev/null +++ b/bundles/org.openhab.binding.miio/src/test/java/org/openhab/binding/miio/internal/MiIoQuantityTypesTest.java @@ -0,0 +1,60 @@ +/** + * 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)); + } +}