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

def subscribe(self, field_names):
        """
        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
        """
        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