From 8381431550dfa52af2a60e37d4dbc64bb41bfe08 Mon Sep 17 00:00:00 2001 From: David Rapan Date: Sun, 22 Dec 2024 08:35:36 +0100 Subject: [PATCH] refactor: Rename write register methods in conformity w/ umodbus --- custom_components/solarman/api.py | 8 +-- custom_components/solarman/const.py | 12 ++-- custom_components/solarman/entity.py | 2 +- custom_components/solarman/include | 2 +- custom_components/solarman/services.py | 24 +++++--- custom_components/solarman/services.yaml | 75 +++++++++++++++++++++++- 6 files changed, 102 insertions(+), 21 deletions(-) diff --git a/custom_components/solarman/api.py b/custom_components/solarman/api.py index 8b62003..15d89bf 100644 --- a/custom_components/solarman/api.py +++ b/custom_components/solarman/api.py @@ -80,12 +80,12 @@ async def read_write(self, code, start, arg): return await self.modbus.read_input_registers(start, arg) case CODE.WRITE_SINGLE_COIL: return await self.modbus.write_single_coil(start, arg) - case CODE.WRITE_HOLDING_REGISTER: - return await self.modbus.write_holding_register(start, arg) + case CODE.WRITE_SINGLE_REGISTER: + return await self.modbus.write_single_register(start, arg) case CODE.WRITE_MULTIPLE_COILS: return await self.modbus.write_multiple_coils(start, ensure_list(arg)) - case CODE.WRITE_MULTIPLE_HOLDING_REGISTERS: - return await self.modbus.write_multiple_holding_registers(start, ensure_list(arg)) + case CODE.WRITE_MULTIPLE_REGISTERS: + return await self.modbus.write_multiple_registers(start, ensure_list(arg)) case _: raise Exception(f"[{self.serial}] Used incorrect modbus function code {code}") diff --git a/custom_components/solarman/const.py b/custom_components/solarman/const.py index c4e3a2e..4345090 100644 --- a/custom_components/solarman/const.py +++ b/custom_components/solarman/const.py @@ -1,5 +1,4 @@ import types -import struct from datetime import timedelta as td @@ -112,9 +111,9 @@ CODE.READ_HOLDING_REGISTERS = 3 CODE.READ_INPUT = 4 CODE.WRITE_SINGLE_COIL = 5 -CODE.WRITE_HOLDING_REGISTER = 6 +CODE.WRITE_SINGLE_REGISTER = 6 CODE.WRITE_MULTIPLE_COILS = 15 -CODE.WRITE_MULTIPLE_HOLDING_REGISTERS = 16 +CODE.WRITE_MULTIPLE_REGISTERS = 16 SERVICES_PARAM_DEVICE = "device" SERVICES_PARAM_REGISTER = "register" @@ -125,8 +124,11 @@ SERVICE_READ_HOLDING_REGISTERS = "read_holding_registers" SERVICE_READ_INPUT_REGISTERS = "read_input_registers" -SERVICE_WRITE_HOLDING_REGISTER = "write_holding_register" -SERVICE_WRITE_MULTIPLE_HOLDING_REGISTERS = "write_multiple_holding_registers" +SERVICE_WRITE_SINGLE_REGISTER = "write_single_register" +SERVICE_WRITE_MULTIPLE_REGISTERS = "write_multiple_registers" + +DEPRECATION_SERVICE_WRITE_SINGLE_REGISTER = "write_holding_register" +DEPRECATION_SERVICE_WRITE_MULTIPLE_REGISTERS = "write_multiple_holding_registers" DATETIME_FORMAT = "%y/%m/%d %H:%M:%S" TIME_FORMAT = "%H:%M" \ No newline at end of file diff --git a/custom_components/solarman/entity.py b/custom_components/solarman/entity.py index 78a804b..b978df0 100644 --- a/custom_components/solarman/entity.py +++ b/custom_components/solarman/entity.py @@ -140,7 +140,7 @@ def __init__(self, coordinator, sensor): if not "control" in sensor: self._attr_entity_category = EntityCategory.CONFIG - self.code = get_code(sensor, "write", CODE.WRITE_MULTIPLE_HOLDING_REGISTERS) + self.code = get_code(sensor, "write", CODE.WRITE_MULTIPLE_REGISTERS) self.register = min(self.registers) if len(self.registers) > 0 else None async def write(self, value, state = None) -> None: diff --git a/custom_components/solarman/include b/custom_components/solarman/include index beea215..c8c7c6d 160000 --- a/custom_components/solarman/include +++ b/custom_components/solarman/include @@ -1 +1 @@ -Subproject commit beea215abbe26a2cd08390a7e998fc57d64b2f1f +Subproject commit c8c7c6d4442dc36304370d8b71fe24023c507fd4 diff --git a/custom_components/solarman/services.py b/custom_components/solarman/services.py index df1dbb9..b964959 100644 --- a/custom_components/solarman/services.py +++ b/custom_components/solarman/services.py @@ -79,23 +79,23 @@ async def read_holding_registers(call: ServiceCall) -> int: return result - async def write_holding_register(call: ServiceCall) -> None: - _LOGGER.debug(f"write_holding_register: {call}") + async def write_single_register(call: ServiceCall) -> None: + _LOGGER.debug(f"write_single_register: {call}") inverter = get_device(call.data.get(SERVICES_PARAM_DEVICE)) try: - await inverter.call(CODE.WRITE_HOLDING_REGISTER, call.data.get(SERVICES_PARAM_REGISTER), call.data.get(SERVICES_PARAM_VALUE)) + await inverter.call(CODE.WRITE_SINGLE_REGISTER, call.data.get(SERVICES_PARAM_REGISTER), call.data.get(SERVICES_PARAM_VALUE)) except Exception as e: raise ServiceValidationError(e, translation_domain = DOMAIN, translation_key = "call_failed") - async def write_multiple_holding_registers(call: ServiceCall) -> None: - _LOGGER.debug(f"write_multiple_holding_registers: {call}") + async def write_multiple_registers(call: ServiceCall) -> None: + _LOGGER.debug(f"write_multiple_registers: {call}") inverter = get_device(call.data.get(SERVICES_PARAM_DEVICE)) try: - await inverter.call(CODE.WRITE_MULTIPLE_HOLDING_REGISTERS, call.data.get(SERVICES_PARAM_REGISTER), call.data.get(SERVICES_PARAM_VALUES)) + await inverter.call(CODE.WRITE_MULTIPLE_REGISTERS, call.data.get(SERVICES_PARAM_REGISTER), call.data.get(SERVICES_PARAM_VALUES)) except Exception as e: raise ServiceValidationError(e, translation_domain = DOMAIN, translation_key = "call_failed") @@ -108,9 +108,17 @@ async def write_multiple_holding_registers(call: ServiceCall) -> None: ) hass.services.async_register( - DOMAIN, SERVICE_WRITE_HOLDING_REGISTER, write_holding_register, schema = vol.Schema(HEADER_SCHEMA | VALUE_SCHEMA) + DOMAIN, SERVICE_WRITE_SINGLE_REGISTER, write_single_register, schema = vol.Schema(HEADER_SCHEMA | VALUE_SCHEMA) ) hass.services.async_register( - DOMAIN, SERVICE_WRITE_MULTIPLE_HOLDING_REGISTERS, write_multiple_holding_registers, schema = vol.Schema(HEADER_SCHEMA | VALUES_SCHEMA) + DOMAIN, SERVICE_WRITE_MULTIPLE_REGISTERS, write_multiple_registers, schema = vol.Schema(HEADER_SCHEMA | VALUES_SCHEMA) + ) + + hass.services.async_register( + DOMAIN, DEPRECATION_SERVICE_WRITE_SINGLE_REGISTER, write_single_register, schema = vol.Schema(HEADER_SCHEMA | VALUE_SCHEMA) + ) + + hass.services.async_register( + DOMAIN, DEPRECATION_SERVICE_WRITE_MULTIPLE_REGISTERS, write_multiple_registers, schema = vol.Schema(HEADER_SCHEMA | VALUES_SCHEMA) ) diff --git a/custom_components/solarman/services.yaml b/custom_components/solarman/services.yaml index e3212a5..332fbde 100644 --- a/custom_components/solarman/services.yaml +++ b/custom_components/solarman/services.yaml @@ -66,8 +66,79 @@ read_input_registers: max: 125 mode: box +write_single_register: + name: Write Single Register (Modbus Function Code 6) + description: USE WITH CARE! (Some devices might not accept Code 6 in this case try to use 'Write Multiple Registers') + fields: + device: + name: Device + description: The Device + example: "Inverter" + required: true + selector: + device: + filter: + - integration: solarman + register: + name: Register + description: Modbus register address + example: 16384 + required: true + selector: + number: + min: 0 + max: 65535 + mode: box + value: + name: Value + description: Value to write + example: "1" + required: true + selector: + number: + min: 0 + max: 65535 + mode: box + +write_multiple_registers: + name: Write Multiple Registers (Modbus Function Code 16) + description: USE WITH CARE! (Some devices might not accept Code 16 in this case try to use 'Write Single Register') + fields: + device: + name: Device + description: The Device + example: "Inverter" + required: true + selector: + device: + filter: + - integration: solarman + register: + name: Register + description: Modbus register address + example: 16384 + required: true + selector: + number: + min: 0 + max: 65535 + mode: box + values: + name: Values + description: Values to write + example: | + - 1 + - 2 + - 3 + required: true + selector: + number: + min: 0 + max: 65535 + mode: box + write_holding_register: - name: Write Holding Register (Modbus Function Code 6) + name: DEPRECATED! Write Holding Register (Modbus Function Code 6) description: USE WITH CARE! (Some devices might not accept Code 6 in this case try to use 'Write Multiple Holding Registers') fields: device: @@ -101,7 +172,7 @@ write_holding_register: mode: box write_multiple_holding_registers: - name: Write Multiple Holding Registers (Modbus Function Code 16) + name: DEPRECATED! Write Multiple Holding Registers (Modbus Function Code 16) description: USE WITH CARE! (Some devices might not accept Code 16 in this case try to use 'Write Holding Register') fields: device: