You kind of answered your own queries there near the end, families are good for minimizing redundant code in some scenarios like when you have the bullets hitting all 'enemies' as one family, but sometimes they are not useful for picking. If you create a family it will create a random object not one of each, you'll need to do something outside of the families such as set a variable to a random number and each number corresponds with spawning an individual enemy object type.
I'm not sure about the detector logic, are you saying enemies detect all other enemies but not themselves? You could do something where each enemy(family) has an ID, it's an instance variable set when they are created, assign it to the detector they have and say that the detector detects all enemies besides the one that matches its instance variable ID.