Skip to content

Commit

Permalink
Add device info to lupusec (home-assistant#108910)
Browse files Browse the repository at this point in the history
* added device info and unique id

* removed wrong attribute

* added base entity

* rename domain

* added entity.py to coveragerc

* added base entity for sensors and alarm panel

* add generic type translation

* rename functions

* rename device name to device model

* set _attr_name = None

* pass in only the entry_id instead of the full config_entry

* set unique id to device_id or entry id

* use deviceinfo class

* moved     _attr_name = None to entities

* Update homeassistant/components/lupusec/alarm_control_panel.py

Co-authored-by: Joost Lekkerkerker <[email protected]>

* Update homeassistant/components/lupusec/entity.py

Co-authored-by: Joost Lekkerkerker <[email protected]>

* Update homeassistant/components/lupusec/entity.py

Co-authored-by: Joost Lekkerkerker <[email protected]>

* remove DOMAIN from unique id

* removed redundant function

* Update homeassistant/components/lupusec/alarm_control_panel.py

Co-authored-by: Joost Lekkerkerker <[email protected]>

* Update homeassistant/components/lupusec/entity.py

Co-authored-by: Joost Lekkerkerker <[email protected]>

---------

Co-authored-by: suaveolent <[email protected]>
Co-authored-by: Joost Lekkerkerker <[email protected]>
  • Loading branch information
3 people authored Jan 28, 2024
1 parent 9413d15 commit f2100f8
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 28 deletions.
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 0 additions & 19 deletions homeassistant/components/lupusec/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
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

Expand Down Expand Up @@ -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
22 changes: 19 additions & 3 deletions homeassistant/components/lupusec/alarm_control_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
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)

Expand All @@ -28,22 +30,36 @@ 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)


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."""
Expand Down
9 changes: 6 additions & 3 deletions homeassistant/components/lupusec/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
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)

Expand All @@ -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."""
Expand Down
33 changes: 33 additions & 0 deletions homeassistant/components/lupusec/const.py
Original file line number Diff line number Diff line change
@@ -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",
}
42 changes: 42 additions & 0 deletions homeassistant/components/lupusec/entity.py
Original file line number Diff line number Diff line change
@@ -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)
9 changes: 6 additions & 3 deletions homeassistant/components/lupusec/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
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)

Expand All @@ -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()
Expand Down

0 comments on commit f2100f8

Please sign in to comment.