From c438b3c4e210a4480652f297f1bf9510cdf44244 Mon Sep 17 00:00:00 2001 From: Birte Kristina Friesel Date: Sun, 22 Sep 2024 13:19:14 +0200 Subject: Switch from XML to JSON API flavour --- .mailmap | 2 + Build.PL | 34 +- Changelog | 10 + bin/efa-m | 41 +- cpanfile | 3 +- lib/Travel/Status/DE/EFA.pm | 608 ++--- lib/Travel/Status/DE/EFA/Departure.pm | 357 +++ lib/Travel/Status/DE/EFA/Line.pm | 2 +- lib/Travel/Status/DE/EFA/Result.pm | 348 --- t/20-vrr.t | 87 +- t/21-vrr-ambig.t | 35 +- t/in/essen_alfred_ambiguous.json | 327 +++ t/in/essen_alfredusbad_ambiguous.xml | 81 - t/in/essen_bp.html | 762 ------- t/in/essen_bp.json | 3979 +++++++++++++++++++++++++++++++++ t/in/essen_hb.xml | 1034 --------- t/in/essen_hb_invalid.xml | 80 - 17 files changed, 4990 insertions(+), 2800 deletions(-) create mode 100644 .mailmap create mode 100644 lib/Travel/Status/DE/EFA/Departure.pm delete mode 100644 lib/Travel/Status/DE/EFA/Result.pm create mode 100644 t/in/essen_alfred_ambiguous.json delete mode 100644 t/in/essen_alfredusbad_ambiguous.xml delete mode 100644 t/in/essen_bp.html create mode 100644 t/in/essen_bp.json delete mode 100644 t/in/essen_hb.xml delete mode 100644 t/in/essen_hb_invalid.xml diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..b1c1914 --- /dev/null +++ b/.mailmap @@ -0,0 +1,2 @@ +Birte Kristina Friesel +Birte Kristina Friesel diff --git a/Build.PL b/Build.PL index b56a744..ec1d27d 100644 --- a/Build.PL +++ b/Build.PL @@ -8,29 +8,29 @@ Module::Build->new( build_requires => { 'File::Slurp' => 0, - 'Test::More' => 0, - 'Test::Pod' => 0, + 'Test::More' => 0, + 'Test::Pod' => 0, }, configure_requires => { 'Module::Build' => 0.40, }, module_name => 'Travel::Status::DE::VRR', - license => 'perl', - requires => { - 'perl' => '5.10.1', - 'Carp' => 0, - 'Class::Accessor' => 0, - 'DateTime' => 0, - 'Getopt::Long' => 0, - 'List::Util' => 0, - 'LWP::UserAgent' => 0, - 'LWP::Protocol::https' => 0, - 'XML::LibXML' => 0, + license => 'perl', + requires => { + 'perl' => '5.10.1', + 'Carp' => 0, + 'Class::Accessor' => 0, + 'DateTime' => 0, + 'DateTime::Format::Strptime' => 0, + 'Getopt::Long' => 0, + 'JSON' => 0, + 'List::Util' => 0, + 'LWP::UserAgent' => 0, + 'LWP::Protocol::https' => 0, }, - sign => 1, + sign => 1, meta_merge => { - resources => { - repository => 'https://github.com/derf/Travel-Status-DE-VRR' - } + resources => + { repository => 'https://github.com/derf/Travel-Status-DE-VRR' } }, )->create_build_script(); diff --git a/Changelog b/Changelog index 79de9d3..abd36ea 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,13 @@ +git HEAD + * Drop XML::LibXML dependency + * New dependencies: DateTime::Format::Strptime, JSON + * Switch API language from XML to JSON + * Rename Travel::Status::DE::EFA::Result to Travel::Status::DE::EFA::Departure + * EFA: Remove "identified_data" accessor (not supported by JSON backends) + * Result/Departure: Remove "info" accessor + * Result/Departure: add "hints" accessor + * Line: Add "number" accessor + Travel::Status::DE::VRR 2.02 - Sun May 19 2024 * EFA->new: Deprecate "efa_url" option. Use "service" instead. "efa_url" is still supported, just not documented anymore. diff --git a/bin/efa-m b/bin/efa-m index 03fd30b..36c23ea 100755 --- a/bin/efa-m +++ b/bin/efa-m @@ -198,6 +198,13 @@ sub format_route { $stop->name, $stop->platform, ); } + elsif ( $stop->name ) { + $output .= sprintf( " %40s %s\n", + $stop->name, $stop->platform, ); + } + else { + $output .= "?\n"; + } } return $output; } @@ -217,12 +224,12 @@ sub display_result { for my $line (@lines) { - if ( $edata{messages} and length( $line->[5] ) ) { - $line->[5] =~ tr{\n\x0d}{ }s; - chomp $line->[5]; + if ( $edata{messages} and $line->[5] and @{ $line->[5] } ) { print "\n"; - for my $info_line ( split( qr{\n}, $line->[5] ) ) { - say "# ${info_line}"; + for my $hint ( @{ $line->[5] } ) { + $hint =~ tr{\n\x0d}{ }s; + chomp $hint; + say "# ${hint}"; } } @@ -244,7 +251,7 @@ sub show_lines { for my $l ( $efa->lines ) { - if ( ( @grep_lines and none { $l->name eq $_ } @grep_lines ) + if ( ( @grep_lines and none { $l->number eq $_ } @grep_lines ) or ( @grep_mots and none { $l->mot_name eq $_ } @grep_mots ) ) { next; @@ -254,8 +261,13 @@ sub show_lines { next; } - push( @output, - [ $l->type, $l->name, $l->direction // q{}, q{}, $l->route // q{} ] + push( + @output, + [ + $l->type, $l->number, + $l->direction // q{}, q{}, + $l->route // q{} + ] ); } @@ -288,10 +300,6 @@ sub show_results { : $d->datetime->strftime('%H:%M') ); - if ( $d->platform_db ) { - $platform .= ' (DB)'; - } - if ( ( @grep_lines and none { $d->line eq $_ } @grep_lines ) or ( @grep_mots and none { $d->mot_name eq $_ } @grep_mots ) @@ -326,12 +334,15 @@ sub show_results { } my $line = $d->line; - if ( length($line) > 10 and $d->train_type and $d->train_no ) { + if ( ( length($line) > 10 or not $line ) + and $d->train_type + and $d->train_no ) + { $line = $d->train_type . ' ' . $d->train_no; } @output_line - = ( $dtime, $platform, $line, q{}, $d->destination, $d->info ); + = ( $dtime, $platform, $line, q{}, $d->destination, [ $d->hints ] ); if ( $edata{route} ) { $output_line[3] @@ -615,8 +626,6 @@ None. =item * Travel::Status::DE::EFA(3pm) -=item * XML::LibXML(3pm) - =back =head1 BUGS AND LIMITATIONS diff --git a/cpanfile b/cpanfile index 7f75d31..c88d11b 100644 --- a/cpanfile +++ b/cpanfile @@ -1,11 +1,12 @@ requires 'Carp'; requires 'Class::Accessor'; requires 'DateTime'; +requires 'DateTime::Format::Strptime'; requires 'Getopt::Long'; +requires 'JSON'; requires 'List::Util'; requires 'LWP::UserAgent'; requires 'LWP::Protocol::https'; -requires 'XML::LibXML'; on test => sub { requires 'File::Slurp'; diff --git a/lib/Travel/Status/DE/EFA.pm b/lib/Travel/Status/DE/EFA.pm index ca207d5..eb104b3 100644 --- a/lib/Travel/Status/DE/EFA.pm +++ b/lib/Travel/Status/DE/EFA.pm @@ -9,75 +9,78 @@ our $VERSION = '2.02'; use Carp qw(confess cluck); use DateTime; +use DateTime::Format::Strptime; use Encode qw(encode); +use JSON; use Travel::Status::DE::EFA::Line; -use Travel::Status::DE::EFA::Result; +use Travel::Status::DE::EFA::Departure; use Travel::Status::DE::EFA::Stop; use LWP::UserAgent; -use XML::LibXML; my %efa_instance = ( BSVG => { - url => 'https://bsvg.efa.de/bsvagstd/XML_DM_REQUEST', + url => 'https://bsvg.efa.de/bsvagstd', name => 'Braunschweiger Verkehrs-GmbH', }, DING => { - url => 'https://www.ding.eu/ding3/XSLT_DM_REQUEST', + url => 'https://www.ding.eu/ding3', + stopseq => +'https://www.ding.eu/ding3/XML_STOPSEQCOORD_REQUEST?=&jsonp=jsonpFn5&line=din:87002: :R:j24&stop=9001008&tripCode=290&date=20240520&time=14.0041.00&coordOutputFormat=WGS84[DD.DDDDD]&coordListOutputFormat=string&outputFormat=json&tStOTType=NEXT&hideBannerInfo=1', name => 'Donau-Iller Nahverkehrsverbund', }, KVV => { - url => 'https://projekte.kvv-efa.de/sl3-alone/XSLT_DM_REQUEST', + url => 'https://projekte.kvv-efa.de/sl3-alone', name => 'Karlsruher Verkehrsverbund', }, LinzAG => { - url => 'https://www.linzag.at/static/XSLT_DM_REQUEST', + url => 'https://www.linzag.at/static', name => 'Linz AG', encoding => 'iso-8859-15', }, MVV => { - url => 'https://efa.mvv-muenchen.de/mobile/XSLT_DM_REQUEST', + url => 'https://efa.mvv-muenchen.de/mobile', name => 'Münchner Verkehrs- und Tarifverbund', }, NVBW => { - url => 'https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST', + url => 'https://www.efa-bw.de/nvbw', name => 'Nahverkehrsgesellschaft Baden-Württemberg', }, VAG => { - url => 'https://efa.vagfr.de/vagfr3/XSLT_DM_REQUEST', + url => 'https://efa.vagfr.de/vagfr3', name => 'Freiburger Verkehrs AG', }, VGN => { - url => 'https://efa.vgn.de/vgnExt_oeffi/XML_DM_REQUEST', + url => 'https://efa.vgn.de/vgnExt_oeffi', name => 'Verkehrsverbund Grossraum Nuernberg', }, # HTTPS: certificate verification fails VMV => { - url => 'http://efa.vmv-mbh.de/vmv/XML_DM_REQUEST', + url => 'http://efa.vmv-mbh.de/vmv', name => 'Verkehrsgesellschaft Mecklenburg-Vorpommern', }, VRN => { - url => 'https://www.vrn.de/mngvrn//XML_DM_REQUEST', + url => 'https://www.vrn.de/mngvrn/', name => 'Verkehrsverbund Rhein-Neckar', }, VRR => { - url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', + url => 'https://efa.vrr.de/vrr', name => 'Verkehrsverbund Rhein-Ruhr', }, VRR2 => { - url => 'https://app.vrr.de/standard/XML_DM_REQUEST', + url => 'https://app.vrr.de/standard', name => 'Verkehrsverbund Rhein-Ruhr (alternative)', }, VRR3 => { - url => 'https://efa.vrr.de/rbgstd3/XML_DM_REQUEST', + url => 'https://efa.vrr.de/rbgstd3', name => 'Verkehrsverbund Rhein-Ruhr (alternative alternative)', }, VVO => { - url => 'https://efa.vvo-online.de/VMSSL3/XSLT_DM_REQUEST', + url => 'https://efa.vvo-online.de/VMSSL3', name => 'Verkehrsverbund Oberelbe', }, VVS => { - url => 'https://www2.vvs.de/vvs/XSLT_DM_REQUEST', + url => 'https://www2.vvs.de/vvs', name => 'Verkehrsverbund Stuttgart', }, @@ -107,26 +110,10 @@ sub new_p { } my $content = $tx->res->body; - if ( $opt{efa_encoding} ) { - $self->{xml} = encode( $opt{efa_encoding}, $content ); - } - else { - $self->{xml} = $content; - } - - if ( not $self->{xml} ) { - - # LibXML doesn't like empty documents - $promise->reject('Server returned nothing (empty result)'); - return; - } - - $self->{tree} = XML::LibXML->load_xml( - string => $self->{xml}, - ); + $self->{response} = $self->{json}->decode($content); if ( $self->{developer_mode} ) { - say $self->{tree}->toString(1); + say $self->{json}->pretty->encode( $self->{response} ); } $self->check_for_ambiguous(); @@ -158,7 +145,7 @@ sub new { delete $opt{timeout}; } - if ( not( $opt{name} ) ) { + if ( not( $opt{name} or $opt{from_json} ) ) { confess('You must specify a name'); } if ( $opt{type} @@ -169,6 +156,12 @@ sub new { if ( $opt{service} and exists $efa_instance{ $opt{service} } ) { $opt{efa_url} = $efa_instance{ $opt{service} }{url}; + if ( $opt{journey} ) { + $opt{efa_url} .= '/XML_STOPSEQCOORD_REQUEST'; + } + else { + $opt{efa_url} .= '/XML_DM_REQUEST'; + } $opt{time_zone} //= $efa_instance{ $opt{service} }{time_zone}; } @@ -219,39 +212,33 @@ sub new { my $self = { post => { - command => q{}, - deleteAssignedStops_dm => '1', - help => 'Hilfe', - itdDateDay => $dt->day, - itdDateMonth => $dt->month, - itdDateYear => $dt->year, - itdLPxx_id_dm => ':dm', - itdLPxx_mapState_dm => q{}, - itdLPxx_mdvMap2_dm => q{}, - itdLPxx_mdvMap_dm => '3406199:401077:NAV3', - itdLPxx_transpCompany => 'vrr', - itdLPxx_view => q{}, - itdTimeHour => $dt->hour, - itdTimeMinute => $dt->minute, - language => 'de', - mode => 'direct', - nameInfo_dm => 'invalid', - nameState_dm => 'empty', - name_dm => encode( 'UTF-8', $opt{name} ), - outputFormat => 'XML', - ptOptionsActive => '1', - requestID => '0', - reset => 'neue Anfrage', - sessionID => '0', - submitButton => 'anfordern', - typeInfo_dm => 'invalid', - type_dm => $opt{type} // 'stop', - useProxFootSearch => $opt{proximity_search} ? '1' : '0', - useRealtime => '1', + language => 'de', + mode => 'direct', + outputFormat => 'JSON', + type_dm => $opt{type} // 'stop', + useProxFootSearch => $opt{proximity_search} ? '1' : '0', + useRealtime => '1', + itdDateDay => $dt->day, + itdDateMonth => $dt->month, + itdDateYear => $dt->year, + itdTimeHour => $dt->hour, + itdTimeMinute => $dt->minute, + name_dm => encode( 'UTF-8', $opt{name} ), }, + response => $opt{from_json}, developer_mode => $opt{developer_mode}, efa_url => $opt{efa_url}, service => $opt{service}, + strp_stopseq => DateTime::Format::Strptime->new( + pattern => '%Y%m%d %H:%M', + time_zone => 'Europe/Berlin', + ), + strp_stopseq_s => DateTime::Format::Strptime->new( + pattern => '%Y%m%d %H:%M:%S', + time_zone => 'Europe/Berlin', + ), + + json => JSON->new->utf8, }; if ( $opt{place} ) { @@ -281,33 +268,26 @@ sub new { return $self; } - my $response = $self->{ua}->post( $self->{efa_url}, $self->{post} ); - - if ( $response->is_error ) { - $self->{errstr} = $response->status_line; - return $self; + if ( $self->{developer_mode} ) { + say 'POST ' . $self->{efa_url}; + while ( my ( $key, $value ) = each %{ $self->{post} } ) { + printf( "%30s = %s\n", $key, $value ); + } } - if ( $opt{efa_encoding} ) { - $self->{xml} = encode( $opt{efa_encoding}, $response->content ); - } - else { - $self->{xml} = $response->decoded_content; - } + if ( not $self->{response} ) { + my $response = $self->{ua}->post( $self->{efa_url}, $self->{post} ); - if ( not $self->{xml} ) { + if ( $response->is_error ) { + $self->{errstr} = $response->status_line; + return $self; + } - # LibXML doesn't like empty documents - $self->{errstr} = 'Server returned nothing (empty result)'; - return $self; + $self->{response} = $self->{json}->decode( $response->content ); } - $self->{tree} = XML::LibXML->load_xml( - string => $self->{xml}, - ); - if ( $self->{developer_mode} ) { - say $self->{tree}->toString(1); + say $self->{json}->pretty->encode( $self->{response} ); } $self->check_for_ambiguous(); @@ -315,20 +295,6 @@ sub new { return $self; } -sub new_from_xml { - my ( $class, %opt ) = @_; - - my $self = { - xml => $opt{xml}, - }; - - $self->{tree} = XML::LibXML->load_xml( - string => $self->{xml}, - ); - - return bless( $self, $class ); -} - sub errstr { my ($self) = @_; @@ -356,182 +322,98 @@ sub place_candidates { sub check_for_ambiguous { my ($self) = @_; - my $xml = $self->{tree}; + my $json = $self->{response}; - my $xp_place = XML::LibXML::XPathExpression->new('//itdOdv/itdOdvPlace'); - my $xp_name = XML::LibXML::XPathExpression->new('//itdOdv/itdOdvName'); - my $xp_mesg - = XML::LibXML::XPathExpression->new('//itdMessage[@type="error"]'); - - my $xp_place_elem = XML::LibXML::XPathExpression->new('./odvPlaceElem'); - my $xp_name_elem = XML::LibXML::XPathExpression->new('./odvNameElem'); - - my $e_place = ( $xml->findnodes($xp_place) )[0]; - my $e_name = ( $xml->findnodes($xp_name) )[0]; - my @e_mesg = $xml->findnodes($xp_mesg); - - if ( not( $e_place and $e_name ) ) { - - # this should not happen[tm] - cluck('skipping ambiguity check- itdOdvPlace/itdOdvName missing'); - return; - } - - my $s_place = $e_place->getAttribute('state'); - my $s_name = $e_name->getAttribute('state'); - - if ( $s_place eq 'list' ) { - $self->{place_candidates} = [ map { $_->textContent } - @{ $e_place->findnodes($xp_place_elem) } ]; - $self->{errstr} = 'ambiguous place parameter'; + if ( $json->{departureList} ) { return; } - if ( $s_name eq 'list' ) { - $self->{name_candidates} - = [ map { $_->textContent } @{ $e_name->findnodes($xp_name_elem) } ]; - $self->{errstr} = 'ambiguous name parameter'; - return; - } - if ( $s_place eq 'notidentified' ) { - $self->{errstr} = 'invalid place parameter'; - return; - } - if ( $s_name eq 'notidentified' ) { - $self->{errstr} = 'invalid name parameter'; - return; - } - if (@e_mesg) { - $self->{errstr} = join( q{; }, map { $_->textContent } @e_mesg ); - return; + for my $m ( @{ $json->{dm}{message} // [] } ) { + if ( $m->{name} eq 'error' and $m->{value} eq 'name list' ) { + $self->{errstr} = "ambiguous name parameter"; + $self->{name_candidates} + = [ map { $_->{name} } @{ $json->{dm}{points} // [] } ]; + return; + } + if ( $m->{name} eq 'error' and $m->{value} eq 'place list' ) { + $self->{errstr} = "ambiguous name parameter"; + $self->{name_candidates} + = [ map { $_->{name} } @{ $json->{dm}{points} // [] } ]; + return; + } } return; } -sub identified_data { - my ($self) = @_; - - if ( not $self->{tree} ) { - return; - } - - my $xp_place - = XML::LibXML::XPathExpression->new('//itdOdv/itdOdvPlace/odvPlaceElem'); - my $xp_name - = XML::LibXML::XPathExpression->new('//itdOdv/itdOdvName/odvNameElem'); - - my $e_place = ( $self->{tree}->findnodes($xp_place) )[0]; - my $e_name = ( $self->{tree}->findnodes($xp_name) )[0]; - - return ( $e_place->textContent, $e_name->textContent ); -} - sub lines { my ($self) = @_; - my @lines; if ( $self->{lines} ) { return @{ $self->{lines} }; } - if ( not $self->{tree} ) { - return; - } - - my $xp_element - = XML::LibXML::XPathExpression->new('//itdServingLines/itdServingLine'); - - my $xp_info = XML::LibXML::XPathExpression->new('./itdNoTrain'); - my $xp_route = XML::LibXML::XPathExpression->new('./itdRouteDescText'); - my $xp_oper = XML::LibXML::XPathExpression->new('./itdOperator/name'); - - for my $e ( $self->{tree}->findnodes($xp_element) ) { - - my $e_info = ( $e->findnodes($xp_info) )[0]; - my $e_route = ( $e->findnodes($xp_route) )[0]; - my $e_oper = ( $e->findnodes($xp_oper) )[0]; - - if ( not($e_info) ) { - cluck( 'node with insufficient data. This should not happen. ' - . $e->getAttribute('number') ); - next; - } - - my $line = $e->getAttribute('number'); - my $direction = $e->getAttribute('direction'); - my $valid = $e->getAttribute('valid'); - my $type = $e_info->getAttribute('name'); - my $mot = $e->getAttribute('motType'); - my $route = ( $e_route ? $e_route->textContent : undef ); - my $operator = ( $e_oper ? $e_oper->textContent : undef ); - my $identifier = $e->getAttribute('stateless'); - - push( - @lines, - Travel::Status::DE::EFA::Line->new( - name => $line, - direction => $direction, - valid => $valid, - type => $type, - mot => $mot, - route => $route, - operator => $operator, - identifier => $identifier, - ) - ); + for my $line ( @{ $self->{response}{servingLines}{lines} // [] } ) { + push( @{ $self->{lines} }, $self->parse_line($line) ); } - $self->{lines} = \@lines; + return @{ $self->{lines} // [] }; +} - return @lines; +sub parse_line { + my ( $self, $line ) = @_; + + my $mode = $line->{mode} // {}; + + return Travel::Status::DE::EFA::Line->new( + type => $mode->{product}, + name => $mode->{name}, + number => $mode->{number}, + direction => $mode->{destination}, + valid => $mode->{timetablePeriod}, + mot => $mode->{product}, + operator => $mode->{diva}{operator}, + identifier => $mode->{diva}{globalId}, + , + ); } sub parse_route { - my ( $self, @nodes ) = @_; - my $xp_routepoint_date - = XML::LibXML::XPathExpression->new('./itdDateTime/itdDate'); - my $xp_routepoint_time - = XML::LibXML::XPathExpression->new('./itdDateTime/itdTime'); - + my ( $self, $stop_seq, $requested_id ) = @_; my @ret; - for my $e (@nodes) { - my @dates = $e->findnodes($xp_routepoint_date); - my @times = $e->findnodes($xp_routepoint_time); + if ( not $stop_seq ) { + return \@ret; + } + + # Oh EFA, you so silly + if ( ref($stop_seq) eq 'HASH' ) { + # For lines that start or terminate at the requested stop, onwardStopSeq / prevStopSeq includes the requested stop. + if ( $stop_seq->{ref}{id} eq $requested_id ) { + return \@ret; + } + $stop_seq = [$stop_seq]; + } + + for my $stop ( @{ $stop_seq // [] } ) { + my $ref = $stop->{ref}; my ( $arr, $dep ); - # note that the first stop has an arrival node with an invalid - # timestamp and the terminal stop has a departure node with an - # invalid timestamp. - - if ( $dates[0] and $times[0] and $dates[0]->getAttribute('day') != -1 ) - { - $arr = DateTime->new( - year => $dates[0]->getAttribute('year'), - month => $dates[0]->getAttribute('month'), - day => $dates[0]->getAttribute('day'), - hour => $times[0]->getAttribute('hour'), - minute => $times[0]->getAttribute('minute'), - second => $times[0]->getAttribute('second') // 0, - time_zone => 'Europe/Berlin' - ); + if ( $ref->{arrDateTimeSec} ) { + $arr = $self->{strp_stopseq_s} + ->parse_datetime( $ref->{arrDateTimeSec} ); + } + elsif ( $ref->{arrDateTime} ) { + $arr = $self->{strp_stopseq}->parse_datetime( $ref->{arrDateTime} ); } - if ( $dates[-1] - and $times[-1] - and $dates[-1]->getAttribute('day') != -1 ) - { - $dep = DateTime->new( - year => $dates[-1]->getAttribute('year'), - month => $dates[-1]->getAttribute('month'), - day => $dates[-1]->getAttribute('day'), - hour => $times[-1]->getAttribute('hour'), - minute => $times[-1]->getAttribute('minute'), - second => $times[-1]->getAttribute('second') // 0, - time_zone => 'Europe/Berlin' - ); + if ( $ref->{depDateTimeSec} ) { + $dep = $self->{strp_stopseq_s} + ->parse_datetime( $ref->{depDateTimeSec} ); + } + elsif ( $ref->{depDateTime} ) { + $dep = $self->{strp_stopseq}->parse_datetime( $ref->{depDateTime} ); } push( @@ -539,14 +421,79 @@ sub parse_route { Travel::Status::DE::EFA::Stop->new( arr => $arr, dep => $dep, - name => $e->getAttribute('name'), - name_suf => $e->getAttribute('nameWO'), - platform => $e->getAttribute('platformName'), + name => $stop->{name}, + name_suf => $stop->{nameWO}, + platform => $ref->{platform} || $stop->{platformName} || undef, ) ); } - return @ret; + return \@ret; +} + +sub parse_departure { + my ( $self, $departure ) = @_; + + my ( $sched_dt, $real_dt ); + my ( $prev_route, $next_route ); + + if ( my $dt = $departure->{dateTime} ) { + $sched_dt = DateTime->new( + year => $dt->{year}, + month => $dt->{month}, + day => $dt->{day}, + hour => $dt->{hour}, + minute => $dt->{minute}, + second => $dt->{second} // 0, + time_zone => 'Europe/Berlin', + ); + } + + if ( my $dt = $departure->{realDateTime} ) { + $real_dt = DateTime->new( + year => $dt->{year}, + month => $dt->{month}, + day => $dt->{day}, + hour => $dt->{hour}, + minute => $dt->{minute}, + second => $dt->{second} // 0, + time_zone => 'Europe/Berlin', + ); + } + + if ( $departure->{prevStopSeq} ) { + $prev_route = $self->parse_route( $departure->{prevStopSeq}, + $departure->{stopID} ); + } + if ( $departure->{onwardStopSeq} ) { + $next_route = $self->parse_route( $departure->{onwardStopSeq}, + $departure->{stopID} ); + } + + my @hints + = map { $_->{content} } @{ $departure->{servingLine}{hints} // [] }; + + return Travel::Status::DE::EFA::Departure->new( + rt_datetime => $real_dt, + platform => $departure->{platform}, + platform_name => $departure->{platformName}, + platform_type => $departure->{pointType}, + line => $departure->{servingLine}{symbol}, + train_type => $departure->{servingLine}{trainType}, + train_name => $departure->{servingLine}{trainName}, + train_no => $departure->{servingLine}{trainNum}, + origin => $departure->{servingLine}{directionFrom}, + destination => $departure->{servingLine}{direction}, + occupancy => $departure->{occupancy}, + countdown => $departure->{countdown}, + delay => $departure->{servingLine}{delay}, + sched_datetime => $sched_dt, + type => $departure->{servingLine}{name}, + mot => $departure->{servingLine}{motType}, + hints => \@hints, + prev_route => $prev_route, + next_route => $next_route, + ); } sub results { @@ -557,147 +504,10 @@ sub results { return @{ $self->{results} }; } - if ( not $self->{tree} ) { - return; - } - - my $xp_element = XML::LibXML::XPathExpression->new('//itdDeparture'); - - my $xp_date = XML::LibXML::XPathExpression->new('./itdDateTime/itdDate'); - my $xp_time = XML::LibXML::XPathExpression->new('./itdDateTime/itdTime'); - my $xp_rdate = XML::LibXML::XPathExpression->new('./itdRTDateTime/itdDate'); - my $xp_rtime = XML::LibXML::XPathExpression->new('./itdRTDateTime/itdTime'); - my $xp_line = XML::LibXML::XPathExpression->new('./itdServingLine'); - my $xp_info - = XML::LibXML::XPathExpression->new('./itdServingLine/itdNoTrain'); - my $xp_prev_route - = XML::LibXML::XPathExpression->new('./itdPrevStopSeq/itdPoint'); - my $xp_next_route - = XML::LibXML::XPathExpression->new('./itdOnwardStopSeq/itdPoint'); - - $self->lines; - - for my $e ( $self->{tree}->findnodes($xp_element) ) { - - my $e_date = ( $e->findnodes($xp_date) )[0]; - my $e_time = ( $e->findnodes($xp_time) )[0]; - my $e_line = ( $e->findnodes($xp_line) )[0]; - my $e_info = ( $e->findnodes($xp_info) )[0]; - - my $e_rdate = ( $e->findnodes($xp_rdate) )[0]; - my $e_rtime = ( $e->findnodes($xp_rtime) )[0]; - - if ( not( $e_date and $e_time and $e_line ) ) { - cluck('node with insufficient data. This should not happen'); - next; - } - - my ( $sched_dt, $real_dt ); - - if ( $e_date and $e_time and $e_date->getAttribute('day') != -1 ) { - $sched_dt = DateTime->new( - year => $e_date->getAttribute('year'), - month => $e_date->getAttribute('month'), - day => $e_date->getAttribute('day'), - hour => $e_time->getAttribute('hour'), - minute => $e_time->getAttribute('minute'), - second => $e_time->getAttribute('second') // 0, - time_zone => 'Europe/Berlin' - ); - } - - if ( $e_rdate and $e_rtime and $e_rdate->getAttribute('day') != -1 ) { - $real_dt = DateTime->new( - year => $e_rdate->getAttribute('year'), - month => $e_rdate->getAttribute('month'), - day => $e_rdate->getAttribute('day'), - hour => $e_rtime->getAttribute('hour'), - minute => $e_rtime->getAttribute('minute'), - second => $e_rtime->getAttribute('second') // 0, - time_zone => 'Europe/Berlin' - ); - } - - my $platform = $e->getAttribute('platform'); - my $platform_name = $e->getAttribute('platformName'); - my $countdown = $e->getAttribute('countdown'); - my $occupancy = $e->getAttribute('occupancy'); - my $line = $e_line->getAttribute('number'); - my $train_type = $e_line->getAttribute('trainType'); - my $train_name = $e_line->getAttribute('trainName'); - my $train_no = $e_line->getAttribute('trainNum'); - my $dest = $e_line->getAttribute('direction'); - my $info = $e_info->textContent; - my $key = $e_line->getAttribute('key'); - my $delay = $e_info->getAttribute('delay'); - my $type = $e_info->getAttribute('name'); - my $mot = $e_line->getAttribute('motType'); - - my $platform_is_db = 0; - - my @prev_route; - my @next_route; - - if ( $self->{want_full_routes} ) { - @prev_route - = $self->parse_route( @{ [ $e->findnodes($xp_prev_route) ] } ); - @next_route - = $self->parse_route( @{ [ $e->findnodes($xp_next_route) ] } ); - } + my $json = $self->{response}; - my @line_obj - = grep { $_->{identifier} eq $e_line->getAttribute('stateless') } - @{ $self->{lines} }; - - # platform / platformName are inconsistent. The following cases are - # known: - # - # * platform="int", platformName="" : non-DB platform - # * platform="int", platformName="Bstg. int" : non-DB platform - # * platform="#int", platformName="Gleis int" : non-DB platform - # * platform="#int", platformName="Gleis int" : DB platform? - # * platform="", platformName="Gleis int" : DB platform - # * platform="DB", platformName="Gleis int" : DB platform - # * platform="gibberish", platformName="Gleis int" : DB platform - - if ( ( $platform_name and $platform_name =~ m{ ^ Gleis }ox ) - and not( $platform and $platform =~ s{ ^ \# }{}ox ) ) - { - $platform_is_db = 1; - } - - if ( $platform_name and $platform_name =~ m{ ^ (Gleis | Bstg[.])}ox ) { - $platform = ( split( / /, $platform_name ) )[1]; - } - elsif ( $platform_name and not $platform ) { - $platform = $platform_name; - } - - push( - @results, - Travel::Status::DE::EFA::Result->new( - rt_datetime => $real_dt, - platform => $platform, - platform_db => $platform_is_db, - platform_name => $platform_name, - key => $key, - lineref => $line_obj[0] // undef, - line => $line, - train_type => $train_type, - train_name => $train_name, - train_no => $train_no, - destination => $dest, - occupancy => $occupancy, - countdown => $countdown, - info => $info, - delay => $delay, - sched_datetime => $sched_dt, - type => $type, - mot => $mot, - prev_route => \@prev_route, - next_route => \@next_route, - ) - ); + for my $departure ( @{ $json->{departureList} // [] } ) { + push( @results, $self->parse_departure($departure) ); } @results = map { $_->[0] } @@ -734,7 +544,7 @@ Travel::Status::DE::EFA - unofficial EFA departure monitor use Travel::Status::DE::EFA; my $status = Travel::Status::DE::EFA->new( - efa_url => 'https://efa.vrr.de/vrr/XSLT_DM_REQUEST', + efa_url => 'https://efa.vrr.de/vrr/XML_DM_REQUEST', name => 'Essen Helenenstr' ); @@ -805,7 +615,7 @@ iso-8859-15. If true: Request full routes for all departures from the backend. This enables the B, B and B accessors in -Travel::Status::DE::EFA::Result(3pm). +Travel::Status::DE::EFA::Departure(3pm). =item B => B<0>|B<1> @@ -867,7 +677,7 @@ nothing (undef / empty list) otherwise. =item $status->results -Returns a list of Travel::Status::DE::EFA::Result(3pm) objects, each one describing +Returns a list of Travel::Status::DE::EFA::Departure(3pm) objects, each one describing one departure. =item Travel::Status::DE::EFA::get_efa_urls() @@ -906,23 +716,25 @@ None. =item * DateTime(3pm) -=item * LWP::UserAgent(3pm) +=item * DateTime::Format::Strptime(3pm) + +=item * JSON(3pm) -=item * XML::LibXML(3pm) +=item * LWP::UserAgent(3pm) =back =head1 BUGS AND LIMITATIONS -Not all features of the web interface are supported. +The API is not exposed completely. =head1 SEE ALSO -efa-m(1), Travel::Status::DE::EFA::Result(3pm). +efa-m(1), Travel::Status::DE::EFA::Departure(3pm). =head1 AUTHOR -Copyright (C) 2011-2023 by Birte Kristina Friesel Ederf@finalrewind.orgE +Copyright (C) 2011-2024 by Birte Kristina Friesel Ederf@finalrewind.orgE =head1 LICENSE diff --git a/lib/Travel/Status/DE/EFA/Departure.pm b/lib/Travel/Status/DE/EFA/Departure.pm new file mode 100644 index 0000000..802f84e --- /dev/null +++ b/lib/Travel/Status/DE/EFA/Departure.pm @@ -0,0 +1,357 @@ +package Travel::Status::DE::EFA::Departure; + +use strict; +use warnings; +use 5.010; + +use parent 'Class::Accessor'; + +our $VERSION = '2.02'; + +Travel::Status::DE::EFA::Departure->mk_ro_accessors( + qw(countdown datetime delay destination is_cancelled key line lineref + mot occupancy operator origin platform platform_db platform_name + rt_datetime sched_datetime train_type train_name train_no type) +); + +my @mot_mapping = qw{ + zug s-bahn u-bahn stadtbahn tram stadtbus regionalbus + schnellbus seilbahn schiff ast sonstige +}; + +sub new { + my ( $obj, %conf ) = @_; + + my $ref = \%conf; + + if ( defined $ref->{delay} and $ref->{delay} eq '-9999' ) { + $ref->{delay} = 0; + $ref->{is_cancelled} = 1; + } + else { + $ref->{is_cancelled} = 0; + } + + $ref->{datetime} = $ref->{rt_datetime} // $ref->{sched_datetime}; + + return bless( $ref, $obj ); +} + +sub hints { + my ($self) = @_; + + return @{ $self->{hints} // [] }; +} + +sub mot_name { + my ($self) = @_; + + return $mot_mapping[ $self->{mot} ] // 'sonstige'; +} + +sub route_pre { + my ($self) = @_; + + return @{ $self->{prev_route} // [] }; +} + +sub route_post { + my ($self) = @_; + + return @{ $self->{next_route} // [] }; +} + +sub route_interesting { + my ( $self, $max_parts ) = @_; + + my @via = $self->route_post; + my ( @via_main, @via_show, $last_stop ); + $max_parts //= 3; + + for my $stop (@via) { + if ( + $stop->name_suf =~ m{ Bf | Hbf | Flughafen | Hauptbahnhof + | Krankenhaus | Klinik | (?: S $ ) }ox + ) + { + push( @via_main, $stop ); + } + } + $last_stop = pop(@via); + + if ( @via_main and $via_main[-1] == $last_stop ) { + pop(@via_main); + } + if ( @via and $via[-1] == $last_stop ) { + pop(@via); + } + + if ( @via_main and @via and $via[0] == $via_main[0] ) { + shift(@via_main); + } + + if ( @via < $max_parts ) { + @via_show = @via; + } + else { + if ( @via_main >= $max_parts ) { + @via_show = ( $via[0] ); + } + else { + @via_show = splice( @via, 0, $max_parts - @via_main ); + } + + while ( @via_show < $max_parts and @via_main ) { + my $stop = shift(@via_main); + + # FIXME cannot smartmatch $stop since it became an object + # if ( $stop ~~ \@via_show or $stop == $last_stop ) { + # next; + # } + push( @via_show, $stop ); + } + } + + return @via_show; +} + +sub TO_JSON { + my ($self) = @_; + + return { %{$self} }; +} + +1; + +__END__ + +=head1 NAME + +Travel::Status::DE::EFA::Departure - Information about a single +departure received by Travel::Status::DE::EFA + +=head1 SYNOPSIS + + for my $departure ($status->results) { + printf( + "At %s: %s to %s from platform %d\n", + $departure->datetime->strftime('%H:%M'), $departure->line, + $departure->destination, $departure->platform + ); + } + +=head1 VERSION + +version 2.02 + +=head1 DESCRIPTION + +Travel::Status::DE::EFA::Departure describes a single departure as obtained by +Travel::Status::DE::EFA. It contains information about the time, platform, +line number and destination. + +=head1 METHODS + +=head2 ACCESSORS + +=over + +=item $departure->countdown + +Time in minutes from now until the tram/bus/train will depart, including +realtime data if available. + +If delay information is available, it is already included. + +=item $departure->datetime + +DateTime(3pm) object for departure date and time. Realtime data if available, +schedule data otherwise. + +=item $departure->delay + +Expected delay from scheduled departure time in minutes. A delay of 0 +indicates departure on time. undef when no realtime information is available. + +=item $departure->destination + +Destination name. + +=item $departure->hints + +Additional information related to the departure (list of strings). If +departures for an address were requested, this is the stop name, otherwise it +may be recent news related to the line's schedule. + +=item $departure->is_cancelled + +1 if the departure got cancelled, 0 otherwise. + +=item $departure->key + +Unknown. Unlike the name may suggest, this is not a unique key / UUID for a +departure: On the same day, different lines departing at the same station +may have the same key. It might, however, be unique when combined with the +B information. + +=item $departure->line + +The name/number of the line. + +=item $departure->lineref + +Travel::Status::DE::EFA::Line(3pm) object describing the departing line in +detail. + +=item $departure->mot + +Returns the "mode of transport" number. This is usually an integer between 0 +and 11. + +=item $departure->mot_name + +Returns the "mode of transport", for instance "zug", "s-bahn", "tram" or +"sonstige". + +=item $departure->occupancy + +Returns expected occupancy, if available, undef otherwise. + +Occupancy values are passed from the backend as-is. Known values are +"MANY_SEATS" (low occupation), "FEW_SEATS" (high occupation), +"STANDING_ONLY" (very high occupation), and "FULL" (boarding not advised). + +=item $departure->origin + +Origin name. + +=item $departure->platform + +Departure platform number (may not be a number). + +=item $departure->platform_db + +true if the platform number is operated by DB ("Gleis x"), false ("Bstg. x") +otherwise. + +Unfortunately, there is no distinction between tram and bus platforms yet, +which may also have the same numbers. + +=item $departure->route_interesting + +List of up to three "interesting" stations served by this departure. Is a +subset of B. Each station is a Travel::Status::DE::EFA::Stop(3pm) +object. + +=item $departure->route_pre + +List of stations the vehicle passed (or will have passed) before this stop. +Each station is a Travel::Status::DE::EFA::Stop(3pm) object. + +=item $departure->route_post + +List of stations the vehicle will pass after this stop. +Each station is a Travel::Status::DE::EFA::Stop(3pm) object. + +=item $departure->rt_datetime + +DateTime(3pm) object holding the departure date and time according to +realtime data. Undef if unknown / unavailable. + +=item $departure->sched_datetime + +DateTime(3pm) object holding the scheduled departure date and time. + +=item $departure->train_type + +Train type, e.g. "ICE". Typically only defined for long-distance trains. + +=item $departure->train_name + +Train name, e.g. "ICE International" or "InterCityExpresS" or "Deichgraf". +Typically only defined for long-distance trains. + +=item $departure->train_no + +Train number. Only defined if departure is a train. + +=item $departure->type + +Type of the departure. Note that efa.vrr.de sometimes puts bogus data in this +field. See L. + +=back + +=head2 INTERNAL + +=over + +=item $departure = Travel::Status::DE::EFA::Departure->new(I<%data>) + +Returns a new Travel::Status::DE::EFA::Departure object. You should not need to +call this. + +=item $departure->TO_JSON + +Allows the object data to be serialized to JSON. + +=back + +=head1 DEPARTURE TYPES + +The following are known so far: + +=over + +=item * Abellio-Zug + +=item * Bus + +=item * Eurocity + +=item * Intercity-Express + +=item * NE (NachtExpress / night bus) + +=item * Niederflurbus + +=item * R-Bahn (RE / RegionalExpress) + +=item * S-Bahn + +=item * SB (Schnellbus) + +=item * StraEenbahn + +=item * U-Bahn + +=back + +=head1 DIAGNOSTICS + +None. + +=head1 DEPENDENCIES + +=over + +=item Class::Accessor(3pm) + +=back + +=head1 BUGS AND LIMITATIONS + +C<< $result->type >> may contain bogus data. This comes from the efa.vrr.de +interface. + +=head1 SEE ALSO + +Travel::Status::DE::EFA(3pm). + +=head1 AUTHOR + +Copyright (C) 2011-2023 by Birte Kristina Friesel Ederf@finalrewind.orgE + +=head1 LICENSE + +This module is licensed under the same terms as Perl itself. diff --git a/lib/Travel/Status/DE/EFA/Line.pm b/lib/Travel/Status/DE/EFA/Line.pm index 69526fd..4f44c7b 100644 --- a/lib/Travel/Status/DE/EFA/Line.pm +++ b/lib/Travel/Status/DE/EFA/Line.pm @@ -9,7 +9,7 @@ use parent 'Class::Accessor'; our $VERSION = '2.02'; Travel::Status::DE::EFA::Line->mk_ro_accessors( - qw(direction mot name operator route type valid)); + qw(direction mot name number operator route type valid)); my @mot_mapping = qw{ zug s-bahn u-bahn stadtbahn tram stadtbus regionalbus diff --git a/lib/Travel/Status/DE/EFA/Result.pm b/lib/Travel/Status/DE/EFA/Result.pm deleted file mode 100644 index 11ff15a..0000000 --- a/lib/Travel/Status/DE/EFA/Result.pm +++ /dev/null @@ -1,348 +0,0 @@ -package Travel::Status::DE::EFA::Result; - -use strict; -use warnings; -use 5.010; - -use parent 'Class::Accessor'; - -our $VERSION = '2.02'; - -Travel::Status::DE::EFA::Result->mk_ro_accessors( - qw(countdown datetime delay destination is_cancelled info key line lineref - mot occupancy operator platform platform_db platform_name rt_datetime - sched_datetime train_type train_name train_no type) -); - -my @mot_mapping = qw{ - zug s-bahn u-bahn stadtbahn tram stadtbus regionalbus - schnellbus seilbahn schiff ast sonstige -}; - -sub new { - my ( $obj, %conf ) = @_; - - my $ref = \%conf; - - if ( defined $ref->{delay} and $ref->{delay} eq '-9999' ) { - $ref->{delay} = 0; - $ref->{is_cancelled} = 1; - } - else { - $ref->{is_cancelled} = 0; - } - - $ref->{datetime} = $ref->{rt_datetime} // $ref->{sched_datetime}; - - return bless( $ref, $obj ); -} - -sub mot_name { - my ($self) = @_; - - return $mot_mapping[ $self->{mot} ] // 'sonstige'; -} - -sub route_pre { - my ($self) = @_; - - return @{ $self->{prev_route} }; -} - -sub route_post { - my ($self) = @_; - - return @{ $self->{next_route} }; -} - -sub route_interesting { - my ( $self, $max_parts ) = @_; - - my @via = $self->route_post; - my ( @via_main, @via_show, $last_stop ); - $max_parts //= 3; - - for my $stop (@via) { - if ( - $stop->name_suf =~ m{ Bf | Hbf | Flughafen | Hauptbahnhof - | Krankenhaus | Klinik | (?: S $ ) }ox - ) - { - push( @via_main, $stop ); - } - } - $last_stop = pop(@via); - - if ( @via_main and $via_main[-1] == $last_stop ) { - pop(@via_main); - } - if ( @via and $via[-1] == $last_stop ) { - pop(@via); - } - - if ( @via_main and @via and $via[0] == $via_main[0] ) { - shift(@via_main); - } - - if ( @via < $max_parts ) { - @via_show = @via; - } - else { - if ( @via_main >= $max_parts ) { - @via_show = ( $via[0] ); - } - else { - @via_show = splice( @via, 0, $max_parts - @via_main ); - } - - while ( @via_show < $max_parts and @via_main ) { - my $stop = shift(@via_main); - - # FIXME cannot smartmatch $stop since it became an object - # if ( $stop ~~ \@via_show or $stop == $last_stop ) { - # next; - # } - push( @via_show, $stop ); - } - } - - return @via_show; -} - -sub TO_JSON { - my ($self) = @_; - - return { %{$self} }; -} - -1; - -__END__ - -=head1 NAME - -Travel::Status::DE::EFA::Result - Information about a single -departure received by Travel::Status::DE::EFA - -=head1 SYNOPSIS - - for my $departure ($status->results) { - printf( - "At %s: %s to %s from platform %d\n", - $departure->datetime->strftime('%H:%M'), $departure->line, - $departure->destination, $departure->platform - ); - } - -=head1 VERSION - -version 2.02 - -=head1 DESCRIPTION - -Travel::Status::DE::EFA::Result describes a single departure as obtained by -Travel::Status::DE::EFA. It contains information about the time, platform, -line number and destination. - -=head1 METHODS - -=head2 ACCESSORS - -=over - -=item $departure->countdown - -Time in minutes from now until the tram/bus/train will depart, including -realtime data if available. - -If delay information is available, it is already included. - -=item $departure->datetime - -DateTime(3pm) object for departure date and time. Realtime data if available, -schedule data otherwise. - -=item $departure->delay - -Expected delay from scheduled departure time in minutes. A delay of 0 -indicates departure on time. undef when no realtime information is available. - -=item $departure->destination - -Destination name. - -=item $departure->info - -Additional information related to the departure (string). If departures for -an address were requested, this is the stop name, otherwise it may be recent -news related to the line's schedule. If no information is available, returns -an empty string. - -=item $departure->is_cancelled - -1 if the departure got cancelled, 0 otherwise. - -=item $departure->key - -Unknown. Unlike the name may suggest, this is not a unique key / UUID for a -departure: On the same day, different lines departing at the same station -may have the same key. It might, however, be unique when combined with the -B information. - -=item $departure->line - -The name/number of the line. - -=item $departure->lineref - -Travel::Status::DE::EFA::Line(3pm) object describing the departing line in -detail. - -=item $departure->mot - -Returns the "mode of transport" number. This is usually an integer between 0 -and 11. - -=item $departure->mot_name - -Returns the "mode of transport", for instance "zug", "s-bahn", "tram" or -"sonstige". - -=item $departure->occupancy - -Returns expected occupancy, if available, undef otherwise. - -Occupancy values are passed from the backend as-is. Known values are -"MANY_SEATS" (low occupation), "FEW_SEATS" (high occupation), -"STANDING_ONLY" (very high occupation), and "FULL" (boarding not advised). - -=item $departure->platform - -Departure platform number (may not be a number). - -=item $departure->platform_db - -true if the platform number is operated by DB ("Gleis x"), false ("Bstg. x") -otherwise. - -Unfortunately, there is no distinction between tram and bus platforms yet, -which may also have the same numbers. - -=item $departure->route_interesting - -List of up to three "interesting" stations served by this departure. Is a -subset of B. Each station is a Travel::Status::DE::EFA::Stop(3pm) -object. - -=item $departure->route_pre - -List of stations the vehicle passed (or will have passed) before this stop. -Each station is a Travel::Status::DE::EFA::Stop(3pm) object. - -=item $departure->route_post - -List of stations the vehicle will pass after this stop. -Each station is a Travel::Status::DE::EFA::Stop(3pm) object. - -=item $departure->rt_datetime - -DateTime(3pm) object holding the departure date and time according to -realtime data. Undef if unknown / unavailable. - -=item $departure->sched_datetime - -DateTime(3pm) object holding the scheduled departure date and time. - -=item $departure->train_type - -Train type, e.g. "ICE". Typically only defined for long-distance trains. - -=item $departure->train_name - -Train name, e.g. "ICE International" or "InterCityExpresS" or "Deichgraf". -Typically only defined for long-distance trains. - -=item $departure->train_no - -Train number. Only defined if departure is a train. - -=item $departure->type - -Type of the departure. Note that efa.vrr.de sometimes puts bogus data in this -field. See L. - -=back - -=head2 INTERNAL - -=over - -=item $departure = Travel::Status::DE::EFA::Result->new(I<%data>) - -Returns a new Travel::Status::DE::EFA::Result object. You should not need to -call this. - -=item $departure->TO_JSON - -Allows the object data to be serialized to JSON. - -=back - -=head1 DEPARTURE TYPES - -The following are known so far: - -=over - -=item * Abellio-Zug - -=item * Bus - -=item * Eurocity - -=item * Intercity-Express - -=item * NE (NachtExpress / night bus) - -=item * Niederflurbus - -=item * R-Bahn (RE / RegionalExpress) - -=item * S-Bahn - -=item * SB (Schnellbus) - -=item * StraEenbahn - -=item * U-Bahn - -=back - -=head1 DIAGNOSTICS - -None. - -=head1 DEPENDENCIES - -=over - -=item Class::Accessor(3pm) - -=back - -=head1 BUGS AND LIMITATIONS - -C<< $result->type >> may contain bogus data. This comes from the efa.vrr.de -interface. - -=head1 SEE ALSO - -Travel::Status::DE::EFA(3pm). - -=head1 AUTHOR - -Copyright (C) 2011-2023 by Birte Kristina Friesel Ederf@finalrewind.orgE - -=head1 LICENSE - -This module is licensed under the same terms as Perl itself. diff --git a/t/20-vrr.t b/t/20-vrr.t index 0c63968..52c7941 100644 --- a/t/20-vrr.t +++ b/t/20-vrr.t @@ -6,92 +6,81 @@ use utf8; use Encode qw(decode); use File::Slurp qw(slurp); -use Test::More tests => 113; +use JSON; +use Test::More tests => 112; BEGIN { use_ok('Travel::Status::DE::VRR'); } require_ok('Travel::Status::DE::VRR'); -my $xml = slurp('t/in/essen_hb.xml'); +my $json = JSON->new->utf8->decode( scalar slurp('t/in/essen_bp.json') ); -my $status = Travel::Status::DE::VRR->new_from_xml( xml => $xml ); +my $status = Travel::Status::DE::VRR->new( from_json => $json ); isa_ok( $status, 'Travel::Status::DE::EFA' ); can_ok( $status, qw(errstr results) ); is( $status->errstr, undef, 'no error' ); -is_deeply( [ $status->identified_data ], - [qw[Essen Hauptbahnhof]], 'identified_data' ); my @results = $status->results; for my $result (@results) { - isa_ok( $result, 'Travel::Status::DE::EFA::Result' ); + isa_ok( $result, 'Travel::Status::DE::EFA::Departure' ); can_ok( $result, - qw(datetime destination info line type platform sched_datetime) ); + qw(datetime destination hints line type platform sched_datetime) ); } -is( $results[0]->destination, 'Düsseldorf Hbf', - 'first result: destination ok' ); -is( $results[0]->info, 'Bordrestaurant', 'first result: no info' ); -is( $results[0]->line, 'ICE 946 Intercity-Express', 'first result: line ok' ); +is( + $results[0]->destination, + 'Essen Germaniaplatz', + 'first result: destination ok' +); +is_deeply( [ $results[0]->hints ], [], 'first result: no hints' ); +is( $results[0]->line, '106', 'first result: line ok' ); is( $results[0]->datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'first result: real date ok' ); + '21.09.2024', 'first result: real date ok' ); is( $results[0]->datetime->strftime('%H:%M'), - '09:40', 'first result: real time ok' ); -is( $results[0]->delay, 4, 'first result: delay 4' ); + '18:35', 'first result: real time ok' ); +is( $results[0]->delay, 0, 'first result: delay 0' ); is( $results[0]->sched_datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'first result: scheduled date ok' ); + '21.09.2024', 'first result: scheduled date ok' ); is( $results[0]->sched_datetime->strftime('%H:%M'), - '09:36', 'first result: scheduled time ok' ); -is( $results[0]->mot_name, 'zug', 'first result: mot_name ok' ); - -#is($results[0]->platform, '1', 'first result: platform ok'); -#is($results[0]->platform_db, 1, 'first result: platform_db ok'); + '18:35', 'first result: scheduled time ok' ); +is( $results[0]->mot_name, 'tram', 'first result: mot_name ok' ); is( $results[3]->destination, - 'Mülheim Heißen Kirche', + 'Gelsenkirchen Buerer Str.', 'fourth result: destination ok' ); -is( - $results[3]->info, - 'Ab (H) Heißen Kirche, Umstieg in den SEV Ri. Mülheim Hbf.', - 'fourth result: no info' -); -is( $results[3]->line, '18', 'fourth result: line ok' ); +is_deeply( [ $results[3]->hints ], [], 'fourth result: no hints' ); +is( $results[3]->line, 'U11', 'fourth result: line ok' ); is( $results[3]->datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'fourth result: real date ok' ); + '21.09.2024', 'fourth result: real date ok' ); is( $results[3]->datetime->strftime('%H:%M'), - '09:39', 'fourth result: real time ok' ); -is( $results[3]->delay, undef, 'fourth result: delay undef' ); + '18:36', 'fourth result: real time ok' ); +is( $results[3]->delay, 0, 'fourth result: delay 0' ); is( $results[3]->sched_datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'fourth result: scheduled date ok' ); + '21.09.2024', 'fourth result: scheduled date ok' ); is( $results[3]->sched_datetime->strftime('%H:%M'), - '09:39', 'fourth result: scheduled time ok' ); + '18:36', 'fourth result: scheduled time ok' ); is( $results[3]->mot_name, 'u-bahn', 'fourth result: mot_name ok' ); -#is($results[3]->platform, '2', 'fourth result: platform ok'); -#is($results[3]->platform_db, 0, 'fourth result: platform_db ok'); - -is( $results[-1]->destination, 'Hamm (Westf)', 'last result: destination ok' ); is( - $results[-1]->info, - 'Fahrradmitnahme begrenzt möglich', - 'last result: info ok' + $results[-1]->destination, + 'Essen Zeche Ludwig', + 'last result: destination ok' ); -is( $results[-1]->delay, 12, 'last result: delay 12' ); -is( $results[-1]->line, 'RE1', 'last result: line ok' ); +is_deeply( [ $results[-1]->hints ], [], 'last result: no hints' ); +is( $results[-1]->delay, 0, 'last result: delay 0' ); +is( $results[-1]->line, '105', 'last result: line ok' ); is( $results[-1]->datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'last result: date ok' ); -is( $results[-1]->datetime->strftime('%H:%M'), '10:05', + '21.09.2024', 'last result: date ok' ); +is( $results[-1]->datetime->strftime('%H:%M'), '19:08', 'last result: time ok' ); is( $results[-1]->sched_datetime->strftime('%d.%m.%Y'), - '16.11.2011', 'first result: scheduled date ok' ); + '21.09.2024', 'first result: scheduled date ok' ); is( $results[-1]->sched_datetime->strftime('%H:%M'), - '09:53', 'last result: scheduled time ok' ); -is( $results[-1]->mot_name, 'zug', 'last result: mot_name ok' ); - -#is($results[-1]->platform, '6', 'last result: platform ok'); -#is($results[-1]->platform_db, 1, 'last result: platform ok'); + '19:08', 'last result: scheduled time ok' ); +is( $results[-1]->mot_name, 'tram', 'last result: mot_name ok' ); diff --git a/t/21-vrr-ambig.t b/t/21-vrr-ambig.t index e4783f5..a201d52 100644 --- a/t/21-vrr-ambig.t +++ b/t/21-vrr-ambig.t @@ -5,27 +5,36 @@ use 5.010; use utf8; use File::Slurp qw(slurp); -use Test::More tests => 10; +use JSON; +use Test::More tests => 9; BEGIN { use_ok('Travel::Status::DE::VRR'); } require_ok('Travel::Status::DE::VRR'); -my $xml = slurp('t/in/essen_alfredusbad_ambiguous.xml'); +my $json + = JSON->new->utf8->decode( scalar slurp('t/in/essen_alfred_ambiguous.json') ); -my $status = Travel::Status::DE::VRR->new_from_xml(xml => $xml); +my $status = Travel::Status::DE::VRR->new( from_json => $json ); -isa_ok($status, 'Travel::Status::DE::VRR'); -can_ok($status, qw(errstr results)); +isa_ok( $status, 'Travel::Status::DE::VRR' ); +can_ok( $status, qw(errstr results) ); $status->check_for_ambiguous(); -is($status->errstr, 'ambiguous name parameter', 'errstr ok'); - -is_deeply([$status->place_candidates], [], 'place candidates ok'); -is_deeply([$status->name_candidates], ['Alfredusbad', 'Am Alfredusbad'], 'name candidates ok'); - -is_deeply([$status->lines], [], 'no lines'); -is_deeply([$status->results], [], 'no results'); -is_deeply([$status->identified_data], [qw[Essen Alfredusbad]], 'identified data'); +is( $status->errstr, 'ambiguous name parameter', 'errstr ok' ); + +is_deeply( [ $status->place_candidates ], [], 'place candidates ok' ); +is_deeply( + [ $status->name_candidates ], + [ + 'Essen, Alfred-Krupp-Schule', + 'Essen, Alfredbrücke', + 'Essen, Alfredusbad' + ], + 'name candidates ok' +); + +is_deeply( [ $status->lines ], [], 'no lines' ); +is_deeply( [ $status->results ], [], 'no results' ); diff --git a/t/in/essen_alfred_ambiguous.json b/t/in/essen_alfred_ambiguous.json new file mode 100644 index 0000000..1cf215e --- /dev/null +++ b/t/in/essen_alfred_ambiguous.json @@ -0,0 +1,327 @@ +{ + "dm" : { + "message" : [ + { + "value" : "1", + "name" : "code" + }, + { + "value" : "name list", + "name" : "error" + }, + { + "name" : "type", + "value" : "" + }, + { + "name" : "module", + "value" : "BROKER" + } + ], + "input" : { + "input" : "Alfred" + }, + "points" : [ + { + "usage" : "dm", + "tariffLayer2" : "", + "stateless" : "20009114", + "type" : "stop", + "name" : "Essen, Alfred-Krupp-Schule", + "tariffAreaName" : "", + "tariffArea" : "", + "ref" : { + "gid" : "", + "place" : "Essen", + "omc" : "5113000", + "id" : "20009114", + "placeID" : "18" + }, + "tariffLayer1" : "" + }, + { + "name" : "Essen, Alfredbrücke", + "type" : "stop", + "stateless" : "20009113", + "tariffLayer2" : "", + "usage" : "dm", + "tariffAreaName" : "", + "ref" : { + "gid" : "", + "place" : "Essen", + "placeID" : "18", + "omc" : "5113000", + "id" : "20009113" + }, + "tariffArea" : "", + "tariffLayer1" : "" + }, + { + "ref" : { + "omc" : "5113000", + "id" : "20009115", + "placeID" : "18", + "gid" : "", + "place" : "Essen" + }, + "tariffArea" : "", + "tariffLayer1" : "", + "name" : "Essen, Alfredusbad", + "type" : "stop", + "stateless" : "20009115", + "usage" : "dm", + "tariffLayer2" : "", + "tariffAreaName" : "" + } + ] + }, + "arr" : { + "points" : null, + "input" : { + "input" : "" + } + }, + "servingLines" : { + "lines" : null + }, + "departureList" : null, + "dateRange" : [ + { + "year" : "2024", + "day" : "21", + "weekday" : "7", + "month" : "09" + }, + { + "month" : "09", + "day" : "22", + "weekday" : "1", + "year" : "2024" + }, + { + "day" : "23", + "weekday" : "2", + "month" : "09", + "year" : "2024" + }, + { + "year" : "2024", + "day" : "24", + "weekday" : "3", + "month" : "09" + }, + { + "year" : "2024", + "day" : "25", + "weekday" : "4", + "month" : "09" + }, + { + "month" : "09", + "day" : "26", + "weekday" : "5", + "year" : "2024" + }, + { + "year" : "2024", + "month" : "09", + "day" : "27", + "weekday" : "6" + }, + { + "year" : "2024", + "weekday" : "7", + "day" : "28", + "month" : "09" + }, + { + "year" : "2024", + "month" : "09", + "weekday" : "1", + "day" : "29" + }, + { + "year" : "2024", + "weekday" : "2", + "day" : "30", + "month" : "09" + }, + { + "weekday" : "3", + "day" : "01", + "month" : "10", + "year" : "2024" + }, + { + "month" : "10", + "day" : "02", + "weekday" : "4", + "year" : "2024" + }, + { + "day" : "03", + "weekday" : "5", + "month" : "10", + "year" : "2024" + }, + { + "year" : "2024", + "day" : "04", + "weekday" : "6", + "month" : "10" + }, + { + "year" : "2024", + "day" : "05", + "weekday" : "7", + "month" : "10" + } + ], + "dateTime" : { + "hour" : "18", + "minute" : "33", + "ttpTo" : "20250228", + "ttpFrom" : "20240601", + "deparr" : "dep", + "year" : "2024", + "day" : "21", + "month" : "9" + }, + "option" : { + "ptOption" : { + "assistance" : "0", + "lowPlatformVhcl" : "0", + "useProxFootSearchDestination" : "0", + "useProxFootSearch" : "0", + "privateTransport" : "0", + "noSolidStairs" : "0", + "activeCom" : "-1", + "noCrowded" : "0", + "noInsecurePlaces" : "0", + "maxChanges" : "9", + "useProxFootSearchOrigin" : "0", + "routeType" : "LEASTTIME", + "active" : "-1", + "changeSpeed" : "normal", + "illumTransfer" : "0", + "activeSec" : "-1", + "excludedMeans" : [ + { + "selected" : "0", + "value" : "0" + }, + { + "value" : "1", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "2" + }, + { + "selected" : "0", + "value" : "3" + }, + { + "selected" : "0", + "value" : "4" + }, + { + "selected" : "0", + "value" : "5" + }, + { + "selected" : "0", + "value" : "6" + }, + { + "selected" : "0", + "value" : "7" + }, + { + "value" : "8", + "selected" : "0" + }, + { + "value" : "9", + "selected" : "0" + }, + { + "value" : "10", + "selected" : "0" + }, + { + "value" : "11", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "12" + }, + { + "value" : "13", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "14" + }, + { + "value" : "15", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "16" + }, + { + "value" : "17", + "selected" : "0" + }, + { + "value" : "18", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "19" + } + ], + "plane" : "0", + "maxWait" : "120", + "maxTime" : "360", + "noElevators" : "0", + "overgroundTransfer" : "0", + "activeImp" : "-1", + "noEscalators" : "0", + "needElevatedPlt" : "0", + "bike" : "0", + "SOSAvail" : "0", + "lineRestriction" : "403", + "noLonelyTransfer" : "0", + "wheelchair" : "0" + } + }, + "parameters" : [ + { + "name" : "serverID", + "value" : "EFA2_" + }, + { + "name" : "requestID", + "value" : "0" + }, + { + "name" : "sessionID", + "value" : "0" + }, + { + "name" : "calcTime", + "value" : "166.310" + }, + { + "value" : "2024-09-21T18:33:39", + "name" : "serverTime" + } + ] +} diff --git a/t/in/essen_alfredusbad_ambiguous.xml b/t/in/essen_alfredusbad_ambiguous.xml deleted file mode 100644 index 9b3e589..0000000 --- a/t/in/essen_alfredusbad_ambiguous.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - Essen - E - - - name list - Alfredusbad - Am Alfredusbad - Afredusbad - - - - - - - - - - - - - - - - - - - - - - - - - - - Zug - S-Bahn - U-Bahn - Stadtbahn - Straßen-/Trambahn - Stadtbus - Regionalbus - Schnellbus - Seil-/Zahnradbahn - Schiff - AST/Rufbus - Sonstige - - - - - - - - - - - - - - - - - - - - - - diff --git a/t/in/essen_bp.html b/t/in/essen_bp.html deleted file mode 100644 index f8cc826..0000000 --- a/t/in/essen_bp.html +++ /dev/null @@ -1,762 +0,0 @@ - - - -Fahrplanauskunft - - - - - - - -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Aushangfahrplan
Abfahrtsmonitor
Persönlicher Fahrplan
Verbundfahrplan Schnellverkehr
Linienplan Schnellverkehr
Stadtlinienpläne
Bedienungshinweise
Bildschirmschoner
Aktuelle Hinweise
Ihr Link zu uns
Impressum
Homepage
-
  - - - - - - - -
-
Abfahrtsmonitor
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
*
* von:Essen / Berliner Platz  
  Abfahrt:20:19 UhrDatum:11.09.2011
-
*
*
- - - - - - - - - - -
*zur Druckversionzur Druckversion 
*
-
*
*
*
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Zeit Abfahrt  Linie  Richtung  Hinweise
 20:19Bstg. 1Tram103 Essen Wertstr. 
 20:19Bstg. 2Tram101 Essen Hauptbahnhof 
 20:19Bstg. 3Niederflurbus166 E-Burgaltendorf Burgruine 
 20:21Bstg. 2U-BahnU11 Essen Messe W.-Süd/Gruga 
 20:21Bstg. 2Tram105 Essen Finefraustr. 
 20:21Bstg. 1U-BahnU17 Essen Karlsplatz 
 20:26Bstg. 2Tram109 Essen Steele S 
 20:27Bstg. 2Niederflurbus147 Essen Grimbergstr. 
 20:29Bstg. 1U-BahnU11 Gelsenkirchen Buerer Str. 
 20:29Bstg. 2U-BahnU17 Essen Margarethenhöhe 
 20:30Bstg. 1Niederflurbus147 Essen Erbach 
 20:31Bstg. 2U-BahnU18 Mülheim Hbf 
 20:32Bstg. 1Tram109 Essen Frohnhausen Breilsort 
 20:34Bstg. 1Tram105 Essen Unterstr. 
 20:36Bstg. 4Niederflurbus166 Essen Dellwig Bahnhof 
 20:36Bstg. 2U-BahnU11 Essen Messe W.-Süd/Gruga 
 20:36Bstg. 2Tram103 Essen Hauptbahnhof 
 20:37Bstg. 1Tram101 Essen Germaniaplatz 
 20:40Bstg. 1Niederflurbus145 Essen Fängershof Schleife 
 20:41Bstg. 2Tram109 Essen Steele S 
 20:44Bstg. 2U-BahnU17 Essen Margarethenhöhe 
 20:44Bstg. 1U-BahnU11 Gelsenkirchen Buerer Str. 
 20:46Bstg. 2U-BahnU18 Mülheim Hbf 
 20:46Bstg. 2Niederflurbus145 Essen Heisingen Baldeneysee 
 20:47Bstg. 1Tram109 Essen Frohnhausen Breilsort 
 20:49Bstg. 2Tram101 Essen Hauptbahnhof 
 20:49Bstg. 1Tram103 Essen Wertstr. 
 20:49Bstg. 3Niederflurbus166 Hattingen Märkische Str 
 20:51Bstg. 2Tram105 Essen Finefraustr. 
 20:52Bstg. 2U-BahnU11 Essen Messe W.-Süd/Gruga 
 20:56Bstg. 2Tram109 Essen Hollestr. 
 20:57Bstg. 2Niederflurbus147 Essen Grimbergstr. 
 20:59Bstg. 2U-BahnU17 Essen Margarethenhöhe 
 21:00Bstg. 1Niederflurbus147 Essen Erbach 
 21:01Bstg. 2U-BahnU18 Mülheim Hbf 
 21:03Bstg. 1U-BahnU11 Gelsenkirchen Buerer Str. 
 21:04Bstg. 1Tram105 Essen Unterstr. 
 21:06Bstg. 2Tram103 Essen Hauptbahnhof 
 21:06Bstg. 4Niederflurbus166 Essen Dellwig Bahnhof 
 21:07Bstg. 1Tram101 Essen Germaniaplatz 
-
*
*
*
- - - - - - - - - -
AbweichungVerspätungen sind berücksichtigtPünktlichFahrt voraussichtlich pünktlich
-
*
*
*
- - - - - - - - - - -
*zur Druckversionzur Druckversion 
*
-
*
*
*
*
- - - -
**
-
-
-
- - diff --git a/t/in/essen_bp.json b/t/in/essen_bp.json new file mode 100644 index 0000000..5462a81 --- /dev/null +++ b/t/in/essen_bp.json @@ -0,0 +1,3979 @@ +{ + "parameters" : [ + { + "value" : "EFAMOBIL3_", + "name" : "serverID" + }, + { + "name" : "requestID", + "value" : "0" + }, + { + "name" : "sessionID", + "value" : "0" + }, + { + "name" : "calcTime", + "value" : "218.700" + }, + { + "value" : "2024-09-21T18:34:21", + "name" : "serverTime" + } + ], + "dateTime" : { + "day" : "21", + "deparr" : "dep", + "month" : "9", + "year" : "2024", + "ttpTo" : "20250228", + "ttpFrom" : "20240601", + "hour" : "18", + "minute" : "34" + }, + "departureList" : [ + { + "stopName" : "Essen Berliner Platz", + "stopID" : "20009153", + "x" : "779634", + "nameWO" : "Berliner Platz", + "y" : "5297058", + "realDateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "40" + }, + "operator" : { + "publicCode" : "EV-B", + "code" : "12", + "name" : "EVAG Bus" + }, + "countdown" : "6", + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "33", + "hour" : "18", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "area" : "4", + "servingLine" : { + "code" : "5", + "destID" : "20009222", + "name" : "Niederflurbus", + "realtime" : "1", + "mtSubcode" : "0", + "symbol" : "145", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "R", + "line" : "12145", + "gid" : "de:vrr:eva-12-145:" + }, + "key" : "558", + "delay" : "7", + "motType" : "5", + "direction" : "Essen Erbach", + "stateless" : "eva:12145: :R:j24", + "number" : "145", + "directionFrom" : "Essen Heisingen Baldeneysee", + "lineDisplay" : "line" + }, + "platformName" : "1", + "platform" : "1", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.84932" + } + ], + "mapName" : "MRCV" + }, + { + "platformName" : "Gleis 3", + "platform" : "3", + "attrs" : [ + { + "value" : "RB_EVAG.2992", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "area" : "2", + "servingLine" : { + "name" : "Straßenbahn", + "destID" : "20009254", + "code" : "4", + "mtSubcode" : "0", + "realtime" : "1", + "symbol" : "106", + "liErgRiProj" : { + "direction" : "H", + "line" : "11106", + "gid" : "de:vrr:eva-11-106:", + "supplement" : " ", + "project" : "j24", + "network" : "eva" + }, + "key" : "167", + "delay" : "0", + "direction" : "Essen Germaniaplatz", + "motType" : "4", + "stateless" : "eva:11106: :H:j24", + "lineDisplay" : "line", + "number" : "106", + "directionFrom" : "Essen Helenenstr." + }, + "operator" : { + "name" : "EVAG Strab", + "publicCode" : "EV-T", + "code" : "11" + }, + "countdown" : "1", + "dateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "35", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "hour" : "18", + "minute" : "35", + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7" + }, + "y" : "5296977", + "x" : "779748", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz" + }, + { + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21", + "minute" : "35", + "hour" : "18" + }, + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "countdown" : "1", + "realDateTime" : { + "hour" : "18", + "minute" : "35", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "platform" : "4", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.3140", + "name" : "AVMSTripID" + } + ], + "platformName" : "Gleis 4", + "servingLine" : { + "delay" : "0", + "motType" : "4", + "direction" : "Essen Helenenstr.", + "stateless" : "eva:11101: :H:j24", + "directionFrom" : "Essen Philippusstift", + "number" : "101", + "lineDisplay" : "line", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009306", + "realtime" : "1", + "mtSubcode" : "0", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "H", + "line" : "11101", + "gid" : "de:vrr:eva-11-101:" + }, + "symbol" : "101", + "key" : "155" + }, + "area" : "2", + "stopName" : "Essen Berliner Platz", + "y" : "5297057", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779692" + }, + { + "stopID" : "20009153", + "x" : "779713", + "nameWO" : "Berliner Platz", + "y" : "5297149", + "stopName" : "Essen Berliner Platz", + "area" : "1", + "servingLine" : { + "destID" : "20009447", + "code" : "1", + "name" : "U-Bahn", + "mtSubcode" : "0", + "realtime" : "1", + "liErgRiProj" : { + "direction" : "H", + "gid" : "de:vrr:eva-10-U17:", + "line" : "10U17", + "supplement" : " ", + "project" : "j24", + "network" : "eva" + }, + "symbol" : "U17", + "key" : "109", + "delay" : "0", + "direction" : "Essen Margarethenhöhe", + "motType" : "2", + "stateless" : "eva:10U17: :H:j24", + "lineDisplay" : "line", + "directionFrom" : "Essen Karlsplatz", + "number" : "U17" + }, + "platformName" : "2", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.274590", + "name" : "AVMSTripID" + } + ], + "platform" : "2", + "realDateTime" : { + "minute" : "35", + "hour" : "18", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "countdown" : "1", + "operator" : { + "name" : "EVAG U-Bahn", + "publicCode" : "EV-U", + "code" : "10" + }, + "dateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "35" + }, + "realtimeTripStatus" : "MONITORED" + }, + { + "stopName" : "Essen Berliner Platz", + "y" : "5297142", + "nameWO" : "Berliner Platz", + "x" : "779741", + "stopID" : "20009153", + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "hour" : "18", + "minute" : "36", + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7" + }, + "operator" : { + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn", + "code" : "10" + }, + "countdown" : "2", + "realDateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "36" + }, + "attrs" : [ + { + "value" : "RB_EVAG.274934", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "1", + "platformName" : "1", + "servingLine" : { + "motType" : "2", + "direction" : "Gelsenkirchen Buerer Str.", + "delay" : "0", + "directionFrom" : "Essen Messe W.-Süd/Gruga", + "number" : "U11", + "lineDisplay" : "line", + "stateless" : "eva:10U11: :R:j24", + "realtime" : "1", + "mtSubcode" : "0", + "code" : "1", + "name" : "U-Bahn", + "destID" : "20005579", + "key" : "709", + "liErgRiProj" : { + "network" : "eva", + "project" : "j24", + "supplement" : " ", + "line" : "10U11", + "gid" : "de:vrr:eva-10-U11:", + "direction" : "R" + }, + "symbol" : "U11" + }, + "area" : "1" + }, + { + "operator" : { + "code" : "12", + "publicCode" : "EV-B", + "name" : "EVAG Bus" + }, + "countdown" : "2", + "dateTime" : { + "hour" : "18", + "minute" : "36", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "platformName" : "4", + "mapName" : "MRCV", + "platform" : "4", + "area" : "3", + "servingLine" : { + "realtime" : "0", + "mtSubcode" : "0", + "name" : "Niederflurbus", + "code" : "5", + "destID" : "20009197", + "key" : "190", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "R", + "line" : "12166", + "gid" : "de:vrr:eva-12-166:" + }, + "symbol" : "166", + "motType" : "5", + "direction" : "Essen Dellwig Bahnhof", + "directionFrom" : "E-Burgaltendorf Burgruine", + "number" : "166", + "lineDisplay" : "line", + "stateless" : "eva:12166: :R:j24" + }, + "stopName" : "Essen Berliner Platz", + "y" : "5296893", + "x" : "779748", + "stopID" : "20009153", + "nameWO" : "Berliner Platz" + }, + { + "area" : "2", + "servingLine" : { + "liErgRiProj" : { + "network" : "eva", + "project" : "j24", + "supplement" : " ", + "gid" : "de:vrr:eva-11-103:", + "line" : "11103", + "direction" : "R" + }, + "symbol" : "103", + "key" : "462", + "code" : "4", + "destID" : "20009641", + "name" : "Straßenbahn", + "realtime" : "1", + "mtSubcode" : "0", + "stateless" : "eva:11103: :R:j24", + "directionFrom" : "Essen Steele S", + "number" : "103", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "4", + "direction" : "Essen Wertstr." + }, + "platformName" : "Gleis 3", + "platform" : "3", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.2316", + "name" : "AVMSTripID" + } + ], + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "37", + "hour" : "18" + }, + "countdown" : "3", + "operator" : { + "name" : "EVAG Strab", + "publicCode" : "EV-T", + "code" : "11" + }, + "dateTime" : { + "minute" : "37", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024" + }, + "realtimeTripStatus" : "MONITORED", + "stopID" : "20009153", + "x" : "779748", + "nameWO" : "Berliner Platz", + "y" : "5296977", + "stopName" : "Essen Berliner Platz" + }, + { + "realDateTime" : { + "minute" : "38", + "hour" : "18", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "dateTime" : { + "hour" : "18", + "minute" : "38", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "4", + "operator" : { + "publicCode" : "EV-T", + "name" : "EVAG Strab", + "code" : "11" + }, + "servingLine" : { + "mtSubcode" : "0", + "realtime" : "1", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009665", + "key" : "365", + "symbol" : "105", + "liErgRiProj" : { + "direction" : "H", + "line" : "11105", + "gid" : "de:vrr:eva-11-105:", + "supplement" : " ", + "project" : "j24", + "network" : "eva" + }, + "direction" : "Essen Zeche Ludwig", + "motType" : "4", + "delay" : "0", + "lineDisplay" : "line", + "number" : "105", + "directionFrom" : "Essen Unterstr.", + "stateless" : "eva:11105: :H:j24" + }, + "area" : "2", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.2585", + "name" : "AVMSTripID" + } + ], + "platform" : "4", + "platformName" : "Gleis 4", + "stopName" : "Essen Berliner Platz", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779692", + "y" : "5297057" + }, + { + "servingLine" : { + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009582", + "realtime" : "1", + "mtSubcode" : "0", + "liErgRiProj" : { + "line" : "11109", + "gid" : "de:vrr:eva-11-109:", + "direction" : "H", + "project" : "j24", + "network" : "eva", + "supplement" : " " + }, + "symbol" : "109", + "key" : "195", + "delay" : "0", + "motType" : "4", + "direction" : "Essen Steele S", + "stateless" : "eva:11109: :H:j24", + "directionFrom" : "Frohnhausen Breilsort", + "number" : "109", + "lineDisplay" : "line" + }, + "area" : "2", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.3690" + } + ], + "mapName" : "MRCV", + "platform" : "4", + "platformName" : "Gleis 4", + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "40", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7", + "hour" : "18", + "minute" : "40" + }, + "countdown" : "6", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779692", + "y" : "5297057", + "stopName" : "Essen Berliner Platz" + }, + { + "stopInfos" : null, + "stopName" : "Essen Berliner Platz", + "y" : "5296897", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779732", + "dateTime" : { + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "41" + }, + "tripInfos" : null, + "operator" : { + "name" : "DB Bahn Rheinlandbus", + "publicCode" : "BVR", + "code" : "88" + }, + "countdown" : "7", + "lineInfos" : { + "lineInfo" : { + "infoLinkText" : "Linie SB16 - Haltestellenausfall - Zwischen (H) Essen, Hollestr. und (H) Essen, Hollestr. - Grund: Baumaßnahme", + "infoLinkURL" : "http://ems.vrr.de/info-link/5efeb629-f5df-5464-b4ff-753f43edd18f", + "paramList" : [ + { + "name" : "publisher", + "type" : "addInfoParam", + "value" : "ems.comm.addinfo", + "edit" : "0" + }, + { + "edit" : "0", + "value" : "lineInfo", + "name" : "infoType", + "type" : "addInfoParam" + }, + { + "type" : "system", + "name" : "infoID", + "edit" : "0", + "value" : "ems-19119" + }, + { + "edit" : "0", + "value" : "5356663", + "type" : "system", + "name" : "seqID" + }, + { + "name" : "priority", + "type" : "addInfoParam", + "edit" : "0", + "value" : "normal" + }, + { + "name" : "incidentDateTime", + "type" : "system", + "edit" : "0", + "value" : "08/01/2024 03:00 - 08/01/2026 23:50" + } + ], + "infoText" : { + "content" : "Linie SB16: Zwischen (H) Essen, Hollestr. und (H) Essen, Hollestr. kommt es zu einem Haltestellenausfall.

Dauer: 08.01.24, 03:00 Uhr bis 08.01.26, 23:50 Uhr

Die Haltestelle wird nicht angefahren. Abfahrtshaltestelle (Bussteig 6)", + "subject" : "Haltestellenausfall durch Baumaßnahme", + "speechText" : "", + "smsText" : "Linie SB16 - Haltestellenausfall - Zwischen (H) Essen, Hollestr. und (H) Essen, Hollestr. - Grund: Baumaßnahme", + "htmlText" : "", + "additionalText" : "Die beschriebenen Änderungen sind in der elektronischen Fahrplanauskunft (EFA) nicht berücksichtigt.", + "subtitle" : "Haltestellenausfall durch Baumaßnahme", + "wmlText" : "" + } + } + }, + "mapName" : "MRCV", + "platform" : "3", + "platformName" : "3", + "servingLine" : { + "lineDisplay" : "line", + "number" : "SB16", + "directionFrom" : "BOT St.-Anto.-Hosp./Gartenstr.", + "stateless" : "bvr:88016:K:R:j24", + "direction" : "Essen Hauptbahnhof", + "motType" : "7", + "key" : "92", + "symbol" : "SB16", + "liErgRiProj" : { + "direction" : "R", + "gid" : "de:vrr:bvr-88-16:K", + "line" : "88016", + "supplement" : "K", + "network" : "bvr", + "project" : "j24" + }, + "mtSubcode" : "0", + "realtime" : "0", + "destID" : "20009289", + "name" : "SB", + "code" : "5" + }, + "area" : "3" + }, + { + "stopName" : "Essen Berliner Platz", + "y" : "5297149", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779713", + "dateTime" : { + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7", + "hour" : "18", + "minute" : "42" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "8", + "operator" : { + "code" : "10", + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn" + }, + "realDateTime" : { + "minute" : "42", + "hour" : "18", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.274464", + "name" : "AVMSTripID" + } + ], + "platform" : "2", + "platformName" : "2", + "servingLine" : { + "motType" : "2", + "direction" : "Essen Messe W.-Süd/Gruga", + "delay" : "0", + "directionFrom" : "Gelsenkirchen Buerer Str.", + "number" : "U11", + "lineDisplay" : "line", + "stateless" : "eva:10U11: :H:j24", + "realtime" : "1", + "mtSubcode" : "0", + "code" : "1", + "destID" : "20009270", + "name" : "U-Bahn", + "key" : "271", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "H", + "gid" : "de:vrr:eva-10-U11:", + "line" : "10U11" + }, + "symbol" : "U11" + }, + "area" : "1" + }, + { + "y" : "5296977", + "stopID" : "20009153", + "x" : "779748", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz", + "platformName" : "Gleis 3", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.3840" + } + ], + "mapName" : "MRCV", + "platform" : "3", + "area" : "2", + "servingLine" : { + "lineDisplay" : "line", + "directionFrom" : "Essen Steele S", + "number" : "109", + "stateless" : "eva:11109: :R:j24", + "direction" : "Frohnhausen Breilsort", + "motType" : "4", + "delay" : "0", + "key" : "370", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "R", + "line" : "11109", + "gid" : "de:vrr:eva-11-109:" + }, + "symbol" : "109", + "mtSubcode" : "0", + "realtime" : "1", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009243" + }, + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "countdown" : "8", + "dateTime" : { + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21", + "minute" : "42", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "42" + } + }, + { + "servingLine" : { + "motType" : "2", + "direction" : "Essen Karlsplatz", + "delay" : "0", + "number" : "U17", + "directionFrom" : "Essen Margarethenhöhe", + "lineDisplay" : "line", + "stateless" : "eva:10U17: :R:j24", + "realtime" : "1", + "mtSubcode" : "0", + "code" : "1", + "name" : "U-Bahn", + "destID" : "20009370", + "key" : "263", + "symbol" : "U17", + "liErgRiProj" : { + "network" : "eva", + "project" : "j24", + "supplement" : " ", + "gid" : "de:vrr:eva-10-U17:", + "line" : "10U17", + "direction" : "R" + } + }, + "area" : "1", + "platform" : "1", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.274832" + } + ], + "platformName" : "1", + "realDateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "43" + }, + "dateTime" : { + "hour" : "18", + "minute" : "43", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "realtimeTripStatus" : "MONITORED", + "operator" : { + "code" : "10", + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn" + }, + "countdown" : "9", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779741", + "y" : "5297142", + "stopName" : "Essen Berliner Platz" + }, + { + "stopName" : "Essen Berliner Platz", + "x" : "779748", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5296893", + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "44", + "hour" : "18" + }, + "countdown" : "10", + "operator" : { + "name" : "Vestische", + "publicCode" : "VEST", + "code" : "40" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "44", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9" + }, + "area" : "3", + "servingLine" : { + "symbol" : "SB16", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "ves", + "direction" : "H", + "line" : "40016", + "gid" : "de:vrr:SB16:VES-40-16" + }, + "key" : "76", + "name" : "Niederflurbus", + "code" : "5", + "destID" : "20003174", + "mtSubcode" : "0", + "realtime" : "1", + "stateless" : "ves:40016: :H:j24", + "lineDisplay" : "line", + "number" : "SB16", + "directionFrom" : "Essen Hauptbahnhof", + "delay" : "0", + "direction" : "BOT St.-Anto.-Hosp./Gartenstr.", + "motType" : "5" + }, + "platformName" : "4", + "platform" : "4", + "attrs" : [ + { + "value" : "4001610010160413", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV" + }, + { + "stopName" : "Essen Berliner Platz", + "x" : "779692", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5297057", + "realDateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "45" + }, + "countdown" : "11", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "dateTime" : { + "minute" : "45", + "hour" : "18", + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21" + }, + "realtimeTripStatus" : "MONITORED", + "area" : "2", + "servingLine" : { + "liErgRiProj" : { + "project" : "j24", + "network" : "eva", + "supplement" : " ", + "gid" : "de:vrr:eva-11-103:", + "line" : "11103", + "direction" : "H" + }, + "symbol" : "103", + "key" : "139", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009289", + "realtime" : "1", + "mtSubcode" : "0", + "stateless" : "eva:11103: :H:j24", + "directionFrom" : "Essen Wertstr.", + "number" : "103", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "4", + "direction" : "Essen Hauptbahnhof" + }, + "platformName" : "Gleis 4", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.1938" + } + ], + "platform" : "4" + }, + { + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "45", + "hour" : "18", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "operator" : { + "publicCode" : "", + "code" : "13", + "name" : "Ruhrbahn Mülheim" + }, + "countdown" : "11", + "realDateTime" : { + "hour" : "18", + "minute" : "45", + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7" + }, + "platform" : "2", + "attrs" : [ + { + "value" : "RB_EVAG.274790", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platformName" : "2", + "servingLine" : { + "key" : "77", + "symbol" : "U18", + "liErgRiProj" : { + "supplement" : " ", + "network" : "btm", + "project" : "j24", + "direction" : "H", + "line" : "13U18", + "gid" : "de:vrr:btm-13-U18:" + }, + "mtSubcode" : "0", + "realtime" : "1", + "name" : "U-Bahn", + "destID" : "20015225", + "code" : "1", + "lineDisplay" : "line", + "number" : "U18", + "directionFrom" : "Essen Berliner Platz", + "stateless" : "btm:13U18: :H:j24", + "direction" : "Mülheim Hauptbahnhof", + "motType" : "2", + "delay" : "0" + }, + "area" : "1", + "stopName" : "Essen Berliner Platz", + "y" : "5297149", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779713" + }, + { + "platformName" : "Gleis 3", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.2888" + } + ], + "platform" : "3", + "area" : "2", + "servingLine" : { + "delay" : "0", + "direction" : "Essen Unterstr.", + "motType" : "4", + "stateless" : "eva:11105: :R:j24", + "lineDisplay" : "line", + "number" : "105", + "directionFrom" : "Essen Zeche Ludwig", + "code" : "4", + "destID" : "20009614", + "name" : "Straßenbahn", + "mtSubcode" : "0", + "realtime" : "1", + "symbol" : "105", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "R", + "gid" : "de:vrr:eva-11-105:", + "line" : "11105" + }, + "key" : "753" + }, + "countdown" : "11", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "dateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "45", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "hour" : "18", + "minute" : "45", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "y" : "5296977", + "stopID" : "20009153", + "x" : "779748", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz" + }, + { + "y" : "5297057", + "stopID" : "20009153", + "x" : "779692", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz", + "platformName" : "Gleis 4", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.3175" + } + ], + "platform" : "4", + "area" : "2", + "servingLine" : { + "direction" : "Essen Helenenstr.", + "motType" : "4", + "delay" : "1", + "lineDisplay" : "line", + "directionFrom" : "Essen Philippusstift", + "number" : "101", + "stateless" : "eva:11101: :H:j24", + "mtSubcode" : "0", + "realtime" : "1", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009306", + "key" : "159", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "H", + "line" : "11101", + "gid" : "de:vrr:eva-11-101:" + }, + "symbol" : "101" + }, + "countdown" : "17", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "50", + "hour" : "18", + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21" + }, + "realDateTime" : { + "minute" : "51", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024" + } + }, + { + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "50", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "50", + "hour" : "18" + }, + "operator" : { + "publicCode" : "EV-T", + "name" : "EVAG Strab", + "code" : "11" + }, + "countdown" : "16", + "servingLine" : { + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "H", + "line" : "11106", + "gid" : "de:vrr:eva-11-106:" + }, + "symbol" : "106", + "key" : "171", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009254", + "mtSubcode" : "0", + "realtime" : "1", + "stateless" : "eva:11106: :H:j24", + "lineDisplay" : "line", + "directionFrom" : "Essen Helenenstr.", + "number" : "106", + "delay" : "0", + "direction" : "Essen Germaniaplatz", + "motType" : "4" + }, + "area" : "2", + "platform" : "3", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.1072" + } + ], + "mapName" : "MRCV", + "platformName" : "Gleis 3", + "stopName" : "Essen Berliner Platz", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779748", + "y" : "5296977" + }, + { + "platform" : "2", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.274551", + "name" : "AVMSTripID" + } + ], + "platformName" : "2", + "servingLine" : { + "delay" : "0", + "direction" : "Essen Margarethenhöhe", + "motType" : "2", + "stateless" : "eva:10U17: :H:j24", + "lineDisplay" : "line", + "number" : "U17", + "directionFrom" : "Essen Karlsplatz", + "name" : "U-Bahn", + "code" : "1", + "destID" : "20009447", + "mtSubcode" : "0", + "realtime" : "1", + "symbol" : "U17", + "liErgRiProj" : { + "project" : "j24", + "network" : "eva", + "supplement" : " ", + "line" : "10U17", + "gid" : "de:vrr:eva-10-U17:", + "direction" : "H" + }, + "key" : "111" + }, + "area" : "1", + "dateTime" : { + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21", + "minute" : "50", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "16", + "operator" : { + "code" : "10", + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn" + }, + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "50", + "hour" : "18" + }, + "y" : "5297149", + "nameWO" : "Berliner Platz", + "x" : "779713", + "stopID" : "20009153", + "stopName" : "Essen Berliner Platz" + }, + { + "y" : "5296897", + "stopID" : "20009153", + "x" : "779732", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz", + "platformName" : "3", + "attrs" : [ + { + "value" : "RB_EVAG.87593", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "3", + "area" : "3", + "servingLine" : { + "symbol" : "166", + "liErgRiProj" : { + "direction" : "H", + "line" : "12166", + "gid" : "de:vrr:eva-12-166:", + "supplement" : " ", + "project" : "j24", + "network" : "eva" + }, + "key" : "316", + "name" : "Niederflurbus", + "destID" : "20008454", + "code" : "5", + "realtime" : "1", + "mtSubcode" : "0", + "stateless" : "eva:12166: :H:j24", + "number" : "166", + "directionFrom" : "Essen Dellwig Bahnhof", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "5", + "direction" : "Hattingen Märkische Str." + }, + "countdown" : "16", + "operator" : { + "name" : "EVAG Bus", + "publicCode" : "EV-B", + "code" : "12" + }, + "dateTime" : { + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "50" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "hour" : "18", + "minute" : "50", + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7" + } + }, + { + "area" : "4", + "servingLine" : { + "realtime" : "1", + "mtSubcode" : "0", + "name" : "Niederflurbus", + "code" : "5", + "destID" : "20009302", + "key" : "280", + "symbol" : "145", + "liErgRiProj" : { + "gid" : "de:vrr:eva-12-145:", + "line" : "12145", + "direction" : "H", + "project" : "j24", + "network" : "eva", + "supplement" : " " + }, + "motType" : "5", + "direction" : "Essen Heisingen Baldeneysee", + "delay" : "0", + "number" : "145", + "directionFrom" : "Essen Erbach", + "lineDisplay" : "line", + "stateless" : "eva:12145: :H:j24" + }, + "platformName" : "2", + "platform" : "2", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.84849" + } + ], + "mapName" : "MRCV", + "realDateTime" : { + "minute" : "51", + "hour" : "18", + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21" + }, + "countdown" : "17", + "operator" : { + "publicCode" : "EV-B", + "name" : "EVAG Bus", + "code" : "12" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "51" + }, + "x" : "779673", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5297075", + "stopName" : "Essen Berliner Platz" + }, + { + "realDateTime" : { + "hour" : "18", + "minute" : "51", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21", + "minute" : "51", + "hour" : "18" + }, + "operator" : { + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn", + "code" : "10" + }, + "countdown" : "17", + "servingLine" : { + "lineDisplay" : "line", + "directionFrom" : "Essen Messe W.-Süd/Gruga", + "number" : "U11", + "stateless" : "eva:10U11: :R:j24", + "direction" : "Gelsenkirchen Buerer Str.", + "motType" : "2", + "delay" : "0", + "key" : "712", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "R", + "line" : "10U11", + "gid" : "de:vrr:eva-10-U11:" + }, + "symbol" : "U11", + "mtSubcode" : "0", + "realtime" : "1", + "name" : "U-Bahn", + "code" : "1", + "destID" : "20005579" + }, + "area" : "1", + "platform" : "1", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.274438", + "name" : "AVMSTripID" + } + ], + "platformName" : "1", + "stopName" : "Essen Berliner Platz", + "nameWO" : "Berliner Platz", + "x" : "779741", + "stopID" : "20009153", + "y" : "5297142" + }, + { + "stopName" : "Essen Berliner Platz", + "y" : "5296977", + "x" : "779748", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "countdown" : "18", + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "hour" : "18", + "minute" : "52", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "realDateTime" : { + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7", + "hour" : "18", + "minute" : "52" + }, + "platformName" : "Gleis 3", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.3554" + } + ], + "platform" : "3", + "area" : "2", + "servingLine" : { + "delay" : "0", + "motType" : "4", + "direction" : "Essen Wertstr.", + "stateless" : "eva:11103: :R:j24", + "number" : "103", + "directionFrom" : "Essen Steele S", + "lineDisplay" : "line", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009641", + "realtime" : "1", + "mtSubcode" : "0", + "symbol" : "103", + "liErgRiProj" : { + "gid" : "de:vrr:eva-11-103:", + "line" : "11103", + "direction" : "R", + "network" : "eva", + "project" : "j24", + "supplement" : " " + }, + "key" : "463" + } + }, + { + "attrs" : [ + { + "value" : "RB_EVAG.2648", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "4", + "platformName" : "Gleis 4", + "servingLine" : { + "motType" : "4", + "direction" : "Essen Zeche Ludwig", + "delay" : "0", + "directionFrom" : "Essen Unterstr.", + "number" : "105", + "lineDisplay" : "line", + "stateless" : "eva:11105: :H:j24", + "realtime" : "1", + "mtSubcode" : "0", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009665", + "key" : "369", + "liErgRiProj" : { + "gid" : "de:vrr:eva-11-105:", + "line" : "11105", + "direction" : "H", + "network" : "eva", + "project" : "j24", + "supplement" : " " + }, + "symbol" : "105" + }, + "area" : "2", + "dateTime" : { + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7", + "hour" : "18", + "minute" : "53" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "19", + "operator" : { + "name" : "EVAG Strab", + "publicCode" : "EV-T", + "code" : "11" + }, + "realDateTime" : { + "minute" : "53", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9" + }, + "y" : "5297057", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779692", + "stopName" : "Essen Berliner Platz" + }, + { + "platformName" : "Gleis 4", + "platform" : "4", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.3745", + "name" : "AVMSTripID" + } + ], + "area" : "2", + "servingLine" : { + "lineDisplay" : "line", + "directionFrom" : "Frohnhausen Breilsort", + "number" : "109", + "stateless" : "eva:11109: :H:j24", + "direction" : "Essen Steele S", + "motType" : "4", + "delay" : "0", + "key" : "123", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "H", + "line" : "11109", + "gid" : "de:vrr:eva-11-109:" + }, + "symbol" : "109", + "mtSubcode" : "0", + "realtime" : "1", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009582" + }, + "countdown" : "21", + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "55", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9" + }, + "realDateTime" : { + "hour" : "18", + "minute" : "55", + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7" + }, + "y" : "5297057", + "stopID" : "20009153", + "x" : "779692", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz" + }, + { + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "countdown" : "23", + "dateTime" : { + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21", + "minute" : "57", + "hour" : "18" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "hour" : "18", + "minute" : "57", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "platformName" : "Gleis 3", + "attrs" : [ + { + "value" : "RB_EVAG.1560", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "3", + "area" : "2", + "servingLine" : { + "mtSubcode" : "0", + "realtime" : "1", + "destID" : "20009243", + "code" : "4", + "name" : "Straßenbahn", + "key" : "374", + "symbol" : "109", + "liErgRiProj" : { + "project" : "j24", + "network" : "eva", + "supplement" : " ", + "gid" : "de:vrr:eva-11-109:", + "line" : "11109", + "direction" : "R" + }, + "direction" : "Frohnhausen Breilsort", + "motType" : "4", + "delay" : "0", + "lineDisplay" : "line", + "number" : "109", + "directionFrom" : "Essen Steele S", + "stateless" : "eva:11109: :R:j24" + }, + "stopName" : "Essen Berliner Platz", + "y" : "5296977", + "stopID" : "20009153", + "x" : "779748", + "nameWO" : "Berliner Platz" + }, + { + "servingLine" : { + "liErgRiProj" : { + "network" : "eva", + "project" : "j24", + "supplement" : " ", + "gid" : "de:vrr:eva-10-U11:", + "line" : "10U11", + "direction" : "H" + }, + "symbol" : "U11", + "key" : "275", + "destID" : "20009270", + "name" : "U-Bahn", + "code" : "1", + "realtime" : "1", + "mtSubcode" : "0", + "stateless" : "eva:10U11: :H:j24", + "directionFrom" : "Gelsenkirchen Buerer Str.", + "number" : "U11", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "2", + "direction" : "Essen Messe W.-Süd/Gruga" + }, + "area" : "1", + "platform" : "2", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.274909" + } + ], + "mapName" : "MRCV", + "platformName" : "2", + "realDateTime" : { + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21", + "minute" : "57", + "hour" : "18" + }, + "dateTime" : { + "minute" : "57", + "hour" : "18", + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024" + }, + "realtimeTripStatus" : "MONITORED", + "operator" : { + "name" : "EVAG U-Bahn", + "publicCode" : "EV-U", + "code" : "10" + }, + "countdown" : "23", + "nameWO" : "Berliner Platz", + "x" : "779713", + "stopID" : "20009153", + "y" : "5297149", + "stopName" : "Essen Berliner Platz" + }, + { + "stopName" : "Essen Berliner Platz", + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779741", + "y" : "5297142", + "realDateTime" : { + "hour" : "18", + "minute" : "58", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "hour" : "18", + "minute" : "58", + "month" : "9", + "year" : "2024", + "day" : "21", + "weekday" : "7" + }, + "operator" : { + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn", + "code" : "10" + }, + "countdown" : "24", + "servingLine" : { + "stateless" : "eva:10U17: :R:j24", + "number" : "U17", + "directionFrom" : "Essen Margarethenhöhe", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "2", + "direction" : "Essen Karlsplatz", + "symbol" : "U17", + "liErgRiProj" : { + "direction" : "R", + "gid" : "de:vrr:eva-10-U17:", + "line" : "10U17", + "supplement" : " ", + "network" : "eva", + "project" : "j24" + }, + "key" : "266", + "code" : "1", + "name" : "U-Bahn", + "destID" : "20009370", + "realtime" : "1", + "mtSubcode" : "0" + }, + "area" : "1", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.274889" + } + ], + "mapName" : "MRCV", + "platform" : "1", + "platformName" : "1" + }, + { + "stopName" : "Essen Berliner Platz", + "x" : "779692", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5297057", + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "0", + "hour" : "19" + }, + "countdown" : "26", + "operator" : { + "name" : "EVAG Strab", + "publicCode" : "EV-T", + "code" : "11" + }, + "dateTime" : { + "hour" : "19", + "minute" : "0", + "year" : "2024", + "month" : "9", + "day" : "21", + "weekday" : "7" + }, + "realtimeTripStatus" : "MONITORED", + "area" : "2", + "servingLine" : { + "stateless" : "eva:11103: :H:j24", + "directionFrom" : "Essen Wertstr.", + "number" : "103", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "4", + "direction" : "Essen Hauptbahnhof", + "liErgRiProj" : { + "network" : "eva", + "project" : "j24", + "supplement" : " ", + "gid" : "de:vrr:eva-11-103:", + "line" : "11103", + "direction" : "H" + }, + "symbol" : "103", + "key" : "141", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009289", + "realtime" : "1", + "mtSubcode" : "0" + }, + "platformName" : "Gleis 4", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.2069" + } + ], + "mapName" : "MRCV", + "platform" : "4" + }, + { + "countdown" : "26", + "operator" : { + "code" : "13", + "publicCode" : "", + "name" : "Ruhrbahn Mülheim" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "0", + "hour" : "19" + }, + "realDateTime" : { + "minute" : "0", + "hour" : "19", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "platformName" : "2", + "attrs" : [ + { + "value" : "RB_EVAG.274647", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "2", + "area" : "1", + "servingLine" : { + "delay" : "0", + "motType" : "2", + "direction" : "Mülheim Hauptbahnhof", + "stateless" : "btm:13U18: :H:j24", + "number" : "U18", + "directionFrom" : "Essen Berliner Platz", + "lineDisplay" : "line", + "name" : "U-Bahn", + "destID" : "20015225", + "code" : "1", + "realtime" : "1", + "mtSubcode" : "0", + "symbol" : "U18", + "liErgRiProj" : { + "project" : "j24", + "network" : "btm", + "supplement" : " ", + "line" : "13U18", + "gid" : "de:vrr:btm-13-U18:", + "direction" : "H" + }, + "key" : "78" + }, + "stopName" : "Essen Berliner Platz", + "y" : "5297149", + "x" : "779713", + "stopID" : "20009153", + "nameWO" : "Berliner Platz" + }, + { + "nameWO" : "Berliner Platz", + "x" : "779748", + "stopID" : "20009153", + "y" : "5296977", + "stopName" : "Essen Berliner Platz", + "servingLine" : { + "realtime" : "1", + "mtSubcode" : "0", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009614", + "key" : "755", + "symbol" : "105", + "liErgRiProj" : { + "direction" : "R", + "gid" : "de:vrr:eva-11-105:", + "line" : "11105", + "supplement" : " ", + "network" : "eva", + "project" : "j24" + }, + "motType" : "4", + "direction" : "Essen Unterstr.", + "delay" : "0", + "number" : "105", + "directionFrom" : "Essen Zeche Ludwig", + "lineDisplay" : "line", + "stateless" : "eva:11105: :R:j24" + }, + "area" : "2", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.2412", + "name" : "AVMSTripID" + } + ], + "platform" : "3", + "platformName" : "Gleis 3", + "realDateTime" : { + "hour" : "19", + "minute" : "0", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "dateTime" : { + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21", + "minute" : "0", + "hour" : "19" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "26", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + } + }, + { + "countdown" : "30", + "operator" : { + "code" : "12", + "publicCode" : "EV-B", + "name" : "EVAG Bus" + }, + "dateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "4", + "hour" : "19" + }, + "realtimeTripStatus" : "MONITORED", + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "4", + "hour" : "19" + }, + "platformName" : "1", + "platform" : "1", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.84908" + } + ], + "area" : "4", + "servingLine" : { + "name" : "Niederflurbus", + "destID" : "20009222", + "code" : "5", + "realtime" : "1", + "mtSubcode" : "0", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "R", + "line" : "12145", + "gid" : "de:vrr:eva-12-145:" + }, + "symbol" : "145", + "key" : "561", + "delay" : "0", + "motType" : "5", + "direction" : "Essen Erbach", + "stateless" : "eva:12145: :R:j24", + "directionFrom" : "Essen Heisingen Baldeneysee", + "number" : "145", + "lineDisplay" : "line" + }, + "stopName" : "Essen Berliner Platz", + "y" : "5297058", + "stopID" : "20009153", + "x" : "779634", + "nameWO" : "Berliner Platz" + }, + { + "nameWO" : "Berliner Platz", + "stopID" : "20009153", + "x" : "779748", + "y" : "5296893", + "stopName" : "Essen Berliner Platz", + "servingLine" : { + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "R", + "line" : "12166", + "gid" : "de:vrr:eva-12-166:" + }, + "symbol" : "166", + "key" : "246", + "name" : "Niederflurbus", + "code" : "5", + "destID" : "20009197", + "realtime" : "1", + "mtSubcode" : "0", + "stateless" : "eva:12166: :R:j24", + "directionFrom" : "Hattingen Märkische Str.", + "number" : "166", + "lineDisplay" : "line", + "delay" : "0", + "motType" : "5", + "direction" : "Essen Dellwig Bahnhof" + }, + "area" : "3", + "platform" : "4", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.87911" + } + ], + "mapName" : "MRCV", + "platformName" : "4", + "realDateTime" : { + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9", + "minute" : "4", + "hour" : "19" + }, + "dateTime" : { + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7", + "hour" : "19", + "minute" : "4" + }, + "realtimeTripStatus" : "MONITORED", + "countdown" : "30", + "operator" : { + "publicCode" : "EV-B", + "code" : "12", + "name" : "EVAG Bus" + } + }, + { + "realDateTime" : { + "minute" : "5", + "hour" : "19", + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21" + }, + "countdown" : "31", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "5", + "hour" : "19", + "weekday" : "7", + "day" : "21", + "year" : "2024", + "month" : "9" + }, + "area" : "2", + "servingLine" : { + "mtSubcode" : "0", + "realtime" : "1", + "code" : "4", + "name" : "Straßenbahn", + "destID" : "20009254", + "key" : "174", + "symbol" : "106", + "liErgRiProj" : { + "line" : "11106", + "gid" : "de:vrr:eva-11-106:", + "direction" : "H", + "project" : "j24", + "network" : "eva", + "supplement" : " " + }, + "direction" : "Essen Germaniaplatz", + "motType" : "4", + "delay" : "0", + "lineDisplay" : "line", + "number" : "106", + "directionFrom" : "Essen Helenenstr.", + "stateless" : "eva:11106: :H:j24" + }, + "platformName" : "Gleis 3", + "platform" : "3", + "attrs" : [ + { + "value" : "RB_EVAG.1395", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "stopName" : "Essen Berliner Platz", + "stopID" : "20009153", + "x" : "779748", + "nameWO" : "Berliner Platz", + "y" : "5296977" + }, + { + "x" : "779748", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5296977", + "stopName" : "Essen Berliner Platz", + "area" : "2", + "servingLine" : { + "stateless" : "eva:11103: :R:j24", + "lineDisplay" : "line", + "number" : "103", + "directionFrom" : "Essen Hauptbahnhof", + "delay" : "0", + "direction" : "Essen Wertstr.", + "motType" : "4", + "symbol" : "103", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "R", + "gid" : "de:vrr:eva-11-103:", + "line" : "11103" + }, + "key" : "524", + "name" : "Straßenbahn", + "destID" : "20009641", + "code" : "4", + "mtSubcode" : "0", + "realtime" : "1" + }, + "platformName" : "Gleis 3", + "platform" : "3", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.1956", + "name" : "AVMSTripID" + } + ], + "realDateTime" : { + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7", + "hour" : "19", + "minute" : "5" + }, + "operator" : { + "publicCode" : "EV-T", + "name" : "EVAG Strab", + "code" : "11" + }, + "countdown" : "31", + "dateTime" : { + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21", + "minute" : "5", + "hour" : "19" + }, + "realtimeTripStatus" : "MONITORED" + }, + { + "stopName" : "Essen Berliner Platz", + "stopID" : "20009153", + "x" : "779713", + "nameWO" : "Berliner Platz", + "y" : "5297149", + "realDateTime" : { + "minute" : "5", + "hour" : "19", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "operator" : { + "publicCode" : "EV-U", + "code" : "10", + "name" : "EVAG U-Bahn" + }, + "countdown" : "31", + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "5", + "hour" : "19", + "weekday" : "7", + "month" : "9", + "year" : "2024", + "day" : "21" + }, + "area" : "1", + "servingLine" : { + "code" : "1", + "name" : "U-Bahn", + "destID" : "20009447", + "mtSubcode" : "0", + "realtime" : "1", + "liErgRiProj" : { + "line" : "10U17", + "gid" : "de:vrr:eva-10-U17:", + "direction" : "H", + "project" : "j24", + "network" : "eva", + "supplement" : " " + }, + "symbol" : "U17", + "key" : "114", + "delay" : "0", + "direction" : "Essen Margarethenhöhe", + "motType" : "2", + "stateless" : "eva:10U17: :H:j24", + "lineDisplay" : "line", + "directionFrom" : "Essen Karlsplatz", + "number" : "U17" + }, + "platformName" : "2", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.274834", + "name" : "AVMSTripID" + } + ], + "platform" : "2" + }, + { + "stopName" : "Essen Berliner Platz", + "x" : "779692", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "y" : "5297057", + "realDateTime" : { + "hour" : "19", + "minute" : "5", + "day" : "21", + "year" : "2024", + "month" : "9", + "weekday" : "7" + }, + "countdown" : "31", + "operator" : { + "code" : "11", + "publicCode" : "EV-T", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "minute" : "5", + "hour" : "19", + "weekday" : "7", + "year" : "2024", + "month" : "9", + "day" : "21" + }, + "area" : "2", + "servingLine" : { + "key" : "162", + "symbol" : "101", + "liErgRiProj" : { + "supplement" : " ", + "network" : "eva", + "project" : "j24", + "direction" : "H", + "gid" : "de:vrr:eva-11-101:", + "line" : "11101" + }, + "realtime" : "1", + "mtSubcode" : "0", + "name" : "Straßenbahn", + "code" : "4", + "destID" : "20009306", + "number" : "101", + "directionFrom" : "Essen Philippusstift", + "lineDisplay" : "line", + "stateless" : "eva:11101: :H:j24", + "motType" : "4", + "direction" : "Essen Helenenstr.", + "delay" : "0" + }, + "platformName" : "Gleis 4", + "mapName" : "MRCV", + "attrs" : [ + { + "value" : "RB_EVAG.3224", + "name" : "AVMSTripID" + } + ], + "platform" : "4" + }, + { + "platformName" : "1", + "platform" : "1", + "mapName" : "MRCV", + "attrs" : [ + { + "name" : "AVMSTripID", + "value" : "RB_EVAG.274465" + } + ], + "area" : "1", + "servingLine" : { + "key" : "714", + "symbol" : "U11", + "liErgRiProj" : { + "supplement" : " ", + "project" : "j24", + "network" : "eva", + "direction" : "R", + "gid" : "de:vrr:eva-10-U11:", + "line" : "10U11" + }, + "mtSubcode" : "0", + "realtime" : "1", + "code" : "1", + "name" : "U-Bahn", + "destID" : "20005579", + "lineDisplay" : "line", + "number" : "U11", + "directionFrom" : "Essen Messe W.-Süd/Gruga", + "stateless" : "eva:10U11: :R:j24", + "direction" : "Gelsenkirchen Buerer Str.", + "motType" : "2", + "delay" : "0" + }, + "operator" : { + "code" : "10", + "publicCode" : "EV-U", + "name" : "EVAG U-Bahn" + }, + "countdown" : "32", + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "hour" : "19", + "minute" : "6", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "realDateTime" : { + "hour" : "19", + "minute" : "6", + "day" : "21", + "month" : "9", + "year" : "2024", + "weekday" : "7" + }, + "y" : "5297142", + "x" : "779741", + "stopID" : "20009153", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz" + }, + { + "y" : "5297057", + "stopID" : "20009153", + "x" : "779692", + "nameWO" : "Berliner Platz", + "stopName" : "Essen Berliner Platz", + "platformName" : "Gleis 4", + "attrs" : [ + { + "value" : "RB_EVAG.2735", + "name" : "AVMSTripID" + } + ], + "mapName" : "MRCV", + "platform" : "4", + "area" : "2", + "servingLine" : { + "motType" : "4", + "direction" : "Essen Zeche Ludwig", + "delay" : "0", + "directionFrom" : "Essen Unterstr.", + "number" : "105", + "lineDisplay" : "line", + "stateless" : "eva:11105: :H:j24", + "realtime" : "1", + "mtSubcode" : "0", + "destID" : "20009665", + "code" : "4", + "name" : "Straßenbahn", + "key" : "372", + "liErgRiProj" : { + "direction" : "H", + "line" : "11105", + "gid" : "de:vrr:eva-11-105:", + "supplement" : " ", + "network" : "eva", + "project" : "j24" + }, + "symbol" : "105" + }, + "countdown" : "34", + "operator" : { + "publicCode" : "EV-T", + "code" : "11", + "name" : "EVAG Strab" + }, + "realtimeTripStatus" : "MONITORED", + "dateTime" : { + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024", + "minute" : "8", + "hour" : "19" + }, + "realDateTime" : { + "minute" : "8", + "hour" : "19", + "weekday" : "7", + "day" : "21", + "month" : "9", + "year" : "2024" + } + } + ], + "arr" : { + "points" : null, + "input" : { + "input" : "" + } + }, + "dateRange" : [ + { + "month" : "09", + "year" : "2024", + "day" : "21", + "weekday" : "7" + }, + { + "year" : "2024", + "month" : "09", + "day" : "22", + "weekday" : "1" + }, + { + "day" : "23", + "year" : "2024", + "month" : "09", + "weekday" : "2" + }, + { + "day" : "24", + "month" : "09", + "year" : "2024", + "weekday" : "3" + }, + { + "weekday" : "4", + "day" : "25", + "year" : "2024", + "month" : "09" + }, + { + "weekday" : "5", + "day" : "26", + "year" : "2024", + "month" : "09" + }, + { + "month" : "09", + "year" : "2024", + "day" : "27", + "weekday" : "6" + }, + { + "year" : "2024", + "month" : "09", + "day" : "28", + "weekday" : "7" + }, + { + "month" : "09", + "year" : "2024", + "day" : "29", + "weekday" : "1" + }, + { + "month" : "09", + "year" : "2024", + "day" : "30", + "weekday" : "2" + }, + { + "weekday" : "3", + "day" : "01", + "year" : "2024", + "month" : "10" + }, + { + "day" : "02", + "month" : "10", + "year" : "2024", + "weekday" : "4" + }, + { + "weekday" : "5", + "year" : "2024", + "month" : "10", + "day" : "03" + }, + { + "weekday" : "6", + "day" : "04", + "year" : "2024", + "month" : "10" + }, + { + "month" : "10", + "year" : "2024", + "day" : "05", + "weekday" : "7" + } + ], + "dm" : { + "points" : { + "point" : { + "stateless" : "20009153", + "infos" : [ + { + "infoText" : { + "smsText" : "Die Fahrtreppe (Eingang D (abwärts) von Straßenebene zur Verteilerebene) an der Haltestelle Essen Berliner Platz ist ausser Betrieb.", + "additionalText" : "Die beschriebenen Änderungen sind in der elektronischen Fahrplanauskunft (EFA) nicht berücksichtigt.", + "htmlText" : "", + "subtitle" : "Haltestelle Essen Berliner Platz: Die Fahrtreppe ist nicht verfügbar. (Eingang D (abwaerts) von Strassenebene zur Verteilerebene)", + "wmlText" : "Die Fahrtreppe (Eingang D (abwärts) von Straßenebene zur Verteilerebene) an der Haltestelle Essen Berliner Platz ist ausser Betrieb.", + "content" : "Vom 29.12. 07:46 Uhr bis voraussichtlich 21.09. 23:59 Uhr.", + "subject" : "", + "speechText" : "" + }, + "paramList" : [ + { + "type" : "addInfoParam", + "name" : "infoType", + "edit" : "0", + "value" : "stopInfo" + }, + { + "type" : "system", + "name" : "infoID", + "edit" : "0", + "value" : "20240514915345" + }, + { + "type" : "system", + "name" : "seqID", + "edit" : "0", + "value" : "150" + }, + { + "name" : "incidentDateTime", + "type" : "system", + "value" : "29/12/2023 07:46 - 22/09/2024 00:00", + "edit" : "0" + } + ], + "infoLinkText" : "Haltestelle Essen Berliner Platz: Die Fahrtreppe ist nicht verfügbar. (Eingang D (abwaerts) von Strassenebene zur Verteilerebene)", + "infoLinkURL" : "http://217.70.161.100:80/cm/XSLT_CM_SHOWADDINFO_REQUEST?infoID=20240514915345&seqID=150" + }, + { + "paramList" : [ + { + "name" : "infoType", + "type" : "addInfoParam", + "edit" : "0", + "value" : "stopInfo" + }, + { + "type" : "system", + "name" : "infoID", + "edit" : "0", + "value" : "20240514915357" + }, + { + "value" : "132", + "edit" : "0", + "name" : "seqID", + "type" : "system" + }, + { + "edit" : "0", + "value" : "13/02/2024 08:13 - 22/09/2024 00:00", + "type" : "system", + "name" : "incidentDateTime" + } + ], + "infoText" : { + "content" : "Vom 13.02. 08:13 Uhr bis voraussichtlich 21.09. 23:59 Uhr.", + "subject" : "", + "speechText" : "", + "smsText" : "Die Fahrtreppe (Verteilerebene (abwärts) zum Bahnsteig -2 Ebene) an der Haltestelle Essen Berliner Platz ist ausser Betrieb.", + "htmlText" : "", + "additionalText" : "Die beschriebenen Änderungen sind in der elektronischen Fahrplanauskunft (EFA) nicht berücksichtigt.", + "subtitle" : "Haltestelle Essen Berliner Platz: Die Fahrtreppe ist nicht verfügbar. (Verteilerebene (abwaerts) zum Bahnsteig -2 Ebene)", + "wmlText" : "Die Fahrtreppe (Verteilerebene (abwärts) zum Bahnsteig -2 Ebene) an der Haltestelle Essen Berliner Platz ist ausser Betrieb." + }, + "infoLinkURL" : "http://217.70.161.100:80/cm/XSLT_CM_SHOWADDINFO_REQUEST?infoID=20240514915357&seqID=132", + "infoLinkText" : "Haltestelle Essen Berliner Platz: Die Fahrtreppe ist nicht verfügbar. (Verteilerebene (abwaerts) zum Bahnsteig -2 Ebene)" + } + ], + "tariffArea" : "", + "ref" : { + "id" : "20009153", + "place" : "Essen", + "gid" : "de:05113:9153", + "coords" : "779595.00000,5297077.00000", + "placeID" : "18", + "omc" : "5113000" + }, + "tariffLayer1" : "", + "type" : "stop", + "name" : "Essen, Berliner Platz", + "tariffLayer2" : "", + "tariffAreaName" : "", + "usage" : "dm" + } + }, + "input" : { + "input" : "Berliner Platz" + } + }, + "servingLines" : { + "lines" : [ + { + "mode" : { + "diva" : { + "isSTT" : "1", + "isROP" : "1", + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-U", + "project" : "j24", + "branch" : "10", + "stateless" : "eva:10U11: :H:j24", + "operator" : "EVAG U-Bahn", + "network" : "eva", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-10-U11:", + "supplement" : " ", + "attrs" : [], + "opCode" : "10", + "line" : "10U11", + "vTo" : "20250228", + "tripCode" : "0" + }, + "product" : "U-Bahn", + "type" : "2", + "destID" : "20009270", + "name" : "U-Bahn U11", + "code" : "1", + "number" : "U11", + "productId" : "0", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Messe W.-Süd/Gruga", + "desc" : "GE-Buerer Str. - E-Karnap - Altenessen - Essen Hbf - Rüttenscheid - Messe/Gruga" + }, + "index" : "2:0" + }, + { + "mode" : { + "productId" : "0", + "number" : "U11", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Gelsenkirchen Buerer Str.", + "desc" : "Messe/Gruga - Rüttenscheid - Essen Hbf - Altenessen - E-Karnap - GE-Buerer Str.", + "diva" : { + "vTo" : "20250228", + "tripCode" : "0", + "opCode" : "10", + "attrs" : [], + "line" : "10U11", + "globalId" : "de:vrr:eva-10-U11:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "10", + "project" : "j24", + "operator" : "EVAG U-Bahn", + "network" : "eva", + "stateless" : "eva:10U11: :R:j24", + "opPublicCode" : "EV-U", + "dir" : "R", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1" + }, + "product" : "U-Bahn", + "type" : "2", + "destID" : "20005579", + "name" : "U-Bahn U11", + "code" : "1" + }, + "index" : "2:1" + }, + { + "mode" : { + "product" : "U-Bahn", + "diva" : { + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-U", + "isSTT" : "1", + "isROP" : "1", + "opCode" : "10", + "attrs" : [], + "line" : "10U17", + "vTo" : "20250228", + "tripCode" : "0", + "branch" : "10", + "project" : "j24", + "network" : "eva", + "operator" : "EVAG U-Bahn", + "stateless" : "eva:10U17: :H:j24", + "globalId" : "de:vrr:eva-10-U17:", + "lineDisplay" : "line", + "supplement" : " " + }, + "name" : "U-Bahn U17", + "destID" : "20009447", + "code" : "1", + "type" : "2", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "U17", + "productId" : "0", + "desc" : "Altenessen - Essen Hbf - Holsterhausen - Margarethenhöhe", + "destination" : "Essen Margarethenhöhe" + }, + "index" : "2:2" + }, + { + "mode" : { + "product" : "U-Bahn", + "diva" : { + "dir" : "R", + "opPublicCode" : "EV-U", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1", + "vTo" : "20250228", + "tripCode" : "0", + "opCode" : "10", + "attrs" : [], + "line" : "10U17", + "globalId" : "de:vrr:eva-10-U17:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "10", + "project" : "j24", + "operator" : "EVAG U-Bahn", + "network" : "eva", + "stateless" : "eva:10U17: :R:j24" + }, + "code" : "1", + "destID" : "20009370", + "name" : "U-Bahn U17", + "type" : "2", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "U17", + "productId" : "0", + "desc" : "Margarethenhöhe - Holsterhausen - Essen Hbf - Altenessen", + "destination" : "Essen Karlsplatz" + }, + "index" : "2:3" + }, + { + "index" : "2:4", + "mode" : { + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "productId" : "0", + "number" : "U18", + "desc" : "E-Berliner Platz - Essen Hbf - MH-Rhein-Ruhr-Zentrum - Mülheim Hbf", + "destination" : "Mülheim Hauptbahnhof", + "product" : "U-Bahn", + "diva" : { + "isSTT" : "1", + "isROP" : "1", + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-U", + "project" : "j24", + "branch" : "10", + "stateless" : "eva:10U18: :H:j24", + "network" : "eva", + "operator" : "EVAG U-Bahn", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-10-U18:", + "supplement" : " ", + "attrs" : [], + "opCode" : "10", + "line" : "10U18", + "tripCode" : "0", + "vTo" : "20250228" + }, + "name" : "U-Bahn U18", + "destID" : "20015225", + "code" : "1", + "type" : "2" + } + }, + { + "index" : "2:5", + "mode" : { + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "productId" : "0", + "number" : "U18", + "desc" : "Berliner Platz - Essen Hbf - MH-Rhein-Ruhr-Zentrum - Mülheim Hbf", + "destination" : "Mülheim Hauptbahnhof", + "product" : "U-Bahn", + "diva" : { + "branch" : "13", + "project" : "j24", + "operator" : "Ruhrbahn Mülheim", + "network" : "btm", + "stateless" : "btm:13U18: :H:j24", + "globalId" : "de:vrr:btm-13-U18:", + "lineDisplay" : "line", + "supplement" : " ", + "opCode" : "13", + "attrs" : [], + "line" : "13U18", + "vTo" : "20250228", + "tripCode" : "0", + "vF" : "20240601", + "dir" : "H" + }, + "destID" : "20015225", + "name" : "U-Bahn U18", + "code" : "1", + "type" : "2" + } + }, + { + "index" : "4:0", + "mode" : { + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "101", + "productId" : "1", + "desc" : "Borbeck - Helenenstr. - Essen Hbf Rüttenscheid - Helenenstr.", + "destination" : "Essen Helenenstr.", + "product" : "Straßenbahn", + "diva" : { + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-T", + "isSTT" : "1", + "isROP" : "1", + "opCode" : "11", + "attrs" : [], + "line" : "11101", + "vTo" : "20250228", + "tripCode" : "0", + "branch" : "11", + "project" : "j24", + "operator" : "EVAG Strab", + "network" : "eva", + "stateless" : "eva:11101: :H:j24", + "globalId" : "de:vrr:eva-11-101:", + "lineDisplay" : "line", + "supplement" : " " + }, + "name" : "Straßenbahn 101", + "destID" : "20009306", + "code" : "4", + "type" : "4" + } + }, + { + "index" : "4:1", + "mode" : { + "product" : "Straßenbahn", + "diva" : { + "network" : "eva", + "operator" : "EVAG Strab", + "stateless" : "eva:11103: :H:j24", + "branch" : "11", + "project" : "j24", + "supplement" : " ", + "globalId" : "de:vrr:eva-11-103:", + "lineDisplay" : "line", + "line" : "11103", + "opCode" : "11", + "attrs" : [], + "tripCode" : "0", + "vTo" : "20250228", + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-T" + }, + "code" : "4", + "destID" : "20009582", + "name" : "Straßenbahn 103", + "type" : "4", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "productId" : "1", + "number" : "103", + "desc" : "Dellwig - Borbeck - Altendorf - Rathaus Essen - Essen Hbf - Steele", + "destination" : "Essen Steele S" + } + }, + { + "mode" : { + "diva" : { + "vTo" : "20250228", + "tripCode" : "0", + "attrs" : [], + "opCode" : "11", + "line" : "11103", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-11-103:", + "supplement" : " ", + "project" : "j24", + "branch" : "11", + "stateless" : "eva:11103: :R:j24", + "operator" : "EVAG Strab", + "network" : "eva", + "opPublicCode" : "EV-T", + "dir" : "R", + "vF" : "20240601" + }, + "product" : "Straßenbahn", + "type" : "4", + "destID" : "20009641", + "code" : "4", + "name" : "Straßenbahn 103", + "number" : "103", + "productId" : "1", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Wertstr.", + "desc" : "Steele - Essen Hbf - Rathaus Essen - Altendorf - Borbeck - Dellwig" + }, + "index" : "4:2" + }, + { + "mode" : { + "product" : "Straßenbahn", + "diva" : { + "supplement" : " ", + "globalId" : "de:vrr:eva-11-105:", + "lineDisplay" : "line", + "operator" : "EVAG Strab", + "network" : "eva", + "stateless" : "eva:11105: :H:j24", + "branch" : "11", + "project" : "j24", + "vTo" : "20250228", + "tripCode" : "0", + "line" : "11105", + "opCode" : "11", + "attrs" : [], + "isROP" : "1", + "isSTT" : "1", + "dir" : "H", + "opPublicCode" : "EV-T", + "vF" : "20240601" + }, + "name" : "Straßenbahn 105", + "destID" : "20009665", + "code" : "4", + "type" : "4", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "productId" : "1", + "number" : "105", + "desc" : "Frintrop - Altendorf - Essen Hbf - Bergerhausen - Rellinghausen", + "destination" : "Essen Zeche Ludwig" + }, + "index" : "4:3" + }, + { + "mode" : { + "product" : "Straßenbahn", + "diva" : { + "vTo" : "20250228", + "tripCode" : "0", + "opCode" : "11", + "attrs" : [], + "line" : "11105", + "globalId" : "de:vrr:eva-11-105:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "11", + "project" : "j24", + "operator" : "EVAG Strab", + "network" : "eva", + "stateless" : "eva:11105: :R:j24", + "dir" : "R", + "opPublicCode" : "EV-T", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1" + }, + "destID" : "20009614", + "name" : "Straßenbahn 105", + "code" : "4", + "type" : "4", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "105", + "productId" : "1", + "desc" : "Rellinghausen - Bergerhausen - Essen Hbf - Altendorf - Frintrop", + "destination" : "Essen Unterstr." + }, + "index" : "4:4" + }, + { + "mode" : { + "desc" : "Helenenstr. - Rüttenscheid - Essen Hbf - Helenenstr. - Borbeck", + "destination" : "Essen Germaniaplatz", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "106", + "productId" : "1", + "destID" : "20009254", + "name" : "Straßenbahn 106", + "code" : "4", + "type" : "4", + "product" : "Straßenbahn", + "diva" : { + "isSTT" : "1", + "isROP" : "1", + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-T", + "project" : "j24", + "branch" : "11", + "stateless" : "eva:11106: :H:j24", + "operator" : "EVAG Strab", + "network" : "eva", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-11-106:", + "supplement" : " ", + "attrs" : [], + "opCode" : "11", + "line" : "11106", + "tripCode" : "0", + "vTo" : "20250228" + } + }, + "index" : "4:5" + }, + { + "mode" : { + "product" : "Straßenbahn", + "diva" : { + "network" : "eva", + "operator" : "EVAG Strab", + "stateless" : "eva:11109: :H:j24", + "branch" : "11", + "project" : "j24", + "supplement" : " ", + "globalId" : "de:vrr:eva-11-109:", + "lineDisplay" : "line", + "line" : "11109", + "opCode" : "11", + "attrs" : [], + "vTo" : "20250228", + "tripCode" : "0", + "isSTT" : "1", + "isROP" : "1", + "vF" : "20240601", + "opPublicCode" : "EV-T", + "dir" : "H" + }, + "destID" : "20009582", + "code" : "4", + "name" : "Straßenbahn 109", + "type" : "4", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "109", + "productId" : "1", + "desc" : "Frohnhausen - Holsterhausen - Rathaus Essen - Steele", + "destination" : "Essen Steele S" + }, + "index" : "4:6" + }, + { + "mode" : { + "desc" : "Steele - Rathaus Essen - Holsterhausen - Frohnhausen", + "destination" : "Frohnhausen Breilsort", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "109", + "productId" : "1", + "name" : "Straßenbahn 109", + "destID" : "20009243", + "code" : "4", + "type" : "4", + "product" : "Straßenbahn", + "diva" : { + "opCode" : "11", + "attrs" : [], + "line" : "11109", + "tripCode" : "0", + "vTo" : "20250228", + "branch" : "11", + "project" : "j24", + "operator" : "EVAG Strab", + "network" : "eva", + "stateless" : "eva:11109: :R:j24", + "globalId" : "de:vrr:eva-11-109:", + "lineDisplay" : "line", + "supplement" : " ", + "vF" : "20240601", + "opPublicCode" : "EV-T", + "dir" : "R", + "isSTT" : "1", + "isROP" : "1" + } + }, + "index" : "4:7" + }, + { + "index" : "5:0", + "mode" : { + "diva" : { + "isROP" : "1", + "isSTT" : "1", + "dir" : "H", + "opPublicCode" : "EV-B", + "vF" : "20240601", + "globalId" : "de:vrr:eva-12-145:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "12", + "project" : "j24", + "network" : "eva", + "operator" : "EVAG Bus", + "stateless" : "eva:12145: :H:j24", + "vTo" : "20250228", + "tripCode" : "0", + "opCode" : "12", + "attrs" : [], + "line" : "12145" + }, + "product" : "Niederflurbus", + "type" : "5", + "name" : "Niederflurbus 145", + "destID" : "20009302", + "code" : "5", + "productId" : "13", + "number" : "145", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Heisingen Baldeneysee", + "desc" : "Haarzopf - Essen Hbf - Stadtwald - Heisingen" + } + }, + { + "mode" : { + "code" : "5", + "destID" : "20009222", + "name" : "Niederflurbus 145", + "type" : "5", + "product" : "Niederflurbus", + "diva" : { + "isROP" : "1", + "isSTT" : "1", + "opPublicCode" : "EV-B", + "dir" : "R", + "vF" : "20240601", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-145:", + "supplement" : " ", + "project" : "j24", + "branch" : "12", + "stateless" : "eva:12145: :R:j24", + "operator" : "EVAG Bus", + "network" : "eva", + "vTo" : "20250228", + "tripCode" : "0", + "attrs" : [], + "opCode" : "12", + "line" : "12145" + }, + "desc" : "Heisingen - Stadtwald - Essen Hbf - Haarzopf", + "destination" : "Essen Erbach", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "145", + "productId" : "13" + }, + "index" : "5:1" + }, + { + "mode" : { + "productId" : "13", + "number" : "166", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "E-Burgaltendorf Burgruine", + "desc" : "Dellwig - Essen Hbf - Steele - E-Burgaltendorf - HAT-Niederwenigern", + "diva" : { + "globalId" : "de:vrr:eva-12-166:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "12", + "project" : "j24", + "network" : "eva", + "operator" : "EVAG Bus", + "stateless" : "eva:12166: :H:j24", + "tripCode" : "0", + "vTo" : "20250228", + "opCode" : "12", + "attrs" : [], + "line" : "12166", + "isROP" : "1", + "isSTT" : "1", + "dir" : "H", + "opPublicCode" : "EV-B", + "vF" : "20240601" + }, + "product" : "Niederflurbus", + "type" : "5", + "destID" : "20009182", + "name" : "Niederflurbus 166", + "code" : "5" + }, + "index" : "5:2" + }, + { + "mode" : { + "number" : "166", + "productId" : "13", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Dellwig Bahnhof", + "desc" : "HAT-Niederwenigern - E-Burgaltendorf - Steele - Essen Hbf - Dellwig", + "diva" : { + "dir" : "R", + "opPublicCode" : "EV-B", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1", + "vTo" : "20250228", + "tripCode" : "0", + "attrs" : [], + "opCode" : "12", + "line" : "12166", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-166:", + "supplement" : " ", + "project" : "j24", + "branch" : "12", + "stateless" : "eva:12166: :R:j24", + "operator" : "EVAG Bus", + "network" : "eva" + }, + "product" : "Niederflurbus", + "type" : "5", + "destID" : "20009197", + "code" : "5", + "name" : "Niederflurbus 166" + }, + "index" : "5:3" + }, + { + "mode" : { + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "productId" : "13", + "number" : "NE10", + "desc" : "Essen Hbf - Frohnhausen - Haarzopf", + "destination" : "Essen Erbach", + "product" : "Niederflurbus", + "diva" : { + "line" : "12M10", + "opCode" : "12", + "attrs" : [], + "vTo" : "20250228", + "tripCode" : "0", + "network" : "eva", + "operator" : "EVAG Bus", + "stateless" : "eva:12M10: :H:j24", + "branch" : "12", + "project" : "j24", + "supplement" : " ", + "globalId" : "de:vrr:eva-12-M10:", + "lineDisplay" : "line", + "vF" : "20240601", + "dir" : "H", + "opPublicCode" : "EV-B", + "isSTT" : "1", + "isROP" : "1" + }, + "name" : "Niederflurbus NE10", + "destID" : "20009222", + "code" : "5", + "type" : "5" + }, + "index" : "5:4" + }, + { + "index" : "5:5", + "mode" : { + "type" : "5", + "code" : "5", + "destID" : "20009289", + "name" : "Niederflurbus NE10", + "diva" : { + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-M10:", + "supplement" : " ", + "project" : "j24", + "branch" : "12", + "stateless" : "eva:12M10: :R:j24", + "operator" : "EVAG Bus", + "network" : "eva", + "vTo" : "20250228", + "tripCode" : "0", + "attrs" : [], + "opCode" : "12", + "line" : "12M10", + "isROP" : "1", + "isSTT" : "1", + "opPublicCode" : "EV-B", + "dir" : "R", + "vF" : "20240601" + }, + "product" : "Niederflurbus", + "destination" : "Essen Hauptbahnhof", + "desc" : "Haarzopf - Frohnhausen - Essen Hbf", + "number" : "NE10", + "productId" : "13", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)" + } + }, + { + "index" : "5:6", + "mode" : { + "code" : "5", + "destID" : "20014022", + "name" : "Niederflurbus NE11", + "type" : "5", + "product" : "Niederflurbus", + "diva" : { + "vTo" : "20250228", + "tripCode" : "0", + "line" : "12M11", + "attrs" : [], + "opCode" : "12", + "supplement" : " ", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-M11:", + "stateless" : "eva:12M11: :H:j24", + "operator" : "EVAG Bus", + "network" : "eva", + "project" : "j24", + "branch" : "12", + "dir" : "H", + "opPublicCode" : "EV-B", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1" + }, + "desc" : "Essen Hbf - Altendorf - Essen Frintrop - Oberhausen", + "destination" : "Oberhausen Hbf", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "NE11", + "productId" : "13" + } + }, + { + "index" : "5:7", + "mode" : { + "type" : "5", + "destID" : "20009289", + "code" : "5", + "name" : "Niederflurbus NE11", + "diva" : { + "vF" : "20240601", + "dir" : "R", + "opPublicCode" : "EV-B", + "isSTT" : "1", + "isROP" : "1", + "line" : "12M11", + "attrs" : [], + "opCode" : "12", + "tripCode" : "0", + "vTo" : "20250228", + "stateless" : "eva:12M11: :R:j24", + "network" : "eva", + "operator" : "EVAG Bus", + "project" : "j24", + "branch" : "12", + "supplement" : " ", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-M11:" + }, + "product" : "Niederflurbus", + "destination" : "Essen Hauptbahnhof", + "desc" : "Oberhausen - Essen Frintrop - Altendorf - Essen Hbf", + "productId" : "13", + "number" : "NE11", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)" + } + }, + { + "index" : "5:8", + "mode" : { + "productId" : "13", + "number" : "NE12", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Borbeck Bf", + "desc" : "Essen Hbf - Altendorf - Bergeborbeck - Dellwig - Borbeck", + "diva" : { + "isROP" : "1", + "isSTT" : "1", + "dir" : "H", + "opPublicCode" : "EV-B", + "vF" : "20240601", + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-M12:", + "supplement" : " ", + "project" : "j24", + "branch" : "12", + "stateless" : "eva:12M12: :H:j24", + "network" : "eva", + "operator" : "EVAG Bus", + "tripCode" : "0", + "vTo" : "20250228", + "attrs" : [], + "opCode" : "12", + "line" : "12M12" + }, + "product" : "Niederflurbus", + "type" : "5", + "name" : "Niederflurbus NE12", + "destID" : "20009158", + "code" : "5" + } + }, + { + "index" : "5:9", + "mode" : { + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "NE12", + "productId" : "13", + "desc" : "Borbeck - Dellwig - Bergeborbeck - Altendorf - Essen Hbf", + "destination" : "Essen Hauptbahnhof", + "product" : "Niederflurbus", + "diva" : { + "operator" : "EVAG Bus", + "network" : "eva", + "stateless" : "eva:12M12: :R:j24", + "branch" : "12", + "project" : "j24", + "supplement" : " ", + "globalId" : "de:vrr:eva-12-M12:", + "lineDisplay" : "line", + "line" : "12M12", + "opCode" : "12", + "attrs" : [], + "tripCode" : "0", + "vTo" : "20250228", + "isSTT" : "1", + "isROP" : "1", + "vF" : "20240601", + "opPublicCode" : "EV-B", + "dir" : "R" + }, + "destID" : "20009289", + "code" : "5", + "name" : "Niederflurbus NE12", + "type" : "5" + } + }, + { + "index" : "5:10", + "mode" : { + "destination" : "BOT ZOB Berliner Platz", + "desc" : "Essen Hbf - Bergeborbeck - Essen Dellwig - Bottrop", + "productId" : "13", + "number" : "NE16", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "type" : "5", + "destID" : "20003267", + "name" : "Niederflurbus NE16", + "code" : "5", + "diva" : { + "lineDisplay" : "line", + "globalId" : "de:vrr:eva-12-M16:", + "supplement" : " ", + "project" : "j24", + "branch" : "12", + "stateless" : "eva:12M16: :H:j24", + "network" : "eva", + "operator" : "EVAG Bus", + "tripCode" : "0", + "vTo" : "20250228", + "attrs" : [], + "opCode" : "12", + "line" : "12M16", + "isROP" : "1", + "isSTT" : "1", + "dir" : "H", + "opPublicCode" : "EV-B", + "vF" : "20240601" + }, + "product" : "Niederflurbus" + } + }, + { + "index" : "5:11", + "mode" : { + "number" : "NE16", + "productId" : "13", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "destination" : "Essen Hauptbahnhof", + "desc" : "Bottrop - Essen Dellwig - Bergeborbeck - Essen Hbf", + "diva" : { + "dir" : "R", + "opPublicCode" : "EV-B", + "vF" : "20240601", + "isROP" : "1", + "isSTT" : "1", + "vTo" : "20250228", + "tripCode" : "0", + "opCode" : "12", + "attrs" : [], + "line" : "12M16", + "globalId" : "de:vrr:eva-12-M16:", + "lineDisplay" : "line", + "supplement" : " ", + "branch" : "12", + "project" : "j24", + "network" : "eva", + "operator" : "EVAG Bus", + "stateless" : "eva:12M16: :R:j24" + }, + "product" : "Niederflurbus", + "type" : "5", + "code" : "5", + "destID" : "20009289", + "name" : "Niederflurbus NE16" + } + }, + { + "mode" : { + "destination" : "BOT St.-Anto.-Hosp./Gartenstr.", + "desc" : "Essen Hbf - Universität - BOT-Hbf - ZOB Berliner Platz - Grafenwald - Kirchhellen St.-Antonius-Hospital/Gartenstr.", + "number" : "SB16", + "productId" : "13", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "type" : "5", + "destID" : "20003174", + "code" : "5", + "name" : "Niederflurbus SB16", + "diva" : { + "opPublicCode" : "VEST", + "dir" : "H", + "vF" : "20240601", + "lineDisplay" : "line", + "globalId" : "de:vrr:SB16:VES-40-16", + "supplement" : " ", + "project" : "j24", + "branch" : "40", + "stateless" : "ves:40016: :H:j24", + "network" : "ves", + "operator" : "Vestische", + "tripCode" : "0", + "vTo" : "20250228", + "attrs" : [], + "opCode" : "40", + "line" : "40016" + }, + "product" : "Niederflurbus" + }, + "index" : "5:12" + }, + { + "index" : "5:13", + "mode" : { + "product" : "Niederflurbus", + "diva" : { + "vF" : "20240601", + "opPublicCode" : "VEST", + "dir" : "R", + "line" : "40016", + "opCode" : "40", + "attrs" : [], + "vTo" : "20250228", + "tripCode" : "0", + "network" : "ves", + "operator" : "Vestische", + "stateless" : "ves:40016: :R:j24", + "branch" : "40", + "project" : "j24", + "supplement" : " ", + "globalId" : "de:vrr:SB16:VES-40-16", + "lineDisplay" : "line" + }, + "destID" : "20009289", + "name" : "Niederflurbus SB16", + "code" : "5", + "type" : "5", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "SB16", + "productId" : "13", + "desc" : "BOT-Kirchhellen St..-Antonius-Hospital/ Gartenstr. - Grafenwald - ZOB Berliner Platz - BOT-Hbf - Essen Universität - Hbf", + "destination" : "Essen Hauptbahnhof" + } + }, + { + "index" : "7:0", + "mode" : { + "type" : "7", + "name" : "SB SB16", + "destID" : "20003174", + "code" : "5", + "diva" : { + "tripCode" : "0", + "vTo" : "20250228", + "attrs" : [], + "opCode" : "88", + "line" : "88016", + "lineDisplay" : "line", + "globalId" : "de:vrr:bvr-88-16:K", + "supplement" : "K", + "project" : "j24", + "branch" : "88", + "stateless" : "bvr:88016:K:H:j24", + "network" : "bvr", + "operator" : "DB Bahn Rheinlandbus", + "dir" : "H", + "opPublicCode" : "BVR", + "vF" : "20240601" + }, + "product" : "SB", + "destination" : "BOT St.-Anto.-Hosp./Gartenstr.", + "desc" : "Essen Hbf - Dorsten ZOB Dorsten", + "number" : "SB16", + "productId" : "3", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)" + } + }, + { + "index" : "7:1", + "mode" : { + "product" : "SB", + "diva" : { + "vF" : "20240601", + "dir" : "R", + "opPublicCode" : "BVR", + "branch" : "88", + "project" : "j24", + "network" : "bvr", + "operator" : "DB Bahn Rheinlandbus", + "stateless" : "bvr:88016:K:R:j24", + "globalId" : "de:vrr:bvr-88-16:K", + "lineDisplay" : "line", + "supplement" : "K", + "opCode" : "88", + "attrs" : [], + "line" : "88016", + "tripCode" : "0", + "vTo" : "20250228" + }, + "name" : "SB SB16", + "destID" : "20009289", + "code" : "5", + "type" : "7", + "timetablePeriod" : "Jahresfahrplan 2024 (08.01.2024 - 06.01.2025)", + "number" : "SB16", + "productId" : "3", + "desc" : "Dorsten ZOB Dorsten - Essen Hbf", + "destination" : "Essen Hauptbahnhof" + } + } + ] + }, + "option" : { + "ptOption" : { + "maxTime" : "360", + "routeType" : "LEASTTIME", + "activeSec" : "-1", + "maxChanges" : "9", + "overgroundTransfer" : "0", + "lowPlatformVhcl" : "0", + "noEscalators" : "0", + "activeImp" : "-1", + "plane" : "0", + "wheelchair" : "0", + "noElevators" : "0", + "bike" : "0", + "noInsecurePlaces" : "0", + "useProxFootSearchDestination" : "0", + "noLonelyTransfer" : "0", + "noSolidStairs" : "0", + "privateTransport" : "0", + "illumTransfer" : "0", + "SOSAvail" : "0", + "useProxFootSearch" : "0", + "needElevatedPlt" : "0", + "maxWait" : "120", + "useProxFootSearchOrigin" : "0", + "changeSpeed" : "normal", + "lineRestriction" : "403", + "active" : "-1", + "activeCom" : "-1", + "excludedMeans" : [ + { + "value" : "0", + "selected" : "0" + }, + { + "value" : "1", + "selected" : "0" + }, + { + "value" : "2", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "3" + }, + { + "value" : "4", + "selected" : "0" + }, + { + "value" : "5", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "6" + }, + { + "value" : "7", + "selected" : "0" + }, + { + "value" : "8", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "9" + }, + { + "selected" : "0", + "value" : "10" + }, + { + "selected" : "0", + "value" : "11" + }, + { + "selected" : "0", + "value" : "12" + }, + { + "selected" : "0", + "value" : "13" + }, + { + "selected" : "0", + "value" : "14" + }, + { + "selected" : "0", + "value" : "15" + }, + { + "selected" : "0", + "value" : "16" + }, + { + "value" : "17", + "selected" : "0" + }, + { + "selected" : "0", + "value" : "18" + }, + { + "value" : "19", + "selected" : "0" + } + ], + "assistance" : "0", + "noCrowded" : "0" + } + } +} diff --git a/t/in/essen_hb.xml b/t/in/essen_hb.xml deleted file mode 100644 index cb25c3d..0000000 --- a/t/in/essen_hb.xml +++ /dev/null @@ -1,1034 +0,0 @@ - - - - - - - - - - - - - - Essen - E - - - Hauptbahnhof - Hbf - - - - - - - - - - - - - - - - - - - - - - - - - - - Zug - S-Bahn - U-Bahn - Stadtbahn - Straßen-/Trambahn - Stadtbus - Regionalbus - Schnellbus - Seil-/Zahnradbahn - Schiff - AST/Rufbus - Sonstige - - - - - - - - - - - - - - - - - - - - - - - - Solingen Hbf - Düsseldorf Hbf - Dortmund Hbf - - 00 - Daten DB AG - - - - - - Dortmund Hbf - Düsseldorf Hbf - Solingen Hbf - - 00 - Daten DB AG - - - - - - Duisburg Hbf / Essen Hbf - Gelsenkirchen Hbf / Recklinghausen Hbf - Dortmund Hbf - - 00 - Daten DB AG - - - - - - Oberhausen Hbf - Hattingen (Ruhr) Mitte - - 00 - Daten DB AG - - - - - - Hattingen (Ruhr) Mitte - Oberhausen Hbf - - 00 - Daten DB AG - - - - - - Essen Hbf - Düsseldorf Hbf - Köln-Nippes - - 00 - Daten DB AG - - - - - - Wuppertal Hbf - Essen Hbf - Haltern am See - - 00 - Daten DB AG - - - - - - Haltern am See - Essen Hbf - Wuppertal Hbf - - 00 - Daten DB AG - - - - - - GE-Buerer Str. - E-Karnap - Altenessen - Essen Hbf - Rüttenscheid - Messe Gruga - - 10 - EVAG U-Bahn - - - - - - Messe Gruga - Rüttenscheid - Essen Hbf - Altenessen - E-Karnap - GE-Buerer Str. - - 10 - EVAG U-Bahn - - - - - - Berliner Platz - Essen Hbf - MH-Rhein-Ruhr-Zentrum - Heißen Kirche - - 10 - EVAG U-Bahn - - - - - - Heißen Kirche - MH-Rhein-Ruhr-Zentrum - Essen Hbf - Berliner Platz - - 10 - EVAG U-Bahn - - - - - - Altenessen - Essen Hbf - Holsterhausen - Margarethenhöhe - - 10 - EVAG U-Bahn - - - - - - Margarethenhöhe - Holsterhausen - Essen Hbf - Altenessen - - 10 - EVAG U-Bahn - - - - - - Borbeck - Bergeborbeck - Essen Hbf - Bredeney - - 11 - EVAG Strab - - - - - - - 11 - EVAG Strab - - - - - - Steele - Essen Hbf - Rathaus Essen - Altendorf - Borbeck - Dellwig - - 11 - EVAG Strab - - - - - - Frintrop - Altendorf - Essen Hbf - Bergerhausen - Rellinghausen - - 11 - EVAG Strab - - - - - - Rellinghausen - Bergerhausen - Essen Hbf - Altendorf - Frintrop - - 11 - EVAG Strab - - - - - - Altenessen - Essen Hbf - Rüttenscheid - Helenenstr. - Bergeborbeck - - 11 - EVAG Strab - - - - - - Bergeborbeck - Helenenstr. - Rüttenscheid - Essen Hbf - Altenessen - - 11 - EVAG Strab - - - - - - GE-Hauptbahnhof - Essen Katernberg - Zollverein - Essen Hbf - Bredeney - - 11 - EVAG Strab - - - - - - Bredeney - Essen Hbf - Zollverein - Essen Katernberg - GE-Hauptbahnhof - - 11 - EVAG Strab - - - - - - Mülheim Flughafen - Essen Haarzopf - Essen Hbf - Stadtwald - Heisingen - - 12 - EVAG Bus - - - - - - Heisingen - Stadtwald - Essen Hbf - Essen Haarzopf - Mülheim Flughafen - - 12 - EVAG Bus - - - - - - Leithe - Kray - Essen Hbf - Heisingen - - 12 - EVAG Bus - - - - - - Heisingen - Essen Hbf - Kray - Leithe - - 12 - EVAG Bus - - - - - - Beisen - E-Hbf - Bergerhausen - - 12 - EVAG Bus - - - - - - Bergerhausen - E-Hbf - Beisen - - 12 - EVAG Bus - - - - - - GE-Rotths. - E-Hbf - Kupferdreh - - 12 - EVAG Bus - - - - - - Kupferdreh - E-Hbf - GE-Rotths. - - 12 - EVAG Bus - - - - - - Dellwig - Essen Hbf - Steele - E-Burgaltendorf - HAT-Niederwenigern - - 12 - EVAG Bus - - - - - - HAT-Niederwenigern - E-Burgaltendorf - Steele - Essen Hbf - Dellwig - - 12 - EVAG Bus - - - - - - Essen Hbf - Versorgungsamt - - 12 - EVAG Bus - - - - - - Vogelheim - Bergeborbeck - Essen Hbf - Essen West - - 12 - EVAG Bus - - - - - - Essen West - Essen Hbf - Bergeborbeck - Vogelheim - - 12 - EVAG Bus - - - - - - Essen Hbf - Altenessen - Essen Karnap - Gelsenkirchen - - 12 - EVAG Bus - - - - - - Essen Hbf - Katernberg - - 12 - EVAG Bus - - - - - - Essen Hbf - Schonnebeck - Kray - Leithe - - 12 - EVAG Bus - - - - - - Essen Hbf - Frillendorf - Steele - Überruhr - Burgaltendorf - - 12 - EVAG Bus - - - - - - Essen Hbf - Huttrop - Steele - Hörsterfeld - - 12 - EVAG Bus - - - - - - Essen Hbf - Rellinghausen - Überruhr - Kupferdreh - - 12 - EVAG Bus - - - - - - Essen Hbf - Stadtwald - Heisingen - - 12 - EVAG Bus - - - - - - Essen Hbf - Bredeney - Essen Werden - Velbert - - 12 - EVAG Bus - - - - - - Essen Hbf - Holsterhausen - Margarethenhöhe - Haarzopf - - 12 - EVAG Bus - - - - - - Essen Hbf - Frohnhausen - Haarzopf - - 12 - EVAG Bus - - - - - - Essen Hbf - Altendorf - Essen Frintrop - Oberhausen - - 12 - EVAG Bus - - - - - - Essen Hbf - Altendorf - Bergeborbeck - Dellwig - Borbeck - - 12 - EVAG Bus - - - - - - Essen Hbf - Rüttenscheid - Kettwig - - 12 - EVAG Bus - - - - - - Essen Hbf - Bergeborbeck - Essen Dellwig - Bottrop - - 12 - EVAG Bus - - - - - - Essen Hbf - Velbert - Heiligenhaus Rathaus - - 88 - Busverkehr Rheinland - - - - - - - 12 - EVAG Bus - - - - - - Essen Hbf - Überruhr - Burgaltendorf - - 12 - EVAG Bus - - - - - - Essen Hbf - BOT-Hbf - ZOB Berliner Platz - Kirchhellen - Movie Park /ZOB Dorsten - - 40 - Vestische - - - - - - - - - - - - - - - Bordrestaurant - - - - - lineType - HIGHSPEEDTRAIN - - - lineType - LONG_DISTANCE_TRAINS - - - lineType - SUPPLEMENT - - - - - - - - - - - weiter als Linie SB 66 nach Wuppertal Hbf - - - - - - - - - - - - - - - - - - - - Ab (H) Heißen Kirche, Umstieg in den SEV Ri. Mülheim Hbf. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - Ab (H) Heißen Kirche, Umstieg in den SEV Ri. Mülheim Hbf. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fahrradmitnahme begrenzt möglich - - - - - - - - - - - - - - - - - - - diff --git a/t/in/essen_hb_invalid.xml b/t/in/essen_hb_invalid.xml deleted file mode 100644 index de7d10a..0000000 --- a/t/in/essen_hb_invalid.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - Essen - E - - - stop invalid - Hbfoaei - Hbfoaei - - - - - - - - - - - - - - - - - - - - - - - - - - - Zug - S-Bahn - U-Bahn - Stadtbahn - Straßen-/Trambahn - Stadtbus - Regionalbus - Schnellbus - Seil-/Zahnradbahn - Schiff - AST/Rufbus - Sonstige - - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3