diff --git a/doc-templates/VehicleParking.md b/doc-templates/VehicleParking.md
index 5d149e40f9a..507894b97e8 100644
--- a/doc-templates/VehicleParking.md
+++ b/doc-templates/VehicleParking.md
@@ -48,6 +48,15 @@ All updaters have the following parameters in common:
+## SIRI-FM
+
+The SIRI-FM updaters works slighly differently from the other in that it only updates the availability
+of parking but does not create new lots in realtime.
+
+The data source must conform to the [Italian SIRI-FM](https://github.com/noi-techpark/sta-nap-export/files/15302688/240502_SpecificaSIRI_v.1.0.3.pdf) profile.
+
+
+
## Changelog
- Create initial sandbox implementation (January 2022, [#3796](https://github.com/opentripplanner/OpenTripPlanner/pull/3796))
diff --git a/docs/RouterConfiguration.md b/docs/RouterConfiguration.md
index a3042e7b91f..0f91875e542 100644
--- a/docs/RouterConfiguration.md
+++ b/docs/RouterConfiguration.md
@@ -875,6 +875,12 @@ Used to group requests when monitoring OTP.
"feedId" : "bikeep",
"sourceType" : "bikeep",
"url" : "https://services.bikeep.com/location/v1/public-areas/no-baia-mobility/locations"
+ },
+ {
+ "type" : "vehicle-parking",
+ "feedId" : "parking",
+ "sourceType" : "siri-fm",
+ "url" : "https://transmodel.api.opendatahub.com/siri-lite/fm/parking"
}
],
"rideHailingServices" : [
diff --git a/docs/sandbox/VehicleParking.md b/docs/sandbox/VehicleParking.md
index ae83dba2b41..06f520b0972 100644
--- a/docs/sandbox/VehicleParking.md
+++ b/docs/sandbox/VehicleParking.md
@@ -55,7 +55,7 @@ All updaters have the following parameters in common:
The id of the data source, which will be the prefix of the parking lot's id.
-This will end up in the API responses as the feed id of of the parking lot.
+This will end up in the API responses as the feed id of the parking lot.
sourceType
@@ -125,7 +125,7 @@ Used for converting abstract opening hours into concrete points in time.
The id of the data source, which will be the prefix of the parking lot's id.
-This will end up in the API responses as the feed id of of the parking lot.
+This will end up in the API responses as the feed id of the parking lot.
sourceType
@@ -210,7 +210,7 @@ Tags to add to the parking lots.
The id of the data source, which will be the prefix of the parking lot's id.
-This will end up in the API responses as the feed id of of the parking lot.
+This will end up in the API responses as the feed id of the parking lot.
sourceType
@@ -275,7 +275,7 @@ HTTP headers to add to the request. Any header key, value can be inserted.
The id of the data source, which will be the prefix of the parking lot's id.
-This will end up in the API responses as the feed id of of the parking lot.
+This will end up in the API responses as the feed id of the parking lot.
sourceType
@@ -336,7 +336,7 @@ HTTP headers to add to the request. Any header key, value can be inserted.
The id of the data source, which will be the prefix of the parking lot's id.
-This will end up in the API responses as the feed id of of the parking lot.
+This will end up in the API responses as the feed id of the parking lot.
sourceType
@@ -373,6 +373,85 @@ HTTP headers to add to the request. Any header key, value can be inserted.
+## SIRI-FM
+
+The SIRI-FM updaters works slighly differently from the other in that it only updates the availability
+of parking but does not create new lots in realtime.
+
+The data source must conform to the [Italian SIRI-FM](https://github.com/noi-techpark/sta-nap-export/files/15302688/240502_SpecificaSIRI_v.1.0.3.pdf) profile.
+
+
+
+
+| Config Parameter | Type | Summary | Req./Opt. | Default Value | Since |
+|----------------------------------|:---------------:|------------------------------------------------------------------------------|:----------:|---------------|:-----:|
+| type = "vehicle-parking" | `enum` | The type of the updater. | *Required* | | 1.5 |
+| [feedId](#u__15__feedId) | `string` | The id of the data source, which will be the prefix of the parking lot's id. | *Required* | | 2.2 |
+| frequency | `duration` | How often to update the source. | *Optional* | `"PT1M"` | 2.6 |
+| [sourceType](#u__15__sourceType) | `enum` | The source of the vehicle updates. | *Required* | | 2.2 |
+| [url](#u__15__url) | `uri` | URL of the SIRI-FM Light endpoint. | *Required* | | 2.6 |
+| [headers](#u__15__headers) | `map of string` | HTTP headers to add to the request. Any header key, value can be inserted. | *Optional* | | 2.6 |
+
+
+#### Details
+
+feedId
+
+**Since version:** `2.2` ∙ **Type:** `string` ∙ **Cardinality:** `Required`
+**Path:** /updaters/[15]
+
+The id of the data source, which will be the prefix of the parking lot's id.
+
+This will end up in the API responses as the feed id of the parking lot.
+
+sourceType
+
+**Since version:** `2.2` ∙ **Type:** `enum` ∙ **Cardinality:** `Required`
+**Path:** /updaters/[15]
+**Enum values:** `park-api` | `bicycle-park-api` | `hsl-park` | `bikely` | `noi-open-data-hub` | `bikeep` | `siri-fm`
+
+The source of the vehicle updates.
+
+url
+
+**Since version:** `2.6` ∙ **Type:** `uri` ∙ **Cardinality:** `Required`
+**Path:** /updaters/[15]
+
+URL of the SIRI-FM Light endpoint.
+
+SIRI Light means that it must be available as a HTTP GET request rather than the usual
+SIRI request mechanism of HTTP POST.
+
+The contents must also conform to the [Italian SIRI profile](https://github.com/noi-techpark/sta-nap-export/files/15302688/240502_SpecificaSIRI_v.1.0.3.pdf).
+
+
+
+
+**Since version:** `2.6` ∙ **Type:** `map of string` ∙ **Cardinality:** `Optional`
+**Path:** /updaters/[15]
+
+HTTP headers to add to the request. Any header key, value can be inserted.
+
+
+
+##### Example configuration
+
+```JSON
+// router-config.json
+{
+ "updaters" : [
+ {
+ "type" : "vehicle-parking",
+ "feedId" : "parking",
+ "sourceType" : "siri-fm",
+ "url" : "https://transmodel.api.opendatahub.com/siri-lite/fm/parking"
+ }
+ ]
+}
+```
+
+
+
## Changelog
- Create initial sandbox implementation (January 2022, [#3796](https://github.com/opentripplanner/OpenTripPlanner/pull/3796))
diff --git a/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/VehicleParkingUpdaterConfig.java b/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/VehicleParkingUpdaterConfig.java
index 6ef8c465bc3..60f794f2f2a 100644
--- a/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/VehicleParkingUpdaterConfig.java
+++ b/src/main/java/org/opentripplanner/standalone/config/routerconfig/updaters/VehicleParkingUpdaterConfig.java
@@ -30,7 +30,7 @@ public static VehicleParkingUpdaterParameters create(String updaterRef, NodeAdap
.of("feedId")
.since(V2_2)
.summary("The id of the data source, which will be the prefix of the parking lot's id.")
- .description("This will end up in the API responses as the feed id of of the parking lot.")
+ .description("This will end up in the API responses as the feed id of the parking lot.")
.asString();
return switch (sourceType) {
case HSL_PARK -> new HslParkUpdaterParameters(
@@ -103,7 +103,19 @@ public static VehicleParkingUpdaterParameters create(String updaterRef, NodeAdap
);
case SIRI_FM -> new SiriFmUpdaterParameters(
updaterRef,
- c.of("url").since(V2_6).summary("URL of the SIRI-FM Light endpoint.").asUri(),
+ c
+ .of("url")
+ .since(V2_6)
+ .summary("URL of the SIRI-FM Light endpoint.")
+ .description(
+ """
+ SIRI Light means that it must be available as a HTTP GET request rather than the usual
+ SIRI request mechanism of HTTP POST.
+
+ The contents must also conform to the [Italian SIRI profile](https://github.com/noi-techpark/sta-nap-export/files/15302688/240502_SpecificaSIRI_v.1.0.3.pdf).
+ """
+ )
+ .asUri(),
feedId,
c
.of("frequency")
diff --git a/src/test/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingAvailabilityUpdaterTest.java b/src/test/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingAvailabilityUpdaterTest.java
index 713b6d01664..0af58378f90 100644
--- a/src/test/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingAvailabilityUpdaterTest.java
+++ b/src/test/java/org/opentripplanner/updater/vehicle_parking/VehicleParkingAvailabilityUpdaterTest.java
@@ -81,6 +81,7 @@ void updateBicycleAvailability() {
assertEquals(8, updated.getAvailability().getBicycleSpaces());
assertNull(updated.getAvailability().getCarSpaces());
}
+
@Test
void notFound() {
var service = buildParkingService(VehicleParkingSpaces.builder().bicycleSpaces(15).build());
diff --git a/src/test/resources/standalone/config/router-config.json b/src/test/resources/standalone/config/router-config.json
index 3a3ef9b4cf0..c526de423c1 100644
--- a/src/test/resources/standalone/config/router-config.json
+++ b/src/test/resources/standalone/config/router-config.json
@@ -438,6 +438,13 @@
"feedId": "bikeep",
"sourceType": "bikeep",
"url": "https://services.bikeep.com/location/v1/public-areas/no-baia-mobility/locations"
+ },
+ // SIRI-FM vehicle parking updater
+ {
+ "type": "vehicle-parking",
+ "feedId": "parking",
+ "sourceType": "siri-fm",
+ "url": "https://transmodel.api.opendatahub.com/siri-lite/fm/parking"
}
],
"rideHailingServices": [