[deutschebahn] Initial contribution: New binding for DeutscheBahn Fahrplan (#11384)

* Created binding for DeutscheBahn Timetable API.

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Disabled schema validation and used original schema. Added tests for hannover hbf which has non schema conforming responses.

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Added information about UNDEF and NULL channel values.

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Added sample widget and screenshot

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Filtering duplicate messages

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Fixed some typos.

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Updated to jUnit5

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Applied review remarks in Readme

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* Applied some review remarks

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

* 0000: Fixed compile warnings

Signed-off-by: Sönke Küper <soenkekueper@gmx.de>

Co-authored-by: Sönke Küper <soenkekueper@gmx.de>
This commit is contained in:
Sönke Küper
2021-11-28 18:34:30 +01:00
committed by GitHub
parent 95e1479c5d
commit 50d5622e79
67 changed files with 11615 additions and 0 deletions

View File

@@ -0,0 +1,187 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.junit.jupiter.api.Test;
import org.openhab.binding.deutschebahn.internal.timetable.TimeproviderStub;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1ApiFactory;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1ApiStub;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1Impl.HttpCallable;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1ImplTestHelper;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Event;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Timetable;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TimetableStop;
import org.openhab.core.config.core.Configuration;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.Channel;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingUID;
import org.openhab.core.thing.binding.ThingHandlerCallback;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
/**
* Tests for {@link DeutscheBahnTimetableHandler}.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
public class DeutscheBahnTimetableHandlerTest implements TimetablesV1ImplTestHelper {
private static Configuration createConfig() {
final Configuration config = new Configuration();
config.put("accessToken", "letMeIn");
config.put("evaNo", "8000226");
config.put("trainFilter", "all");
return config;
}
private static Bridge mockBridge() {
final Bridge bridge = mock(Bridge.class);
when(bridge.getUID()).thenReturn(new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable"));
when(bridge.getConfiguration()).thenReturn(createConfig());
final List<Thing> things = new ArrayList<>();
things.add(DeutscheBahnTrainHandlerTest.mockThing(1));
things.add(DeutscheBahnTrainHandlerTest.mockThing(2));
things.add(DeutscheBahnTrainHandlerTest.mockThing(3));
when(things.get(0).getHandler()).thenReturn(mock(DeutscheBahnTrainHandler.class));
when(things.get(1).getHandler()).thenReturn(mock(DeutscheBahnTrainHandler.class));
when(things.get(2).getHandler()).thenReturn(mock(DeutscheBahnTrainHandler.class));
when(bridge.getThings()).thenReturn(things);
return bridge;
}
private DeutscheBahnTimetableHandler createAndInitHandler(final ThingHandlerCallback callback, final Bridge bridge)
throws Exception {
return createAndInitHandler(callback, bridge, createApiWithTestdata().getApiFactory());
}
private DeutscheBahnTimetableHandler createAndInitHandler( //
final ThingHandlerCallback callback, //
final Bridge bridge, //
final TimetablesV1ApiFactory apiFactory) throws Exception { //
final TimeproviderStub timeProvider = new TimeproviderStub();
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 30);
final DeutscheBahnTimetableHandler handler = new DeutscheBahnTimetableHandler(bridge, apiFactory, timeProvider);
handler.setCallback(callback);
handler.initialize();
return handler;
}
@Test
public void testUpdateChannels() throws Exception {
final Bridge bridge = mockBridge();
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge);
try {
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(bridge),
argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
verifyThingUpdated(bridge, 0, "-5296516961807204721-2108160906-5");
verifyThingUpdated(bridge, 1, "-8364795265993682073-2108160911-6");
verifyThingUpdated(bridge, 2, "-2949440726131702047-2108160858-10");
} finally {
handler.dispose();
}
}
private void verifyThingUpdated(final Bridge bridge, int offset, String stopId) {
final Thing train = bridge.getThings().get(offset);
final DeutscheBahnTrainHandler childHandler = (DeutscheBahnTrainHandler) train.getHandler();
verify(childHandler, timeout(1000))
.updateChannels(argThat((TimetableStop stop) -> stop.getId().equals(stopId)));
}
@Test
public void testUpdateTrainsToUndefinedIfNoDataWasProvided() throws Exception {
final Bridge bridge = mockBridge();
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
final TimetablesV1ApiStub stubWithError = TimetablesV1ApiStub.createWithException();
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge,
(String authToken, HttpCallable httpCallable) -> stubWithError);
try {
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(bridge),
argThat(arg -> arg.getStatus().equals(ThingStatus.OFFLINE)));
verifyChannelsUpdatedToUndef(bridge, 0, callback, UnDefType.UNDEF);
verifyChannelsUpdatedToUndef(bridge, 1, callback, UnDefType.UNDEF);
verifyChannelsUpdatedToUndef(bridge, 2, callback, UnDefType.UNDEF);
} finally {
handler.dispose();
}
}
private static void verifyChannelsUpdatedToUndef(Bridge bridge, int offset, ThingHandlerCallback callback,
State expectedState) {
final Thing thing = bridge.getThings().get(offset);
for (Channel channel : thing.getChannels()) {
verify(callback).stateUpdated(eq(channel.getUID()), eq(expectedState));
}
}
@Test
public void testUpdateTrainsToUndefinedIfNotEnoughDataWasProvided() throws Exception {
final Bridge bridge = mockBridge();
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
// Bridge contains 3 trains, but Timetable contains only 1 items, so two trains has to be updated to undef
// value.
final Timetable timetable = new Timetable();
TimetableStop stop01 = new TimetableStop();
stop01.setId("stop01id");
Event dp = new Event();
dp.setPt("2108161000");
stop01.setDp(dp);
timetable.getS().add(stop01);
final TimetablesV1ApiStub stubWithData = TimetablesV1ApiStub.createWithResult(timetable);
final DeutscheBahnTimetableHandler handler = createAndInitHandler(callback, bridge,
(String authToken, HttpCallable httpCallable) -> stubWithData);
try {
verify(callback).statusUpdated(eq(bridge), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(bridge),
argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
verifyThingUpdated(bridge, 0, stop01.getId());
verifyChannelsUpdatedToUndef(bridge, 1, callback, UnDefType.UNDEF);
verifyChannelsUpdatedToUndef(bridge, 2, callback, UnDefType.UNDEF);
} finally {
handler.dispose();
}
}
}

View File

@@ -0,0 +1,225 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Event;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TimetableStop;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TripLabel;
import org.openhab.core.config.core.Configuration;
import org.openhab.core.library.types.DateTimeType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingUID;
import org.openhab.core.thing.binding.ThingHandlerCallback;
import org.openhab.core.thing.internal.BridgeImpl;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
/**
* Tests for {@link DeutscheBahnTrainHandler}.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
public class DeutscheBahnTrainHandlerTest {
private static final String SAMPLE_PATH = "Bielefeld Hbf|Herford|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf|Lehrte";
private static Configuration createConfig(int position) {
final Configuration config = new Configuration();
config.put("position", String.valueOf(position));
return config;
}
static Thing mockThing(int id) {
final Thing thing = mock(Thing.class);
when(thing.getUID()).thenReturn(new ThingUID(DeutscheBahnBindingConstants.TRAIN_TYPE, "train-" + id));
when(thing.getThingTypeUID()).thenReturn(DeutscheBahnBindingConstants.TRAIN_TYPE);
when(thing.getConfiguration()).thenReturn(createConfig(id));
ThingUID bridgeId = new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable");
when(thing.getBridgeUID()).thenReturn(bridgeId);
final Channel tripLabelCategory = mockChannel(thing.getUID(), "trip#category");
final Channel arrivalPlannedTime = mockChannel(thing.getUID(), "arrival#planned-time");
final Channel arrivalLine = mockChannel(thing.getUID(), "arrival#line");
final Channel arrivalChangedTime = mockChannel(thing.getUID(), "arrival#changed-time");
final Channel departurePlannedTime = mockChannel(thing.getUID(), "departure#planned-time");
final Channel departurePlannedPlatform = mockChannel(thing.getUID(), "departure#planned-platform");
final Channel departureTargetStation = mockChannel(thing.getUID(), "departure#planned-final-station");
when(thing.getChannelsOfGroup("trip")).thenReturn(Arrays.asList(tripLabelCategory));
when(thing.getChannelsOfGroup("arrival"))
.thenReturn(Arrays.asList(arrivalPlannedTime, arrivalLine, arrivalChangedTime));
when(thing.getChannelsOfGroup("departure"))
.thenReturn(Arrays.asList(departurePlannedTime, departurePlannedPlatform, departureTargetStation));
when(thing.getChannels()).thenReturn(Arrays.asList( //
tripLabelCategory, //
arrivalPlannedTime, arrivalLine, arrivalChangedTime, //
departurePlannedTime, departurePlannedPlatform, departureTargetStation));
return thing;
}
private static Channel mockChannel(final ThingUID thingId, final String channelId) {
final Channel channel = Mockito.mock(Channel.class);
when(channel.getUID()).thenReturn(new ChannelUID(thingId, channelId));
return channel;
}
private static DeutscheBahnTrainHandler createAndInitHandler(final ThingHandlerCallback callback,
final Thing thing) {
final DeutscheBahnTrainHandler handler = new DeutscheBahnTrainHandler(thing);
handler.setCallback(callback);
handler.initialize();
return handler;
}
private static State getDateTime(final Date day) {
final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(day.toInstant(), ZoneId.systemDefault());
return new DateTimeType(zonedDateTime);
}
@Test
public void testUpdateChannels() {
final Thing thing = mockThing(1);
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
ThingUID bridgeId = new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable");
when(callback.getBridge(bridgeId))
.thenReturn(new BridgeImpl(DeutscheBahnBindingConstants.TIMETABLE_TYPE, bridgeId));
final DeutscheBahnTrainHandler handler = createAndInitHandler(callback, thing);
try {
verify(callback).statusUpdated(eq(thing), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(thing),
argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
// Provide data that will update the channels
TimetableStop stop = new TimetableStop();
TripLabel label = new TripLabel();
label.setC("WFB");
stop.setTl(label);
Event arrival = new Event();
arrival.setPt("2108161434");
arrival.setL("RE60");
stop.setAr(arrival);
Event departure = new Event();
departure.setPt("2108161435");
departure.setPp("2");
departure.setPpth(SAMPLE_PATH);
stop.setDp(departure);
handler.updateChannels(stop);
final Date arrivalTime = new GregorianCalendar(2021, 7, 16, 14, 34).getTime();
final Date departureTime = new GregorianCalendar(2021, 7, 16, 14, 35).getTime();
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "trip#category"),
new StringType("WFB"));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#planned-time"),
getDateTime(arrivalTime));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#line"),
new StringType("RE60"));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#changed-time"),
UnDefType.NULL);
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "departure#planned-time"),
getDateTime(departureTime));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "departure#planned-platform"),
new StringType("2"));
verify(callback, timeout(1000)).stateUpdated(
new ChannelUID(thing.getUID(), "departure#planned-final-station"), new StringType("Lehrte"));
} finally {
handler.dispose();
}
}
@Test
public void testUpdateChannelsWithEventNotPresent() {
final Thing thing = mockThing(1);
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
ThingUID bridgeId = new ThingUID(DeutscheBahnBindingConstants.TIMETABLE_TYPE, "timetable");
when(callback.getBridge(bridgeId))
.thenReturn(new BridgeImpl(DeutscheBahnBindingConstants.TIMETABLE_TYPE, bridgeId));
final DeutscheBahnTrainHandler handler = createAndInitHandler(callback, thing);
try {
verify(callback).statusUpdated(eq(thing), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(thing),
argThat(arg -> arg.getStatus().equals(ThingStatus.ONLINE)));
// Provide data that will update the channels
TimetableStop stop = new TimetableStop();
Event arrival = new Event();
arrival.setPt("2108161434");
arrival.setL("RE60");
stop.setAr(arrival);
handler.updateChannels(stop);
final Date arrivalTime = new GregorianCalendar(2021, 7, 16, 14, 34).getTime();
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "trip#category"),
UnDefType.UNDEF);
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#planned-time"),
getDateTime(arrivalTime));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#line"),
new StringType("RE60"));
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "arrival#changed-time"),
UnDefType.NULL);
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "departure#planned-time"),
UnDefType.UNDEF);
verify(callback, timeout(1000)).stateUpdated(new ChannelUID(thing.getUID(), "departure#planned-platform"),
UnDefType.UNDEF);
verify(callback, timeout(1000))
.stateUpdated(new ChannelUID(thing.getUID(), "departure#planned-final-station"), UnDefType.UNDEF);
} finally {
handler.dispose();
}
}
@Test
public void testWithoutBridgeStateUpdatesToOffline() {
final Thing thing = mockThing(1);
final ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
final DeutscheBahnTrainHandler handler = createAndInitHandler(callback, thing);
try {
verify(callback).statusUpdated(eq(thing), argThat(arg -> arg.getStatus().equals(ThingStatus.UNKNOWN)));
verify(callback, timeout(1000)).statusUpdated(eq(thing),
argThat(arg -> arg.getStatus().equals(ThingStatus.OFFLINE)));
} finally {
handler.dispose();
}
}
}

View File

@@ -0,0 +1,282 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.function.Consumer;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Event;
import org.openhab.binding.deutschebahn.internal.timetable.dto.EventStatus;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Message;
import org.openhab.core.library.types.DateTimeType;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.types.State;
/**
* Tests Mapping from {@link Event} attribute values to openhab state values.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
@SuppressWarnings("unchecked")
public class EventAttributeTest {
private static final String SAMPLE_PATH = "Bielefeld Hbf|Herford|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf|Lehrte";
private <VALUE_TYPE, STATE_TYPE extends State> void doTestEventAttribute( //
String channelName, //
@Nullable String expectedChannelName, //
Consumer<Event> setValue, //
VALUE_TYPE expectedValue, //
@Nullable STATE_TYPE expectedState, //
EventType eventType, //
boolean performSetterTest) { //
final EventAttribute<VALUE_TYPE, STATE_TYPE> attribute = (EventAttribute<VALUE_TYPE, STATE_TYPE>) EventAttribute
.getByChannelName(channelName, eventType);
assertThat(attribute, is(not(nullValue())));
assertThat(attribute.getChannelTypeName(), is(expectedChannelName == null ? channelName : expectedChannelName));
assertThat(attribute.getValue(new Event()), is(nullValue()));
assertThat(attribute.getState(new Event()), is(nullValue()));
// Create an event and set the attribute value.
final Event eventWithValueSet = new Event();
setValue.accept(eventWithValueSet);
// then try get value and state.
assertThat(attribute.getValue(eventWithValueSet), is(expectedValue));
assertThat(attribute.getState(eventWithValueSet), is(expectedState));
// Try set Value in new Event
final Event copyTarget = new Event();
attribute.setValue(copyTarget, expectedValue);
if (performSetterTest) {
assertThat(attribute.getValue(copyTarget), is(expectedValue));
}
}
@Test
public void testGetNonExistingChannel() {
assertThat(EventAttribute.getByChannelName("unkownChannel", EventType.ARRIVAL), is(nullValue()));
}
@Test
public void testPlannedPath() {
doTestEventAttribute("planned-path", null, (Event e) -> e.setPpth(SAMPLE_PATH), SAMPLE_PATH,
new StringType(SAMPLE_PATH), EventType.DEPARTURE, true);
}
@Test
public void testChangedPath() {
doTestEventAttribute("changed-path", null, (Event e) -> e.setCpth(SAMPLE_PATH), SAMPLE_PATH,
new StringType(SAMPLE_PATH), EventType.DEPARTURE, true);
}
@Test
public void testPlannedPlatform() {
String platform = "2";
doTestEventAttribute("planned-platform", null, (Event e) -> e.setPp(platform), platform,
new StringType(platform), EventType.DEPARTURE, true);
}
@Test
public void testChangedPlatform() {
String platform = "2";
doTestEventAttribute("changed-platform", null, (Event e) -> e.setCp(platform), platform,
new StringType(platform), EventType.DEPARTURE, true);
}
@Test
public void testWings() {
String wings = "-906407760000782942-1403311431";
doTestEventAttribute("wings", null, (Event e) -> e.setWings(wings), wings, new StringType(wings),
EventType.DEPARTURE, true);
}
@Test
public void testTransition() {
String transition = "2016448009055686515-1403311438-1";
doTestEventAttribute("transition", null, (Event e) -> e.setTra(transition), transition,
new StringType(transition), EventType.DEPARTURE, true);
}
@Test
public void testPlannedDistantEndpoint() {
String endpoint = "Hannover Hbf";
doTestEventAttribute("planned-distant-endpoint", null, (Event e) -> e.setPde(endpoint), endpoint,
new StringType(endpoint), EventType.DEPARTURE, true);
}
@Test
public void testChangedDistantEndpoint() {
String endpoint = "Hannover Hbf";
doTestEventAttribute("changed-distant-endpoint", null, (Event e) -> e.setCde(endpoint), endpoint,
new StringType(endpoint), EventType.DEPARTURE, true);
}
@Test
public void testLine() {
String line = "RE60";
doTestEventAttribute("line", null, (Event e) -> e.setL(line), line, new StringType(line), EventType.DEPARTURE,
true);
}
@Test
public void testPlannedTime() {
String time = "2109111825";
GregorianCalendar expectedValue = new GregorianCalendar(2021, 8, 11, 18, 25, 0);
DateTimeType expectedState = new DateTimeType(
ZonedDateTime.ofInstant(expectedValue.toInstant(), ZoneId.systemDefault()));
doTestEventAttribute("planned-time", null, (Event e) -> e.setPt(time), expectedValue.getTime(), expectedState,
EventType.DEPARTURE, true);
}
@Test
public void testChangedTime() {
String time = "2109111825";
GregorianCalendar expectedValue = new GregorianCalendar(2021, 8, 11, 18, 25, 0);
DateTimeType expectedState = new DateTimeType(
ZonedDateTime.ofInstant(expectedValue.toInstant(), ZoneId.systemDefault()));
doTestEventAttribute("changed-time", null, (Event e) -> e.setCt(time), expectedValue.getTime(), expectedState,
EventType.DEPARTURE, true);
}
@Test
public void testCancellationTime() {
String time = "2109111825";
GregorianCalendar expectedValue = new GregorianCalendar(2021, 8, 11, 18, 25, 0);
DateTimeType expectedState = new DateTimeType(
ZonedDateTime.ofInstant(expectedValue.toInstant(), ZoneId.systemDefault()));
doTestEventAttribute("cancellation-time", null, (Event e) -> e.setClt(time), expectedValue.getTime(),
expectedState, EventType.DEPARTURE, true);
}
@Test
public void testPlannedStatus() {
EventStatus expectedValue = EventStatus.A;
doTestEventAttribute("planned-status", null, (Event e) -> e.setPs(expectedValue), expectedValue,
new StringType(expectedValue.name().toLowerCase()), EventType.DEPARTURE, true);
}
@Test
public void testChangedStatus() {
EventStatus expectedValue = EventStatus.C;
doTestEventAttribute("changed-status", null, (Event e) -> e.setCs(expectedValue), expectedValue,
new StringType(expectedValue.name().toLowerCase()), EventType.DEPARTURE, true);
}
@Test
public void testHidden() {
doTestEventAttribute("hidden", null, (Event e) -> e.setHi(0), 0, OnOffType.OFF, EventType.DEPARTURE, true);
doTestEventAttribute("hidden", null, (Event e) -> e.setHi(1), 1, OnOffType.ON, EventType.DEPARTURE, true);
}
@Test
public void testDistantChange() {
doTestEventAttribute("distant-change", null, (Event e) -> e.setDc(42), 42, new DecimalType(42),
EventType.DEPARTURE, true);
}
@Test
public void testPlannedFinalStation() {
doTestEventAttribute("planned-final-station", "planned-target-station", (Event e) -> e.setPpth(SAMPLE_PATH),
"Lehrte", new StringType("Lehrte"), EventType.DEPARTURE, false);
doTestEventAttribute("planned-final-station", "planned-start-station", (Event e) -> e.setPpth(SAMPLE_PATH),
"Bielefeld Hbf", new StringType("Bielefeld Hbf"), EventType.ARRIVAL, false);
}
@Test
public void testChangedFinalStation() {
doTestEventAttribute("changed-final-station", "changed-target-station", (Event e) -> e.setCpth(SAMPLE_PATH),
"Lehrte", new StringType("Lehrte"), EventType.DEPARTURE, false);
doTestEventAttribute("changed-final-station", "changed-start-station", (Event e) -> e.setCpth(SAMPLE_PATH),
"Bielefeld Hbf", new StringType("Bielefeld Hbf"), EventType.ARRIVAL, false);
}
@Test
public void testPlannedIntermediateStations() {
String expectedFollowing = "Bielefeld Hbf - Herford - Löhne(Westf) - Bad Oeynhausen - Porta Westfalica - Minden(Westf) - Bückeburg - Stadthagen - Haste - Wunstorf - Hannover Hbf";
doTestEventAttribute("planned-intermediate-stations", "planned-following-stations",
(Event e) -> e.setPpth(SAMPLE_PATH), expectedFollowing, new StringType(expectedFollowing),
EventType.DEPARTURE, false);
String expectedPrevious = "Herford - Löhne(Westf) - Bad Oeynhausen - Porta Westfalica - Minden(Westf) - Bückeburg - Stadthagen - Haste - Wunstorf - Hannover Hbf - Lehrte";
doTestEventAttribute("planned-intermediate-stations", "planned-previous-stations",
(Event e) -> e.setPpth(SAMPLE_PATH), expectedPrevious, new StringType(expectedPrevious),
EventType.ARRIVAL, false);
}
@Test
public void testChangedIntermediateStations() {
String expectedFollowing = "Bielefeld Hbf - Herford - Löhne(Westf) - Bad Oeynhausen - Porta Westfalica - Minden(Westf) - Bückeburg - Stadthagen - Haste - Wunstorf - Hannover Hbf";
doTestEventAttribute("changed-intermediate-stations", "changed-following-stations",
(Event e) -> e.setCpth(SAMPLE_PATH), expectedFollowing, new StringType(expectedFollowing),
EventType.DEPARTURE, false);
String expectedPrevious = "Herford - Löhne(Westf) - Bad Oeynhausen - Porta Westfalica - Minden(Westf) - Bückeburg - Stadthagen - Haste - Wunstorf - Hannover Hbf - Lehrte";
doTestEventAttribute("changed-intermediate-stations", "changed-previous-stations",
(Event e) -> e.setCpth(SAMPLE_PATH), expectedPrevious, new StringType(expectedPrevious),
EventType.ARRIVAL, false);
}
@Test
public void testMessages() {
String expectedOneMessage = "Verzögerungen im Betriebsablauf";
List<Message> messages = new ArrayList<>();
Message m1 = new Message();
m1.setC(99);
messages.add(m1);
doTestEventAttribute("messages", null, (Event e) -> e.getM().addAll(messages), messages,
new StringType(expectedOneMessage), EventType.DEPARTURE, true);
String expectedTwoMessages = "Verzögerungen im Betriebsablauf - keine Qualitätsmängel";
Message m2 = new Message();
m2.setC(88);
messages.add(m2);
doTestEventAttribute("messages", null, (Event e) -> e.getM().addAll(messages), messages,
new StringType(expectedTwoMessages), EventType.DEPARTURE, true);
}
@Test
public void testFilterDuplicateMessages() {
String expectedOneMessage = "andere Reihenfolge der Wagen - technische Störung am Zug - Zug verkehrt richtig gereiht";
List<Message> messages = new ArrayList<>();
Message m1 = new Message();
m1.setC(80);
messages.add(m1);
Message m2 = new Message();
m2.setC(80);
messages.add(m2);
Message m3 = new Message();
m3.setC(36);
messages.add(m3);
Message m4 = new Message();
m4.setC(80);
messages.add(m4);
Message m5 = new Message();
m5.setC(84);
messages.add(m5);
doTestEventAttribute("messages", null, (Event e) -> e.getM().addAll(messages), messages,
new StringType(expectedOneMessage), EventType.DEPARTURE, true);
}
}

View File

@@ -0,0 +1,103 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import java.util.function.Consumer;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TripLabel;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TripType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.types.State;
/**
* Tests Mapping from {@link TripLabel} attribute values to openhab state values.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
@SuppressWarnings("unchecked")
public class TripLabelAttributeTest {
private <VALUE_TYPE, STATE_TYPE extends State> void doTestTripAttribute( //
String channelName, //
@Nullable String expectedChannelName, //
Consumer<TripLabel> setValue, //
VALUE_TYPE expectedValue, //
@Nullable STATE_TYPE expectedState, //
boolean performSetterTest) { //
final TripLabelAttribute<VALUE_TYPE, STATE_TYPE> attribute = (TripLabelAttribute<VALUE_TYPE, STATE_TYPE>) TripLabelAttribute
.getByChannelName(channelName);
assertThat(attribute, is(not(nullValue())));
assertThat(attribute.getChannelTypeName(), is(expectedChannelName == null ? channelName : expectedChannelName));
assertThat(attribute.getValue(new TripLabel()), is(nullValue()));
assertThat(attribute.getState(new TripLabel()), is(nullValue()));
// Create an trip label and set the attribute value.
final TripLabel labelWithValueSet = new TripLabel();
setValue.accept(labelWithValueSet);
// then try get value and state.
assertThat(attribute.getValue(labelWithValueSet), is(expectedValue));
assertThat(attribute.getState(labelWithValueSet), is(expectedState));
// Try set Value in new Event
final TripLabel copyTarget = new TripLabel();
attribute.setValue(copyTarget, expectedValue);
if (performSetterTest) {
assertThat(attribute.getValue(copyTarget), is(expectedValue));
}
}
@Test
public void testGetNonExistingChannel() {
assertThat(TripLabelAttribute.getByChannelName("unkownChannel"), is(nullValue()));
}
@Test
public void testCategory() {
final String category = "ICE";
doTestTripAttribute("category", null, (TripLabel e) -> e.setC(category), category, new StringType(category),
true);
}
@Test
public void testNumber() {
final String number = "4567";
doTestTripAttribute("number", null, (TripLabel e) -> e.setN(number), number, new StringType(number), true);
}
@Test
public void testOwner() {
final String owner = "W3";
doTestTripAttribute("owner", null, (TripLabel e) -> e.setO(owner), owner, new StringType(owner), true);
}
@Test
public void testFilterFlages() {
final String filter = "a";
doTestTripAttribute("filter-flags", null, (TripLabel e) -> e.setF(filter), filter, new StringType(filter),
true);
}
@Test
public void testTripType() {
final TripType type = TripType.E;
doTestTripAttribute("trip-type", null, (TripLabel e) -> e.setT(type), type, new StringType("e"), true);
}
}

View File

@@ -0,0 +1,40 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.function.Supplier;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* Stub time provider.
*
* @author Sönke Küper - Initial contribution.
*/
@NonNullByDefault
public final class TimeproviderStub implements Supplier<Date> {
public GregorianCalendar time = new GregorianCalendar();
@Override
public Date get() {
return this.time.getTime();
}
public void moveAhead(int seconds) {
this.time.set(Calendar.SECOND, time.get(Calendar.SECOND) + seconds);
}
}

View File

@@ -0,0 +1,229 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.junit.jupiter.api.Test;
import org.openhab.binding.deutschebahn.internal.EventType;
import org.openhab.binding.deutschebahn.internal.TimetableStopFilter;
import org.openhab.binding.deutschebahn.internal.timetable.dto.TimetableStop;
/**
* Tests for the {@link TimetableLoader}.
*
* @author Sönke Küper - initial contribution
*/
@NonNullByDefault
public class TimetableLoaderTest implements TimetablesV1ImplTestHelper {
@Test
public void testLoadRequiredStopCount() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.ALL,
EventType.DEPARTURE, timeProvider, EVA_LEHRTE, 20);
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 30);
final List<TimetableStop> stops = loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09",
"https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/10",
"https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/11"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
assertThat(stops, hasSize(21));
assertEquals("-5296516961807204721-2108160906-5", stops.get(0).getId());
assertEquals("-3222259045572671319-2108161155-1", stops.get(20).getId());
// when requesting again no further call to plan is made, because required stops are available.
final List<TimetableStop> stops02 = loader.getTimetableStops();
assertThat(stops02, hasSize(21));
assertThat(timeTableTestModule.getRequestedPlanUrls(), hasSize(3));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(), hasSize(1));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
}
@Test
public void testLoadNewDataIfRequired() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.ALL,
EventType.DEPARTURE, timeProvider, EVA_LEHRTE, 8);
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 0);
final List<TimetableStop> stops = loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
assertThat(stops, hasSize(8));
assertEquals("1763676552526687479-2108160847-6", stops.get(0).getId());
assertEquals("8681599812964340829-2108160955-1", stops.get(7).getId());
// Move clock ahead for 30 minutes, so that some of the fetched data is in past and new plan data must be
// requested
timeProvider.moveAhead(30 * 60);
final List<TimetableStop> stops02 = loader.getTimetableStops();
assertThat(stops02, hasSize(13));
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09",
"https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/10"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226",
"https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
assertEquals("-5296516961807204721-2108160906-5", stops02.get(0).getId());
assertEquals("-3376513334056532423-2108161055-1", stops02.get(12).getId());
}
@Test
public void testRequestUpdates() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.ALL,
EventType.DEPARTURE, timeProvider, EVA_LEHRTE, 1);
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 30);
// First call - plan and full changes are requested.
loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
// Changes are updated only every 30 seconds, so move clock ahead 20 seconds, no request is made
timeProvider.moveAhead(20);
loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
// Move ahead 10 seconds, so recent changes are fetched
timeProvider.moveAhead(10);
loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/rchg/8000226"));
// Move again ahead 30 seconds, recent changes are fetched again
timeProvider.moveAhead(30);
loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/rchg/8000226",
"https://api.deutschebahn.com/timetables/v1/rchg/8000226"));
// If recent change were not updated last 120 seconds the full changes must be requested
timeProvider.moveAhead(120);
loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226",
"https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/rchg/8000226",
"https://api.deutschebahn.com/timetables/v1/rchg/8000226"));
}
@Test
public void testReturnOnlyArrivals() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.ARRIVALS,
EventType.ARRIVAL, timeProvider, EVA_LEHRTE, 20);
// Simulate that only one url is available
timeTableTestModule.addAvailableUrl("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09");
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 0);
final List<TimetableStop> stops = loader.getTimetableStops();
// File contains 8 stops, but 2 are only departures
assertThat(stops, hasSize(6));
assertEquals("1763676552526687479-2108160847-6", stops.get(0).getId());
assertEquals("-735649762452915464-2108160912-6", stops.get(5).getId());
}
@Test
public void testReturnOnlyDepartures() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.DEPARTURES,
EventType.DEPARTURE, timeProvider, EVA_LEHRTE, 20);
// Simulate that only one url is available
timeTableTestModule.addAvailableUrl("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09");
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 0);
final List<TimetableStop> stops = loader.getTimetableStops();
// File contains 8 stops, but 2 are only arrivals
assertThat(stops, hasSize(6));
assertEquals("-94442819435724762-2108160916-1", stops.get(0).getId());
assertEquals("8681599812964340829-2108160955-1", stops.get(5).getId());
}
@Test
public void testRemoveEntryOnlyIfChangedTimeIsInPast() throws Exception {
final TimetablesApiTestModule timeTableTestModule = this.createApiWithTestdata();
final TimeproviderStub timeProvider = new TimeproviderStub();
final TimetableLoader loader = new TimetableLoader(timeTableTestModule.getApi(), TimetableStopFilter.DEPARTURES,
EventType.DEPARTURE, timeProvider, EVA_LEHRTE, 1);
timeProvider.time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 35);
final List<TimetableStop> stops = loader.getTimetableStops();
assertThat(timeTableTestModule.getRequestedPlanUrls(),
contains("https://api.deutschebahn.com/timetables/v1/plan/8000226/210816/09"));
assertThat(timeTableTestModule.getRequestedFullChangesUrls(),
contains("https://api.deutschebahn.com/timetables/v1/fchg/8000226"));
assertThat(timeTableTestModule.getRequestedRecentChangesUrls(), empty());
// Stop -5296516961807204721-2108160906-5 has its planned time at 9:34, but its included because its changed
// time is 9:42
assertThat(stops, hasSize(4));
assertEquals("-5296516961807204721-2108160906-5", stops.get(0).getId());
assertEquals("2108160942", stops.get(0).getDp().getCt());
assertEquals("8681599812964340829-2108160955-1", stops.get(3).getId());
}
}

View File

@@ -0,0 +1,151 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1Impl.HttpCallable;
/**
* Stub Implementation for {@link HttpCallable}, that provides Data for the selected station, date and hour from file
* system.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
public class TimetableStubHttpCallable implements HttpCallable {
private static final Pattern PLAN_URL_PATTERN = Pattern
.compile("https://api.deutschebahn.com/timetables/v1/plan/(\\d+)/(\\d+)/(\\d+)");
private static final Pattern FULL_CHANGES_URL_PATTERN = Pattern
.compile("https://api.deutschebahn.com/timetables/v1/fchg/(\\d+)");
private static final Pattern RECENT_CHANGES_URL_PATTERN = Pattern
.compile("https://api.deutschebahn.com/timetables/v1/rchg/(\\d+)");
private final File testdataDir;
private final List<String> requestedPlanUrls;
private final List<String> requestedFullChangesUrls;
private final List<String> requestedRecentChangesUrls;
// Allows simulation of available data.
// if not set all available files will be served.
private @Nullable Set<String> availableUrls = null;
public TimetableStubHttpCallable(File testdataDir) {
this.testdataDir = testdataDir;
this.requestedPlanUrls = new ArrayList<>();
this.requestedFullChangesUrls = new ArrayList<String>();
this.requestedRecentChangesUrls = new ArrayList<String>();
}
public void addAvailableUrl(String url) {
if (this.availableUrls == null) {
availableUrls = new HashSet<>();
}
this.availableUrls.add(url);
}
@Override
public String executeUrl( //
String httpMethod, //
String url, //
Properties httpHeaders, //
@Nullable InputStream content, //
@Nullable String contentType, //
int timeout) throws IOException {
final Matcher planMatcher = PLAN_URL_PATTERN.matcher(url);
if (planMatcher.matches()) {
requestedPlanUrls.add(url);
return processRequest(url, planMatcher, this::getPlanData);
}
final Matcher fullChangesMatcher = FULL_CHANGES_URL_PATTERN.matcher(url);
if (fullChangesMatcher.matches()) {
requestedFullChangesUrls.add(url);
return processRequest(url, fullChangesMatcher, this::getFullChanges);
}
final Matcher recentChangesMatcher = RECENT_CHANGES_URL_PATTERN.matcher(url);
if (recentChangesMatcher.matches()) {
requestedRecentChangesUrls.add(url);
return processRequest(url, recentChangesMatcher, this::getRecentChanges);
}
return "";
}
private String processRequest(String url, Matcher matcher, Function<Matcher, String> responseSupplier) {
if (availableUrls != null && !availableUrls.contains(url)) {
return "";
} else {
return responseSupplier.apply(matcher);
}
}
private String getPlanData(final Matcher planMatcher) {
final String evaNo = planMatcher.group(1);
final String day = planMatcher.group(2);
final String hour = planMatcher.group(3);
final File responseFile = new File(this.testdataDir, "plan/" + evaNo + "/" + day + "/" + hour + ".xml");
return serveFileContentIfExists(responseFile);
}
private String serveFileContentIfExists(File responseFile) {
if (!responseFile.exists()) {
return "";
}
try {
return Files.readString(responseFile.toPath());
} catch (IOException e) {
throw new AssertionError(e);
}
}
private String getRecentChanges(Matcher recentChangesMatcher) {
final String evaNo = recentChangesMatcher.group(1);
File responseFile = new File(this.testdataDir, "rchg/" + evaNo + ".xml");
return serveFileContentIfExists(responseFile);
}
private String getFullChanges(Matcher fullChangesMatcher) {
final String evaNo = fullChangesMatcher.group(1);
File responseFile = new File(this.testdataDir, "fchg/" + evaNo + ".xml");
return serveFileContentIfExists(responseFile);
}
public List<String> getRequestedPlanUrls() {
return requestedPlanUrls;
}
public List<String> getRequestedFullChangesUrls() {
return requestedFullChangesUrls;
}
public List<String> getRequestedRecentChangesUrls() {
return requestedRecentChangesUrls;
}
}

View File

@@ -0,0 +1,71 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import java.net.URISyntaxException;
import java.util.List;
import javax.xml.bind.JAXBException;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.deutschebahn.internal.timetable.TimetablesV1Impl.HttpCallable;
import org.xml.sax.SAXException;
/**
* Testmodule that contains the {@link TimetablesV1Api} and {@link TimetableStubHttpCallable}.
* Used in tests to check which http calls have been made.
*
* @author Sönke Küper - Initial contribution.
*/
@NonNullByDefault
public final class TimetablesApiTestModule {
private final TimetablesV1Api api;
private final TimetableStubHttpCallable httpStub;
public TimetablesApiTestModule(TimetablesV1Api api, TimetableStubHttpCallable httpStub) {
this.api = api;
this.httpStub = httpStub;
}
public TimetablesV1Api getApi() {
return api;
}
public void addAvailableUrl(String url) {
this.httpStub.addAvailableUrl(url);
}
public List<String> getRequestedPlanUrls() {
return httpStub.getRequestedPlanUrls();
}
public List<String> getRequestedFullChangesUrls() {
return httpStub.getRequestedFullChangesUrls();
}
public List<String> getRequestedRecentChangesUrls() {
return httpStub.getRequestedRecentChangesUrls();
}
public TimetablesV1ApiFactory getApiFactory() {
return new TimetablesV1ApiFactory() {
@Override
public TimetablesV1Api create(String authToken, HttpCallable httpCallable)
throws JAXBException, SAXException, URISyntaxException {
return api;
}
};
}
}

View File

@@ -0,0 +1,71 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import java.io.IOException;
import java.util.Date;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Timetable;
/**
* Stub Implementation of {@link TimetablesV1Api}, that may return an preconfigured Timetable or
* throws an {@link IOException} if not data has been set.
*
* @author Sönke Küper - initial contribution
*/
@NonNullByDefault
public final class TimetablesV1ApiStub implements TimetablesV1Api {
@Nullable
private final Timetable result;
private TimetablesV1ApiStub(@Nullable Timetable result) {
this.result = result;
}
/**
* Creates an new {@link TimetablesV1ApiStub}, that returns the given result.
*/
public static TimetablesV1ApiStub createWithResult(Timetable timetable) {
return new TimetablesV1ApiStub(timetable);
}
/**
* Creates an new {@link TimetablesV1ApiStub} that throws an Exception.
*/
public static TimetablesV1ApiStub createWithException() {
return new TimetablesV1ApiStub(null);
}
@Override
public Timetable getPlan(String evaNo, Date time) throws IOException {
final Timetable currentResult = this.result;
if (currentResult == null) {
throw new IOException("No timetable data is available");
} else {
return currentResult;
}
}
@Override
public Timetable getFullChanges(String evaNo) throws IOException {
return new Timetable();
}
@Override
public Timetable getRecentChanges(String evaNo) throws IOException {
return new Timetable();
}
}

View File

@@ -0,0 +1,69 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.junit.jupiter.api.Test;
import org.openhab.binding.deutschebahn.internal.timetable.dto.Timetable;
/**
* Tests for {@link TimetablesV1Impl}
*
* @author Sönke Küper - Initial contribution.
*/
@NonNullByDefault
public class TimetablesV1ImplTest implements TimetablesV1ImplTestHelper {
@Test
public void testGetDataForLehrte() throws Exception {
TimetablesV1Api timeTableApi = createApiWithTestdata().getApi();
Date time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 22).getTime();
Timetable timeTable = timeTableApi.getPlan(EVA_LEHRTE, time);
assertNotNull(timeTable);
assertEquals(8, timeTable.getS().size());
}
@Test
public void testGetNonExistingData() throws Exception {
TimetablesV1Api timeTableApi = createApiWithTestdata().getApi();
Date time = new GregorianCalendar(2021, Calendar.AUGUST, 16, 9, 22).getTime();
Timetable timeTable = timeTableApi.getPlan("ABCDEF", time);
assertNotNull(timeTable);
assertEquals(0, timeTable.getS().size());
}
@Test
public void testGetDataForHannoverHBF() throws Exception {
TimetablesV1Api timeTableApi = createApiWithTestdata().getApi();
Date time = new GregorianCalendar(2021, Calendar.OCTOBER, 14, 11, 00).getTime();
Timetable timeTable = timeTableApi.getPlan(EVA_HANNOVER_HBF, time);
assertNotNull(timeTable);
assertEquals(50, timeTable.getS().size());
Timetable changes = timeTableApi.getFullChanges(EVA_HANNOVER_HBF);
assertNotNull(changes);
assertEquals(730, changes.getS().size());
}
}

View File

@@ -0,0 +1,45 @@
/**
* Copyright (c) 2010-2021 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.deutschebahn.internal.timetable;
import static org.junit.jupiter.api.Assertions.*;
import java.io.File;
import java.net.URL;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* Helper interface for jUnit Tests to provide an {@link TimetablesApiTestModule}.
*
* @author Sönke Küper - initial contribution.
*/
@NonNullByDefault
public interface TimetablesV1ImplTestHelper {
public static final String EVA_LEHRTE = "8000226";
public static final String EVA_HANNOVER_HBF = "8000152";
public static final String AUTH_TOKEN = "354c8161cd7fb0936c840240280c131e";
/**
* Creates an {@link TimetablesApiTestModule} that uses http response data from file system.
*/
public default TimetablesApiTestModule createApiWithTestdata() throws Exception {
final URL timetablesData = getClass().getResource("/timetablesData");
assertNotNull(timetablesData);
final File testDataDir = new File(timetablesData.toURI());
final TimetableStubHttpCallable httpStub = new TimetableStubHttpCallable(testDataDir);
final TimetablesV1Impl timeTableApi = new TimetablesV1Impl(AUTH_TOKEN, httpStub);
return new TimetablesApiTestModule(timeTableApi, httpStub);
}
}

View File

@@ -0,0 +1,6 @@
<timetable station="Lehrte" eva="8000226">
<s id="-5296516961807204721-2108160906-5">
<ar ct="2108160940" l="3"/>
<dp ct="2108160942" l="3"/>
</s>
</timetable>

View File

@@ -0,0 +1,282 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Hannover Hbf'>
<s id="-368596468835976260-2110141151-1">
<tl f="D" t="p" o="X1" c="erx" n="83718" />
<dp pt="2110141151" pp="2" l="RB38"
ppth="Langenhagen Mitte|Mellendorf|Lindwedel|Schwarmstedt|Hodenhagen|Walsrode|Bad Fallingbostel|Dorfmark|Soltau(Han)|Soltau Nord|Wolterdingen(Han)|Schneverdingen|Wintermoor|Handeloh|B&#252;senbachtal|Holm-Seppensen|Suerhop|Buchholz(Nordheide)" />
</s>
<s id="2538467373743306803-2110140832-6">
<tl f="F" t="p" o="80" c="ICE" n="682" />
<ar pt="2110141132" pp="8" wings="-9101728246304835337-2110140832"
ppth="N&#252;rnberg Hbf|W&#252;rzburg Hbf|Fulda|Kassel-Wilhelmsh&#246;he|G&#246;ttingen" />
<dp pt="2110141136" pp="8" ppth="Hamburg-Harburg|Hamburg Hbf|L&#252;beck Hbf" />
</s>
<s id="-1279242321187232732-2110141007-3">
<tl f="F" t="p" o="80" c="ICE" n="75" />
<ar pt="2110141138" pp="3" ppth="Hamburg-Altona|Hamburg Hbf" />
<dp pt="2110141141" pp="3"
ppth="G&#246;ttingen|Kassel-Wilhelmsh&#246;he|Frankfurt(Main)Hbf|Mannheim Hbf|Karlsruhe Hbf|Baden-Baden|Freiburg(Breisgau) Hbf|Basel Bad Bf|Basel SBB|Z&#252;rich HB|Sargans|Landquart|Chur" />
</s>
<s id="-6167522321062055942-2110141136-1">
<tl f="D" t="p" o="R1" c="ME" n="82815" />
<dp pt="2110141136" pp="7" l="RE2"
ppth="Sarstedt|Nordstemmen|Elze(Han)|Banteln|Alfeld(Leine)|Freden(Leine)|Kreiensen|Einbeck-Salzderhelden|Northeim(Han)|N&#246;rten-Hardenberg|G&#246;ttingen" />
</s>
<s id="5703989328735164692-2110140935-5">
<tl f="F" t="p" o="80" c="ICE" n="942" />
<ar pt="2110141128" pp="12" wings="1341469202977470214-2110140935"
ppth="Berlin Ostbahnhof|Berlin Hbf|Berlin-Spandau|Wolfsburg Hbf" />
<dp pt="2110141131" pp="12" wings="1341469202977470214-2110140935"
ppth="Bielefeld Hbf|Hamm(Westf)Hbf|Dortmund Hbf|Bochum Hbf|Essen Hbf|Duisburg Hbf|D&#252;sseldorf Flughafen|D&#252;sseldorf Hbf" />
</s>
<s id="5687381020734438255-2110141034-16">
<tl f="S" t="p" o="800244" c="S" n="34170" />
<ar pt="2110141125" pp="2" l="1" tra="8235987991787718627-2110141128-1"
ppth="Haste|Bad Nenndorf|Bantorf|Winninghausen|Barsinghausen|Kirchdorf(Deister)|Egestorf(Deister)|Wennigsen(Deister)|Lemmie|Weetzen|Ronnenberg|Empelde|Hannover-Bornum|Hannover-Linden/Fischerhof|Hannover Bismarckstr." />
</s>
<s id="-4382382001083802173-2110141106-7">
<tl f="S" t="p" o="800244" c="S" n="34545" />
<ar pt="2110141123" pp="1" l="5"
ppth="Hannover Flughafen|Langenhagen Pferdemarkt|Langenhagen Mitte|Hannover-Vinnhorst|Hannover-Ledeburg|Hannover-Nordstadt" />
<dp pt="2110141125" pp="1" l="5"
ppth="Hannover Bismarckstr.|Hannover-Linden/Fischerhof|Weetzen|Holtensen/Linderte|Bennigsen|V&#246;lksen/Eldagsen|Springe|Bad M&#252;nder(Deister)|Hameln" />
</s>
<s id="-4789704478638952900-2110141050-10">
<tl f="S" t="p" o="800244" c="S" n="34546" />
<ar pt="2110141133" pp="2" l="5"
ppth="Hameln|Bad M&#252;nder(Deister)|Springe|V&#246;lksen/Eldagsen|Bennigsen|Holtensen/Linderte|Weetzen|Hannover-Linden/Fischerhof|Hannover Bismarckstr." />
<dp pt="2110141135" pp="2" l="5"
ppth="Hannover-Nordstadt|Hannover-Ledeburg|Hannover-Vinnhorst|Langenhagen Mitte|Langenhagen Pferdemarkt|Hannover Flughafen" />
</s>
<s id="7017358269185663424-2110141040-7">
<tl f="S" t="p" o="800244" c="S" n="34611" />
<ar pt="2110141115" pp="14" l="6" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse|Hannover Karl-Wiechert-Allee" />
</s>
<s id="2220256233596246487-2110141009-9">
<tl f="D" t="p" o="R1" c="ME" n="82865" />
<ar pt="2110141115" pp="4" l="RE3" pde="Hamburg Hbf"
ppth="Uelzen|Suderburg|Unterl&#252;&#223;|Eschede|Celle|Gro&#223;burgwedel|Isernhagen|Langenhagen Mitte" />
</s>
<s id="-3862718574500346031-2110141120-1">
<tl f="N" t="p" o="800295" c="RE" n="4414" />
<dp pt="2110141120" pp="12" l="1"
ppth="Wunstorf|Neustadt am R&#252;benberge|Nienburg(Weser)|Eystrup|D&#246;rverden|Verden(Aller)|Achim|Bremen-Mahndorf|Bremen Hbf|Delmenhorst|Hude|Oldenburg(Oldb)|Bad Zwischenahn|Westerstede-Ocholt|Augustfehn|Leer(Ostfriesl)|Emden Hbf|Marienhafe|Norden|Norddeich|Norddeich Mole" />
</s>
<s id="4458426124091069798-2110140700-13">
<tl f="F" t="p" o="84" c="IC" n="141" />
<ar pt="2110141119" pp="9"
ppth="Amsterdam Centraal|Hilversum|Amersfoort Centraal|Apeldoorn|Deventer|Almelo|Hengelo|Bad Bentheim|Rheine|Osnabr&#252;ck Hbf|Bad Oeynhausen|Minden(Westf)" />
<dp pt="2110141122" pp="9" ppth="Wolfsburg Hbf|Stendal Hbf|Berlin-Spandau|Berlin Hbf" />
</s>
<s id="-5299413353021537464-2110140711-10">
<tl f="F" t="p" o="80" c="IC" n="2046" />
<ar pt="2110141123" pp="11"
ppth="Dresden Hbf|Dresden-Neustadt|Riesa|Leipzig Hbf|Leipzig/Halle Flughafen|Halle(Saale)Hbf|K&#246;then|Magdeburg Hbf|Braunschweig Hbf" />
<dp pt="2110141140" pp="11"
ppth="Minden(Westf)|Herford|Bielefeld Hbf|G&#252;tersloh Hbf|Hamm(Westf)Hbf|Hagen Hbf|Wuppertal Hbf|Solingen Hbf|K&#246;ln Hbf" />
</s>
<s id="1181392732754916068-2110140736-16">
<tl f="F" t="p" o="80" c="IC" n="2037" />
<ar pt="2110141113" pp="10"
ppth="Norddeich Mole|Norddeich|Norden|Marienhafe|Emden Hbf|Leer(Ostfriesl)|Augustfehn|Westerstede-Ocholt|Bad Zwischenahn|Oldenburg(Oldb)|Hude|Delmenhorst|Bremen Hbf|Verden(Aller)|Nienburg(Weser)" />
<dp pt="2110141136" pp="10" ppth="Braunschweig Hbf|Helmstedt|Magdeburg Hbf|K&#246;then|Halle(Saale)Hbf|Leipzig Hbf" />
</s>
<s id="-7716809412790479831-2110141104-1">
<tl f="S" t="p" o="800244" c="S" n="34722" />
<dp pt="2110141104" pp="14" l="7"
ppth="Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten|Lehrte|Aligse|Burgdorf|Otze|Ehlershausen|Celle" />
</s>
<s id="8235987991787718627-2110141128-1">
<tl f="S" t="p" o="800244" c="S" n="34120" />
<dp pt="2110141128" pp="2" l="1" tra="5687381020734438255-2110141034-16"
ppth="Hannover-Nordstadt|Hannover-Leinhausen|Letter|Seelze|Dedensen-G&#252;mmer|Wunstorf|Haste|Lindhorst(Schaumb-Lippe)|Stadthagen|Kirchhorsten|B&#252;ckeburg|Minden(Westf)" />
</s>
<s id="-5592824990971072116-2110141011-7">
<tl f="F" t="p" o="80" c="ICE" n="1579" />
<ar pt="2110141158" pp="4" ppth="Hamburg-Altona|Hamburg Hbf|Hamburg-Harburg|L&#252;neburg|Uelzen|Celle" />
<dp pt="2110141201" pp="4"
ppth="G&#246;ttingen|Kassel-Wilhelmsh&#246;he|Treysa|Marburg(Lahn)|Gie&#223;en|Friedberg(Hess)|Frankfurt(Main)Hbf|Darmstadt Hbf|Bensheim|Weinheim(Bergstr)Hbf|Heidelberg Hbf|Wiesloch-Walldorf|Bruchsal|Karlsruhe Hbf" />
</s>
<s id="-2259513983107179971-2110141110-1">
<tl f="S" t="p" o="800244" c="S" n="34428" />
<dp pt="2110141110" pp="2" l="4"
ppth="Hannover-Nordstadt|Hannover-Ledeburg|Hannover-Vinnhorst|Langenhagen Mitte|Langenhagen Pferdemarkt|Langenhagen-Kaltenweide|Bissendorf|Mellendorf|Bennem&#252;hlen" />
</s>
<s id="7270360564156475774-2110141009-12">
<tl f="D" t="p" o="R1" c="ME" n="82822" />
<ar pt="2110141126" pp="7" l="RE2"
ppth="G&#246;ttingen|N&#246;rten-Hardenberg|Northeim(Han)|Einbeck-Salzderhelden|Kreiensen|Freden(Leine)|Alfeld(Leine)|Banteln|Elze(Han)|Nordstemmen|Sarstedt" />
</s>
<s id="-2379689238391834001-2110141023-10">
<tl f="D" t="p" o="W3" c="WFB" n="95827" />
<ar pt="2110141150" pp="9" l="RE70"
ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf" />
<dp pt="2110141155" pp="9" l="RE70" ppth="Lehrte|H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf" />
</s>
<s id="8260041120522098561-2110141035-13">
<tl f="S" t="p" o="800244" c="S" n="34121" />
<ar pt="2110141130" pp="1" l="1" tra="-4278327689275423766-2110141133-1"
ppth="Minden(Westf)|B&#252;ckeburg|Kirchhorsten|Stadthagen|Lindhorst(Schaumb-Lippe)|Haste|Wunstorf|Dedensen-G&#252;mmer|Seelze|Letter|Hannover-Leinhausen|Hannover-Nordstadt" />
</s>
<s id="-503063856107069988-2110140943-5">
<tl f="F" t="p" o="80" c="ICE" n="787" />
<ar pt="2110141120" pp="3" ppth="Hamburg-Altona|Hamburg Dammtor|Hamburg Hbf|Hamburg-Harburg" />
<dp pt="2110141126" pp="3"
ppth="G&#246;ttingen|Kassel-Wilhelmsh&#246;he|Fulda|W&#252;rzburg Hbf|Augsburg Hbf|M&#252;nchen Hbf" />
</s>
<s id="-4054196780072035175-2110141054-7">
<tl f="D" t="p" o="W3" c="WFB" n="95762" />
<ar pt="2110141141" pp="12" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald|Lehrte" />
</s>
<s id="2546282974817998243-2110141051-10">
<tl f="S" t="p" o="800244" c="S" n="34427" />
<ar pt="2110141117" pp="1" l="4"
ppth="Bennem&#252;hlen|Mellendorf|Bissendorf|Langenhagen-Kaltenweide|Langenhagen Pferdemarkt|Langenhagen Mitte|Hannover-Vinnhorst|Hannover-Ledeburg|Hannover-Nordstadt" />
<dp pt="2110141119" pp="1" l="4"
ppth="Hannover Bismarckstr.|Hannover Messe/Laatzen|Rethen(Leine)|Sarstedt|Barnten|Emmerke|Hildesheim Hbf" />
</s>
<s id="8659063088626413270-2110141136-7">
<tl f="S" t="p" o="800244" c="S" n="34547" />
<ar pt="2110141153" pp="1" l="5"
ppth="Hannover Flughafen|Langenhagen Pferdemarkt|Langenhagen Mitte|Hannover-Vinnhorst|Hannover-Ledeburg|Hannover-Nordstadt" />
<dp pt="2110141155" pp="1" l="5"
ppth="Hannover Bismarckstr.|Hannover-Linden/Fischerhof|Weetzen|Holtensen/Linderte|Bennigsen|V&#246;lksen/Eldagsen|Springe|Bad M&#252;nder(Deister)|Hameln|Emmerthal|Bad Pyrmont|L&#252;gde|Schieder|Steinheim(Westf)|Altenbeken|Paderborn Hbf" />
</s>
<s id="-2569164296520890912-2110141141-1">
<tl f="S" t="p" o="800244" c="S" n="34612" />
<dp pt="2110141141" pp="14" l="6" ppth="Hannover Karl-Wiechert-Allee|Aligse|Burgdorf|Otze|Ehlershausen|Celle" />
</s>
<s id="-9101728246304835337-2110140832-6">
<tl f="F" t="p" o="80" c="ICE" n="632" />
<ar pt="2110141132" pp="8" ppth="N&#252;rnberg Hbf|W&#252;rzburg Hbf|Fulda|Kassel-Wilhelmsh&#246;he|G&#246;ttingen" />
<dp pt="2110141145" pp="8" ppth="Bremen Hbf" />
</s>
<s id="-1618433914809757000-2110140725-7">
<tl f="F" t="p" o="80" c="ICE" n="772" />
<ar pt="2110141117" pp="7"
ppth="Stuttgart Hbf|Mannheim Hbf|Frankfurt(M) Flughafen Fernbf|Frankfurt(Main)Hbf|Kassel-Wilhelmsh&#246;he|G&#246;ttingen" />
<dp pt="2110141120" pp="7" ppth="Hamburg Hbf|Hamburg-Altona" />
</s>
<s id="-7530588623595067801-2110141108-11">
<tl f="S" t="p" o="800244" c="S" n="34723" />
<ar pt="2110141155" pp="14" l="7"
ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse|Lehrte|Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld" />
</s>
<s id="6957029625618749347-2110140923-13">
<tl f="N" t="p" o="800295" c="RE" n="4413" />
<ar pt="2110141138" pp="9" l="8"
ppth="Bremerhaven-Lehe|Bremerhaven Hbf|Osterholz-Scharmbeck|Bremen Hbf|Bremen-Mahndorf|Achim|Verden(Aller)|D&#246;rverden|Eystrup|Nienburg(Weser)|Neustadt am R&#252;benberge|Wunstorf" />
</s>
<s id="1698974169433520451-2110140702-17">
<tl f="F" t="p" o="80" c="ICE" n="1672" />
<ar pt="2110141156" pp="8"
ppth="Karlsruhe Hbf|Karlsruhe-Durlach|Bruchsal|Wiesloch-Walldorf|Heidelberg Hbf|Weinheim(Bergstr)Hbf|Bensheim|Darmstadt Hbf|Frankfurt(Main)Hbf|Friedberg(Hess)|Gie&#223;en|Marburg(Lahn)|Treysa|Wabern(Bz Kassel)|Kassel-Wilhelmsh&#246;he|G&#246;ttingen" />
<dp pt="2110141159" pp="8" ppth="Celle|Uelzen|L&#252;neburg|Hamburg-Harburg|Hamburg Hbf|Hamburg-Altona" />
</s>
<s id="244929573019057867-2110141020-7">
<tl f="D" t="p" o="W3" c="WFB" n="95776" />
<ar pt="2110141105" pp="12" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald|Lehrte" />
<dp pt="2110141109" pp="12" l="RE60"
ppth="Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine" />
</s>
<s id="-2294735978985476965-2110141148-1">
<tl t="p" o="R0" c="ENO" n="83515" />
<dp pt="2110141148" pp="13" l="RE30"
ppth="Lehrte|Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf" />
</s>
<s id="4685591131365771688-2110141134-1">
<tl f="S" t="p" o="800244" c="S" n="34315" />
<dp pt="2110141134" pp="13" l="3"
ppth="Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten|Lehrte|Sehnde|Algermissen|Harsum|Hildesheim Hbf" />
</s>
<s id="2498470733363920454-2110141106-8">
<tl f="S" t="p" o="800244" c="S" n="34430" />
<ar pt="2110141138" pp="2" l="4"
ppth="Hildesheim Hbf|Emmerke|Barnten|Sarstedt|Rethen(Leine)|Hannover Messe/Laatzen|Hannover Bismarckstr." />
<dp pt="2110141140" pp="2" l="4"
ppth="Hannover-Nordstadt|Hannover-Ledeburg|Hannover-Vinnhorst|Langenhagen Mitte|Langenhagen Pferdemarkt|Langenhagen-Kaltenweide|Bissendorf|Mellendorf|Bennem&#252;hlen" />
</s>
<s id="-886919495737015388-2110141148-1">
<tl f="D" t="p" o="X2" c="erx" n="83465" />
<dp pt="2110141148" pp="7" l="RE10"
ppth="Sarstedt|Hildesheim Hbf|Hildesheim Ost|Derneburg(Han)|Baddeckenstedt|Salzgitter-Ringelheim|Goslar|Bad Harzburg" />
</s>
<s id="-16771105683292222-2110140913-19">
<tl f="D" t="p" o="X1" c="erx" n="83713" />
<ar pt="2110141108" pp="1" l="RB38"
ppth="Buchholz(Nordheide)|Suerhop|Holm-Seppensen|B&#252;senbachtal|Handeloh|Wintermoor|Schneverdingen|Wolterdingen(Han)|Soltau Nord|Soltau(Han)|Dorfmark|Bad Fallingbostel|Walsrode|Hodenhagen|Schwarmstedt|Lindwedel|Mellendorf|Langenhagen Mitte" />
</s>
<s id="9177503933658188673-2110141116-1">
<tl f="D" t="p" o="W3" c="WFB" n="95761" />
<dp pt="2110141116" pp="11" l="RE70" ppth="Lehrte|H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf" />
</s>
<s id="-2837041410263484254-2110140822-7">
<tl f="F" t="p" o="80" c="ICE" n="555" />
<ar pt="2110141132" pp="9" wings="-3319510478025615006-2110140814"
ppth="Bonn Hbf|K&#246;ln Hbf|Wuppertal Hbf|Hagen Hbf|Hamm(Westf)Hbf|Bielefeld Hbf" />
<dp pt="2110141135" pp="9" wings="-3319510478025615006-2110140814"
ppth="Berlin-Spandau|Berlin Hbf|Berlin Ostbahnhof" />
</s>
<s id="-4278327689275423766-2110141133-1">
<tl f="S" t="p" o="800244" c="S" n="34171" />
<dp pt="2110141133" pp="1" l="1" tra="8260041120522098561-2110141035-13"
ppth="Hannover Bismarckstr.|Hannover-Linden/Fischerhof|Hannover-Bornum|Empelde|Ronnenberg|Weetzen|Lemmie|Wennigsen(Deister)|Egestorf(Deister)|Kirchdorf(Deister)|Barsinghausen|Winninghausen|Bantorf|Bad Nenndorf|Haste" />
</s>
<s id="1341469202977470214-2110140935-5">
<tl f="F" t="p" o="80" c="ICE" n="952" />
<ar pt="2110141128" pp="12" ppth="Berlin Ostbahnhof|Berlin Hbf|Berlin-Spandau|Wolfsburg Hbf" />
<dp pt="2110141131" pp="12" ppth="Bielefeld Hbf|Hamm(Westf)Hbf|Hagen Hbf|Wuppertal Hbf|K&#246;ln Hbf" />
</s>
<s id="3959040045726460106-2110141121-10">
<tl f="S" t="p" o="800244" c="S" n="34429" />
<ar pt="2110141147" pp="1" l="4"
ppth="Bennem&#252;hlen|Mellendorf|Bissendorf|Langenhagen-Kaltenweide|Langenhagen Pferdemarkt|Langenhagen Mitte|Hannover-Vinnhorst|Hannover-Ledeburg|Hannover-Nordstadt" />
</s>
<s id="1493980582581603875-2110140915-17">
<tl f="S" t="p" o="800244" c="S" n="34544" />
<ar pt="2110141103" pp="2" l="5"
ppth="Paderborn Hbf|Altenbeken|Steinheim(Westf)|Schieder|L&#252;gde|Bad Pyrmont|Emmerthal|Hameln|Bad M&#252;nder(Deister)|Springe|V&#246;lksen/Eldagsen|Bennigsen|Holtensen/Linderte|Weetzen|Hannover-Linden/Fischerhof|Hannover Bismarckstr." />
<dp pt="2110141105" pp="2" l="5"
ppth="Hannover-Nordstadt|Hannover-Ledeburg|Hannover-Vinnhorst|Langenhagen Mitte|Langenhagen Pferdemarkt|Hannover Flughafen" />
</s>
<s id="-5967072892888193768-2110141104-16">
<tl f="S" t="p" o="800244" c="S" n="34216" />
<ar pt="2110141155" pp="2" l="2"
ppth="Haste|Bad Nenndorf|Bantorf|Winninghausen|Barsinghausen|Kirchdorf(Deister)|Egestorf(Deister)|Wennigsen(Deister)|Lemmie|Weetzen|Ronnenberg|Empelde|Hannover-Bornum|Hannover-Linden/Fischerhof|Hannover Bismarckstr." />
<dp pt="2110141158" pp="2" l="2"
ppth="Hannover-Nordstadt|Hannover-Leinhausen|Letter|Seelze|Dedensen-G&#252;mmer|Wunstorf|Poggenhagen|Neustadt am R&#252;benberge|Eilvese|Hagen(Han)|Linsburg|Nienburg(Weser)" />
</s>
<s id="-2642206968755664688-2110141012-13">
<tl f="S" t="p" o="800244" c="S" n="34213" />
<ar pt="2110141100" pp="1" l="2"
ppth="Nienburg(Weser)|Linsburg|Hagen(Han)|Eilvese|Neustadt am R&#252;benberge|Poggenhagen|Wunstorf|Dedensen-G&#252;mmer|Seelze|Letter|Hannover-Leinhausen|Hannover-Nordstadt" />
<dp pt="2110141103" pp="1" l="2"
ppth="Hannover Bismarckstr.|Hannover-Linden/Fischerhof|Hannover-Bornum|Empelde|Ronnenberg|Weetzen|Lemmie|Wennigsen(Deister)|Egestorf(Deister)|Kirchdorf(Deister)|Barsinghausen|Winninghausen|Bantorf|Bad Nenndorf|Haste" />
</s>
<s id="-3319510478025615006-2110140814-9">
<tl f="F" t="p" o="80" c="ICE" n="545" />
<ar pt="2110141132" pp="9"
ppth="D&#252;sseldorf Hbf|D&#252;sseldorf Flughafen|Duisburg Hbf|Essen Hbf|Bochum Hbf|Dortmund Hbf|Hamm(Westf)Hbf|Bielefeld Hbf" />
<dp pt="2110141135" pp="9" ppth="Berlin-Spandau|Berlin Hbf|Berlin Ostbahnhof" />
</s>
<s id="-9206541391658417235-2110141014-11">
<tl t="p" o="R0" c="ENO" n="83510" />
<ar pt="2110141111" pp="13" l="RE30"
ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke|Lehrte" />
</s>
<s id="-8400241610239571421-2110141140-1">
<tl f="D" t="p" o="R1" c="ME" n="82872" />
<dp pt="2110141140" pp="4" l="RE3" pde="Hamburg Hbf"
ppth="Langenhagen Mitte|Isernhagen|Gro&#223;burgwedel|Celle|Eschede|Unterl&#252;&#223;|Suderburg|Uelzen" />
</s>
<s id="-4563769839646635922-2110141043-10">
<tl f="S" t="p" o="800244" c="S" n="34312" />
<ar pt="2110141124" pp="13" l="3"
ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde|Lehrte|Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld" />
</s>
<s id="1962082432295475643-2110140948-9">
<tl f="D" t="p" o="X2" c="erx" n="83462" />
<ar pt="2110141110" pp="8" l="RE10"
ppth="Bad Harzburg|Goslar|Salzgitter-Ringelheim|Baddeckenstedt|Derneburg(Han)|Hildesheim Ost|Hildesheim Hbf|Sarstedt" />
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="2480917541885150474-2108160716-1">
<tl t="p" o="R0" c="ENO" n="83505"/>
<dp pt="2108160716" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="8503425137324890080-2108160706-5">
<tl f="S" t="p" o="800244" c="S" n="99026"/>
<ar pt="2108160729" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108160734" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="-1963042948543761461-2108160755-1">
<tl f="S" t="p" o="800244" c="S" n="99105"/>
<dp pt="2108160755" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-3028574470713369195-2108160711-6">
<tl f="S" t="p" o="800244" c="S" n="99027"/>
<ar pt="2108160734" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108160738" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="4315586671604650438-2108160647-6">
<tl f="S" t="p" o="800244" c="S" n="99104"/>
<ar pt="2108160710" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-6154367079560405690-2108160517-14">
<tl f="D" t="p" o="W3" c="WFB" n="95773"/>
<ar pt="2108160715" pp="14" l="RE60" ppth="Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108160718" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="7538934640418692029-2108160712-6">
<tl f="D" t="p" o="W3" c="WFB" n="95824"/>
<ar pt="2108160744" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108160747" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="4034387657741012323-2108160658-10">
<tl t="p" o="R0" c="ENO" n="83504"/>
<ar pt="2108160740" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="543425183571017441-2108160812-6">
<tl f="D" t="p" o="W3" c="WFB" n="95774"/>
<ar pt="2108160844" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108160847" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="7614604050911547623-2108160758-10">
<tl t="p" o="R0" c="ENO" n="83506"/>
<ar pt="2108160840" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="4020683816646788743-2108160816-1">
<tl t="p" o="R0" c="ENO" n="83507"/>
<dp pt="2108160816" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="8061249370456134776-2108160811-6">
<tl f="S" t="p" o="800244" c="S" n="99029"/>
<ar pt="2108160834" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108160838" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-1008963402532713716-2108160806-5">
<tl f="S" t="p" o="800244" c="S" n="99028"/>
<ar pt="2108160829" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108160834" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="8552544228981452549-2108160855-1">
<tl f="S" t="p" o="800244" c="S" n="99107"/>
<dp pt="2108160855" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-118775371347779303-2108160624-12">
<tl f="D" t="p" o="W3" c="WFB" n="95823"/>
<ar pt="2108160815" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108160818" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-8547167232507075495-2108160747-6">
<tl f="S" t="p" o="800244" c="S" n="99106"/>
<ar pt="2108160810" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-8364795265993682073-2108160911-6">
<tl f="S" t="p" o="800244" c="S" n="99031"/>
<ar pt="2108160934" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108160938" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-2949440726131702047-2108160858-10">
<tl t="p" o="R0" c="ENO" n="83508"/>
<ar pt="2108160940" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="1763676552526687479-2108160847-6">
<tl f="S" t="p" o="800244" c="S" n="99108"/>
<ar pt="2108160910" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-94442819435724762-2108160916-1">
<tl t="p" o="R0" c="ENO" n="83509"/>
<dp pt="2108160916" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-5296516961807204721-2108160906-5">
<tl f="S" t="p" o="800244" c="S" n="99030"/>
<ar pt="2108160929" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108160934" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="-5076826593111136189-2108160638-20">
<tl f="D" t="p" o="W3" c="WFB" n="95775"/>
<ar pt="2108160915" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108160918" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="8681599812964340829-2108160955-1">
<tl f="S" t="p" o="800244" c="S" n="99109"/>
<dp pt="2108160955" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-735649762452915464-2108160912-6">
<tl f="D" t="p" o="W3" c="WFB" n="95826"/>
<ar pt="2108160944" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108160947" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-2287077818259696863-2108160947-6">
<tl f="S" t="p" o="800244" c="S" n="99110"/>
<ar pt="2108161010" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-7727555432663336240-2108161011-6">
<tl f="S" t="p" o="800244" c="S" n="99033"/>
<ar pt="2108161034" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161038" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-9206541391658417235-2108160958-10">
<tl t="p" o="R0" c="ENO" n="83510"/>
<ar pt="2108161040" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-1174241606353260853-2108161016-1">
<tl t="p" o="R0" c="ENO" n="83511"/>
<dp pt="2108161016" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-7324985626915628890-2108160824-12">
<tl f="D" t="p" o="W3" c="WFB" n="95825"/>
<ar pt="2108161015" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161018" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="244929573019057867-2108161012-6">
<tl f="D" t="p" o="W3" c="WFB" n="95776"/>
<ar pt="2108161044" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161047" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="-3376513334056532423-2108161055-1">
<tl f="S" t="p" o="800244" c="S" n="99111"/>
<dp pt="2108161055" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-8744470103815834345-2108161006-5">
<tl f="S" t="p" o="800244" c="S" n="99032"/>
<ar pt="2108161029" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161034" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="7006118749138032199-2108160838-20">
<tl f="D" t="p" o="W3" c="WFB" n="95777"/>
<ar pt="2108161115" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161118" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-3599955674038290960-2108161047-6">
<tl f="S" t="p" o="800244" c="S" n="99112"/>
<ar pt="2108161110" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-6419712430263017490-2108161058-10">
<tl t="p" o="R0" c="ENO" n="83512"/>
<ar pt="2108161140" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-3222259045572671319-2108161155-1">
<tl f="S" t="p" o="800244" c="S" n="99113"/>
<dp pt="2108161155" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="5972407473007093240-2108161111-6">
<tl f="S" t="p" o="800244" c="S" n="99035"/>
<ar pt="2108161134" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161138" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="6533014172122516634-2108161112-6">
<tl f="D" t="p" o="W3" c="WFB" n="95828"/>
<ar pt="2108161144" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161147" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="4782237501505495785-2108161116-1">
<tl t="p" o="R0" c="ENO" n="83513"/>
<dp pt="2108161116" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="2158701616591342630-2108161106-5">
<tl f="S" t="p" o="800244" c="S" n="99034"/>
<ar pt="2108161129" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161134" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-2379689238391834001-2108161023-12">
<tl f="D" t="p" o="W3" c="WFB" n="95827"/>
<ar pt="2108161215" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161218" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-1121324065844325978-2108161212-6">
<tl f="D" t="p" o="W3" c="WFB" n="95778"/>
<ar pt="2108161244" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161247" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="7397997706155921797-2108161211-6">
<tl f="S" t="p" o="800244" c="S" n="99037"/>
<ar pt="2108161234" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161238" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="4131928373987407668-2108161158-10">
<tl t="p" o="R0" c="ENO" n="83514"/>
<ar pt="2108161240" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-942062361217487173-2108161216-1">
<tl t="p" o="R0" c="ENO" n="83515"/>
<dp pt="2108161216" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-6974622041562609560-2108161206-5">
<tl f="S" t="p" o="800244" c="S" n="99036"/>
<ar pt="2108161229" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161234" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="6022904892453359304-2108161147-6">
<tl f="S" t="p" o="800244" c="S" n="99114"/>
<ar pt="2108161210" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="3669677165128171197-2108161255-1">
<tl f="S" t="p" o="800244" c="S" n="99115"/>
<dp pt="2108161255" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="1839271107440507858-2108161258-10">
<tl t="p" o="R0" c="ENO" n="83516"/>
<ar pt="2108161340" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="6363484950342149752-2108161316-1">
<tl t="p" o="R0" c="ENO" n="83517"/>
<dp pt="2108161316" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="6972591298753273939-2108161306-5">
<tl f="S" t="p" o="800244" c="S" n="99038"/>
<ar pt="2108161329" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161334" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="8991753824982033162-2108161355-1">
<tl f="S" t="p" o="800244" c="S" n="99117"/>
<dp pt="2108161355" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-1273850417038046266-2108161312-6">
<tl f="D" t="p" o="W3" c="WFB" n="95830"/>
<ar pt="2108161344" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161347" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="8517329334682501948-2108161247-6">
<tl f="S" t="p" o="800244" c="S" n="99116"/>
<ar pt="2108161310" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-1057899669668012215-2108161311-6">
<tl f="S" t="p" o="800244" c="S" n="99039"/>
<ar pt="2108161334" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161338" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="1425903371853713152-2108161038-20">
<tl f="D" t="p" o="W3" c="WFB" n="95779"/>
<ar pt="2108161315" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161318" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="4611955095092960007-2108161224-12">
<tl f="D" t="p" o="W3" c="WFB" n="95829"/>
<ar pt="2108161415" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161418" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-3135014020714797396-2108161416-1">
<tl t="p" o="R0" c="ENO" n="83519"/>
<dp pt="2108161416" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-3293102965109218731-2108161358-10">
<tl t="p" o="R0" c="ENO" n="83518"/>
<ar pt="2108161440" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="2878791902132849173-2108161406-5">
<tl f="S" t="p" o="800244" c="S" n="99040"/>
<ar pt="2108161429" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161434" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="-2488337281148762091-2108161411-6">
<tl f="S" t="p" o="800244" c="S" n="99041"/>
<ar pt="2108161434" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161438" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-9040190761468977527-2108161455-1">
<tl f="S" t="p" o="800244" c="S" n="99119"/>
<dp pt="2108161455" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="2321786846951144736-2108161347-6">
<tl f="S" t="p" o="800244" c="S" n="99118"/>
<ar pt="2108161410" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="5842541839645946958-2108161412-6">
<tl f="D" t="p" o="W3" c="WFB" n="95780"/>
<ar pt="2108161443" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161447" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="1767689193739809195-2108161511-6">
<tl f="S" t="p" o="800244" c="S" n="99043"/>
<ar pt="2108161534" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161538" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-3802907293883913443-2108161447-6">
<tl f="S" t="p" o="800244" c="S" n="99120"/>
<ar pt="2108161510" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-4683929219734901736-2108161506-5">
<tl f="S" t="p" o="800244" c="S" n="99042"/>
<ar pt="2108161529" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161534" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="4988481656268886235-2108161238-20">
<tl f="D" t="p" o="W3" c="WFB" n="95781"/>
<ar pt="2108161515" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161518" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="4964097043140910843-2108161516-1">
<tl t="p" o="R0" c="ENO" n="83521"/>
<dp pt="2108161516" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-2721954907811785474-2108161555-1">
<tl f="S" t="p" o="800244" c="S" n="99121"/>
<dp pt="2108161555" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-6815601404651114984-2108161512-6">
<tl f="D" t="p" o="W3" c="WFB" n="95832"/>
<ar pt="2108161544" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161547" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="-1200910621123205769-2108161458-10">
<tl t="p" o="R0" c="ENO" n="83520"/>
<ar pt="2108161540" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="8375696493341006692-2108161612-6">
<tl f="D" t="p" o="W3" c="WFB" n="95782"/>
<ar pt="2108161644" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161647" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="-6844033562588306961-2108161611-6">
<tl f="S" t="p" o="800244" c="S" n="99045"/>
<ar pt="2108161634" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161638" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-8550636124222837939-2108161547-6">
<tl f="S" t="p" o="800244" c="S" n="99122"/>
<ar pt="2108161610" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="3563379797796138412-2108161424-12">
<tl f="D" t="p" o="W3" c="WFB" n="95831"/>
<ar pt="2108161615" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161618" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-1046209332688096315-2108161655-1">
<tl f="S" t="p" o="800244" c="S" n="99123"/>
<dp pt="2108161655" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-2054302951360180473-2108161606-5">
<tl f="S" t="p" o="800244" c="S" n="99044"/>
<ar pt="2108161629" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161634" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="3894388062931543290-2108161616-1">
<tl t="p" o="R0" c="ENO" n="83523"/>
<dp pt="2108161616" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-4732092021760003985-2108161558-10">
<tl t="p" o="R0" c="ENO" n="83522"/>
<ar pt="2108161640" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="9112265633718338636-2108161755-1">
<tl f="S" t="p" o="800244" c="S" n="99125"/>
<dp pt="2108161755" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-1457168968992517383-2108161658-10">
<tl t="p" o="R0" c="ENO" n="83524"/>
<ar pt="2108161740" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-3340822240933892496-2108161706-5">
<tl f="S" t="p" o="800244" c="S" n="99046"/>
<ar pt="2108161729" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161734" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="-6036386918811435216-2108161438-20">
<tl f="D" t="p" o="W3" c="WFB" n="95783"/>
<ar pt="2108161715" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161718" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-7424629400664744183-2108161647-6">
<tl f="S" t="p" o="800244" c="S" n="99124"/>
<ar pt="2108161710" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="4263401729039526569-2108161712-6">
<tl f="D" t="p" o="W3" c="WFB" n="95834"/>
<ar pt="2108161744" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161747" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="4641247587225026942-2108161716-1">
<tl t="p" o="R0" c="ENO" n="83525"/>
<dp pt="2108161716" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="4353911451161478332-2108161711-6">
<tl f="S" t="p" o="800244" c="S" n="99047"/>
<ar pt="2108161734" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161738" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-4161432970801748050-2108161816-1">
<tl t="p" o="R0" c="ENO" n="83527"/>
<dp pt="2108161816" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="3595734209843238192-2108161806-5">
<tl f="S" t="p" o="800244" c="S" n="99048"/>
<ar pt="2108161829" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161834" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="2981307361181102496-2108161811-6">
<tl f="S" t="p" o="800244" c="S" n="99049"/>
<ar pt="2108161834" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161838" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="7606526371432167075-2108161758-10">
<tl t="p" o="R0" c="ENO" n="83526"/>
<ar pt="2108161840" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="3158263065549666682-2108161747-6">
<tl f="S" t="p" o="800244" c="S" n="99126"/>
<ar pt="2108161810" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-7429012022861016920-2108161855-1">
<tl f="S" t="p" o="800244" c="S" n="99127"/>
<dp pt="2108161855" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="502654172913099951-2108161812-6">
<tl f="D" t="p" o="W3" c="WFB" n="95784"/>
<ar pt="2108161844" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161847" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="2683252994559519477-2108161624-12">
<tl f="D" t="p" o="W3" c="WFB" n="95833"/>
<ar pt="2108161815" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161818" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="7793181434569715846-2108161858-10">
<tl t="p" o="R0" c="ENO" n="83528"/>
<ar pt="2108161940" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-8155319653599274990-2108161916-1">
<tl t="p" o="R0" c="ENO" n="83529"/>
<dp pt="2108161916" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="4983472827407508037-2108161955-1">
<tl f="S" t="p" o="800244" c="S" n="99129"/>
<dp pt="2108161955" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="3639552795299979246-2108161638-20">
<tl f="D" t="p" o="W3" c="WFB" n="95785"/>
<ar pt="2108161915" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108161918" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="2332778806583235977-2108161847-6">
<tl f="S" t="p" o="800244" c="S" n="99128"/>
<ar pt="2108161910" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="1148856555558896584-2108161912-6">
<tl f="D" t="p" o="W3" c="WFB" n="95836"/>
<ar pt="2108161944" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108161947" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="-5532477049445256271-2108161906-5">
<tl f="S" t="p" o="800244" c="S" n="99050"/>
<ar pt="2108161929" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108161934" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="4273450929425816477-2108161911-6">
<tl f="S" t="p" o="800244" c="S" n="99051"/>
<ar pt="2108161934" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108161938" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="5006636560290563224-2108162011-6">
<tl f="S" t="p" o="800244" c="S" n="99053"/>
<ar pt="2108162034" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108162038" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="4036630279678935031-2108162055-1">
<tl f="S" t="p" o="800244" c="S" n="99131"/>
<dp pt="2108162055" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="3382247501636548579-2108161958-10">
<tl t="p" o="R0" c="ENO" n="83530"/>
<ar pt="2108162040" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-6990129281608112740-2108161824-12">
<tl f="D" t="p" o="W3" c="WFB" n="95835"/>
<ar pt="2108162015" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108162018" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-4937005316818951728-2108162016-1">
<tl t="p" o="R0" c="ENO" n="83531"/>
<dp pt="2108162016" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="7845084439898423766-2108162006-5">
<tl f="S" t="p" o="800244" c="S" n="99052"/>
<ar pt="2108162029" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108162034" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="601208318005647306-2108162012-6">
<tl f="D" t="p" o="W3" c="WFB" n="95786"/>
<ar pt="2108162044" pp="14" l="RE60" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108162047" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf|Osnabr&#252;ck Altstadt|Ibbenb&#252;ren-Laggenbeck|Ibbenb&#252;ren|Ibbenb&#252;ren-Esch|H&#246;rstel|Rheine"/>
</s>
<s id="-5299438316210197432-2108161947-6">
<tl f="S" t="p" o="800244" c="S" n="99130"/>
<ar pt="2108162010" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-6365543450329300214-2108162058-10">
<tl t="p" o="R0" c="ENO" n="83532"/>
<ar pt="2108162140" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-876254985661224810-2108162112-6">
<tl f="D" t="p" o="W3" c="WFB" n="95838"/>
<ar pt="2108162144" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108162147" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Herford|Bielefeld Hbf"/>
</s>
<s id="1424956062307577167-2108162047-6">
<tl f="S" t="p" o="800244" c="S" n="99132"/>
<ar pt="2108162110" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-7229853211489462088-2108162155-1">
<tl f="S" t="p" o="800244" c="S" n="99133"/>
<dp pt="2108162155" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-1262495492364677508-2108162111-6">
<tl f="S" t="p" o="800244" c="S" n="99055"/>
<ar pt="2108162134" pp="14" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108162138" pp="14" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-2331021216215087320-2108162116-1">
<tl t="p" o="R0" c="ENO" n="83533"/>
<dp pt="2108162116" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-30458462377562293-2108162106-5">
<tl f="S" t="p" o="800244" c="S" n="99054"/>
<ar pt="2108162129" pp="13" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108162134" pp="13" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
<s id="7478530496367099178-2108161838-20">
<tl f="D" t="p" o="W3" c="WFB" n="95787"/>
<ar pt="2108162115" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108162118" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="4697330016557121579-2108162255-1">
<tl f="S" t="p" o="800244" c="S" n="99135"/>
<dp pt="2108162255" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="3132795657593053084-2108162147-6">
<tl f="S" t="p" o="800244" c="S" n="99134"/>
<ar pt="2108162210" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="4622464961095952906-2108162216-1">
<tl t="p" o="R0" c="ENO" n="83535"/>
<dp pt="2108162216" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="4456518626465571419-2108162212-6">
<tl f="D" t="p" o="W3" c="WFB" n="95788"/>
<ar pt="2108162244" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108162247" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|L&#246;hne(Westf)|Kirchlengern|B&#252;nde(Westf)|Melle|Osnabr&#252;ck Hbf"/>
</s>
<s id="-6486755152464856584-2108162211-6">
<tl f="S" t="p" o="800244" c="S" n="99057"/>
<ar pt="2108162234" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108162238" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="-8624610893606997940-2108162024-12">
<tl f="D" t="p" o="W3" c="WFB" n="95837"/>
<ar pt="2108162215" pp="14" l="RE70" ppth="Bielefeld Hbf|Herford|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108162218" pp="14" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-4895514507913038239-2108162158-10">
<tl t="p" o="R0" c="ENO" n="83534"/>
<ar pt="2108162240" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="-7255513921487534258-2108162206-5">
<tl f="S" t="p" o="800244" c="S" n="99056"/>
<ar pt="2108162229" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108162234" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
</timetable>

View File

@@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-2338143139486100041-2108162316-1">
<tl t="p" o="R0" c="ENO" n="83537"/>
<dp pt="2108162316" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="225524803682367536-2108162355-1">
<tl f="S" t="p" o="800244" c="S" n="99137"/>
<dp pt="2108162355" pp="13" l="3" ppth="Ahlten|Hannover Anderten-Misburg|Hannover Karl-Wiechert-Allee|Hannover-Kleefeld|Hannover Hbf"/>
</s>
<s id="-2108753935575260460-2108162247-6">
<tl f="S" t="p" o="800244" c="S" n="99136"/>
<ar pt="2108162310" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="-3319200239513168009-2108162311-6">
<tl f="S" t="p" o="800244" c="S" n="99059"/>
<ar pt="2108162334" pp="13" l="3" ppth="Celle|Ehlershausen|Otze|Burgdorf|Aligse"/>
<dp pt="2108162338" pp="13" l="3" ppth="Sehnde|Algermissen|Harsum|Hildesheim Hbf"/>
</s>
<s id="2998651517533835490-2108162038-20">
<tl f="D" t="p" o="W3" c="WFB" n="95789"/>
<ar pt="2108162315" pp="14" l="RE60" ppth="Rheine|H&#246;rstel|Ibbenb&#252;ren-Esch|Ibbenb&#252;ren|Ibbenb&#252;ren-Laggenbeck|Osnabr&#252;ck Altstadt|Osnabr&#252;ck Hbf|Melle|B&#252;nde(Westf)|Kirchlengern|L&#246;hne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|B&#252;ckeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
<dp pt="2108162318" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="2495224407053131128-2108162258-10">
<tl t="p" o="R0" c="ENO" n="83536"/>
<ar pt="2108162340" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="4731596700926155152-2108162312-6">
<tl f="D" t="p" o="W3" c="WFB" n="95790"/>
<ar pt="2108162344" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108162347" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|B&#252;ckeburg|Minden(Westf)"/>
</s>
<s id="-451319054335837606-2108162306-5">
<tl f="S" t="p" o="800244" c="S" n="99058"/>
<ar pt="2108162329" pp="14" l="3" ppth="Hildesheim Hbf|Harsum|Algermissen|Sehnde"/>
<dp pt="2108162334" pp="14" l="3" ppth="Aligse|Burgdorf|Otze|Ehlershausen|Celle"/>
</s>
</timetable>

View File

@@ -0,0 +1,25 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-2534056427099012540-2108170012-6">
<tl f="D" t="p" o="W3" c="WFB" n="95792"/>
<ar pt="2108170044" pp="14" l="RE70" ppth="Braunschweig Hbf|Vechelde|Peine|V&#246;hrum|H&#228;melerwald"/>
<dp pt="2108170047" pp="14" l="RE70" ppth="Hannover Hbf"/>
</s>
<s id="8693031459340504773-2108162347-6">
<tl f="S" t="p" o="800244" c="S" n="99138"/>
<ar pt="2108170010" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="5845049446990543970-2108170002-10">
<tl t="p" o="R0" c="ENO" n="83538"/>
<ar pt="2108170043" pp="3" l="RE30" ppth="Wolfsburg Hbf|Fallersleben|Calberlah|Gifhorn|Leiferde(b Gifhorn)|Meinersen|Dedenhausen|Dollbergen|Immensen-Arpke"/>
</s>
<s id="1872572738060974975-2108170016-1">
<tl t="p" o="R0" c="ENO" n="83539"/>
<dp pt="2108170016" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
<s id="-430306391697164748-2108170024-2">
<tl f="D" t="p" o="W3" c="WFB" n="95793"/>
<ar pt="2108170044" pp="13" l="RE70" ppth="Hannover Hbf"/>
<dp pt="2108170045" pp="13" l="RE70" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,16 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable station='Lehrte'>
<s id="-1781439465744467581-2108170124-2">
<tl f="D" t="p" o="W3" c="WFB" n="95769"/>
<ar pt="2108170144" pp="14" l="RE60" ppth="Hannover Hbf"/>
<dp pt="2108170145" pp="14" l="RE60" ppth="H&#228;melerwald|V&#246;hrum|Peine|Vechelde|Braunschweig Hbf"/>
</s>
<s id="-5193176993424262202-2108170047-6">
<tl f="S" t="p" o="800244" c="S" n="99098"/>
<ar pt="2108170110" pp="13" l="7" ppth="Hannover Hbf|Hannover-Kleefeld|Hannover Karl-Wiechert-Allee|Hannover Anderten-Misburg|Ahlten"/>
</s>
<s id="5996529048494327209-2108170116-1">
<tl t="p" o="R0" c="ENO" n="83541"/>
<dp pt="2108170116" pp="3" l="RE30" ppth="Immensen-Arpke|Dollbergen|Dedenhausen|Meinersen|Leiferde(b Gifhorn)|Gifhorn|Calberlah|Fallersleben|Wolfsburg Hbf"/>
</s>
</timetable>

View File

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable/>

View File

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<timetable/>