snapshot fixed sems hacs component
This commit is contained in:
93
homeassistant/custom_components/sems/switch.py
Normal file
93
homeassistant/custom_components/sems/switch.py
Normal file
@@ -0,0 +1,93 @@
|
||||
"""Support for switch controlling an output of a GoodWe SEMS inverter.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://github.com/TimSoethout/goodwe-sems-home-assistant
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
|
||||
from homeassistant.helpers.device_registry import DeviceInfo
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from .const import DOMAIN
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entities):
|
||||
"""Add switches for passed config_entry in HA."""
|
||||
coordinator = hass.data[DOMAIN][config_entry.entry_id]
|
||||
# stationId = config_entry.data[CONF_STATION_ID]
|
||||
|
||||
# coordinator.data should contain a dictionary of inverters, with as data `invert_full`
|
||||
# Don't make switches for homekit, since it is not an inverter
|
||||
async_add_entities(
|
||||
SemsStatusSwitch(coordinator, ent)
|
||||
for idx, ent in enumerate(coordinator.data)
|
||||
if ent != "homeKit"
|
||||
)
|
||||
|
||||
|
||||
class SemsStatusSwitch(CoordinatorEntity, SwitchEntity):
|
||||
"""SemsStatusSwitch using CoordinatorEntity.
|
||||
|
||||
The CoordinatorEntity class provides:
|
||||
should_poll
|
||||
async_update
|
||||
async_added_to_hass
|
||||
available
|
||||
"""
|
||||
|
||||
# Sensor has device name (e.g. Inverter 123456 Power)
|
||||
_attr_has_entity_name = True
|
||||
# _attr_name = None
|
||||
|
||||
def __init__(self, coordinator, sn) -> None:
|
||||
"""Initialize the SemsStatusSwitch.
|
||||
|
||||
Args:
|
||||
coordinator: The data update coordinator for managing updates.
|
||||
sn: The serial number of the inverter.
|
||||
|
||||
"""
|
||||
_LOGGER.debug("Try create SemsStatusSwitch for Inverter %s", sn)
|
||||
super().__init__(coordinator, context=sn)
|
||||
self.coordinator = coordinator
|
||||
self.sn = sn
|
||||
self._attr_device_info = DeviceInfo(
|
||||
identifiers={
|
||||
# Serial numbers are unique identifiers within a specific domain
|
||||
(DOMAIN, self.sn)
|
||||
},
|
||||
# Commented out for now, since not all inverter entries have a name; could be related to creating too much switch devices, also for non-inverters such as homekit.
|
||||
# name=f"Inverter {self.coordinator.data[self.sn]['name']}",
|
||||
)
|
||||
self._attr_unique_id = f"{self.sn}-switch"
|
||||
# somehow needed, no default naming
|
||||
self._attr_name = "Switch"
|
||||
self._attr_device_class = SwitchDeviceClass.OUTLET
|
||||
_LOGGER.debug("Creating SemsStatusSwitch for Inverter %s", self.sn)
|
||||
|
||||
@property
|
||||
def is_on(self) -> bool:
|
||||
"""Return entity status."""
|
||||
_LOGGER.debug("coordinator.data[sn]: %s", self.coordinator.data[self.sn])
|
||||
return self.coordinator.data[self.sn]["status"] == 1
|
||||
|
||||
async def async_turn_off(self, **kwargs):
|
||||
"""Turn off the inverter."""
|
||||
_LOGGER.debug("Inverter %s set to Off", self.sn)
|
||||
await self.hass.async_add_executor_job(
|
||||
self.coordinator.semsApi.change_status, self.sn, 2
|
||||
)
|
||||
|
||||
async def async_turn_on(self, **kwargs):
|
||||
"""Turn on the inverter."""
|
||||
_LOGGER.debug("Inverter %s set to On", self.sn)
|
||||
await self.hass.async_add_executor_job(
|
||||
self.coordinator.semsApi.change_status, self.sn, 4
|
||||
)
|
||||
Reference in New Issue
Block a user