Add modbus hvac_* write registers (#89695)

pull/89748/head
jan iversen 2023-03-15 14:09:14 +01:00 committed by GitHub
parent a244749712
commit 6e5b4f9f82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 12 deletions

View File

@ -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,
}
),
}

View File

@ -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()

View File

@ -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"