[miio] Implement alternative MiIoQuantityTypes (#9203)

* [miio] Implement alternative MiIoQuantityTypes

* Improved way avoiding multiple entries for Unit
* Test cases for the MiIoQuantityTypes class
* Apply suggestions from code review

Signed-off-by: Marcel Verpaalen <marcel@verpaalen.com>
Co-authored-by: Connor Petty <mistercpp2000+gitsignoff@gmail.com>
This commit is contained in:
Marcel 2020-12-04 09:37:49 -08:00 committed by GitHub
parent ffe252ccd5
commit 35528eda3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 92 additions and 10 deletions

View File

@ -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.ImperialUnits;
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 @@ import org.openhab.core.library.unit.SmartHomeUnits;
@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;
}
}

View File

@ -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));
}
}