From ff3c90fb80d508919a3dbe2f525195434556f891 Mon Sep 17 00:00:00 2001 From: Markus Peter Date: Mon, 6 Mar 2017 17:37:29 +0100 Subject: [PATCH] KWB Easyfire support (#6018) * KWB Easyfire Support * requirements, coverage * Initialization fun * lint * requirements bump * lint * Second best validation ... * changes * reworked validation --- .coveragerc | 1 + homeassistant/components/sensor/kwb.py | 115 +++++++++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 119 insertions(+) create mode 100644 homeassistant/components/sensor/kwb.py diff --git a/.coveragerc b/.coveragerc index 59c0c63ebe5..0a226dd147e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -342,6 +342,7 @@ omit = homeassistant/components/sensor/imap.py homeassistant/components/sensor/imap_email_content.py homeassistant/components/sensor/influxdb.py + homeassistant/components/sensor/kwb.py homeassistant/components/sensor/lastfm.py homeassistant/components/sensor/linux_battery.py homeassistant/components/sensor/loopenergy.py diff --git a/homeassistant/components/sensor/kwb.py b/homeassistant/components/sensor/kwb.py new file mode 100644 index 00000000000..54799ccc6b4 --- /dev/null +++ b/homeassistant/components/sensor/kwb.py @@ -0,0 +1,115 @@ +""" +Support for KWB Easyfire. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.kwb/ +""" +import logging + +import voluptuous as vol + +from homeassistant.const import (CONF_HOST, CONF_PORT, CONF_DEVICE, + CONF_NAME, EVENT_HOMEASSISTANT_STOP, + STATE_UNKNOWN) +from homeassistant.helpers.entity import Entity +from homeassistant.components.sensor import PLATFORM_SCHEMA +import homeassistant.helpers.config_validation as cv + + +REQUIREMENTS = ['pykwb==0.0.8'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_RAW = False +DEFAULT_NAME = 'KWB' + +MODE_SERIAL = 0 +MODE_TCP = 1 + +CONF_TYPE = 'type' +CONF_RAW = 'raw' + +SERIAL_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Required(CONF_DEVICE): cv.string, + vol.Required(CONF_TYPE): 'serial', +}) + +ETHERNET_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Required(CONF_HOST): cv.string, + vol.Required(CONF_PORT): cv.port, + vol.Required(CONF_TYPE): 'tcp', +}) + +PLATFORM_SCHEMA = vol.Schema( + vol.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA) +) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the KWB component.""" + host = config.get(CONF_HOST) + port = config.get(CONF_PORT) + device = config.get(CONF_DEVICE) + connection_type = config.get(CONF_TYPE) + raw = config.get(CONF_RAW) + client_name = config.get(CONF_NAME) + + from pykwb import kwb + + if connection_type == 'serial': + easyfire = kwb.KWBEasyfire(MODE_SERIAL, "", 0, device) + elif connection_type == 'tcp': + easyfire = kwb.KWBEasyfire(MODE_TCP, host, port) + else: + return False + + easyfire.run_thread() + + sensors = [] + for sensor in easyfire.get_sensors(): + if ((sensor.sensor_type != kwb.PROP_SENSOR_RAW) + or (sensor.sensor_type == kwb.PROP_SENSOR_RAW and raw)): + sensors.append(KWBSensor(easyfire, sensor, client_name)) + + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, + lambda event: easyfire.stop_thread()) + + add_devices(sensors) + + +class KWBSensor(Entity): + """Representation of a KWB Easyfire sensor.""" + + def __init__(self, easyfire, sensor, client_name): + """Initialize the KWB sensor.""" + self._easyfire = easyfire + self._sensor = sensor + self._client_name = client_name + self._name = self._sensor.name + + @property + def name(self): + """Return the name.""" + return '{} {}'.format(self._client_name, self._name) + + @property + def available(self) -> bool: + """Return if sensor is available.""" + return self._sensor.available + + @property + def state(self): + """Return the state of value.""" + if self._sensor.value is not None and self._sensor.available: + return self._sensor.value + else: + return STATE_UNKNOWN + + @property + def unit_of_measurement(self): + """Return the unit of measurement of this entity, if any.""" + return self._sensor.unit_of_measurement diff --git a/requirements_all.txt b/requirements_all.txt index 978950046ed..120d3e169db 100755 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -517,6 +517,9 @@ pyiss==1.0.1 # homeassistant.components.remote.itach pyitachip2ir==0.0.6 +# homeassistant.components.sensor.kwb +pykwb==0.0.8 + # homeassistant.components.sensor.lastfm pylast==1.8.0