TCMF Handbook Help

Some extensions of usage

Below are a few examples of how TCMF can be used to express fuel level and emission data The above port call in Actual Arrival can be wrapped in a service, which commences when the ship arrives at 7:48:

{ "payload": { "@type": "ServiceState", "comment": "Time from Column F", "timeType": "actual", "referenceObject": "tcmf:reference_object:ship:name:SCA OBBOLA", "service": "tcmf:service:ship:portcall_id:grieg:1556", "timeSequence": "commenced", "time": "2023-09-01T07:48:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-01T07:48:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

The service completes when the ship departs at 19:20:

{ "payload": { "@type": "ServiceState", "comment": "Time from Column F", "timeType": "actual", "referenceObject": "tcmf:reference_object:ship:name:SCA OBBOLA", "service": "tcmf:service:ship:portcall_id:grieg:1556", "timeSequence": "completed", "time": "2023-09-01T19:20:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-01T19:23:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

This is based on Actual Departure

Fuel usage

We can then reference the service with levels of fuel at both ends

{ "payload": { "@type": "AttributeState", "comment": "Made up", "timeType": "actual", "referenceObject": "tcmf:service:ship:portcall_id:grieg:1556:commenced", "attribute": "tcmf:attribute:ship:fuel_level:diesel:8543", "timeSequence": "set", "time": "2023-09-01T07:48:00.000Z", "location": "tcmf:location:port:SEUME" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:24bc2737-6500-4a5f-a197-950377d1e0b6", "reportedAt": "2023-09-01T07:48:52.100Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }
{ "payload": { "@type": "AttributeState", "comment": "Made up", "timeType": "actual", "referenceObject": "tcmf:service:ship:portcall_id:grieg:1556:completed", "attribute": "tcmf:attribute:ship:fuel_level:diesel:8513", "timeSequence": "set", "time": "2023-09-01T07:48:00.000Z", "location": "tcmf:location:port:SEUME" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:24bc2737-6500-4a5f-a197-950377d1e0b6", "reportedAt": "2023-09-01T07:48:52.100Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

From these two messages, it can be calculated that the ship performing port call 1556 has used 30 tons (8543-8513) of diesel during the port call.

Emissions

Assuming there is a counter, keeping track of emmission volumes, similar to how we use electricity or gas meters, we can do the same with emissions.

{ "payload": { "@type": "AttributeState", "comment": "Made up", "timeType": "actual", "referenceObject": "tcmf:service:ship:portcall_id:grieg:1556:commenced", "attribute": "tcmf:attribute:ship:emissions:co2:192356", "timeSequence": "set", "time": "2023-09-01T07:48:00.000Z", "location": "tcmf:location:port:SEUME" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:24bc2737-6500-4a5f-a197-950377d1e0b6", "reportedAt": "2023-09-01T07:48:52.100Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }
{ "payload": { "@type": "AttributeState", "comment": "Made up", "timeType": "actual", "referenceObject": "tcmf:service:ship:portcall_id:grieg:1556:completed", "attribute": "tcmf:attribute:ship:emissions:co2:192449", "timeSequence": "set", "time": "2023-09-01T19:20:00.000Z", "location": "tcmf:location:port:SEUME" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:24bc2737-6500-4a5f-a197-950377d1e0b6", "reportedAt": "2023-09-01T19:20:52.100Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

Again, we can use these two messages to calculate that the emmission of co² was 93 tons

Finalisation of planned activities

With the above port call, 1556, let us plan a service cargo operations. To uniquely identify this instance of the service, we can use the service and reference_object, assuming there is only onw instance of cargo operations for a single port call. Our first plan is to start cargo operations at 7:32

{ "payload": { "@type": "ServiceState", "comment": "Time from Column D with some margin", "timeType": "planned", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "timeSequence": "commenced", "time": "2023-09-01T07:32:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-08-01T07:48:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

Some time later, we get an updated plan to begin cargo operations at 7:42

{ "payload": { "@type": "ServiceState", "comment": "Time from Column D in a later version of the file, with some margin", "timeType": "planned", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "timeSequence": "commenced", "time": "2023-09-01T07:42:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-08-21T19:23:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

To finalise the planning, blocking further changes to the plan, we confirm the plan

{ "payload": { "@type": "AdministrativeState", "timeSequence": "confirmed", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "time": "2023-09-01T07:42:00.000Z" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-08-29T11:52:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.7" }

Extension of format

To enable better tracking of operational parameters, we need a more granular way of describing an activity, service in TCMF lingo, than commenced and completed. One such example is when cargo operations span more than one working day and there is a need to track the actual time cargo operations are actively performed. For this purpose, it has been suggested that we introduce two more values for time sequence in ServiceState messages, paused and resumed.

Please be aware that the following examples show a proposed extension of TCMF

As an example, we have cargo operations commencing on 2023-09-01 at 12:00 and completing on 2023-09-03 at 14:30. As we have already shown how this would be expressed in TCMF, it is not shown here. With working hours being between 9:00 and 15:00 with a break between 11:00 and 12:00, cargo operations will temporarily halt accordingly.

{ "payload": { "@type": "ServiceState", "comment": "Proposed extension", "timeType": "actual", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "timeSequence": "paused", "time": "2023-09-01T14:52:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-01T14:53:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.8?" }
{ "payload": { "@type": "ServiceState", "comment": "Proposed extension", "timeType": "actual", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "timeSequence": "resumed", "time": "2023-09-02T09:02:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-02T09:03:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.8?" }
{ "payload": { "@type": "ServiceState", "comment": "Proposed extension", "timeType": "actual", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations", "timeSequence": "paused", "time": "2023-09-02T10:53:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-02T10:55:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.8?" }
{ "payload": { "@type": "ServiceState", "comment": "Proposed extension", "timeType": "actual", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations:1556", "timeSequence": "resumed", "time": "2023-09-02T12:02:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-02T12:04:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.8?" }

Hierarchical services

We could add a field in service state messages that makes it part of another service. Port_visit can contain Mooring_operations, identified by adding the field isPartOf: servide identifier to the Mooring_operations messages

{ "payload": { "@type": "ServiceState", "comment": "Proposed extension", "timeType": "actual", "referenceObject": "tcmf:reference_object:portcall_id:grieg:1556", "service": "tcmf:service:cargo_operations:1556a", "isPartOf": "tcmf:service:cargo_operations:1556", "timeSequence": "resumed", "time": "2023-09-02T12:02:00.000Z", "location": "tcmf:location:port:SEUME:Södra Kajen" }, "grouping": [ "tcmf:grouping:ship:name:SCA OBBOLA", "tcmf:grouping:ship:portcall_id:1556", "tcmf:grouping:equipment:stacker:seume:3" ], "messageId": "tcmf:message:b2734285-0e34-4e7e-89b5-3a8db99d67c2", "reportedAt": "2023-09-02T12:04:00.000Z", "reportedBy": "tcmf:user:grieg", "version": "0.0.8?" }

Coordinate based locations

Locations are, generally, based on identities within specific domains. A quay in the port of Umeå can be referred like this:

"location": "tcmf:location:port:SEUME:Södra Kajen"

To accommodate geographically defined locations, a domain for coordinate based location identifiers can be used. Within this domain, we specify which object type (point, linestring, polygon as defined in WKT) and the reference system, followed by coordinates according to the object type and reference system

"location": "tcmf:location:coordinate:point:wgs84:63.5133,20.8129"

The above location describes a point halfway between Vasa in Finland and Umeå in Sweden. This extension would not require a schema change, but needs documentation to establish good conventions

Last modified: 11 March 2025