Add sensor to expose Powerwall backup reserve percentage (#66393)

This commit is contained in:
Matt Zimmerman 2022-02-28 11:31:34 -08:00 committed by GitHub
parent 974296697e
commit d077c3b8d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 1 deletions

View file

@ -229,6 +229,7 @@ def _fetch_powerwall_data(power_wall: Powerwall) -> PowerwallData:
meters=power_wall.get_meters(),
grid_services_active=power_wall.is_grid_services_active(),
grid_status=power_wall.get_grid_status(),
backup_reserve=power_wall.get_backup_reserve_percentage(),
)

View file

@ -38,6 +38,7 @@ class PowerwallData:
meters: MetersAggregates
grid_services_active: bool
grid_status: GridStatus
backup_reserve: float
class PowerwallRuntimeData(TypedDict):

View file

@ -45,7 +45,11 @@ async def async_setup_entry(
| PowerWallImportSensor
| PowerWallExportSensor
| PowerWallChargeSensor
] = [PowerWallChargeSensor(powerwall_data)]
| PowerWallBackupReserveSensor
] = [
PowerWallChargeSensor(powerwall_data),
PowerWallBackupReserveSensor(powerwall_data),
]
for meter in data.meters.meters:
entities.extend(
@ -111,6 +115,25 @@ class PowerWallEnergySensor(PowerWallEntity, SensorEntity):
}
class PowerWallBackupReserveSensor(PowerWallEntity, SensorEntity):
"""Representation of the Powerwall backup reserve setting."""
_attr_name = "Powerwall Backup Reserve"
_attr_state_class = SensorStateClass.MEASUREMENT
_attr_native_unit_of_measurement = PERCENTAGE
_attr_device_class = SensorDeviceClass.BATTERY
@property
def unique_id(self) -> str:
"""Device Uniqueid."""
return f"{self.base_unique_id}_backup_reserve"
@property
def native_value(self) -> int:
"""Get the current value in percentage."""
return round(self.data.backup_reserve)
class PowerWallEnergyDirectionSensor(PowerWallEntity, SensorEntity):
"""Representation of an Powerwall Direction Energy sensor."""

View file

@ -37,6 +37,7 @@ async def _mock_powerwall_with_fixtures(hass):
status=PowerwallStatus(status),
device_type=DeviceType(device_type["device_type"]),
serial_numbers=["TG0123456789AB", "TG9876543210BA"],
backup_reserve_percentage=15.0,
)
@ -50,6 +51,7 @@ def _mock_powerwall_return_value(
status=None,
device_type=None,
serial_numbers=None,
backup_reserve_percentage=None,
):
powerwall_mock = MagicMock(Powerwall("1.2.3.4"))
powerwall_mock.get_site_info = Mock(return_value=site_info)
@ -60,6 +62,9 @@ def _mock_powerwall_return_value(
powerwall_mock.get_status = Mock(return_value=status)
powerwall_mock.get_device_type = Mock(return_value=device_type)
powerwall_mock.get_serial_numbers = Mock(return_value=serial_numbers)
powerwall_mock.get_backup_reserve_percentage = Mock(
return_value=backup_reserve_percentage
)
powerwall_mock.is_grid_services_active = Mock(return_value=grid_services_active)
return powerwall_mock

View file

@ -121,3 +121,15 @@ async def test_sensors(hass):
# HA changes the implementation and a new one appears
for key, value in expected_attributes.items():
assert state.attributes[key] == value
state = hass.states.get("sensor.powerwall_backup_reserve")
assert state.state == "15"
expected_attributes = {
"unit_of_measurement": PERCENTAGE,
"friendly_name": "Powerwall Backup Reserve",
"device_class": "battery",
}
# Only test for a subset of attributes in case
# HA changes the implementation and a new one appears
for key, value in expected_attributes.items():
assert state.attributes[key] == value