def determine_service( entity_id: str, command: str, params: dict, units: UnitSystem) -> Tuple[str, dict]: """ Determine service and service_data. Attempt to return a tuple of service and service_data based on the entity and action requested. """ _LOGGER.debug("Handling command %s with data %s", command, params) domain = entity_id.split('.')[0] service_data = {ATTR_ENTITY_ID: entity_id} # type: Dict[str, Any] # special media_player handling if domain == media_player.DOMAIN and command == COMMAND_BRIGHTNESS: brightness = params.get('brightness', 0) service_data[media_player.ATTR_MEDIA_VOLUME_LEVEL] = brightness / 100 return (media_player.SERVICE_VOLUME_SET, service_data) # special cover handling if domain == cover.DOMAIN: if command == COMMAND_BRIGHTNESS: service_data['position'] = params.get('brightness', 0) return (cover.SERVICE_SET_COVER_POSITION, service_data) if command == COMMAND_ONOFF and params.get('on') is True: return (cover.SERVICE_OPEN_COVER, service_data) return (cover.SERVICE_CLOSE_COVER, service_data) # special climate handling if domain == climate.DOMAIN: if command == COMMAND_THERMOSTAT_TEMPERATURE_SETPOINT: service_data['temperature'] = units.temperature( params.get('thermostatTemperatureSetpoint', 25), TEMP_CELSIUS) return (climate.SERVICE_SET_TEMPERATURE, service_data) if command == COMMAND_THERMOSTAT_TEMPERATURE_SET_RANGE: service_data['target_temp_high'] = units.temperature( params.get('thermostatTemperatureSetpointHigh', 25), TEMP_CELSIUS) service_data['target_temp_low'] = units.temperature( params.get('thermostatTemperatureSetpointLow', 18), TEMP_CELSIUS) return (climate.SERVICE_SET_TEMPERATURE, service_data) if command == COMMAND_THERMOSTAT_SET_MODE: service_data['operation_mode'] = params.get( 'thermostatMode', 'off') return (climate.SERVICE_SET_OPERATION_MODE, service_data) if command == COMMAND_BRIGHTNESS: brightness = params.get('brightness') service_data['brightness'] = int(brightness / 100 * 255) return (SERVICE_TURN_ON, service_data) if command == COMMAND_COLOR: color_data = params.get('color') if color_data is not None: if color_data.get('temperature', 0) > 0: service_data[light.ATTR_KELVIN] = color_data.get('temperature') return (SERVICE_TURN_ON, service_data) if color_data.get('spectrumRGB', 0) > 0: # blue is 255 so pad up to 6 chars hex_value = \ ('%0x' % int(color_data.get('spectrumRGB'))).zfill(6) service_data[light.ATTR_RGB_COLOR] = \ color.rgb_hex_to_rgb_list(hex_value) return (SERVICE_TURN_ON, service_data) if command == COMMAND_ACTIVATESCENE: return (SERVICE_TURN_ON, service_data) if COMMAND_ONOFF == command: if params.get('on') is True: return (SERVICE_TURN_ON, service_data) return (SERVICE_TURN_OFF, service_data) return (None, service_data)
def setUp(self): """Set up the tests.""" self.hass = get_test_home_assistant() self.hass.config.units = UnitSystem('custom', TEMP_CELSIUS, LENGTH_METERS, VOLUME_LITERS, MASS_GRAMS)
def determine_service(entity_id: str, command: str, params: dict, units: UnitSystem) -> Tuple[str, dict]: """ Determine service and service_data. Attempt to return a tuple of service and service_data based on the entity and action requested. """ _LOGGER.debug("Handling command %s with data %s", command, params) domain = entity_id.split('.')[0] service_data = {ATTR_ENTITY_ID: entity_id} # type: Dict[str, Any] # special media_player handling if domain == media_player.DOMAIN and command == COMMAND_BRIGHTNESS: brightness = params.get('brightness', 0) service_data[media_player.ATTR_MEDIA_VOLUME_LEVEL] = brightness / 100 return (media_player.SERVICE_VOLUME_SET, service_data) # special cover handling if domain == cover.DOMAIN: if command == COMMAND_BRIGHTNESS: service_data['position'] = params.get('brightness', 0) return (cover.SERVICE_SET_COVER_POSITION, service_data) if command == COMMAND_ONOFF and params.get('on') is True: return (cover.SERVICE_OPEN_COVER, service_data) return (cover.SERVICE_CLOSE_COVER, service_data) # special climate handling if domain == climate.DOMAIN: if command == COMMAND_THERMOSTAT_TEMPERATURE_SETPOINT: service_data['temperature'] = \ units.temperature( params['thermostatTemperatureSetpoint'], TEMP_CELSIUS) return (climate.SERVICE_SET_TEMPERATURE, service_data) if command == COMMAND_THERMOSTAT_TEMPERATURE_SET_RANGE: service_data['target_temp_high'] = units.temperature( params.get('thermostatTemperatureSetpointHigh', 25), TEMP_CELSIUS) service_data['target_temp_low'] = units.temperature( params.get('thermostatTemperatureSetpointLow', 18), TEMP_CELSIUS) return (climate.SERVICE_SET_TEMPERATURE, service_data) if command == COMMAND_THERMOSTAT_SET_MODE: mode = params['thermostatMode'] if mode == CLIMATE_MODE_HEATCOOL: mode = climate.STATE_AUTO service_data['operation_mode'] = mode return (climate.SERVICE_SET_OPERATION_MODE, service_data) if command == COMMAND_BRIGHTNESS: brightness = params.get('brightness') service_data['brightness'] = int(brightness / 100 * 255) return (SERVICE_TURN_ON, service_data) if command == COMMAND_COLOR: color_data = params.get('color') if color_data is not None: if color_data.get('temperature', 0) > 0: service_data[light.ATTR_KELVIN] = color_data.get('temperature') return (SERVICE_TURN_ON, service_data) if color_data.get('spectrumRGB', 0) > 0: # blue is 255 so pad up to 6 chars hex_value = \ ('%0x' % int(color_data.get('spectrumRGB'))).zfill(6) service_data[light.ATTR_RGB_COLOR] = \ color.rgb_hex_to_rgb_list(hex_value) return (SERVICE_TURN_ON, service_data) if command == COMMAND_ACTIVATESCENE: return (SERVICE_TURN_ON, service_data) if COMMAND_ONOFF == command: if params.get('on') is True: return (SERVICE_TURN_ON, service_data) return (SERVICE_TURN_OFF, service_data) return (None, service_data)
def _set_up_units(hass): """Set up the tests.""" hass.config.units = UnitSystem('custom', TEMP_CELSIUS, LENGTH_METERS, VOLUME_LITERS, MASS_GRAMS, PRESSURE_PA)
def test_invalid_units(): """Test errors are raised when invalid units are passed in.""" with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, INVALID_UNIT, LENGTH_METERS, SPEED_METERS_PER_SECOND, VOLUME_LITERS, MASS_GRAMS, PRESSURE_PA, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, INVALID_UNIT, SPEED_METERS_PER_SECOND, VOLUME_LITERS, MASS_GRAMS, PRESSURE_PA, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, LENGTH_METERS, INVALID_UNIT, VOLUME_LITERS, MASS_GRAMS, PRESSURE_PA, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, LENGTH_METERS, SPEED_METERS_PER_SECOND, INVALID_UNIT, MASS_GRAMS, PRESSURE_PA, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, LENGTH_METERS, SPEED_METERS_PER_SECOND, VOLUME_LITERS, INVALID_UNIT, PRESSURE_PA, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, LENGTH_METERS, SPEED_METERS_PER_SECOND, VOLUME_LITERS, MASS_GRAMS, INVALID_UNIT, LENGTH_MILLIMETERS, ) with pytest.raises(ValueError): UnitSystem( SYSTEM_NAME, TEMP_CELSIUS, LENGTH_METERS, SPEED_METERS_PER_SECOND, VOLUME_LITERS, MASS_GRAMS, PRESSURE_PA, INVALID_UNIT, )