Add modbus hvac_* write registers (#89695)
parent
a244749712
commit
6e5b4f9f82
|
@ -105,6 +105,7 @@ from .const import ( # noqa: F401
|
|||
CONF_SWAP_WORD_BYTE,
|
||||
CONF_TARGET_TEMP,
|
||||
CONF_VERIFY,
|
||||
CONF_WRITE_REGISTERS,
|
||||
CONF_WRITE_TYPE,
|
||||
CONF_ZERO_SUPPRESS,
|
||||
DEFAULT_HUB,
|
||||
|
@ -232,6 +233,7 @@ CLIMATE_SCHEMA = vol.All(
|
|||
vol.Optional(CONF_STEP, default=0.5): vol.Coerce(float),
|
||||
vol.Optional(CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT): cv.string,
|
||||
vol.Optional(CONF_HVAC_ONOFF_REGISTER): cv.positive_int,
|
||||
vol.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean,
|
||||
vol.Optional(CONF_HVAC_MODE_REGISTER): vol.Maybe(
|
||||
{
|
||||
CONF_ADDRESS: cv.positive_int,
|
||||
|
@ -244,6 +246,7 @@ CLIMATE_SCHEMA = vol.All(
|
|||
vol.Optional(CONF_HVAC_MODE_DRY): cv.positive_int,
|
||||
vol.Optional(CONF_HVAC_MODE_FAN_ONLY): cv.positive_int,
|
||||
},
|
||||
vol.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean,
|
||||
}
|
||||
),
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ from .const import (
|
|||
CONF_MIN_TEMP,
|
||||
CONF_STEP,
|
||||
CONF_TARGET_TEMP,
|
||||
CONF_WRITE_REGISTERS,
|
||||
DataType,
|
||||
)
|
||||
from .modbus import ModbusHub
|
||||
|
@ -106,6 +107,7 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
|||
self._attr_hvac_modes = cast(list[HVACMode], [])
|
||||
self._attr_hvac_mode = None
|
||||
self._hvac_mode_mapping: list[tuple[int, HVACMode]] = []
|
||||
self._hvac_mode_write_type = mode_config[CONF_WRITE_REGISTERS]
|
||||
mode_value_config = mode_config[CONF_HVAC_MODE_VALUES]
|
||||
|
||||
for hvac_mode_kw, hvac_mode in (
|
||||
|
@ -131,6 +133,7 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
|||
|
||||
if CONF_HVAC_ONOFF_REGISTER in config:
|
||||
self._hvac_onoff_register = config[CONF_HVAC_ONOFF_REGISTER]
|
||||
self._hvac_onoff_write_type = config[CONF_WRITE_REGISTERS]
|
||||
if HVACMode.OFF not in self._attr_hvac_modes:
|
||||
self._attr_hvac_modes.append(HVACMode.OFF)
|
||||
else:
|
||||
|
@ -147,23 +150,39 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
|||
"""Set new target hvac mode."""
|
||||
if self._hvac_onoff_register is not None:
|
||||
# Turn HVAC Off by writing 0 to the On/Off register, or 1 otherwise.
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_onoff_register,
|
||||
0 if hvac_mode == HVACMode.OFF else 1,
|
||||
CALL_TYPE_WRITE_REGISTER,
|
||||
)
|
||||
if self._hvac_onoff_write_type:
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_onoff_register,
|
||||
[0 if hvac_mode == HVACMode.OFF else 1],
|
||||
CALL_TYPE_WRITE_REGISTERS,
|
||||
)
|
||||
else:
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_onoff_register,
|
||||
0 if hvac_mode == HVACMode.OFF else 1,
|
||||
CALL_TYPE_WRITE_REGISTER,
|
||||
)
|
||||
|
||||
if self._hvac_mode_register is not None:
|
||||
# Write a value to the mode register for the desired mode.
|
||||
for value, mode in self._hvac_mode_mapping:
|
||||
if mode == hvac_mode:
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_mode_register,
|
||||
value,
|
||||
CALL_TYPE_WRITE_REGISTER,
|
||||
)
|
||||
if self._hvac_mode_write_type:
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_mode_register,
|
||||
[value],
|
||||
CALL_TYPE_WRITE_REGISTERS,
|
||||
)
|
||||
else:
|
||||
await self._hub.async_pymodbus_call(
|
||||
self._slave,
|
||||
self._hvac_mode_register,
|
||||
value,
|
||||
CALL_TYPE_WRITE_REGISTER,
|
||||
)
|
||||
break
|
||||
|
||||
await self.async_update()
|
||||
|
|
|
@ -65,6 +65,7 @@ CONF_HVAC_MODE_HEAT_COOL = "state_heat_cool"
|
|||
CONF_HVAC_MODE_AUTO = "state_auto"
|
||||
CONF_HVAC_MODE_DRY = "state_dry"
|
||||
CONF_HVAC_MODE_FAN_ONLY = "state_fan_only"
|
||||
CONF_WRITE_REGISTERS = "write_registers"
|
||||
CONF_VERIFY = "verify"
|
||||
CONF_VERIFY_REGISTER = "verify_register"
|
||||
CONF_VERIFY_STATE = "verify_state"
|
||||
|
|
Loading…
Reference in New Issue