Skip to content

Commit

Permalink
[miio] Implement alternative MiIoQuantityTypes (openhab#9203)
Browse files Browse the repository at this point in the history
* [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>
  • Loading branch information
marcelrv and Connor Petty committed Dec 4, 2020
1 parent fae7746 commit 93b56bd
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 10 deletions.
Expand Up @@ -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;

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

0 comments on commit 93b56bd

Please sign in to comment.