def build_gtfs_rt_message(current_time, stop_id_to_time, use_stop_sequences): return gtfs.FeedMessage( header=gtfs.FeedHeader(gtfs_realtime_version="2.0", timestamp=current_time), entity=[ gtfs.FeedEntity( id="1", trip_update=gtfs.TripUpdate( trip=gtfs.TripDescriptor( trip_id=TRIP_ID, route_id=ROUTE_ID, direction_id=True ), stop_time_update=[ gtfs.TripUpdate.StopTimeUpdate( arrival=gtfs.TripUpdate.StopTimeEvent(time=time), departure=gtfs.TripUpdate.StopTimeEvent(time=time + 15), stop_id=stop_id, stop_sequence=stop_sequence + 25 if use_stop_sequences else None, ) for stop_sequence, (stop_id, time) in enumerate( stop_id_to_time.items() ) if time >= current_time ], ), ) ], )
def create_vehicle_position_entity(timestamp, trip_route_id, trip_direction_id, vehicle_id, vehicle_label, vehicle_license_plate, pos_latitude, pos_longitude, pos_bearing, pos_odometer, pos_speed): feed_entity = gtfs_realtime_pb2.FeedEntity() # The ids are used only to provide incrementality support. The id should be unique within a FeedMessage. Consequent # FeedMessages may contain FeedEntities with the same id. In case of a DIFFERENTIAL update the new FeedEntity with # some id will replace the old FeedEntity with the same id (or delete it - see is_deleted below). The actual GTFS # entities (e.g. stations, routes, trips) referenced by the feed must be specified by explicit selectors (see # EntitySelector below for more info). feed_entity.id = str(uuid.uuid4()) # moment at which the vehicle's position was measured. In POSIX time feed_entity.vehicle.timestamp = timestamp # trip descriptor feed_entity.vehicle.trip.route_id = trip_route_id feed_entity.vehicle.trip.direction_id = trip_direction_id # vehicle descriptor feed_entity.vehicle.vehicle.id = vehicle_id feed_entity.vehicle.vehicle.label = vehicle_label feed_entity.vehicle.vehicle.license_plate = vehicle_license_plate # position feed_entity.vehicle.position.latitude = pos_latitude feed_entity.vehicle.position.longitude = pos_longitude feed_entity.vehicle.position.bearing = pos_bearing feed_entity.vehicle.position.odometer = pos_odometer feed_entity.vehicle.position.speed = pos_speed return feed_entity
def setup_test( system_id, informed_entity, install_system_1, transiter_host, source_server ): __, realtime_feed_url = install_system_1(system_id) message = gtfs.FeedMessage( header=gtfs.FeedHeader(gtfs_realtime_version="2.0", timestamp=int(time.time())), entity=[ gtfs.FeedEntity( id="trip_id", trip_update=gtfs.TripUpdate( trip=gtfs.TripDescriptor(trip_id="trip_id", route_id="A") ), ), gtfs.FeedEntity( id="alert_id", alert=gtfs.Alert( active_period=[ gtfs.TimeRange( start=int(TIME_1.timestamp()), end=int(TIME_2.timestamp()), ) ], header_text=gtfs.TranslatedString( translation=[ gtfs.TranslatedString.Translation( text="Advertencia", language="es" ) ], ), informed_entity=[informed_entity], cause=gtfs.Alert.Cause.STRIKE, effect=gtfs.Alert.Effect.MODIFIED_SERVICE, ), ), ], ) source_server.put(realtime_feed_url, message.SerializeToString()) requests.post( "{}/systems/{}/feeds/GtfsRealtimeFeed?sync=true".format( transiter_host, system_id ) )
def makeProtoBuffer(trips, locations): ''' Create a protobuffer object from the trips object. Trips is expected to be a dictionary keyed to trip_id strings. The values are dictionaries with `stop_sequence` and `dev` items. ''' feed = gtfs_realtime_pb2.FeedMessage() # Set Header feed.header.gtfs_realtime_version = "2.0" feed.header.incrementality = 0 feed.header.timestamp = int(time.time()) # Create an trip update entity for each trip for trip_id, trip in trips.items(): entity = gtfs_realtime_pb2.FeedEntity() entity.id = trip_id entity.trip_update.trip.trip_id = trip_id stop_time_update = entity.trip_update.StopTimeUpdate() stop_time_update.stop_sequence = trip['stop_sequence'] stop_time_update.arrival.delay = trip['dev'] entity.trip_update.stop_time_update.append(stop_time_update) feed.entity.append(entity) # Create vehicle location for each vehicle location for vehicle_id, info in locations.items(): entity = gtfs_realtime_pb2.FeedEntity() entity.id = vehicle_id entity.vehicle.timestamp = info['timestamp'] entity.vehicle.trip.trip_id = info['trip']['trip_id'] entity.vehicle.vehicle.id = vehicle_id entity.vehicle.position.latitude = info['position']['latitude'] entity.vehicle.position.longitude = info['position']['longitude'] entity.vehicle.position.bearing = info['position']['bearing'] entity.vehicle.position.speed = info['position']['speed'] feed.entity.append(entity) return feed
def create(entity_id, **kwargs): return gtfs_realtime.FeedEntity(id=entity_id, **kwargs)
""" Arrows Denote class aggregation relation: FEED_MESSAGE -> FEEDENTITY -> TRIPUPDATE -> StopTimeUpdate -> STOPTIMEEVENT """ FEED_MESSAGE = { "class": gtfs_realtime_pb2.FeedMessage(), "description": "", "fields": { "trip_updates_and_alerts": "entity", "FeedHeader": "header", } } FEEDENTITY = { "class": gtfs_realtime_pb2.FeedEntity(), "description": "", "fields": { "Trip_Update": "trip_update", "VehiclePosition": "vehicle", "Alert": "alert", } } TRIPUPDATE = { "class": gtfs_realtime_pb2.TripUpdate(), "description": "", "fields": { "timestamp": "timestamp", "delay": "delay", "stop_time_update": "stop_time_update",