diff --git a/.coveragerc b/.coveragerc index e37e70e2c93..fed57af6ad7 100644 --- a/.coveragerc +++ b/.coveragerc @@ -437,6 +437,7 @@ omit = homeassistant/components/foscam/__init__.py homeassistant/components/foscam/camera.py homeassistant/components/foscam/coordinator.py + homeassistant/components/foscam/entity.py homeassistant/components/foursquare/* homeassistant/components/free_mobile/notify.py homeassistant/components/freebox/camera.py diff --git a/homeassistant/components/foscam/camera.py b/homeassistant/components/foscam/camera.py index 343868afb56..6674bff81e0 100644 --- a/homeassistant/components/foscam/camera.py +++ b/homeassistant/components/foscam/camera.py @@ -10,9 +10,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv, entity_platform -from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import ( CONF_RTSP_PORT, @@ -23,6 +21,7 @@ from .const import ( SERVICE_PTZ_PRESET, ) from .coordinator import FoscamCoordinator +from .entity import FoscamEntity DIR_UP = "up" DIR_DOWN = "down" @@ -94,7 +93,7 @@ async def async_setup_entry( async_add_entities([HassFoscamCamera(coordinator, config_entry)]) -class HassFoscamCamera(CoordinatorEntity[FoscamCoordinator], Camera): +class HassFoscamCamera(FoscamEntity, Camera): """An implementation of a Foscam IP camera.""" _attr_has_entity_name = True @@ -106,7 +105,7 @@ class HassFoscamCamera(CoordinatorEntity[FoscamCoordinator], Camera): config_entry: ConfigEntry, ) -> None: """Initialize a Foscam camera.""" - super().__init__(coordinator) + super().__init__(coordinator, config_entry.entry_id) Camera.__init__(self) self._foscam_session = coordinator.session @@ -118,16 +117,6 @@ class HassFoscamCamera(CoordinatorEntity[FoscamCoordinator], Camera): if self._rtsp_port: self._attr_supported_features = CameraEntityFeature.STREAM - self._attr_device_info = DeviceInfo( - identifiers={(DOMAIN, config_entry.entry_id)}, - manufacturer="Foscam", - name=config_entry.title, - ) - if dev_info := coordinator.data.get("dev_info"): - self._attr_device_info["model"] = dev_info["productName"] - self._attr_device_info["sw_version"] = dev_info["firmwareVer"] - self._attr_device_info["hw_version"] = dev_info["hardwareVer"] - async def async_added_to_hass(self) -> None: """Handle entity addition to hass.""" # Get motion detection status diff --git a/homeassistant/components/foscam/entity.py b/homeassistant/components/foscam/entity.py new file mode 100644 index 00000000000..ebcd9574e32 --- /dev/null +++ b/homeassistant/components/foscam/entity.py @@ -0,0 +1,30 @@ +"""Component providing basic support for Foscam IP cameras.""" +from __future__ import annotations + +from homeassistant.const import ATTR_HW_VERSION, ATTR_MODEL, ATTR_SW_VERSION +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from .const import DOMAIN +from .coordinator import FoscamCoordinator + + +class FoscamEntity(CoordinatorEntity[FoscamCoordinator]): + """Base entity for Foscam camera.""" + + def __init__( + self, + coordinator: FoscamCoordinator, + entry_id: str, + ) -> None: + """Initialize the base Foscam entity.""" + super().__init__(coordinator) + + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, entry_id)}, + manufacturer="Foscam", + ) + if dev_info := coordinator.data.get("dev_info"): + self._attr_device_info[ATTR_MODEL] = dev_info["productName"] + self._attr_device_info[ATTR_SW_VERSION] = dev_info["firmwareVer"] + self._attr_device_info[ATTR_HW_VERSION] = dev_info["hardwareVer"]