1 """Support for controlling projector via the PJLink protocol."""
3 from __future__
import annotations
5 from pypjlink
import MUTE_AUDIO, Projector
6 from pypjlink.projector
import ProjectorError
7 import voluptuous
as vol
10 PLATFORM_SCHEMA
as MEDIA_PLAYER_PLATFORM_SCHEMA,
12 MediaPlayerEntityFeature,
21 from .const
import CONF_ENCODING, DEFAULT_ENCODING, DEFAULT_PORT, DOMAIN
23 ERR_PROJECTOR_UNAVAILABLE =
"projector unavailable"
25 PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend(
27 vol.Required(CONF_HOST): cv.string,
28 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
29 vol.Optional(CONF_NAME): cv.string,
30 vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string,
31 vol.Optional(CONF_PASSWORD): cv.string,
39 add_entities: AddEntitiesCallback,
40 discovery_info: DiscoveryInfoType |
None =
None,
42 """Set up the PJLink platform."""
43 host = config.get(CONF_HOST)
44 port = config.get(CONF_PORT)
45 name = config.get(CONF_NAME)
46 encoding = config.get(CONF_ENCODING)
47 password = config.get(CONF_PASSWORD)
49 if DOMAIN
not in hass.data:
50 hass.data[DOMAIN] = {}
51 hass_data = hass.data[DOMAIN]
53 device_label = f
"{host}:{port}"
54 if device_label
in hass_data:
57 device =
PjLinkDevice(host, port, name, encoding, password)
58 hass_data[device_label] = device
63 """Format input source for display in UI."""
64 return f
"{input_source_name} {input_source_number}"
68 """Representation of a PJLink device."""
70 _attr_supported_features = (
71 MediaPlayerEntityFeature.VOLUME_MUTE
72 | MediaPlayerEntityFeature.TURN_ON
73 | MediaPlayerEntityFeature.TURN_OFF
74 | MediaPlayerEntityFeature.SELECT_SOURCE
77 def __init__(self, host, port, name, encoding, password):
78 """Iinitialize the PJLink device."""
99 with self.
projectorprojector()
as projector:
101 self.
_attr_name_attr_name = projector.get_name()
102 inputs = projector.get_inputs()
103 except ProjectorError
as err:
104 if str(err) == ERR_PROJECTOR_UNAVAILABLE:
113 """Create PJLink Projector instance."""
116 projector = Projector.from_address(self.
_host_host, self.
_port_port)
117 projector.authenticate(self.
_password_password)
118 except (TimeoutError, OSError)
as err:
120 raise ProjectorError(ERR_PROJECTOR_UNAVAILABLE)
from err
125 """Get the latest state from the device."""
135 with self.
projectorprojector()
as projector:
136 pwstate = projector.get_power()
137 if pwstate
in (
"on",
"warm-up"):
143 except KeyError
as err:
144 if str(err) ==
"'OK'":
148 except ProjectorError
as err:
149 if str(err) ==
"unavailable time":
151 elif str(err) == ERR_PROJECTOR_UNAVAILABLE:
157 """Turn projector off."""
158 with self.
projectorprojector()
as projector:
159 projector.set_power(
"off")
162 """Turn projector on."""
163 with self.
projectorprojector()
as projector:
164 projector.set_power(
"on")
167 """Mute (true) of unmute (false) media player."""
168 with self.
projectorprojector()
as projector:
169 projector.set_mute(MUTE_AUDIO, mute)
172 """Set the input source."""
174 with self.
projectorprojector()
as projector:
175 projector.set_input(*source)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)