mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Add sensor to expose Powerwall backup reserve percentage (#66393)
This commit is contained in:
parent
974296697e
commit
d077c3b8d1
@ -229,6 +229,7 @@ def _fetch_powerwall_data(power_wall: Powerwall) -> PowerwallData:
|
|||||||
meters=power_wall.get_meters(),
|
meters=power_wall.get_meters(),
|
||||||
grid_services_active=power_wall.is_grid_services_active(),
|
grid_services_active=power_wall.is_grid_services_active(),
|
||||||
grid_status=power_wall.get_grid_status(),
|
grid_status=power_wall.get_grid_status(),
|
||||||
|
backup_reserve=power_wall.get_backup_reserve_percentage(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ class PowerwallData:
|
|||||||
meters: MetersAggregates
|
meters: MetersAggregates
|
||||||
grid_services_active: bool
|
grid_services_active: bool
|
||||||
grid_status: GridStatus
|
grid_status: GridStatus
|
||||||
|
backup_reserve: float
|
||||||
|
|
||||||
|
|
||||||
class PowerwallRuntimeData(TypedDict):
|
class PowerwallRuntimeData(TypedDict):
|
||||||
|
@ -45,7 +45,11 @@ async def async_setup_entry(
|
|||||||
| PowerWallImportSensor
|
| PowerWallImportSensor
|
||||||
| PowerWallExportSensor
|
| PowerWallExportSensor
|
||||||
| PowerWallChargeSensor
|
| PowerWallChargeSensor
|
||||||
] = [PowerWallChargeSensor(powerwall_data)]
|
| PowerWallBackupReserveSensor
|
||||||
|
] = [
|
||||||
|
PowerWallChargeSensor(powerwall_data),
|
||||||
|
PowerWallBackupReserveSensor(powerwall_data),
|
||||||
|
]
|
||||||
|
|
||||||
for meter in data.meters.meters:
|
for meter in data.meters.meters:
|
||||||
entities.extend(
|
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):
|
class PowerWallEnergyDirectionSensor(PowerWallEntity, SensorEntity):
|
||||||
"""Representation of an Powerwall Direction Energy sensor."""
|
"""Representation of an Powerwall Direction Energy sensor."""
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ async def _mock_powerwall_with_fixtures(hass):
|
|||||||
status=PowerwallStatus(status),
|
status=PowerwallStatus(status),
|
||||||
device_type=DeviceType(device_type["device_type"]),
|
device_type=DeviceType(device_type["device_type"]),
|
||||||
serial_numbers=["TG0123456789AB", "TG9876543210BA"],
|
serial_numbers=["TG0123456789AB", "TG9876543210BA"],
|
||||||
|
backup_reserve_percentage=15.0,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -50,6 +51,7 @@ def _mock_powerwall_return_value(
|
|||||||
status=None,
|
status=None,
|
||||||
device_type=None,
|
device_type=None,
|
||||||
serial_numbers=None,
|
serial_numbers=None,
|
||||||
|
backup_reserve_percentage=None,
|
||||||
):
|
):
|
||||||
powerwall_mock = MagicMock(Powerwall("1.2.3.4"))
|
powerwall_mock = MagicMock(Powerwall("1.2.3.4"))
|
||||||
powerwall_mock.get_site_info = Mock(return_value=site_info)
|
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_status = Mock(return_value=status)
|
||||||
powerwall_mock.get_device_type = Mock(return_value=device_type)
|
powerwall_mock.get_device_type = Mock(return_value=device_type)
|
||||||
powerwall_mock.get_serial_numbers = Mock(return_value=serial_numbers)
|
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)
|
powerwall_mock.is_grid_services_active = Mock(return_value=grid_services_active)
|
||||||
|
|
||||||
return powerwall_mock
|
return powerwall_mock
|
||||||
|
@ -121,3 +121,15 @@ async def test_sensors(hass):
|
|||||||
# HA changes the implementation and a new one appears
|
# HA changes the implementation and a new one appears
|
||||||
for key, value in expected_attributes.items():
|
for key, value in expected_attributes.items():
|
||||||
assert state.attributes[key] == value
|
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…
x
Reference in New Issue
Block a user