""" Support for Vera lights. """ import logging import requests import time import json from homeassistant.helpers import ToggleDevice import homeassistant.external.vera.vera as veraApi _LOGGER = logging.getLogger('Vera_Light') def setup_platform(hass, config, add_devices_callback, discovery_info=None): """ Find and return Vera lights. """ try: base_url = config.get('vera_controller_url') if not base_url: _LOGGER.error("The required parameter 'vera_controller_url' was not found in config") return False device_data_str = config.get('device_data') device_data = None if device_data_str: try: device_data = json.loads(device_data_str) except Exception as json_ex: _LOGGER.error('Vera lights error parsing device info, should be in the format [{"id" : 12, "name": "Lounge Light"}]: %s', json_ex) controller = veraApi.VeraController(base_url) devices = controller.get_devices('Switch') lights = [] for device in devices: if is_switch_a_light(device_data, device.deviceId): lights.append(VeraLight(device, get_extra_device_data(device_data, device.deviceId))) add_devices_callback(lights) except Exception as inst: _LOGGER.error("Could not find Vera lights: %s", inst) return False # If you have z-wave switches that control lights you can configure them # to be treated as lights using the "device_data" parameter in the config. # If "device_data" is not set then all switches are treated as lights def is_switch_a_light(device_data, device_id): if not device_data: return True for item in device_data: if item.get('id') == device_id: return True return False def get_extra_device_data(device_data, device_id): if not device_data: return None for item in device_data: if item.get('id') == device_id: return item return None class VeraLight(ToggleDevice): """ Represents a Vera light """ is_on_status = False #for debouncing status check after command is sent last_command_send = 0 extra_data = None def __init__(self, vera_device, extra_data=None): self.vera_device = vera_device self.extra_data = extra_data @property def unique_id(self): """ Returns the id of this light """ return "{}.{}".format( self.__class__, self.info.get('uniqueid', self.name)) @property def name(self): """ Get the mame of the light. """ if self.extra_data and self.extra_data.get('name'): return self.extra_data.get('name') return self.vera_device.name @property def state_attributes(self): attr = super().state_attributes if self.vera_device.has_battery: attr['Battery'] = self.vera_device.battery_level + '%' if self.vera_device.is_armable: armed = self.vera_device.refresh_value('Armed') attr['Armed'] = 'True' if armed == '1' else 'False' if self.vera_device.is_trippable: lastTripped = self.vera_device.refresh_value('LastTrip') tripTimeStr = time.strftime("%Y-%m-%d %H:%M", time.localtime(int(lastTripped))) attr['Last Tripped'] = tripTimeStr tripped = self.vera_device.refresh_value('Tripped') attr['Tripped'] = 'True' if tripped == '1' else 'False' attr['Vera Device Id'] = self.vera_device.vera_device_id return attr def turn_on(self, **kwargs): self.last_command_send = time.time() self.vera_device.switch_on() self.is_on_status = True def turn_off(self, **kwargs): self.last_command_send = time.time() self.vera_device.switch_off() self.is_on_status = False @property def is_on(self): """ True if device is on. """ self.update() return self.is_on_status def update(self): # We need to debounce the status call after turning light on or off # because the vera has some lag in updating the device status if (self.last_command_send + 5) < time.time(): self.is_on_status = self.vera_device.is_switched_on()