diff --git a/.coveragerc b/.coveragerc index fadff7fe053d2ccb18c30298871a7881946a47d0..de90021bfb72384998c0953b27645402433c84ac 100644 --- a/.coveragerc +++ b/.coveragerc @@ -93,9 +93,7 @@ omit = homeassistant/components/*/pilight.py homeassistant/components/knx.py - homeassistant/components/switch/knx.py - homeassistant/components/binary_sensor/knx.py - homeassistant/components/thermostat/knx.py + homeassistant/components/*/knx.py homeassistant/components/alarm_control_panel/alarmdotcom.py homeassistant/components/alarm_control_panel/nx584.py diff --git a/homeassistant/components/sensor/knx.py b/homeassistant/components/sensor/knx.py new file mode 100644 index 0000000000000000000000000000000000000000..cebd1397366ac375a8b3d0cf2bf2ab17cba2c6fc --- /dev/null +++ b/homeassistant/components/sensor/knx.py @@ -0,0 +1,128 @@ +""" +Sensors of a KNX Device. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/knx/ +""" +from homeassistant.const import (TEMP_CELSIUS, TEMPERATURE, CONF_TYPE, + ILLUMINANCE, SPEED_MS, CONF_MINIMUM, + CONF_MAXIMUM) +from homeassistant.components.knx import (KNXConfig, KNXGroupAddress) + + +DEPENDENCIES = ["knx"] + +# Speed units +SPEED_METERPERSECOND = "m/s" # type: str + +# Illuminance units +ILLUMINANCE_LUX = "lx" # type: str + +# Predefined Minimum, Maximum Values for Sensors +# Temperature as defined in KNX Standard 3.10 - 9.001 DPT_Value_Temp +KNX_TEMP_MIN = -273 +KNX_TEMP_MAX = 670760 + +# Luminance(LUX) as Defined in KNX Standard 3.10 - 9.004 DPT_Value_Lux +KNX_LUX_MIN = 0 +KNX_LUX_MAX = 670760 + +# Speed m/s as defined in KNX Standard 3.10 - 9.005 DPT_Value_Wsp +KNX_SPEED_MS_MIN = 0 +KNX_SPEED_MS_MAX = 670760 + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Setup the KNX Sensor platform.""" + # Add KNX Temperature Sensors + # KNX Datapoint 9.001 DPT_Value_Temp + if config[CONF_TYPE] == TEMPERATURE: + minimum_value, maximum_value = \ + update_and_define_min_max(config, KNX_TEMP_MIN, + KNX_TEMP_MAX) + + add_entities([ + KNXSensorFloatClass(hass, KNXConfig(config), TEMP_CELSIUS, + minimum_value, maximum_value) + ]) + + # Add KNX Speed Sensors(Like Wind Speed) + # KNX Datapoint 9.005 DPT_Value_Wsp + elif config[CONF_TYPE] == SPEED_MS: + minimum_value, maximum_value = \ + update_and_define_min_max(config, KNX_SPEED_MS_MIN, + KNX_SPEED_MS_MAX) + + add_entities([ + KNXSensorFloatClass(hass, KNXConfig(config), SPEED_METERPERSECOND, + minimum_value, maximum_value) + ]) + + # Add KNX Illuminance Sensors(Lux) + # KNX Datapoint 9.004 DPT_Value_Lux + elif config[CONF_TYPE] == ILLUMINANCE: + minimum_value, maximum_value = \ + update_and_define_min_max(config, KNX_LUX_MIN, KNX_LUX_MAX) + + add_entities([ + KNXSensorFloatClass(hass, KNXConfig(config), ILLUMINANCE_LUX, + minimum_value, maximum_value) + ]) + + +def update_and_define_min_max(config, minimum_default, + maximum_default): + """Function help determinate a min/max value defined in config.""" + minimum_value = minimum_default + maximum_value = maximum_default + if config.get(CONF_MINIMUM): + minimum_value = config.get(CONF_MINIMUM) + + if config.get(CONF_MAXIMUM): + maximum_value = config.get(CONF_MAXIMUM) + + return minimum_value, maximum_value + + +class KNXSensorBaseClass(): # pylint: disable=too-few-public-methods + """Sensor Base Class for all KNX Sensors.""" + + _unit_of_measurement = None + + @property + def cache(self): + """We don't want to cache any Sensor Value.""" + return False + + @property + def unit_of_measurement(self): + """Return the defined Unit of Measurement for the KNX Sensor.""" + return self._unit_of_measurement + + +class KNXSensorFloatClass(KNXGroupAddress, KNXSensorBaseClass): + """ + Base Implementation of a 2byte Floating Point KNX Telegram. + + Defined in KNX 3.7.2 - 3.10 + """ + + # pylint: disable=too-many-arguments + def __init__(self, hass, config, unit_of_measurement, minimum_sensor_value, + maximum_sensor_value): + """Initialize a KNX Float Sensor.""" + self._unit_of_measurement = unit_of_measurement + self._minimum_value = minimum_sensor_value + self._maximum_value = maximum_sensor_value + + KNXGroupAddress.__init__(self, hass, config) + + @property + def state(self): + """Return the Value of the KNX Sensor.""" + if self._data: + from knxip.conversion import knx2_to_float + value = knx2_to_float(self._data) + if self._minimum_value <= value <= self._maximum_value: + return value + return None diff --git a/homeassistant/const.py b/homeassistant/const.py index 4107fb65a243a0b2ecff829da5248d87435d761c..872f60562cddf96803562f9e019b39a7bd53c72c 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -94,6 +94,8 @@ CONF_LATITUDE = 'latitude' CONF_LONGITUDE = 'longitude' CONF_MAC = 'mac' CONF_METHOD = 'method' +CONF_MINIMUM = 'minimum' +CONF_MAXIMUM = 'maximum' CONF_MONITORED_CONDITIONS = 'monitored_conditions' CONF_MONITORED_VARIABLES = 'monitored_variables' CONF_NAME = 'name' @@ -125,6 +127,7 @@ CONF_TIME_ZONE = 'time_zone' CONF_TIMEOUT = 'timeout' CONF_TOKEN = 'token' CONF_TRIGGER_TIME = 'trigger_time' +CONF_TYPE = 'type' CONF_UNIT_OF_MEASUREMENT = 'unit_of_measurement' CONF_UNIT_SYSTEM = 'unit_system' CONF_URL = 'url' @@ -374,3 +377,5 @@ LENGTH = 'length' # type: str MASS = 'mass' # type: str VOLUME = 'volume' # type: str TEMPERATURE = 'temperature' # type: str +SPEED_MS = 'speed_ms' # type: str +ILLUMINANCE = 'illuminance' # type: str