mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Move device ABCs to separate helper file
This commit is contained in:
parent
68668fc658
commit
3e15742875
@ -1,7 +1,7 @@
|
|||||||
""" Provides demo lights. """
|
""" Provides demo lights. """
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
||||||
from homeassistant.components.light import ATTR_BRIGHTNESS, ATTR_XY_COLOR
|
from homeassistant.components.light import ATTR_BRIGHTNESS, ATTR_XY_COLOR
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ from urllib.parse import urlparse
|
|||||||
|
|
||||||
from homeassistant.loader import get_component
|
from homeassistant.loader import get_component
|
||||||
import homeassistant.util as util
|
import homeassistant.util as util
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
from homeassistant.const import CONF_HOST
|
from homeassistant.const import CONF_HOST
|
||||||
from homeassistant.components.light import (
|
from homeassistant.components.light import (
|
||||||
ATTR_BRIGHTNESS, ATTR_XY_COLOR, ATTR_TRANSITION,
|
ATTR_BRIGHTNESS, ATTR_XY_COLOR, ATTR_TRANSITION,
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
# pylint: disable=no-name-in-module, import-error
|
# pylint: disable=no-name-in-module, import-error
|
||||||
from homeassistant.components.light import ATTR_BRIGHTNESS
|
from homeassistant.components.light import ATTR_BRIGHTNESS
|
||||||
from homeassistant.const import ATTR_FRIENDLY_NAME
|
from homeassistant.const import ATTR_FRIENDLY_NAME
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
import tellcore.constants as tellcore_constants
|
import tellcore.constants as tellcore_constants
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ Component to interface with various media players
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.components import discovery
|
from homeassistant.components import discovery
|
||||||
from homeassistant.helpers import Device
|
from homeassistant.helpers.device import Device
|
||||||
from homeassistant.helpers.device_component import DeviceComponent
|
from homeassistant.helpers.device_component import DeviceComponent
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ENTITY_ID, SERVICE_TURN_OFF, SERVICE_VOLUME_UP,
|
ATTR_ENTITY_ID, SERVICE_TURN_OFF, SERVICE_VOLUME_UP,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
""" Support for Wink sensors. """
|
""" Support for Wink sensors. """
|
||||||
from homeassistant.helpers import Device
|
from homeassistant.helpers.device import Device
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
TEMP_CELCIUS, ATTR_UNIT_OF_MEASUREMENT, ATTR_FRIENDLY_NAME)
|
TEMP_CELCIUS, ATTR_UNIT_OF_MEASUREMENT, ATTR_FRIENDLY_NAME)
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ import tellcore.constants as tellcore_constants
|
|||||||
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_FRIENDLY_NAME, ATTR_UNIT_OF_MEASUREMENT, TEMP_CELCIUS)
|
ATTR_FRIENDLY_NAME, ATTR_UNIT_OF_MEASUREMENT, TEMP_CELCIUS)
|
||||||
from homeassistant.helpers import Device
|
from homeassistant.helpers.device import Device
|
||||||
|
|
||||||
DatatypeDescription = namedtuple("DatatypeDescription", ['name', 'unit'])
|
DatatypeDescription = namedtuple("DatatypeDescription", ['name', 'unit'])
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ from openzwave.network import ZWaveNetwork
|
|||||||
from pydispatch import dispatcher
|
from pydispatch import dispatcher
|
||||||
|
|
||||||
import homeassistant.components.zwave as zwave
|
import homeassistant.components.zwave as zwave
|
||||||
from homeassistant.helpers import Device
|
from homeassistant.helpers.device import Device
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_BATTERY_LEVEL, ATTR_UNIT_OF_MEASUREMENT, STATE_ON, STATE_OFF,
|
ATTR_BATTERY_LEVEL, ATTR_UNIT_OF_MEASUREMENT, STATE_ON, STATE_OFF,
|
||||||
TEMP_CELCIUS, TEMP_FAHRENHEIT, ATTR_LOCATION)
|
TEMP_CELCIUS, TEMP_FAHRENHEIT, ATTR_LOCATION)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
""" Demo platform that has two fake switchces. """
|
""" Demo platform that has two fake switchces. """
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
|
|
||||||
from homeassistant.const import ATTR_FRIENDLY_NAME
|
from homeassistant.const import ATTR_FRIENDLY_NAME
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
import tellcore.constants as tellcore_constants
|
import tellcore.constants as tellcore_constants
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
""" Support for WeMo switchces. """
|
""" Support for WeMo switchces. """
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
from homeassistant.components.switch import (
|
from homeassistant.components.switch import (
|
||||||
ATTR_TODAY_MWH, ATTR_CURRENT_POWER_MWH)
|
ATTR_TODAY_MWH, ATTR_CURRENT_POWER_MWH)
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import logging
|
|||||||
from homeassistant.helpers.device_component import DeviceComponent
|
from homeassistant.helpers.device_component import DeviceComponent
|
||||||
|
|
||||||
import homeassistant.util as util
|
import homeassistant.util as util
|
||||||
from homeassistant.helpers import Device, extract_entity_ids
|
from homeassistant.helpers.device import Device
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ENTITY_ID, ATTR_TEMPERATURE, ATTR_UNIT_OF_MEASUREMENT,
|
ATTR_ENTITY_ID, ATTR_TEMPERATURE, ATTR_UNIT_OF_MEASUREMENT,
|
||||||
STATE_ON, STATE_OFF)
|
STATE_ON, STATE_OFF)
|
||||||
|
@ -3,14 +3,15 @@ Helper methods for components within Home Assistant.
|
|||||||
"""
|
"""
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from homeassistant import NoEntitySpecifiedError
|
|
||||||
|
|
||||||
from homeassistant.loader import get_component
|
from homeassistant.loader import get_component
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ENTITY_ID, ATTR_FRIENDLY_NAME, STATE_ON, STATE_OFF, CONF_PLATFORM,
|
ATTR_ENTITY_ID, CONF_PLATFORM, CONF_TYPE, DEVICE_DEFAULT_NAME)
|
||||||
CONF_TYPE, DEVICE_DEFAULT_NAME)
|
|
||||||
from homeassistant.util import ensure_unique_string, slugify
|
from homeassistant.util import ensure_unique_string, slugify
|
||||||
|
|
||||||
|
# Deprecated 3/5/2015 - Moved to homeassistant.helpers.device
|
||||||
|
# pylint: disable=unused-import
|
||||||
|
from .device import Device, ToggleDevice # noqa
|
||||||
|
|
||||||
|
|
||||||
def generate_entity_id(entity_id_format, name, current_ids=None, hass=None):
|
def generate_entity_id(entity_id_format, name, current_ids=None, hass=None):
|
||||||
""" Generate a unique entity ID based on given entity IDs or used ids. """
|
""" Generate a unique entity ID based on given entity IDs or used ids. """
|
||||||
@ -175,112 +176,3 @@ def platform_devices_from_config(config, domain, hass,
|
|||||||
device_dict[entity_id] = device
|
device_dict[entity_id] = device
|
||||||
|
|
||||||
return device_dict
|
return device_dict
|
||||||
|
|
||||||
|
|
||||||
class Device(object):
|
|
||||||
""" ABC for Home Assistant devices. """
|
|
||||||
# pylint: disable=no-self-use
|
|
||||||
|
|
||||||
hass = None
|
|
||||||
entity_id = None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def should_poll(self):
|
|
||||||
"""
|
|
||||||
Return True if device has to be polled for state.
|
|
||||||
False if device pushes its state to HA.
|
|
||||||
"""
|
|
||||||
return True
|
|
||||||
|
|
||||||
@property
|
|
||||||
def unique_id(self):
|
|
||||||
""" Returns a unique id. """
|
|
||||||
return "{}.{}".format(self.__class__, id(self))
|
|
||||||
|
|
||||||
@property
|
|
||||||
def name(self):
|
|
||||||
""" Returns the name of the device. """
|
|
||||||
return self.get_name()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def state(self):
|
|
||||||
""" Returns the state of the device. """
|
|
||||||
return self.get_state()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def state_attributes(self):
|
|
||||||
""" Returns the state attributes. """
|
|
||||||
return {}
|
|
||||||
|
|
||||||
# DEPRECATION NOTICE:
|
|
||||||
# Device is moving from getters to properties.
|
|
||||||
# For now the new properties will call the old functions
|
|
||||||
# This will be removed in the future.
|
|
||||||
|
|
||||||
def get_name(self):
|
|
||||||
""" Returns the name of the device if any. """
|
|
||||||
return DEVICE_DEFAULT_NAME
|
|
||||||
|
|
||||||
def get_state(self):
|
|
||||||
""" Returns state of the device. """
|
|
||||||
return "Unknown"
|
|
||||||
|
|
||||||
def get_state_attributes(self):
|
|
||||||
""" Returns optional state attributes. """
|
|
||||||
return None
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
""" Retrieve latest state from the real device. """
|
|
||||||
pass
|
|
||||||
|
|
||||||
def update_ha_state(self, force_refresh=False):
|
|
||||||
"""
|
|
||||||
Updates Home Assistant with current state of device.
|
|
||||||
If force_refresh == True will update device before setting state.
|
|
||||||
"""
|
|
||||||
if self.hass is None:
|
|
||||||
raise RuntimeError("Attribute hass is None for {}".format(self))
|
|
||||||
|
|
||||||
if self.entity_id is None:
|
|
||||||
raise NoEntitySpecifiedError(
|
|
||||||
"No entity specified for device {}".format(self.name))
|
|
||||||
|
|
||||||
if force_refresh:
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
attr = self.state_attributes or {}
|
|
||||||
|
|
||||||
if ATTR_FRIENDLY_NAME not in attr and self.name:
|
|
||||||
attr[ATTR_FRIENDLY_NAME] = self.name
|
|
||||||
|
|
||||||
return self.hass.states.set(self.entity_id, self.state, attr)
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
return (isinstance(other, Device) and
|
|
||||||
other.unique_id == self.unique_id)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<Device {}: {}>".format(self.name, self.state)
|
|
||||||
|
|
||||||
|
|
||||||
class ToggleDevice(Device):
|
|
||||||
""" ABC for devices that can be turned on and off. """
|
|
||||||
# pylint: disable=no-self-use
|
|
||||||
|
|
||||||
@property
|
|
||||||
def state(self):
|
|
||||||
""" Returns the state. """
|
|
||||||
return STATE_ON if self.is_on else STATE_OFF
|
|
||||||
|
|
||||||
@property
|
|
||||||
def is_on(self):
|
|
||||||
""" True if device is on. """
|
|
||||||
return False
|
|
||||||
|
|
||||||
def turn_on(self, **kwargs):
|
|
||||||
""" Turn the device on. """
|
|
||||||
pass
|
|
||||||
|
|
||||||
def turn_off(self, **kwargs):
|
|
||||||
""" Turn the device off. """
|
|
||||||
pass
|
|
||||||
|
120
homeassistant/helpers/device.py
Normal file
120
homeassistant/helpers/device.py
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
"""
|
||||||
|
homeassistant.helpers.device
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Provides ABC for devices in HA.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from homeassistant import NoEntitySpecifiedError
|
||||||
|
|
||||||
|
from homeassistant.const import (
|
||||||
|
ATTR_FRIENDLY_NAME, STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME)
|
||||||
|
|
||||||
|
|
||||||
|
class Device(object):
|
||||||
|
""" ABC for Home Assistant devices. """
|
||||||
|
# pylint: disable=no-self-use
|
||||||
|
|
||||||
|
hass = None
|
||||||
|
entity_id = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_poll(self):
|
||||||
|
"""
|
||||||
|
Return True if device has to be polled for state.
|
||||||
|
False if device pushes its state to HA.
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def unique_id(self):
|
||||||
|
""" Returns a unique id. """
|
||||||
|
return "{}.{}".format(self.__class__, id(self))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
""" Returns the name of the device. """
|
||||||
|
return self.get_name()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self):
|
||||||
|
""" Returns the state of the device. """
|
||||||
|
return self.get_state()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state_attributes(self):
|
||||||
|
""" Returns the state attributes. """
|
||||||
|
return {}
|
||||||
|
|
||||||
|
# DEPRECATION NOTICE:
|
||||||
|
# Device is moving from getters to properties.
|
||||||
|
# For now the new properties will call the old functions
|
||||||
|
# This will be removed in the future.
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
""" Returns the name of the device if any. """
|
||||||
|
return DEVICE_DEFAULT_NAME
|
||||||
|
|
||||||
|
def get_state(self):
|
||||||
|
""" Returns state of the device. """
|
||||||
|
return "Unknown"
|
||||||
|
|
||||||
|
def get_state_attributes(self):
|
||||||
|
""" Returns optional state attributes. """
|
||||||
|
return None
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
""" Retrieve latest state from the real device. """
|
||||||
|
pass
|
||||||
|
|
||||||
|
def update_ha_state(self, force_refresh=False):
|
||||||
|
"""
|
||||||
|
Updates Home Assistant with current state of device.
|
||||||
|
If force_refresh == True will update device before setting state.
|
||||||
|
"""
|
||||||
|
if self.hass is None:
|
||||||
|
raise RuntimeError("Attribute hass is None for {}".format(self))
|
||||||
|
|
||||||
|
if self.entity_id is None:
|
||||||
|
raise NoEntitySpecifiedError(
|
||||||
|
"No entity specified for device {}".format(self.name))
|
||||||
|
|
||||||
|
if force_refresh:
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
attr = self.state_attributes or {}
|
||||||
|
|
||||||
|
if ATTR_FRIENDLY_NAME not in attr and self.name:
|
||||||
|
attr[ATTR_FRIENDLY_NAME] = self.name
|
||||||
|
|
||||||
|
return self.hass.states.set(self.entity_id, self.state, attr)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return (isinstance(other, Device) and
|
||||||
|
other.unique_id == self.unique_id)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Device {}: {}>".format(self.name, self.state)
|
||||||
|
|
||||||
|
|
||||||
|
class ToggleDevice(Device):
|
||||||
|
""" ABC for devices that can be turned on and off. """
|
||||||
|
# pylint: disable=no-self-use
|
||||||
|
|
||||||
|
@property
|
||||||
|
def state(self):
|
||||||
|
""" Returns the state. """
|
||||||
|
return STATE_ON if self.is_on else STATE_OFF
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_on(self):
|
||||||
|
""" True if device is on. """
|
||||||
|
return False
|
||||||
|
|
||||||
|
def turn_on(self, **kwargs):
|
||||||
|
""" Turn the device on. """
|
||||||
|
pass
|
||||||
|
|
||||||
|
def turn_off(self, **kwargs):
|
||||||
|
""" Turn the device off. """
|
||||||
|
pass
|
@ -7,7 +7,7 @@ Helper method for writing tests.
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import homeassistant as ha
|
import homeassistant as ha
|
||||||
from homeassistant.helpers import ToggleDevice
|
from homeassistant.helpers.device import ToggleDevice
|
||||||
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user