VVO Online EFA TripRequest
    (GET http://efa.vvo-online.de:8080/dvb/XML_TRIP_REQUEST2)

    :param origin: Origin of route
    :param destination: Destination of route
    :param city_origin: City of origin
    :param city_destination: City of destination
    :param time: Unix timestamp of departure
    :param deparr: 'dep' for departure time (default), or 'arr' for arrival
    :param eduroam: Request from eduroam
    :param recommendations: Recommendations for interchange
    :param raw: Return raw response
    :return: List of single trips

def route(origin, destination, city_origin='Dresden', city_destination='Dresden', time=None,
          deparr='dep', eduroam=False, recommendations=False, *, raw=False):
    """
    VVO Online EFA TripRequest
    (GET http://efa.vvo-online.de:8080/dvb/XML_TRIP_REQUEST2)

    :param origin: Origin of route
    :param destination: Destination of route
    :param city_origin: City of origin
    :param city_destination: City of destination
    :param time: Unix timestamp of departure
    :param deparr: 'dep' for departure time (default), or 'arr' for arrival
    :param eduroam: Request from eduroam
    :param recommendations: Recommendations for interchange
    :param raw: Return raw response
    :return: List of single trips
    """

    assert deparr == 'dep' or deparr == 'arr'

    time = datetime.now() if time is None else datetime.fromtimestamp(int(time))

    url = 'http://efa.faplino.de/dvb/XML_TRIP_REQUEST2' if eduroam \
        else 'http://efa.vvo-online.de:8080/dvb/XML_TRIP_REQUEST2'

    try:
        r = requests.get(
            url=url,
            params={
                'sessionID': '0',
                'requestID': '0',
                'language': 'de',
                'execInst': 'normal',
                'command': '',
                'ptOptionsActive': '-1',
                'itOptionsActive': '',
                'itDateDay': time.day,
                'itDateMonth': time.month,
                'itDateYear': time.year,
                'place_origin': city_origin,
                'placeState_origin': 'empty',
                'type_origin': 'stop',
                'name_origin': origin,
                'nameState_origin': 'empty',
                'place_destination': city_destination,
                'placeState_destination': 'empty',
                'type_destination': 'stop',
                'name_destination': destination,
                'nameState_destination': 'empty',
                'itdTripDateTimeDepArr': deparr,
                'itdTimeHour': time.hour,
                'idtTimeMinute': time.minute,
                'outputFormat': 'JSON',
                'coordOutputFormat': 'WGS84',
                'coordOutputFormatTail': '0',
            },
            timeout=10
        )
        if r.status_code == 200:
            response = json.loads(r.content.decode('utf-8'))
        else:
            raise requests.HTTPError('HTTP Status: {}'.format(r.status_code))
    except requests.Timeout:
        print('Failed to access VVO TripRequest. Connection timed out. Are you connected to eduroam?')
        response = None
    except requests.RequestException as e:
        print('Failed to access VVO TripRequest. Request Exception', e)
        response = None

    if response is None:
        return None

    if raw:
        return response

    prettified = {
        'origin': response['origin']['points']['point']['name'],
        'destination': response['destination']['points']['point']['name'],
        'trips': [
            process_single_trip(single_trip) for single_trip in response['trips']
            ]
    }

    if recommendations:
        prettified['trips'] = [interchange_prediction(trip) for trip in prettified['trips']]

    return prettified