Skip to content

Commit 241e55f

Browse files
authored
Add some requested new units : J/m², gr/ft³,gr (#4467)
Signed-off-by: Gaël L'hopital <[email protected]>
1 parent 31e2838 commit 241e55f

File tree

5 files changed

+87
-4
lines changed

5 files changed

+87
-4
lines changed

bundles/org.openhab.core/src/main/java/org/openhab/core/internal/i18n/I18nProviderImpl.java

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import org.openhab.core.library.dimension.EmissionIntensity;
7878
import org.openhab.core.library.dimension.EnergyPrice;
7979
import org.openhab.core.library.dimension.Intensity;
80+
import org.openhab.core.library.dimension.RadiantExposure;
8081
import org.openhab.core.library.dimension.RadiationSpecificActivity;
8182
import org.openhab.core.library.dimension.VolumetricFlowRate;
8283
import org.openhab.core.library.types.PointType;
@@ -429,6 +430,7 @@ public static Map<Class<? extends Quantity<?>>, Map<SystemOfUnits, Unit<? extend
429430
addDefaultUnit(dimensionMap, RadiationDoseAbsorbed.class, Units.GRAY);
430431
addDefaultUnit(dimensionMap, RadiationDoseEffective.class, Units.SIEVERT);
431432
addDefaultUnit(dimensionMap, RadiationSpecificActivity.class, Units.BECQUEREL_PER_CUBIC_METRE);
433+
addDefaultUnit(dimensionMap, RadiantExposure.class, Units.JOULE_PER_SQUARE_METRE);
432434
addDefaultUnit(dimensionMap, Radioactivity.class, Units.BECQUEREL);
433435
addDefaultUnit(dimensionMap, SolidAngle.class, Units.STERADIAN);
434436
addDefaultUnit(dimensionMap, Speed.class, SIUnits.KILOMETRE_PER_HOUR, ImperialUnits.MILES_PER_HOUR);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* Copyright (c) 2010-2024 Contributors to the openHAB project
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information.
6+
*
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
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
package org.openhab.core.library.dimension;
14+
15+
import javax.measure.Quantity;
16+
17+
import org.eclipse.jdt.annotation.NonNullByDefault;
18+
19+
/**
20+
* The {@link RadiantExposure} defines the dimension for Radiant Exposure
21+
* https://en.wikipedia.org/wiki/Radiant_exposure
22+
*
23+
* @author Gaël L'hopital - Initial contribution
24+
*/
25+
@NonNullByDefault
26+
public interface RadiantExposure extends Quantity<RadiantExposure> {
27+
}

bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/ImperialUnits.java

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import javax.measure.spi.SystemOfUnits;
2626

2727
import org.eclipse.jdt.annotation.NonNullByDefault;
28+
import org.openhab.core.library.dimension.Density;
2829
import org.openhab.core.library.dimension.VolumetricFlowRate;
2930

3031
import tech.units.indriya.format.SimpleUnitFormat;
@@ -48,6 +49,8 @@ public final class ImperialUnits extends CustomUnits {
4849

4950
public static final Unit<Mass> POUND = addUnit(new TransformedUnit<>("lb", Units.GRAM,
5051
MultiplyConverter.ofRational(BigInteger.valueOf(45359237), BigInteger.valueOf(100000))));
52+
public static final Unit<Mass> GRAIN = addUnit(
53+
new TransformedUnit<>("gr", Units.GRAM, MultiplyConverter.of(0.06479891)));
5154
/** Additionally defined units to be used in openHAB **/
5255
public static final Unit<Pressure> INCH_OF_MERCURY = addUnit(new TransformedUnit<>("inHg", Units.PASCAL,
5356
MultiplyConverter.ofRational(BigInteger.valueOf(3386388), BigInteger.valueOf(1000))));
@@ -94,6 +97,8 @@ public final class ImperialUnits extends CustomUnits {
9497
public static final Unit<VolumetricFlowRate> GALLON_PER_MINUTE = addUnit(
9598
new ProductUnit<>(GALLON_LIQUID_US.divide(tech.units.indriya.unit.Units.MINUTE)));
9699

100+
public static final Unit<Density> GRAIN_PER_CUBICFOOT = addUnit(new ProductUnit<>(GRAIN.divide(CUBIC_FOOT)));
101+
97102
/*
98103
* Add unit symbols for imperial units.
99104
*/
@@ -111,6 +116,7 @@ public final class ImperialUnits extends CustomUnits {
111116
SimpleUnitFormat.getInstance().label(GALLON_LIQUID_US, GALLON_LIQUID_US.getSymbol());
112117
SimpleUnitFormat.getInstance().label(GALLON_PER_MINUTE, "gal/min");
113118
SimpleUnitFormat.getInstance().label(POUND_FORCE_SQUARE_INCH, POUND_FORCE_SQUARE_INCH.getSymbol());
119+
SimpleUnitFormat.getInstance().label(GRAIN, GRAIN.getSymbol());
114120
}
115121

116122
private ImperialUnits() {

bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/Units.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.openhab.core.library.dimension.ElectricConductivity;
5858
import org.openhab.core.library.dimension.EmissionIntensity;
5959
import org.openhab.core.library.dimension.Intensity;
60+
import org.openhab.core.library.dimension.RadiantExposure;
6061
import org.openhab.core.library.dimension.RadiationSpecificActivity;
6162
import org.openhab.core.library.dimension.VolumetricFlowRate;
6263

@@ -91,13 +92,15 @@ public final class Units extends CustomUnits {
9192
public static final Unit<AmountOfSubstance> MOLE = addUnit(tech.units.indriya.unit.Units.MOLE);
9293
public static final Unit<Volume> LITRE = addUnit(tech.units.indriya.unit.Units.LITRE);
9394
@SuppressWarnings("unchecked")
94-
public static final Unit<AmountOfSubstance> DEUTSCHE_HAERTE = addUnit(new TransformedUnit<>("°dH",
95-
(Unit<AmountOfSubstance>) MetricPrefix.MILLI(Units.MOLE).divide(Units.LITRE), MultiplyConverter.of(5.6)));
95+
public static final Unit<Dimensionless> DEUTSCHE_HAERTE = addUnit((Unit<Dimensionless>) new TransformedUnit<>("°dH",
96+
MetricPrefix.MILLI(Units.MOLE).divide(Units.LITRE), MultiplyConverter.of(0.17833)));
9697
public static final Unit<Angle> DEGREE_ANGLE = addUnit(NonSI.DEGREE_ANGLE);
9798
public static final Unit<Angle> RADIAN = addUnit(tech.units.indriya.unit.Units.RADIAN);
9899
public static final Unit<ArealDensity> DOBSON_UNIT = addUnit(
99100
new ProductUnit<>(MetricPrefix.MILLI(tech.units.indriya.unit.Units.MOLE).multiply(0.4462)
100101
.divide(tech.units.indriya.unit.Units.SQUARE_METRE)));
102+
public static final Unit<ArealDensity> KILOGRAM_PER_SQUARE_METRE = addUnit(new ProductUnit<>(
103+
tech.units.indriya.unit.Units.KILOGRAM.divide(tech.units.indriya.unit.Units.SQUARE_METRE)));
101104
public static final Unit<CatalyticActivity> KATAL = addUnit(tech.units.indriya.unit.Units.KATAL);
102105
public static final Unit<Density> KILOGRAM_PER_CUBICMETRE = addUnit(new ProductUnit<>(
103106
tech.units.indriya.unit.Units.KILOGRAM.divide(tech.units.indriya.unit.Units.CUBIC_METRE)));
@@ -187,6 +190,10 @@ public final class Units extends CustomUnits {
187190
new TransformedUnit<>("kn", tech.units.indriya.unit.Units.KILOMETRE_PER_HOUR,
188191
MultiplyConverter.ofRational(BigInteger.valueOf(1852), BigInteger.valueOf(1000))));
189192
public static final Unit<SolidAngle> STERADIAN = addUnit(tech.units.indriya.unit.Units.STERADIAN);
193+
public static final Unit<RadiantExposure> WATT_HOUR_PER_SQUARE_METRE = addUnit(
194+
new ProductUnit<>(WATT_HOUR.divide(tech.units.indriya.unit.Units.SQUARE_METRE)));
195+
public static final Unit<RadiantExposure> JOULE_PER_SQUARE_METRE = addUnit(
196+
new ProductUnit<>(JOULE.divide(tech.units.indriya.unit.Units.SQUARE_METRE)));
190197
public static final Unit<Temperature> KELVIN = addUnit(tech.units.indriya.unit.Units.KELVIN);
191198
public static final Unit<?> MIRED = addUnit(MetricPrefix.MEGA(tech.units.indriya.unit.Units.KELVIN).inverse());
192199
public static final Unit<Time> SECOND = addUnit(tech.units.indriya.unit.Units.SECOND);
@@ -262,7 +269,7 @@ public final class Units extends CustomUnits {
262269
SimpleUnitFormat.getInstance().label(DECIBEL, "dB");
263270
SimpleUnitFormat.getInstance().label(DECIBEL_MILLIWATTS, "dBm");
264271
SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "°");
265-
SimpleUnitFormat.getInstance().label(DEUTSCHE_HAERTE, "°dH");
272+
SimpleUnitFormat.getInstance().label(DEUTSCHE_HAERTE, DEUTSCHE_HAERTE.getSymbol());
266273
SimpleUnitFormat.getInstance().label(DOBSON_UNIT, "DU");
267274
SimpleUnitFormat.getInstance().label(GRAM_PER_KILOWATT_HOUR, "g/kWh");
268275
SimpleUnitFormat.getInstance().label(GIGABYTE, "GB");
@@ -276,6 +283,7 @@ public final class Units extends CustomUnits {
276283
SimpleUnitFormat.getInstance().alias(KIBIBYTE, "kio");
277284
SimpleUnitFormat.getInstance().label(KILOBIT, "kbit");
278285
SimpleUnitFormat.getInstance().label(KILOBIT_PER_SECOND, "kbit/s");
286+
SimpleUnitFormat.getInstance().label(KILOGRAM_PER_SQUARE_METRE, "kg/m²");
279287
SimpleUnitFormat.getInstance().label(KILOVAR, "kvar");
280288
SimpleUnitFormat.getInstance().label(KILOVAR_HOUR, "kvarh");
281289
SimpleUnitFormat.getInstance().label(KILOVOLT_AMPERE, "kVA");
@@ -315,6 +323,7 @@ public final class Units extends CustomUnits {
315323
SimpleUnitFormat.getInstance().label(VOLT_AMPERE, "VA");
316324
SimpleUnitFormat.getInstance().label(VOLT_AMPERE_HOUR, "VAh");
317325
SimpleUnitFormat.getInstance().label(WATT_HOUR, "Wh");
326+
SimpleUnitFormat.getInstance().label(WATT_HOUR_PER_SQUARE_METRE, "Wh/m²");
318327
SimpleUnitFormat.getInstance().label(WATT_SECOND, "Ws");
319328

320329
// workarounds for https://github.com/unitsofmeasurement/indriya/issues/409

bundles/org.openhab.core/src/test/java/org/openhab/core/library/unit/UnitsTest.java

+40-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import static org.hamcrest.CoreMatchers.*;
1616
import static org.hamcrest.MatcherAssert.assertThat;
1717
import static org.hamcrest.number.IsCloseTo.closeTo;
18-
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.*;
1919

2020
import java.math.BigDecimal;
2121

@@ -38,6 +38,7 @@
3838
import org.openhab.core.library.dimension.Density;
3939
import org.openhab.core.library.dimension.Intensity;
4040
import org.openhab.core.library.types.QuantityType;
41+
import org.openhab.core.types.util.UnitUtils;
4142

4243
import tech.units.indriya.quantity.Quantities;
4344

@@ -442,6 +443,44 @@ public void testColorTemperatureAliases() {
442443
assertEquals(Units.MIRED, value.getUnit());
443444
}
444445

446+
public void testGrains() {
447+
assertThat(ImperialUnits.GRAIN.getSymbol(), is("gr"));
448+
QuantityType<?> oneHundredGrains = QuantityType.valueOf("100 gr");
449+
QuantityType<?> converted = oneHundredGrains.toUnit("g");
450+
assertThat(converted.doubleValue(), is(closeTo(6.479891, DEFAULT_ERROR)));
451+
assertThat(ImperialUnits.GRAIN_PER_CUBICFOOT.toString(), is("gr/ft³"));
452+
QuantityType<?> grainDensity = QuantityType.valueOf("20 gr/ft³");
453+
QuantityType<?> convertedDensity = grainDensity.toUnit(Units.MICROGRAM_PER_CUBICMETRE);
454+
assertThat(convertedDensity.doubleValue(), is(closeTo(45767038.211314686, DEFAULT_ERROR)));
455+
}
456+
457+
@Test
458+
public void testArealDensity() {
459+
QuantityType<?> newspaper = QuantityType.valueOf("72 g/m²");
460+
QuantityType<?> converted = newspaper.toUnit(Units.KILOGRAM_PER_SQUARE_METRE);
461+
assertEquals(converted.doubleValue(), 0.072);
462+
}
463+
464+
@Test
465+
public void testAmountOfSubstance() {
466+
QuantityType<?> mmolpl = QuantityType.valueOf("0.17833 mmol/l");
467+
String mmolplDimension = UnitUtils.getDimensionName(mmolpl.getUnit());
468+
QuantityType<?> dh = QuantityType.valueOf("1 °dH");
469+
String hDimension = UnitUtils.getDimensionName(dh.getUnit());
470+
assertTrue(hDimension.equals(mmolplDimension));
471+
assertTrue("Dimensionless".equalsIgnoreCase(hDimension));
472+
QuantityType<?> converted = dh.toUnit("mmol/l");
473+
assertThat(converted.doubleValue(), is(closeTo(mmolpl.doubleValue(), DEFAULT_ERROR)));
474+
}
475+
476+
@Test
477+
public void testSolarIrradiation() {
478+
QuantityType<?> whpsm2 = QuantityType.valueOf(10, Units.WATT_HOUR_PER_SQUARE_METRE);
479+
assertThat(whpsm2.getUnit().toString(), is("Wh/m²"));
480+
QuantityType<?> jpsm2 = QuantityType.valueOf(10, Units.JOULE_PER_SQUARE_METRE);
481+
assertThat(jpsm2.getUnit().toString(), is("J/m²"));
482+
}
483+
445484
private static class QuantityEquals extends IsEqual<Quantity<?>> {
446485
private Quantity<?> quantity;
447486

0 commit comments

Comments
 (0)