diff --git a/.coveragerc b/.coveragerc index 1d291610bc18ed4c9bd55cafe83c4ca9280b14aa..511f30c507e8c467ce31f99b4e5c3a73c68d6e3c 100644 --- a/.coveragerc +++ b/.coveragerc @@ -709,6 +709,7 @@ omit = homeassistant/components/lupusec/__init__.py homeassistant/components/lupusec/alarm_control_panel.py homeassistant/components/lupusec/binary_sensor.py + homeassistant/components/lupusec/entity.py homeassistant/components/lupusec/switch.py homeassistant/components/lutron/__init__.py homeassistant/components/lutron/binary_sensor.py diff --git a/homeassistant/components/lupusec/__init__.py b/homeassistant/components/lupusec/__init__.py index b55c203b0e7c9c074aecd80f37b0b531327c6fd7..7493059e9e9effb1790e1abe50d97bf9d4c90130 100644 --- a/homeassistant/components/lupusec/__init__.py +++ b/homeassistant/components/lupusec/__init__.py @@ -17,7 +17,6 @@ from homeassistant.const import ( from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant from homeassistant.data_entry_flow import FlowResultType from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.entity import Entity from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue from homeassistant.helpers.typing import ConfigType @@ -139,21 +138,3 @@ class LupusecSystem: def __init__(self, username, password, ip_address) -> None: """Initialize the system.""" self.lupusec = lupupy.Lupusec(username, password, ip_address) - - -class LupusecDevice(Entity): - """Representation of a Lupusec device.""" - - def __init__(self, data, device) -> None: - """Initialize a sensor for Lupusec device.""" - self._data = data - self._device = device - - def update(self): - """Update automation state.""" - self._device.refresh() - - @property - def name(self): - """Return the name of the sensor.""" - return self._device.name diff --git a/homeassistant/components/lupusec/alarm_control_panel.py b/homeassistant/components/lupusec/alarm_control_panel.py index 8dd2ecb8b9c03b79e7a3a3cdffbead1ef7bacacc..2a904c34410d600e660df747c86cf7f6af34f01d 100644 --- a/homeassistant/components/lupusec/alarm_control_panel.py +++ b/homeassistant/components/lupusec/alarm_control_panel.py @@ -15,9 +15,11 @@ from homeassistant.const import ( STATE_ALARM_TRIGGERED, ) from homeassistant.core import HomeAssistant +from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import DOMAIN as LUPUSEC_DOMAIN, LupusecDevice +from . import DOMAIN +from .entity import LupusecDevice SCAN_INTERVAL = timedelta(seconds=2) @@ -28,9 +30,11 @@ async def async_setup_entry( async_add_devices: AddEntitiesCallback, ) -> None: """Set up an alarm control panel for a Lupusec device.""" - data = hass.data[LUPUSEC_DOMAIN][config_entry.entry_id] + data = hass.data[DOMAIN][config_entry.entry_id] - alarm_devices = [LupusecAlarm(data, data.lupusec.get_alarm())] + alarm_devices = [ + LupusecAlarm(data, data.lupusec.get_alarm(), config_entry.entry_id) + ] async_add_devices(alarm_devices) @@ -38,12 +42,24 @@ async def async_setup_entry( class LupusecAlarm(LupusecDevice, AlarmControlPanelEntity): """An alarm_control_panel implementation for Lupusec.""" + _attr_name = None _attr_icon = "mdi:security" _attr_supported_features = ( AlarmControlPanelEntityFeature.ARM_HOME | AlarmControlPanelEntityFeature.ARM_AWAY ) + def __init__(self, data, device, entry_id) -> None: + """Initialize the LupusecAlarm class.""" + super().__init__(data, device, entry_id) + self._attr_unique_id = entry_id + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, entry_id)}, + name=device.name, + manufacturer="Lupus Electronics", + model=f"Lupusec-XT{data.lupusec.model}", + ) + @property def state(self) -> str | None: """Return the state of the device.""" diff --git a/homeassistant/components/lupusec/binary_sensor.py b/homeassistant/components/lupusec/binary_sensor.py index 0819d30e1fcd3c1472ff1abeedc8d7e9c6c9e7aa..06a07c070c6b953b8b332fa7724bbe6298042aec 100644 --- a/homeassistant/components/lupusec/binary_sensor.py +++ b/homeassistant/components/lupusec/binary_sensor.py @@ -14,7 +14,8 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import DOMAIN, LupusecDevice +from . import DOMAIN +from .entity import LupusecBaseSensor SCAN_INTERVAL = timedelta(seconds=2) @@ -34,14 +35,16 @@ async def async_setup_entry( sensors = [] for device in data.lupusec.get_devices(generic_type=device_types): - sensors.append(LupusecBinarySensor(data, device)) + sensors.append(LupusecBinarySensor(data, device, config_entry.entry_id)) async_add_devices(sensors) -class LupusecBinarySensor(LupusecDevice, BinarySensorEntity): +class LupusecBinarySensor(LupusecBaseSensor, BinarySensorEntity): """A binary sensor implementation for Lupusec device.""" + _attr_name = None + @property def is_on(self): """Return True if the binary sensor is on.""" diff --git a/homeassistant/components/lupusec/const.py b/homeassistant/components/lupusec/const.py index 08aee7184409ab1517665849c664b27cb8469b3d..489d878306d43ed1768a192ad5647fa73c08e286 100644 --- a/homeassistant/components/lupusec/const.py +++ b/homeassistant/components/lupusec/const.py @@ -1,6 +1,39 @@ """Constants for the Lupusec component.""" +from lupupy.constants import ( + TYPE_CONTACT_XT, + TYPE_DOOR, + TYPE_INDOOR_SIREN_XT, + TYPE_KEYPAD_V2, + TYPE_OUTDOOR_SIREN_XT, + TYPE_POWER_SWITCH, + TYPE_POWER_SWITCH_1_XT, + TYPE_POWER_SWITCH_2_XT, + TYPE_SMOKE, + TYPE_SMOKE_XT, + TYPE_WATER, + TYPE_WATER_XT, + TYPE_WINDOW, +) + DOMAIN = "lupusec" INTEGRATION_TITLE = "Lupus Electronics LUPUSEC" ISSUE_PLACEHOLDER = {"url": "/config/integrations/dashboard/add?domain=lupusec"} + + +TYPE_TRANSLATION = { + TYPE_WINDOW: "Fensterkontakt", + TYPE_DOOR: "Türkontakt", + TYPE_SMOKE: "Rauchmelder", + TYPE_WATER: "Wassermelder", + TYPE_POWER_SWITCH: "Steckdose", + TYPE_CONTACT_XT: "Fenster- / Türkontakt V2", + TYPE_WATER_XT: "Wassermelder V2", + TYPE_SMOKE_XT: "Rauchmelder V2", + TYPE_POWER_SWITCH_1_XT: "Funksteckdose", + TYPE_POWER_SWITCH_2_XT: "Funksteckdose V2", + TYPE_KEYPAD_V2: "Keypad V2", + TYPE_INDOOR_SIREN_XT: "Innensirene", + TYPE_OUTDOOR_SIREN_XT: "Außensirene V2", +} diff --git a/homeassistant/components/lupusec/entity.py b/homeassistant/components/lupusec/entity.py new file mode 100644 index 0000000000000000000000000000000000000000..208a0edafaac005f83eae40a4c16816115120902 --- /dev/null +++ b/homeassistant/components/lupusec/entity.py @@ -0,0 +1,42 @@ +"""Provides the Lupusec entity for Home Assistant.""" +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.entity import Entity + +from .const import DOMAIN, TYPE_TRANSLATION + + +class LupusecDevice(Entity): + """Representation of a Lupusec device.""" + + _attr_has_entity_name = True + + def __init__(self, data, device, entry_id) -> None: + """Initialize a sensor for Lupusec device.""" + self._data = data + self._device = device + self._attr_unique_id = device.device_id + + def update(self): + """Update automation state.""" + self._device.refresh() + + +class LupusecBaseSensor(LupusecDevice): + """Lupusec Sensor base entity.""" + + def __init__(self, data, device, entry_id) -> None: + """Initialize the LupusecBaseSensor.""" + super().__init__(data, device, entry_id) + + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, device.device_id)}, + name=device.name, + manufacturer="Lupus Electronics", + serial_number=device.device_id, + model=TYPE_TRANSLATION.get(device.type, device.type), + via_device=(DOMAIN, entry_id), + ) + + def get_type_name(self): + """Return the type of the sensor.""" + return TYPE_TRANSLATION.get(self._device.type, self._device.type) diff --git a/homeassistant/components/lupusec/switch.py b/homeassistant/components/lupusec/switch.py index 582d72b7cfec62b41c0eb74923e886a78680f039..7b87b2cac55a8e1bec09fc33667f6fd3d65683f3 100644 --- a/homeassistant/components/lupusec/switch.py +++ b/homeassistant/components/lupusec/switch.py @@ -11,7 +11,8 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import DOMAIN, LupusecDevice +from . import DOMAIN +from .entity import LupusecBaseSensor SCAN_INTERVAL = timedelta(seconds=2) @@ -29,14 +30,16 @@ async def async_setup_entry( switches = [] for device in data.lupusec.get_devices(generic_type=device_types): - switches.append(LupusecSwitch(data, device)) + switches.append(LupusecSwitch(data, device, config_entry.entry_id)) async_add_devices(switches) -class LupusecSwitch(LupusecDevice, SwitchEntity): +class LupusecSwitch(LupusecBaseSensor, SwitchEntity): """Representation of a Lupusec switch.""" + _attr_name = None + def turn_on(self, **kwargs: Any) -> None: """Turn on the device.""" self._device.switch_on()