132 lines
3.9 KiB
Python
132 lines
3.9 KiB
Python
"""
|
|
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):
|
|
"""Set up the KNX Sensor platform."""
|
|
# 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):
|
|
"""Determine a min/max value defined in the configuration."""
|
|
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():
|
|
"""Sensor Base Class for all KNX Sensors."""
|
|
|
|
@property
|
|
def cache(self):
|
|
"""We don't want to cache any Sensor Value."""
|
|
return False
|
|
|
|
|
|
class KNXSensorFloatClass(KNXGroupAddress, KNXSensorBaseClass):
|
|
"""
|
|
Base Implementation of a 2byte Floating Point KNX Telegram.
|
|
|
|
Defined in KNX 3.7.2 - 3.10
|
|
"""
|
|
|
|
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
|
|
self._value = None
|
|
|
|
KNXGroupAddress.__init__(self, hass, config)
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the Value of the KNX Sensor."""
|
|
return self._value
|
|
|
|
@property
|
|
def unit_of_measurement(self):
|
|
"""Return the defined Unit of Measurement for the KNX Sensor."""
|
|
return self._unit_of_measurement
|
|
|
|
def update(self):
|
|
"""Update KNX sensor."""
|
|
from knxip.conversion import knx2_to_float
|
|
|
|
super().update()
|
|
|
|
self._value = None
|
|
|
|
if self._data:
|
|
value = 0 if self._data == 0 else knx2_to_float(self._data)
|
|
if self._minimum_value <= value <= self._maximum_value:
|
|
self._value = value
|