[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:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
@@ -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ü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ürnberg Hbf|Würzburg Hbf|Fulda|Kassel-Wilhelmshöhe|Göttingen" />
|
||||
<dp pt="2110141136" pp="8" ppth="Hamburg-Harburg|Hamburg Hbf|Lü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öttingen|Kassel-Wilhelmshöhe|Frankfurt(Main)Hbf|Mannheim Hbf|Karlsruhe Hbf|Baden-Baden|Freiburg(Breisgau) Hbf|Basel Bad Bf|Basel SBB|Zü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örten-Hardenberg|Gö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üsseldorf Flughafen|Dü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ölksen/Eldagsen|Springe|Bad Mü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ünder(Deister)|Springe|Vö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üß|Eschede|Celle|Groß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übenberge|Nienburg(Weser)|Eystrup|Dö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ü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öthen|Magdeburg Hbf|Braunschweig Hbf" />
|
||||
<dp pt="2110141140" pp="11"
|
||||
ppth="Minden(Westf)|Herford|Bielefeld Hbf|Gütersloh Hbf|Hamm(Westf)Hbf|Hagen Hbf|Wuppertal Hbf|Solingen Hbf|Kö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ö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ümmer|Wunstorf|Haste|Lindhorst(Schaumb-Lippe)|Stadthagen|Kirchhorsten|Bü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üneburg|Uelzen|Celle" />
|
||||
<dp pt="2110141201" pp="4"
|
||||
ppth="Göttingen|Kassel-Wilhelmshöhe|Treysa|Marburg(Lahn)|Gieß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ü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öttingen|Nö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öhne(Westf)|Bad Oeynhausen|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf" />
|
||||
<dp pt="2110141155" pp="9" l="RE70" ppth="Lehrte|Hämelerwald|Vö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ückeburg|Kirchhorsten|Stadthagen|Lindhorst(Schaumb-Lippe)|Haste|Wunstorf|Dedensen-Gü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öttingen|Kassel-Wilhelmshöhe|Fulda|Würzburg Hbf|Augsburg Hbf|Mü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öhrum|Hä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ü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ölksen/Eldagsen|Springe|Bad Münder(Deister)|Hameln|Emmerthal|Bad Pyrmont|Lü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ürnberg Hbf|Würzburg Hbf|Fulda|Kassel-Wilhelmshöhe|Gö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öhe|Gö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örverden|Eystrup|Nienburg(Weser)|Neustadt am Rü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ßen|Marburg(Lahn)|Treysa|Wabern(Bz Kassel)|Kassel-Wilhelmshöhe|Göttingen" />
|
||||
<dp pt="2110141159" pp="8" ppth="Celle|Uelzen|Lü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öhrum|Hämelerwald|Lehrte" />
|
||||
<dp pt="2110141109" pp="12" l="RE60"
|
||||
ppth="Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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ü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ü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ämelerwald|Vö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ö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ö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ü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ügde|Bad Pyrmont|Emmerthal|Hameln|Bad Münder(Deister)|Springe|Vö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ümmer|Wunstorf|Poggenhagen|Neustadt am Rü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übenberge|Poggenhagen|Wunstorf|Dedensen-Gü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üsseldorf Hbf|Dü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ßburgwedel|Celle|Eschede|Unterlüß|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>
|
||||
@@ -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ück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108160718" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108160747" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108160847" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108160818" pp="14" l="RE70" ppth="Hämelerwald|Vö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>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108160918" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108160947" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Herford|Bielefeld Hbf"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161018" pp="14" l="RE70" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161047" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161118" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161147" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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>
|
||||
@@ -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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161218" pp="14" l="RE70" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161247" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161347" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161318" pp="14" l="RE60" ppth="Hämelerwald|Vöhrum|Peine|Vechelde|Braunschweig Hbf"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161418" pp="14" l="RE70" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161447" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hörstel|Rheine"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161518" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161547" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161647" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161618" pp="14" l="RE70" ppth="Hämelerwald|Vö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>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161718" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161747" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161847" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161818" pp="14" l="RE70" ppth="Hämelerwald|Vöhrum|Peine|Vechelde|Braunschweig Hbf"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108161918" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108161947" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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>
|
||||
@@ -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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108162018" pp="14" l="RE70" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108162047" pp="14" l="RE60" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrück Hbf|Osnabrück Altstadt|Ibbenbüren-Laggenbeck|Ibbenbüren|Ibbenbüren-Esch|Hö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>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108162147" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Lö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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108162118" pp="14" l="RE60" ppth="Hämelerwald|Vöhrum|Peine|Vechelde|Braunschweig Hbf"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108162247" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bückeburg|Minden(Westf)|Porta Westfalica|Bad Oeynhausen|Löhne(Westf)|Kirchlengern|Bünde(Westf)|Melle|Osnabrü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öhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108162218" pp="14" l="RE70" ppth="Hämelerwald|Vö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>
|
||||
@@ -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örstel|Ibbenbüren-Esch|Ibbenbüren|Ibbenbüren-Laggenbeck|Osnabrück Altstadt|Osnabrück Hbf|Melle|Bünde(Westf)|Kirchlengern|Löhne(Westf)|Bad Oeynhausen|Porta Westfalica|Minden(Westf)|Bückeburg|Stadthagen|Haste|Wunstorf|Hannover Hbf"/>
|
||||
<dp pt="2108162318" pp="14" l="RE60" ppth="Hämelerwald|Vö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öhrum|Hämelerwald"/>
|
||||
<dp pt="2108162347" pp="14" l="RE70" ppth="Hannover Hbf|Wunstorf|Haste|Stadthagen|Bü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>
|
||||
@@ -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öhrum|Hä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ämelerwald|Vöhrum|Peine|Vechelde|Braunschweig Hbf"/>
|
||||
</s>
|
||||
</timetable>
|
||||
@@ -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ämelerwald|Vö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>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<timetable/>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<timetable/>
|
||||
Reference in New Issue
Block a user