core/homeassistant/components/switch/deluge.py

113 lines
3.4 KiB
Python
Raw Normal View History

"""
Support for setting the Deluge BitTorrent client in Pause.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/switch.deluge/
"""
import logging
import voluptuous as vol
from homeassistant.components.switch import PLATFORM_SCHEMA
2018-04-28 22:16:22 +00:00
from homeassistant.exceptions import PlatformNotReady
from homeassistant.const import (
CONF_HOST, CONF_NAME, CONF_PORT, CONF_PASSWORD, CONF_USERNAME, STATE_OFF,
STATE_ON)
from homeassistant.helpers.entity import ToggleEntity
import homeassistant.helpers.config_validation as cv
2018-04-28 22:16:22 +00:00
REQUIREMENTS = ['deluge-client==1.4.0']
2018-04-28 22:16:22 +00:00
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'Deluge Switch'
DEFAULT_PORT = 58846
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
vol.Required(CONF_USERNAME): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
})
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Deluge switch."""
from deluge_client import DelugeRPCClient
name = config.get(CONF_NAME)
host = config.get(CONF_HOST)
username = config.get(CONF_USERNAME)
password = config.get(CONF_PASSWORD)
port = config.get(CONF_PORT)
deluge_api = DelugeRPCClient(host, port, username, password)
try:
deluge_api.connect()
except ConnectionRefusedError:
2018-04-28 22:16:22 +00:00
_LOGGER.error("Connection to Deluge Daemon failed")
raise PlatformNotReady
add_entities([DelugeSwitch(deluge_api, name)])
class DelugeSwitch(ToggleEntity):
"""Representation of a Deluge switch."""
def __init__(self, deluge_client, name):
"""Initialize the Deluge switch."""
self._name = name
self.deluge_client = deluge_client
self._state = STATE_OFF
2018-04-28 22:16:22 +00:00
self._available = False
@property
def name(self):
"""Return the name of the switch."""
return self._name
@property
def state(self):
"""Return the state of the device."""
return self._state
@property
def is_on(self):
"""Return true if device is on."""
return self._state == STATE_ON
2018-04-28 22:16:22 +00:00
@property
def available(self):
"""Return true if device is available."""
return self._available
def turn_on(self, **kwargs):
"""Turn the device on."""
2018-04-28 22:16:22 +00:00
torrent_ids = self.deluge_client.call('core.get_session_state')
self.deluge_client.call('core.resume_torrent', torrent_ids)
def turn_off(self, **kwargs):
"""Turn the device off."""
2018-04-28 22:16:22 +00:00
torrent_ids = self.deluge_client.call('core.get_session_state')
self.deluge_client.call('core.pause_torrent', torrent_ids)
def update(self):
"""Get the latest data from deluge and updates the state."""
2018-04-28 22:16:22 +00:00
from deluge_client import FailedToReconnectException
try:
torrent_list = self.deluge_client.call('core.get_torrents_status',
{}, ['paused'])
self._available = True
except FailedToReconnectException:
_LOGGER.error("Connection to Deluge Daemon Lost")
self._available = False
return
for torrent in torrent_list.values():
item = torrent.popitem()
if not item[1]:
self._state = STATE_ON
return
self._state = STATE_OFF