Skip to content

Commit

Permalink
refactor: HA nomenclature - entity descriptions
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrapan committed Oct 12, 2024
1 parent 0c79b18 commit 6192390
Show file tree
Hide file tree
Showing 11 changed files with 38 additions and 44 deletions.
4 changes: 2 additions & 2 deletions custom_components/solarman/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,8 @@ async def load(self, name, mac, path, file):

_LOGGER.debug(self.device_info)

def get_sensors(self):
return self.profile.get_sensors() if self.profile else []
def get_entity_descriptions(self):
return (STATE_SENSORS + self.profile.get_entity_descriptions()) if self.profile else []

def available(self):
return self.state > -1
Expand Down
14 changes: 7 additions & 7 deletions custom_components/solarman/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,23 @@

_PLATFORM = get_current_file_name(__name__)

def _create_sensor(coordinator, sensor):
if "artificial" in sensor:
match sensor["artificial"]:
def _create_entity(coordinator, description):
if "artificial" in description:
match description["artificial"]:
case "state":
return SolarmanConnectionSensor(coordinator, sensor)
return SolarmanConnectionSensor(coordinator, description)

return SolarmanBinarySensorEntity(coordinator, sensor)
return SolarmanBinarySensorEntity(coordinator, description)

async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: _create_sensor(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM))
async_add_entities(create_entity(lambda x: _create_entity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM))

return True

Expand Down
2 changes: 2 additions & 0 deletions custom_components/solarman/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@

PROFILE_REDIRECT_TABLE = { "sofar_hyd3k-6k-es.yaml": "sofar_hyd-es.yaml", "hyd-zss-hp-3k-6k.yaml": "zcs_azzurro-hyd-zss-hp.yaml", "solis_1p8k-5g.yaml": "solis_1p-5g.yaml" }

STATE_SENSORS = [{"name": "Connection", "artificial": "state", "platform": "binary_sensor"}, {"name": "Update Interval", "artificial": "interval"}]

CONTROL_CODE = types.SimpleNamespace()
CONTROL_CODE.REQUEST = struct.pack("<H", 0x4510)
CONTROL_CODE.RESPONSE = struct.pack("<H", 0x1510)
Expand Down
4 changes: 2 additions & 2 deletions custom_components/solarman/datetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: SolarmanDateTimeEntity(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM))
async_add_entities(create_entity(lambda x: SolarmanDateTimeEntity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM))

return True

Expand Down
6 changes: 3 additions & 3 deletions custom_components/solarman/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@

_LOGGER = logging.getLogger(__name__)

def create_entity(creator, sensor):
def create_entity(creator, description):
try:
entity = creator(sensor)
entity = creator(description)

entity.update()

return entity
except BaseException as e:
_LOGGER.error(f"Configuring {sensor} failed. [{format_exception(e)}]")
_LOGGER.error(f"Configuring {description} failed. [{format_exception(e)}]")
raise

class SolarmanCoordinatorEntity(CoordinatorEntity[InverterCoordinator]):
Expand Down
4 changes: 2 additions & 2 deletions custom_components/solarman/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: SolarmanNumberEntity(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM) or "configurable" in sensor)
async_add_entities(create_entity(lambda x: SolarmanNumberEntity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM) or "configurable" in d)

return True

Expand Down
12 changes: 2 additions & 10 deletions custom_components/solarman/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,6 @@ def is_valid(self, parameters):
def is_enabled(self, parameters):
return not "disabled" in parameters

def is_sensor(self, parameters):
return self.is_valid(parameters) and not "attribute" in parameters

def is_requestable(self, parameters):
return self.is_valid(parameters) and self.is_enabled(parameters) and parameters["rule"] > 0

Expand All @@ -85,13 +82,8 @@ def set_state(self, key, value):
self._result[key] = {}
self._result[key]["state"] = value

def get_sensors(self):
result = [{"name": "Connection", "artificial": "state", "platform": "binary_sensor"}, {"name": "Update Interval", "artificial": "interval"}]
for i in self._items:
if self.is_sensor(i):
result.append(i)

return result
def get_entity_descriptions(self):
return [i for i in self._items if self.is_valid(i) and not "attribute" in i]

def schedule_requests(self, runtime = 0):
self.flush_states()
Expand Down
4 changes: 2 additions & 2 deletions custom_components/solarman/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: SolarmanSelectEntity(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM))
async_add_entities(create_entity(lambda x: SolarmanSelectEntity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM))

return True

Expand Down
24 changes: 12 additions & 12 deletions custom_components/solarman/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,18 @@

_PLATFORM = get_current_file_name(__name__)

def _create_sensor(coordinator, sensor, battery_nominal_voltage, battery_life_cycle_rating):
if "artificial" in sensor:
match sensor["artificial"]:
def _create_entity(coordinator, description, battery_nominal_voltage, battery_life_cycle_rating):
if "artificial" in description:
match description["artificial"]:
case "interval":
return SolarmanIntervalSensor(coordinator, sensor)
elif not "registers" in sensor and sensor["name"] in ("Battery SOH", "Battery State", "Today Battery Life Cycles", "Total Battery Life Cycles"):
return SolarmanBatterySensor(coordinator, sensor, battery_nominal_voltage, battery_life_cycle_rating)
return SolarmanIntervalSensor(coordinator, description)
elif not "registers" in description and battery_nominal_voltage > 0 and battery_life_cycle_rating > 0 and description["name"] in ("Battery SOH", "Battery State", "Today Battery Life Cycles", "Total Battery Life Cycles"):
return SolarmanBatterySensor(coordinator, description, battery_nominal_voltage, battery_life_cycle_rating)

if "restore" in sensor or "ensure_increasing" in sensor:
return SolarmanRestoreSensor(coordinator, sensor, battery_nominal_voltage, battery_life_cycle_rating)
if "restore" in description or "ensure_increasing" in description:
return SolarmanRestoreSensor(coordinator, description, battery_nominal_voltage, battery_life_cycle_rating)

return SolarmanSensor(coordinator, sensor, battery_nominal_voltage, battery_life_cycle_rating)
return SolarmanSensor(coordinator, description, battery_nominal_voltage, battery_life_cycle_rating)

async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config.options}")
Expand All @@ -45,11 +45,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
battery_nominal_voltage = options.get(CONF_BATTERY_NOMINAL_VOLTAGE)
battery_life_cycle_rating = options.get(CONF_BATTERY_LIFE_CYCLE_RATING)

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: _create_sensor(coordinator, s, battery_nominal_voltage, battery_life_cycle_rating), sensor) for sensor in sensors if (is_platform(sensor, _PLATFORM) and not "configurable" in sensor))
async_add_entities(create_entity(lambda x: _create_entity(coordinator, x, battery_nominal_voltage, battery_life_cycle_rating), d) for d in descriptions if (is_platform(d, _PLATFORM) and not "configurable" in d))

return True

Expand Down Expand Up @@ -83,7 +83,7 @@ class SolarmanSensor(SolarmanSensorEntity):
def __init__(self, coordinator, sensor, battery_nominal_voltage, battery_life_cycle_rating):
super().__init__(coordinator, _PLATFORM, sensor)
self._sensor_ensure_increasing = "ensure_increasing" in sensor
if "name" in sensor and sensor["name"] == "Battery":
if "name" in sensor and sensor["name"] == "Battery" and battery_nominal_voltage > 0 and battery_life_cycle_rating > 0:
self._attr_extra_state_attributes = self._attr_extra_state_attributes | { "Nominal Voltage": battery_nominal_voltage, "Life Cycle Rating": battery_life_cycle_rating }

class SolarmanRestoreSensor(SolarmanSensor, RestoreSensor):
Expand Down
4 changes: 2 additions & 2 deletions custom_components/solarman/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: SolarmanSwitchEntity(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM))
async_add_entities(create_entity(lambda x: SolarmanSwitchEntity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM))

return True

Expand Down
4 changes: 2 additions & 2 deletions custom_components/solarman/time.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ async def async_setup_entry(hass: HomeAssistant, config: ConfigEntry, async_add_
_LOGGER.debug(f"async_setup_entry: {config.options}")
coordinator = hass.data[DOMAIN][config.entry_id]

sensors = coordinator.inverter.get_sensors()
descriptions = coordinator.inverter.get_entity_descriptions()

_LOGGER.debug(f"async_setup: async_add_entities")

async_add_entities(create_entity(lambda s: SolarmanTimeEntity(coordinator, s), sensor) for sensor in sensors if is_platform(sensor, _PLATFORM))
async_add_entities(create_entity(lambda x: SolarmanTimeEntity(coordinator, x), d) for d in descriptions if is_platform(d, _PLATFORM))

return True

Expand Down

0 comments on commit 6192390

Please sign in to comment.