Add sensor to expose Powerwall backup reserve percentage (#66393)
This commit is contained in:
parent
974296697e
commit
d077c3b8d1
5 changed files with 43 additions and 1 deletions
|
@ -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(),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ class PowerwallData:
|
|||
meters: MetersAggregates
|
||||
grid_services_active: bool
|
||||
grid_status: GridStatus
|
||||
backup_reserve: float
|
||||
|
||||
|
||||
class PowerwallRuntimeData(TypedDict):
|
||||
|
|
|
@ -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."""
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue