-
-
Notifications
You must be signed in to change notification settings - Fork 30.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add the Xiaomi TV platform. #12359
Add the Xiaomi TV platform. #12359
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
""" | ||
Add support for the Xiaomi TVs. | ||
|
||
For more details about this platform, please refer to the documentation at | ||
https://home-assistant.io/components/xiaomi_tv/ | ||
""" | ||
|
||
import logging | ||
import voluptuous as vol | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add a blank line between standard library and 3rd party imports. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just looked at another platform, and you're absolutely right. Will update in next pull request. |
||
import homeassistant.helpers.config_validation as cv | ||
from homeassistant.const import (CONF_HOST, CONF_NAME, STATE_OFF, STATE_ON) | ||
from homeassistant.components.media_player import ( | ||
SUPPORT_TURN_ON, SUPPORT_TURN_OFF, MediaPlayerDevice, PLATFORM_SCHEMA, | ||
SUPPORT_VOLUME_STEP) | ||
|
||
REQUIREMENTS = ['pymitv==1.0.0'] | ||
|
||
DEFAULT_NAME = "Xiaomi TV" | ||
|
||
_LOGGER = logging.getLogger(__name__) | ||
|
||
SUPPORT_XIAOMI_TV = SUPPORT_VOLUME_STEP | SUPPORT_TURN_ON | \ | ||
SUPPORT_TURN_OFF | ||
|
||
# No host is needed for configuration, however it can be set. | ||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ | ||
vol.Optional(CONF_HOST): cv.string, | ||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, | ||
}) | ||
|
||
|
||
def setup_platform(hass, config, add_devices, discovery_info=None): | ||
"""Set up the Xiaomi TV platform.""" | ||
from pymitv import Discover | ||
|
||
# If a hostname is set. Discovery is skipped. | ||
host = config.get(CONF_HOST) | ||
name = config.get(CONF_NAME) | ||
|
||
if host is not None: | ||
# Check if there's a valid TV at the IP address. | ||
if not Discover().checkIp(host): | ||
_LOGGER.error( | ||
"Could not find Xiaomi TV with specified IP: %s", host | ||
) | ||
else: | ||
# Register TV with Home Assistant. | ||
add_devices([XiaomiTV(host, name)]) | ||
else: | ||
# Otherwise, discover TVs on network. | ||
add_devices(XiaomiTV(tv, DEFAULT_NAME) for tv in Discover().scan()) | ||
|
||
|
||
class XiaomiTV(MediaPlayerDevice): | ||
"""Represent the Xiaomi TV for Home Assistant.""" | ||
|
||
def __init__(self, ip, name): | ||
"""Receive IP address and name to construct class.""" | ||
# Import pymitv library. | ||
from pymitv import TV | ||
|
||
# Initialize the Xiaomi TV. | ||
self._tv = TV(ip) | ||
# Default name value, only to be overridden by user. | ||
self._name = name | ||
self._state = STATE_OFF | ||
|
||
@property | ||
def name(self): | ||
"""Return the display name of this light.""" | ||
return self._name | ||
|
||
@property | ||
def state(self): | ||
"""Return _state variable, containing the appropriate constant.""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. lol |
||
return self._state | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it not possible to get the state from the TV? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, and that is the main limitation of this platform. However, as it stands there's two options, when controlling power on the TV:
I thought the first option sounded better. |
||
|
||
@property | ||
def supported_features(self): | ||
"""Flag media player features that are supported.""" | ||
return SUPPORT_XIAOMI_TV | ||
|
||
def turn_off(self): | ||
""" | ||
Instruct the TV to turn sleep. | ||
|
||
This is done instead of turning off, | ||
because the TV won't accept any input when turned off. Thus, the user | ||
would be unable to turn the TV back on, unless it's done manually. | ||
""" | ||
self._tv.sleep() | ||
|
||
self._state = STATE_OFF | ||
|
||
def turn_on(self): | ||
"""Wake the TV back up from sleep.""" | ||
self._tv.wake() | ||
|
||
self._state = STATE_ON | ||
|
||
def volume_up(self): | ||
"""Increase volume by one.""" | ||
self._tv.volume_up() | ||
|
||
def volume_down(self): | ||
"""Decrease volume by one.""" | ||
self._tv.volume_down() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The url is wrong. Look at an existing platform to see the correct format.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right yes, I had absolutely missed that. The correct url would be
https://home-assistant.io/components/media_player.xiaomi_tv/
.