Skip to content
Open
176 changes: 176 additions & 0 deletions custom_components/wiser/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie

binary_sensors = []

# System sensors
if data.wiserhub.system:
binary_sensors.extend(
[
WiserSummerDiscomfortPrevention(data, 0, "Summer Discomfort Prevention"),
WiserSummerComfortAvailable(data, 0, "Summer Comfort Available"),
WiserPCMDeviceLimitReached(data, 0, "PCM Device Limit Reached")
]
)

# Smoke alarm sensors
for device in data.wiserhub.devices.smokealarms.all:
binary_sensors.extend(
Expand All @@ -44,11 +54,23 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie
]
)

# Room binary sensors
for room in data.wiserhub.rooms.all:
binary_sensors.extend(
[
WiserRoomWindow(data, room.id, "Window Detection Active"),
# WiserRoomWindow(data, room.id, "Window State"),
]
)

# Light sensors
for device in data.wiserhub.devices.lights.all:
binary_sensors.extend(
[
WiserStateIsDimmable(data, device.id, "Is Dimmable"),
WiserStateIsDimmable(data, device.id, "Is LED Indicator Supported"),
WiserStateIsDimmable(data, device.id, "Is Output Mode Supported"),
WiserStateIsDimmable(data, device.id, "Is Power On Behaviour Supported"),
]
)

Expand Down Expand Up @@ -143,6 +165,112 @@ def device_info(self):
}


class SystemBinarySensor(CoordinatorEntity, BinarySensorEntity):
"""Base binary sensor class."""

def __init__(self, coordinator, device_id=0, sensor_type="") -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self._data = coordinator
self._device_name = None
self._sensor_type = sensor_type
self._state = getattr(self._data.wiserhub.system, self._sensor_type.replace(" ", "_").lower())
_LOGGER.debug(
f"{self._data.wiserhub.system.name} {self.name} initalise" # noqa: E501
)

@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
_LOGGER.debug(f"{self.name} device update requested")
HeatHub = self._data.wiserhub.system.name
HeatHub = HeatHub.replace("WiserHeat","HeatHub")
return f"{HeatHub} {self._sensor_type}"

@property
def is_on(self):
"""Return the state of the sensor."""
return self._state

@property
def name(self):
"""Return the name of the sensor."""
# return f"{get_device_name(self._data, self._data.wiserhub.system)} {self._sensor_type}"
HeatHub = self._data.wiserhub.system.name
HeatHub = HeatHub.replace("WiserHeat","HeatHub")
return f"{HeatHub} {self._sensor_type}"

@property
def unique_id(self):
"""Return uniqueid."""
return get_unique_id(self._data, "sensor", self._sensor_type, self.name)

@property
def device_info(self):
"""Return device specific attributes."""
return {
"name": get_device_name(self._data, 0),
"identifiers": {(DOMAIN, get_identifier(self._data, 0))},
"manufacturer": MANUFACTURER,
"model": self._data.wiserhub.system.product_type,
"sw_version": self._data.wiserhub.system.firmware_version,
"via_device": (DOMAIN, self._data.wiserhub.system.name),
}


class RoomBinarySensor(CoordinatorEntity, BinarySensorEntity):
"""Base binary sensor class."""

def __init__(self, coordinator, room_id=0, sensor_type="") -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self._data = coordinator
self._room_id = room_id
self._room = self._data.wiserhub.rooms.get_by_id(self._room_id)
self._room_name = None
self._sensor_type = sensor_type
self._state = getattr(self._room, self._sensor_type.replace(" ", "_").lower())
_LOGGER.debug(
f"{self._data.wiserhub.system.name} {self.name} initalise" # noqa: E501
)

@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
_LOGGER.debug(f"{self.name} device update requested")
self._room = self._data.wiserhub.rooms.get_by_id(self._room_id)
self._state = getattr(self._room, self._sensor_type.replace(" ", "_").lower())
self.async_write_ha_state()

@property
def is_on(self):
"""Return the state of the sensor."""
return self._state

@property
def name(self):
"""Return the name of the sensor."""
return f"{get_room_name(self._data, self._room_id)} {self._sensor_type}"
#return f"{get_device_name(self._data, self._room_id, "room")} {self._sensor_type}",

@property
def unique_id(self):
"""Return uniqueid."""
return get_unique_id(self._data, "sensor", self._sensor_type, self._room_id)

@property
def device_info(self):
"""Return device specific attributes."""
return {
"name": get_room_name(self._data, self._room_id ),
"identifiers": {(DOMAIN, get_identifier(self._data, self._room_id, "room"))},
"manufacturer": MANUFACTURER,
"model": self._data.wiserhub.system.product_type,
"sw_version": self._data.wiserhub.system.firmware_version,
"via_device": (DOMAIN, self._data.wiserhub.system.name),
}


class WiserSmokeAlarm(BaseBinarySensor):
"""Smoke Alarm sensor."""

Expand Down Expand Up @@ -193,6 +321,30 @@ class WiserEquipment(BaseBinarySensor):
"""Base binary sensor class."""


## binary sensor of System

class WiserSummerDiscomfortPrevention(SystemBinarySensor):
"""Summer Discomfort Prevention sensor."""
_attr_device_class = BinarySensorDeviceClass.HEAT

@property
def extra_state_attributes(self):
"""Return the state attributes of Summer discomfort prevention."""
attrs = {}
attrs["indoor_discomfort_temperature"] = self._data.wiserhub.system.indoor_discomfort_temperature
attrs["outdoor_discomfort_temperature"] = self._data.wiserhub.system.outdoor_discomfort_temperature
return attrs

class WiserSummerComfortAvailable(SystemBinarySensor):
"""Summer Comfort Available sensor."""
_attr_icon = "mdi:sofa"
_attr_device_class = BinarySensorDeviceClass.HEAT

class WiserPCMDeviceLimitReached(SystemBinarySensor):
"""Summer Comfort Available sensor."""
_attr_device_class = BinarySensorDeviceClass.POWER


class WiserStateIsDimmable(BaseBinarySensor):
"""Light IsDimmable sensor."""

Expand All @@ -214,3 +366,27 @@ class WiserStateIsClosed(BaseBinarySensor):

_attr_device_class = BinarySensorDeviceClass.OPENING
_attr_icon = "mdi:window-shutter"


## binary sensor of Room
class WiserRoomWindow(RoomBinarySensor):
"""Window of room sensor."""
_attr_device_class = BinarySensorDeviceClass.WINDOW

#Windowdoor
class WiserStateActive(BaseBinarySensor):
"""WindowDoor sensor."""

@property
def extra_state_attributes(self):
"""Return the state attributes of WindowDoor sensor."""
attrs = {}
if self._data.wiserhub.devices.binary_sensor.get_by_id(
self._device_id
).type == "Door" :
attrs["device_class"] = BinarySensorDeviceClass.DOOR
else: attrs["device_class"] = BinarySensorDeviceClass.WINDOW
attrs["type"] = self._data.wiserhub.devices.binary_sensor.get_by_id(
self._device_id
).type
return attrs
2 changes: 1 addition & 1 deletion custom_components/wiser/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from enum import StrEnum

VERSION = "3.4.19"
VERSION = "3.4.20"
DOMAIN = "wiser"
DATA_WISER_CONFIG = "wiser_config"
URL_BASE = "/wiser"
Expand Down
2 changes: 1 addition & 1 deletion custom_components/wiser/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"requirements": [
"aioWiserHeatAPI==1.7.3"
],
"version": "3.4.19",
"version": "3.4.20",
"zeroconf": [
{
"type": "_http._tcp.local.",
Expand Down
1 change: 1 addition & 0 deletions custom_components/wiser/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,3 +417,4 @@ async def async_set_native_value(self, value: float) -> None:
_LOGGER.debug(f"Setting {self._name} to {value}C")
await self._data.wiserhub.system.set_outdoor_discomfort_temperature(value)
await self.async_force_update()

8 changes: 5 additions & 3 deletions custom_components/wiser/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie
_LOGGER.debug("Setting up Light mode select")
for light in data.wiserhub.devices.lights.all:
wiser_selects.extend([WiserLightModeSelect(data, light.id)])
if light.is_led_indicator_supported:
wiser_selects.extend([WiserLightLedIndicatorSelect(data, light.id)])

if light.is_dimmable:
if light.is_led_indicator_supported:
wiser_selects.extend([WiserLightLedIndicatorSelect(data, light.id)])
# if light.is_led_indicator_supported:
# wiser_selects.extend([WiserLightLedIndicatorSelect(data, light.id)])
if light.is_power_on_behaviour_supported:
wiser_selects.extend(
[WiserLightPowerOnBehaviourSelect(data, light.id)]
Expand Down Expand Up @@ -345,7 +347,7 @@ def current_option(self) -> str:
async def async_select_option(self, option: str) -> None:
_LOGGER.debug(f"Setting {self.name} to {option}")
if option in self._options:
await self.async_set_led_indicator(option)
await self._device.set_led_indicator(option)
await self.async_force_update()
else:
_LOGGER.error(
Expand Down
Loading
Loading