code: def subscribe(self, field_names):
          
          available_controls = dict(self.raildriver.get_controller_list()).values()
          for field in field_names:
              if field not in available_controls:
                  raise ValueError('Cannot subscribe to a missing controller {}'.format(field))
          self.subscribed_fields = field_names
docs: Subscribe to given fields.
  
          Special fields cannot be subscribed to and will be checked on every iteration. These include:
  
          * loco name
          * coordinates
          * fuel level
          * gradient
          * current heading
          * is in tunnel
          * time
  
          You can of course still receive notifications when those change.
  
          It is important to understand that when the loco changes the set of possible controllers will likely change
          too. Any missing field changes will stop triggering notifications.
  
          :param field_names: list
          :raises ValueError if field is not present on current loco