Skip to content

Commit 017efd3

Browse files
author
Sven ten Raa
committed
Add unit of electric charge as unit of measurement option
1 parent 12129e9 commit 017efd3

File tree

8 files changed

+76
-0
lines changed

8 files changed

+76
-0
lines changed

homeassistant/components/apcupsd/sensor.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from homeassistant.const import (
1414
PERCENTAGE,
1515
UnitOfApparentPower,
16+
UnitOfElectricCharge,
1617
UnitOfElectricCurrent,
1718
UnitOfElectricPotential,
1819
UnitOfFrequency,
@@ -434,6 +435,8 @@
434435
" Volt-Ampere": UnitOfApparentPower.VOLT_AMPERE,
435436
" VA": UnitOfApparentPower.VOLT_AMPERE,
436437
" Watts": UnitOfPower.WATT,
438+
" Ampere hour": UnitOfElectricCharge.AMPERE_HOUR,
439+
" milliampere hour": UnitOfElectricCharge.MILLIAMPERE_HOUR,
437440
" Hz": UnitOfFrequency.HERTZ,
438441
" C": UnitOfTemperature.CELSIUS,
439442
# APCUPSd reports data for "itemp" field (eventually represented by UPS Internal

homeassistant/components/number/const.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
1818
UnitOfApparentPower,
1919
UnitOfDataRate,
20+
UnitOfElectricCharge,
2021
UnitOfElectricCurrent,
2122
UnitOfElectricPotential,
2223
UnitOfEnergy,
@@ -239,6 +240,12 @@ class NumberDeviceClass(StrEnum):
239240
Unit of measurement: `W`, `kW`
240241
"""
241242

243+
CHARGE = "charge"
244+
"""Charge.
245+
246+
Unit of measurement: `mAh`, `Ah`
247+
"""
248+
242249
PRECIPITATION = "precipitation"
243250
"""Accumulated precipitation.
244251
@@ -413,6 +420,10 @@ class NumberMode(StrEnum):
413420
NumberDeviceClass.PM25: {CONCENTRATION_MICROGRAMS_PER_CUBIC_METER},
414421
NumberDeviceClass.POWER_FACTOR: {PERCENTAGE, None},
415422
NumberDeviceClass.POWER: {UnitOfPower.WATT, UnitOfPower.KILO_WATT},
423+
NumberDeviceClass.CHARGE: {
424+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
425+
UnitOfElectricCharge.AMPERE_HOUR,
426+
},
416427
NumberDeviceClass.PRECIPITATION: set(UnitOfPrecipitationDepth),
417428
NumberDeviceClass.PRECIPITATION_INTENSITY: set(UnitOfVolumetricFlux),
418429
NumberDeviceClass.PRESSURE: set(UnitOfPressure),

homeassistant/components/recorder/statistics.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from homeassistant.util import dt as dt_util
2929
from homeassistant.util.unit_conversion import (
3030
BaseUnitConverter,
31+
ChargeConverter,
3132
DataRateConverter,
3233
DistanceConverter,
3334
ElectricCurrentConverter,
@@ -138,6 +139,7 @@
138139
**{unit: InformationConverter for unit in InformationConverter.VALID_UNITS},
139140
**{unit: MassConverter for unit in MassConverter.VALID_UNITS},
140141
**{unit: PowerConverter for unit in PowerConverter.VALID_UNITS},
142+
**{unit: ChargeConverter for unit in ChargeConverter.VALID_UNITS},
141143
**{unit: PressureConverter for unit in PressureConverter.VALID_UNITS},
142144
**{unit: SpeedConverter for unit in SpeedConverter.VALID_UNITS},
143145
**{unit: TemperatureConverter for unit in TemperatureConverter.VALID_UNITS},

homeassistant/components/recorder/websocket_api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from homeassistant.helpers.json import JSON_DUMP
1616
from homeassistant.util import dt as dt_util
1717
from homeassistant.util.unit_conversion import (
18+
ChargeConverter,
1819
DataRateConverter,
1920
DistanceConverter,
2021
ElectricCurrentConverter,
@@ -62,6 +63,7 @@
6263
vol.Optional("information"): vol.In(InformationConverter.VALID_UNITS),
6364
vol.Optional("mass"): vol.In(MassConverter.VALID_UNITS),
6465
vol.Optional("power"): vol.In(PowerConverter.VALID_UNITS),
66+
vol.Optional("charge"): vol.In(ChargeConverter.VALID_UNITS),
6567
vol.Optional("pressure"): vol.In(PressureConverter.VALID_UNITS),
6668
vol.Optional("speed"): vol.In(SpeedConverter.VALID_UNITS),
6769
vol.Optional("temperature"): vol.In(TemperatureConverter.VALID_UNITS),

homeassistant/components/sensor/const.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
1818
UnitOfApparentPower,
1919
UnitOfDataRate,
20+
UnitOfElectricCharge,
2021
UnitOfElectricCurrent,
2122
UnitOfElectricPotential,
2223
UnitOfEnergy,
@@ -37,6 +38,7 @@
3738
)
3839
from homeassistant.util.unit_conversion import (
3940
BaseUnitConverter,
41+
ChargeConverter,
4042
DataRateConverter,
4143
DistanceConverter,
4244
ElectricCurrentConverter,
@@ -277,6 +279,12 @@ class SensorDeviceClass(StrEnum):
277279
Unit of measurement: `W`, `kW`
278280
"""
279281

282+
CHARGE = "charge"
283+
"""Charge.
284+
285+
Unit of measurement: `mAh`, `Ah`
286+
"""
287+
280288
PRECIPITATION = "precipitation"
281289
"""Accumulated precipitation.
282290
@@ -460,6 +468,7 @@ class SensorStateClass(StrEnum):
460468
SensorDeviceClass.ENERGY_STORAGE: EnergyConverter,
461469
SensorDeviceClass.GAS: VolumeConverter,
462470
SensorDeviceClass.POWER: PowerConverter,
471+
SensorDeviceClass.CHARGE: ChargeConverter,
463472
SensorDeviceClass.POWER_FACTOR: UnitlessRatioConverter,
464473
SensorDeviceClass.PRECIPITATION: DistanceConverter,
465474
SensorDeviceClass.PRECIPITATION_INTENSITY: SpeedConverter,
@@ -514,6 +523,10 @@ class SensorStateClass(StrEnum):
514523
SensorDeviceClass.PM25: {CONCENTRATION_MICROGRAMS_PER_CUBIC_METER},
515524
SensorDeviceClass.POWER_FACTOR: {PERCENTAGE, None},
516525
SensorDeviceClass.POWER: {UnitOfPower.WATT, UnitOfPower.KILO_WATT},
526+
SensorDeviceClass.CHARGE: {
527+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
528+
UnitOfElectricCharge.AMPERE_HOUR,
529+
},
517530
SensorDeviceClass.PRECIPITATION: set(UnitOfPrecipitationDepth),
518531
SensorDeviceClass.PRECIPITATION_INTENSITY: set(UnitOfVolumetricFlux),
519532
SensorDeviceClass.PRESSURE: set(UnitOfPressure),

homeassistant/const.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,13 @@ class UnitOfApparentPower(StrEnum):
494494
"""Deprecated: please use UnitOfApparentPower.VOLT_AMPERE."""
495495

496496

497+
class UnitOfElectricCharge(StrEnum):
498+
"""Charge units."""
499+
500+
AMPERE_HOUR = "Ah"
501+
MILLIAMPERE_HOUR = "mAh"
502+
503+
497504
# Power units
498505
class UnitOfPower(StrEnum):
499506
"""Power units."""

homeassistant/util/unit_conversion.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
PERCENTAGE,
1111
UNIT_NOT_RECOGNIZED_TEMPLATE,
1212
UnitOfDataRate,
13+
UnitOfElectricCharge,
1314
UnitOfElectricCurrent,
1415
UnitOfElectricPotential,
1516
UnitOfEnergy,
@@ -284,6 +285,21 @@ class PowerConverter(BaseUnitConverter):
284285
}
285286

286287

288+
class ChargeConverter(BaseUnitConverter):
289+
"""Utility to convert charge values."""
290+
291+
UNIT_CLASS = "charge"
292+
NORMALIZED_UNIT = UnitOfElectricCharge.AMPERE_HOUR
293+
_UNIT_CONVERSION: dict[str | None, float] = {
294+
UnitOfElectricCharge.MILLIAMPERE_HOUR: 1,
295+
UnitOfElectricCharge.AMPERE_HOUR: 1 / 1000,
296+
}
297+
VALID_UNITS = {
298+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
299+
UnitOfElectricCharge.AMPERE_HOUR,
300+
}
301+
302+
287303
class PressureConverter(BaseUnitConverter):
288304
"""Utility to convert pressure values."""
289305

tests/util/test_unit_conversion.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
CONCENTRATION_PARTS_PER_MILLION,
1212
PERCENTAGE,
1313
UnitOfDataRate,
14+
UnitOfElectricCharge,
1415
UnitOfElectricCurrent,
1516
UnitOfElectricPotential,
1617
UnitOfEnergy,
@@ -28,6 +29,7 @@
2829
from homeassistant.util import unit_conversion
2930
from homeassistant.util.unit_conversion import (
3031
BaseUnitConverter,
32+
ChargeConverter,
3133
DataRateConverter,
3234
DistanceConverter,
3335
ElectricCurrentConverter,
@@ -60,6 +62,7 @@
6062
InformationConverter,
6163
MassConverter,
6264
PowerConverter,
65+
ChargeConverter,
6366
PressureConverter,
6467
SpeedConverter,
6568
TemperatureConverter,
@@ -90,6 +93,11 @@
9093
InformationConverter: (UnitOfInformation.BITS, UnitOfInformation.BYTES, 8),
9194
MassConverter: (UnitOfMass.STONES, UnitOfMass.KILOGRAMS, 0.157473),
9295
PowerConverter: (UnitOfPower.WATT, UnitOfPower.KILO_WATT, 1000),
96+
ChargeConverter: (
97+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
98+
UnitOfElectricCharge.AMPERE_HOUR,
99+
1000,
100+
),
93101
PressureConverter: (UnitOfPressure.HPA, UnitOfPressure.INHG, 33.86389),
94102
SpeedConverter: (
95103
UnitOfSpeed.KILOMETERS_PER_HOUR,
@@ -277,6 +285,20 @@
277285
(10, UnitOfPower.KILO_WATT, 10000, UnitOfPower.WATT),
278286
(10, UnitOfPower.WATT, 0.01, UnitOfPower.KILO_WATT),
279287
],
288+
ChargeConverter: [
289+
(
290+
10,
291+
UnitOfElectricCharge.AMPERE_HOUR,
292+
10000,
293+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
294+
),
295+
(
296+
10,
297+
UnitOfElectricCharge.MILLIAMPERE_HOUR,
298+
0.01,
299+
UnitOfElectricCharge.AMPERE_HOUR,
300+
),
301+
],
280302
PressureConverter: [
281303
(1000, UnitOfPressure.HPA, 14.5037743897, UnitOfPressure.PSI),
282304
(1000, UnitOfPressure.HPA, 29.5299801647, UnitOfPressure.INHG),

0 commit comments

Comments
 (0)