diff --git a/CODEOWNERS b/CODEOWNERS index 4a6dfdbf6e62..61bacc7a3070 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -178,6 +178,7 @@ homeassistant/components/mill/* @danielhiversen homeassistant/components/min_max/* @fabaff homeassistant/components/minio/* @tkislan homeassistant/components/mobile_app/* @robbiet480 +homeassistant/components/modbus/* @adamchengtkc homeassistant/components/monoprice/* @etsinko homeassistant/components/moon/* @fabaff homeassistant/components/mpd/* @fabaff diff --git a/homeassistant/components/modbus/climate.py b/homeassistant/components/modbus/climate.py index 64b45b03c959..c6764482d962 100644 --- a/homeassistant/components/modbus/climate.py +++ b/homeassistant/components/modbus/climate.py @@ -7,9 +7,15 @@ from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateDevice from homeassistant.components.climate.const import ( SUPPORT_TARGET_TEMPERATURE, - HVAC_MODE_HEAT, + HVAC_MODE_AUTO, +) +from homeassistant.const import ( + ATTR_TEMPERATURE, + CONF_NAME, + CONF_SLAVE, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, ) -from homeassistant.const import ATTR_TEMPERATURE, CONF_NAME, CONF_SLAVE import homeassistant.helpers.config_validation as cv from . import CONF_HUB, DEFAULT_HUB, DOMAIN as MODBUS_DOMAIN @@ -21,12 +27,17 @@ CONF_DATA_TYPE = "data_type" CONF_COUNT = "data_count" CONF_PRECISION = "precision" - +CONF_SCALE = "scale" +CONF_OFFSET = "offset" +CONF_UNIT = "temperature_unit" DATA_TYPE_INT = "int" DATA_TYPE_UINT = "uint" DATA_TYPE_FLOAT = "float" +CONF_MAX_TEMP = "max_temp" +CONF_MIN_TEMP = "min_temp" +CONF_STEP = "temp_step" SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE -HVAC_MODES = [HVAC_MODE_HEAT] +HVAC_MODES = [HVAC_MODE_AUTO] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { @@ -40,6 +51,12 @@ ), vol.Optional(CONF_HUB, default=DEFAULT_HUB): cv.string, vol.Optional(CONF_PRECISION, default=1): cv.positive_int, + vol.Optional(CONF_SCALE, default=1): vol.Coerce(float), + vol.Optional(CONF_OFFSET, default=0): vol.Coerce(float), + vol.Optional(CONF_MAX_TEMP, default=5): cv.positive_int, + vol.Optional(CONF_MIN_TEMP, default=35): cv.positive_int, + vol.Optional(CONF_STEP, default=0.5): vol.Coerce(float), + vol.Optional(CONF_UNIT, default="C"): cv.string, } ) @@ -53,6 +70,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data_type = config.get(CONF_DATA_TYPE) count = config.get(CONF_COUNT) precision = config.get(CONF_PRECISION) + scale = config.get(CONF_SCALE) + offset = config.get(CONF_OFFSET) + unit = config.get(CONF_UNIT) + max_temp = config.get(CONF_MAX_TEMP) + min_temp = config.get(CONF_MIN_TEMP) + temp_step = config.get(CONF_STEP) hub_name = config.get(CONF_HUB) hub = hass.data[MODBUS_DOMAIN][hub_name] @@ -67,6 +90,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data_type, count, precision, + scale, + offset, + unit, + max_temp, + min_temp, + temp_step, ) ], True, @@ -86,6 +115,12 @@ def __init__( data_type, count, precision, + scale, + offset, + unit, + max_temp, + min_temp, + temp_step, ): """Initialize the unit.""" self._hub = hub @@ -98,6 +133,12 @@ def __init__( self._data_type = data_type self._count = int(count) self._precision = precision + self._scale = scale + self._offset = offset + self._unit = unit + self._max_temp = max_temp + self._min_temp = min_temp + self._temp_step = temp_step self._structure = ">f" data_types = { @@ -123,7 +164,7 @@ def update(self): @property def hvac_mode(self): """Return the current HVAC mode.""" - return HVAC_MODE_HEAT + return HVAC_MODE_AUTO @property def hvac_modes(self): @@ -145,9 +186,31 @@ def target_temperature(self): """Return the target temperature.""" return self._target_temperature + @property + def temperature_unit(self): + """Return the unit of measurement.""" + return TEMP_FAHRENHEIT if self._unit == "F" else TEMP_CELSIUS + + @property + def min_temp(self): + """Return the minimum temperature.""" + return self._min_temp + + @property + def max_temp(self): + """Return the maximum temperature.""" + return self._max_temp + + @property + def target_temperature_step(self): + """Return the supported step of target temperature.""" + return self._temp_step + def set_temperature(self, **kwargs): """Set new target temperature.""" - target_temperature = kwargs.get(ATTR_TEMPERATURE) + target_temperature = int( + (kwargs.get(ATTR_TEMPERATURE) - self._offset) / self._scale + ) if target_temperature is None: return byte_string = struct.pack(self._structure, target_temperature) @@ -170,7 +233,10 @@ def read_register(self, register): [x.to_bytes(2, byteorder="big") for x in result.registers] ) val = struct.unpack(self._structure, byte_string)[0] - register_value = format(val, f".{self._precision}f") + register_value = format( + (self._scale * val) + self._offset, f".{self._precision}f" + ) + register_value = float(register_value) return register_value def write_register(self, register, value): diff --git a/homeassistant/components/modbus/manifest.json b/homeassistant/components/modbus/manifest.json index e27f594b0af0..073b8343cc97 100644 --- a/homeassistant/components/modbus/manifest.json +++ b/homeassistant/components/modbus/manifest.json @@ -6,5 +6,7 @@ "pymodbus==1.5.2" ], "dependencies": [], - "codeowners": [] + "codeowners": [ + "@adamchengtkc" + ] }