<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def async_change_special_device( self, device_id: int, group_number: int, unit_number: int, enable_status: ESFlags, switches: SwitchFlags, special_status: SSFlags, high_limit: Optional[Union[int, float]], low_limit: Optional[Union[int, float]], control_high_limit: Optional[Union[int, float]], control_low_limit: Optional[Union[int, float]]) -> None: """ Change settings for a 'Special' device on the base unit. :param device_id: unique identifier for the device to be changed :param group_number: group number the device is to be assigned to :param unit_number: unit number the device is to be assigned to :param enable_status: flags indicating settings to enable :param switches: indicates switches that will be activated when device is triggered :param special_status: flags indicating 'Special' settings to enable :param high_limit: triggers on readings higher than value :param low_limit: triggers on readings lower than value :param control_high_limit: trigger switch for readings higher than value :param control_low_limit: trigger switch for readings lower than value """


        # Lookup device using zone to obtain an accurate index and current
        # values, which will be needed to perform the change command
        device = self._devices[device_id]

        # Verify it is a Special device
        if not isinstance(device, SpecialDevice):
            raise ValueError("Device to be changed is not a Special device")

        response = await self._protocol.async_execute(
            GetDeviceCommand(device.category, device.group_number, device.unit_number))
        if isinstance(response, DeviceInfoResponse):
            # Control limits only specified when they are supported
            if response.control_limit_fields_exist:
                command = ChangeSpecial2DeviceCommand(
                    device.category, response.index, group_number, unit_number,
                    enable_status, switches, response.current_status, response.down_count,
                    response.message_attribute, response.current_reading, special_status,
                    high_limit, low_limit, control_high_limit, control_low_limit)
            else:
                command = ChangeSpecialDeviceCommand(
                    device.category, response.index, group_number, unit_number,
                    enable_status, switches, response.current_status, response.down_count,
                    response.message_attribute, response.current_reading, special_status,
                    high_limit, low_limit)
            response = await self._protocol.async_execute(command)
            if isinstance(response, DeviceSettingsResponse):
                device._handle_response(response) # pylint: disable=protected-access
        if isinstance(response, DeviceNotFoundResponse):
            raise ValueError("Device to be changed was not found")