EvseManager

EVSE Manager. Grid side power meter: Will be used for energy management. Will also be used for billing if no car side power meter connected. Car side powermeter: Will be used for billing if present.

Handwritten Documentation

The module EvseManager is a central module that manages one EVSE (i.e. one connector to charge a car). It may control multiple physical connectors if they are not usable at the same time and share one connector id, but one EvseManager always shows as one connector in OCPP for example. So in general each connector should have a dedicated EvseManager module loaded.

The EvseManager contains the high level charging logic (Basic charging and HLC/SLAC interaction), collects all relevant data for the charging session (e.g. energy delivered during this charging session) and provides control over the charging port/session. For HLC it uses two helper protocol modules that it controls (SLAC and ISO15118).

Protocol modules such as OCPP or other APIs use EvseManagers to control the charging session and get all relevant data.

The following charge modes are supported:

  • AC charging: Basic Charging according to IEC61851/SAE J1772 and HLC according to ISO15118-2

  • DC charging: ISO15118-2 and DIN SPEC 70121

Additional features:

  • Autocharge support (PnC coming soon)

  • Seamlessly integrates into EVerest Energy Management

  • The lowest level IEC61851 state machine can be run on a dedicated microcontroller for improved electrical safety

  • Support for seperate AC and DC side metering in DC application

Typical connections

TODO: AC and DC module graphs and description

AC Configuration

DC Configuration

In DC applications, the EvseManager still has an AC side that behaves similar to a normal AC charger. The board_support module therefore still has to report AC capabilities which refer to the AC input of the AC/DC power supply. If an AC side RCD is used it also belongs to the board_support driver. An AC side power meter can be connected and it will be used for Energy management.

In addition, on the DC side the following hardware modules can be connected:

  • A DC powermeter: This will be used for billing purposes if present. If not connected, billing will fall back to the AC side power meter.

  • Isolation monitoring: This will be used to monitor isolation during CableCheck, PreCharge and CurrentDemand steps.

  • DC power supply: This is the AC/DC converter that actually charges the car.

Software over-voltage supervision is always active during DC charging. The configuration option internal_over_voltage_duration_ms defines for how long the measured DC voltage must exceed the negotiated limit before EvseManager raises MREC5OverVoltage. Set it to 0 to trigger immediately once the threshold is crossed.

Software over-voltage supervision is always active during DC charging. The configuration option internal_over_voltage_duration_ms defines for how long the measured DC voltage must exceed the negotiated limit before EvseManager raises MREC5OverVoltage. Set it to 0 to trigger immediately once the threshold is crossed.

Published variables

session_events

EvseManager publishes the session_events variable whenever an event happens. It does not publish its internal state but merely events that happen that can be used to drive an state machine within another module.

Example: Write a simple module that lights up an LED if the evse is reserved. This module requires an EvseManager and subscribes to the session_events variable. Internally it has only two states: Reserved (LED on), NotReserved (LED off).

The state machine transitions are driven by the two events from EvseManager: ReservationStart and ReservationEnd.

All other events are ignored in this module as they are not needed.

powermeter

EvseManager republishes the power meter struct that if it has a powermeter connected. This struct should be used for OCPP and display purposes. It comes from the power meter that can be used for billing (DC side on DC, AC side on AC). If no powermeter is connected EvseManager will never publish this variable.

Authentication

The Auth modules validates tokens and assignes tokens to EvseManagers, see Auth documentation. It will call Authorize(id_tag, pnc) on EvseManager to indicated that the EvseManager may start the charging session. Auth module may revoke authorization (withdraw_authorization command) if the charging session has not begun yet (typically due to timeout), but not once charging has started.

Autocharge / PnC

Autocharge is fully supported, PnC support is coming soon and will use the same logic. The car itself is a token provider that can provide an auth token to be validated by the Auth system (see Auth documentation for more details). EvseManager provides a token_provider interface for that purpose.

If external identification (EIM) is used in HLC (no PnC) then Autocharge is enabled by connecting the token_provider interface to Auth module. When the car sends its EVCCID in the HLC protocol it is converted to Autocharge format and published as Auth token. It is based on the following specification:

https://github.com/openfastchargingalliance/openfastchargingalliance/blob/master/autocharge-final.pdf

To enable PnC the config option payment_enable_contract must be set to true. If the car selects Contract instead of EIM PnC will be used instead of Autocharge.

Reservation

Reservation handling logic is implemented in the Auth module. If the Auth module wants to reserve a specific EvseManager (or cancel the reservation) it needs to call the reserve/cancel_reservation commands. EvseManager does not check reservation id against the token id when it should start charging, this must be handled in Auth module. EvseManager only needs to know whether it is reserved or not to emit an ReservatonStart/ReservationEnd event to notify other modules such as OCPP and API or e.g. switch on a specific LED signal on the charging port.

Energy Management

EvseManager seamlessly intergrates into the EVerest Energy Management. For further details refer to the documentation of the EnergyManager module.

EvseManager has a grid facing Energy interface which the energy tree uses to provide energy for the charging sessions. New energy needs to be provided on regular intervals (with a timeout).

If the supplied energy limits time out, EvseManager will stop charging. This prevents e.g. overload conditions when the network connection drops between the energy tree and EvseManager.

EvseManager will send out its wishes at regular intervals: It sends a requested energy schedule into the energy tree that is merged from hardware capabilities (as reported by board_support module), EvseManager module configuration settings (max_current, three_phases) and external limts (via set_external_limits command) e.g. set by OCPP module.

Note that the set_external_limits should not be used by multiple modules, as the last one always wins. If you have multiple sources of exernal limits that you want to combine, add extra EnergyNode modules in the chain and feed in limits via those.

The combined schedule sent to the energy tree is the minimum of all energy limits.

After traversing the energy tree the EnergyManager will use this information to assign limits (and a schedule) for this EvseManager and will call enforce_limits on the energy interface. These values will then be used to configure PWM/DC power supplies to actually charge the car and must not be confused with the original wishes that were sent to the energy tree.

The EvseManager will never assign energy to itself, it always requests energy from the energy manager and only charges if the energy manager responds with an assignment.

Limits in the energy object can be specified in ampere (per phase) and/or watt. Currently watt limits are unsupported, but it should behave according to that logic:

If both are specified also both limits will be applied, whichever is lower. With DC charging, ampere limits apply to the AC side and watt limits apply to both AC and DC side.

Energy Management: 1ph/3ph switching

EVerest has support for switching between 1ph and 3ph configurations during AC charging (e.g. for solar charging when sometimes charging with less then 4.2kW (6A*230V*3ph) if desired).

Be warned: Some vehicles (such as first generation of Renault Zoe) may be permanently damaged when switching from 1ph to 3ph during charging. Use at your own risk!

To use this feature several things need to be enabled:

  • In EvseManager, adjust two config options to your needs: switch_3ph1ph_delay_s, switch_3ph1ph_cp_state

  • In the BSP driver, set supports_changing_phases_during_charging to true in the reported capabilities. If your bsp hardware detects e.g. the Zoe, you can set that flag to false and publish updated capabilities any time.

  • BSP driver capabilities: Also make sure that minimum phases are set to one and maximum phases to 3

  • BSP driver: make sure the ac_switch_three_phases_while_charging command is correctly implemented

  • EnergyManager: Adjust switch_3ph1ph_while_charging_mode, switch_3ph1ph_max_nr_of_switches_per_session, switch_3ph1ph_switch_limit_stickyness, switch_3ph1ph_power_hysteresis_W, switch_3ph1ph_time_hysteresis_s config options to your needs

If all of this is properly set up, the EnergyManager will drive the 1ph/3ph switching. In order to do so, it needs an (external) limit to be set. There are two options: The external limit can be in Watt (not in Ampere), even though we are AC charging. This is the preferred option as it gives the freedom to the EnergyManager to decide when to switch. The limit can come from OCPP schedule or e.g. via an additional EnergyNode.

The second option is to set a limit in Ampere and set a limitation on the number of phases (e.g. min_phase=1, max_phase=1). This will enforce switching and can be used to decide the switching time externally. EnergyManager does not have the freedom to make the choice in this case.

Take care especially with the power(watt) and time based hysteresis settings. They should be adjusted to the actual use case to avoid relays wearing due too a lot of switching cycles. Consider also to limit the maximum number of switching cycles per charging session.

Error Handling

The control flow of this module can be influenced by the error implementation of its requirements. This section documents the side effects that can be caused by errors raised by a requirement.

This module subscribes to all errors of the following requirements:

  • evse_manager

  • evse_board_support

  • connector_lock

  • ac_rcd

  • isolation_monitor

  • power_supply_DC

  • powermeter (if the config option fail_on_powermeter_errors is set true)

A raised error can cause the EvseManager to stop the charging session and become inoperative. Charging is not possible until the error is cleared. If no charging session is currently running, it will prevent sessions from being started. If a charging session is currently running and an error is raised this will interrupt the charging session.

Almost all errors that are reported from the requirements of this module cause the EvseManager to become Inoperative until the error is cleared. The following sections provide an overview of the errors that do not cause the EvseManager to become Inoperative.

evse_manager

  • evse_manager/Inoperative

  • evse_manager/MREC11CableCheckFault

evse_board_support

  • evse_board_support/MREC3HighTemperature

  • evse_board_support/MREC18CableOverTempDerate

  • evse_board_support/VendorWarning

connector_lock

  • connector_lock/VendorWarning

ac_rcd

  • ac_rcd/VendorWarning

isolation_monitor

  • isolation_monitor/VendorWarning

power_supply_DC

  • power_supply_DC/VendorWarning

powermeter

Powermeter errors cause the EvseManager to become Inoperative, if fail_on_powermeter_errors is configured to true. If it is configured to false, errors from the powermeter will not cause the EvseManager to become Inoperative.

  • powermeter/CommunicationFault

When a charging session is stopped because of an error, the EvseManager differentiates between Emergency Shutdowns and Error Shutdowns. The severity of the error influences the type of the shudown. Emergency shutdowns are caused by errors with Severity::High and error shutdowns are caused by errors with Severity::Medium or Severity::Low.

In case of an Emergency Shutdown the EvseManager will immediately:

  • Signal PWM state F if HLC is not active

  • Turn off the PWM

  • Turn off the DC power supply in case of DC

  • Signal to open the contactor

In case of an Error Shutdown the EvseManager will:

  • Signal PWM state F if HLC is not active

  • Keep the PWM on if HLC is active

  • Turn off the DC power supply in case of DC

  • Signal to open the contactor

  • Report the error via HLC to the EV (if HLC active)

Auto-Generated Reference

Module Configuration

connector_id: integer <required>
Connector id of this evse manager
connector_type: string <optional>
default: “Unknown”
The connector type of this evse manager (/evse_manager#/ConnectorTypeEnum)
evse_id: string <optional>
default: “DE*PNX*E1234567*1”
EVSE ID
evse_id_din: string <optional>
default: “49A80737A45678”
EVSE ID DIN after DIN SPEC 91286
payment_enable_eim: boolean <optional>
default: True
Set to true to enable EIM (e.g. RFID card or mobile app) authorization
payment_enable_contract: boolean <optional>
default: True
Set to true to enable contract (aka plug and charge) authorization
ac_nominal_voltage: number <optional>
default: 230
Nominal AC voltage between phase and neutral in Volt
ev_receipt_required: boolean <optional>
default: False
Unsupported: request receipt from EV with HLC
session_logging: boolean <optional>
default: False
Enable/Disable session log file output
session_logging_path: string <optional>
default: “/tmp”
Output directory for session log files
session_logging_xml: boolean <optional>
default: True
Log full XML messages for HLC
has_ventilation: boolean <optional>
default: True
Allow ventilated charging or not
charge_mode: string <optional>
default: “AC”
Select charging mode
enum:
- AC
- DC
supported_iso_ac_bpt: boolean <optional>
default: False
Set to true if ISO15118-20 AC BPT is supported and should be offered to the EV
ac_hlc_enabled: boolean <optional>
default: False
Enable or disable HLC (aka ISO15118) for AC mode
ac_hlc_use_5percent: boolean <optional>
default: False
Use 5 percent PWM signalling to try to enforce HLC on AC. Note that if EIM arrives before SLAC matching, we will fall back to nominal PWM charging. So most cars will never use HLC in this mode, especially on a free service where EIM is always available, but that is what ISO15118-2/-3 requires to be compliant - it wants to use HLC only for PnC and not for EIM.
ac_enforce_hlc: boolean <optional>
default: False
Combine with 5percent option to really enforce HLC even with EIM. It is not ISO15118-2/-3 compliant as it waits for matching even if EIM is available before SLAC reaches matched state. On cars that do not support ISO15118 on AC this will take a very long time to timeout and fall back to basic nominal PWM charging, but it will eventually.
ac_with_soc: boolean <optional>
default: False
Special mode that switches between AC and DC charging to get SoC percentage with AC charging
dc_isolation_voltage_V: integer <optional>
default: 0
Override DC voltage used to test isolation in CableCheck. Default is 0, which means the voltage will be determined according to IEC 61851-23 (2023) CC.4.1.2
internal_over_voltage_duration_ms: integer <optional>
default: 400
Time in milliseconds the internal software over voltage monitor waits before raising MREC5 once the measured voltage exceeds the negotiated limit.
dbg_hlc_auth_after_tstep: boolean <optional>
default: False
Special mode: send HLC auth ok only after t_step_XX is finished (true) or directly when available (false)
hack_sleep_in_cable_check: integer <optional>
default: 0
Hack: Sleep for n seconds at the end of cable check.
hack_sleep_in_cable_check_volkswagen: integer <optional>
default: 0
Hack: Additional sleep for Volkswagen cars for n seconds at the end of cable check
cable_check_wait_number_of_imd_measurements: integer <optional>
default: 1
Amount of isolation measurement samples to collect before the value can be trusted. This does not average, it will evaluate the last measurement. Some IMDs (e.g. from Bender) need to measure for 10s to really get a trustable result. In this case, at 1 Hz sample rate, specify 10 samples here.
cable_check_enable_imd_self_test: boolean <optional>
default: True
Enable self testing of IMD in cable check. This is required for IEC 61851-23 (2023) compliance.
cable_check_wait_below_60V_before_finish: boolean <optional>
default: True
Switch off power supply and wait until output voltage drops below 60V before cable check is finished. Note: There are different versions of IEC 61851-23:2023 in the wild with the same version number but slightly different content. The IEC was correcting mistakes _after_ releasing the document initially without tagging a new version number. Some early versions require to wait for the output voltage to drop below 60V in CC.4.1.2 (last sentence). Later versions do not have that requirement. The later versions are correct and should be used according to IEC. Both settings (true and false) are compliant with the correct version of IEC 61851-23:2023. Set to true when:
- the power supply has no active discharge, and lowering the voltage with no load takes a very long time. In this case
this option usually helps to ramp the voltage down quickly by switching it off. It will be switched on again in precharge.
Also, some EVs switch their internal relay on at a too high voltage when the voltage is ramped down directly from cablecheck voltage to precharge voltage,
so true is the recommended default.
Set to false when:
- the power supply has active discharge and can ramp down quickly without a switch off (by just setting a lower target voltage).
This may save a few seconds as it avoids unnecessary voltage down and up ramping.
hack_skoda_enyaq: boolean <optional>
default: False
Skoda Enyaq requests DC charging voltages below its battery level or even below 0 initially. Set to true to enable dirty workaround.
hack_present_current_offset: integer <optional>
default: 0
Adds an offset [A] to the present current reported to the car on HLC. Set to 0 unless you really know what you are doing.
hack_pause_imd_during_precharge: boolean <optional>
default: False
Disable IMD at the end of CableCheck and re-enable when current is flowing in CurrentDemand. Some DCDC power supplies do not start current flow when insulation measurement is active. Set to true to enable dirty workaround for some IMD hardware.
hack_allow_bpt_with_iso2: boolean <optional>
default: False
Hack. Allow bidirectional power transfer with DIN spec and ISO-2. Currents communicated on HLC will always be positive but power supply may actually discharge the car.
hack_simplified_mode_limit_10A: boolean <optional>
default: False
Limit PWM to 10A if EV uses simplified charging mode. Set to false to be compliant with IEC61851-1:2019 section A.2.3. It is the responsibility of the EV to limit to 10A according to the norm. Enable this option to deviate from the norm and limit from the EVSE side.
autocharge_use_slac_instead_of_hlc: boolean <optional>
default: False
Use slac ev mac address for autocharge instead of EVCCID from HLC
enable_autocharge: boolean <optional>
default: False
Enables Autocharge (i.e. Mac address for authorization). Disabled by default as PnC should be used instead.
logfile_suffix: string <optional>
default: “session_uuid”
Use the string given for the log folder name. Special string session_uuid will be replaced with session uuid.
soft_over_current_tolerance_percent: number <optional>
default: 10.0
Allow for N percent over current in soft over current checking during AC charging.
soft_over_current_measurement_noise_A: number <optional>
default: 0.5
Set current measurement noise. Added to limit as an offset to avoid false triggers.
hack_fix_hlc_integer_current_requests: boolean <optional>
default: False
Some cars request only integer ampere values during DC charging. For low power DC charging that means that they charge a few hundred watts slower then needed. If enabled, this will charge at full power if the difference between EV requested current (integer) and HLC current limit is less then 1.0
disable_authentication: boolean <optional>
default: False
Do not wait for authorization from Auth module, offer a free service. Start charging immediately after plug in. Do not use with Auth manager or OCPP, this option is only to allow charging with a standalone EvseManager that is not connected to an Auth manager. Use DummyTokenProvider/Validator when testing with Auth module and/or OCPP.
sae_j2847_2_bpt_enabled: boolean <optional>
default: False
Enable SAE J2847 2 V2G or V2H mode
sae_j2847_2_bpt_mode: string <optional>
default: “V2G”
SAE J2847 2 BPT mode
enum:
- V2H
- V2G
request_zero_power_in_idle: boolean <optional>
default: False
“true: In Idle mode (no car connected), request 0A from energy management. In installations with many charging stations this should be set” “to allow the power to be distributed to the chargers that are connected to a car.” “false: Request the normal current even if no car is connected. This speeds up the start of charging on AC BASIC charging as” “EvseManager does not need to wait for energy from the energy manager after plug in.”
external_ready_to_start_charging: boolean <optional>
default: False
Enable the external ready to start charging signal that delays charging ready until it has been received
uk_smartcharging_random_delay_enable: boolean <optional>
default: False
“true: enable random_delays on start up, false: disable random delays on startup.” “They can also be enabled/disabled during runtime on the random_delay implementation.”
uk_smartcharging_random_delay_max_duration: integer <optional>
default: 600
“Start up value for the maximum duration of a random delay.” “Can be modified during runtime on the random_delay implementation.”
uk_smartcharging_random_delay_at_any_change: boolean <optional>
default: True
“True: use random delays on any current change during charging. False: Only use if current is reduced to zero or increased from zero.”
initial_meter_value_timeout_ms: integer <optional>
default: 5000
This timeout in ms defines for how long the EvseManager waits for an initial meter value from a powermeter before it becomes ready to start charging. If configured to 0, the EvseManager will not wait for an initial meter value before it becomes ready to start charging.
switch_3ph1ph_delay_s: integer <optional>
default: 10
Wait for n seconds when switching between 3ph/1ph mode.
switch_3ph1ph_cp_state: string <optional>
default: “X1”
CP state to use for switching. WARNING: Some EVs may be permanently destroyed when switching from 1ph to 3ph. It is the responsibiltiy of the evse_board_support implementation to ensure the EV is capable of performing the switch. If it is not, the capabilities must set the supports_changing_phases_during_charging to false. Phase switching is only possible in basic charging mode.
enum:
- X1
- F
soft_over_current_timeout_ms: integer <optional>
default: 7000
Allow for over current to be present for N ms in soft over current checking during AC charging.
lock_connector_in_state_b: boolean <optional>
default: True
Indicates if the connector lock should be locked in state B. If set to false, connector will remain unlocked in CP state B and this violates IEC61851-1:2019 D.6.5 Table D.9 line 4 and should not be used in public environments!
state_F_after_fault_ms: integer <optional>
default: 300
Set state F after any fault that stops charging for the specified time in ms while in Charging mode (CX->F(300ms)->C1/B1). When a fault occurs in state B2, no state F is added (B2->B1 on fault). Some (especially older hybrid vehicles) may go into a permanent fault mode once they detect state F, in this case EVerest cannot recover the charging session if the fault is cleared. In this case you can set this parameter to 0, which will avoid to use state F in case of a fault and only disables PWM (C2->C1) while switching off power. This will violate IEC 61851-1:2017 however. The default is 300ms as the minimum suggested by IEC 61851-1:2017 Table A.5 (description) to be compliant. This setting is only active in BASIC charging mode.
fail_on_powermeter_errors: boolean <optional>
default: True
Set the EVSE Manager to an inoperative state if the powermeter requirement is configured and has reported errors
raise_mrec9: boolean <optional>
default: False
Allows to configure if an MREC9 authorization timeout error shall be raised by this module in case an authorization timeout occurs. It is recommended to disable it if OCPP1.6 is used.
sleep_before_enabling_pwm_hlc_mode_ms: integer <optional>
default: 500
Sleep before the PWM signal is updated in HLC mode. Teslas are really fast with sending the first slac packet after enabling PWM, so the sleep allows SLAC to be ready for it. Some EV testers have issues with a value >= 1000ms, although ISO15118 or IEC61851 does not specify a timeout.
central_contract_validation_allowed: boolean <optional>
default: False
Used for ISO15118 plug and charge: If false, contract shall not be present in PaymentOptionList. If true, contract may be present in PaymentOptionList if TLS is used.
contract_certificate_installation_enabled: boolean <optional>
default: True
Used for ISO15118 plug and charge: Indicates if the charger supports contract CertificateInstall and CertificateUpdate
inoperative_error_use_vendor_id: boolean <optional>
default: False
When raising evse_manager/Inoperative use the vendor ID from the original cause
session_id_type: string <optional>
default: “UUID”
Type to use for generation of session ids. UUID: 36 characters UUIDs UUID_BASE64: 22 characters base64 encoded uuids SHORT_BASE64: 16 characters base64 encoded ids
enum:
- UUID
- UUID_BASE64
- SHORT_BASE64
zero_power_ignore_pause: boolean <optional>
default: False
If no energy is available the charger can signal a pause to the car before cable check. With this option the charger ignores that and continues as if energy were available. This is not standard compliant!
zero_power_allow_ev_to_ignore_pause: boolean <optional>
default: False
If no energy is available the charger can signal a pause to the car before cable check. With this option, the charger ignores that the ev goes to the energy phase instead of pausing the session. This is not standard compliant!
bpt_channel: string <optional>
default: “None”
Type of installed/uninstalled power transfer channel
enum:
- None
- Unified
- Separated
bpt_generator_mode: string <optional>
default: “None”
Power converter behavior
enum:
- None
- GridFollowing
- GridForming
bpt_grid_code_island_method: string <optional>
default: “None”
Active/inactive islanding detection method. Only for AC.
enum:
- None
- Active
- Passive

Provides

This is the main evsemanager interface
energy_grid: energy
This is the tree leaf interface to build the energy supply tree
token_provider: auth_token_provider
Provides authtokens for autocharge or plug and charge
random_delay: uk_random_delay
Provides control over UK smart charging regulation random delay feature
dc_external_derate: dc_external_derate
Provides DC external derating capabilities

Requirements

ac_rcd: ac_rcd 0..1
connector_lock: connector_lock 0..1
powermeter_grid_side: powermeter 0..1
powermeter_car_side: powermeter 0..1
slac: slac 0..1
over_voltage_monitor: over_voltage_monitor 0..1
powersupply_DC: power_supply_DC 0..1
store: kvs 0..1

Metadata

Authors

Cornelius Claussen
Anton Woellert

License