Skip to content

Commit cc4b9e0

Browse files
authored
Extend UnitOfReactivePower with 'mvar' (home-assistant#150415)
1 parent 7e28e3d commit cc4b9e0

File tree

8 files changed

+73
-16
lines changed

8 files changed

+73
-16
lines changed

homeassistant/components/number/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ class NumberDeviceClass(StrEnum):
338338
REACTIVE_POWER = "reactive_power"
339339
"""Reactive power.
340340
341-
Unit of measurement: `var`, `kvar`
341+
Unit of measurement: `mvar`, `var`, `kvar`
342342
"""
343343

344344
SIGNAL_STRENGTH = "signal_strength"

homeassistant/components/recorder/statistics.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
PowerConverter,
6161
PressureConverter,
6262
ReactiveEnergyConverter,
63+
ReactivePowerConverter,
6364
SpeedConverter,
6465
TemperatureConverter,
6566
UnitlessRatioConverter,
@@ -216,6 +217,7 @@ def query_circular_mean(table: type[StatisticsBase]) -> tuple[Label, Label]:
216217
**dict.fromkeys(PowerConverter.VALID_UNITS, PowerConverter),
217218
**dict.fromkeys(PressureConverter.VALID_UNITS, PressureConverter),
218219
**dict.fromkeys(ReactiveEnergyConverter.VALID_UNITS, ReactiveEnergyConverter),
220+
**dict.fromkeys(ReactivePowerConverter.VALID_UNITS, ReactivePowerConverter),
219221
**dict.fromkeys(SpeedConverter.VALID_UNITS, SpeedConverter),
220222
**dict.fromkeys(TemperatureConverter.VALID_UNITS, TemperatureConverter),
221223
**dict.fromkeys(UnitlessRatioConverter.VALID_UNITS, UnitlessRatioConverter),

homeassistant/components/recorder/websocket_api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
PowerConverter,
3434
PressureConverter,
3535
ReactiveEnergyConverter,
36+
ReactivePowerConverter,
3637
SpeedConverter,
3738
TemperatureConverter,
3839
UnitlessRatioConverter,
@@ -81,6 +82,7 @@
8182
vol.Optional("power"): vol.In(PowerConverter.VALID_UNITS),
8283
vol.Optional("pressure"): vol.In(PressureConverter.VALID_UNITS),
8384
vol.Optional("reactive_energy"): vol.In(ReactiveEnergyConverter.VALID_UNITS),
85+
vol.Optional("reactive_power"): vol.In(ReactivePowerConverter.VALID_UNITS),
8486
vol.Optional("speed"): vol.In(SpeedConverter.VALID_UNITS),
8587
vol.Optional("temperature"): vol.In(TemperatureConverter.VALID_UNITS),
8688
vol.Optional("unitless"): vol.In(UnitlessRatioConverter.VALID_UNITS),

homeassistant/components/sensor/const.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
PowerConverter,
6565
PressureConverter,
6666
ReactiveEnergyConverter,
67+
ReactivePowerConverter,
6768
SpeedConverter,
6869
TemperatureConverter,
6970
UnitlessRatioConverter,
@@ -370,7 +371,7 @@ class SensorDeviceClass(StrEnum):
370371
REACTIVE_POWER = "reactive_power"
371372
"""Reactive power.
372373
373-
Unit of measurement: `var`, `kvar`
374+
Unit of measurement: `mvar`, `var`, `kvar`
374375
"""
375376

376377
SIGNAL_STRENGTH = "signal_strength"
@@ -550,6 +551,7 @@ class SensorStateClass(StrEnum):
550551
SensorDeviceClass.PRECIPITATION_INTENSITY: SpeedConverter,
551552
SensorDeviceClass.PRESSURE: PressureConverter,
552553
SensorDeviceClass.REACTIVE_ENERGY: ReactiveEnergyConverter,
554+
SensorDeviceClass.REACTIVE_POWER: ReactivePowerConverter,
553555
SensorDeviceClass.SPEED: SpeedConverter,
554556
SensorDeviceClass.TEMPERATURE: TemperatureConverter,
555557
SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS: MassVolumeConcentrationConverter,

homeassistant/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ class UnitOfPower(StrEnum):
609609
class UnitOfReactivePower(StrEnum):
610610
"""Reactive power units."""
611611

612+
MILLIVOLT_AMPERE_REACTIVE = "mvar"
612613
VOLT_AMPERE_REACTIVE = "var"
613614
KILO_VOLT_AMPERE_REACTIVE = "kvar"
614615

homeassistant/util/unit_conversion.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
UnitOfPower,
3030
UnitOfPressure,
3131
UnitOfReactiveEnergy,
32+
UnitOfReactivePower,
3233
UnitOfSpeed,
3334
UnitOfTemperature,
3435
UnitOfTime,
@@ -460,6 +461,22 @@ class ReactiveEnergyConverter(BaseUnitConverter):
460461
VALID_UNITS = set(UnitOfReactiveEnergy)
461462

462463

464+
class ReactivePowerConverter(BaseUnitConverter):
465+
"""Utility to convert reactive power values."""
466+
467+
UNIT_CLASS = "reactive_power"
468+
_UNIT_CONVERSION: dict[str | None, float] = {
469+
UnitOfReactivePower.MILLIVOLT_AMPERE_REACTIVE: 1 * 1000,
470+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE: 1,
471+
UnitOfReactivePower.KILO_VOLT_AMPERE_REACTIVE: 1 / 1000,
472+
}
473+
VALID_UNITS = {
474+
UnitOfReactivePower.MILLIVOLT_AMPERE_REACTIVE,
475+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
476+
UnitOfReactivePower.KILO_VOLT_AMPERE_REACTIVE,
477+
}
478+
479+
463480
class SpeedConverter(BaseUnitConverter):
464481
"""Utility to convert speed values."""
465482

tests/components/sensor/test_init.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2978,7 +2978,6 @@ def test_device_class_converters_are_complete() -> None:
29782978
SensorDeviceClass.PM1,
29792979
SensorDeviceClass.PM10,
29802980
SensorDeviceClass.PM25,
2981-
SensorDeviceClass.REACTIVE_POWER,
29822981
SensorDeviceClass.SIGNAL_STRENGTH,
29832982
SensorDeviceClass.SOUND_PRESSURE,
29842983
SensorDeviceClass.SULPHUR_DIOXIDE,

tests/util/test_unit_conversion.py

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
UnitOfPower,
3030
UnitOfPressure,
3131
UnitOfReactiveEnergy,
32+
UnitOfReactivePower,
3233
UnitOfSpeed,
3334
UnitOfTemperature,
3435
UnitOfTime,
@@ -57,6 +58,7 @@
5758
PowerConverter,
5859
PressureConverter,
5960
ReactiveEnergyConverter,
61+
ReactivePowerConverter,
6062
SpeedConverter,
6163
TemperatureConverter,
6264
UnitlessRatioConverter,
@@ -89,6 +91,7 @@
8991
PowerConverter,
9092
PressureConverter,
9193
ReactiveEnergyConverter,
94+
ReactivePowerConverter,
9295
SpeedConverter,
9396
TemperatureConverter,
9497
UnitlessRatioConverter,
@@ -100,6 +103,11 @@
100103

101104
# Dict containing all converters with a corresponding unit ratio.
102105
_GET_UNIT_RATIO: dict[type[BaseUnitConverter], tuple[str | None, str | None, float]] = {
106+
ApparentPowerConverter: (
107+
UnitOfApparentPower.MILLIVOLT_AMPERE,
108+
UnitOfApparentPower.VOLT_AMPERE,
109+
1000,
110+
),
103111
AreaConverter: (UnitOfArea.SQUARE_KILOMETERS, UnitOfArea.SQUARE_METERS, 0.000001),
104112
BloodGlucoseConcentrationConverter: (
105113
UnitOfBloodGlucoseConcentration.MILLIGRAMS_PER_DECILITER,
@@ -141,18 +149,18 @@
141149
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
142150
1000,
143151
),
144-
ApparentPowerConverter: (
145-
UnitOfApparentPower.MILLIVOLT_AMPERE,
146-
UnitOfApparentPower.VOLT_AMPERE,
147-
1000,
148-
),
149152
PowerConverter: (UnitOfPower.WATT, UnitOfPower.KILO_WATT, 1000),
150153
PressureConverter: (UnitOfPressure.HPA, UnitOfPressure.INHG, 33.86389),
151154
ReactiveEnergyConverter: (
152155
UnitOfReactiveEnergy.VOLT_AMPERE_REACTIVE_HOUR,
153156
UnitOfReactiveEnergy.KILO_VOLT_AMPERE_REACTIVE_HOUR,
154157
1000,
155158
),
159+
ReactivePowerConverter: (
160+
UnitOfReactivePower.MILLIVOLT_AMPERE_REACTIVE,
161+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
162+
1000,
163+
),
156164
SpeedConverter: (
157165
UnitOfSpeed.KILOMETERS_PER_HOUR,
158166
UnitOfSpeed.MILES_PER_HOUR,
@@ -176,6 +184,14 @@
176184
_CONVERTED_VALUE: dict[
177185
type[BaseUnitConverter], list[tuple[float, str | None, float, str | None]]
178186
] = {
187+
ApparentPowerConverter: [
188+
(
189+
10,
190+
UnitOfApparentPower.MILLIVOLT_AMPERE,
191+
0.01,
192+
UnitOfApparentPower.VOLT_AMPERE,
193+
),
194+
],
179195
AreaConverter: [
180196
# Square Meters to other units
181197
(5, UnitOfArea.SQUARE_METERS, 50000, UnitOfArea.SQUARE_CENTIMETERS),
@@ -623,14 +639,6 @@
623639
(1, UnitOfMass.STONES, 14, UnitOfMass.POUNDS),
624640
(1, UnitOfMass.STONES, 224, UnitOfMass.OUNCES),
625641
],
626-
ApparentPowerConverter: [
627-
(
628-
10,
629-
UnitOfApparentPower.MILLIVOLT_AMPERE,
630-
0.01,
631-
UnitOfApparentPower.VOLT_AMPERE,
632-
),
633-
],
634642
PowerConverter: [
635643
(10, UnitOfPower.KILO_WATT, 10000, UnitOfPower.WATT),
636644
(10, UnitOfPower.MEGA_WATT, 10e6, UnitOfPower.WATT),
@@ -682,6 +690,32 @@
682690
UnitOfReactiveEnergy.KILO_VOLT_AMPERE_REACTIVE_HOUR,
683691
),
684692
],
693+
ReactivePowerConverter: [
694+
(
695+
10,
696+
UnitOfReactivePower.KILO_VOLT_AMPERE_REACTIVE,
697+
10000,
698+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
699+
),
700+
(
701+
10,
702+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
703+
0.01,
704+
UnitOfReactivePower.KILO_VOLT_AMPERE_REACTIVE,
705+
),
706+
(
707+
10,
708+
UnitOfReactivePower.MILLIVOLT_AMPERE_REACTIVE,
709+
0.01,
710+
UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
711+
),
712+
(
713+
10,
714+
UnitOfReactivePower.MILLIVOLT_AMPERE_REACTIVE,
715+
0.00001,
716+
UnitOfReactivePower.KILO_VOLT_AMPERE_REACTIVE,
717+
),
718+
],
685719
SpeedConverter: [
686720
# 5 km/h / 1.609 km/mi = 3.10686 mi/h
687721
(5, UnitOfSpeed.KILOMETERS_PER_HOUR, 3.106856, UnitOfSpeed.MILES_PER_HOUR),

0 commit comments

Comments
 (0)