OCPP 1.6 Explained: BootNotification, Heartbeat, StartTransaction, ReserveNow, TriggerMessage and EV Charging Station Integration

As electric vehicle (EV) adoption continues to accelerate worldwide, interoperability between charging stations and charging management platforms has become a critical requirement. The Open Charge Point Protocol (OCPP) was created to solve this challenge by providing a standardized communication protocol between charging stations and central management systems.

Whether you are developing a Charge Point Operator (CPO) platform, integrating charging stations from multiple vendors, or troubleshooting communication issues with chargers such as Teltonika TeltoCharge, understanding OCPP is essential.

This article explains the fundamentals of OCPP 1.6, the most commonly deployed version today, and covers important concepts including BootNotification, Heartbeat, StartTransaction, ReserveNow, TriggerMessage, Remote Start, Remote Stop, and charging session simulation.


What is OCPP?

OCPP (Open Charge Point Protocol) is an open communication standard that enables electric vehicle charging stations (Charge Points) to communicate with a backend platform called a Central System or Central Management System (CMS).

Without OCPP, each charging station manufacturer would require its own proprietary management software.

With OCPP, a charging station from one manufacturer can communicate with a management platform developed by another vendor.

Benefits include:

  • Vendor independence
  • Easier charger management
  • Remote diagnostics
  • Smart charging capabilities
  • Transaction management
  • Firmware updates
  • Reservation management
  • Real-time monitoring

OCPP 1.6 Architecture

An OCPP 1.6 deployment consists of two primary components:

Charge Point (CP)

The physical EV charging station installed in the field.

Examples:

  • Teltonika TeltoCharge
  • ABB Terra
  • Alfen chargers
  • Wallbox chargers
  • EVBox stations

Central System (CSMS/CMS)

The backend platform responsible for:

  • Monitoring chargers
  • Starting and stopping charging sessions
  • Managing users
  • Processing transactions
  • Collecting meter values
  • Performing diagnostics

Communication is usually established over WebSockets.

Example connection:

wss://ocpp.example.com/CentralSystemService/CP001

OCPP Message Format

OCPP 1.6 uses JSON arrays.

CALL Message

Request sent by one side:

[
  2,
  "123",
  "Heartbeat",
  {}
]

Where:

ElementMeaning
2Message Type (CALL)
123Unique Message ID
HeartbeatAction
{}Payload

CALLRESULT Message

Successful response:

[
  3,
  "123",
  {
    "currentTime":"2026-06-07T10:00:00Z"
  }
]

CALLERROR Message

Error response:

[
  4,
  "123",
  "NotImplemented",
  "Action not supported",
  {}
]

BootNotification

The first message sent by a charging station after connecting to the Central System.

Example from a Teltonika TeltoCharge charger:

[
  2,
  "3",
  "BootNotification",
  {
    "chargePointModel":"TeltoCharge_EVC1010P",
    "chargePointVendor":"Teltonika Energy",
    "chargePointSerialNumber":"6000165377",
    "firmwareVersion":"v1.10.9"
  }
]

The Central System should respond:

[
  3,
  "3",
  {
    "status":"Accepted",
    "currentTime":"2026-06-07T12:00:00Z",
    "interval":300
  }
]

The interval indicates how frequently Heartbeat messages should be sent.


Heartbeat

Heartbeat messages keep the connection alive and synchronize the charger’s clock.

Request:

[
  2,
  "10",
  "Heartbeat",
  {}
]

Response:

[
  3,
  "10",
  {
    "currentTime":"2026-06-07T12:00:00Z"
  }
]

Heartbeats are essential because:

  • They verify connectivity.
  • They synchronize timestamps.
  • They allow backend systems to detect offline chargers.

Authorize

Before charging starts, many stations request authorization.

Request:

[
  2,
  "20",
  "Authorize",
  {
    "idTag":"ABC123"
  }
]

Response:

[
  3,
  "20",
  {
    "idTagInfo":{
      "status":"Accepted"
    }
  }
]

StartTransaction

A common misconception is that the Central System initiates a StartTransaction request.

In OCPP 1.6, StartTransaction is normally sent by the Charge Point to the Central System after:

  1. An EV is connected.
  2. Authorization succeeds.
  3. Charging begins.

Example:

[
  2,
  "30",
  "StartTransaction",
  {
    "connectorId":1,
    "idTag":"ABC123",
    "meterStart":1000,
    "timestamp":"2026-06-07T12:05:00Z"
  }
]

Response:

[
  3,
  "30",
  {
    "transactionId":12345,
    "idTagInfo":{
      "status":"Accepted"
    }
  }
]

The transaction ID returned by the backend uniquely identifies the charging session.


RemoteStartTransaction

If you want to start charging from the backend, the correct OCPP command is not StartTransaction.

The Central System must send:

[
  2,
  "40",
  "RemoteStartTransaction",
  {
    "idTag":"ABC123",
    "connectorId":1
  }
]

Response:

[
  3,
  "40",
  {
    "status":"Accepted"
  }
]

The charging station then decides whether charging can actually begin.


StopTransaction

When charging ends, the charger sends:

[
  2,
  "50",
  "StopTransaction",
  {
    "transactionId":12345,
    "meterStop":1350,
    "timestamp":"2026-06-07T13:00:00Z"
  }
]

Response:

[
  3,
  "50",
  {
    "idTagInfo":{
      "status":"Accepted"
    }
  }
]

ReserveNow

ReserveNow allows a charging connector to be reserved for a specific user.

Request:

[
  2,
  "60",
  "ReserveNow",
  {
    "connectorId":1,
    "expiryDate":"2026-06-07T14:00:00Z",
    "idTag":"ABC123",
    "reservationId":1001
  }
]

Response:

[
  3,
  "60",
  {
    "status":"Accepted"
  }
]

Possible statuses include:

  • Accepted
  • Faulted
  • Occupied
  • Rejected
  • Unavailable

TriggerMessage

TriggerMessage allows the backend to request that a charger immediately send a specific message.

Common use cases:

  • Force a Heartbeat
  • Force a StatusNotification
  • Force a MeterValues report
  • Force a BootNotification

Example:

[
  2,
  "70",
  "TriggerMessage",
  {
    "requestedMessage":"Heartbeat"
  }
]

Response:

[
  3,
  "70",
  {
    "status":"Accepted"
  }
]

After acceptance, the charger sends the requested message.


Simulating a Charging Session

Many developers want to verify that a charger is operational without physically plugging in an EV.

Typical test sequence:

  1. Charger connects.
  2. BootNotification.
  3. Heartbeat.
  4. StatusNotification (Available).
  5. RemoteStartTransaction.
  6. Charger accepts.
  7. EV plugs in.
  8. StartTransaction.
  9. MeterValues.
  10. StopTransaction.

Important:

Most chargers, including Teltonika TeltoCharge devices, will not generate a StartTransaction simply because the backend requests it. The charger must detect a valid charging condition such as:

  • Connected vehicle
  • Successful authorization
  • Pilot signal state
  • Energy transfer initiation

Therefore, if a charger responds with “NotImplemented” or refuses a transaction, it may indicate that the requested operation is unsupported or that physical charging conditions have not been met.


Understanding “NotImplemented” Errors

A common OCPP error response is:

[
  4,
  "123",
  "NotImplemented",
  "Action not supported",
  {}
]

Possible causes:

  • Unsupported OCPP feature.
  • Vendor-specific limitation.
  • Incorrect message format.
  • Unsupported optional profile.
  • Invalid direction of the message.

For example:

  • StartTransaction is CP → CS.
  • RemoteStartTransaction is CS → CP.

Sending StartTransaction from the backend to the charger may result in an error because that action is defined in the opposite direction.


OCPP Profiles in Version 1.6

OCPP 1.6 supports several functional profiles:

Core Profile

  • BootNotification
  • Heartbeat
  • Authorize
  • StartTransaction
  • StopTransaction

Firmware Management

  • UpdateFirmware
  • FirmwareStatusNotification

Reservation Profile

  • ReserveNow
  • CancelReservation

Remote Trigger Profile

  • TriggerMessage

Smart Charging Profile

  • SetChargingProfile
  • ClearChargingProfile

Remote Trigger Profile

  • RemoteStartTransaction
  • RemoteStopTransaction

Teltonika TeltoCharge and OCPP 1.6

Teltonika TeltoCharge charging stations support OCPP 1.6 JSON communication and can integrate with third-party backend systems.

Typical OCPP interactions include:

  • BootNotification
  • Heartbeat
  • StatusNotification
  • Authorize
  • StartTransaction
  • StopTransaction
  • MeterValues
  • RemoteStartTransaction
  • RemoteStopTransaction

When integrating TeltoCharge devices, always verify the specific firmware version and supported OCPP profiles, as supported features may vary between firmware releases.


Conclusion

OCPP 1.6 remains the dominant protocol for EV charging infrastructure worldwide. Understanding messages such as BootNotification, Heartbeat, Authorize, StartTransaction, ReserveNow, TriggerMessage, and RemoteStartTransaction is essential for anyone developing or integrating charging management platforms.

When working with chargers such as the Teltonika TeltoCharge series, understanding the direction of OCPP messages and the distinction between charger-initiated and backend-initiated operations can prevent many integration issues and significantly reduce troubleshooting time.

A well-designed OCPP implementation enables reliable charger management, seamless interoperability, and scalable EV charging infrastructure for the future.

This article is inspired by real-world challenges we tackle in our projects. If you're looking for expert solutions or need a team to bring your idea to life,

Let's talk!

    Please fill your details, and we will contact you back

      Please fill your details, and we will contact you back