Added ISY994 weather data as sensors.
This commit is contained in:
parent
5ec686b030
commit
80f1581d6e
3 changed files with 175 additions and 1 deletions
homeassistant/components
73
homeassistant/components/isy994.py
Normal file
73
homeassistant/components/isy994.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
"""
|
||||
Connects to an ISY-994 controller and loads relevant components to control its devices.
|
||||
"""
|
||||
# system imports
|
||||
import logging
|
||||
from urllib.parse import urlparse
|
||||
|
||||
# addon library imports
|
||||
import PyISY
|
||||
|
||||
# homeassistant imports
|
||||
from homeassistant import bootstrap
|
||||
from homeassistant.loader import get_component
|
||||
from homeassistant.helpers import validate_config
|
||||
from homeassistant.helpers.entity import ToggleEntity
|
||||
from homeassistant.const import (
|
||||
CONF_HOST, CONF_USERNAME, CONF_PASSWORD,
|
||||
EVENT_PLATFORM_DISCOVERED,
|
||||
ATTR_SERVICE, ATTR_DISCOVERED, ATTR_FRIENDLY_NAME)
|
||||
|
||||
# homeassistant constants
|
||||
DOMAIN = "isy994"
|
||||
DEPENDENCIES = []
|
||||
#DISCOVER_LIGHTS = "isy994.lights"
|
||||
#DISCOVER_SWITCHES = "isy994.switches"
|
||||
DISCOVER_SENSORS = "isy994.sensors"
|
||||
ISY = None
|
||||
|
||||
def setup(hass, config):
|
||||
""" Sets up the ISY994 component. """
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
# pull values from configuration file
|
||||
if not validate_config(config,
|
||||
{DOMAIN: [CONF_HOST, CONF_USERNAME, CONF_PASSWORD]}, logger):
|
||||
return False
|
||||
else:
|
||||
user = config[DOMAIN][CONF_USERNAME]
|
||||
password = config[DOMAIN][CONF_PASSWORD]
|
||||
host = urlparse(config[DOMAIN][CONF_HOST])
|
||||
addr = host.geturl()
|
||||
if host.scheme == 'http':
|
||||
addr = addr.replace('http://', '')
|
||||
https = False
|
||||
elif host.scheme == 'https':
|
||||
addr = addr.replace('https://', '')
|
||||
https = True
|
||||
else:
|
||||
logger.error('isy994 host value in configuration ' +
|
||||
'file is invalid.')
|
||||
return False
|
||||
port = host.port
|
||||
addr = addr.replace(':{}'.format(port), '')
|
||||
|
||||
# connect to ISY controller
|
||||
global ISY
|
||||
ISY = PyISY.ISY(addr, port, user, password, use_https=https, log=logger)
|
||||
if not ISY.connected:
|
||||
return False
|
||||
|
||||
# Load components for the devices in the ISY controller that we support
|
||||
for comp_name, discovery in ((('sensor', DISCOVER_SENSORS),)):
|
||||
component = get_component(comp_name)
|
||||
bootstrap.setup_component(hass, component.DOMAIN, config)
|
||||
hass.bus.fire(EVENT_PLATFORM_DISCOVERED,
|
||||
{
|
||||
ATTR_SERVICE: discovery,
|
||||
ATTR_DISCOVERED: {}
|
||||
})
|
||||
|
||||
ISY.auto_update = True
|
||||
return True
|
|
@ -6,7 +6,7 @@ Component to interface with various sensors that can be monitored.
|
|||
import logging
|
||||
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
from homeassistant.components import wink, zwave
|
||||
from homeassistant.components import wink, zwave, isy994
|
||||
|
||||
DOMAIN = 'sensor'
|
||||
DEPENDENCIES = []
|
||||
|
@ -18,6 +18,7 @@ ENTITY_ID_FORMAT = DOMAIN + '.{}'
|
|||
DISCOVERY_PLATFORMS = {
|
||||
wink.DISCOVER_SENSORS: 'wink',
|
||||
zwave.DISCOVER_SENSORS: 'zwave',
|
||||
isy994.DISCOVER_SENSORS: 'isy994'
|
||||
}
|
||||
|
||||
|
||||
|
|
100
homeassistant/components/sensor/isy994.py
Normal file
100
homeassistant/components/sensor/isy994.py
Normal file
|
@ -0,0 +1,100 @@
|
|||
""" Support for ISY994 sensors. """
|
||||
# system imports
|
||||
import logging
|
||||
|
||||
# homeassistant imports
|
||||
from ..isy994 import ISY
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.const import STATE_OPEN, STATE_CLOSED
|
||||
|
||||
|
||||
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
""" Sets up the isy994 platform. """
|
||||
logger = logging.getLogger(__name__)
|
||||
devs = []
|
||||
# verify connection
|
||||
if ISY is None or not ISY.connected:
|
||||
logger.error('A connection has not been made to the ISY controller.')
|
||||
return False
|
||||
|
||||
# import weather
|
||||
if ISY.climate is not None:
|
||||
for prop in ISY.climate._id2name:
|
||||
if prop is not None:
|
||||
devs.append(ISYSensorDevice('ISY.weather.' + prop, prop,
|
||||
getattr(ISY.climate, prop),
|
||||
getattr(ISY.climate, prop + '_units')))
|
||||
|
||||
|
||||
add_devices(devs)
|
||||
|
||||
|
||||
class ISYSensorDevice(Entity):
|
||||
""" represents a isy sensor within home assistant. """
|
||||
|
||||
domain = 'sensor'
|
||||
|
||||
def __init__(self, device_id, name, source, units=None):
|
||||
# setup properties
|
||||
self._id = device_id
|
||||
self._name = name
|
||||
self.entity_id = self.domain + '.' + self.name.replace(' ', '_')
|
||||
self._source = source
|
||||
self._units = units
|
||||
|
||||
# track changes
|
||||
self._changeHandler = self._source.subscribe('changed', self.onUpdate)
|
||||
|
||||
def __del__(self):
|
||||
self._changeHandler.unsubscribe()
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
return False
|
||||
|
||||
@property
|
||||
def dtype(self):
|
||||
return 'binary' if self._units is None else 'analog'
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
""" Returns the state. """
|
||||
if self.dtype is 'binary':
|
||||
return STATE_OPEN if self.is_open >= 255 else STATE_CLOSED
|
||||
else:
|
||||
return self.value
|
||||
|
||||
@property
|
||||
def state_attributes(self):
|
||||
return {}
|
||||
|
||||
@property
|
||||
def unit_of_measurement(self):
|
||||
return self._units
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
""" Returns the id of this isy sensor """
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
""" Returns the name of the sensor if any. """
|
||||
return self._name
|
||||
|
||||
def update(self):
|
||||
""" Update state of the sensor. """
|
||||
# ISY objects are automatically updated by the ISY's event stream
|
||||
pass
|
||||
|
||||
@property
|
||||
def is_open(self):
|
||||
""" True if door is open. """
|
||||
return self.value >= 255
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self._source._val
|
||||
|
||||
def onUpdate(self, e):
|
||||
self.update_ha_state()
|
Loading…
Add table
Reference in a new issue