Add Modern Forms binary sensor platform (#52312)
Co-authored-by: Erik Montnemery <erik@montnemery.com> Co-authored-by: Franck Nijhof <frenck@frenck.nl>
This commit is contained in:
parent
3902f0bdd4
commit
3e4dacb885
3 changed files with 162 additions and 0 deletions
|
@ -11,6 +11,7 @@ from aiomodernforms import (
|
||||||
)
|
)
|
||||||
from aiomodernforms.models import Device as ModernFormsDeviceState
|
from aiomodernforms.models import Device as ModernFormsDeviceState
|
||||||
|
|
||||||
|
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||||
from homeassistant.components.fan import DOMAIN as FAN_DOMAIN
|
from homeassistant.components.fan import DOMAIN as FAN_DOMAIN
|
||||||
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
||||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||||
|
@ -30,6 +31,7 @@ from .const import ATTR_IDENTIFIERS, ATTR_MANUFACTURER, DOMAIN
|
||||||
|
|
||||||
SCAN_INTERVAL = timedelta(seconds=5)
|
SCAN_INTERVAL = timedelta(seconds=5)
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
|
BINARY_SENSOR_DOMAIN,
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
FAN_DOMAIN,
|
FAN_DOMAIN,
|
||||||
SENSOR_DOMAIN,
|
SENSOR_DOMAIN,
|
||||||
|
|
114
homeassistant/components/modern_forms/binary_sensor.py
Normal file
114
homeassistant/components/modern_forms/binary_sensor.py
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
"""Support for Modern Forms Binary Sensors."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from homeassistant.components.binary_sensor import BinarySensorEntity
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
from homeassistant.util import dt as dt_util
|
||||||
|
|
||||||
|
from . import ModernFormsDataUpdateCoordinator, ModernFormsDeviceEntity
|
||||||
|
from .const import CLEAR_TIMER, DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
|
) -> None:
|
||||||
|
"""Set up Modern Forms binary sensors."""
|
||||||
|
coordinator: ModernFormsDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
|
||||||
|
binary_sensors: list[ModernFormsBinarySensor] = [
|
||||||
|
ModernFormsFanSleepTimerActive(entry.entry_id, coordinator),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Only setup light sleep timer sensor if light unit installed
|
||||||
|
if coordinator.data.info.light_type:
|
||||||
|
binary_sensors.append(
|
||||||
|
ModernFormsLightSleepTimerActive(entry.entry_id, coordinator)
|
||||||
|
)
|
||||||
|
|
||||||
|
async_add_entities(binary_sensors)
|
||||||
|
|
||||||
|
|
||||||
|
class ModernFormsBinarySensor(ModernFormsDeviceEntity, BinarySensorEntity):
|
||||||
|
"""Defines a Modern Forms binary sensor."""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
entry_id: str,
|
||||||
|
coordinator: ModernFormsDataUpdateCoordinator,
|
||||||
|
name: str,
|
||||||
|
icon: str,
|
||||||
|
key: str,
|
||||||
|
) -> None:
|
||||||
|
"""Initialize Modern Forms switch."""
|
||||||
|
super().__init__(
|
||||||
|
entry_id=entry_id, coordinator=coordinator, name=name, icon=icon
|
||||||
|
)
|
||||||
|
|
||||||
|
self._attr_unique_id = f"{coordinator.data.info.mac_address}_{key}"
|
||||||
|
|
||||||
|
|
||||||
|
class ModernFormsLightSleepTimerActive(ModernFormsBinarySensor):
|
||||||
|
"""Defines a Modern Forms Light Sleep Timer Active sensor."""
|
||||||
|
|
||||||
|
_attr_entity_registry_enabled_default = False
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, entry_id: str, coordinator: ModernFormsDataUpdateCoordinator
|
||||||
|
) -> None:
|
||||||
|
"""Initialize Modern Forms Light Sleep Timer Active sensor."""
|
||||||
|
super().__init__(
|
||||||
|
coordinator=coordinator,
|
||||||
|
entry_id=entry_id,
|
||||||
|
icon="mdi:av-timer",
|
||||||
|
key="light_sleep_timer_active",
|
||||||
|
name=f"{coordinator.data.info.device_name} Light Sleep Timer Active",
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_on(self) -> bool:
|
||||||
|
"""Return the state of the timer."""
|
||||||
|
return not (
|
||||||
|
self.coordinator.data.state.light_sleep_timer == CLEAR_TIMER
|
||||||
|
or (
|
||||||
|
dt_util.utc_from_timestamp(
|
||||||
|
self.coordinator.data.state.light_sleep_timer
|
||||||
|
)
|
||||||
|
- dt_util.utcnow()
|
||||||
|
).total_seconds()
|
||||||
|
< 0
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ModernFormsFanSleepTimerActive(ModernFormsBinarySensor):
|
||||||
|
"""Defines a Modern Forms Fan Sleep Timer Active sensor."""
|
||||||
|
|
||||||
|
_attr_entity_registry_enabled_default = False
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, entry_id: str, coordinator: ModernFormsDataUpdateCoordinator
|
||||||
|
) -> None:
|
||||||
|
"""Initialize Modern Forms Fan Sleep Timer Active sensor."""
|
||||||
|
super().__init__(
|
||||||
|
coordinator=coordinator,
|
||||||
|
entry_id=entry_id,
|
||||||
|
icon="mdi:av-timer",
|
||||||
|
key="fan_sleep_timer_active",
|
||||||
|
name=f"{coordinator.data.info.device_name} Fan Sleep Timer Active",
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_on(self) -> bool:
|
||||||
|
"""Return the state of the timer."""
|
||||||
|
return not (
|
||||||
|
self.coordinator.data.state.fan_sleep_timer == CLEAR_TIMER
|
||||||
|
or (
|
||||||
|
dt_util.utc_from_timestamp(self.coordinator.data.state.fan_sleep_timer)
|
||||||
|
- dt_util.utcnow()
|
||||||
|
).total_seconds()
|
||||||
|
< 0
|
||||||
|
)
|
46
tests/components/modern_forms/test_binary_sensor.py
Normal file
46
tests/components/modern_forms/test_binary_sensor.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
"""Tests for the Modern Forms sensor platform."""
|
||||||
|
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||||
|
from homeassistant.components.modern_forms.const import DOMAIN
|
||||||
|
from homeassistant.const import ATTR_ICON
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers import entity_registry as er
|
||||||
|
|
||||||
|
from tests.components.modern_forms import init_integration
|
||||||
|
from tests.test_util.aiohttp import AiohttpClientMocker
|
||||||
|
|
||||||
|
|
||||||
|
async def test_binary_sensors(
|
||||||
|
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
|
||||||
|
) -> None:
|
||||||
|
"""Test the creation and values of the Modern Forms sensors."""
|
||||||
|
|
||||||
|
registry = er.async_get(hass)
|
||||||
|
|
||||||
|
registry.async_get_or_create(
|
||||||
|
BINARY_SENSOR_DOMAIN,
|
||||||
|
DOMAIN,
|
||||||
|
"AA:BB:CC:DD:EE:FF_light_sleep_timer_active",
|
||||||
|
suggested_object_id="modernformsfan_light_sleep_timer_active",
|
||||||
|
disabled_by=None,
|
||||||
|
)
|
||||||
|
registry.async_get_or_create(
|
||||||
|
BINARY_SENSOR_DOMAIN,
|
||||||
|
DOMAIN,
|
||||||
|
"AA:BB:CC:DD:EE:FF_fan_sleep_timer_active",
|
||||||
|
suggested_object_id="modernformsfan_fan_sleep_timer_active",
|
||||||
|
disabled_by=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
await init_integration(hass, aioclient_mock)
|
||||||
|
|
||||||
|
# Light timer remaining time
|
||||||
|
state = hass.states.get("binary_sensor.modernformsfan_light_sleep_timer_active")
|
||||||
|
assert state
|
||||||
|
assert state.attributes.get(ATTR_ICON) == "mdi:av-timer"
|
||||||
|
assert state.state == "off"
|
||||||
|
|
||||||
|
# Fan timer remaining time
|
||||||
|
state = hass.states.get("binary_sensor.modernformsfan_fan_sleep_timer_active")
|
||||||
|
assert state
|
||||||
|
assert state.attributes.get(ATTR_ICON) == "mdi:av-timer"
|
||||||
|
assert state.state == "off"
|
Loading…
Add table
Reference in a new issue