diff --git a/homeassistant/components/utility_meter/const.py b/homeassistant/components/utility_meter/const.py index 5be7dcf9b69..7b55ec4dcd0 100644 --- a/homeassistant/components/utility_meter/const.py +++ b/homeassistant/components/utility_meter/const.py @@ -5,10 +5,11 @@ HOURLY = "hourly" DAILY = "daily" WEEKLY = "weekly" MONTHLY = "monthly" +BIMONTHLY = "bimonthly" QUARTERLY = "quarterly" YEARLY = "yearly" -METER_TYPES = [HOURLY, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY] +METER_TYPES = [HOURLY, DAILY, WEEKLY, MONTHLY, BIMONTHLY, QUARTERLY, YEARLY] DATA_UTILITY = "utility_meter_data" diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index 8372d8e6b22..54f93422abd 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -24,6 +24,7 @@ import homeassistant.util.dt as dt_util from .const import ( ATTR_VALUE, + BIMONTHLY, CONF_METER, CONF_METER_NET_CONSUMPTION, CONF_METER_OFFSET, @@ -204,6 +205,12 @@ class UtilityMeterSensor(RestoreEntity): and now != date(now.year, now.month, 1) + self._period_offset ): return + if ( + self._period == BIMONTHLY + and now + != date(now.year, (((now.month - 1) // 2) * 2 + 1), 1) + self._period_offset + ): + return if ( self._period == QUARTERLY and now @@ -241,7 +248,7 @@ class UtilityMeterSensor(RestoreEntity): minute=self._period_offset.seconds // 60, second=self._period_offset.seconds % 60, ) - elif self._period in [DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY]: + elif self._period in [DAILY, WEEKLY, MONTHLY, BIMONTHLY, QUARTERLY, YEARLY]: async_track_time_change( self.hass, self._async_reset_meter, diff --git a/tests/components/utility_meter/test_sensor.py b/tests/components/utility_meter/test_sensor.py index c1613c53a20..af2bbdbf6a2 100644 --- a/tests/components/utility_meter/test_sensor.py +++ b/tests/components/utility_meter/test_sensor.py @@ -288,6 +288,23 @@ async def test_self_reset_monthly(hass, legacy_patchable_time): ) +async def test_self_reset_bimonthly(hass, legacy_patchable_time): + """Test bimonthly reset of meter occurs on even months.""" + await _test_self_reset( + hass, gen_config("bimonthly"), "2017-12-31T23:59:00.000000+00:00" + ) + + +async def test_self_no_reset_bimonthly(hass, legacy_patchable_time): + """Test bimonthly reset of meter does not occur on odd months.""" + await _test_self_reset( + hass, + gen_config("bimonthly"), + "2018-01-01T23:59:00.000000+00:00", + expect_reset=False, + ) + + async def test_self_reset_quarterly(hass, legacy_patchable_time): """Test quarterly reset of meter.""" await _test_self_reset(