"""Provide animated GIF loops of BOM radar imagery.""" import voluptuous as vol from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from homeassistant.const import CONF_ID, CONF_NAME from homeassistant.helpers import config_validation as cv CONF_DELTA = 'delta' CONF_FRAMES = 'frames' CONF_LOCATION = 'location' CONF_OUTFILE = 'filename' LOCATIONS = [ 'Adelaide', 'Albany', 'AliceSprings', 'Bairnsdale', 'Bowen', 'Brisbane', 'Broome', 'Cairns', 'Canberra', 'Carnarvon', 'Ceduna', 'Dampier', 'Darwin', 'Emerald', 'Esperance', 'Geraldton', 'Giles', 'Gladstone', 'Gove', 'Grafton', 'Gympie', 'HallsCreek', 'Hobart', 'Kalgoorlie', 'Katherine', 'Learmonth', 'Longreach', 'Mackay', 'Marburg', 'Melbourne', 'Mildura', 'Moree', 'MorningtonIs', 'MountIsa', 'MtGambier', 'Namoi', 'Newcastle', 'Newdegate', 'NorfolkIs', 'NWTasmania', 'Perth', 'PortHedland', 'SellicksHill', 'SouthDoodlakine', 'Sydney', 'Townsville', 'WaggaWagga', 'Warrego', 'Warruwi', 'Watheroo', 'Weipa', 'WillisIs', 'Wollongong', 'Woomera', 'Wyndham', 'Yarrawonga', ] def _validate_schema(config): if config.get(CONF_LOCATION) is None: if not all(config.get(x) for x in (CONF_ID, CONF_DELTA, CONF_FRAMES)): raise vol.Invalid( "Specify '{}', '{}' and '{}' when '{}' is unspecified".format( CONF_ID, CONF_DELTA, CONF_FRAMES, CONF_LOCATION)) return config LOCATIONS_MSG = "Set '{}' to one of: {}".format( CONF_LOCATION, ', '.join(sorted(LOCATIONS))) XOR_MSG = "Specify exactly one of '{}' or '{}'".format(CONF_ID, CONF_LOCATION) PLATFORM_SCHEMA = vol.All( PLATFORM_SCHEMA.extend({ vol.Exclusive(CONF_ID, 'xor', msg=XOR_MSG): cv.string, vol.Exclusive(CONF_LOCATION, 'xor', msg=XOR_MSG): vol.In( LOCATIONS, msg=LOCATIONS_MSG), vol.Optional(CONF_DELTA): cv.positive_int, vol.Optional(CONF_FRAMES): cv.positive_int, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_OUTFILE): cv.string, }), _validate_schema) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up BOM radar-loop camera component.""" location = config.get(CONF_LOCATION) or "ID {}".format(config.get(CONF_ID)) name = config.get(CONF_NAME) or "BOM Radar Loop - {}".format(location) args = [config.get(x) for x in (CONF_LOCATION, CONF_ID, CONF_DELTA, CONF_FRAMES, CONF_OUTFILE)] add_entities([BOMRadarCam(name, *args)]) class BOMRadarCam(Camera): """A camera component producing animated BOM radar-imagery GIFs.""" def __init__(self, name, location, radar_id, delta, frames, outfile): """Initialize the component.""" from bomradarloop import BOMRadarLoop super().__init__() self._name = name self._cam = BOMRadarLoop(location, radar_id, delta, frames, outfile) def camera_image(self): """Return the current BOM radar-loop image.""" return self._cam.current @property def name(self): """Return the component name.""" return self._name