Add modbus hvac_* write registers (#89695)
This commit is contained in:
parent
a244749712
commit
6e5b4f9f82
3 changed files with 35 additions and 12 deletions
|
@ -105,6 +105,7 @@ from .const import ( # noqa: F401
|
||||||
CONF_SWAP_WORD_BYTE,
|
CONF_SWAP_WORD_BYTE,
|
||||||
CONF_TARGET_TEMP,
|
CONF_TARGET_TEMP,
|
||||||
CONF_VERIFY,
|
CONF_VERIFY,
|
||||||
|
CONF_WRITE_REGISTERS,
|
||||||
CONF_WRITE_TYPE,
|
CONF_WRITE_TYPE,
|
||||||
CONF_ZERO_SUPPRESS,
|
CONF_ZERO_SUPPRESS,
|
||||||
DEFAULT_HUB,
|
DEFAULT_HUB,
|
||||||
|
@ -232,6 +233,7 @@ CLIMATE_SCHEMA = vol.All(
|
||||||
vol.Optional(CONF_STEP, default=0.5): vol.Coerce(float),
|
vol.Optional(CONF_STEP, default=0.5): vol.Coerce(float),
|
||||||
vol.Optional(CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT): cv.string,
|
vol.Optional(CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT): cv.string,
|
||||||
vol.Optional(CONF_HVAC_ONOFF_REGISTER): cv.positive_int,
|
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(
|
vol.Optional(CONF_HVAC_MODE_REGISTER): vol.Maybe(
|
||||||
{
|
{
|
||||||
CONF_ADDRESS: cv.positive_int,
|
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_DRY): cv.positive_int,
|
||||||
vol.Optional(CONF_HVAC_MODE_FAN_ONLY): 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_MIN_TEMP,
|
||||||
CONF_STEP,
|
CONF_STEP,
|
||||||
CONF_TARGET_TEMP,
|
CONF_TARGET_TEMP,
|
||||||
|
CONF_WRITE_REGISTERS,
|
||||||
DataType,
|
DataType,
|
||||||
)
|
)
|
||||||
from .modbus import ModbusHub
|
from .modbus import ModbusHub
|
||||||
|
@ -106,6 +107,7 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
||||||
self._attr_hvac_modes = cast(list[HVACMode], [])
|
self._attr_hvac_modes = cast(list[HVACMode], [])
|
||||||
self._attr_hvac_mode = None
|
self._attr_hvac_mode = None
|
||||||
self._hvac_mode_mapping: list[tuple[int, HVACMode]] = []
|
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]
|
mode_value_config = mode_config[CONF_HVAC_MODE_VALUES]
|
||||||
|
|
||||||
for hvac_mode_kw, hvac_mode in (
|
for hvac_mode_kw, hvac_mode in (
|
||||||
|
@ -131,6 +133,7 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
||||||
|
|
||||||
if CONF_HVAC_ONOFF_REGISTER in config:
|
if CONF_HVAC_ONOFF_REGISTER in config:
|
||||||
self._hvac_onoff_register = config[CONF_HVAC_ONOFF_REGISTER]
|
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:
|
if HVACMode.OFF not in self._attr_hvac_modes:
|
||||||
self._attr_hvac_modes.append(HVACMode.OFF)
|
self._attr_hvac_modes.append(HVACMode.OFF)
|
||||||
else:
|
else:
|
||||||
|
@ -147,23 +150,39 @@ class ModbusThermostat(BaseStructPlatform, RestoreEntity, ClimateEntity):
|
||||||
"""Set new target hvac mode."""
|
"""Set new target hvac mode."""
|
||||||
if self._hvac_onoff_register is not None:
|
if self._hvac_onoff_register is not None:
|
||||||
# Turn HVAC Off by writing 0 to the On/Off register, or 1 otherwise.
|
# Turn HVAC Off by writing 0 to the On/Off register, or 1 otherwise.
|
||||||
await self._hub.async_pymodbus_call(
|
if self._hvac_onoff_write_type:
|
||||||
self._slave,
|
await self._hub.async_pymodbus_call(
|
||||||
self._hvac_onoff_register,
|
self._slave,
|
||||||
0 if hvac_mode == HVACMode.OFF else 1,
|
self._hvac_onoff_register,
|
||||||
CALL_TYPE_WRITE_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:
|
if self._hvac_mode_register is not None:
|
||||||
# Write a value to the mode register for the desired mode.
|
# Write a value to the mode register for the desired mode.
|
||||||
for value, mode in self._hvac_mode_mapping:
|
for value, mode in self._hvac_mode_mapping:
|
||||||
if mode == hvac_mode:
|
if mode == hvac_mode:
|
||||||
await self._hub.async_pymodbus_call(
|
if self._hvac_mode_write_type:
|
||||||
self._slave,
|
await self._hub.async_pymodbus_call(
|
||||||
self._hvac_mode_register,
|
self._slave,
|
||||||
value,
|
self._hvac_mode_register,
|
||||||
CALL_TYPE_WRITE_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
|
break
|
||||||
|
|
||||||
await self.async_update()
|
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_AUTO = "state_auto"
|
||||||
CONF_HVAC_MODE_DRY = "state_dry"
|
CONF_HVAC_MODE_DRY = "state_dry"
|
||||||
CONF_HVAC_MODE_FAN_ONLY = "state_fan_only"
|
CONF_HVAC_MODE_FAN_ONLY = "state_fan_only"
|
||||||
|
CONF_WRITE_REGISTERS = "write_registers"
|
||||||
CONF_VERIFY = "verify"
|
CONF_VERIFY = "verify"
|
||||||
CONF_VERIFY_REGISTER = "verify_register"
|
CONF_VERIFY_REGISTER = "verify_register"
|
||||||
CONF_VERIFY_STATE = "verify_state"
|
CONF_VERIFY_STATE = "verify_state"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue