Read Modbus climate current temp from input register (#31944)

This commit is contained in:
Vladimír Záhradník 2020-02-18 18:45:05 +01:00 committed by GitHub
parent b73531b2fc
commit af67bb0df3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,6 +27,7 @@ _LOGGER = logging.getLogger(__name__)
CONF_TARGET_TEMP = "target_temp_register" CONF_TARGET_TEMP = "target_temp_register"
CONF_CURRENT_TEMP = "current_temp_register" CONF_CURRENT_TEMP = "current_temp_register"
CONF_CURRENT_TEMP_REGISTER_TYPE = "current_temp_register_type"
CONF_DATA_TYPE = "data_type" CONF_DATA_TYPE = "data_type"
CONF_COUNT = "data_count" CONF_COUNT = "data_count"
CONF_PRECISION = "precision" CONF_PRECISION = "precision"
@ -42,6 +43,9 @@ CONF_STEP = "temp_step"
SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE
HVAC_MODES = [HVAC_MODE_AUTO] HVAC_MODES = [HVAC_MODE_AUTO]
DEFAULT_REGISTER_TYPE_HOLDING = "holding"
DEFAULT_REGISTER_TYPE_INPUT = "input"
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{ {
vol.Required(CONF_CURRENT_TEMP): cv.positive_int, vol.Required(CONF_CURRENT_TEMP): cv.positive_int,
@ -49,6 +53,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
vol.Required(CONF_SLAVE): cv.positive_int, vol.Required(CONF_SLAVE): cv.positive_int,
vol.Required(CONF_TARGET_TEMP): cv.positive_int, vol.Required(CONF_TARGET_TEMP): cv.positive_int,
vol.Optional(CONF_COUNT, default=2): cv.positive_int, vol.Optional(CONF_COUNT, default=2): cv.positive_int,
vol.Optional(
CONF_CURRENT_TEMP_REGISTER_TYPE, default=DEFAULT_REGISTER_TYPE_HOLDING
): vol.In([DEFAULT_REGISTER_TYPE_HOLDING, DEFAULT_REGISTER_TYPE_INPUT]),
vol.Optional(CONF_DATA_TYPE, default=DATA_TYPE_FLOAT): vol.In( vol.Optional(CONF_DATA_TYPE, default=DATA_TYPE_FLOAT): vol.In(
[DATA_TYPE_INT, DATA_TYPE_UINT, DATA_TYPE_FLOAT] [DATA_TYPE_INT, DATA_TYPE_UINT, DATA_TYPE_FLOAT]
), ),
@ -66,20 +73,21 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def setup_platform(hass, config, add_entities, discovery_info=None): def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Modbus Thermostat Platform.""" """Set up the Modbus Thermostat Platform."""
name = config.get(CONF_NAME) name = config[CONF_NAME]
modbus_slave = config.get(CONF_SLAVE) modbus_slave = config[CONF_SLAVE]
target_temp_register = config.get(CONF_TARGET_TEMP) target_temp_register = config[CONF_TARGET_TEMP]
current_temp_register = config.get(CONF_CURRENT_TEMP) current_temp_register = config[CONF_CURRENT_TEMP]
data_type = config.get(CONF_DATA_TYPE) current_temp_register_type = config[CONF_CURRENT_TEMP_REGISTER_TYPE]
count = config.get(CONF_COUNT) data_type = config[CONF_DATA_TYPE]
precision = config.get(CONF_PRECISION) count = config[CONF_COUNT]
scale = config.get(CONF_SCALE) precision = config[CONF_PRECISION]
offset = config.get(CONF_OFFSET) scale = config[CONF_SCALE]
unit = config.get(CONF_UNIT) offset = config[CONF_OFFSET]
max_temp = config.get(CONF_MAX_TEMP) unit = config[CONF_UNIT]
min_temp = config.get(CONF_MIN_TEMP) max_temp = config[CONF_MAX_TEMP]
temp_step = config.get(CONF_STEP) min_temp = config[CONF_MIN_TEMP]
hub_name = config.get(CONF_HUB) temp_step = config[CONF_STEP]
hub_name = config[CONF_HUB]
hub = hass.data[MODBUS_DOMAIN][hub_name] hub = hass.data[MODBUS_DOMAIN][hub_name]
add_entities( add_entities(
@ -90,6 +98,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
modbus_slave, modbus_slave,
target_temp_register, target_temp_register,
current_temp_register, current_temp_register,
current_temp_register_type,
data_type, data_type,
count, count,
precision, precision,
@ -115,6 +124,7 @@ class ModbusThermostat(ClimateDevice):
modbus_slave, modbus_slave,
target_temp_register, target_temp_register,
current_temp_register, current_temp_register,
current_temp_register_type,
data_type, data_type,
count, count,
precision, precision,
@ -131,6 +141,7 @@ class ModbusThermostat(ClimateDevice):
self._slave = modbus_slave self._slave = modbus_slave
self._target_temperature_register = target_temp_register self._target_temperature_register = target_temp_register
self._current_temperature_register = current_temp_register self._current_temperature_register = current_temp_register
self._current_temperature_register_type = current_temp_register_type
self._target_temperature = None self._target_temperature = None
self._current_temperature = None self._current_temperature = None
self._data_type = data_type self._data_type = data_type
@ -161,10 +172,10 @@ class ModbusThermostat(ClimateDevice):
def update(self): def update(self):
"""Update Target & Current Temperature.""" """Update Target & Current Temperature."""
self._target_temperature = self._read_register( self._target_temperature = self._read_register(
self._target_temperature_register DEFAULT_REGISTER_TYPE_HOLDING, self._target_temperature_register
) )
self._current_temperature = self._read_register( self._current_temperature = self._read_register(
self._current_temperature_register self._current_temperature_register_type, self._current_temperature_register
) )
@property @property
@ -228,12 +239,17 @@ class ModbusThermostat(ClimateDevice):
"""Return True if entity is available.""" """Return True if entity is available."""
return self._available return self._available
def _read_register(self, register) -> Optional[float]: def _read_register(self, register_type, register) -> Optional[float]:
"""Read holding register using the Modbus hub slave.""" """Read register using the Modbus hub slave."""
try: try:
result = self._hub.read_holding_registers( if register_type == DEFAULT_REGISTER_TYPE_INPUT:
self._slave, register, self._count result = self._hub.read_input_registers(
) self._slave, register, self._count
)
else:
result = self._hub.read_holding_registers(
self._slave, register, self._count
)
except ConnectionException: except ConnectionException:
self._set_unavailable(register) self._set_unavailable(register)
return return