1 """Support for Epson projector."""
3 from __future__
import annotations
7 from epson_projector
import Projector, ProjectorUnavailableError
8 from epson_projector.const
import (
30 import voluptuous
as vol
34 MediaPlayerEntityFeature,
40 config_validation
as cv,
41 device_registry
as dr,
43 entity_registry
as er,
48 from .const
import ATTR_CMODE, DOMAIN, SERVICE_SELECT_CMODE
50 _LOGGER = logging.getLogger(__name__)
55 config_entry: ConfigEntry,
56 async_add_entities: AddEntitiesCallback,
58 """Set up the Epson projector from a config entry."""
59 projector: Projector = hass.data[DOMAIN][config_entry.entry_id]
62 unique_id=config_entry.unique_id
or config_entry.entry_id,
66 platform = entity_platform.async_get_current_platform()
67 platform.async_register_entity_service(
69 {vol.Required(ATTR_CMODE): vol.All(cv.string, vol.Any(*CMODE_LIST_SET))},
75 """Representation of Epson Projector Device."""
77 _attr_has_entity_name =
True
80 _attr_supported_features = (
81 MediaPlayerEntityFeature.TURN_ON
82 | MediaPlayerEntityFeature.TURN_OFF
83 | MediaPlayerEntityFeature.SELECT_SOURCE
84 | MediaPlayerEntityFeature.VOLUME_MUTE
85 | MediaPlayerEntityFeature.VOLUME_STEP
86 | MediaPlayerEntityFeature.NEXT_TRACK
87 | MediaPlayerEntityFeature.PREVIOUS_TRACK
91 self, projector: Projector, unique_id: str, entry: ConfigEntry
93 """Initialize entity to control Epson projector."""
101 identifiers={(DOMAIN, unique_id)},
102 manufacturer=
"Epson",
107 """Set unique id for projector config entry."""
108 _LOGGER.debug(
"Setting unique_id for projector")
109 if self.
_entry_entry.unique_id:
111 if uid := await self.
_projector_projector.get_serial_number():
112 self.
hasshass.config_entries.async_update_entry(self.
_entry_entry, unique_id=uid)
113 ent_reg = er.async_get(self.
hasshass)
114 old_entity_id = ent_reg.async_get_entity_id(
115 "media_player", DOMAIN, self.
_entry_entry.entry_id
117 if old_entity_id
is not None:
118 ent_reg.async_update_entity(old_entity_id, new_unique_id=uid)
119 dev_reg = dr.async_get(self.
hasshass)
120 device = dev_reg.async_get_device({(DOMAIN, self.
_entry_entry.entry_id)})
121 if device
is not None:
122 dev_reg.async_update_device(device.id, new_identifiers={(DOMAIN, uid)})
123 self.
hasshass.async_create_task(
124 self.
hasshass.config_entries.async_reload(self.
_entry_entry.entry_id)
130 """Update state of device."""
132 power_state = await self.
_projector_projector.get_power()
133 except ProjectorUnavailableError
as ex:
134 _LOGGER.debug(
"Projector is unavailable: %s", ex)
140 _LOGGER.debug(
"Projector status: %s", power_state)
142 if power_state == EPSON_CODES[POWER]:
147 cmode = await self.
_projector_projector.get_property(CMODE)
148 self.
_cmode_cmode = CMODE_LIST.get(cmode, self.
_cmode_cmode)
149 source = await self.
_projector_projector.get_property(SOURCE)
151 if volume := await self.
_projector_projector.get_property(VOLUME):
156 elif power_state
in BUSY_CODES:
164 await self.
_projector_projector.send_command(TURN_ON)
168 """Turn off epson."""
170 await self.
_projector_projector.send_command(TURN_OFF)
174 """Set color mode in Epson."""
175 await self.
_projector_projector.send_command(CMODE_LIST_SET[cmode])
178 """Select input source."""
179 selected_source = INV_SOURCES[source]
180 await self.
_projector_projector.send_command(selected_source)
183 """Mute (true) or unmute (false) sound."""
184 await self.
_projector_projector.send_command(MUTE)
187 """Increase volume."""
188 await self.
_projector_projector.send_command(VOL_UP)
191 """Decrease volume."""
192 await self.
_projector_projector.send_command(VOL_DOWN)
195 """Play media via Epson."""
196 await self.
_projector_projector.send_command(PLAY)
199 """Pause media via Epson."""
200 await self.
_projector_projector.send_command(PAUSE)
204 await self.
_projector_projector.send_command(FAST)
207 """Skip to previous."""
208 await self.
_projector_projector.send_command(BACK)
212 """Return device specific state attributes."""
213 if self.
_cmode_cmode
is None:
215 return {ATTR_CMODE: self.
_cmode_cmode}