96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
"""
|
|
Support for Powerview scenes from a Powerview hub.
|
|
|
|
For more details about this component, please refer to the documentation at
|
|
https://home-assistant.io/components/scene.hunterdouglas_powerview/
|
|
"""
|
|
import asyncio
|
|
import logging
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.scene import Scene, DOMAIN
|
|
from homeassistant.const import CONF_PLATFORM
|
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.helpers.entity import async_generate_entity_id
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
REQUIREMENTS = ['aiopvapi==1.4']
|
|
|
|
ENTITY_ID_FORMAT = DOMAIN + '.{}'
|
|
HUB_ADDRESS = 'address'
|
|
|
|
PLATFORM_SCHEMA = vol.Schema({
|
|
vol.Required(CONF_PLATFORM): 'hunterdouglas_powerview',
|
|
vol.Required(HUB_ADDRESS): cv.string,
|
|
})
|
|
|
|
SCENE_DATA = 'sceneData'
|
|
ROOM_DATA = 'roomData'
|
|
SCENE_NAME = 'name'
|
|
ROOM_NAME = 'name'
|
|
SCENE_ID = 'id'
|
|
ROOM_ID = 'id'
|
|
ROOM_ID_IN_SCENE = 'roomId'
|
|
STATE_ATTRIBUTE_ROOM_NAME = 'roomName'
|
|
|
|
|
|
@asyncio.coroutine
|
|
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|
"""Set up home assistant scene entries."""
|
|
from aiopvapi.hub import Hub
|
|
|
|
hub_address = config.get(HUB_ADDRESS)
|
|
websession = async_get_clientsession(hass)
|
|
|
|
_hub = Hub(hub_address, hass.loop, websession)
|
|
_scenes = yield from _hub.scenes.get_scenes()
|
|
_rooms = yield from _hub.rooms.get_rooms()
|
|
|
|
if not _scenes or not _rooms:
|
|
return
|
|
pvscenes = (PowerViewScene(hass, _scene, _rooms, _hub)
|
|
for _scene in _scenes[SCENE_DATA])
|
|
async_add_devices(pvscenes)
|
|
|
|
|
|
class PowerViewScene(Scene):
|
|
"""Representation of a Powerview scene."""
|
|
|
|
def __init__(self, hass, scene_data, room_data, hub):
|
|
"""Initialize the scene."""
|
|
self.hub = hub
|
|
self.hass = hass
|
|
self._sync_room_data(room_data, scene_data)
|
|
self._name = scene_data[SCENE_NAME]
|
|
self._scene_id = scene_data[SCENE_ID]
|
|
self.entity_id = async_generate_entity_id(
|
|
ENTITY_ID_FORMAT, str(scene_data[SCENE_ID]), hass=hass)
|
|
|
|
def _sync_room_data(self, room_data, scene_data):
|
|
"""Sync the room data."""
|
|
room = next((room for room in room_data[ROOM_DATA]
|
|
if room[ROOM_ID] == scene_data[ROOM_ID_IN_SCENE]), {})
|
|
|
|
self._room_name = room.get(ROOM_NAME, '')
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the scene."""
|
|
return self._name
|
|
|
|
@property
|
|
def device_state_attributes(self):
|
|
"""Return the state attributes."""
|
|
return {STATE_ATTRIBUTE_ROOM_NAME: self._room_name}
|
|
|
|
@property
|
|
def icon(self):
|
|
"""Icon to use in the frontend."""
|
|
return 'mdi:blinds'
|
|
|
|
def async_activate(self):
|
|
"""Activate scene. Try to get entities into requested state."""
|
|
yield from self.hub.scenes.activate_scene(self._scene_id)
|