select.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """Select platform for Solar of Things integration."""
  2. from __future__ import annotations
  3. import logging
  4. from homeassistant.components.select import SelectEntity
  5. from homeassistant.config_entries import ConfigEntry
  6. from homeassistant.core import HomeAssistant
  7. from homeassistant.helpers.entity_platform import AddEntitiesCallback
  8. from homeassistant.helpers.update_coordinator import CoordinatorEntity
  9. from .const import DOMAIN
  10. _LOGGER = logging.getLogger(__name__)
  11. OPERATING_MODES = ["Self-Use", "Time-of-Use", "Backup", "Grid-Tie", "Off-Grid"]
  12. BATTERY_PRIORITY_MODES = ["Solar First", "Battery First", "Grid First"]
  13. async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> None:
  14. data = hass.data[DOMAIN][entry.entry_id]
  15. api = data["api"]
  16. station_id: str = data["station_id"]
  17. device_coordinators = data["device_coordinators"]
  18. entities: list[SelectEntity] = []
  19. for device_id, coordinator in device_coordinators.items():
  20. device_name = (coordinator.device_meta or {}).get("name") or device_id
  21. entities.extend(
  22. [
  23. SolarOfThingsOperatingModeSelect(api, coordinator, station_id, device_id, device_name),
  24. SolarOfThingsBatteryPrioritySelect(api, coordinator, station_id, device_id, device_name),
  25. ]
  26. )
  27. async_add_entities(entities)
  28. class _BaseSelect(CoordinatorEntity, SelectEntity):
  29. def __init__(self, api, coordinator, station_id: str, device_id: str, device_name: str) -> None:
  30. super().__init__(coordinator)
  31. self._api = api
  32. self._station_id = station_id
  33. self._device_id = device_id
  34. self._device_name = device_name
  35. @property
  36. def device_info(self):
  37. return {
  38. "identifiers": {(DOMAIN, self._station_id, self._device_id)},
  39. "name": self._device_name,
  40. "manufacturer": "Siseli",
  41. "model": (self.coordinator.data.get("device_meta") or {}).get("model") if self.coordinator.data else None,
  42. "via_device": (DOMAIN, self._station_id),
  43. }
  44. class SolarOfThingsOperatingModeSelect(_BaseSelect):
  45. def __init__(self, api, coordinator, station_id: str, device_id: str, device_name: str) -> None:
  46. super().__init__(api, coordinator, station_id, device_id, device_name)
  47. self._attr_name = f"{device_name} Operating Mode"
  48. self._attr_unique_id = f"{DOMAIN}_{station_id}_{device_id}_operating_mode"
  49. self._attr_options = OPERATING_MODES
  50. self._attr_icon = "mdi:cog"
  51. @property
  52. def current_option(self):
  53. return ((self.coordinator.data or {}).get("settings") or {}).get("operatingMode")
  54. async def async_select_option(self, option: str) -> None:
  55. await self.hass.async_add_executor_job(self._api.set_operating_mode, self._device_id, option)
  56. await self.coordinator.async_request_refresh()
  57. class SolarOfThingsBatteryPrioritySelect(_BaseSelect):
  58. def __init__(self, api, coordinator, station_id: str, device_id: str, device_name: str) -> None:
  59. super().__init__(api, coordinator, station_id, device_id, device_name)
  60. self._attr_name = f"{device_name} Battery Priority"
  61. self._attr_unique_id = f"{DOMAIN}_{station_id}_{device_id}_battery_priority"
  62. self._attr_options = BATTERY_PRIORITY_MODES
  63. self._attr_icon = "mdi:battery-sync"
  64. @property
  65. def current_option(self):
  66. return ((self.coordinator.data or {}).get("settings") or {}).get("batteryPriority")
  67. async def async_select_option(self, option: str) -> None:
  68. await self.hass.async_add_executor_job(self._api.set_battery_priority, self._device_id, option)
  69. await self.coordinator.async_request_refresh()