Add modbus hvac_* write registers (#89695)

This commit is contained in:
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_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,
} }
), ),
} }

View file

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

View file

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